From 88b2ff02a42c5c2e9bb88a1c3da71493e879a79d Mon Sep 17 00:00:00 2001 From: Stelios Voutsinas Date: Tue, 22 Oct 2024 15:24:22 -0700 Subject: [PATCH] Add first version of documentation for SIA --- .github/workflows/ci.yaml | 40 + Makefile | 31 +- ...241023_001701_steliosvoutsinas_DM_47058.md | 5 + docs/_static/openapi.json | 1 + docs/admin/index.rst | 123 ++ docs/api.rst | 5 + docs/conf.py | 1 + docs/documenteer.toml | 12 + docs/index.rst | 43 + docs/usage/index.rst | 136 +++ requirements/dev.in | 1 + requirements/dev.txt | 1058 ++++++++++++++++- requirements/main.txt | 12 +- requirements/tox.txt | 1 + tox.ini | 18 + 15 files changed, 1441 insertions(+), 46 deletions(-) create mode 100644 changelog.d/20241023_001701_steliosvoutsinas_DM_47058.md create mode 100644 docs/_static/openapi.json create mode 100644 docs/admin/index.rst create mode 100644 docs/api.rst create mode 100644 docs/conf.py create mode 100644 docs/documenteer.toml create mode 100644 docs/index.rst create mode 100644 docs/usage/index.rst diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 39eae4b..17e34d9 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -54,6 +54,46 @@ jobs: tox-envs: "py,coverage-report,typing" tox-requirements: requirements/tox.txt + docs: + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@v4 + with: + # Ensure the documentation gets the right version. + fetch-depth: 0 + - uses: lsst-sqre/run-tox@v1 + with: + python-version: "3.12" + tox-envs: docs + tox-requirements: "requirements/tox.txt" + cache-key-prefix: docs + # Only attempt documentation uploads for long-lived branches, tagged + # releases, and pull requests from ticket branches. This avoids version + # clutter in the docs and failures when a PR doesn't have access to + # secrets. + - uses: lsst-sqre/ltd-upload@v1 + with: + project: sia + dir: "docs/_build/html" + username: ${{ secrets.LTD_USERNAME }} + password: ${{ secrets.LTD_PASSWORD }} + if: > + github.event_name != 'merge_group' + && (github.event_name != 'pull_request' + || startsWith(github.head_ref, 'tickets/')) + linkcheck: + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@v4 + - name: Check links + uses: lsst-sqre/run-tox@v1 + with: + python-version: "3.12" + tox-envs: docs-linkcheck + tox-requirements: "requirements/tox.txt" + build: runs-on: ubuntu-latest needs: [lint, test] diff --git a/Makefile b/Makefile index 84e45fc..47d05fa 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ .PHONY: help help: - @echo "Make targets for example" + @echo "Make targets for sia" @echo "make init - Set up dev environment" @echo "make run - Start a local development instance" @echo "make update - Update pinned dependencies and run make init" @@ -17,6 +17,16 @@ init: uv pip install --upgrade pre-commit pre-commit install +# This is defined as a Makefile target instead of only a tox command because +# if the command fails we want to cat output.txt, which contains the +# actually useful linkcheck output. tox unfortunately doesn't support this +# level of shell trickery after failed commands. +.PHONY: linkcheck +linkcheck: + sphinx-build -W --keep-going -n -T -b linkcheck docs \ + docs/_build/linkcheck \ + || (cat docs/_build/linkcheck/output.txt; exit 1) + .PHONY: run run: tox run -e run @@ -29,9 +39,20 @@ update-deps: pip install --upgrade uv uv pip install --upgrade pre-commit pre-commit autoupdate - uv pip compile --upgrade --universal --generate-hashes \ + uv pip compile --upgrade --generate-hashes \ + --output-file requirements/main.txt requirements/main.in + uv pip compile --upgrade --generate-hashes \ + --output-file requirements/dev.txt requirements/dev.in + uv pip compile --upgrade --generate-hashes \ + --output-file requirements/tox.txt requirements/tox.in + +# Useful for testing against a Git version of Safir. +.PHONY: update-deps-no-hashes +update-deps-no-hashes: + pip install --upgrade uv + uv pip compile --upgrade \ --output-file requirements/main.txt requirements/main.in - uv pip compile --upgrade --universal --generate-hashes \ + uv pip compile --upgrade \ --output-file requirements/dev.txt requirements/dev.in - uv pip compile --upgrade --universal --generate-hashes \ - --output-file requirements/tox.txt requirements/tox.in \ No newline at end of file + uv pip compile --upgrade \ + --output-file requirements/tox.txt requirements/tox.in diff --git a/changelog.d/20241023_001701_steliosvoutsinas_DM_47058.md b/changelog.d/20241023_001701_steliosvoutsinas_DM_47058.md new file mode 100644 index 0000000..0d5cc6f --- /dev/null +++ b/changelog.d/20241023_001701_steliosvoutsinas_DM_47058.md @@ -0,0 +1,5 @@ + + +### New features + +- Added documentation for the SIA application (/docs) diff --git a/docs/_static/openapi.json b/docs/_static/openapi.json new file mode 100644 index 0000000..c5de659 --- /dev/null +++ b/docs/_static/openapi.json @@ -0,0 +1 @@ +{"openapi":"3.1.0","info":{"title":"sia","description":"Rubin Observatory SIA implementation over Butler","version":"0.1.1"},"paths":{"/api/sia/":{"get":{"summary":"Application metadata","description":"Document the top-level API here. By default it only returns metadata about the application.","operationId":"get_index_api_sia__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Index"}}}}}}},"/api/sia/{collection_name}/availability":{"get":{"summary":"IVOA service availability","description":"VOSI-availability resource for the service","operationId":"get_availability_api_sia__collection_name__availability_get","parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string","title":"Collection Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/xml":{"example":"\n\n true\n","schema":{"description":"VOSI Availability complex type.\n\nParameters:\n available:\n (element) - Whether the service is currently available.\n up_since:\n (element) - The instant at which the service last became available.\n down_at:\n (element) - The instant at which the service is next scheduled to become unavailable.\n back_at:\n (element) - The instant at which the service is scheduled to become available again after a period\n of unavailability.\n note:\n (element) - A textual note concerning availability.","properties":{"available":{"title":"Available","type":"boolean"},"up_since":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Up Since"},"down_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Down At"},"back_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Back At"},"note":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Note"}},"required":["available"],"title":"Availability","type":"object"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sia/{collection_name}/capabilities":{"get":{"summary":"IVOA service capabilities","description":"VOSI-capabilities resource for the SIA service.","operationId":"get_capabilities_api_sia__collection_name__capabilities_get","parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string","title":"Collection Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VOSICapabilities"}},"application/xml":{"example":"\n \n \n \n https://example.com/query\n \n \n ","schema":{"$defs":{"AccessURL":{"description":"The URL (or base URL) that a client uses to access the service.\n\nParameters:\n value: The URL (or base URL) that a client uses to access the service.\n use:\n (attr) - A flag indicating whether this should be interpreted as a base URL, a full URL, or a URL to a\n directory that will produce a listing of files.","properties":{"value":{"format":"uri","minLength":1,"title":"Value","type":"string"},"use":{"enum":["full","base","dir"],"title":"Use","type":"string"}},"required":["value","use"],"title":"AccessURL","type":"object"},"Capability":{"description":"A description of what the service does (in terms of context-specific behavior), and how to use it\n(in terms of an interface)\n\nParameters:\n standard_id:\n (attr) - A URI identifier for a standard service.\n type:\n (attr) - A protocol-specific capability is included by specifying a vr:Capability sub-type via an xsi:type\n attribute on this model.\n validation_level:\n (element) - A numeric grade describing the quality of the capability description and interface, when\n applicable, to be used to indicate the confidence an end-user can put in the resource as part of a\n VO application or research study.\n description:\n (element) - A human-readable description of what this capability provides as part of the over-all service.\n interface:\n (element) - A description of how to call the service to access this capability.","properties":{"standard_id":{"format":"uri","minLength":1,"title":"Standard Id","type":"string"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"validation_level":{"anyOf":[{"items":{"$ref":"#/$defs/Validation"},"type":"array"},{"type":"null"}],"title":"Validation Level"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"interface":{"anyOf":[{"items":{"$ref":"#/$defs/Interface"},"type":"array"},{"type":"null"}],"title":"Interface"}},"required":["standard_id"],"title":"Capability","type":"object"},"DataLimit":{"description":"A limit on some data size, either in rows or in bytes.\n\nParameters:\n value:\n (content) - The value of this limit.\n unit:\n (attribute) - The unit of the limit specified.","properties":{"value":{"title":"Value","type":"integer"},"unit":{"enum":["byte","row"],"title":"Unit","type":"string"}},"required":["value","unit"],"title":"DataLimit","type":"object"},"DataLimits":{"description":"Limits on data sizes, given in rows or bytes.\n\nParameters:\n default:\n (element) - The value of this limit for newly-created jobs.\n hard:\n (element) - The value this limit cannot be raised above.","properties":{"default":{"anyOf":[{"$ref":"#/$defs/DataLimit"},{"type":"null"}]},"hard":{"anyOf":[{"$ref":"#/$defs/DataLimit"},{"type":"null"}]}},"title":"DataLimits","type":"object"},"DataModelType":{"description":"IVOA defined data model, identified by an IVORN.\n\nParameters:\n value:\n (content) - The human-readable name of the data model.\n ivo_id:\n (attribute) - The IVORN of the data model.","properties":{"value":{"title":"Value","type":"string"},"ivo_id":{"title":"Ivo Id","type":"string"}},"required":["value","ivo_id"],"title":"DataModelType","type":"object"},"Interface":{"description":"A description of a service interface.\n\nSince this type is abstract, one must use an Interface subclass to describe an actual interface denoting\nit via xsi:type.\n\nAdditional interface subtypes (beyond WebService and WebBrowser) are defined in the VODataService schema.\n\nParameters:\n version:\n (attr) - The version of a standard interface specification that this interface complies with.\n role:\n (attr) - A tag name that identifies the role the interface plays in the particular capability.\n type:\n (attr) - The xsi:type of the interface.\n access_url:\n (element) - The URL (or base URL) that a client uses to access the service.\n mirror_url:\n (element) - A (base) URL of a mirror of this interface.\n security_method:\n (element) - The mechanism the client must employ to authenticate to the service.\n test_querystring:\n (element) - Test data for exercising the service.","properties":{"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"access_url":{"items":{"$ref":"#/$defs/AccessURL"},"title":"Access Url","type":"array"},"mirror_url":{"anyOf":[{"items":{"$ref":"#/$defs/MirrorURL"},"type":"array"},{"type":"null"}],"title":"Mirror Url"},"security_method":{"anyOf":[{"items":{"$ref":"#/$defs/SecurityMethod"},"type":"array"},{"type":"null"}],"title":"Security Method"},"test_querystring":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Querystring"}},"required":["access_url"],"title":"Interface","type":"object"},"Language":{"description":"A query language supported by the service.\n\nParameters:\n name:\n (element) - The name of the language without a version suffix.\n version:\n (element) - A version of the language supported by the server.\n description:\n (element) - A short, human-readable description of the query language.\n language_features:\n (element) - Optional features of the query language, grouped by feature type.","properties":{"name":{"title":"Name","type":"string"},"version":{"items":{"$ref":"#/$defs/Version"},"title":"Version","type":"array"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"language_features":{"anyOf":[{"items":{"$ref":"#/$defs/LanguageFeatureList"},"type":"array"},{"type":"null"}],"title":"Language Features"}},"required":["name","version","language_features"],"title":"Language","type":"object"},"LanguageFeature":{"description":"A non-standard or non-mandatory feature implemented by the language.\n\nParameters:\n form:\n (element) - Formal notation for the language feature.\n description:\n (element) - Human-readable freeform documentation for the language feature.","properties":{"form":{"title":"Form","type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"required":["form"],"title":"LanguageFeature","type":"object"},"LanguageFeatureList":{"description":"An enumeration of non-standard or non-mandatory features of a specific type implemented by the language.\n\nParameters:\n feature:\n (element) - A language feature of the type given by this element's type attribute.\n type:\n (attribute) - The type of the language feature.","properties":{"feature":{"anyOf":[{"items":{"$ref":"#/$defs/LanguageFeature"},"type":"array"},{"type":"null"}],"title":"Feature"},"type":{"title":"Type","type":"string"}},"required":["type"],"title":"LanguageFeatureList","type":"object"},"MirrorURL":{"description":"A URL of a mirror (i.e., a functionally identical additional service interface) to\n\nParameters:\n value: A URL of a mirror\n title:\n (attr) - A terse, human-readable phrase indicating the function or location of this mirror, e.g.,\n \"Primary Backup\" or \"European Mirror\".","properties":{"value":{"format":"uri","minLength":1,"title":"Value","type":"string"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},"required":["value"],"title":"MirrorURL","type":"object"},"OutputFormat":{"description":"An output format supported by the service.\n\nParameters:\n mime:\n (element) - The MIME type of this format.\n alias:\n (element) - Other values of FORMAT that make the service return documents with this MIME type.\n ivo_id:\n (attr) - An optional IVORN of the output format.","properties":{"mime":{"title":"Mime","type":"string"},"alias":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Alias"},"ivo_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ivo Id"}},"required":["mime"],"title":"OutputFormat","type":"object"},"SecurityMethod":{"description":"A description of a security mechanism.\n\nThis type only allows one to refer to the mechanism via a URI. Derived types would allow for more metadata.\n\nParameters:\n standard_id:\n (attr) - A URI identifier for a standard security mechanism.","properties":{"standard_id":{"anyOf":[{"format":"uri","minLength":1,"type":"string"},{"type":"null"}],"title":"Standard Id"}},"title":"SecurityMethod","type":"object"},"TableAccess":{"description":"The capabilities of a TAP server.\n\nParameters:\n data_model:\n (element) - Identifier of IVOA-approved data model supported by the service.\n language:\n (element) - Language supported by the service.\n output_format:\n (element) - Output format supported by the service.\n upload_method:\n (element) - Upload method supported by the service.\n retention_period:\n (element) - Limits on the time between job creation and destruction time.\n execution_duration:\n (element) - Limits on executionDuration.\n output_limit:\n (element) - Limits on the size of data returned.\n upload_limit:\n (element) - Limits on the size of uploaded data.","properties":{"standard_id":{"const":"ivo://ivoa.net/std/TAP","default":"ivo://ivoa.net/std/TAP","enum":["ivo://ivoa.net/std/TAP"],"title":"Standard Id","type":"string"},"type":{"const":"tr:TableAccess","default":"tr:TableAccess","enum":["tr:TableAccess"],"title":"Type","type":"string"},"validation_level":{"anyOf":[{"items":{"$ref":"#/$defs/Validation"},"type":"array"},{"type":"null"}],"title":"Validation Level"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"interface":{"anyOf":[{"items":{"$ref":"#/$defs/Interface"},"type":"array"},{"type":"null"}],"title":"Interface"},"data_model":{"anyOf":[{"items":{"$ref":"#/$defs/DataModelType"},"type":"array"},{"type":"null"}],"title":"Data Model"},"language":{"items":{"$ref":"#/$defs/Language"},"title":"Language","type":"array"},"output_format":{"items":{"$ref":"#/$defs/OutputFormat"},"title":"Output Format","type":"array"},"upload_method":{"anyOf":[{"items":{"$ref":"#/$defs/UploadMethod"},"type":"array"},{"type":"null"}],"title":"Upload Method"},"retention_period":{"anyOf":[{"$ref":"#/$defs/TimeLimits"},{"type":"null"}]},"execution_duration":{"anyOf":[{"$ref":"#/$defs/TimeLimits"},{"type":"null"}]},"output_limit":{"anyOf":[{"$ref":"#/$defs/DataLimits"},{"type":"null"}]},"upload_limit":{"anyOf":[{"$ref":"#/$defs/DataLimits"},{"type":"null"}]}},"required":["language","output_format"],"title":"TableAccess","type":"object"},"TimeLimits":{"description":"Time-valued limits, all values given in seconds.\n\nParameters:\n default:\n (element) - The value of this limit for newly-created jobs, given in seconds.\n hard:\n (element) - The value this limit cannot be raised above, given in seconds.","properties":{"default":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Default"},"hard":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hard"}},"title":"TimeLimits","type":"object"},"UploadMethod":{"description":"An upload method as defined by IVOA.\n\nParameters:\n ivo_id:\n (attribute) - The IVORN of the upload method.","properties":{"ivo_id":{"title":"Ivo Id","type":"string"}},"required":["ivo_id"],"title":"UploadMethod","type":"object"},"Validation":{"description":"A validation stamp combining a validation level and the ID of the validator.\n\nParameters:\n validated_by:\n (attr) - The IVOA ID of the registry or organisation that assigned the validation level.","properties":{"value":{"$ref":"#/$defs/ValidationLevel"},"validated_by":{"format":"uri","minLength":1,"title":"Validated By","type":"string"}},"required":["value","validated_by"],"title":"Validation","type":"object"},"ValidationLevel":{"description":"The allowed values for describing the resource descriptions and interfaces.","enum":[0,1,2,3,4],"title":"ValidationLevel","type":"integer"},"Version":{"description":"One version of the language supported by the service.\n\nParameters:\n value:\n (content) - The version of the language.\n ivo_id:\n (attribute) - An optional IVORN of the language.","properties":{"value":{"title":"Value","type":"string"},"ivo_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ivo Id"}},"required":["value"],"title":"Version","type":"object"}},"description":"A listing of capabilities supported by a service\n\nParameters:\n capability:\n (element) - A capability supported by the service.\n A protocol-specific capability is included by specifying a vr:Capability sub-type via an xsi:type\n attribute on this element.","properties":{"capability":{"default":[],"items":{"anyOf":[{"$ref":"#/$defs/TableAccess"},{"$ref":"#/$defs/Capability"}]},"title":"Capability","type":"array"}},"title":"VOSICapabilities","type":"object"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sia/{collection_name}/query":{"post":{"summary":"IVOA SIA (v2) service query (POST)","description":"Query endpoint for the SIA service (POST method).","operationId":"query_api_sia__collection_name__query_post","parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string","title":"Collection Name"}},{"name":"pos","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"pos","description":"Positional region(s) to be searched","examples":["55.7467 -32.2862 0.05"]},"description":"Positional region(s) to be searched"},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"format","description":"Response format(s)","examples":["application/x-votable+xml"]},"description":"Response format(s)"},{"name":"time","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"time","description":"Time interval(s) to be searched","examples":["60550.31803461111 60550.31838182871"]},"description":"Time interval(s) to be searched"},{"name":"band","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"band","description":"Energy interval(s) to be searched","examples":["0.1 10.0"]},"description":"Energy interval(s) to be searched"},{"name":"pol","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/Polarization"}},{"type":"null"}],"title":"pol","description":"Polarization state(s) to be searched","examples":["I","Q"]},"description":"Polarization state(s) to be searched"},{"name":"fov","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"fov","description":"Range(s) of field of view","examples":["1.0 2.0"]},"description":"Range(s) of field of view"},{"name":"spatres","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"spatres","description":"Range(s) of spatial resolution","examples":["0.1 0.2"]},"description":"Range(s) of spatial resolution"},{"name":"exptime","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"exptime","description":"Range(s) of exposure times","examples":["-Inf 60"]},"description":"Range(s) of exposure times"},{"name":"timeres","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"timeres","description":"Range(s) of temporal resolution","examples":["-Inf 1.0"]},"description":"Range(s) of temporal resolution"},{"name":"specrp","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"specrp","description":"Range(s) of spectral resolving power","examples":["1000 2000"]},"description":"Range(s) of spectral resolving power"},{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"id","description":"Identifier of dataset(s)","examples":["obs_id_1"]},"description":"Identifier of dataset(s)"},{"name":"dptype","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/DPType"}},{"type":"null"}],"title":"dptype","description":"Type of data","examples":["image"]},"description":"Type of data"},{"name":"calib","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/CalibLevel"}},{"type":"null"}],"title":"calib","description":"Calibration level of the data","examples":[0,1,2]},"description":"Calibration level of the data"},{"name":"target","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"target","description":"Name of the target","examples":["M31"]},"description":"Name of the target"},{"name":"collection","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"collection","description":"Name of the data collection","examples":["HST"]},"description":"Name of the data collection"},{"name":"facility","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"facility","description":"Name of the facility","examples":["HST"]},"description":"Name of the facility"},{"name":"instrument","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"instrument","description":"Name of the instrument","examples":["ACS"]},"description":"Name of the instrument"},{"name":"maxrec","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"maxrec","description":"Maximum number of records in the response","examples":[10]},"description":"Maximum number of records in the response"},{"name":"responseformat","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"reponseformat","description":"Format of the response","examples":["application/x-votable+xml"]},"description":"Format of the response"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"application/xml":{}}},"400":{"description":"Invalid query parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"IVOA SIA service query","description":"Query endpoint for the SIA service.","operationId":"query_api_sia__collection_name__query_get","parameters":[{"name":"collection_name","in":"path","required":true,"schema":{"type":"string","title":"Collection Name"}},{"name":"pos","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"pos","description":"Positional region(s) to be searched","examples":["55.7467 -32.2862 0.05"]},"description":"Positional region(s) to be searched"},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"format","description":"Response format(s)","examples":["application/x-votable+xml"]},"description":"Response format(s)"},{"name":"time","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"time","description":"Time interval(s) to be searched","examples":["60550.31803461111 60550.31838182871"]},"description":"Time interval(s) to be searched"},{"name":"band","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"band","description":"Energy interval(s) to be searched","examples":["0.1 10.0"]},"description":"Energy interval(s) to be searched"},{"name":"pol","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/Polarization"}},{"type":"null"}],"title":"pol","description":"Polarization state(s) to be searched","examples":["I","Q"]},"description":"Polarization state(s) to be searched"},{"name":"fov","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"fov","description":"Range(s) of field of view","examples":["1.0 2.0"]},"description":"Range(s) of field of view"},{"name":"spatres","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"spatres","description":"Range(s) of spatial resolution","examples":["0.1 0.2"]},"description":"Range(s) of spatial resolution"},{"name":"exptime","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"exptime","description":"Range(s) of exposure times","examples":["-Inf 60"]},"description":"Range(s) of exposure times"},{"name":"timeres","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"timeres","description":"Range(s) of temporal resolution","examples":["-Inf 1.0"]},"description":"Range(s) of temporal resolution"},{"name":"specrp","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"specrp","description":"Range(s) of spectral resolving power","examples":["1000 2000"]},"description":"Range(s) of spectral resolving power"},{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"id","description":"Identifier of dataset(s)","examples":["obs_id_1"]},"description":"Identifier of dataset(s)"},{"name":"dptype","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/DPType"}},{"type":"null"}],"title":"dptype","description":"Type of data","examples":["image"]},"description":"Type of data"},{"name":"calib","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/CalibLevel"}},{"type":"null"}],"title":"calib","description":"Calibration level of the data","examples":[0,1,2]},"description":"Calibration level of the data"},{"name":"target","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"target","description":"Name of the target","examples":["M31"]},"description":"Name of the target"},{"name":"collection","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"collection","description":"Name of the data collection","examples":["HST"]},"description":"Name of the data collection"},{"name":"facility","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"facility","description":"Name of the facility","examples":["HST"]},"description":"Name of the facility"},{"name":"instrument","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"instrument","description":"Name of the instrument","examples":["ACS"]},"description":"Name of the instrument"},{"name":"maxrec","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"maxrec","description":"Maximum number of records in the response","examples":[10]},"description":"Maximum number of records in the response"},{"name":"responseformat","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"reponseformat","description":"Format of the response","examples":["application/x-votable+xml"]},"description":"Format of the response"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"application/xml":{}}},"400":{"description":"Invalid query parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorModel"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AccessURL":{"properties":{"value":{"type":"string","minLength":1,"format":"uri","title":"Value"},"use":{"type":"string","enum":["full","base","dir"],"title":"Use"}},"type":"object","required":["value","use"],"title":"AccessURL","description":"The URL (or base URL) that a client uses to access the service.\n\nParameters:\n value: The URL (or base URL) that a client uses to access the service.\n use:\n (attr) - A flag indicating whether this should be interpreted as a base URL, a full URL, or a URL to a\n directory that will produce a listing of files."},"Availability":{"properties":{"available":{"type":"boolean","title":"Available"},"up_since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Up Since"},"down_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Down At"},"back_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Back At"},"note":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Note"}},"type":"object","required":["available"],"title":"Availability","description":"VOSI Availability complex type.\n\nParameters:\n available:\n (element) - Whether the service is currently available.\n up_since:\n (element) - The instant at which the service last became available.\n down_at:\n (element) - The instant at which the service is next scheduled to become unavailable.\n back_at:\n (element) - The instant at which the service is scheduled to become available again after a period\n of unavailability.\n note:\n (element) - A textual note concerning availability."},"CalibLevel":{"type":"integer","enum":[0,1,2,3],"title":"CalibLevel","description":"Enumeration of possible calibration levels."},"Capability":{"properties":{"standard_id":{"type":"string","minLength":1,"format":"uri","title":"Standard Id"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"validation_level":{"anyOf":[{"items":{"$ref":"#/components/schemas/Validation"},"type":"array"},{"type":"null"}],"title":"Validation Level"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"interface":{"anyOf":[{"items":{"$ref":"#/components/schemas/Interface"},"type":"array"},{"type":"null"}],"title":"Interface"}},"type":"object","required":["standard_id"],"title":"Capability","description":"A description of what the service does (in terms of context-specific behavior), and how to use it\n(in terms of an interface)\n\nParameters:\n standard_id:\n (attr) - A URI identifier for a standard service.\n type:\n (attr) - A protocol-specific capability is included by specifying a vr:Capability sub-type via an xsi:type\n attribute on this model.\n validation_level:\n (element) - A numeric grade describing the quality of the capability description and interface, when\n applicable, to be used to indicate the confidence an end-user can put in the resource as part of a\n VO application or research study.\n description:\n (element) - A human-readable description of what this capability provides as part of the over-all service.\n interface:\n (element) - A description of how to call the service to access this capability."},"DPType":{"type":"string","enum":["IMAGE","CUBE"],"title":"DPType","description":"Enumeration of possible data product types."},"DataLimit":{"properties":{"value":{"type":"integer","title":"Value"},"unit":{"type":"string","enum":["byte","row"],"title":"Unit"}},"type":"object","required":["value","unit"],"title":"DataLimit","description":"A limit on some data size, either in rows or in bytes.\n\nParameters:\n value:\n (content) - The value of this limit.\n unit:\n (attribute) - The unit of the limit specified."},"DataLimits":{"properties":{"default":{"anyOf":[{"$ref":"#/components/schemas/DataLimit"},{"type":"null"}]},"hard":{"anyOf":[{"$ref":"#/components/schemas/DataLimit"},{"type":"null"}]}},"type":"object","title":"DataLimits","description":"Limits on data sizes, given in rows or bytes.\n\nParameters:\n default:\n (element) - The value of this limit for newly-created jobs.\n hard:\n (element) - The value this limit cannot be raised above."},"DataModelType":{"properties":{"value":{"type":"string","title":"Value"},"ivo_id":{"type":"string","title":"Ivo Id"}},"type":"object","required":["value","ivo_id"],"title":"DataModelType","description":"IVOA defined data model, identified by an IVORN.\n\nParameters:\n value:\n (content) - The human-readable name of the data model.\n ivo_id:\n (attribute) - The IVORN of the data model."},"ErrorDetail":{"properties":{"loc":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Location","examples":[["area","field"]]},"msg":{"type":"string","title":"Message","examples":["Some error messge"]},"type":{"type":"string","title":"Error type","examples":["some_code"]}},"type":"object","required":["msg","type"],"title":"ErrorDetail","description":"The detail of the error message."},"ErrorModel":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ErrorDetail"},"type":"array","title":"Detail"}},"type":"object","required":["detail"],"title":"ErrorModel","description":"A structured API error message."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"Index":{"properties":{"metadata":{"$ref":"#/components/schemas/Metadata","title":"Package metadata"}},"type":"object","required":["metadata"],"title":"Index","description":"Metadata returned by the external root URL of the application.\n\nNotes\n-----\nAs written, this is not very useful. Add additional metadata that will be\nhelpful for a user exploring the application, or replace this model with\nsome other model that makes more sense to return from the application API\nroot."},"Interface":{"properties":{"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"access_url":{"items":{"$ref":"#/components/schemas/AccessURL"},"type":"array","title":"Access Url"},"mirror_url":{"anyOf":[{"items":{"$ref":"#/components/schemas/MirrorURL"},"type":"array"},{"type":"null"}],"title":"Mirror Url"},"security_method":{"anyOf":[{"items":{"$ref":"#/components/schemas/SecurityMethod"},"type":"array"},{"type":"null"}],"title":"Security Method"},"test_querystring":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Querystring"}},"type":"object","required":["access_url"],"title":"Interface","description":"A description of a service interface.\n\nSince this type is abstract, one must use an Interface subclass to describe an actual interface denoting\nit via xsi:type.\n\nAdditional interface subtypes (beyond WebService and WebBrowser) are defined in the VODataService schema.\n\nParameters:\n version:\n (attr) - The version of a standard interface specification that this interface complies with.\n role:\n (attr) - A tag name that identifies the role the interface plays in the particular capability.\n type:\n (attr) - The xsi:type of the interface.\n access_url:\n (element) - The URL (or base URL) that a client uses to access the service.\n mirror_url:\n (element) - A (base) URL of a mirror of this interface.\n security_method:\n (element) - The mechanism the client must employ to authenticate to the service.\n test_querystring:\n (element) - Test data for exercising the service."},"Language":{"properties":{"name":{"type":"string","title":"Name"},"version":{"items":{"$ref":"#/components/schemas/Version"},"type":"array","title":"Version"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"language_features":{"anyOf":[{"items":{"$ref":"#/components/schemas/LanguageFeatureList"},"type":"array"},{"type":"null"}],"title":"Language Features"}},"type":"object","required":["name","version","language_features"],"title":"Language","description":"A query language supported by the service.\n\nParameters:\n name:\n (element) - The name of the language without a version suffix.\n version:\n (element) - A version of the language supported by the server.\n description:\n (element) - A short, human-readable description of the query language.\n language_features:\n (element) - Optional features of the query language, grouped by feature type."},"LanguageFeature":{"properties":{"form":{"type":"string","title":"Form"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["form"],"title":"LanguageFeature","description":"A non-standard or non-mandatory feature implemented by the language.\n\nParameters:\n form:\n (element) - Formal notation for the language feature.\n description:\n (element) - Human-readable freeform documentation for the language feature."},"LanguageFeatureList":{"properties":{"feature":{"anyOf":[{"items":{"$ref":"#/components/schemas/LanguageFeature"},"type":"array"},{"type":"null"}],"title":"Feature"},"type":{"type":"string","title":"Type"}},"type":"object","required":["type"],"title":"LanguageFeatureList","description":"An enumeration of non-standard or non-mandatory features of a specific type implemented by the language.\n\nParameters:\n feature:\n (element) - A language feature of the type given by this element's type attribute.\n type:\n (attribute) - The type of the language feature."},"Metadata":{"properties":{"name":{"type":"string","title":"Application name","examples":["myapp"]},"version":{"type":"string","title":"Version","examples":["1.0.0"]},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","examples":["Some package description"]},"repository_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Repository URL","examples":["https://example.com/"]},"documentation_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Documentation URL","examples":["https://example.com/"]}},"type":"object","required":["name","version"],"title":"Metadata","description":"Metadata about a package."},"MirrorURL":{"properties":{"value":{"type":"string","minLength":1,"format":"uri","title":"Value"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},"type":"object","required":["value"],"title":"MirrorURL","description":"A URL of a mirror (i.e., a functionally identical additional service interface) to\n\nParameters:\n value: A URL of a mirror\n title:\n (attr) - A terse, human-readable phrase indicating the function or location of this mirror, e.g.,\n \"Primary Backup\" or \"European Mirror\"."},"OutputFormat":{"properties":{"mime":{"type":"string","title":"Mime"},"alias":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Alias"},"ivo_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ivo Id"}},"type":"object","required":["mime"],"title":"OutputFormat","description":"An output format supported by the service.\n\nParameters:\n mime:\n (element) - The MIME type of this format.\n alias:\n (element) - Other values of FORMAT that make the service return documents with this MIME type.\n ivo_id:\n (attr) - An optional IVORN of the output format."},"Polarization":{"type":"string","enum":["I","Q","U","V","RR","LL","RL","LR","XX","YY","XY","YX"],"title":"Polarization","description":"Enumeration of possible polarization states."},"SecurityMethod":{"properties":{"standard_id":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Standard Id"}},"type":"object","title":"SecurityMethod","description":"A description of a security mechanism.\n\nThis type only allows one to refer to the mechanism via a URI. Derived types would allow for more metadata.\n\nParameters:\n standard_id:\n (attr) - A URI identifier for a standard security mechanism."},"TableAccess":{"properties":{"standard_id":{"type":"string","enum":["ivo://ivoa.net/std/TAP"],"const":"ivo://ivoa.net/std/TAP","title":"Standard Id","default":"ivo://ivoa.net/std/TAP"},"type":{"type":"string","enum":["tr:TableAccess"],"const":"tr:TableAccess","title":"Type","default":"tr:TableAccess"},"validation_level":{"anyOf":[{"items":{"$ref":"#/components/schemas/Validation"},"type":"array"},{"type":"null"}],"title":"Validation Level"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"interface":{"anyOf":[{"items":{"$ref":"#/components/schemas/Interface"},"type":"array"},{"type":"null"}],"title":"Interface"},"data_model":{"anyOf":[{"items":{"$ref":"#/components/schemas/DataModelType"},"type":"array"},{"type":"null"}],"title":"Data Model"},"language":{"items":{"$ref":"#/components/schemas/Language"},"type":"array","title":"Language"},"output_format":{"items":{"$ref":"#/components/schemas/OutputFormat"},"type":"array","title":"Output Format"},"upload_method":{"anyOf":[{"items":{"$ref":"#/components/schemas/UploadMethod"},"type":"array"},{"type":"null"}],"title":"Upload Method"},"retention_period":{"anyOf":[{"$ref":"#/components/schemas/TimeLimits"},{"type":"null"}]},"execution_duration":{"anyOf":[{"$ref":"#/components/schemas/TimeLimits"},{"type":"null"}]},"output_limit":{"anyOf":[{"$ref":"#/components/schemas/DataLimits"},{"type":"null"}]},"upload_limit":{"anyOf":[{"$ref":"#/components/schemas/DataLimits"},{"type":"null"}]}},"type":"object","required":["language","output_format"],"title":"TableAccess","description":"The capabilities of a TAP server.\n\nParameters:\n data_model:\n (element) - Identifier of IVOA-approved data model supported by the service.\n language:\n (element) - Language supported by the service.\n output_format:\n (element) - Output format supported by the service.\n upload_method:\n (element) - Upload method supported by the service.\n retention_period:\n (element) - Limits on the time between job creation and destruction time.\n execution_duration:\n (element) - Limits on executionDuration.\n output_limit:\n (element) - Limits on the size of data returned.\n upload_limit:\n (element) - Limits on the size of uploaded data."},"TimeLimits":{"properties":{"default":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Default"},"hard":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hard"}},"type":"object","title":"TimeLimits","description":"Time-valued limits, all values given in seconds.\n\nParameters:\n default:\n (element) - The value of this limit for newly-created jobs, given in seconds.\n hard:\n (element) - The value this limit cannot be raised above, given in seconds."},"UploadMethod":{"properties":{"ivo_id":{"type":"string","title":"Ivo Id"}},"type":"object","required":["ivo_id"],"title":"UploadMethod","description":"An upload method as defined by IVOA.\n\nParameters:\n ivo_id:\n (attribute) - The IVORN of the upload method."},"VOSICapabilities":{"properties":{"capability":{"items":{"anyOf":[{"$ref":"#/components/schemas/TableAccess"},{"$ref":"#/components/schemas/Capability"}]},"type":"array","title":"Capability","default":[]}},"type":"object","title":"VOSICapabilities","description":"A listing of capabilities supported by a service\n\nParameters:\n capability:\n (element) - A capability supported by the service.\n A protocol-specific capability is included by specifying a vr:Capability sub-type via an xsi:type\n attribute on this element."},"Validation":{"properties":{"value":{"$ref":"#/components/schemas/ValidationLevel"},"validated_by":{"type":"string","minLength":1,"format":"uri","title":"Validated By"}},"type":"object","required":["value","validated_by"],"title":"Validation","description":"A validation stamp combining a validation level and the ID of the validator.\n\nParameters:\n validated_by:\n (attr) - The IVOA ID of the registry or organisation that assigned the validation level."},"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"},"ValidationLevel":{"type":"integer","enum":[0,1,2,3,4],"title":"ValidationLevel","description":"The allowed values for describing the resource descriptions and interfaces."},"Version":{"properties":{"value":{"type":"string","title":"Value"},"ivo_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ivo Id"}},"type":"object","required":["value"],"title":"Version","description":"One version of the language supported by the service.\n\nParameters:\n value:\n (content) - The version of the language.\n ivo_id:\n (attribute) - An optional IVORN of the language."}}}} \ No newline at end of file diff --git a/docs/admin/index.rst b/docs/admin/index.rst new file mode 100644 index 0000000..d64e7b1 --- /dev/null +++ b/docs/admin/index.rst @@ -0,0 +1,123 @@ +############## +Administration +############## + + +Helm configuration +================== + +The SIAv2 service is deployed via Phalanx, which requires a ``values-{env}.yaml`` configuration file to be provided. Most of the configuration is fairly standard and common with other applications in Phalanx and has defaults in the ``values.yaml``. + +The main configuration that needs to be provided is the list of Butler Repositories (``butlerDataCollections``), and all the relevant attributes for each repository which are listed below: + +butlerDataCollections +--------------------- + +**config** (required) + A path (HTTP or File Path) to the Obscore configuration. + + Example: ``"https://raw.githubusercontent.com/lsst-dm/dax_obscore/refs/heads/main/configs/dp02.yaml"`` + +**label** (required) + The label for the Butler repository. + + Example: ``"dp02"`` + +**name** (required) + Name of the Butler repository. This is used by the app to configure the path to the SIAv2 service for this repository. + For example ``"dp02"`` will result in ``"https://data-dev.lsst.cloud/api/sia/dp02"`` + +**butler_type** (required) + The type of Butler repository. + + Example: ``"REMOTE"`` | ``"DIRECT"`` + +**repository** (required) + A path (HTTP or File Path) to the Butler repository. + + Example: ``"https://data-dev.lsst.cloud/api/butler/configs/dp02.yaml"`` + +**datalink_url** (optional) + An HTTP path to overwrite the Datalink endpoint in the obscore repository with. + + Example: ``"https://data-dev.lsst.cloud/api/datalink/links?ID=butler%3A//dp02/{id}"``. + +**default_instrument** (required) + The default instrument for this repository. + + Example: ``"LSSTCam-imSim"``. Note that this will be deprecated in future releases. + + +Ingresses +================== + +**Anonymous Paths** + +By default SIA sets up an anonymous ingress for these paths: + +- path: "/openapi.json" + +- path: "/{collection}/capabilities" + +- path: "/{collection}/availability" + +**Authenticated Paths** + +All other paths of the app, including /query are authenticated: + +- path: / + + + +Vault secrets +============= + +The SIA applications by default does not require any secrets to be setup by an administrator, as the secrets that it does expect are copied over from other Phalanx applications. +An administrator can however define an environment specific secrets.yaml file and overwrite these if they wish. +Note that the secrets currently defined in ``secrets.yaml`` are only applicable to the case that the service is supporting a Direct Butler Repository, otherwise they are not used. + +These secrets are listed below: + +**aws-credentials.ini**: + Copied from nublado if config.directButlerEnabled is set to true + +**butler-gcs-idf-creds.json**: + Copied from nublado if config.directButlerEnabled is set to true + +**postgres-credentials.txt**: + Copied from nublado if config.directButlerEnabled is set to true + +**slack-webhook**: + Copied from mobu if config.slackAlerts is set to true + + +Deployment Information +====================== + +SIA will deploy one pod by default, if the ``config.directButlerEnabled`` is set to **false**, which is the SIA FastAPI application. This will be the main FastAPI web-service running the SIA application. Any relevant logs during operations will be in the logs of this pod. +If ``directButlerEnabled`` is set to **true**, a utility pod ``fix-secret-permissions`` used to setup the permissions for the Direct Butler secrets will also be spawned. + + +Use with a Remote Butler +========================== + +To connect the SIA app with a Remote Butler repository, the values in the configuration need to be specified as described, ensuring their ``butler_type`` is set to **REMOTE** and that the ``config.directButlerEnabled`` field is set to **false**. Then when a user wishes to run a query they need to provide a Bearer token as with several other apps in Phalanx (see TAP for example). This is possible with most python clients (pyvo/astropy) and is handled automatically for the user when accessing via a browser having previously logged in. +If a token is not provided the app will reject the request with an authorization error. + + +Use with a Direct Butler +========================== + +If an operator of the SIA application wishes to use the app with Direct Butler access rather than remote, they can specify the above parameters making sure to set ``butler_type`` to **DIRECT** & also setting ``config.directButlerEnabled`` to **true**. +When this is used the app no longer expects to read in a user token from the headers to use when setting up the Butler access, and instead uses the authentication credentials from the ``sia`` secrets to authenticate with the Butler Postgres database. + + +Service Self-Description +======================== + +SIA v2 Services are expected to return a self-description VOTable document with metadata describing the input & output of the service, including where appropriate ranges or enumeration of possible values. +This SIA app is configured to generate that response via a combination of information gathered from the specific Butler Repository of the service being queried, and the repository attributes defined in the configuration values for the environment. In the future we may end-up generating everything from the Butler repository to ensure we avoid any unexpected behavior. + + + + diff --git a/docs/api.rst b/docs/api.rst new file mode 100644 index 0000000..80eb0f8 --- /dev/null +++ b/docs/api.rst @@ -0,0 +1,5 @@ +######## +REST API +######## + +This is a stub page for the API. diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..3fd6377 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1 @@ +from documenteer.conf.guide import * diff --git a/docs/documenteer.toml b/docs/documenteer.toml new file mode 100644 index 0000000..ff63d4f --- /dev/null +++ b/docs/documenteer.toml @@ -0,0 +1,12 @@ +[project] +title = "SIA" +copyright = "2024 Association of Universities for Research in Astronomy, Inc. (AURA)" +base_url="https://sia.lsst.io" +github_url="https://github.com/lsst-sqre/sia" + +[project.openapi] +openapi_path = "_static/openapi.json" +doc_path = "api" + +[project.python] +package = "sia" diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..9485389 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,43 @@ +.. toctree:: + :maxdepth: 1 + :hidden: + + usage/index + admin/index + api + +########### +SIA +########### +SIA is an implementation of the IVOA `Simple Image Access v2`_ protocol as a `FastAPI`_ web service, designed to be deployed as part of the Rubin Science Platform through `Phalanx`_. +It provides a capability of discovering, retrieving and gathering metadata for image holdings, via the use of the ObsCore Data Model. +Users will in most cases be accessing the service via other client tools like **Firefly** or **TopCat** which abstract the data access flow behind user-friendly interfaces. + +The default configuration uses the `dax_obscore`_ package and interacts with a `Butler`_ repository to find images matching specific criteria. While the current release supports both remote and direct (local) Butler repositories, our primary focus has been on the Remote Butler use-case, resulting in more mature support for this option. +The application expects as part of the configuration a list of Butler Data Collections, each of which expects a number of attributes which define how to access the repository. + +The github repository for `SIA`_ is where the application is developed. See the `CHANGELOG`_ for a list of versions and changes to the application. + +The system architecture & design considerations have been documented in https://github.com/lsst-sqre/sqr-095. + +.. grid:: 1 + + .. grid-item-card:: Usage + :link: usage/index + :link-type: doc + + Learn how to use the SIAv2 Service. + + .. grid-item-card:: Admin + :link: admin/index + :link-type: doc + + Learn how to setup the application. + +.. _Simple Image Access v2: https://www.ivoa.net/documents/SIA/ +.. _FastAPI: https://fastapi.tiangolo.com/ +.. _Phalanx: https://github.com/lsst-sqre/phalanx +.. _dax_obscore: https://github.com/lsst-dm/dax_obscore +.. _Butler: https://github.com/lsst/daf_butler +.. _SIA: https://github.com/lsst-sqre/sia +.. _CHANGELOG: https://github.com/lsst-sqre/sia/blob/main/CHANGELOG.md diff --git a/docs/usage/index.rst b/docs/usage/index.rst new file mode 100644 index 0000000..7928613 --- /dev/null +++ b/docs/usage/index.rst @@ -0,0 +1,136 @@ +##### +Usage +##### + + +``sia`` is an image-access API implemented as a FastAPI application, deveoped using the `Safir`_ templating toolkit. +For documentation on the protocol and details on usage including input parameters & output see the IVOA `SIAv2`_ specification. + +Parameters +============= + +As of the most recent release, the SIA application supports the following SIAv2 query parameters: + +:POS: Central position of the region of interest (ICRS RA,Dec in degrees) +:SIZE: Size of the search region in degrees +:BAND: Energy bandpass to search +:TIME: Time interval to search +:MAXREC: Maximum number of records to return +:INSTRUMENT: Name of instrument with which the data was acquired +:EXPTIME: The range(s) of exposure times to be searched for data +:CALIB: Calibration level of the data + +Support for ID, TARGET, FACILITY, and COLLECTION are coming soon. + +For a full list of parameters see the IVOA `SIAv2`_ specification + +HTTP Methods +============= +Both POST & GET methods are implemented for the /query API in accordance to the specification + +HTTP **GET** Example:: + + https://data-dev.lsst.cloud/api/sia/dp02/query?POS=CIRCLE+55.7467+-32.2862+0.05 + +HTTP **POST** Example:: + + curl -X POST "https://data-dev.lsst.cloud/api/sia/dp02/query" \ + -H "Authorization: Bearer your_token_here" \ + -d "POS=CIRCLE+55.7467+-32.2862+0.05" + +Response +============= + +SIAv2 responses will typically be in VOTable format, containing: + +- Metadata about the service + +Metadata like the fields of the response data will be included in the response assuming it did not produce an error table. +If MAXREC is set to 0, the self-description VOTable will be returned, which contains detailed information on the expected parameters, including range of possible values where appropriate and the result fields. + +- Table of available image products matching the query + +The results will include in the "access_url" field a link that can be used to retrieve each image. +The format (access_format) will either be a datalink (x-votable+xml;content=datalink) if the results are a datalink or the image content-type if the link is a direct download link to the image. + +Example response structure:: + + + + + + + + + + + + + + + + + + +
http://example.com/image1.fitsimage/fits
+
+
+ +VOTable is the only format supported in this current version. In the future this may be extended to support other formats depending on requests and feedback from the community. + +Errors +============= + +SIAv2 services use standard HTTP status codes. Common errors: + +:400: Bad Request (invalid parameters) +:404: Not Found (no matching data) +:500: Internal Server Error + +Bad request errors (400), which in most cases will be invalid parameters provided via a query are displayed as a VOTable error. + +The other two error types indicate either an invalid URL or an unexpected server-side issue which needs to be resolved so we do not format these as VOTables. + +Example Error VOTable:: + + + + UsageFault: Unrecognized shape in POS string 'other_shape' + + + + +Discovery +============= + +The expectation is that production SIAv2 services will be registered and discoverable via VO clients, however if they are not, use of the service will require users to input the SIA service URL manually or any clients using it to hard code this value. + + +Query using Pyvo +=================== + +Querying the SIAv2 service is also possible using the `pyvo`_ package. +Here is an example of such a query:: + + from pyvo.dal import SIA2Service + service = SIA2Service(sia_url, auth) + t1 = Time("60550.31803461111", format='mjd').to_datetime() + t2 = Time("60550.31838182871", format='mjd').to_datetime() + results = service.search(pos=(55.7467, -32.2862, 0.05), time=[t1, t2]) + results.to_table() + +Result can then be parsed to download the images using the access_url field in +the response:: + + dataLinkUrl = random.choice(results).access_url + from pyvo.dal.adhoc import DatalinkResults + dl_result = DatalinkResults.from_result_url( + dataLinkUrl, session=auth + ) + image_url = dl_result.getrecord(0).get('access_url') + + +.. _Butler: https://github.com/lsst/daf_butler +.. _pyvo: https://pyvo.readthedocs.io/en/latest/ +.. _SIAv2: https://www.ivoa.net/documents/SIA/ +.. _Safir: https://safir.lsst.io/ diff --git a/requirements/dev.in b/requirements/dev.in index 5d8619b..a9fecbd 100644 --- a/requirements/dev.in +++ b/requirements/dev.in @@ -18,6 +18,7 @@ pydantic pytest pytest-asyncio pytest-cov +documenteer[guide] # Documentation scriv diff --git a/requirements/dev.txt b/requirements/dev.txt index c248036..9b487b6 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,5 +1,9 @@ # This file was autogenerated by uv via the following command: # uv pip compile --universal --generate-hashes --output-file requirements/dev.txt requirements/dev.in +alabaster==1.0.0 \ + --hash=sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e \ + --hash=sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b + # via sphinx annotated-types==0.7.0 \ --hash=sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 \ --hash=sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89 @@ -12,14 +16,34 @@ anyio==4.6.2.post1 \ # via # -c requirements/main.txt # httpx +appnope==0.1.4 ; platform_system == 'Darwin' \ + --hash=sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee \ + --hash=sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c + # via ipykernel asgi-lifespan==2.1.0 \ --hash=sha256:5e2effaf0bfe39829cf2d64e7ecc47c7d86d676a6599f7afba378c31f5e3a308 \ --hash=sha256:ed840706680e28428c01e14afb3875d7d76d3206f3d5b2f2294e059b5c23804f # via -r requirements/dev.in +asttokens==2.4.1 \ + --hash=sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24 \ + --hash=sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0 + # via stack-data attrs==24.2.0 \ --hash=sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346 \ --hash=sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2 - # via scriv + # via + # jsonschema + # jupyter-cache + # referencing + # scriv +babel==2.16.0 \ + --hash=sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b \ + --hash=sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316 + # via sphinx +beautifulsoup4==4.12.3 \ + --hash=sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051 \ + --hash=sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed + # via pydata-sphinx-theme certifi==2024.8.30 \ --hash=sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8 \ --hash=sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9 @@ -28,6 +52,78 @@ certifi==2024.8.30 \ # httpcore # httpx # requests + # sphinx-prompt +cffi==1.17.1 ; implementation_name == 'pypy' \ + --hash=sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8 \ + --hash=sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2 \ + --hash=sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1 \ + --hash=sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15 \ + --hash=sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36 \ + --hash=sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824 \ + --hash=sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8 \ + --hash=sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36 \ + --hash=sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17 \ + --hash=sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf \ + --hash=sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc \ + --hash=sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3 \ + --hash=sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed \ + --hash=sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702 \ + --hash=sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1 \ + --hash=sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8 \ + --hash=sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903 \ + --hash=sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6 \ + --hash=sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d \ + --hash=sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b \ + --hash=sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e \ + --hash=sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be \ + --hash=sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c \ + --hash=sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683 \ + --hash=sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9 \ + --hash=sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c \ + --hash=sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8 \ + --hash=sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1 \ + --hash=sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4 \ + --hash=sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655 \ + --hash=sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67 \ + --hash=sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595 \ + --hash=sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0 \ + --hash=sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65 \ + --hash=sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41 \ + --hash=sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6 \ + --hash=sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401 \ + --hash=sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6 \ + --hash=sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3 \ + --hash=sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16 \ + --hash=sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93 \ + --hash=sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e \ + --hash=sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4 \ + --hash=sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964 \ + --hash=sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c \ + --hash=sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576 \ + --hash=sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0 \ + --hash=sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3 \ + --hash=sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662 \ + --hash=sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3 \ + --hash=sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff \ + --hash=sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5 \ + --hash=sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd \ + --hash=sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f \ + --hash=sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5 \ + --hash=sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14 \ + --hash=sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d \ + --hash=sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9 \ + --hash=sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7 \ + --hash=sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382 \ + --hash=sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a \ + --hash=sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e \ + --hash=sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a \ + --hash=sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4 \ + --hash=sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99 \ + --hash=sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87 \ + --hash=sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b + # via + # -c requirements/main.txt + # pyzmq charset-normalizer==3.4.0 \ --hash=sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621 \ --hash=sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6 \ @@ -143,6 +239,8 @@ click==8.1.7 \ # via # -c requirements/main.txt # click-log + # documenteer + # jupyter-cache # scriv click-log==0.4.0 \ --hash=sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975 \ @@ -154,7 +252,13 @@ colorama==0.4.6 ; sys_platform == 'win32' or platform_system == 'Windows' \ # via # -c requirements/main.txt # click + # ipython # pytest + # sphinx +comm==0.2.2 \ + --hash=sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e \ + --hash=sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3 + # via ipykernel coverage==7.6.4 \ --hash=sha256:00a1d69c112ff5149cabe60d2e2ee948752c975d95f1e1096742e6077affd376 \ --hash=sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9 \ @@ -221,6 +325,147 @@ coverage==7.6.4 \ # via # -r requirements/dev.in # pytest-cov +debugpy==1.8.7 \ + --hash=sha256:11ad72eb9ddb436afb8337891a986302e14944f0f755fd94e90d0d71e9100bba \ + --hash=sha256:171899588bcd412151e593bd40d9907133a7622cd6ecdbdb75f89d1551df13c2 \ + --hash=sha256:18b8f731ed3e2e1df8e9cdaa23fb1fc9c24e570cd0081625308ec51c82efe42e \ + --hash=sha256:29e1571c276d643757ea126d014abda081eb5ea4c851628b33de0c2b6245b037 \ + --hash=sha256:2efb84d6789352d7950b03d7f866e6d180284bc02c7e12cb37b489b7083d81aa \ + --hash=sha256:2f729228430ef191c1e4df72a75ac94e9bf77413ce5f3f900018712c9da0aaca \ + --hash=sha256:45c30aaefb3e1975e8a0258f5bbd26cd40cde9bfe71e9e5a7ac82e79bad64e39 \ + --hash=sha256:4b908291a1d051ef3331484de8e959ef3e66f12b5e610c203b5b75d2725613a7 \ + --hash=sha256:4d27d842311353ede0ad572600c62e4bcd74f458ee01ab0dd3a1a4457e7e3706 \ + --hash=sha256:57b00de1c8d2c84a61b90880f7e5b6deaf4c312ecbde3a0e8912f2a56c4ac9ae \ + --hash=sha256:628a11f4b295ffb4141d8242a9bb52b77ad4a63a2ad19217a93be0f77f2c28c9 \ + --hash=sha256:6a9d9d6d31846d8e34f52987ee0f1a904c7baa4912bf4843ab39dadf9b8f3e0d \ + --hash=sha256:6e1c4ffb0c79f66e89dfd97944f335880f0d50ad29525dc792785384923e2211 \ + --hash=sha256:703c1fd62ae0356e194f3e7b7a92acd931f71fe81c4b3be2c17a7b8a4b546ec2 \ + --hash=sha256:85ce9c1d0eebf622f86cc68618ad64bf66c4fc3197d88f74bb695a416837dd55 \ + --hash=sha256:90d93e4f2db442f8222dec5ec55ccfc8005821028982f1968ebf551d32b28907 \ + --hash=sha256:93176e7672551cb5281577cdb62c63aadc87ec036f0c6a486f0ded337c504596 \ + --hash=sha256:95fe04a573b8b22896c404365e03f4eda0ce0ba135b7667a1e57bd079793b96b \ + --hash=sha256:a6cf2510740e0c0b4a40330640e4b454f928c7b99b0c9dbf48b11efba08a8cda \ + --hash=sha256:b12515e04720e9e5c2216cc7086d0edadf25d7ab7e3564ec8b4521cf111b4f8c \ + --hash=sha256:b6db2a370e2700557a976eaadb16243ec9c91bd46f1b3bb15376d7aaa7632c81 \ + --hash=sha256:caf528ff9e7308b74a1749c183d6808ffbedbb9fb6af78b033c28974d9b8831f \ + --hash=sha256:cba1d078cf2e1e0b8402e6bda528bf8fda7ccd158c3dba6c012b7897747c41a0 \ + --hash=sha256:d050a1ec7e925f514f0f6594a1e522580317da31fbda1af71d1530d6ea1f2b40 \ + --hash=sha256:da8df5b89a41f1fd31503b179d0a84a5fdb752dddd5b5388dbd1ae23cda31ce9 \ + --hash=sha256:f2f4349a28e3228a42958f8ddaa6333d6f8282d5edaea456070e48609c5983b7 + # via ipykernel +decorator==5.1.1 \ + --hash=sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330 \ + --hash=sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186 + # via ipython +documenteer==1.4.2 \ + --hash=sha256:03a4cf3b8ffa4905c59662131f87afe77417238f10e9f01075d849f08a32e99d \ + --hash=sha256:89756cf2026c3e70a36b9d2ecb69c38d58c320554f498be5955ddc815de4b035 + # via -r requirements/dev.in +docutils==0.21.2 \ + --hash=sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f \ + --hash=sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 + # via + # documenteer + # myst-parser + # pybtex-docutils + # pydata-sphinx-theme + # sphinx + # sphinx-jinja + # sphinx-prompt + # sphinxcontrib-bibtex +executing==2.1.0 \ + --hash=sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf \ + --hash=sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab + # via stack-data +fastjsonschema==2.20.0 \ + --hash=sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23 \ + --hash=sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a + # via nbformat +gitdb==4.0.11 \ + --hash=sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4 \ + --hash=sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b + # via gitpython +gitpython==3.1.43 \ + --hash=sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c \ + --hash=sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff + # via documenteer +greenlet==3.1.1 ; (python_full_version < '3.13' and platform_machine == 'AMD64') or (python_full_version < '3.13' and platform_machine == 'WIN32') or (python_full_version < '3.13' and platform_machine == 'aarch64') or (python_full_version < '3.13' and platform_machine == 'amd64') or (python_full_version < '3.13' and platform_machine == 'ppc64le') or (python_full_version < '3.13' and platform_machine == 'win32') or (python_full_version < '3.13' and platform_machine == 'x86_64') \ + --hash=sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e \ + --hash=sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7 \ + --hash=sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01 \ + --hash=sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1 \ + --hash=sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159 \ + --hash=sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563 \ + --hash=sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83 \ + --hash=sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9 \ + --hash=sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395 \ + --hash=sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa \ + --hash=sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942 \ + --hash=sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1 \ + --hash=sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441 \ + --hash=sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22 \ + --hash=sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9 \ + --hash=sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0 \ + --hash=sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba \ + --hash=sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3 \ + --hash=sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1 \ + --hash=sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6 \ + --hash=sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291 \ + --hash=sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39 \ + --hash=sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d \ + --hash=sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467 \ + --hash=sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475 \ + --hash=sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef \ + --hash=sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c \ + --hash=sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511 \ + --hash=sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c \ + --hash=sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822 \ + --hash=sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a \ + --hash=sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8 \ + --hash=sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d \ + --hash=sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01 \ + --hash=sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145 \ + --hash=sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80 \ + --hash=sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13 \ + --hash=sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e \ + --hash=sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b \ + --hash=sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1 \ + --hash=sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef \ + --hash=sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc \ + --hash=sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff \ + --hash=sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120 \ + --hash=sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437 \ + --hash=sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd \ + --hash=sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981 \ + --hash=sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36 \ + --hash=sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a \ + --hash=sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798 \ + --hash=sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7 \ + --hash=sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761 \ + --hash=sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0 \ + --hash=sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e \ + --hash=sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af \ + --hash=sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa \ + --hash=sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c \ + --hash=sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42 \ + --hash=sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e \ + --hash=sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81 \ + --hash=sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e \ + --hash=sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617 \ + --hash=sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc \ + --hash=sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de \ + --hash=sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111 \ + --hash=sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383 \ + --hash=sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70 \ + --hash=sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6 \ + --hash=sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4 \ + --hash=sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011 \ + --hash=sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803 \ + --hash=sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79 \ + --hash=sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f + # via + # -c requirements/main.txt + # sqlalchemy h11==0.14.0 \ --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ --hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 @@ -247,20 +492,89 @@ idna==3.10 \ # anyio # httpx # requests + # sphinx-prompt +imagesize==1.4.1 \ + --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ + --hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a + # via sphinx +importlib-metadata==8.5.0 \ + --hash=sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b \ + --hash=sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7 + # via + # jupyter-cache + # myst-nb iniconfig==2.0.0 \ --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 # via pytest +ipykernel==6.29.5 \ + --hash=sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5 \ + --hash=sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215 + # via myst-nb +ipython==8.28.0 \ + --hash=sha256:0d0d15ca1e01faeb868ef56bc7ee5a0de5bd66885735682e8a322ae289a13d1a \ + --hash=sha256:530ef1e7bb693724d3cdc37287c80b07ad9b25986c007a53aa1857272dac3f35 + # via + # ipykernel + # myst-nb +jedi==0.19.1 \ + --hash=sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd \ + --hash=sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0 + # via ipython jinja2==3.1.4 \ --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d # via # -c requirements/main.txt + # myst-parser # scriv + # sphinx + # sphinx-jinja + # sphinxcontrib-redoc +jsonschema==4.23.0 \ + --hash=sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4 \ + --hash=sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566 + # via + # nbformat + # sphinxcontrib-redoc +jsonschema-specifications==2024.10.1 \ + --hash=sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272 \ + --hash=sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf + # via jsonschema +jupyter-cache==1.0.0 \ + --hash=sha256:594b1c4e29b488b36547e12477645f489dbdc62cc939b2408df5679f79245078 \ + --hash=sha256:d0fa7d7533cd5798198d8889318269a8c1382ed3b22f622c09a9356521f48687 + # via myst-nb +jupyter-client==8.6.3 \ + --hash=sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419 \ + --hash=sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f + # via + # ipykernel + # nbclient +jupyter-core==5.7.2 \ + --hash=sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409 \ + --hash=sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9 + # via + # ipykernel + # jupyter-client + # nbclient + # nbformat +latexcodec==3.0.0 \ + --hash=sha256:6f3477ad5e61a0a99bd31a6a370c34e88733a6bad9c921a3ffcfacada12f41a7 \ + --hash=sha256:917dc5fe242762cc19d963e6548b42d63a118028cdd3361d62397e3b638b6bc5 + # via pybtex +linkify-it-py==2.0.3 \ + --hash=sha256:68cda27e162e9215c17d786649d1da0021a451bdc436ef9e0fa0ba5234b9b048 \ + --hash=sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79 + # via markdown-it-py markdown-it-py==3.0.0 \ --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \ --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb - # via scriv + # via + # documenteer + # mdit-py-plugins + # myst-parser + # scriv markupsafe==3.0.2 \ --hash=sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4 \ --hash=sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30 \ @@ -326,64 +640,166 @@ markupsafe==3.0.2 \ # via # -c requirements/main.txt # jinja2 +matplotlib-inline==0.1.7 \ + --hash=sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90 \ + --hash=sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca + # via + # ipykernel + # ipython +mdit-py-plugins==0.4.2 \ + --hash=sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636 \ + --hash=sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5 + # via myst-parser mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba # via markdown-it-py -mypy==1.12.1 \ - --hash=sha256:02dcfe270c6ea13338210908f8cadc8d31af0f04cee8ca996438fe6a97b4ec66 \ - --hash=sha256:0dcc1e843d58f444fce19da4cce5bd35c282d4bde232acdeca8279523087088a \ - --hash=sha256:0e6fe449223fa59fbee351db32283838a8fee8059e0028e9e6494a03802b4004 \ - --hash=sha256:1230048fec1380faf240be6385e709c8570604d2d27ec6ca7e573e3bc09c3735 \ - --hash=sha256:186e0c8346efc027ee1f9acf5ca734425fc4f7dc2b60144f0fbe27cc19dc7931 \ - --hash=sha256:19bf51f87a295e7ab2894f1d8167622b063492d754e69c3c2fed6563268cb42a \ - --hash=sha256:20db6eb1ca3d1de8ece00033b12f793f1ea9da767334b7e8c626a4872090cf02 \ - --hash=sha256:389e307e333879c571029d5b93932cf838b811d3f5395ed1ad05086b52148fb0 \ - --hash=sha256:3d7d4371829184e22fda4015278fbfdef0327a4b955a483012bd2d423a788801 \ - --hash=sha256:427878aa54f2e2c5d8db31fa9010c599ed9f994b3b49e64ae9cd9990c40bd635 \ - --hash=sha256:4ee5932370ccf7ebf83f79d1c157a5929d7ea36313027b0d70a488493dc1b179 \ - --hash=sha256:5fcde63ea2c9f69d6be859a1e6dd35955e87fa81de95bc240143cf00de1f7f81 \ - --hash=sha256:673ba1140a478b50e6d265c03391702fa11a5c5aff3f54d69a62a48da32cb811 \ - --hash=sha256:8135ffec02121a75f75dc97c81af7c14aa4ae0dda277132cfcd6abcd21551bfd \ - --hash=sha256:843826966f1d65925e8b50d2b483065c51fc16dc5d72647e0236aae51dc8d77e \ - --hash=sha256:94b2048a95a21f7a9ebc9fbd075a4fcd310410d078aa0228dbbad7f71335e042 \ - --hash=sha256:96af62050971c5241afb4701c15189ea9507db89ad07794a4ee7b4e092dc0627 \ - --hash=sha256:9fb83a7be97c498176fb7486cafbb81decccaef1ac339d837c377b0ce3743a7f \ - --hash=sha256:9fe20f89da41a95e14c34b1ddb09c80262edcc295ad891f22cc4b60013e8f78d \ - --hash=sha256:a5a437c9102a6a252d9e3a63edc191a3aed5f2fcb786d614722ee3f4472e33f6 \ - --hash=sha256:a7b76fa83260824300cc4834a3ab93180db19876bce59af921467fd03e692810 \ - --hash=sha256:b16fe09f9c741d85a2e3b14a5257a27a4f4886c171d562bc5a5e90d8591906b8 \ - --hash=sha256:b947097fae68004b8328c55161ac9db7d3566abfef72d9d41b47a021c2fba6b1 \ - --hash=sha256:ce561a09e3bb9863ab77edf29ae3a50e65685ad74bba1431278185b7e5d5486e \ - --hash=sha256:d34167d43613ffb1d6c6cdc0cc043bb106cac0aa5d6a4171f77ab92a3c758bcc \ - --hash=sha256:d54d840f6c052929f4a3d2aab2066af0f45a020b085fe0e40d4583db52aab4e4 \ - --hash=sha256:d90da248f4c2dba6c44ddcfea94bb361e491962f05f41990ff24dbd09969ce20 \ - --hash=sha256:dc6e2a2195a290a7fd5bac3e60b586d77fc88e986eba7feced8b778c373f9afe \ - --hash=sha256:de5b2a8988b4e1269a98beaf0e7cc71b510d050dce80c343b53b4955fff45f19 \ - --hash=sha256:e10ba7de5c616e44ad21005fa13450cd0de7caaa303a626147d45307492e4f2d \ - --hash=sha256:f59f1dfbf497d473201356966e353ef09d4daec48caeacc0254db8ef633a28a5 \ - --hash=sha256:f5b3936f7a6d0e8280c9bdef94c7ce4847f5cdfc258fbb2c29a8c1711e8bb96d +mypy==1.13.0 \ + --hash=sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc \ + --hash=sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e \ + --hash=sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f \ + --hash=sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74 \ + --hash=sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a \ + --hash=sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2 \ + --hash=sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b \ + --hash=sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73 \ + --hash=sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e \ + --hash=sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d \ + --hash=sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d \ + --hash=sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6 \ + --hash=sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca \ + --hash=sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d \ + --hash=sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5 \ + --hash=sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62 \ + --hash=sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a \ + --hash=sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc \ + --hash=sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7 \ + --hash=sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb \ + --hash=sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7 \ + --hash=sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732 \ + --hash=sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80 \ + --hash=sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a \ + --hash=sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc \ + --hash=sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2 \ + --hash=sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0 \ + --hash=sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24 \ + --hash=sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7 \ + --hash=sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b \ + --hash=sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372 \ + --hash=sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8 # via -r requirements/dev.in mypy-extensions==1.0.0 \ --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \ --hash=sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782 # via mypy +myst-nb==1.1.2 \ + --hash=sha256:961b4005657029ca89892a4c75edbf0856c54ceaf6172368b46bf7676c1f7700 \ + --hash=sha256:9b7034e5d62640cb6daf03f9ca16ef45d0462fced27944c77aa3f98c7cdcd566 + # via documenteer +myst-parser==4.0.0 \ + --hash=sha256:851c9dfb44e36e56d15d05e72f02b80da21a9e0d07cba96baf5e2d476bb91531 \ + --hash=sha256:b9317997552424448c6096c2558872fdb6f81d3ecb3a40ce84a7518798f3f28d + # via + # documenteer + # myst-nb +nbclient==0.10.0 \ + --hash=sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09 \ + --hash=sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f + # via + # jupyter-cache + # myst-nb +nbformat==5.10.4 \ + --hash=sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a \ + --hash=sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b + # via + # jupyter-cache + # myst-nb + # nbclient +nest-asyncio==1.6.0 \ + --hash=sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe \ + --hash=sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c + # via ipykernel packaging==24.1 \ --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 # via # -c requirements/main.txt + # ipykernel + # pydata-sphinx-theme # pytest + # sphinx +parso==0.8.4 \ + --hash=sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18 \ + --hash=sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d + # via jedi +pexpect==4.9.0 ; sys_platform != 'emscripten' and sys_platform != 'win32' \ + --hash=sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 \ + --hash=sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f + # via ipython +platformdirs==4.3.6 \ + --hash=sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907 \ + --hash=sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb + # via jupyter-core pluggy==1.5.0 \ --hash=sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1 \ --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 # via pytest +prompt-toolkit==3.0.48 \ + --hash=sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90 \ + --hash=sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e + # via ipython +psutil==6.1.0 \ + --hash=sha256:000d1d1ebd634b4efb383f4034437384e44a6d455260aaee2eca1e9c1b55f047 \ + --hash=sha256:045f00a43c737f960d273a83973b2511430d61f283a44c96bf13a6e829ba8fdc \ + --hash=sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e \ + --hash=sha256:1209036fbd0421afde505a4879dee3b2fd7b1e14fee81c0069807adcbbcca747 \ + --hash=sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e \ + --hash=sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a \ + --hash=sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b \ + --hash=sha256:5cd2bcdc75b452ba2e10f0e8ecc0b57b827dd5d7aaffbc6821b2a9a242823a76 \ + --hash=sha256:6d3fbbc8d23fcdcb500d2c9f94e07b1342df8ed71b948a2649b5cb060a7c94ca \ + --hash=sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688 \ + --hash=sha256:9118f27452b70bb1d9ab3198c1f626c2499384935aaf55388211ad982611407e \ + --hash=sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38 \ + --hash=sha256:a8506f6119cff7015678e2bce904a4da21025cc70ad283a53b099e7620061d85 \ + --hash=sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be \ + --hash=sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942 \ + --hash=sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a \ + --hash=sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0 + # via + # -c requirements/main.txt + # ipykernel +ptyprocess==0.7.0 ; sys_platform != 'emscripten' and sys_platform != 'win32' \ + --hash=sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 \ + --hash=sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220 + # via pexpect +pure-eval==0.2.3 \ + --hash=sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0 \ + --hash=sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42 + # via stack-data +pybtex==0.24.0 \ + --hash=sha256:818eae35b61733e5c007c3fcd2cfb75ed1bc8b4173c1f70b56cc4c0802d34755 \ + --hash=sha256:e1e0c8c69998452fea90e9179aa2a98ab103f3eed894405b7264e517cc2fcc0f + # via + # pybtex-docutils + # sphinxcontrib-bibtex +pybtex-docutils==1.0.3 \ + --hash=sha256:3a7ebdf92b593e00e8c1c538aa9a20bca5d92d84231124715acc964d51d93c6b \ + --hash=sha256:8fd290d2ae48e32fcb54d86b0efb8d573198653c7e2447d5bec5847095f430b9 + # via sphinxcontrib-bibtex +pycparser==2.22 ; implementation_name == 'pypy' \ + --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \ + --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc + # via + # -c requirements/main.txt + # cffi pydantic==2.9.2 \ --hash=sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f \ --hash=sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12 # via # -c requirements/main.txt # -r requirements/dev.in + # documenteer pydantic-core==2.23.4 \ --hash=sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36 \ --hash=sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05 \ @@ -477,6 +893,21 @@ pydantic-core==2.23.4 \ # via # -c requirements/main.txt # pydantic +pydata-sphinx-theme==0.12.0 \ + --hash=sha256:7a07c3ac1fb1cfbb5f7d1e147a9500fb120e329d610e0fa2caac4a645141bdd9 \ + --hash=sha256:c17dbab67a3774f06f34f6378e896fcd0668cc8b5da1c1ba017e65cf1df0af58 + # via documenteer +pygments==2.18.0 \ + --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ + --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a + # via + # ipython + # pydata-sphinx-theme + # sphinx + # sphinx-prompt +pylatexenc==2.10 \ + --hash=sha256:3dd8fd84eb46dc30bee1e23eaab8d8fb5a7f507347b23e5f38ad9675c84f40d3 + # via documenteer pytest==8.3.3 \ --hash=sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181 \ --hash=sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2 @@ -492,16 +923,353 @@ pytest-cov==5.0.0 \ --hash=sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652 \ --hash=sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857 # via -r requirements/dev.in +python-dateutil==2.9.0.post0 \ + --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 + # via + # -c requirements/main.txt + # jupyter-client +pywin32==308 ; platform_python_implementation != 'PyPy' and sys_platform == 'win32' \ + --hash=sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47 \ + --hash=sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6 \ + --hash=sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6 \ + --hash=sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed \ + --hash=sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff \ + --hash=sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de \ + --hash=sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e \ + --hash=sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b \ + --hash=sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0 \ + --hash=sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897 \ + --hash=sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a \ + --hash=sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920 \ + --hash=sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341 \ + --hash=sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e \ + --hash=sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091 \ + --hash=sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c \ + --hash=sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd \ + --hash=sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4 + # via jupyter-core +pyyaml==6.0.2 \ + --hash=sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff \ + --hash=sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48 \ + --hash=sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086 \ + --hash=sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e \ + --hash=sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133 \ + --hash=sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5 \ + --hash=sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484 \ + --hash=sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee \ + --hash=sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5 \ + --hash=sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68 \ + --hash=sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a \ + --hash=sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf \ + --hash=sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99 \ + --hash=sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8 \ + --hash=sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85 \ + --hash=sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19 \ + --hash=sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc \ + --hash=sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a \ + --hash=sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1 \ + --hash=sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317 \ + --hash=sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c \ + --hash=sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631 \ + --hash=sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d \ + --hash=sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652 \ + --hash=sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5 \ + --hash=sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e \ + --hash=sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b \ + --hash=sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8 \ + --hash=sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476 \ + --hash=sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706 \ + --hash=sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563 \ + --hash=sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237 \ + --hash=sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b \ + --hash=sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083 \ + --hash=sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180 \ + --hash=sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425 \ + --hash=sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e \ + --hash=sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f \ + --hash=sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725 \ + --hash=sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183 \ + --hash=sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab \ + --hash=sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774 \ + --hash=sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725 \ + --hash=sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e \ + --hash=sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5 \ + --hash=sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d \ + --hash=sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290 \ + --hash=sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44 \ + --hash=sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed \ + --hash=sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4 \ + --hash=sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba \ + --hash=sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12 \ + --hash=sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4 + # via + # -c requirements/main.txt + # documenteer + # jupyter-cache + # myst-nb + # myst-parser + # pybtex + # sphinxcontrib-mermaid + # sphinxcontrib-redoc +pyzmq==26.2.0 \ + --hash=sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6 \ + --hash=sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a \ + --hash=sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9 \ + --hash=sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f \ + --hash=sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37 \ + --hash=sha256:0bed0e799e6120b9c32756203fb9dfe8ca2fb8467fed830c34c877e25638c3fc \ + --hash=sha256:0d987a3ae5a71c6226b203cfd298720e0086c7fe7c74f35fa8edddfbd6597eed \ + --hash=sha256:0eaa83fc4c1e271c24eaf8fb083cbccef8fde77ec8cd45f3c35a9a123e6da097 \ + --hash=sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d \ + --hash=sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52 \ + --hash=sha256:17c412bad2eb9468e876f556eb4ee910e62d721d2c7a53c7fa31e643d35352e6 \ + --hash=sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6 \ + --hash=sha256:1a534f43bc738181aa7cbbaf48e3eca62c76453a40a746ab95d4b27b1111a7d2 \ + --hash=sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282 \ + --hash=sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3 \ + --hash=sha256:1fcc03fa4997c447dce58264e93b5aa2d57714fbe0f06c07b7785ae131512732 \ + --hash=sha256:226af7dcb51fdb0109f0016449b357e182ea0ceb6b47dfb5999d569e5db161d5 \ + --hash=sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18 \ + --hash=sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306 \ + --hash=sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f \ + --hash=sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3 \ + --hash=sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b \ + --hash=sha256:29c7947c594e105cb9e6c466bace8532dc1ca02d498684128b339799f5248277 \ + --hash=sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a \ + --hash=sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797 \ + --hash=sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca \ + --hash=sha256:2ea4ad4e6a12e454de05f2949d4beddb52460f3de7c8b9d5c46fbb7d7222e02c \ + --hash=sha256:2eb7735ee73ca1b0d71e0e67c3739c689067f055c764f73aac4cc8ecf958ee3f \ + --hash=sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5 \ + --hash=sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a \ + --hash=sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44 \ + --hash=sha256:39887ac397ff35b7b775db7201095fc6310a35fdbae85bac4523f7eb3b840e20 \ + --hash=sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4 \ + --hash=sha256:3b55a4229ce5da9497dd0452b914556ae58e96a4381bb6f59f1305dfd7e53fc8 \ + --hash=sha256:402b190912935d3db15b03e8f7485812db350d271b284ded2b80d2e5704be780 \ + --hash=sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386 \ + --hash=sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5 \ + --hash=sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2 \ + --hash=sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0 \ + --hash=sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971 \ + --hash=sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b \ + --hash=sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50 \ + --hash=sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c \ + --hash=sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f \ + --hash=sha256:4ff9dc6bc1664bb9eec25cd17506ef6672d506115095411e237d571e92a58231 \ + --hash=sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c \ + --hash=sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08 \ + --hash=sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5 \ + --hash=sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6 \ + --hash=sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073 \ + --hash=sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e \ + --hash=sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4 \ + --hash=sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317 \ + --hash=sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3 \ + --hash=sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072 \ + --hash=sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad \ + --hash=sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a \ + --hash=sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb \ + --hash=sha256:76589c020680778f06b7e0b193f4b6dd66d470234a16e1df90329f5e14a171cd \ + --hash=sha256:76589f2cd6b77b5bdea4fca5992dc1c23389d68b18ccc26a53680ba2dc80ff2f \ + --hash=sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef \ + --hash=sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5 \ + --hash=sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187 \ + --hash=sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711 \ + --hash=sha256:8423c1877d72c041f2c263b1ec6e34360448decfb323fa8b94e85883043ef988 \ + --hash=sha256:8685fa9c25ff00f550c1fec650430c4b71e4e48e8d852f7ddcf2e48308038640 \ + --hash=sha256:878206a45202247781472a2d99df12a176fef806ca175799e1c6ad263510d57c \ + --hash=sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764 \ + --hash=sha256:8ab5cad923cc95c87bffee098a27856c859bd5d0af31bd346035aa816b081fe1 \ + --hash=sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1 \ + --hash=sha256:8be4700cd8bb02cc454f630dcdf7cfa99de96788b80c51b60fe2fe1dac480289 \ + --hash=sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb \ + --hash=sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a \ + --hash=sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218 \ + --hash=sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c \ + --hash=sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf \ + --hash=sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7 \ + --hash=sha256:9cb3a6460cdea8fe8194a76de8895707e61ded10ad0be97188cc8463ffa7e3a8 \ + --hash=sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726 \ + --hash=sha256:9ed69074a610fad1c2fda66180e7b2edd4d31c53f2d1872bc2d1211563904cd9 \ + --hash=sha256:9edda2df81daa129b25a39b86cb57dfdfe16f7ec15b42b19bfac503360d27a93 \ + --hash=sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88 \ + --hash=sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115 \ + --hash=sha256:aedd5dd8692635813368e558a05266b995d3d020b23e49581ddd5bbe197a8ab6 \ + --hash=sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672 \ + --hash=sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2 \ + --hash=sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea \ + --hash=sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc \ + --hash=sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b \ + --hash=sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa \ + --hash=sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003 \ + --hash=sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797 \ + --hash=sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940 \ + --hash=sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db \ + --hash=sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc \ + --hash=sha256:cccba051221b916a4f5e538997c45d7d136a5646442b1231b916d0164067ea27 \ + --hash=sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3 \ + --hash=sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e \ + --hash=sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98 \ + --hash=sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b \ + --hash=sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629 \ + --hash=sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9 \ + --hash=sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6 \ + --hash=sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec \ + --hash=sha256:ea0eb6af8a17fa272f7b98d7bebfab7836a0d62738e16ba380f440fceca2d951 \ + --hash=sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae \ + --hash=sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4 \ + --hash=sha256:fc4f7a173a5609631bb0c42c23d12c49df3966f89f496a51d3eb0ec81f4519d6 \ + --hash=sha256:fdb5b3e311d4d4b0eb8b3e8b4d1b0a512713ad7e6a68791d0923d1aec433d919 + # via + # ipykernel + # jupyter-client +referencing==0.35.1 \ + --hash=sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c \ + --hash=sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de + # via + # jsonschema + # jsonschema-specifications requests==2.32.3 \ --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 # via # -c requirements/main.txt + # documenteer # scriv + # sphinx + # sphinxcontrib-youtube +rpds-py==0.20.0 \ + --hash=sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c \ + --hash=sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585 \ + --hash=sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5 \ + --hash=sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6 \ + --hash=sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef \ + --hash=sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2 \ + --hash=sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29 \ + --hash=sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318 \ + --hash=sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b \ + --hash=sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399 \ + --hash=sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739 \ + --hash=sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee \ + --hash=sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174 \ + --hash=sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a \ + --hash=sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344 \ + --hash=sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2 \ + --hash=sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03 \ + --hash=sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5 \ + --hash=sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22 \ + --hash=sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e \ + --hash=sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96 \ + --hash=sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91 \ + --hash=sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752 \ + --hash=sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075 \ + --hash=sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253 \ + --hash=sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee \ + --hash=sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad \ + --hash=sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5 \ + --hash=sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce \ + --hash=sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7 \ + --hash=sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b \ + --hash=sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8 \ + --hash=sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57 \ + --hash=sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3 \ + --hash=sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec \ + --hash=sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209 \ + --hash=sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921 \ + --hash=sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045 \ + --hash=sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074 \ + --hash=sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580 \ + --hash=sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7 \ + --hash=sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5 \ + --hash=sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3 \ + --hash=sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0 \ + --hash=sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24 \ + --hash=sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139 \ + --hash=sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db \ + --hash=sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc \ + --hash=sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789 \ + --hash=sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f \ + --hash=sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2 \ + --hash=sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c \ + --hash=sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232 \ + --hash=sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6 \ + --hash=sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c \ + --hash=sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29 \ + --hash=sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489 \ + --hash=sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94 \ + --hash=sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751 \ + --hash=sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2 \ + --hash=sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda \ + --hash=sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9 \ + --hash=sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51 \ + --hash=sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c \ + --hash=sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8 \ + --hash=sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989 \ + --hash=sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511 \ + --hash=sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1 \ + --hash=sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2 \ + --hash=sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150 \ + --hash=sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c \ + --hash=sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965 \ + --hash=sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f \ + --hash=sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58 \ + --hash=sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b \ + --hash=sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f \ + --hash=sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d \ + --hash=sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821 \ + --hash=sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de \ + --hash=sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121 \ + --hash=sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855 \ + --hash=sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272 \ + --hash=sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60 \ + --hash=sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02 \ + --hash=sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1 \ + --hash=sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140 \ + --hash=sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879 \ + --hash=sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940 \ + --hash=sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364 \ + --hash=sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4 \ + --hash=sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e \ + --hash=sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420 \ + --hash=sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5 \ + --hash=sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24 \ + --hash=sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c \ + --hash=sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf \ + --hash=sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f \ + --hash=sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e \ + --hash=sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab \ + --hash=sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08 \ + --hash=sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92 \ + --hash=sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a \ + --hash=sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8 + # via + # jsonschema + # referencing scriv==1.5.1 \ --hash=sha256:30ae9ff8d144f8e0cf394c4e1d379542f1b3823767642955b54ec40dc00b32b6 \ --hash=sha256:a3adc657733b4124fcb54527a5f3daab0d3c300de82d0fd2b9b297b243151b78 # via -r requirements/dev.in +setuptools==75.2.0 \ + --hash=sha256:753bb6ebf1f465a1912e19ed1d41f403a79173a9acf66a42e7e6aec45c3c16ec \ + --hash=sha256:a7fcb66f68b4d9e8e66b42f9876150a3371558f98fa32222ffaa5bced76406f8 + # via + # documenteer + # sphinxcontrib-bibtex +six==1.16.0 \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 + # via + # -c requirements/main.txt + # asttokens + # pybtex + # python-dateutil + # sphinxcontrib-redoc +smmap==5.0.1 \ + --hash=sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62 \ + --hash=sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da + # via gitdb sniffio==1.3.1 \ --hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \ --hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc @@ -510,17 +1278,237 @@ sniffio==1.3.1 \ # anyio # asgi-lifespan # httpx +snowballstemmer==2.2.0 \ + --hash=sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1 \ + --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a + # via sphinx +soupsieve==2.6 \ + --hash=sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb \ + --hash=sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9 + # via beautifulsoup4 +sphinx==8.1.3 \ + --hash=sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2 \ + --hash=sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927 + # via + # documenteer + # myst-nb + # myst-parser + # pydata-sphinx-theme + # sphinx-autodoc-typehints + # sphinx-automodapi + # sphinx-copybutton + # sphinx-design + # sphinx-jinja + # sphinx-prompt + # sphinxcontrib-bibtex + # sphinxcontrib-jquery + # sphinxcontrib-mermaid + # sphinxcontrib-redoc + # sphinxcontrib-youtube + # sphinxext-opengraph + # sphinxext-rediraffe +sphinx-autodoc-typehints==2.5.0 \ + --hash=sha256:259e1026b218d563d72743f417fcc25906a9614897fe37f91bd8d7d58f748c3b \ + --hash=sha256:53def4753239683835b19bfa8b68c021388bd48a096efcb02cdab508ece27363 + # via documenteer +sphinx-automodapi==0.18.0 \ + --hash=sha256:022860385590768f52d4f6e19abb83b2574772d2721fb4050ecdb6e593a1a440 \ + --hash=sha256:7bf9d9a2cb67a5389c51071cfd86674ca3892ca5d5943f95de4553d6f35dddae + # via documenteer +sphinx-copybutton==0.5.2 \ + --hash=sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd \ + --hash=sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e + # via documenteer +sphinx-design==0.6.1 \ + --hash=sha256:b11f37db1a802a183d61b159d9a202314d4d2fe29c163437001324fe2f19549c \ + --hash=sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632 + # via documenteer +sphinx-jinja==2.0.2 \ + --hash=sha256:705ebeb9b7a6018ca3f93724315a7c1effa6ba3db44d630e7eaaa15e4ac081a8 \ + --hash=sha256:c6232b59a894139770be1dc6d0b00a379e4288ce78157904e1f8473dea3e0718 + # via documenteer +sphinx-prompt==1.9.0 \ + --hash=sha256:471b3c6d466dce780a9b167d9541865fd4e9a80ed46e31b06a52a0529ae995a1 \ + --hash=sha256:fd731446c03f043d1ff6df9f22414495b23067c67011cc21658ea8d36b3575fc + # via documenteer +sphinxcontrib-applehelp==2.0.0 \ + --hash=sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1 \ + --hash=sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5 + # via sphinx +sphinxcontrib-bibtex==2.6.3 \ + --hash=sha256:7c790347ef1cb0edf30de55fc324d9782d085e89c52c2b8faafa082e08e23946 \ + --hash=sha256:ff016b738fcc867df0f75c29e139b3b2158d26a2c802db27963cb128be3b75fb + # via documenteer +sphinxcontrib-devhelp==2.0.0 \ + --hash=sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad \ + --hash=sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2 + # via sphinx +sphinxcontrib-htmlhelp==2.1.0 \ + --hash=sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8 \ + --hash=sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9 + # via sphinx +sphinxcontrib-jquery==4.1 \ + --hash=sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a \ + --hash=sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae + # via documenteer +sphinxcontrib-jsmath==1.0.1 \ + --hash=sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 \ + --hash=sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8 + # via sphinx +sphinxcontrib-mermaid==1.0.0 \ + --hash=sha256:2e8ab67d3e1e2816663f9347d026a8dee4a858acdd4ad32dd1c808893db88146 \ + --hash=sha256:60b72710ea02087f212028feb09711225fbc2e343a10d34822fe787510e1caa3 + # via documenteer +sphinxcontrib-qthelp==2.0.0 \ + --hash=sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab \ + --hash=sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb + # via sphinx +sphinxcontrib-redoc==1.6.0 \ + --hash=sha256:e358edbe23927d36432dde748e978cf897283a331a03e93d3ef02e348dee4561 + # via documenteer +sphinxcontrib-serializinghtml==2.0.0 \ + --hash=sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331 \ + --hash=sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d + # via sphinx +sphinxcontrib-youtube==1.4.1 \ + --hash=sha256:de9cb454f066d580a1e7ad64efae7dd9e12c1b1567a31faa330b1aeaeed40460 \ + --hash=sha256:eb7871c8af47fd2b5c9727615354b7f95bce554be8be45b9fa8e5bc022f88059 + # via documenteer +sphinxext-opengraph==0.9.1 \ + --hash=sha256:b3b230cc6a5b5189139df937f0d9c7b23c7c204493b22646273687969dcb760e \ + --hash=sha256:dd2868a1e7c9497977fbbf44cc0844a42af39ca65fe1bb0272518af225d06fc5 + # via documenteer +sphinxext-rediraffe==0.2.7 \ + --hash=sha256:651dcbfae5ffda9ffd534dfb8025f36120e5efb6ea1a33f5420023862b9f725d \ + --hash=sha256:9e430a52d4403847f4ffb3a8dd6dfc34a9fe43525305131f52ed899743a5fd8c + # via documenteer +sqlalchemy==2.0.36 \ + --hash=sha256:03e08af7a5f9386a43919eda9de33ffda16b44eb11f3b313e6822243770e9763 \ + --hash=sha256:0572f4bd6f94752167adfd7c1bed84f4b240ee6203a95e05d1e208d488d0d436 \ + --hash=sha256:07b441f7d03b9a66299ce7ccf3ef2900abc81c0db434f42a5694a37bd73870f2 \ + --hash=sha256:1bc330d9d29c7f06f003ab10e1eaced295e87940405afe1b110f2eb93a233588 \ + --hash=sha256:1e0d612a17581b6616ff03c8e3d5eff7452f34655c901f75d62bd86449d9750e \ + --hash=sha256:23623166bfefe1487d81b698c423f8678e80df8b54614c2bf4b4cfcd7c711959 \ + --hash=sha256:2519f3a5d0517fc159afab1015e54bb81b4406c278749779be57a569d8d1bb0d \ + --hash=sha256:28120ef39c92c2dd60f2721af9328479516844c6b550b077ca450c7d7dc68575 \ + --hash=sha256:37350015056a553e442ff672c2d20e6f4b6d0b2495691fa239d8aa18bb3bc908 \ + --hash=sha256:39769a115f730d683b0eb7b694db9789267bcd027326cccc3125e862eb03bfd8 \ + --hash=sha256:3c01117dd36800f2ecaa238c65365b7b16497adc1522bf84906e5710ee9ba0e8 \ + --hash=sha256:3d6718667da04294d7df1670d70eeddd414f313738d20a6f1d1f379e3139a545 \ + --hash=sha256:3dbb986bad3ed5ceaf090200eba750b5245150bd97d3e67343a3cfed06feecf7 \ + --hash=sha256:4557e1f11c5f653ebfdd924f3f9d5ebfc718283b0b9beebaa5dd6b77ec290971 \ + --hash=sha256:46331b00096a6db1fdc052d55b101dbbfc99155a548e20a0e4a8e5e4d1362855 \ + --hash=sha256:4a121d62ebe7d26fec9155f83f8be5189ef1405f5973ea4874a26fab9f1e262c \ + --hash=sha256:4f5e9cd989b45b73bd359f693b935364f7e1f79486e29015813c338450aa5a71 \ + --hash=sha256:50aae840ebbd6cdd41af1c14590e5741665e5272d2fee999306673a1bb1fdb4d \ + --hash=sha256:59b1ee96617135f6e1d6f275bbe988f419c5178016f3d41d3c0abb0c819f75bb \ + --hash=sha256:59b8f3adb3971929a3e660337f5dacc5942c2cdb760afcabb2614ffbda9f9f72 \ + --hash=sha256:66bffbad8d6271bb1cc2f9a4ea4f86f80fe5e2e3e501a5ae2a3dc6a76e604e6f \ + --hash=sha256:69f93723edbca7342624d09f6704e7126b152eaed3cdbb634cb657a54332a3c5 \ + --hash=sha256:6a440293d802d3011028e14e4226da1434b373cbaf4a4bbb63f845761a708346 \ + --hash=sha256:72c28b84b174ce8af8504ca28ae9347d317f9dba3999e5981a3cd441f3712e24 \ + --hash=sha256:79d2e78abc26d871875b419e1fd3c0bca31a1cb0043277d0d850014599626c2e \ + --hash=sha256:7f2767680b6d2398aea7082e45a774b2b0767b5c8d8ffb9c8b683088ea9b29c5 \ + --hash=sha256:8318f4776c85abc3f40ab185e388bee7a6ea99e7fa3a30686580b209eaa35c08 \ + --hash=sha256:8958b10490125124463095bbdadda5aa22ec799f91958e410438ad6c97a7b793 \ + --hash=sha256:8c78ac40bde930c60e0f78b3cd184c580f89456dd87fc08f9e3ee3ce8765ce88 \ + --hash=sha256:90812a8933df713fdf748b355527e3af257a11e415b613dd794512461eb8a686 \ + --hash=sha256:9bc633f4ee4b4c46e7adcb3a9b5ec083bf1d9a97c1d3854b92749d935de40b9b \ + --hash=sha256:9e46ed38affdfc95d2c958de328d037d87801cfcbea6d421000859e9789e61c2 \ + --hash=sha256:9fe53b404f24789b5ea9003fc25b9a3988feddebd7e7b369c8fac27ad6f52f28 \ + --hash=sha256:a4e46a888b54be23d03a89be510f24a7652fe6ff660787b96cd0e57a4ebcb46d \ + --hash=sha256:a86bfab2ef46d63300c0f06936bd6e6c0105faa11d509083ba8f2f9d237fb5b5 \ + --hash=sha256:ac9dfa18ff2a67b09b372d5db8743c27966abf0e5344c555d86cc7199f7ad83a \ + --hash=sha256:af148a33ff0349f53512a049c6406923e4e02bf2f26c5fb285f143faf4f0e46a \ + --hash=sha256:b11d0cfdd2b095e7b0686cf5fabeb9c67fae5b06d265d8180715b8cfa86522e3 \ + --hash=sha256:b2985c0b06e989c043f1dc09d4fe89e1616aadd35392aea2844f0458a989eacf \ + --hash=sha256:b544ad1935a8541d177cb402948b94e871067656b3a0b9e91dbec136b06a2ff5 \ + --hash=sha256:b5cc79df7f4bc3d11e4b542596c03826063092611e481fcf1c9dfee3c94355ef \ + --hash=sha256:b817d41d692bf286abc181f8af476c4fbef3fd05e798777492618378448ee689 \ + --hash=sha256:b81ee3d84803fd42d0b154cb6892ae57ea6b7c55d8359a02379965706c7efe6c \ + --hash=sha256:be9812b766cad94a25bc63bec11f88c4ad3629a0cec1cd5d4ba48dc23860486b \ + --hash=sha256:c245b1fbade9c35e5bd3b64270ab49ce990369018289ecfde3f9c318411aaa07 \ + --hash=sha256:c3f3631693003d8e585d4200730616b78fafd5a01ef8b698f6967da5c605b3fa \ + --hash=sha256:c4ae3005ed83f5967f961fd091f2f8c5329161f69ce8480aa8168b2d7fe37f06 \ + --hash=sha256:c54a1e53a0c308a8e8a7dffb59097bff7facda27c70c286f005327f21b2bd6b1 \ + --hash=sha256:d0ddd9db6e59c44875211bc4c7953a9f6638b937b0a88ae6d09eb46cced54eff \ + --hash=sha256:dc022184d3e5cacc9579e41805a681187650e170eb2fd70e28b86192a479dcaa \ + --hash=sha256:e32092c47011d113dc01ab3e1d3ce9f006a47223b18422c5c0d150af13a00687 \ + --hash=sha256:f7b64e6ec3f02c35647be6b4851008b26cff592a95ecb13b6788a54ef80bbdd4 \ + --hash=sha256:f942a799516184c855e1a32fbc7b29d7e571b52612647866d4ec1c3242578fcb \ + --hash=sha256:f9511d8dd4a6e9271d07d150fb2f81874a3c8c95e11ff9af3a2dfc35fe42ee44 \ + --hash=sha256:fd3a55deef00f689ce931d4d1b23fa9f04c880a48ee97af488fd215cf24e2a6c \ + --hash=sha256:fddbe92b4760c6f5d48162aef14824add991aeda8ddadb3c31d56eb15ca69f8e \ + --hash=sha256:fdf3386a801ea5aba17c6410dd1dc8d39cf454ca2565541b5ac42a84e1e28f53 + # via + # -c requirements/main.txt + # jupyter-cache +stack-data==0.6.3 \ + --hash=sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9 \ + --hash=sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695 + # via ipython +tabulate==0.9.0 \ + --hash=sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c \ + --hash=sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f + # via jupyter-cache +tomlkit==0.13.2 \ + --hash=sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde \ + --hash=sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79 + # via documenteer +tornado==6.4.1 \ + --hash=sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8 \ + --hash=sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f \ + --hash=sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4 \ + --hash=sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3 \ + --hash=sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14 \ + --hash=sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842 \ + --hash=sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9 \ + --hash=sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698 \ + --hash=sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7 \ + --hash=sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d \ + --hash=sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4 + # via + # ipykernel + # jupyter-client +traitlets==5.14.3 \ + --hash=sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7 \ + --hash=sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f + # via + # comm + # ipykernel + # ipython + # jupyter-client + # jupyter-core + # matplotlib-inline + # nbclient + # nbformat typing-extensions==4.12.2 \ --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 # via # -c requirements/main.txt # mypy + # myst-nb # pydantic # pydantic-core + # sqlalchemy +uc-micro-py==1.0.3 \ + --hash=sha256:d321b92cff673ec58027c04015fcaa8bb1e005478643ff4a500882eaab88c48a \ + --hash=sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5 + # via linkify-it-py urllib3==2.2.3 \ --hash=sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac \ --hash=sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9 # via # -c requirements/main.txt + # documenteer # requests + # sphinx-prompt +wcwidth==0.2.13 \ + --hash=sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859 \ + --hash=sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5 + # via prompt-toolkit +zipp==3.20.2 \ + --hash=sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350 \ + --hash=sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29 + # via importlib-metadata diff --git a/requirements/main.txt b/requirements/main.txt index 96cc3ab..d0f2755 100644 --- a/requirements/main.txt +++ b/requirements/main.txt @@ -51,13 +51,13 @@ astropy-iers-data==0.2024.10.21.0.33.21 \ --hash=sha256:9cb267aff398c2846e38afe7ef09c6d65866c47334064040f8d95aa770f51d99 \ --hash=sha256:d37b1cf3d5d986490b80cddc894715bfea728e8cf93e260c60702696d2b41452 # via astropy -boto3==1.35.45 \ - --hash=sha256:9f4a081e1940846171b51d903000a04322f1356d53225ce1028fc1760a155a70 \ - --hash=sha256:f16c7edfcbbeb0a0c22d67d6ebbfcb332fa78d3ea88275e082260ba04fe65347 +boto3==1.35.46 \ + --hash=sha256:a839ce09a844d92e0039f95851e88da9df80c89ebb4c7818b3e78247fd97a8a7 \ + --hash=sha256:c9bab807b372d5b076d6aeb1d6513131fa0b74e32d8895128f8568b6521296ea # via -r requirements/main.in -botocore==1.35.45 \ - --hash=sha256:9a898bfdd6b0027fee2018711192c15c2716bf6a7096b1168bd8a896df3664a1 \ - --hash=sha256:e07e170975721c94ec1e3bf71a484552ad63e2499f769dd14f9f37375b4993fd +botocore==1.35.46 \ + --hash=sha256:8bbc9a55cae65a8db7f2e33ff087f4dbfc13fce868e8e3c5273ce9af367a555a \ + --hash=sha256:8c0ff5fdd611a28f5752189d171c69690dbc484fa06d74376890bb0543ec3dc1 # via # boto3 # s3transfer diff --git a/requirements/tox.txt b/requirements/tox.txt index f27004c..04481fe 100644 --- a/requirements/tox.txt +++ b/requirements/tox.txt @@ -40,6 +40,7 @@ platformdirs==4.3.6 \ --hash=sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907 \ --hash=sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb # via + # -c requirements/dev.txt # tox # virtualenv pluggy==1.5.0 \ diff --git a/tox.ini b/tox.ini index 54f8332..ca11d86 100644 --- a/tox.ini +++ b/tox.ini @@ -26,6 +26,24 @@ depends = py commands = coverage report +[testenv:docs] +description = Build documentation (HTML) with Sphinx +allowlist_externals = + rm + sphinx-build +commands = + rm -rf docs/dev/internals + # https://github.com/sphinx-contrib/redoc/issues/48 + rm -f docs/_build/html/_static/redoc.js + sphinx-build -W --keep-going -n -T -b html -d {envtmpdir}/doctrees docs docs/_build/html + +[testenv:docs-linkcheck] +description = Check links in the documentation +allowlist_externals = + make +commands = + make linkcheck + [testenv:typing] description = Run mypy. commands =