esgvoc 1.0.0__tar.gz → 1.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of esgvoc might be problematic. Click here for more details.
- {esgvoc-1.0.0 → esgvoc-1.1.1}/.pre-commit-config.yaml +0 -8
- {esgvoc-1.0.0 → esgvoc-1.1.1}/PKG-INFO +2 -3
- {esgvoc-1.0.0 → esgvoc-1.1.1}/README.md +0 -2
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/api_documentation/miscellaneous.md +1 -1
- esgvoc-1.1.1/docs/source/how_to/configuration.rst +296 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/pyproject.toml +3 -1
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/__init__.py +1 -1
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/__init__.py +0 -6
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/__init__.py +8 -0
- esgvoc-1.1.1/src/esgvoc/api/data_descriptors/archive.py +5 -0
- esgvoc-1.1.1/src/esgvoc/api/data_descriptors/citation_url.py +5 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/experiment.py +2 -2
- esgvoc-1.1.1/src/esgvoc/api/data_descriptors/known_branded_variable.py +76 -0
- esgvoc-1.1.1/src/esgvoc/api/data_descriptors/member_id.py +9 -0
- esgvoc-1.1.1/src/esgvoc/api/data_descriptors/regex.py +5 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/vertical_label.py +2 -2
- esgvoc-1.1.1/src/esgvoc/api/project_specs.py +116 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/projects.py +185 -66
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/apps/drs/generator.py +103 -85
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/apps/drs/validator.py +22 -38
- esgvoc-1.1.1/src/esgvoc/apps/jsg/json_schema_generator.py +310 -0
- esgvoc-1.1.1/src/esgvoc/apps/jsg/templates/template.jinja +249 -0
- esgvoc-1.1.1/src/esgvoc/apps/test_cv/README.md +214 -0
- esgvoc-1.1.1/src/esgvoc/apps/test_cv/cv_tester.py +1368 -0
- esgvoc-1.1.1/src/esgvoc/apps/test_cv/example_usage.py +216 -0
- esgvoc-1.1.1/src/esgvoc/apps/vr/__init__.py +12 -0
- esgvoc-1.1.1/src/esgvoc/apps/vr/build_variable_registry.py +71 -0
- esgvoc-1.1.1/src/esgvoc/apps/vr/example_usage.py +60 -0
- esgvoc-1.1.1/src/esgvoc/apps/vr/vr_app.py +333 -0
- esgvoc-1.1.1/src/esgvoc/cli/config.py +1085 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/cli/drs.py +39 -21
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/cli/main.py +2 -0
- esgvoc-1.1.1/src/esgvoc/cli/test_cv.py +257 -0
- esgvoc-1.1.1/src/esgvoc/core/constants.py +16 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/core/data_handler.py +24 -22
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/core/db/connection.py +7 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/core/db/project_ingestion.py +34 -9
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/core/db/universe_ingestion.py +1 -2
- esgvoc-1.1.1/src/esgvoc/core/service/configuration/setting.py +259 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/core/service/data_merger.py +1 -1
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/core/service/state.py +18 -2
- {esgvoc-1.0.0 → esgvoc-1.1.1}/tests/api_inputs.py +130 -113
- {esgvoc-1.0.0 → esgvoc-1.1.1}/tests/test_api_project.py +36 -57
- esgvoc-1.1.1/tests/test_cli_config.py +1389 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/tests/test_drs_generator.py +2 -2
- esgvoc-1.1.1/tests/test_js_generator.py +172 -0
- esgvoc-1.1.1/useage_example/.ipynb_checkpoints/Basic-checkpoint.ipynb +473 -0
- esgvoc-1.1.1/useage_example/Basic.ipynb +473 -0
- esgvoc-1.0.0/src/esgvoc/api/data_descriptors/known_branded_variable.py +0 -23
- esgvoc-1.0.0/src/esgvoc/api/project_specs.py +0 -198
- esgvoc-1.0.0/src/esgvoc/apps/jsg/cmip6_template.json +0 -74
- esgvoc-1.0.0/src/esgvoc/apps/jsg/cmip6plus_template.json +0 -74
- esgvoc-1.0.0/src/esgvoc/apps/jsg/json_schema_generator.py +0 -185
- esgvoc-1.0.0/src/esgvoc/cli/config.py +0 -500
- esgvoc-1.0.0/src/esgvoc/core/constants.py +0 -13
- esgvoc-1.0.0/src/esgvoc/core/service/configuration/setting.py +0 -88
- esgvoc-1.0.0/tests/test_cli_config.py +0 -108
- esgvoc-1.0.0/tests/test_js_generator.py +0 -92
- {esgvoc-1.0.0 → esgvoc-1.1.1}/.flake8 +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/.github/workflows/docs.yml +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/.github/workflows/pypi-publish.yml +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/.github/workflows/unit_tests.yml +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/.gitignore +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/LICENSE.txt +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/Makefile +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/build.sh +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/API_Valid_Term.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/API_Valid_all_project.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/API_Valid_collection.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/API_Valid_project.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/API_drsgen_frombag.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/API_drsgen_map.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/API_drsvalid_one.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/CLI_Valid_all_project.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/CLI_Valid_collection.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/CLI_Valid_project.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/CLI_Valid_term.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/CLI_drsgen_frombag.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/CLI_drsvalid_one.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/Jup_one_term.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/Jup_one_term_from_one_CV.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/Jup_terms_from_one_collection.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/Jup_terms_from_one_dd.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/all_collection.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/all_term_from_one_collection.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/install.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/one_term.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/one_term_from_one_cv.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/status_after_install.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/_static/status_before_install.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/api_documentation/data_descriptors.md +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/api_documentation/drs.md +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/api_documentation/jsg.md +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/api_documentation/project_specs.md +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/api_documentation/projects.md +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/api_documentation/universe.md +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/conf.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/guides/basics_drs.ipynb +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/guides/basics_esgvoc.ipynb +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/guides/status_install.png +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/how_to/generate_drs.rst +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/how_to/get.rst +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/how_to/valid.rst +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/how_to/validate_drs.rst +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/index.md +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/user/api.md +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/user/cached_database.md +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/user/cli.md +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/user/introduction.md +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/docs/source/user/terms.md +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/activity.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/area_label.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/branded_suffix.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/branded_variable.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/consortium.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/contact.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/conventions.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/creation_date.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/data_descriptor.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/data_specs_version.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/date.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/directory_date.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/forcing_index.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/frequency.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/further_info_url.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/grid_label.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/horizontal_label.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/initialisation_index.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/institution.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/license.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/mip_era.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/model_component.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/obs_type.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/organisation.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/physic_index.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/product.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/publication_status.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/realisation_index.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/realm.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/region.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/resolution.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/source.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/source_type.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/sub_experiment.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/table.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/temporal_label.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/time_range.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/title.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/tracking_id.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/variable.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/data_descriptors/variant_label.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/py.typed +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/report.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/search.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/api/universe.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/apps/__init__.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/apps/drs/__init__.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/apps/drs/constants.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/apps/drs/report.py +0 -0
- {esgvoc-1.0.0/tests → esgvoc-1.1.1/src/esgvoc/apps/test_cv}/__init__.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/cli/find.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/cli/get.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/cli/install.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/cli/status.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/cli/valid.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/core/convert.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/core/db/__init__.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/core/db/models/mixins.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/core/db/models/project.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/core/db/models/universe.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/core/exceptions.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/core/logging_handler.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/core/repo_fetcher.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/core/service/__init__.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/core/service/configuration/config_manager.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/src/esgvoc/core/service/esg_voc.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/tests/Dockerfile +0 -0
- /esgvoc-1.0.0/src/esgvoc/apps/py.typed → /esgvoc-1.1.1/tests/__init__.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/tests/cli_input_drsgen.txt +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/tests/cli_input_drsvalid.txt +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/tests/conftest.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/tests/integration/test_scenario_basic.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/tests/test_api_universe.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/tests/test_cli_drs.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/tests/test_config.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/tests/test_data_handler.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/tests/test_data_merger.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/tests/test_drs_validator.py +0 -0
- {esgvoc-1.0.0 → esgvoc-1.1.1}/tests/test_repo_fetcher.py +0 -0
|
@@ -22,14 +22,6 @@ repos:
|
|
|
22
22
|
- id: ruff
|
|
23
23
|
name: ruff-sort-imports
|
|
24
24
|
args: [--select, I, --fix]
|
|
25
|
-
- repo: local
|
|
26
|
-
hooks:
|
|
27
|
-
- id: wily
|
|
28
|
-
name: wily
|
|
29
|
-
entry: wily diff
|
|
30
|
-
verbose: true
|
|
31
|
-
language: python
|
|
32
|
-
additional_dependencies: [wily]
|
|
33
25
|
- repo: https://github.com/PyCQA/flake8
|
|
34
26
|
rev: 7.1.2
|
|
35
27
|
hooks:
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: esgvoc
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.1.1
|
|
4
4
|
Summary: python library and CLI to interact with WCRP CVs
|
|
5
5
|
Project-URL: Repository, https://github.com/ESGF/esgf-vocab
|
|
6
6
|
Author-email: Sébastien Gardoll <sebastien@gardoll.fr>, Guillaume Levavasseur <guillaume.levavasseur@ipsl.fr>, Laurent Troussellier <laurent.troussellier@ipsl.fr>
|
|
7
7
|
License: CECILL-2.1
|
|
8
8
|
Requires-Python: >=3.10
|
|
9
9
|
Requires-Dist: idna>=3.10
|
|
10
|
+
Requires-Dist: jinja2>=3.1.6
|
|
10
11
|
Requires-Dist: platformdirs>=4.3.6
|
|
11
12
|
Requires-Dist: pydantic>=2.9.2
|
|
12
13
|
Requires-Dist: pyld>=2.0.4
|
|
@@ -62,7 +63,6 @@ esgvoc install
|
|
|
62
63
|
|
|
63
64
|
```bash
|
|
64
65
|
pip install -e .
|
|
65
|
-
wily setup
|
|
66
66
|
pip install pre-commit
|
|
67
67
|
pre-commit install
|
|
68
68
|
```
|
|
@@ -71,6 +71,5 @@ pre-commit install
|
|
|
71
71
|
|
|
72
72
|
```bash
|
|
73
73
|
uv sync
|
|
74
|
-
uv run wily setup
|
|
75
74
|
uv run pre-commit install
|
|
76
75
|
```
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
Configuration
|
|
2
|
+
#############
|
|
3
|
+
|
|
4
|
+
The configuration system allows you to manage different project setups and easily switch between them. Each configuration defines which projects are active and where their repositories and databases are stored.
|
|
5
|
+
|
|
6
|
+
Understanding Configurations
|
|
7
|
+
============================
|
|
8
|
+
|
|
9
|
+
A configuration contains:
|
|
10
|
+
|
|
11
|
+
- **Universe settings**: Global WCRP vocabulary repository settings
|
|
12
|
+
- **Project settings**: Individual project repositories (CMIP6, Input4MIPs, etc.)
|
|
13
|
+
|
|
14
|
+
Default Projects Available
|
|
15
|
+
==========================
|
|
16
|
+
|
|
17
|
+
ESGVoc comes with several pre-configured projects that can be easily added:
|
|
18
|
+
|
|
19
|
+
- **cmip6**: CMIP6 Controlled Vocabularies
|
|
20
|
+
- **cmip6plus**: CMIP6Plus Controlled Vocabularies
|
|
21
|
+
- **input4mip**: Input4MIPs Controlled Vocabularies
|
|
22
|
+
- **obs4mip**: Obs4MIPs Controlled Vocabularies
|
|
23
|
+
- **cordex-cmip6**: CORDEX-CMIP6 Controlled Vocabularies
|
|
24
|
+
|
|
25
|
+
Basic Configuration Commands
|
|
26
|
+
============================
|
|
27
|
+
|
|
28
|
+
Viewing Available Projects
|
|
29
|
+
--------------------------
|
|
30
|
+
|
|
31
|
+
.. code-block:: bash
|
|
32
|
+
|
|
33
|
+
# Show all available projects and their status in current config
|
|
34
|
+
esgvoc config avail
|
|
35
|
+
|
|
36
|
+
# Check projects in a specific configuration
|
|
37
|
+
esgvoc config avail --config my_config
|
|
38
|
+
|
|
39
|
+
This displays a table showing which projects are active (✓) and which are available to add (○).
|
|
40
|
+
|
|
41
|
+
Creating Empty Configurations
|
|
42
|
+
-----------------------------
|
|
43
|
+
|
|
44
|
+
.. code-block:: bash
|
|
45
|
+
|
|
46
|
+
# Create empty configuration and switch to it
|
|
47
|
+
esgvoc config init minimal_setup
|
|
48
|
+
|
|
49
|
+
# Create empty configuration but stay on current one
|
|
50
|
+
esgvoc config init test_config --no-switch
|
|
51
|
+
|
|
52
|
+
An empty configuration contains only universe settings with no projects, allowing you to add projects selectively.
|
|
53
|
+
|
|
54
|
+
Adding Projects
|
|
55
|
+
---------------
|
|
56
|
+
|
|
57
|
+
.. code-block:: bash
|
|
58
|
+
|
|
59
|
+
# Add single project to current configuration
|
|
60
|
+
esgvoc config add input4mip
|
|
61
|
+
|
|
62
|
+
# Add multiple projects at once
|
|
63
|
+
esgvoc config add input4mip obs4mip cordex-cmip6
|
|
64
|
+
|
|
65
|
+
# Add projects to specific configuration
|
|
66
|
+
esgvoc config add cmip6 --config production
|
|
67
|
+
|
|
68
|
+
When you add projects:
|
|
69
|
+
|
|
70
|
+
1. The project is added to the configuration using default settings
|
|
71
|
+
2. The project's controlled vocabularies are automatically downloaded
|
|
72
|
+
3. Local repositories and databases are set up
|
|
73
|
+
|
|
74
|
+
.. note::
|
|
75
|
+
Projects that already exist in the configuration will be skipped with a warning.
|
|
76
|
+
|
|
77
|
+
Removing Projects
|
|
78
|
+
-----------------
|
|
79
|
+
|
|
80
|
+
.. code-block:: bash
|
|
81
|
+
|
|
82
|
+
# Remove single project (with confirmation)
|
|
83
|
+
esgvoc config rm input4mip
|
|
84
|
+
|
|
85
|
+
# Remove multiple projects at once
|
|
86
|
+
esgvoc config rm input4mip obs4mip cordex-cmip6
|
|
87
|
+
|
|
88
|
+
# Remove without confirmation prompt
|
|
89
|
+
esgvoc config rm input4mip --force
|
|
90
|
+
|
|
91
|
+
# Remove from configuration but keep local files
|
|
92
|
+
esgvoc config rm input4mip --keep-files
|
|
93
|
+
|
|
94
|
+
When you remove projects:
|
|
95
|
+
|
|
96
|
+
1. The project is removed from the configuration
|
|
97
|
+
2. Local repository directory is deleted (unless ``--keep-files``)
|
|
98
|
+
3. Database file is deleted (unless ``--keep-files``)
|
|
99
|
+
|
|
100
|
+
.. warning::
|
|
101
|
+
By default, removing a project deletes all its local files. Use ``--keep-files`` if you want to preserve the downloaded data.
|
|
102
|
+
|
|
103
|
+
Advanced Configuration Management
|
|
104
|
+
=================================
|
|
105
|
+
|
|
106
|
+
Listing Configurations
|
|
107
|
+
----------------------
|
|
108
|
+
|
|
109
|
+
.. code-block:: bash
|
|
110
|
+
|
|
111
|
+
# List all available configurations
|
|
112
|
+
esgvoc config list
|
|
113
|
+
|
|
114
|
+
# Show current configuration content
|
|
115
|
+
esgvoc config show
|
|
116
|
+
|
|
117
|
+
# Show specific configuration content
|
|
118
|
+
esgvoc config show my_config
|
|
119
|
+
|
|
120
|
+
Creating New Configurations
|
|
121
|
+
---------------------------
|
|
122
|
+
|
|
123
|
+
.. code-block:: bash
|
|
124
|
+
|
|
125
|
+
# Create configuration based on default settings
|
|
126
|
+
esgvoc config create production
|
|
127
|
+
|
|
128
|
+
# Create configuration based on existing one
|
|
129
|
+
esgvoc config create test --base production
|
|
130
|
+
|
|
131
|
+
# Create and immediately switch to it
|
|
132
|
+
esgvoc config create development --switch
|
|
133
|
+
|
|
134
|
+
Switching Configurations
|
|
135
|
+
------------------------
|
|
136
|
+
|
|
137
|
+
.. code-block:: bash
|
|
138
|
+
|
|
139
|
+
# Switch to different configuration
|
|
140
|
+
esgvoc config switch production
|
|
141
|
+
|
|
142
|
+
# Check which configuration is currently active
|
|
143
|
+
esgvoc config list
|
|
144
|
+
|
|
145
|
+
Managing Project Settings
|
|
146
|
+
-------------------------
|
|
147
|
+
|
|
148
|
+
.. code-block:: bash
|
|
149
|
+
|
|
150
|
+
# List projects in current configuration
|
|
151
|
+
esgvoc config list-projects
|
|
152
|
+
|
|
153
|
+
# List projects in specific configuration
|
|
154
|
+
esgvoc config list-projects --config production
|
|
155
|
+
|
|
156
|
+
# Update project repository URL
|
|
157
|
+
esgvoc config update-project cmip6 --repo https://github.com/new/repo
|
|
158
|
+
|
|
159
|
+
# Update project branch
|
|
160
|
+
esgvoc config update-project cmip6 --branch new_branch
|
|
161
|
+
|
|
162
|
+
# Update multiple settings at once
|
|
163
|
+
esgvoc config update-project cmip6 --repo https://github.com/new/repo --branch main
|
|
164
|
+
|
|
165
|
+
Manual Configuration Editing
|
|
166
|
+
-----------------------------
|
|
167
|
+
|
|
168
|
+
.. code-block:: bash
|
|
169
|
+
|
|
170
|
+
# Edit current configuration in default editor
|
|
171
|
+
esgvoc config edit
|
|
172
|
+
|
|
173
|
+
# Edit specific configuration
|
|
174
|
+
esgvoc config edit production
|
|
175
|
+
|
|
176
|
+
# Use specific editor
|
|
177
|
+
esgvoc config edit --editor nano
|
|
178
|
+
|
|
179
|
+
# Modify settings via command line
|
|
180
|
+
esgvoc config set 'universe:branch=esgvoc_dev'
|
|
181
|
+
esgvoc config set 'cmip6:github_repo=https://github.com/new/cmip6'
|
|
182
|
+
|
|
183
|
+
Removing Configurations
|
|
184
|
+
-----------------------
|
|
185
|
+
|
|
186
|
+
.. code-block:: bash
|
|
187
|
+
|
|
188
|
+
# Remove configuration (with confirmation)
|
|
189
|
+
esgvoc config remove test_config
|
|
190
|
+
|
|
191
|
+
.. note::
|
|
192
|
+
You cannot remove the "default" configuration, and removing the active configuration will automatically switch you to the default one.
|
|
193
|
+
|
|
194
|
+
Configuration Workflows
|
|
195
|
+
========================
|
|
196
|
+
|
|
197
|
+
Setting Up a Development Environment
|
|
198
|
+
------------------------------------
|
|
199
|
+
|
|
200
|
+
.. code-block:: bash
|
|
201
|
+
|
|
202
|
+
# Create empty development configuration
|
|
203
|
+
esgvoc config init dev
|
|
204
|
+
|
|
205
|
+
# Add only the projects you need
|
|
206
|
+
esgvoc config add cmip6 input4mip
|
|
207
|
+
|
|
208
|
+
# Check what's active
|
|
209
|
+
esgvoc config avail
|
|
210
|
+
|
|
211
|
+
Setting Up Multiple Project Environments
|
|
212
|
+
----------------------------------------
|
|
213
|
+
|
|
214
|
+
.. code-block:: bash
|
|
215
|
+
|
|
216
|
+
# Create minimal configuration for CMIP6 only
|
|
217
|
+
esgvoc config init cmip6_only
|
|
218
|
+
esgvoc config add cmip6
|
|
219
|
+
|
|
220
|
+
# Create full configuration with all projects
|
|
221
|
+
esgvoc config init full_setup
|
|
222
|
+
esgvoc config add cmip6 cmip6plus input4mip obs4mip cordex-cmip6
|
|
223
|
+
|
|
224
|
+
# Switch between them as needed
|
|
225
|
+
esgvoc config switch cmip6_only
|
|
226
|
+
esgvoc config switch full_setup
|
|
227
|
+
|
|
228
|
+
Cleaning Up Old Projects
|
|
229
|
+
------------------------
|
|
230
|
+
|
|
231
|
+
.. code-block:: bash
|
|
232
|
+
|
|
233
|
+
# Check what projects are currently active
|
|
234
|
+
esgvoc config avail
|
|
235
|
+
|
|
236
|
+
# Remove projects no longer needed (keeps files)
|
|
237
|
+
esgvoc config rm obs4mip cordex-cmip6 --keep-files
|
|
238
|
+
|
|
239
|
+
# Or remove completely including files
|
|
240
|
+
esgvoc config rm obs4mip cordex-cmip6
|
|
241
|
+
|
|
242
|
+
Configuration File Location
|
|
243
|
+
===========================
|
|
244
|
+
|
|
245
|
+
Configuration files are stored in platform-specific directories:
|
|
246
|
+
|
|
247
|
+
- **Linux**: ``~/.config/esgvoc/``
|
|
248
|
+
- **macOS**: ``~/Library/Application Support/esgvoc/``
|
|
249
|
+
- **Windows**: ``%APPDATA%\\esgvoc\\``
|
|
250
|
+
|
|
251
|
+
The main registry file (``config_registry.toml``) tracks all configurations and which one is active.
|
|
252
|
+
|
|
253
|
+
Troubleshooting
|
|
254
|
+
===============
|
|
255
|
+
|
|
256
|
+
Configuration Not Found
|
|
257
|
+
-----------------------
|
|
258
|
+
|
|
259
|
+
If you get "Configuration not found" errors:
|
|
260
|
+
|
|
261
|
+
.. code-block:: bash
|
|
262
|
+
|
|
263
|
+
# List available configurations
|
|
264
|
+
esgvoc config list
|
|
265
|
+
|
|
266
|
+
# Switch to default if needed
|
|
267
|
+
esgvoc config switch default
|
|
268
|
+
|
|
269
|
+
Project Already Exists
|
|
270
|
+
----------------------
|
|
271
|
+
|
|
272
|
+
When adding projects that already exist:
|
|
273
|
+
|
|
274
|
+
.. code-block:: bash
|
|
275
|
+
|
|
276
|
+
# Check current projects
|
|
277
|
+
esgvoc config list-projects
|
|
278
|
+
|
|
279
|
+
# Check all available projects and their status
|
|
280
|
+
esgvoc config avail
|
|
281
|
+
|
|
282
|
+
Reset to Clean State
|
|
283
|
+
--------------------
|
|
284
|
+
|
|
285
|
+
To start fresh:
|
|
286
|
+
|
|
287
|
+
.. code-block:: bash
|
|
288
|
+
|
|
289
|
+
# Create new empty configuration
|
|
290
|
+
esgvoc config init fresh --no-switch
|
|
291
|
+
|
|
292
|
+
# Remove old configuration
|
|
293
|
+
esgvoc config remove old_config
|
|
294
|
+
|
|
295
|
+
# Switch to clean setup
|
|
296
|
+
esgvoc config switch fresh
|
|
@@ -21,6 +21,7 @@ dependencies = [
|
|
|
21
21
|
"toml>=0.10.2",
|
|
22
22
|
"typer>=0.15.0",
|
|
23
23
|
"platformdirs>=4.3.6",
|
|
24
|
+
"jinja2>=3.1.6",
|
|
24
25
|
]
|
|
25
26
|
readme = "README.md"
|
|
26
27
|
requires-python = ">= 3.10"
|
|
@@ -53,13 +54,14 @@ dev = [
|
|
|
53
54
|
"sphinx-copybutton>=0.5.2",
|
|
54
55
|
"pre-commit>=4.1.0",
|
|
55
56
|
"flake8>=7.1.2",
|
|
56
|
-
"wily>=1.25.0",
|
|
57
57
|
"ruff>=0.11.0",
|
|
58
58
|
"pyright>=1.1.396",
|
|
59
59
|
"mypy>=1.13.0",
|
|
60
60
|
"pytest>=8.3.5",
|
|
61
61
|
"pytest-mock>=3.14.0",
|
|
62
62
|
"pytest-cov>=6.0.0",
|
|
63
|
+
"jsonschema>=4.24.0",
|
|
64
|
+
"pip>=25.2",
|
|
63
65
|
]
|
|
64
66
|
|
|
65
67
|
[tool.hatch.metadata]
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
from esgvoc.api.project_specs import (
|
|
2
|
-
DrsCollection,
|
|
3
|
-
DrsConstant,
|
|
4
2
|
DrsPart,
|
|
5
|
-
DrsPartKind,
|
|
6
3
|
DrsSpecification,
|
|
7
4
|
DrsType,
|
|
8
5
|
ProjectSpecs,
|
|
@@ -51,10 +48,7 @@ from esgvoc.api.universe import (
|
|
|
51
48
|
)
|
|
52
49
|
|
|
53
50
|
__all__ = [
|
|
54
|
-
"DrsCollection",
|
|
55
|
-
"DrsConstant",
|
|
56
51
|
"DrsPart",
|
|
57
|
-
"DrsPartKind",
|
|
58
52
|
"DrsSpecification",
|
|
59
53
|
"DrsType",
|
|
60
54
|
"find_collections_in_project",
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
from esgvoc.api.data_descriptors.activity import Activity
|
|
2
|
+
from esgvoc.api.data_descriptors.archive import Archive
|
|
2
3
|
from esgvoc.api.data_descriptors.area_label import AreaLabel
|
|
3
4
|
from esgvoc.api.data_descriptors.branded_suffix import BrandedSuffix
|
|
4
5
|
from esgvoc.api.data_descriptors.branded_variable import BrandedVariable
|
|
6
|
+
from esgvoc.api.data_descriptors.citation_url import CitationUrl
|
|
5
7
|
from esgvoc.api.data_descriptors.consortium import Consortium
|
|
6
8
|
from esgvoc.api.data_descriptors.contact import Contact
|
|
7
9
|
from esgvoc.api.data_descriptors.conventions import Convention
|
|
@@ -20,6 +22,7 @@ from esgvoc.api.data_descriptors.initialisation_index import InitialisationIndex
|
|
|
20
22
|
from esgvoc.api.data_descriptors.institution import Institution
|
|
21
23
|
from esgvoc.api.data_descriptors.known_branded_variable import KnownBrandedVariable
|
|
22
24
|
from esgvoc.api.data_descriptors.license import License
|
|
25
|
+
from esgvoc.api.data_descriptors.member_id import MemberId
|
|
23
26
|
from esgvoc.api.data_descriptors.mip_era import MipEra
|
|
24
27
|
from esgvoc.api.data_descriptors.model_component import ModelComponent
|
|
25
28
|
from esgvoc.api.data_descriptors.obs_type import ObsType
|
|
@@ -29,6 +32,7 @@ from esgvoc.api.data_descriptors.product import Product
|
|
|
29
32
|
from esgvoc.api.data_descriptors.publication_status import PublicationStatus
|
|
30
33
|
from esgvoc.api.data_descriptors.realisation_index import RealisationIndex
|
|
31
34
|
from esgvoc.api.data_descriptors.realm import Realm
|
|
35
|
+
from esgvoc.api.data_descriptors.regex import Regex
|
|
32
36
|
from esgvoc.api.data_descriptors.region import Region
|
|
33
37
|
from esgvoc.api.data_descriptors.resolution import Resolution
|
|
34
38
|
from esgvoc.api.data_descriptors.source import Source
|
|
@@ -87,5 +91,9 @@ DATA_DESCRIPTOR_CLASS_MAPPING: dict[str, type[DataDescriptor]] = {
|
|
|
87
91
|
"title": Title,
|
|
88
92
|
"contact": Contact,
|
|
89
93
|
"region": Region,
|
|
94
|
+
"member_id": MemberId,
|
|
90
95
|
"obs_type": ObsType, # obs4Mips
|
|
96
|
+
"regex": Regex,
|
|
97
|
+
"citation_url": CitationUrl,
|
|
98
|
+
"archive": Archive,
|
|
91
99
|
}
|
|
@@ -20,8 +20,8 @@ class Experiment(PlainTermDataDescriptor):
|
|
|
20
20
|
experiment: str
|
|
21
21
|
required_model_components: list[str] | None
|
|
22
22
|
additional_allowed_model_components: list[str] = Field(default_factory=list)
|
|
23
|
-
start_year: int | None
|
|
24
|
-
end_year: int | None
|
|
23
|
+
start_year: str | int | None
|
|
24
|
+
end_year: str | int | None
|
|
25
25
|
min_number_yrs_per_sim: int | None
|
|
26
26
|
parent_activity_id: list[str] | None
|
|
27
27
|
parent_experiment_id: list[str] | None
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
from typing import Any, Dict, List, Optional
|
|
2
|
+
|
|
3
|
+
from pydantic import Field
|
|
4
|
+
|
|
5
|
+
from esgvoc.api.data_descriptors.data_descriptor import PlainTermDataDescriptor
|
|
6
|
+
|
|
7
|
+
#
|
|
8
|
+
# class KnownBrandedVariable(PlainTermDataDescriptor):
|
|
9
|
+
# """
|
|
10
|
+
# A climate-related quantity or measurement, including information about sampling.
|
|
11
|
+
#
|
|
12
|
+
# The concept of a branded variable was introduced in CMIP7.
|
|
13
|
+
# A branded variable is composed of two parts.
|
|
14
|
+
# The first part is the root variable (see :py:class:`Variable`).
|
|
15
|
+
# The second is the suffix (see :py:class:`BrandedSuffix`).
|
|
16
|
+
#
|
|
17
|
+
# For further details on the development of branded variables,
|
|
18
|
+
# see [this paper draft](https://docs.google.com/document/d/19jzecgymgiiEsTDzaaqeLP6pTvLT-NzCMaq-wu-QoOc/edit?pli=1&tab=t.0).
|
|
19
|
+
# """
|
|
20
|
+
#
|
|
21
|
+
# description: str
|
|
22
|
+
# dimensions: list[str] = Field(default_factory=list)
|
|
23
|
+
# cell_methods: str
|
|
24
|
+
# variable: str
|
|
25
|
+
# label: str
|
|
26
|
+
#
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class KnownBrandedVariable(PlainTermDataDescriptor):
|
|
30
|
+
"""
|
|
31
|
+
A climate-related quantity or measurement, including information about sampling.
|
|
32
|
+
|
|
33
|
+
The concept of a branded variable was introduced in CMIP7.
|
|
34
|
+
A branded variable is composed of two parts.
|
|
35
|
+
The first part is the root variable (see :py:class:`Variable`).
|
|
36
|
+
The second is the suffix (see :py:class:`BrandedSuffix`).
|
|
37
|
+
|
|
38
|
+
For further details on the development of branded variables,
|
|
39
|
+
see [this paper draft](https://docs.google.com/document/d/19jzecgymgiiEsTDzaaqeLP6pTvLT-NzCMaq-wu-QoOc/edit?pli=1&tab=t.0).
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
# # ESGVoc required fields
|
|
43
|
+
# id: str = Field(description="Unique identifier, e.g., 'ta_tavg-p19-hxy-air'")
|
|
44
|
+
# type: str = Field(default="branded_variable", description="ESGVoc type identifier")
|
|
45
|
+
# drs_name: str = Field(description="DRS name, same as id")
|
|
46
|
+
# => already in PlainTermDataDescriptor
|
|
47
|
+
|
|
48
|
+
# CF Standard Name context (flattened from hierarchy)
|
|
49
|
+
cf_standard_name: str = Field(description="CF standard name, e.g., 'air_temperature'")
|
|
50
|
+
cf_units: str = Field(description="CF standard units, e.g., 'K'")
|
|
51
|
+
cf_sn_status: str = Field(description="CF standard name status, e.g., 'approved'")
|
|
52
|
+
|
|
53
|
+
# Variable Root context (flattened from hierarchy)
|
|
54
|
+
variable_root_name: str = Field(description="Variable root name, e.g., 'ta'")
|
|
55
|
+
var_def_qualifier: str = Field(default="", description="Variable definition qualifier")
|
|
56
|
+
branding_suffix_name: str = Field(description="Branding suffix, e.g., 'tavg-p19-hxy-air'")
|
|
57
|
+
|
|
58
|
+
# Variable metadata
|
|
59
|
+
description: str = Field(description="Human-readable description")
|
|
60
|
+
dimensions: List[str] = Field(description="NetCDF dimensions")
|
|
61
|
+
cell_methods: str = Field(default="", description="CF cell_methods attribute")
|
|
62
|
+
cell_measures: str = Field(default="", description="CF cell_measures attribute")
|
|
63
|
+
history: str = Field(default="", description="Processing history")
|
|
64
|
+
realm: str = Field(description="Earth system realm, e.g., 'atmos'")
|
|
65
|
+
|
|
66
|
+
# Label components (embedded, not references)
|
|
67
|
+
temporal_label: str = Field(description="Temporal label, e.g., 'tavg'")
|
|
68
|
+
vertical_label: str = Field(description="Vertical label, e.g., 'p19'")
|
|
69
|
+
horizontal_label: str = Field(description="Horizontal label, e.g., 'hxy'")
|
|
70
|
+
area_label: str = Field(description="Area label, e.g., 'air'")
|
|
71
|
+
|
|
72
|
+
# Status
|
|
73
|
+
bn_status: str = Field(description="Branded variable status, e.g., 'accepted'")
|
|
74
|
+
|
|
75
|
+
# Additional required fields from specifications
|
|
76
|
+
positive_direction: str = Field(default="", description="Positive direction for the variable")
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
from esgvoc.api.data_descriptors.data_descriptor import CompositeTermDataDescriptor
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class MemberId(CompositeTermDataDescriptor):
|
|
5
|
+
"""
|
|
6
|
+
The member_id uniquely identifies a specific model simulation within an experiment. It is created by combining the sub_experiment, which describes the setup or timing of the simulation (like a specific start year), and the variant_label, which details the configuration of the model (including initial conditions, physics, and forcings). Together, they form a code like s1960-r1i1p1f1. This allows users to distinguish between different ensemble members and understand how each run differs from others within the same experiment.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
description: str
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
from esgvoc.api.data_descriptors.data_descriptor import
|
|
1
|
+
from esgvoc.api.data_descriptors.data_descriptor import PlainTermDataDescriptor
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
class VerticalLabel(
|
|
4
|
+
class VerticalLabel(PlainTermDataDescriptor):
|
|
5
5
|
"""
|
|
6
6
|
Vertical label.
|
|
7
7
|
|