dapla-toolbelt-metadata 0.4.2__tar.gz → 0.5.0__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 dapla-toolbelt-metadata might be problematic. Click here for more details.

Files changed (95) hide show
  1. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/PKG-INFO +5 -7
  2. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/README.md +0 -2
  3. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/pyproject.toml +20 -21
  4. dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/__init__.py +13 -0
  5. dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/dapla/__init__.py +1 -0
  6. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/_shared → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/dapla}/user_info.py +55 -8
  7. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/src/dapla_metadata/datasets/code_list.py +1 -1
  8. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/src/dapla_metadata/datasets/core.py +1 -1
  9. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/src/dapla_metadata/datasets/dataset_parser.py +1 -1
  10. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/src/dapla_metadata/datasets/model_backwards_compatibility.py +6 -6
  11. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/src/dapla_metadata/datasets/model_validation.py +2 -2
  12. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/src/dapla_metadata/datasets/utility/constants.py +1 -0
  13. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/src/dapla_metadata/datasets/utility/enums.py +1 -1
  14. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/src/dapla_metadata/datasets/utility/utils.py +7 -11
  15. dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/__init__.py +9 -0
  16. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/.openapi-generator/FILES +0 -5
  17. dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated/.openapi-generator/VERSION +1 -0
  18. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/__init__.py +0 -5
  19. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/api/__init__.py +0 -1
  20. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/api/data_migration_api.py +2 -2
  21. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/api/draft_variable_definitions_api.py +14 -14
  22. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/api/patches_api.py +15 -15
  23. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/api/validity_periods_api.py +8 -281
  24. dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated/vardef_client/api/public_api.py → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated/vardef_client/api/variable_definitions_api.py +73 -358
  25. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/models/__init__.py +2 -6
  26. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/models/complete_response.py +8 -32
  27. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/models/contact.py +2 -2
  28. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/models/draft.py +8 -23
  29. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/models/language_string_type.py +7 -6
  30. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/models/owner.py +2 -2
  31. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/models/patch.py +16 -61
  32. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/models/problem.py +2 -2
  33. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/models/update_draft.py +22 -55
  34. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/models/validity_period.py +14 -48
  35. dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/variable_status.py +33 -0
  36. dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_utils/__init__.py +1 -0
  37. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_utils}/_client.py +5 -3
  38. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_utils}/config.py +25 -1
  39. dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_utils/constants.py +41 -0
  40. dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_utils/descriptions.py +86 -0
  41. dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_utils/files.py +273 -0
  42. dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_utils/template_files.py +112 -0
  43. dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_utils/variable_definition_files.py +93 -0
  44. dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/exceptions.py +196 -0
  45. dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/resources/vardef_model_descriptions_nb.yaml +63 -0
  46. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/src/dapla_metadata/variable_definitions/vardef.py +131 -10
  47. dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/variable_definition.py +410 -0
  48. dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/__init__.py +0 -6
  49. dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/__init__.py +0 -7
  50. dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/exceptions.py +0 -66
  51. dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated/.openapi-generator/VERSION +0 -1
  52. dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated/vardef_client/api/variable_definitions_api.py +0 -1205
  53. dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated/vardef_client/models/klass_reference.py +0 -99
  54. dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated/vardef_client/models/rendered_contact.py +0 -92
  55. dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated/vardef_client/models/rendered_variable_definition.py +0 -235
  56. dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated/vardef_client/models/supported_languages.py +0 -33
  57. dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated/vardef_client/models/variable_status.py +0 -33
  58. dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/variable_definition.py +0 -212
  59. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/LICENSE +0 -0
  60. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/src/dapla_metadata/_shared/__init__.py +0 -0
  61. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/src/dapla_metadata/_shared/config.py +0 -0
  62. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/src/dapla_metadata/_shared/enums.py +0 -0
  63. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/src/dapla_metadata/_shared/py.typed +0 -0
  64. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/src/dapla_metadata/datasets/__init__.py +0 -0
  65. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/src/dapla_metadata/datasets/dapla_dataset_path_info.py +0 -0
  66. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/src/dapla_metadata/datasets/external_sources/__init__.py +0 -0
  67. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/src/dapla_metadata/datasets/external_sources/external_sources.py +0 -0
  68. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/src/dapla_metadata/datasets/py.typed +0 -0
  69. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/src/dapla_metadata/datasets/statistic_subject_mapping.py +0 -0
  70. {dapla_toolbelt_metadata-0.4.2 → dapla_toolbelt_metadata-0.5.0}/src/dapla_metadata/datasets/utility/__init__.py +0 -0
  71. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/.openapi-generator-ignore +0 -0
  72. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/README.md +0 -0
  73. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/__init__.py +0 -0
  74. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/api_client.py +0 -0
  75. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/api_response.py +0 -0
  76. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/configuration.py +0 -0
  77. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/docs/CompleteResponse.md +0 -0
  78. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/docs/Contact.md +0 -0
  79. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/docs/DataMigrationApi.md +0 -0
  80. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/docs/Draft.md +0 -0
  81. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/docs/DraftVariableDefinitionsApi.md +0 -0
  82. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/docs/LanguageStringType.md +0 -0
  83. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/docs/Owner.md +0 -0
  84. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/docs/Patch.md +0 -0
  85. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/docs/PatchesApi.md +0 -0
  86. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/docs/PublicApi.md +0 -0
  87. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/docs/SupportedLanguages.md +0 -0
  88. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/docs/UpdateDraft.md +0 -0
  89. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/docs/ValidityPeriod.md +0 -0
  90. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/docs/ValidityPeriodsApi.md +0 -0
  91. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/docs/VariableDefinitionsApi.md +0 -0
  92. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/docs/VariableStatus.md +0 -0
  93. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/exceptions.py +0 -0
  94. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/py.typed +0 -0
  95. {dapla_toolbelt_metadata-0.4.2/src/dapla_metadata/variable_definitions/generated → dapla_toolbelt_metadata-0.5.0/src/dapla_metadata/variable_definitions/_generated}/vardef_client/rest.py +0 -0
