From 75fb2a0b0d51cb908a59c30050d5c0854ac620bf Mon Sep 17 00:00:00 2001 From: Nicolas Drebenstedt <897972+cutoffthetop@users.noreply.github.com> Date: Tue, 19 Nov 2024 16:18:15 +0100 Subject: [PATCH] feature/restore mex-model sphinx docs (#163) ### PR Context - this PR will restore the autogenerated sphinx documentation for github pages: https://robert-koch-institut.github.io/mex-model - to try locally: run `pdm doc` and open `docs/dist/index.html` in a browser ### Added - add "$$target" property to model, to help with de-referencing ### Changes - setup json-schema rendering for sphinx docs - fix cruft diffs in README, pyproject and requirements --------- Co-authored-by: RKIMetadataExchange --- CHANGELOG.md | 5 + README.md | 18 +- docs/conf.py | 62 +++- docs/index.md | 10 - docs/index.rst | 57 +++ mex/model/entities/access-platform.json | 1 + mex/model/entities/activity.json | 1 + .../entities/bibliographic-resource.json | 1 + mex/model/entities/concept-scheme.json | 1 + mex/model/entities/concept.json | 1 + mex/model/entities/consent.json | 1 + mex/model/entities/contact-point.json | 1 + mex/model/entities/distribution.json | 1 + mex/model/entities/organization.json | 1 + mex/model/entities/organizational-unit.json | 1 + mex/model/entities/person.json | 1 + mex/model/entities/primary-source.json | 1 + mex/model/entities/resource.json | 1 + mex/model/entities/variable-group.json | 1 + mex/model/entities/variable.json | 1 + mex/model/fields/identifier.json | 1 + mex/model/fields/link.json | 1 + mex/model/fields/text.json | 1 + pdm.lock | 337 ++++++++++++++---- pyproject.toml | 17 +- requirements.txt | 2 +- scripts/build_schema_zip.py | 21 +- 27 files changed, 435 insertions(+), 112 deletions(-) delete mode 100644 docs/index.md create mode 100644 docs/index.rst diff --git a/CHANGELOG.md b/CHANGELOG.md index de441c8b..a55facdd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- add "$$target" property to model, to help with de-referencing + ### Changes +- setup json-schema rendering for sphinx docs +- fix cruft diffs in README, pyproject and requirements + ### Deprecated ### Removed diff --git a/README.md b/README.md index b4bf0507..c4b25c05 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ JSON schema files defining the MEx metadata model. [![linting](https://github.com/robert-koch-institut/mex-model/actions/workflows/linting.yml/badge.svg)](https://github.com/robert-koch-institut/mex-model/actions/workflows/linting.yml) [![open-code](https://github.com/robert-koch-institut/mex-model/actions/workflows/open-code.yml/badge.svg)](https://gitlab.opencode.de/robert-koch-institut/mex/mex-model) -## project +## Project The Metadata Exchange (MEx) project is committed to improve the retrieval of RKI research data and projects. How? By focusing on metadata: instead of providing the @@ -51,18 +51,18 @@ Our metadata model is represented as JSON schema in `mex/model`. There, we defin `entities`, described by their properties, 2. `fields`, small objects, that are used as `$ref` for certain properties, 3. an `extension`, which contains additional properties, that are not in scope of the JSON schema definition, 4. `i18n` files, that hold -translations of the properties and are to be used in the context of user interfaces -and 5. `vocabularies`, which are used in context of the `entities`. A more detailed +translations of the properties and are to be used in the context of user interfaces and +5. `vocabularies`, which are used in context of the `entities`. A more detailed description of the model's context can be found in `/docs/index.md`. -## license +## License This package is licensed under the [MIT license](/LICENSE). All other software components of the MEx project are open-sourced under the same license as well. -## development +## Development -### installation +### Installation - on unix, consider using pyenv https://github.com/pyenv/pyenv - get pyenv `curl https://pyenv.run | bash` @@ -75,11 +75,11 @@ components of the MEx project are open-sourced under the same license as well. - switch version `pyenv global 3.11` - run `.\mex.bat install` -### linting and testing +### Linting and testing - run all linters with `pdm lint` -### updating dependencies +### Updating dependencies - update boilerplate files with `cruft update` - update global requirements in `requirements.txt` manually @@ -87,7 +87,7 @@ components of the MEx project are open-sourced under the same license as well. - update package dependencies using `pdm update-all` - update github actions in `.github/workflows/*.yml` manually -### creating release +### Creating release - run `pdm release RULE` to release a new version where RULE determines which part of the version to update and is one of `major`, `minor`, `patch`. diff --git a/docs/conf.py b/docs/conf.py index 893eddb3..d54bf2bd 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,7 +1,65 @@ # sphinx configuration -extensions = ["myst_parser"] +import importlib + +extensions = ["sphinx-jsonschema"] html_theme = "alabaster" +html_theme_options = { + "extra_nav_links": { + "Fields": "#fields", + "• Identifier": "#identifier", + "• Link": "#link", + "• Text": "#text", + "Entities": "#entities", + "• AccessPlatform": "#accessplatform", + "• Activity": "#activity", + "• BibliographicResource": "#bibliographicresource", + "• Consent": "#consent", + "• ContactPoint": "#contactpoint", + "• Distribution": "#distribution", + "• Organization": "#organization", + "• OrganizationalUnit": "#organizationalunit", + "• Person": "#person", + "• PrimarySource": "#primarysource", + "• Resource": "#resource", + "• VariableGroup": "#variablegroup", + "• Variable": "#variable", + "Concepts": "#concepts", + "• ConceptScheme": "#conceptscheme", + "• Concept": "#concept", + }, + "page_width": "100%", + "fixed_sidebar": "true", +} project = "mex-model" -source_suffix = {".md": "markdown"} templates_path = ["."] + + +# Customizing json-schema conversion +# see https://sphinx-jsonschema.readthedocs.io/en/latest/extensions.html + + +def _patched_sphinx_jsonschema_simpletype(self, schema): + """Render the `useScheme` schema properties for every vocabulary type.""" + rows = _original_sphinx_jsonschema_simpletype(self, schema) + if "useScheme" in schema: + scheme = schema.pop("useScheme") + rows.append(self._line(self._cell("useScheme"), self._cell(scheme))) + return rows + + +def _patched_sphinx_jsonschema_kvpairs(self, schema, keys): + """Render `default` and `pattern` schema properties as inline code-blocks.""" + for k in keys: + if k in schema: + value = schema[k] + if k in ("default", "pattern"): + schema[k] = f"``{value}``" + return _original_sphinx_jsonschema_kvpairs(self, schema, keys) + + +sjs_wide_format = importlib.import_module("sphinx-jsonschema.wide_format") +_original_sphinx_jsonschema_simpletype = sjs_wide_format.WideFormat._simpletype +sjs_wide_format.WideFormat._simpletype = _patched_sphinx_jsonschema_simpletype +_original_sphinx_jsonschema_kvpairs = sjs_wide_format.WideFormat._kvpairs +sjs_wide_format.WideFormat._kvpairs = _patched_sphinx_jsonschema_kvpairs diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index 212ea187..00000000 --- a/docs/index.md +++ /dev/null @@ -1,10 +0,0 @@ -# MEx Metadata Schema - -The MEx metadata schema is used to catalog Public Health data, resources and activities of the [Robert Koch Institute (RKI)](https://www.rki.de) - the federal Public Health institute of Germany - with the goal of making them findable and accessible via a web application. - -The MEx metadata schema enables the description of data and resources derived from the (research) activities of RKI. -In most cases, the RKI's public health data are protected by data protection laws. Instead of publishing the data itself, MEx provides descriptions about the data. The MEx metadata model is designed to provide comprehensive descriptions for RKI's public health data. MEx users can both find and assess whether the data matches their interests and needs. -To achieve this, we provide detailed information about the data in the form of variables. Variables describe how the actual data is specified and form the basis for a data-based evaluation of studies, for example. - -To collect information, MEx uses a mixed approach: In addition to manually compiling, we also automatically extract information from various primary sources managed by the RKI departments. -To model this, we rely on the W3C recommendations [DCAT](https://www.w3.org/TR/vocab-dcat-2/) and [PROV-O](http://www.w3.org/TR/prov-o/). diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 00000000..84e12d79 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,57 @@ +MEx Metadata Schema +=================== + +The MEx metadata schema is used to catalog Public Health data, resources and activities +of the `Robert Koch Institute (RKI) `_ - the federal Public Health +institute of Germany - with the goal of making them findable and accessible via a web +application. + +The MEx metadata schema enables the description of data and resources derived from the +research and other activities of the RKI. In most cases, the RKI's public health data +are protected by data protection laws. Instead of publishing the data itself, MEx +provides descriptions about the data. The MEx metadata model is designed to provide +comprehensive descriptions for RKI's public health data. MEx users can both find and +assess whether the data matches their interests and needs. To achieve this, we provide +detailed information about the data in the form of variables. Variables describe how the +actual data is specified and form the basis for a data-based evaluation of studies, for +example. + +To collect information, MEx uses a mixed approach: In addition to manually compiling, we +also automatically extract information from various primary sources managed by the RKI +departments. To model this, we rely on the W3C recommendations +`DCAT `_ and +`PROV-O `_. + +Fields +------ + +.. jsonschema:: ../mex/model/fields/identifier.json +.. jsonschema:: ../mex/model/fields/link.json +.. jsonschema:: ../mex/model/fields/text.json + +Entities +-------- + +.. jsonschema:: ../mex/model/entities/access-platform.json +.. jsonschema:: ../mex/model/entities/activity.json +.. jsonschema:: ../mex/model/entities/bibliographic-resource.json +.. jsonschema:: ../mex/model/entities/consent.json +.. jsonschema:: ../mex/model/entities/contact-point.json +.. jsonschema:: ../mex/model/entities/distribution.json +.. jsonschema:: ../mex/model/entities/organization.json +.. jsonschema:: ../mex/model/entities/organizational-unit.json +.. jsonschema:: ../mex/model/entities/person.json + :encoding: utf8 +.. jsonschema:: ../mex/model/entities/primary-source.json +.. jsonschema:: ../mex/model/entities/resource.json +.. jsonschema:: ../mex/model/entities/variable-group.json +.. jsonschema:: ../mex/model/entities/variable.json + +Concepts +-------- + +.. jsonschema:: ../mex/model/entities/concept-scheme.json +.. jsonschema:: ../mex/model/entities/concept.json + +Available concepts (aka vocabularies) soon. In the meantime, see +https://github.com/robert-koch-institut/mex-model/tree/main/mex/model/vocabularies diff --git a/mex/model/entities/access-platform.json b/mex/model/entities/access-platform.json index acec2935..956aee3b 100644 --- a/mex/model/entities/access-platform.json +++ b/mex/model/entities/access-platform.json @@ -1,4 +1,5 @@ { + "$$target": "/schema/entities/access-platform#/identifier", "$id": "https://mex.rki.de/schema/entities/access-platform", "$schema": "http://json-schema.org/draft/2020-12/schema", "description": "A technical system or service that provides access to distributions or resources.", diff --git a/mex/model/entities/activity.json b/mex/model/entities/activity.json index 28f1c7f5..5dc4522f 100644 --- a/mex/model/entities/activity.json +++ b/mex/model/entities/activity.json @@ -1,4 +1,5 @@ { + "$$target": "/schema/entities/activity#/identifier", "$id": "https://mex.rki.de/schema/entities/activity", "$schema": "http://json-schema.org/draft/2020-12/schema", "description": "An activity carried out by RKI. This may be a research activity, such as a funded project, or a task that RKI performs under federal law. Activities provide useful context information for resources.", diff --git a/mex/model/entities/bibliographic-resource.json b/mex/model/entities/bibliographic-resource.json index 594a4f17..17275182 100644 --- a/mex/model/entities/bibliographic-resource.json +++ b/mex/model/entities/bibliographic-resource.json @@ -1,4 +1,5 @@ { + "$$target": "/schema/entities/bibliographic-resource#/identifier", "$id": "https://mex.rki.de/schema/entities/bibliographic-resource", "$schema": "http://json-schema.org/draft/2020-12/schema", "description": "A book, article, or other documentary resource.", diff --git a/mex/model/entities/concept-scheme.json b/mex/model/entities/concept-scheme.json index c25c7223..09415571 100644 --- a/mex/model/entities/concept-scheme.json +++ b/mex/model/entities/concept-scheme.json @@ -1,4 +1,5 @@ { + "$$target": "/schema/entities/concept-scheme#/identifier", "$id": "https://mex.rki.de/schema/entities/concept-scheme", "$schema": "http://json-schema.org/draft/2020-12/schema", "properties": { diff --git a/mex/model/entities/concept.json b/mex/model/entities/concept.json index d9882eba..5450e9b2 100644 --- a/mex/model/entities/concept.json +++ b/mex/model/entities/concept.json @@ -1,4 +1,5 @@ { + "$$target": "/schema/entities/concept#/identifier", "$id": "https://mex.rki.de/schema/entities/concept", "$schema": "http://json-schema.org/draft/2020-12/schema", "properties": { diff --git a/mex/model/entities/consent.json b/mex/model/entities/consent.json index 3bef223d..97d0c2af 100644 --- a/mex/model/entities/consent.json +++ b/mex/model/entities/consent.json @@ -1,4 +1,5 @@ { + "$$target": "/schema/entities/consent#/identifier", "$comment": "In our case, the 'specified process or activity' is the publication of contact details of a person (e.g. name and email address) in our metadata catalog. ", "$id": "https://mex.rki.de/schema/entities/consent", "$schema": "http://json-schema.org/draft/2020-12/schema", diff --git a/mex/model/entities/contact-point.json b/mex/model/entities/contact-point.json index 8546afa7..0b0b21e5 100644 --- a/mex/model/entities/contact-point.json +++ b/mex/model/entities/contact-point.json @@ -1,4 +1,5 @@ { + "$$target": "/schema/entities/contact-point#/identifier", "$id": "https://mex.rki.de/schema/entities/contact-point", "$schema": "http://json-schema.org/draft/2020-12/schema", "description": "A mail address, where a group of people has access to.", diff --git a/mex/model/entities/distribution.json b/mex/model/entities/distribution.json index 03fd6b0b..92d9df26 100644 --- a/mex/model/entities/distribution.json +++ b/mex/model/entities/distribution.json @@ -1,4 +1,5 @@ { + "$$target": "/schema/entities/distribution#/identifier", "$id": "https://mex.rki.de/schema/entities/distribution", "$schema": "http://json-schema.org/draft/2020-12/schema", "description": "A specific representation of a dataset. A dataset might be available in multiple serializations that may differ in various ways, including natural language, media-type or format, schematic organization, temporal and spatial resolution, level of detail or profiles (which might specify any or all of the above) ([DCAT, 2020-02-04](https://www.w3.org/TR/2020/REC-vocab-dcat-2-20200204/)).", diff --git a/mex/model/entities/organization.json b/mex/model/entities/organization.json index 6d87e2ac..d1a8160d 100644 --- a/mex/model/entities/organization.json +++ b/mex/model/entities/organization.json @@ -1,4 +1,5 @@ { + "$$target": "/schema/entities/organization#/identifier", "$id": "https://mex.rki.de/schema/entities/organization", "$schema": "http://json-schema.org/draft/2020-12/schema", "description": "Represents a collection of people organized together into a community or other social, commercial or political structure. The group has some common purpose or reason for existence which goes beyond the set of people belonging to it and can act as an Agent. Organizations are often decomposable into hierarchical structures ([The Organization Ontology, 2014-01-16](http://www.w3.org/TR/2014/REC-vocab-org-20140116/)).", diff --git a/mex/model/entities/organizational-unit.json b/mex/model/entities/organizational-unit.json index 0d42cad9..5a4d8356 100644 --- a/mex/model/entities/organizational-unit.json +++ b/mex/model/entities/organizational-unit.json @@ -1,4 +1,5 @@ { + "$$target": "/schema/entities/organizational-unit#/identifier", "$id": "https://mex.rki.de/schema/entities/organizational-unit", "$schema": "http://json-schema.org/draft/2020-12/schema", "description": "An Organization such as a department or support unit which is part of some larger Organization and only has full recognition within the context of that Organization. In particular the unit would not be regarded as a legal entity in its own right.", diff --git a/mex/model/entities/person.json b/mex/model/entities/person.json index b7dacd3d..63eabeb5 100644 --- a/mex/model/entities/person.json +++ b/mex/model/entities/person.json @@ -1,4 +1,5 @@ { + "$$target": "/schema/entities/person#/identifier", "$id": "https://mex.rki.de/schema/entities/person", "$schema": "http://json-schema.org/draft/2020-12/schema", "description": "A person ([FOAF, 2004-05-01](http://xmlns.com/foaf/0.1/)). This class comprises real persons who live or are assumed to have lived ([CIDOC CRM, version 7.1.1](https://cidoc-crm.org/html/cidoc_crm_v7.1.1.html)).", diff --git a/mex/model/entities/primary-source.json b/mex/model/entities/primary-source.json index da24f55c..19a2d825 100644 --- a/mex/model/entities/primary-source.json +++ b/mex/model/entities/primary-source.json @@ -1,4 +1,5 @@ { + "$$target": "/schema/entities/primary-source#/identifier", "$id": "https://mex.rki.de/schema/entities/primary-source", "$schema": "http://json-schema.org/draft/2020-12/schema", "description": "A collection of information, that is managed and curated by an RKI unit and lists activities and/or resources.", diff --git a/mex/model/entities/resource.json b/mex/model/entities/resource.json index ac01cf62..7f6d01f8 100644 --- a/mex/model/entities/resource.json +++ b/mex/model/entities/resource.json @@ -1,4 +1,5 @@ { + "$$target": "/schema/entities/resource#/identifier", "$id": "https://mex.rki.de/schema/entities/resource", "$schema": "http://json-schema.org/draft/2020-12/schema", "description": "A defined piece of information or collection of information on Public Health, that has been generated as part of a (research) activity at the RKI or to comply with a (federal) law or regulation that applies to the RKI.", diff --git a/mex/model/entities/variable-group.json b/mex/model/entities/variable-group.json index 944a8318..656ad947 100644 --- a/mex/model/entities/variable-group.json +++ b/mex/model/entities/variable-group.json @@ -1,4 +1,5 @@ { + "$$target": "/schema/entities/variable-group#/identifier", "$id": "https://mex.rki.de/schema/entities/variable-group", "$schema": "http://json-schema.org/draft/2020-12/schema", "description": "The grouping of variables according to a certain aspect, e.g. how the information is modelled in the primary source.", diff --git a/mex/model/entities/variable.json b/mex/model/entities/variable.json index ca60d923..4d31fb3e 100644 --- a/mex/model/entities/variable.json +++ b/mex/model/entities/variable.json @@ -1,4 +1,5 @@ { + "$$target": "/schema/entities/variable#/identifier", "$id": "https://mex.rki.de/schema/entities/variable", "$schema": "http://json-schema.org/draft/2020-12/schema", "description": " Variables are defined for the data-based evaluation of investigations (e.g. studies). A variable is characterized by its data type (e.g. integer, string, date) and value range. The variable can be either quantitative or qualitative, i.e. the value range can take numerical or categorical values.", diff --git a/mex/model/fields/identifier.json b/mex/model/fields/identifier.json index 6da049db..7e7a6444 100644 --- a/mex/model/fields/identifier.json +++ b/mex/model/fields/identifier.json @@ -1,4 +1,5 @@ { + "$$target": "/schema/fields/identifier", "$id": "https://mex.rki.de/schema/fields/identifier", "$schema": "http://json-schema.org/draft/2020-12/schema", "examples": [ diff --git a/mex/model/fields/link.json b/mex/model/fields/link.json index 76086f12..c94ef054 100644 --- a/mex/model/fields/link.json +++ b/mex/model/fields/link.json @@ -1,4 +1,5 @@ { + "$$target": "/schema/fields/link", "$id": "https://mex.rki.de/schema/fields/link", "$schema": "http://json-schema.org/draft/2020-12/schema", "properties": { diff --git a/mex/model/fields/text.json b/mex/model/fields/text.json index 3f2d16e2..5b7aceab 100644 --- a/mex/model/fields/text.json +++ b/mex/model/fields/text.json @@ -1,4 +1,5 @@ { + "$$target": "/schema/fields/text", "$id": "https://mex.rki.de/schema/fields/text", "$schema": "http://json-schema.org/draft/2020-12/schema", "properties": { diff --git a/pdm.lock b/pdm.lock index 8a1a9fac..de986d8c 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "dev"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:dba788cf164d57c7110719b52960c2b575e17273723dd754095e8ee2bf8ca922" +content_hash = "sha256:9952a1f3a834af2790268eafbc978786cbf6582941de33a703bb9588de80b9d5" [[metadata.targets]] requires_python = ">=3.11,<3.13" @@ -15,7 +15,7 @@ name = "alabaster" version = "0.7.16" requires_python = ">=3.9" summary = "A light, configurable Sphinx theme" -groups = ["dev"] +groups = ["default", "dev"] files = [ {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, @@ -36,12 +36,26 @@ files = [ {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, ] +[[package]] +name = "attrs" +version = "24.2.0" +requires_python = ">=3.7" +summary = "Classes Without Boilerplate" +groups = ["default"] +dependencies = [ + "importlib-metadata; python_version < \"3.8\"", +] +files = [ + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, +] + [[package]] name = "babel" version = "2.16.0" requires_python = ">=3.8" summary = "Internationalization utilities" -groups = ["dev"] +groups = ["default", "dev"] dependencies = [ "pytz>=2015.7; python_version < \"3.9\"", ] @@ -55,7 +69,7 @@ name = "certifi" version = "2024.8.30" requires_python = ">=3.6" summary = "Python package for providing Mozilla's CA Bundle." -groups = ["dev"] +groups = ["default", "dev"] files = [ {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, @@ -66,7 +80,7 @@ name = "charset-normalizer" version = "3.4.0" requires_python = ">=3.7.0" summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -groups = ["dev"] +groups = ["default", "dev"] files = [ {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, @@ -107,7 +121,7 @@ name = "colorama" version = "0.4.6" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" summary = "Cross-platform colored terminal text." -groups = ["dev"] +groups = ["default", "dev"] marker = "sys_platform == \"win32\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, @@ -126,12 +140,26 @@ files = [ {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, ] +[[package]] +name = "deepmerge" +version = "2.0" +requires_python = ">=3.8" +summary = "A toolset for deeply merging Python dictionaries." +groups = ["default"] +dependencies = [ + "typing-extensions; python_version <= \"3.9\"", +] +files = [ + {file = "deepmerge-2.0-py3-none-any.whl", hash = "sha256:6de9ce507115cff0bed95ff0ce9ecc31088ef50cbdf09bc90a09349a318b3d00"}, + {file = "deepmerge-2.0.tar.gz", hash = "sha256:5c3d86081fbebd04dd5de03626a0607b809a98fb6ccba5770b62466fe940ff20"}, +] + [[package]] name = "docutils" version = "0.21.2" requires_python = ">=3.9" summary = "Docutils -- Python Documentation Utilities" -groups = ["dev"] +groups = ["default", "dev"] files = [ {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, @@ -154,7 +182,7 @@ name = "idna" version = "3.10" requires_python = ">=3.6" summary = "Internationalized Domain Names in Applications (IDNA)" -groups = ["dev"] +groups = ["default", "dev"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -165,7 +193,7 @@ name = "imagesize" version = "1.4.1" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" summary = "Getting image size from png/jpeg/jpeg2000/gif file" -groups = ["dev"] +groups = ["default", "dev"] files = [ {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, @@ -247,7 +275,7 @@ name = "jinja2" version = "3.1.4" requires_python = ">=3.7" summary = "A very fast and expressive template engine." -groups = ["dev"] +groups = ["default", "dev"] dependencies = [ "MarkupSafe>=2.0", ] @@ -257,17 +285,47 @@ files = [ ] [[package]] -name = "markdown-it-py" +name = "jsonpointer" version = "3.0.0" -requires_python = ">=3.8" -summary = "Python port of markdown-it. Markdown parsing, done right!" +requires_python = ">=3.7" +summary = "Identify specific nodes in a JSON document (RFC 6901) " groups = ["dev"] +files = [ + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, +] + +[[package]] +name = "jsonschema" +version = "4.23.0" +requires_python = ">=3.8" +summary = "An implementation of JSON Schema validation for Python" +groups = ["default"] +dependencies = [ + "attrs>=22.2.0", + "importlib-resources>=1.4.0; python_version < \"3.9\"", + "jsonschema-specifications>=2023.03.6", + "pkgutil-resolve-name>=1.3.10; python_version < \"3.9\"", + "referencing>=0.28.4", + "rpds-py>=0.7.1", +] +files = [ + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, +] + +[[package]] +name = "jsonschema-specifications" +version = "2024.10.1" +requires_python = ">=3.9" +summary = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +groups = ["default"] dependencies = [ - "mdurl~=0.1", + "referencing>=0.31.0", ] files = [ - {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, - {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, + {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, + {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, ] [[package]] @@ -275,7 +333,7 @@ name = "markupsafe" version = "3.0.2" requires_python = ">=3.9" summary = "Safely add untrusted strings to HTML/XML markup." -groups = ["dev"] +groups = ["default", "dev"] files = [ {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, @@ -316,47 +374,51 @@ files = [ ] [[package]] -name = "mdit-py-plugins" -version = "0.4.2" -requires_python = ">=3.8" -summary = "Collection of plugins for markdown-it-py" -groups = ["dev"] -dependencies = [ - "markdown-it-py<4.0.0,>=1.0.0", -] +name = "mistune" +version = "3.0.2" +requires_python = ">=3.7" +summary = "A sane and fast Markdown parser with useful plugins and renderers" +groups = ["default"] files = [ - {file = "mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636"}, - {file = "mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5"}, + {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, + {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, ] [[package]] -name = "mdurl" -version = "0.1.2" -requires_python = ">=3.7" -summary = "Markdown URL utilities" +name = "mypy" +version = "1.13.0" +requires_python = ">=3.8" +summary = "Optional static typing for Python" groups = ["dev"] +dependencies = [ + "mypy-extensions>=1.0.0", + "tomli>=1.1.0; python_version < \"3.11\"", + "typing-extensions>=4.6.0", +] files = [ - {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, - {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, + {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, + {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, + {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, + {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, + {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, + {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, + {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, + {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, ] [[package]] -name = "myst-parser" -version = "4.0.0" -requires_python = ">=3.10" -summary = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser," +name = "mypy-extensions" +version = "1.0.0" +requires_python = ">=3.5" +summary = "Type system extensions for programs checked with the mypy type checker." groups = ["dev"] -dependencies = [ - "docutils<0.22,>=0.19", - "jinja2", - "markdown-it-py~=3.0", - "mdit-py-plugins>=0.4.1,~=0.4", - "pyyaml", - "sphinx<9,>=7", -] files = [ - {file = "myst_parser-4.0.0-py3-none-any.whl", hash = "sha256:b9317997552424448c6096c2558872fdb6f81d3ecb3a40ce84a7518798f3f28d"}, - {file = "myst_parser-4.0.0.tar.gz", hash = "sha256:851c9dfb44e36e56d15d05e72f02b80da21a9e0d07cba96baf5e2d476bb91531"}, + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] [[package]] @@ -364,7 +426,7 @@ name = "packaging" version = "24.1" requires_python = ">=3.8" summary = "Core utilities for Python packages" -groups = ["dev"] +groups = ["default", "dev"] files = [ {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, @@ -396,6 +458,17 @@ files = [ {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, ] +[[package]] +name = "picobox" +version = "4.0.0" +requires_python = ">=3.8" +summary = "Dependency injection framework designed with Python in mind." +groups = ["default"] +files = [ + {file = "picobox-4.0.0-py3-none-any.whl", hash = "sha256:4c27eb689fe45dabd9e64c382e04418147d0b746d155b4e80057dbb7ff82027e"}, + {file = "picobox-4.0.0.tar.gz", hash = "sha256:114da1b5606b2f615e8b0eb68d04198ad9de75af5adbcf5b36fe4f664ab927b6"}, +] + [[package]] name = "prompt-toolkit" version = "3.0.48" @@ -438,7 +511,7 @@ name = "pygments" version = "2.18.0" requires_python = ">=3.8" summary = "Pygments is a syntax highlighting package written in Python." -groups = ["dev"] +groups = ["default", "dev"] files = [ {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, @@ -449,7 +522,7 @@ name = "pyyaml" version = "6.0.2" requires_python = ">=3.8" summary = "YAML parser and emitter for Python" -groups = ["dev"] +groups = ["default", "dev"] files = [ {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, @@ -472,12 +545,27 @@ files = [ {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] +[[package]] +name = "referencing" +version = "0.35.1" +requires_python = ">=3.8" +summary = "JSON Referencing + Python" +groups = ["default"] +dependencies = [ + "attrs>=22.2.0", + "rpds-py>=0.7.0", +] +files = [ + {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, + {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, +] + [[package]] name = "requests" version = "2.32.3" requires_python = ">=3.8" summary = "Python HTTP for Humans." -groups = ["dev"] +groups = ["default", "dev"] dependencies = [ "certifi>=2017.4.17", "charset-normalizer<4,>=2", @@ -489,6 +577,42 @@ files = [ {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] +[[package]] +name = "rpds-py" +version = "0.21.0" +requires_python = ">=3.9" +summary = "Python bindings to Rust's persistent data structures (rpds)" +groups = ["default"] +files = [ + {file = "rpds_py-0.21.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5555db3e618a77034954b9dc547eae94166391a98eb867905ec8fcbce1308d95"}, + {file = "rpds_py-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:97ef67d9bbc3e15584c2f3c74bcf064af36336c10d2e21a2131e123ce0f924c9"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ab2c2a26d2f69cdf833174f4d9d86118edc781ad9a8fa13970b527bf8236027"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4e8921a259f54bfbc755c5bbd60c82bb2339ae0324163f32868f63f0ebb873d9"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a7ff941004d74d55a47f916afc38494bd1cfd4b53c482b77c03147c91ac0ac3"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5145282a7cd2ac16ea0dc46b82167754d5e103a05614b724457cffe614f25bd8"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de609a6f1b682f70bb7163da745ee815d8f230d97276db049ab447767466a09d"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40c91c6e34cf016fa8e6b59d75e3dbe354830777fcfd74c58b279dceb7975b75"}, + {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d2132377f9deef0c4db89e65e8bb28644ff75a18df5293e132a8d67748397b9f"}, + {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0a9e0759e7be10109645a9fddaaad0619d58c9bf30a3f248a2ea57a7c417173a"}, + {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e20da3957bdf7824afdd4b6eeb29510e83e026473e04952dca565170cd1ecc8"}, + {file = "rpds_py-0.21.0-cp311-none-win32.whl", hash = "sha256:f71009b0d5e94c0e86533c0b27ed7cacc1239cb51c178fd239c3cfefefb0400a"}, + {file = "rpds_py-0.21.0-cp311-none-win_amd64.whl", hash = "sha256:e168afe6bf6ab7ab46c8c375606298784ecbe3ba31c0980b7dcbb9631dcba97e"}, + {file = "rpds_py-0.21.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:30b912c965b2aa76ba5168fd610087bad7fcde47f0a8367ee8f1876086ee6d1d"}, + {file = "rpds_py-0.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca9989d5d9b1b300bc18e1801c67b9f6d2c66b8fd9621b36072ed1df2c977f72"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f54e7106f0001244a5f4cf810ba8d3f9c542e2730821b16e969d6887b664266"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fed5dfefdf384d6fe975cc026886aece4f292feaf69d0eeb716cfd3c5a4dd8be"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:590ef88db231c9c1eece44dcfefd7515d8bf0d986d64d0caf06a81998a9e8cab"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f983e4c2f603c95dde63df633eec42955508eefd8d0f0e6d236d31a044c882d7"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b229ce052ddf1a01c67d68166c19cb004fb3612424921b81c46e7ea7ccf7c3bf"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ebf64e281a06c904a7636781d2e973d1f0926a5b8b480ac658dc0f556e7779f4"}, + {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:998a8080c4495e4f72132f3d66ff91f5997d799e86cec6ee05342f8f3cda7dca"}, + {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:98486337f7b4f3c324ab402e83453e25bb844f44418c066623db88e4c56b7c7b"}, + {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a78d8b634c9df7f8d175451cfeac3810a702ccb85f98ec95797fa98b942cea11"}, + {file = "rpds_py-0.21.0-cp312-none-win32.whl", hash = "sha256:a58ce66847711c4aa2ecfcfaff04cb0327f907fead8945ffc47d9407f41ff952"}, + {file = "rpds_py-0.21.0-cp312-none-win_amd64.whl", hash = "sha256:e860f065cc4ea6f256d6f411aba4b1251255366e48e972f8a347cf88077b24fd"}, + {file = "rpds_py-0.21.0.tar.gz", hash = "sha256:ed6378c9d66d0de903763e7706383d60c33829581f0adff47b6535f1802fa6db"}, +] + [[package]] name = "ruff" version = "0.7.2" @@ -521,8 +645,7 @@ name = "six" version = "1.16.0" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" summary = "Python 2 and 3 compatibility utilities" -groups = ["dev"] -marker = "python_version >= \"3.11\"" +groups = ["default", "dev"] files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -532,7 +655,7 @@ files = [ name = "snowballstemmer" version = "2.2.0" summary = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -groups = ["dev"] +groups = ["default", "dev"] files = [ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, @@ -540,33 +663,64 @@ files = [ [[package]] name = "sphinx" -version = "7.4.7" -requires_python = ">=3.9" +version = "8.1.0" +requires_python = ">=3.10" summary = "Python documentation generator" -groups = ["dev"] +groups = ["default", "dev"] dependencies = [ "Jinja2>=3.1", "Pygments>=2.17", - "alabaster~=0.7.14", + "alabaster>=0.7.14", "babel>=2.13", "colorama>=0.4.6; sys_platform == \"win32\"", "docutils<0.22,>=0.20", "imagesize>=1.3", - "importlib-metadata>=6.0; python_version < \"3.10\"", "packaging>=23.0", "requests>=2.30.0", "snowballstemmer>=2.2", - "sphinxcontrib-applehelp", - "sphinxcontrib-devhelp", - "sphinxcontrib-htmlhelp>=2.0.0", - "sphinxcontrib-jsmath", - "sphinxcontrib-qthelp", + "sphinxcontrib-applehelp>=1.0.7", + "sphinxcontrib-devhelp>=1.0.6", + "sphinxcontrib-htmlhelp>=2.0.6", + "sphinxcontrib-jsmath>=1.0.1", + "sphinxcontrib-qthelp>=1.0.6", "sphinxcontrib-serializinghtml>=1.1.9", "tomli>=2; python_version < \"3.11\"", ] files = [ - {file = "sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239"}, - {file = "sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe"}, + {file = "sphinx-8.1.0-py3-none-any.whl", hash = "sha256:3202bba95697b9fc4371a07d6d457239de9860244ce235283149f817c253fd2f"}, + {file = "sphinx-8.1.0.tar.gz", hash = "sha256:109454425dbf4c78ecfdd481e56f078376d077edbda29804dba05c5161c8de06"}, +] + +[[package]] +name = "sphinx-jsonschema" +version = "1.19.1" +summary = "Sphinx extension to display JSON Schema" +groups = ["dev"] +dependencies = [ + "docutils", + "jsonpointer", + "pyyaml", + "requests", +] +files = [ + {file = "sphinx-jsonschema-1.19.1.tar.gz", hash = "sha256:b2385fe1c7acf2e759152aefed0cb17c920645b2a75c9934000c9c528e7d53c1"}, +] + +[[package]] +name = "sphinx-mdinclude" +version = "0.6.2" +requires_python = ">=3.8" +summary = "Markdown extension for Sphinx" +groups = ["default"] +dependencies = [ + "docutils<1.0,>=0.19", + "mistune<4.0,>=3.0", + "pygments>=2.8", + "sphinx>=6", +] +files = [ + {file = "sphinx_mdinclude-0.6.2-py3-none-any.whl", hash = "sha256:648e78edb067c0e4bffc22943278d49d54a0714494743592032fa3ad82a86984"}, + {file = "sphinx_mdinclude-0.6.2.tar.gz", hash = "sha256:447462e82cb8be61404a2204227f920769eb923d2f57608e3325f3bb88286b4c"}, ] [[package]] @@ -574,7 +728,7 @@ name = "sphinxcontrib-applehelp" version = "2.0.0" requires_python = ">=3.9" summary = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" -groups = ["dev"] +groups = ["default", "dev"] files = [ {file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"}, {file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"}, @@ -585,7 +739,7 @@ name = "sphinxcontrib-devhelp" version = "2.0.0" requires_python = ">=3.9" summary = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" -groups = ["dev"] +groups = ["default", "dev"] files = [ {file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"}, {file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"}, @@ -596,29 +750,65 @@ name = "sphinxcontrib-htmlhelp" version = "2.1.0" requires_python = ">=3.9" summary = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -groups = ["dev"] +groups = ["default", "dev"] files = [ {file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"}, {file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"}, ] +[[package]] +name = "sphinxcontrib-httpdomain" +version = "1.8.1" +requires_python = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +summary = "Sphinx domain for documenting HTTP APIs" +groups = ["default"] +dependencies = [ + "Sphinx>=1.6", + "six", +] +files = [ + {file = "sphinxcontrib-httpdomain-1.8.1.tar.gz", hash = "sha256:6c2dfe6ca282d75f66df333869bb0ce7331c01b475db6809ff9d107b7cdfe04b"}, + {file = "sphinxcontrib_httpdomain-1.8.1-py2.py3-none-any.whl", hash = "sha256:21eefe1270e4d9de8d717cc89ee92cc4871b8736774393bafc5e38a6bb77b1d5"}, +] + [[package]] name = "sphinxcontrib-jsmath" version = "1.0.1" requires_python = ">=3.5" summary = "A sphinx extension which renders display math in HTML via JavaScript" -groups = ["dev"] +groups = ["default", "dev"] files = [ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, ] +[[package]] +name = "sphinxcontrib-openapi" +version = "0.8.4" +requires_python = ">=3.7" +summary = "OpenAPI (fka Swagger) spec renderer for Sphinx" +groups = ["default"] +dependencies = [ + "PyYAML>=3.12", + "deepmerge>=0.1", + "importlib-metadata; python_version < \"3.8\"", + "jsonschema>=2.5.1", + "picobox>=2.2", + "sphinx-mdinclude>=0.5.2", + "sphinx>=2.0", + "sphinxcontrib-httpdomain>=1.5.0", +] +files = [ + {file = "sphinxcontrib-openapi-0.8.4.tar.gz", hash = "sha256:df883808a5b5e4b4113ad697185c43a3f42df3dce70453af78ba7076907e9a20"}, + {file = "sphinxcontrib_openapi-0.8.4-py3-none-any.whl", hash = "sha256:50911c18d452d9390ee3a384ef8dc8bde6135f542ba55691f81e1fbc0b71014e"}, +] + [[package]] name = "sphinxcontrib-qthelp" version = "2.0.0" requires_python = ">=3.9" summary = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" -groups = ["dev"] +groups = ["default", "dev"] files = [ {file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"}, {file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"}, @@ -629,7 +819,7 @@ name = "sphinxcontrib-serializinghtml" version = "2.0.0" requires_python = ">=3.9" summary = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" -groups = ["dev"] +groups = ["default", "dev"] files = [ {file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"}, {file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"}, @@ -669,7 +859,6 @@ version = "4.12.2" requires_python = ">=3.8" summary = "Backported and Experimental Type Hints for Python 3.8+" groups = ["dev"] -marker = "python_version < \"3.12\" and python_version >= \"3.11\"" files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -680,7 +869,7 @@ name = "urllib3" version = "2.2.3" requires_python = ">=3.8" summary = "HTTP library with thread-safe connection pooling, file post, and more." -groups = ["dev"] +groups = ["default", "dev"] files = [ {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, diff --git a/pyproject.toml b/pyproject.toml index f095b012..93d1d99c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,13 +6,14 @@ authors = [{ name = "MEx Team", email = "mex@rki.de" }] readme = { file = "README.md", content-type = "text/markdown" } license = { file = "LICENSE" } urls = { Repository = "https://github.com/robert-koch-institut/mex-model" } -requires-python = "<3.13,>=3.11" +requires-python = ">=3.11,<3.13" dependencies = [] optional-dependencies.dev = [ - "ipdb>=0.13.1,<1", - "myst-parser>=4.0.0,<5", - "ruff>=0.5.4,<1", - "sphinx>=7.4.5,<8", + "ipdb>=0.13,<1", + "mypy>=1,<2", + "ruff>=0.7,<1", + "sphinx-jsonschema>=1,<2", + "sphinx>=8.1,<9" ] [tool.cruft] @@ -28,7 +29,7 @@ distribution = true [tool.pdm.scripts] update-all = { cmd = "pdm update --group :all --update-all --save-compatible" } lock-all = { cmd = "pdm lock --group :all --refresh" } -install-all = { cmd = "pdm install --group :all --no-editable --no-lock" } +install-all = { cmd = "pdm install --group :all --no-editable --frozen-lockfile" } export-all = { cmd = "pdm export --group :all --no-hashes -f requirements" } sphinx = { cmd = "pdm run sphinx-build -aE -b dirhtml docs docs/dist" } doc = { composite = ["sphinx"] } @@ -36,6 +37,9 @@ wheel = { cmd = "pdm build --no-sdist" } lint = { cmd = "pre-commit run --all-files" } all = { composite = ["install-all", "lint", "doc"] } +[tool.pydantic-mypy] +warn_untyped_fields = true + [tool.ruff] fix = true line-length = 88 @@ -74,6 +78,7 @@ select = ["ALL"] [tool.ruff.lint.per-file-ignores] "docs/**" = [ "INP001", # Docs folder does not need to be a package + "SLF001", # Allow accessing private members to customize extensions ] "scripts/**" = [ "INP001", # Scripts folder does not need to be a package diff --git a/requirements.txt b/requirements.txt index 98cfe233..7470a61a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ cruft==2.15.0 -mex-release @ git+https://github.com/robert-koch-institut/mex-release.git +mex-release==0.3.0 pdm==2.20.1 pre-commit==4.0.1 wheel==0.45.0 diff --git a/scripts/build_schema_zip.py b/scripts/build_schema_zip.py index a18039c3..aead3203 100644 --- a/scripts/build_schema_zip.py +++ b/scripts/build_schema_zip.py @@ -12,7 +12,7 @@ JSON schema files defining the MEx metadata model. -## project +## Project The Metadata Exchange (MEx) project is committed to improve the retrieval of RKI research data and projects. How? By focusing on metadata: instead of providing the @@ -36,33 +36,34 @@ [project page](https://www.rki.de/DE/Content/Forsch/MEx/MEx_node.html). [^1]: FAIR is referencing the so-called -[FAIR data principles](https://www.go-fair.org/fair-principles/) - guidelines to make +[FAIR data principles](https://www.go-fair.org/fair-principles/) \u2013 guidelines to make data Findable, Accessible, Interoperable and Reusable. **Contact** \ For more information, please feel free to email us at [mex@rki.de](mailto:mex@rki.de). -### Publisher of this document +### Publisher + **Robert Koch-Institut** \ Nordufer 20 \ 13353 Berlin \ Germany -## package +## Package -This zip file contains the JSON schema. We defined 1. +Our metadata model is represented as JSON schema in `mex/model`. There, we defined 1. `entities`, described by their properties, 2. `fields`, small objects, that are used as `$ref` for certain properties, 3. an `extension`, which contains additional properties, that are not in scope of the JSON schema definition, 4. `i18n` files, that hold -translations of the properties and are to be used in the context of user interfaces -and 5. `vocabularies`, which are used in context of the `entities`. A more detailed +translations of the properties and are to be used in the context of user interfaces and +5. `vocabularies`, which are used in context of the `entities`. A more detailed description of the model's context can be found in `/docs/index.md`. -## license +## License This package is licensed under the [MIT license](/LICENSE). All other software components of the MEx project are open-sourced under the same license as well. -""" +""" # noqa: E501 def create_merged_entities() -> dict[str, dict[str, Any]]: @@ -93,7 +94,7 @@ def create_merged_entities() -> dict[str, dict[str, Any]]: return merged_entities -def create_schema_zip(): +def create_schema_zip() -> None: """Create schema.zip archive. The archive includes the merged entities, all vocabularies except "concept-schemes",