@@ -1,16 +1,14 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.3
2
2
  Name: dapla-toolbelt-metadata
3
- Version: 0.4.2
3
+ Version: 0.5.0
4
4
  Summary: Dapla Toolbelt Metadata
5
- Home-page: https://github.com/statisticsnorway/dapla-toolbelt-metadata
6
5
  License: MIT
7
6
  Author: Team Metadata
8
7
  Author-email: metadata@ssb.no
9
- Requires-Python: >=3.10,<4.0
8
+ Requires-Python: >=3.11,<4.0
10
9
  Classifier: Development Status :: 4 - Beta
11
10
  Classifier: License :: OSI Approved :: MIT License
12
11
  Classifier: Programming Language :: Python :: 3
13
- Classifier: Programming Language :: Python :: 3.10
14
12
  Classifier: Programming Language :: Python :: 3.11
15
13
  Classifier: Programming Language :: Python :: 3.12
16
14
  Classifier: Programming Language :: Python :: 3.13
@@ -24,11 +22,13 @@ Requires-Dist: pydantic (>=2.5.2)
24
22
  Requires-Dist: pyjwt (>=2.8.0)
25
23
  Requires-Dist: python-dotenv (>=1.0.1)
26
24
  Requires-Dist: requests (>=2.31.0)
25
+ Requires-Dist: ruamel-yaml (>=0.18.10,<0.19.0)
27
26
  Requires-Dist: ssb-datadoc-model (>=6.0.0,<7.0.0)
28
27
  Requires-Dist: ssb-klass-python (>=0.0.9)
29
28
  Requires-Dist: typing-extensions (>=4.12.2)
30
29
  Project-URL: Changelog, https://github.com/statisticsnorway/dapla-toolbelt-metadata/releases
31
30
  Project-URL: Documentation, https://statisticsnorway.github.io/dapla-toolbelt-metadata
31
+ Project-URL: Homepage, https://github.com/statisticsnorway/dapla-toolbelt-metadata
32
32
  Project-URL: Repository, https://github.com/statisticsnorway/dapla-toolbelt-metadata
33
33
  Description-Content-Type: text/markdown
34
34
 
@@ -45,7 +45,6 @@ Description-Content-Type: text/markdown
45
45
  [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=statisticsnorway_dapla-toolbelt-metadata&metric=alert_status&token=ee0a4d273db2bf811222fca5dffccd4592e3d536)][sonarquality]
46
46
 
47
47
  [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)][pre-commit]
48
- [![Black](https://img.shields.io/badge/code%20style-black-000000.svg)][black]
49
48
  [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
50
49
  [![Poetry](https://img.shields.io/endpoint?url=https://python-poetry.org/badge/v0.json)][poetry]
51
50
 
@@ -56,7 +55,6 @@ Description-Content-Type: text/markdown
56
55
  [sonarcov]: https://sonarcloud.io/summary/overall?id=statisticsnorway_dapla-toolbelt-metadata
57
56
  [sonarquality]: https://sonarcloud.io/summary/overall?id=statisticsnorway_dapla-toolbelt-metadata
58
57
  [pre-commit]: https://github.com/pre-commit/pre-commit
59
- [black]: https://github.com/psf/black
60
58
  [poetry]: https://python-poetry.org/
61
59
 
62
60
  Tools and clients for working with the Dapla Metadata system.
@@ -11,7 +11,6 @@
11
11
  [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=statisticsnorway_dapla-toolbelt-metadata&metric=alert_status&token=ee0a4d273db2bf811222fca5dffccd4592e3d536)][sonarquality]
12
12
 
13
13
  [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)][pre-commit]
14
- [![Black](https://img.shields.io/badge/code%20style-black-000000.svg)][black]
15
14
  [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
16
15
  [![Poetry](https://img.shields.io/endpoint?url=https://python-poetry.org/badge/v0.json)][poetry]
17
16
 
@@ -22,7 +21,6 @@
22
21
  [sonarcov]: https://sonarcloud.io/summary/overall?id=statisticsnorway_dapla-toolbelt-metadata
23
22
  [sonarquality]: https://sonarcloud.io/summary/overall?id=statisticsnorway_dapla-toolbelt-metadata
24
23
  [pre-commit]: https://github.com/pre-commit/pre-commit
25
- [black]: https://github.com/psf/black
26
24
  [poetry]: https://python-poetry.org/
27
25
 
28
26
  Tools and clients for working with the Dapla Metadata system.
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "dapla-toolbelt-metadata"
3
- version = "0.4.2"
3
+ version = "0.5.0"
4
4
  description = "Dapla Toolbelt Metadata"
5
5
  authors = ["Team Metadata <metadata@ssb.no>"]
6
6
  license = "MIT"
@@ -16,7 +16,7 @@ packages = [{ include = "dapla_metadata", from = "src" }]
16
16
  Changelog = "https://github.com/statisticsnorway/dapla-toolbelt-metadata/releases"
17
17
 
18
18
  [tool.poetry.dependencies]
19
- python = ">=3.10,<4.0"
19
+ python = ">=3.11,<4.0"
20
20
  pyarrow = ">=8.0.0"
21
21
  pydantic = ">=2.5.2"
22
22
  pandas = ">=1.4.2"
@@ -30,9 +30,9 @@ pyjwt = ">=2.8.0"
30
30
  ssb-klass-python = ">=0.0.9"
31
31
  ssb-datadoc-model = "^6.0.0"
32
32
  typing-extensions = ">=4.12.2"
33
+ ruamel-yaml = "^0.18.10"
33
34
 
34
35
  [tool.poetry.group.dev.dependencies]
35
- black = ">=24.8.0"
36
36
  pygments = ">=2.18.0"
37
37
  coverage = { extras = ["toml"], version = ">=6.2" }
38
38
  faker = ">=26.1.0"
@@ -49,7 +49,6 @@ xdoctest = { extras = ["colors"], version = ">=0.15.10" }
49
49
  myst-parser = { version = ">=0.16.1" }
50
50
  mypy = ">=0.950"
51
51
  pytest-cov = ">=3.0.0"
52
- nbstripout = "^0.8.1"
53
52
  python-kacl = "*"
54
53
  pytest-mock = ">=3.14.0"
55
54
  deptry = ">=0.12.0"
@@ -78,19 +77,14 @@ source = ["dapla_metadata"]
78
77
  omit = [
79
78
  "tests/*",
80
79
  "__init__.py",
81
- "*/dapla_metadata/variable_definitions/generated/*",
80
+ "*/dapla_metadata/variable_definitions/_generated/*",
82
81
  ]
83
82
  relative_files = true
84
83
 
85
84
  [tool.coverage.report]
86
85
  show_missing = true
87
86
  fail_under = 80
88
- omit = ["*/dapla_metadata/variable_definitions/generated/*"]
89
-
90
- [tool.black]
91
- # We don't want to format generated files because it creates large diffs
92
- # when generated code is updated.
93
- extend-exclude = "/generated/"
87
+ omit = ["*/dapla_metadata/variable_definitions/_generated/*"]
94
88
 
95
89
  [tool.mypy]
96
90
  plugins = ["pydantic.mypy"]
@@ -100,10 +94,10 @@ pretty = true
100
94
  show_column_numbers = true
101
95
  show_error_context = true
102
96
  # Generated code is not high quality, just ignore the problems there
103
- exclude = "generated/vardef_client/.*"
97
+ exclude = "_generated/vardef_client/.*"
104
98
 
105
99
  [[tool.mypy.overrides]]
106
- module = ["dapla_metadata.variable_definitions.generated.vardef_client.*"]
100
+ module = ["dapla_metadata.variable_definitions._generated.vardef_client.*"]
107
101
  warn_unreachable = false
108
102
  ignore_errors = true
109
103
  disable_error_code = ["unreachable"]
@@ -141,7 +135,7 @@ disable_error_code = [
141
135
  force-exclude = true # Apply excludes to pre-commit
142
136
  show-fixes = true
143
137
  src = ["src", "tests"]
144
- target-version = "py310" # Minimum Python version supported
138
+ target-version = "py311" # Minimum Python version supported
145
139
  include = ["*.py", "*.pyi", "**/pyproject.toml", "*.ipynb"]
146
140
  extend-exclude = [
147
141
  "__pycache__",
@@ -149,19 +143,21 @@ extend-exclude = [
149
143
  ".ipynb_checkpoints",
150
144
  "noxfile.py",
151
145
  "docs/conf.py",
146
+ "_generated/",
152
147
  ]
153
148
 
154
149
  # Ruff rules may be customized as desired: https://docs.astral.sh/ruff/rules/
155
150
  [tool.ruff.lint]
156
151
  select = ["ALL"]
157
152
  ignore = [
158
- "ANN101", # Supress missing-type-self.
159
- "ANN102", # Supress missing-type-cls.
160
- "ANN202", # Don't requiere return type annotation for private functions.
161
- "ANN401", # Allow type annotation with type Any.
162
- "D100", # Supress undocumented-public-module. Only doc of public api required.
163
- "E402", # Supress module-import-not-at-top-of-file, needed in jupyter notebooks.
164
- "E501", # Supress line-too-long warnings: trust black's judgement on this one.
153
+ "ANN202", # Don't requiere return type annotation for private functions.
154
+ "ANN401", # Allow type annotation with type Any.
155
+ "D100", # Supress undocumented-public-module. Only doc of public api required.
156
+ "FBT001", # Allow boolean positional arguments in a function.
157
+ "FBT002", # Allow boolean default positional arguments in a function.
158
+ "E402", # Supress module-import-not-at-top-of-file, needed in jupyter notebooks.
159
+ "E501", # Supress line-too-long warnings: trust black's judgement on this one.
160
+ "PLR2004", # Allow to compare with unnamed numerical constants.
165
161
  ]
166
162
 
167
163
  [tool.ruff.lint.isort]
@@ -176,6 +172,9 @@ convention = "google" # You can also use "numpy".
176
172
  [tool.ruff.lint.flake8-pytest-style]
177
173
  fixture-parentheses = false
178
174
 
175
+ [tool.ruff.lint.pylint]
176
+ max-args = 8
177
+
179
178
  [tool.ruff.lint.pep8-naming]
180
179
  classmethod-decorators = [
181
180
  "classmethod",
@@ -0,0 +1,13 @@
1
+ """Tools and clients for working with the Dapla Metadata system."""
2
+
3
+ import warnings
4
+
5
+ warnings.filterwarnings(
6
+ "ignore",
7
+ message="As the c extension couldn't be imported, `google-crc32c` is using a pure python implementation that is significantly slower.",
8
+ )
9
+
10
+ import datadoc_model.model as datadoc_model
11
+
12
+ from . import datasets
13
+ from . import variable_definitions
@@ -0,0 +1 @@
1
+ """Expose information specific to the Dapla platform."""
@@ -14,6 +14,8 @@ logger = logging.getLogger(__name__)
14
14
 
15
15
 
16
16
  PLACEHOLDER_EMAIL_ADDRESS = "default_user@ssb.no"
17
+ PLACEHOLDER_GROUP = "default-team-developers"
18
+ PLACEHOLDER_TEAM = "default-team"
17
19
 
18
20
 
19
21
  class UserInfo(Protocol):
@@ -27,6 +29,16 @@ class UserInfo(Protocol):
27
29
  """Get the short email address."""
28
30
  ...
29
31
 
32
+ @property
33
+ def current_group(self) -> str:
34
+ """Get the group which the user is currently representing."""
35
+ ...
36
+
37
+ @property
38
+ def current_team(self) -> str:
39
+ """Get the team which the user is currently representing."""
40
+ ...
41
+
30
42
 
31
43
  class UnknownUserInfo:
32
44
  """Fallback when no implementation is found."""
@@ -36,6 +48,16 @@ class UnknownUserInfo:
36
48
  """Unknown email address."""
37
49
  return None
38
50
 
51
+ @property
52
+ def current_group(self) -> str:
53
+ """Get the group which the user is currently representing."""
54
+ return ""
55
+
56
+ @property
57
+ def current_team(self) -> str:
58
+ """Get the team which the user is currently representing."""
59
+ return ""
60
+
39
61
 
40
62
  class TestUserInfo:
41
63
  """Information about the current user for local development and testing."""
@@ -45,6 +67,16 @@ class TestUserInfo:
45
67
  """Get the short email address."""
46
68
  return PLACEHOLDER_EMAIL_ADDRESS
47
69
 
70
+ @property
71
+ def current_group(self) -> str | None:
72
+ """Get the group which the user is currently representing."""
73
+ return PLACEHOLDER_GROUP
74
+
75
+ @property
76
+ def current_team(self) -> str | None:
77
+ """Get the team which the user is currently representing."""
78
+ return PLACEHOLDER_TEAM
79
+
48
80
 
49
81
  class DaplaLabUserInfo:
50
82
  """Information about the current user when running on Dapla Lab."""
@@ -65,6 +97,19 @@ class DaplaLabUserInfo:
65
97
  )
66
98
  return None
67
99
 
100
+ @property
101
+ def current_group(self) -> str:
102
+ """Get the group which the user is currently representing."""
103
+ if group := config.get_dapla_group_context():
104
+ return group
105
+ msg = "DAPLA_GROUP_CONTEXT environment variable not found"
106
+ raise OSError(msg)
107
+
108
+ @property
109
+ def current_team(self) -> str:
110
+ """Get the team which the user is currently representing."""
111
+ return parse_team_name(self.current_group)
112
+
68
113
 
69
114
  class JupyterHubUserInfo:
70
115
  """Information about the current user when running on JupyterHub."""
@@ -74,6 +119,16 @@ class JupyterHubUserInfo:
74
119
  """Get the short email address."""
75
120
  return config.get_jupyterhub_user()
76
121
 
122
+ @property
123
+ def current_group(self) -> str:
124
+ """Get the group which the user is currently representing."""
125
+ raise NotImplementedError
126
+
127
+ @property
128
+ def current_team(self) -> str:
129
+ """Get the team which the user is currently representing."""
130
+ raise NotImplementedError
131
+
77
132
 
78
133
  def get_user_info_for_current_platform() -> UserInfo:
79
134
  """Return the correct implementation of UserInfo for the current platform."""
@@ -88,14 +143,6 @@ def get_user_info_for_current_platform() -> UserInfo:
88
143
  return UnknownUserInfo()
89
144
 
90
145
 
91
- def get_owner() -> str:
92
- """Returns the owner read from the GROUP_CONTEXT environment variable."""
93
- if group := config.get_dapla_group_context():
94
- return parse_team_name(group)
95
- msg = "DAPLA_GROUP_CONTEXT environment variable not found"
96
- raise OSError(msg)
97
-
98
-
99
146
  def parse_team_name(group: str) -> str:
100
147
  """Parses the group to get the current team.
101
148
 
@@ -127,7 +127,7 @@ class CodeList(GetExternalSource):
127
127
  .get_codes()
128
128
  .data
129
129
  )
130
- except Exception: # noqa: PERF203
130
+ except Exception:
131
131
  logger.exception(
132
132
  "Exception while getting classifications from Klass",
133
133
  )
@@ -14,7 +14,7 @@ from datadoc_model import model
14
14
  from datadoc_model.model import DataSetStatus
15
15
 
16
16
  from dapla_metadata._shared import config
17
- from dapla_metadata._shared import user_info
17
+ from dapla_metadata.dapla import user_info
18
18
  from dapla_metadata.datasets.dapla_dataset_path_info import DaplaDatasetPathInfo
19
19
  from dapla_metadata.datasets.dataset_parser import DatasetParser
20
20
  from dapla_metadata.datasets.model_backwards_compatibility import (
@@ -5,7 +5,7 @@ Handles reading in the data and transforming data types to generic metadata type
5
5
 
6
6
  from __future__ import annotations
7
7
 
8
- import pathlib # noqa: TCH003 import is needed for docs build
8
+ import pathlib # noqa: TC003 import is needed for docs build
9
9
  import re
10
10
  import typing as t
11
11
  from abc import ABC
@@ -15,8 +15,8 @@ from __future__ import annotations
15
15
 
16
16
  from collections import OrderedDict
17
17
  from dataclasses import dataclass
18
+ from datetime import UTC
18
19
  from datetime import datetime
19
- from datetime import timezone
20
20
  from typing import TYPE_CHECKING
21
21
  from typing import Any
22
22
 
@@ -305,10 +305,10 @@ def handle_version_2_2_0(supplied_metadata: dict[str, Any]) -> dict[str, Any]:
305
305
  )
306
306
  supplied_metadata["datadoc"]["variables"][i]["special_value"] = None
307
307
  supplied_metadata["datadoc"]["variables"][i]["custom_type"] = None
308
- supplied_metadata["datadoc"]["variables"][
309
- i
310
- ] = _find_and_update_language_strings(
311
- supplied_metadata["datadoc"]["variables"][i],
308
+ supplied_metadata["datadoc"]["variables"][i] = (
309
+ _find_and_update_language_strings(
310
+ supplied_metadata["datadoc"]["variables"][i],
311
+ )
312
312
  )
313
313
  supplied_metadata["datadoc"]["dataset"]["custom_type"] = None
314
314
  supplied_metadata["datadoc"]["dataset"] = _find_and_update_language_strings(
@@ -384,7 +384,7 @@ def handle_version_1_0_0(supplied_metadata: dict[str, Any]) -> dict[str, Any]:
384
384
  if supplied_metadata["dataset"][field]:
385
385
  supplied_metadata["dataset"][field] = datetime.isoformat(
386
386
  datetime.fromisoformat(supplied_metadata["dataset"][field]).astimezone(
387
- tz=timezone.utc,
387
+ tz=UTC,
388
388
  ),
389
389
  timespec="seconds",
390
390
  )
@@ -5,11 +5,11 @@ from __future__ import annotations
5
5
  import logging
6
6
  import warnings
7
7
  from typing import TYPE_CHECKING
8
+ from typing import Self
8
9
  from typing import TextIO
9
10
 
10
11
  from datadoc_model import model
11
12
  from pydantic import model_validator
12
- from typing_extensions import Self
13
13
 
14
14
  from dapla_metadata.datasets.utility.constants import DATE_VALIDATION_MESSAGE
15
15
  from dapla_metadata.datasets.utility.constants import NUM_OBLIGATORY_DATASET_FIELDS
@@ -176,7 +176,7 @@ class ObligatoryVariableWarning(UserWarning):
176
176
  """Custom warning for checking obligatory metadata for variables."""
177
177
 
178
178
 
179
- def custom_warning_handler( # noqa: PLR0913 remove fields causes incompatible types
179
+ def custom_warning_handler(
180
180
  message: Warning | str,
181
181
  category: type[Warning],
182
182
  filename: str,
@@ -87,6 +87,7 @@ DATASET_FIELDS_FROM_EXISTING_METADATA = [
87
87
  "use_restriction_date",
88
88
  "custom_type",
89
89
  "owner",
90
+ "version_description",
90
91
  ]
91
92
 
92
93
  METADATA_DOCUMENT_FILE_SUFFIX = "__DOC.json"
@@ -11,6 +11,6 @@ class SupportedLanguages(str, Enum):
11
11
  Reference: https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry
12
12
  """
13
13
 
14
- NORSK_BOKMÅL = "nb"
14
+ NORSK_BOKMÅL = "nb" # noqa: PLC2401 the listed problems do not apply in this case
15
15
  NORSK_NYNORSK = "nn"
16
16
  ENGLISH = "en"
@@ -8,13 +8,13 @@ import uuid
8
8
  from cloudpathlib import CloudPath
9
9
  from cloudpathlib import GSClient
10
10
  from cloudpathlib import GSPath
11
- from dapla import AuthClient
12
11
  from datadoc_model import model
13
12
  from datadoc_model.model import Assessment
14
13
  from datadoc_model.model import DataSetState
15
14
  from datadoc_model.model import VariableRole
16
15
 
17
- from dapla_metadata._shared import user_info
16
+ from dapla import AuthClient
17
+ from dapla_metadata.dapla import user_info
18
18
  from dapla_metadata.datasets.utility.constants import (
19
19
  DATASET_FIELDS_FROM_EXISTING_METADATA,
20
20
  )
@@ -37,7 +37,7 @@ logger = logging.getLogger(__name__)
37
37
 
38
38
  def get_timestamp_now() -> datetime.datetime:
39
39
  """Return a timestamp for the current moment."""
40
- return datetime.datetime.now(tz=datetime.timezone.utc)
40
+ return datetime.datetime.now(tz=datetime.UTC)
41
41
 
42
42
 
43
43
  def normalize_path(path: str) -> pathlib.Path | CloudPath:
@@ -79,7 +79,7 @@ def derive_assessment_from_state(state: DataSetState) -> Assessment:
79
79
  Returns:
80
80
  The derived assessment of the dataset.
81
81
  """
82
- match (state):
82
+ match state:
83
83
  case (
84
84
  DataSetState.INPUT_DATA
85
85
  | DataSetState.PROCESSED_DATA
@@ -147,7 +147,7 @@ def set_dataset_owner(dataset: model.Dataset) -> None:
147
147
  dataset: The dataset object to set default values on.
148
148
  """
149
149
  try:
150
- dataset.owner = user_info.get_owner()
150
+ dataset.owner = user_info.get_user_info_for_current_platform().current_team
151
151
  except OSError:
152
152
  logger.exception("Failed to find environment variable DAPLA_GROUP_CONTEXT")
153
153
 
@@ -245,10 +245,7 @@ def _is_missing_multilanguage_value(
245
245
  len(field_value[0]) > 0
246
246
  and not field_value[0]["languageText"]
247
247
  and (len(field_value) <= 1 or not field_value[1]["languageText"])
248
- and (
249
- len(field_value) <= 2 # noqa: PLR2004 approve magic value
250
- or not field_value[2]["languageText"]
251
- )
248
+ and (len(field_value) <= 2 or not field_value[2]["languageText"])
252
249
  ),
253
250
  )
254
251
 
@@ -277,8 +274,7 @@ def _is_missing_metadata(
277
274
  True if the field doesn't have a value, False otherwise.
278
275
  """
279
276
  return bool(
280
- field_name in obligatory_list
281
- and field_value is None
277
+ (field_name in obligatory_list and field_value is None)
282
278
  or _is_missing_multilanguage_value(
283
279
  field_name,
284
280
  field_value,
@@ -0,0 +1,9 @@
1
+ """Client for working with Variable Definitions at Statistics Norway."""
2
+
3
+ from ._generated.vardef_client import models
4
+ from ._generated.vardef_client.exceptions import * # noqa: F403
5
+ from .exceptions import VardefClientError
6
+ from .exceptions import VardefFileError
7
+ from .exceptions import VariableNotFoundError
8
+ from .vardef import Vardef
9
+ from .variable_definition import VariableDefinition
@@ -2,21 +2,16 @@ vardef_client/api/__init__.py
2
2
  vardef_client/api/data_migration_api.py
3
3
  vardef_client/api/draft_variable_definitions_api.py
4
4
  vardef_client/api/patches_api.py
5
- vardef_client/api/public_api.py
6
5
  vardef_client/api/validity_periods_api.py
7
6
  vardef_client/api/variable_definitions_api.py
8
7
  vardef_client/models/__init__.py
9
8
  vardef_client/models/complete_response.py
10
9
  vardef_client/models/contact.py
11
10
  vardef_client/models/draft.py
12
- vardef_client/models/klass_reference.py
13
11
  vardef_client/models/language_string_type.py
14
12
  vardef_client/models/owner.py
15
13
  vardef_client/models/patch.py
16
14
  vardef_client/models/problem.py
17
- vardef_client/models/rendered_contact.py
18
- vardef_client/models/rendered_variable_definition.py
19
- vardef_client/models/supported_languages.py
20
15
  vardef_client/models/update_draft.py
21
16
  vardef_client/models/validity_period.py
22
17
  vardef_client/models/variable_status.py
@@ -20,7 +20,6 @@ __version__ = "1.0.0"
20
20
  from .api.data_migration_api import DataMigrationApi
21
21
  from .api.draft_variable_definitions_api import DraftVariableDefinitionsApi
22
22
  from .api.patches_api import PatchesApi
23
- from .api.public_api import PublicApi
24
23
  from .api.validity_periods_api import ValidityPeriodsApi
25
24
  from .api.variable_definitions_api import VariableDefinitionsApi
26
25
 
@@ -39,14 +38,10 @@ from .exceptions import ApiException
39
38
  from .models.complete_response import CompleteResponse
40
39
  from .models.contact import Contact
41
40
  from .models.draft import Draft
42
- from .models.klass_reference import KlassReference
43
41
  from .models.language_string_type import LanguageStringType
44
42
  from .models.owner import Owner
45
43
  from .models.patch import Patch
46
44
  from .models.problem import Problem
47
- from .models.rendered_contact import RenderedContact
48
- from .models.rendered_variable_definition import RenderedVariableDefinition
49
- from .models.supported_languages import SupportedLanguages
50
45
  from .models.update_draft import UpdateDraft
51
46
  from .models.validity_period import ValidityPeriod
52
47
  from .models.variable_status import VariableStatus
@@ -4,6 +4,5 @@
4
4
  from ..api.data_migration_api import DataMigrationApi
5
5
  from ..api.draft_variable_definitions_api import DraftVariableDefinitionsApi
6
6
  from ..api.patches_api import PatchesApi
7
- from ..api.public_api import PublicApi
8
7
  from ..api.validity_periods_api import ValidityPeriodsApi
9
8
  from ..api.variable_definitions_api import VariableDefinitionsApi
@@ -1,6 +1,6 @@
1
- """Variable Definitions
1
+ """Internal Variable Definitions Administration API
2
2
 
3
- ## Introduction Variable Definitions are centralized definitions of concrete variables which are typically present in multiple datasets. Variable Definitions support standardization of data and metadata and facilitate sharing and joining of data by clarifying when variables have an identical definition. ## Maintenance of Variable Definitions This API allows for creation, maintenance and access of Variable Definitions. ### Ownership Creation and maintenance of variables may only be performed by Statistics Norway employees representing a specific Dapla team, who are defined as the owners of a given Variable Definition. The team an owner represents must be specified when making a request through the `active_group` query parameter. All maintenance is to be performed by the owners, with no intervention from administrators. ### Status All Variable Definitions have an associated status. The possible values for status are `DRAFT`, `PUBLISHED_INTERNAL` and `PUBLISHED_EXTERNAL`. #### Draft When a Variable Definition is created it is assigned the status `DRAFT`. Under this status the Variable Definition is: - Only visible to Statistics Norway employees. - Mutable (it may be changed directly without need for versioning). - Not suitable to refer to from other systems. This status may be changed to `PUBLISHED_INTERNAL` or `PUBLISHED_EXTERNAL` with a direct update. #### Published Internal Under this status the Variable Definition is: - Only visible to Statistics Norway employees. - Immutable (all changes are versioned). - Suitable to refer to in internal systems for statistics production. - Not suitable to refer to for external use (for example in Statistikkbanken). This status may be changed to `PUBLISHED_EXTERNAL` by creating a Patch version. #### Published External Under this status the Variable Definition is: - Visible to the general public. - Immutable (all changes are versioned). - Suitable to refer to from any system. This status may not be changed as it would break immutability. If a Variable Definition is no longer relevant then its period of validity should be ended by specifying a `valid_until` date in a Patch version. ### Immutability Variable Definitions are immutable. This means that any changes must be performed in a strict versioning system. Consumers can avoid being exposed to breaking changes by specifying a `date_of_validity` when they request a Variable Definition. #### Patches Patches are for changes which do not affect the fundamental meaning of the Variable Definition. #### Validity Periods Validity Periods are versions with a period defined by a `valid_from` date and optionally a `valid_until` date. If the fundamental meaning of a Variable Definition is to be changed, it should be done by creating a new Validity Period.
3
+ ## Introduction Variable Definitions are centralized definitions of concrete variables which are typically present in multiple datasets. Variable Definitions support standardization of data and metadata and facilitate sharing and joining of data by clarifying when variables have an identical definition. ## Maintenance of Variable Definitions This API allows for creation, maintenance and access of Variable Definitions. ### Ownership Creation and maintenance of variables may only be performed by Statistics Norway employees representing a specific Dapla team, who are defined as the owners of a given Variable Definition. The team an owner represents must be specified when making a request through the `active_group` query parameter. All maintenance is to be performed by the owners, with no intervention from administrators. ### Status All Variable Definitions have an associated status. The possible values for status are `DRAFT`, `PUBLISHED_INTERNAL` and `PUBLISHED_EXTERNAL`. #### Draft When a Variable Definition is created it is assigned the status `DRAFT`. Under this status the Variable Definition is: - Only visible to Statistics Norway employees. - Mutable (it may be changed directly without need for versioning). - Not suitable to refer to from other systems. This status may be changed to `PUBLISHED_INTERNAL` or `PUBLISHED_EXTERNAL` with a direct update. #### Published Internal Under this status the Variable Definition is: - Only visible to Statistics Norway employees. - Immutable (all changes are versioned). - Suitable to refer to in internal systems for statistics production. - Not suitable to refer to for external use (for example in Statistikkbanken). This status may be changed to `PUBLISHED_EXTERNAL` by creating a Patch version. #### Published External Under this status the Variable Definition is: - Visible to the general public. - Immutable (all changes are versioned). - Suitable to refer to from any system. This status may not be changed as it would break immutability. If a Variable Definition is no longer relevant then its period of validity should be ended by specifying a `valid_until` date in a Patch version. ### Immutability Variable Definitions are immutable. This means that any changes must be performed in a strict versioning system. Consumers can avoid being exposed to breaking changes by specifying a `date_of_validity` when they request a Variable Definition. #### Patches Patches are for changes which do not affect the fundamental meaning of the Variable Definition. #### Validity Periods Validity Periods are versions with a period defined by a `valid_from` date and optionally a `valid_until` date. If the fundamental meaning of a Variable Definition is to be changed, it should be done by creating a new Validity Period.
4
4
 
5
5
  The version of the OpenAPI document: 0.1
6
6
  Contact: metadata@ssb.no