dapla-toolbelt-metadata 0.9.7__tar.gz → 0.9.9__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 (241) hide show
  1. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/PKG-INFO +1 -1
  2. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/noxfile.py +2 -0
  3. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/pyproject.toml +1 -1
  4. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/_shared/config.py +7 -4
  5. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/datasets/_merge.py +1 -1
  6. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/datasets/core.py +1 -2
  7. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/datasets/utility/constants.py +0 -4
  8. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/datasets/utility/urn.py +81 -8
  9. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/vardok_id.py +5 -1
  10. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/vardok_vardef_id_pair.py +5 -1
  11. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/variable_definition.py +5 -1
  12. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/test_dataset_consistency.py +61 -0
  13. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/test_urn.py +127 -4
  14. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/variable_definitions/test_variable_definition.py +24 -0
  15. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/uv.lock +347 -273
  16. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/vardef-maintenance/vardef-maintenance.toml +1 -1
  17. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/.cookiecutter.json +0 -0
  18. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/.cruft.json +0 -0
  19. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/.editorconfig +0 -0
  20. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/.gitattributes +0 -0
  21. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  22. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  23. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/.github/dependabot.yml +0 -0
  24. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/.github/labels.yml +0 -0
  25. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/.github/release-drafter.yml +0 -0
  26. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/.github/workflows/constraints.txt +0 -0
  27. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/.github/workflows/docs.yml +0 -0
  28. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/.github/workflows/labeler.yml +0 -0
  29. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/.github/workflows/release.yml +0 -0
  30. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/.github/workflows/tests.yml +0 -0
  31. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/.gitignore +0 -0
  32. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/.pre-commit-config.yaml +0 -0
  33. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/.vscode/settings.json +0 -0
  34. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/CODEOWNERS +0 -0
  35. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/CODE_OF_CONDUCT.md +0 -0
  36. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/CONTRIBUTING.md +0 -0
  37. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/LICENSE +0 -0
  38. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/Makefile +0 -0
  39. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/README.md +0 -0
  40. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/SECURITY.md +0 -0
  41. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/backstage.yaml +0 -0
  42. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/bin/__init__.py +0 -0
  43. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/bin/openapi_generate_post_process.sh +0 -0
  44. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/bin/upgrade_metadata_file.py +0 -0
  45. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/demo/datasets/create_metadata_for_new_dataset.ipynb +0 -0
  46. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/demo/datasets/create_metadata_for_new_period.ipynb +0 -0
  47. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/demo/datasets/resources/sykefratot/klargjorte_data/person_testdata_p2021_v1__DOC.json +0 -0
  48. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/demo/standards/navnestandard.ipynb +0 -0
  49. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/demo/variable_definitions/les_variabeldefinisjon.ipynb +0 -0
  50. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/demo/variable_definitions/les_variabeldefinisjoner.ipynb +0 -0
  51. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/demo/variable_definitions/migrer_variabeldefinisjoner.ipynb +0 -0
  52. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/demo/variable_definitions/ny_gyldighetsperiode_variabeldefinisjon.ipynb +0 -0
  53. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/demo/variable_definitions/ny_variabeldefinisjon.ipynb +0 -0
  54. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/demo/variable_definitions/publiser_variabeldefinisjon_eksternt.ipynb +0 -0
  55. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/demo/variable_definitions/publiser_variabeldefinisjon_internt.ipynb +0 -0
  56. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/demo/variable_definitions/rediger_publisert_variabeldefinisjon.ipynb +0 -0
  57. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/demo/variable_definitions/rediger_utkast_variabeldefinisjon.ipynb +0 -0
  58. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/demo/variable_definitions/reserver_kortnavn.ipynb +0 -0
  59. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/demo/variable_definitions/sjekk_kortnavn_variabeldefinisjon.ipynb +0 -0
  60. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/demo/variable_definitions/sjekk_migrerte_variabeldefinisjoner.ipynb +0 -0
  61. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/demo/variable_definitions/slett_utkast_variabeldefinisjon.ipynb +0 -0
  62. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/docs/Makefile +0 -0
  63. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/docs/codeofconduct.md +0 -0
  64. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/docs/conf.py +0 -0
  65. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/docs/contributing.md +0 -0
  66. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/docs/index.md +0 -0
  67. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/docs/license.md +0 -0
  68. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/docs/make.bat +0 -0
  69. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/docs/reference.md +0 -0
  70. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/docs/templates/package.rst_t +0 -0
  71. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/docs/vardef_client.md +0 -0
  72. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/schemas/jsonschema/complete-response-schema.json +0 -0
  73. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/sonar-project.properties +0 -0
  74. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/__init__.py +0 -0
  75. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/_shared/__init__.py +0 -0
  76. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/_shared/enums.py +0 -0
  77. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/_shared/py.typed +0 -0
  78. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/dapla/__init__.py +0 -0
  79. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/dapla/user_info.py +0 -0
  80. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/datasets/__init__.py +0 -0
  81. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/datasets/code_list.py +0 -0
  82. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/datasets/compatibility/__init__.py +0 -0
  83. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/datasets/compatibility/_handlers.py +0 -0
  84. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/datasets/compatibility/_utils.py +0 -0
  85. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/datasets/compatibility/model_backwards_compatibility.py +0 -0
  86. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/datasets/dapla_dataset_path_info.py +0 -0
  87. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/datasets/dataset_parser.py +0 -0
  88. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/datasets/external_sources/__init__.py +0 -0
  89. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/datasets/external_sources/external_sources.py +0 -0
  90. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/datasets/model_validation.py +0 -0
  91. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/datasets/py.typed +0 -0
  92. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/datasets/statistic_subject_mapping.py +0 -0
  93. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/datasets/utility/__init__.py +0 -0
  94. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/datasets/utility/enums.py +0 -0
  95. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/datasets/utility/utils.py +0 -0
  96. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/standards/__init__.py +0 -0
  97. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/standards/name_validator.py +0 -0
  98. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/standards/standard_validators.py +0 -0
  99. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/standards/utils/__init__.py +0 -0
  100. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/standards/utils/constants.py +0 -0
  101. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/__init__.py +0 -0
  102. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/.openapi-generator/FILES +0 -0
  103. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/.openapi-generator/VERSION +0 -0
  104. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/.openapi-generator-ignore +0 -0
  105. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/README.md +0 -0
  106. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/__init__.py +0 -0
  107. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/__init__.py +0 -0
  108. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/api/__init__.py +0 -0
  109. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/api/data_migration_api.py +0 -0
  110. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/api/draft_variable_definitions_api.py +0 -0
  111. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/api/patches_api.py +0 -0
  112. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/api/validity_periods_api.py +0 -0
  113. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/api/variable_definitions_api.py +0 -0
  114. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/api_client.py +0 -0
  115. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/api_response.py +0 -0
  116. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/configuration.py +0 -0
  117. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/CompleteResponse.md +0 -0
  118. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/Contact.md +0 -0
  119. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/DataMigrationApi.md +0 -0
  120. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/Draft.md +0 -0
  121. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/DraftVariableDefinitionsApi.md +0 -0
  122. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/LanguageStringType.md +0 -0
  123. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/Owner.md +0 -0
  124. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/Patch.md +0 -0
  125. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/PatchesApi.md +0 -0
  126. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/PublicApi.md +0 -0
  127. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/SupportedLanguages.md +0 -0
  128. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/UpdateDraft.md +0 -0
  129. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/ValidityPeriod.md +0 -0
  130. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/ValidityPeriodsApi.md +0 -0
  131. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/VariableDefinitionsApi.md +0 -0
  132. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/VariableStatus.md +0 -0
  133. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/exceptions.py +0 -0
  134. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/__init__.py +0 -0
  135. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/complete_response.py +0 -0
  136. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/contact.py +0 -0
  137. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/draft.py +0 -0
  138. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/get_vardok_vardef_mapping_by_id200_response.py +0 -0
  139. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/language_string_type.py +0 -0
  140. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/owner.py +0 -0
  141. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/patch.py +0 -0
  142. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/problem.py +0 -0
  143. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/update_draft.py +0 -0
  144. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/validity_period.py +0 -0
  145. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/vardok_id_response.py +0 -0
  146. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/vardok_vardef_id_pair_response.py +0 -0
  147. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/variable_status.py +0 -0
  148. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/py.typed +0 -0
  149. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_generated/vardef_client/rest.py +0 -0
  150. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_utils/__init__.py +0 -0
  151. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_utils/_client.py +0 -0
  152. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_utils/config.py +0 -0
  153. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_utils/constants.py +0 -0
  154. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_utils/files.py +0 -0
  155. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_utils/template_files.py +0 -0
  156. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/_utils/variable_definition_files.py +0 -0
  157. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/exceptions.py +0 -0
  158. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/src/dapla_metadata/variable_definitions/vardef.py +0 -0
  159. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/__init__.py +0 -0
  160. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/conftest.py +0 -0
  161. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/dapla/__init__.py +0 -0
  162. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/dapla/test_user_info.py +0 -0
  163. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/__init__.py +0 -0
  164. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/conftest.py +0 -0
  165. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/constants.py +0 -0
  166. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/code_list/code_list.csv +0 -0
  167. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/code_list/code_list_en.csv +0 -0
  168. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/code_list/code_list_nb.csv +0 -0
  169. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/code_list/code_list_nn.csv +0 -0
  170. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/code_list/empty.csv +0 -0
  171. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/code_list/no_code.csv +0 -0
  172. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/datasets/fewer_variables_p2021-12-31_p2021-12-31_v1.parquet +0 -0
  173. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/datasets/ifpn/klargjorte_data/person_testdata_p2021-12-31_p2021-12-31_v1.parquet +0 -0
  174. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/datasets/person_data.csv +0 -0
  175. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/datasets/person_data_v1.parquet +0 -0
  176. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/datasets/person_data_v1.parquet.gzip +0 -0
  177. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/datasets/person_testdata_p2021-12-31_p2021-12-31_v1.parquet +0 -0
  178. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/datasets/sasdata.sas7bdat +0 -0
  179. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/compatibility/README.md +0 -0
  180. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/compatibility/v0_1_1/person_data_v1__DOC.json +0 -0
  181. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/compatibility/v1_0_0/person_data_v1__DOC.json +0 -0
  182. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/compatibility/v2_1_0/person_data_v1__DOC.json +0 -0
  183. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/compatibility/v2_2_0/person_data_v1__DOC.json +0 -0
  184. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/compatibility/v3_1_0/person_data_v1__DOC.json +0 -0
  185. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/compatibility/v3_2_0/person_data_v1__DOC.json +0 -0
  186. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/compatibility/v3_3_0/person_data_v1__DOC.json +0 -0
  187. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/compatibility/v4_0_0/person_data_v1__DOC.json +0 -0
  188. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/compatibility/v5_0_1/person_data_v1__DOC.json +0 -0
  189. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/compatibility/v6_0_0/person_data_v1__DOC.json +0 -0
  190. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/fewer_variables_p2020-12-31_p2020-12-31_v1__DOC.json +0 -0
  191. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/invalid_id_field/person_data_v1__DOC.json +0 -0
  192. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/person_data_v1__DOC.json +0 -0
  193. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/person_testdata_p2020-12-31_p2020-12-31_v1__DOC.json +0 -0
  194. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/pseudo/dataset_and_pseudo/no_pseudo_v4_0_0_person_data_v1__DOC.json +0 -0
  195. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/pseudo/dataset_and_pseudo/person_data_v1__DOC.json +0 -0
  196. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/pseudo/dataset_and_pseudo/v4_0_0_person_data_v1__DOC.json +0 -0
  197. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/pseudo/pseudo/person_data_v1__DOC.json +0 -0
  198. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/pseudo/pseudo_missing_variables/person_data_v1__DOC.json +0 -0
  199. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/valid_id_field/person_data_v1__DOC.json +0 -0
  200. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/existing_metadata_file/valid_variable_id_field/person_data_v1__DOC.json +0 -0
  201. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/klargjorte_data/person_testdata_p2021-12-31_p2021-12-31_v1.parquet +0 -0
  202. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/klargjorte_data/person_testdata_p2021-12-31_p2021-12-31_v1__DOC.json +0 -0
  203. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/statistical_subject_structure/empty.xml +0 -0
  204. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/statistical_subject_structure/extract_secondary_subject.xml +0 -0
  205. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/statistical_subject_structure/missing_language.xml +0 -0
  206. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/resources/statistical_subject_structure/simple.xml +0 -0
  207. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/test_code_list.py +0 -0
  208. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/test_dapla_dataset_path_info.py +0 -0
  209. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/test_datadoc_metadata.py +0 -0
  210. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/test_dataset_parser.py +0 -0
  211. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/test_model_backwards_compatibility.py +0 -0
  212. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/test_pseudonymization.py +0 -0
  213. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/test_statistic_subject_mapping.py +0 -0
  214. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/test_utils.py +0 -0
  215. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/datasets/test_validators.py +0 -0
  216. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/standards/__init__.py +0 -0
  217. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/standards/conftest.py +0 -0
  218. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/standards/test_check_naming_standard.py +0 -0
  219. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/utils/__init__.py +0 -0
  220. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/utils/constants.py +0 -0
  221. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/utils/microcks_testcontainer.py +0 -0
  222. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/variable_definitions/__init__.py +0 -0
  223. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/variable_definitions/conftest.py +0 -0
  224. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/variable_definitions/constants.py +0 -0
  225. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/variable_definitions/resources/openapi/variable-definitions-internal.yml +0 -0
  226. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/variable_definitions/resources/variable_definition_editing_files/classification_reference.yaml +0 -0
  227. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/variable_definitions/resources/variable_definition_editing_files/date_and_definition.yaml +0 -0
  228. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/variable_definitions/resources/variable_definition_editing_files/variable_definition_landbak_wypvb3wd_2025-05-02T10-06-20.yaml +0 -0
  229. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/variable_definitions/resources/variable_definition_editing_files/variable_definition_var_test_wypvb3wd_2025-09-18T14-19-28.yaml +0 -0
  230. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/variable_definitions/test_config.py +0 -0
  231. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/variable_definitions/test_template_files.py +0 -0
  232. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/variable_definitions/test_vardef.py +0 -0
  233. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/variable_definitions/test_variable_definition_files.py +0 -0
  234. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/variable_definitions/vardef_client/__init__.py +0 -0
  235. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/variable_definitions/vardef_client/api/__init__.py +0 -0
  236. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/variable_definitions/vardef_client/api/test_happy_path.py +0 -0
  237. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/variable_definitions/vardef_client/models/__init__.py +0 -0
  238. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/variable_definitions/vardef_client/models/test_models_instantiation.py +0 -0
  239. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/tests/variable_definitions/vardef_client/test_exceptions.py +0 -0
  240. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/vardef-maintenance/README.md +0 -0
  241. {dapla_toolbelt_metadata-0.9.7 → dapla_toolbelt_metadata-0.9.9}/vardef-maintenance/vardef_client_init.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dapla-toolbelt-metadata
3
- Version: 0.9.7
3
+ Version: 0.9.9
4
4
  Summary: Dapla Toolbelt Metadata
5
5
  Project-URL: homepage, https://github.com/statisticsnorway/dapla-toolbelt-metadata
6
6
  Project-URL: repository, https://github.com/statisticsnorway/dapla-toolbelt-metadata
@@ -31,6 +31,7 @@ TESTS_SESSIONS_DEPENDENCIES = {
31
31
  "requests-mock",
32
32
  "faker",
33
33
  "testcontainers[generic]",
34
+ "typeguard"
34
35
  }
35
36
 
36
37
 
@@ -152,6 +153,7 @@ def mypy(session: nox.Session) -> None:
152
153
  "types-beautifulsoup4",
153
154
  "types-docker",
154
155
  "faker",
156
+ "typeguard"
155
157
  )
156
158
  session.run("mypy", *args)
157
159
  if not session.posargs:
@@ -2,7 +2,7 @@
2
2
  name = "dapla-toolbelt-metadata"
3
3
  description = "Dapla Toolbelt Metadata"
4
4
  license = "MIT"
5
- version = "0.9.7"
5
+ version = "0.9.9"
6
6
  classifiers = ["Development Status :: 4 - Beta"]
7
7
  readme = "README.md"
8
8
  authors = [{ name = "Statistics Norway", email = "metadata@ssb.no" }]
@@ -13,9 +13,6 @@ from dotenv import load_dotenv
13
13
  from dapla_metadata._shared.enums import DaplaEnvironment
14
14
  from dapla_metadata._shared.enums import DaplaRegion
15
15
  from dapla_metadata._shared.enums import DaplaService
16
- from dapla_metadata.datasets.utility.constants import (
17
- DATADOC_STATISTICAL_SUBJECT_SOURCE_URL,
18
- )
19
16
 
20
17
  logger = logging.getLogger(__name__)
21
18
 
@@ -28,6 +25,12 @@ DAPLA_SERVICE = "DAPLA_SERVICE"
28
25
  DAPLA_GROUP_CONTEXT = "DAPLA_GROUP_CONTEXT"
29
26
  OIDC_TOKEN = "OIDC_TOKEN" # noqa: S105
30
27
 
28
+
29
+ DATADOC_STATISTICAL_SUBJECT_SOURCE_URL_DEFAULT = (
30
+ "https://www.ssb.no/xp/_/service/mimir/subjectStructurStatistics"
31
+ )
32
+
33
+
31
34
  env_loaded = False
32
35
 
33
36
 
@@ -73,7 +76,7 @@ def get_statistical_subject_source_url() -> str | None:
73
76
  """Get the URL to the statistical subject source."""
74
77
  return (
75
78
  get_config_item("DATADOC_STATISTICAL_SUBJECT_SOURCE_URL")
76
- or DATADOC_STATISTICAL_SUBJECT_SOURCE_URL
79
+ or DATADOC_STATISTICAL_SUBJECT_SOURCE_URL_DEFAULT
77
80
  )
78
81
 
79
82
 
@@ -78,7 +78,7 @@ class DatasetConsistencyStatus:
78
78
 
79
79
  def check_dataset_consistency(
80
80
  new_dataset_path: Path | CloudPath,
81
- existing_dataset_path: Path,
81
+ existing_dataset_path: Path | CloudPath,
82
82
  ) -> list[DatasetConsistencyStatus]:
83
83
  """Run consistency tests.
84
84
 
@@ -6,7 +6,6 @@ import copy
6
6
  import json
7
7
  import logging
8
8
  from concurrent.futures import ThreadPoolExecutor
9
- from pathlib import Path
10
9
  from typing import TYPE_CHECKING
11
10
  from typing import cast
12
11
 
@@ -175,7 +174,7 @@ class Datadoc:
175
174
  ):
176
175
  self.dataset_consistency_status = check_dataset_consistency(
177
176
  self.dataset_path,
178
- Path(self.metadata_document),
177
+ self.metadata_document,
179
178
  )
180
179
  self.dataset_consistency_status.extend(
181
180
  check_variables_consistency(
@@ -94,10 +94,6 @@ DATASET_FIELDS_FROM_EXISTING_METADATA = [
94
94
 
95
95
  METADATA_DOCUMENT_FILE_SUFFIX = "__DOC.json"
96
96
 
97
- DATADOC_STATISTICAL_SUBJECT_SOURCE_URL = (
98
- "https://www.ssb.no/xp/_/service/mimir/subjectStructurStatistics"
99
- )
100
-
101
97
  PAPIS_STABLE_IDENTIFIER_TYPE = "FREG_SNR"
102
98
  PAPIS_ENCRYPTION_KEY_REFERENCE = "papis-common-key-1"
103
99
  DAEAD_ENCRYPTION_KEY_REFERENCE = "ssb-common-key-1"
@@ -6,9 +6,12 @@ from collections.abc import Iterable
6
6
  from dataclasses import dataclass
7
7
  from enum import Enum
8
8
  from enum import auto
9
+ from typing import Literal
9
10
 
10
11
  from pydantic import AnyUrl
11
12
 
13
+ from dapla_metadata._shared.config import get_dapla_environment
14
+ from dapla_metadata._shared.enums import DaplaEnvironment
12
15
  from dapla_metadata.datasets.utility.utils import VariableListType
13
16
 
14
17
  logger = logging.getLogger(__name__)
@@ -44,6 +47,9 @@ class ReferenceUrlTypes(Enum):
44
47
  FRONTEND = auto()
45
48
 
46
49
 
50
+ UrlVisibility = Literal["public", "internal"]
51
+
52
+
47
53
  @dataclass
48
54
  class UrnConverter:
49
55
  """Converts URLs to URNs and vice versa.
@@ -70,11 +76,81 @@ class UrnConverter:
70
76
  def _build_pattern(self, url_base: str) -> re.Pattern[str]:
71
77
  return re.compile(f"^{url_base}/{self.id_pattern}")
72
78
 
73
- def build_urn(self, identifier: str) -> str:
79
+ def get_urn(self, identifier: str) -> str:
74
80
  """Build a URN for the given identifier."""
75
81
  return f"{self.urn_base}:{identifier}"
76
82
 
77
- def convert_to_urn(self, url: str | AnyUrl) -> AnyUrl | None:
83
+ def get_url(
84
+ self,
85
+ identifier: str,
86
+ url_type: ReferenceUrlTypes,
87
+ visibility: Literal["public", "internal"] = "public",
88
+ ) -> str | None:
89
+ """Build concrete URL to reference a resource.
90
+
91
+ There are typically multiple URLs used to refer to one resource, this method attempts to support known variations.
92
+
93
+ Args:
94
+ identifier (str): The identifier of the resource the URL refers to.
95
+ url_type (ReferenceUrlTypes): The representation type of the URL
96
+ visibility (UrlVisibility, optional): Whether the URL should be that which is publicly available or not. Defaults to "public".
97
+
98
+ Returns:
99
+ str | None: The concrete URL. None if we cannot satisfy the supplied requirements.
100
+ """
101
+ candidates = [base[-1] for base in self.url_bases if base[0] == url_type]
102
+
103
+ def matches_visibility(url: str, visibility: UrlVisibility):
104
+ return (".intern." in url) is (visibility == "internal")
105
+
106
+ def matches_environment(url: str):
107
+ current_environment = get_dapla_environment()
108
+ if current_environment == DaplaEnvironment.TEST:
109
+ return ".test." in url
110
+ return ".test." not in url
111
+
112
+ if url := next(
113
+ (
114
+ url
115
+ for url in candidates
116
+ if matches_visibility(url, visibility) and matches_environment(url)
117
+ ),
118
+ None,
119
+ ):
120
+ return url + "/" + identifier
121
+ return None
122
+
123
+ def get_id(self, urn_or_url: str | AnyUrl) -> str | None:
124
+ """Get an identifier from a URN or URL.
125
+
126
+ Args:
127
+ urn_or_url (str | AnyUrl): The URN or URL refering to a particular resource
128
+
129
+ Returns:
130
+ str | None: The identifier for the resource, or None if it cannot be extracted.
131
+ """
132
+ if str(urn_or_url).startswith(self.urn_base):
133
+ return str(urn_or_url).removeprefix(self.urn_base + ":")
134
+ return self._extract_id_from_url(urn_or_url)
135
+
136
+ def is_id(self, value: str) -> bool:
137
+ """Check if the value is an identifier for this URN type.
138
+
139
+ Args:
140
+ value (str): The value to check.
141
+ """
142
+ if not isinstance(value, str):
143
+ # Mypy thinks it's impossible to reach this branch, but there are no guarantees in Python.
144
+ return False # type: ignore [unreachable]
145
+ pattern = re.compile(f"^{self.id_pattern}$")
146
+ return bool(pattern.match(value))
147
+
148
+ def _extract_id_from_url(self, url: str | AnyUrl) -> str | None:
149
+ patterns = (self._build_pattern(url[-1]) for url in self.url_bases)
150
+ matches = (self._extract_id(str(url), p) for p in patterns)
151
+ return next((m for m in matches if m), None)
152
+
153
+ def convert_url_to_urn(self, url: str | AnyUrl) -> AnyUrl | None:
78
154
  """Convert a URL to a generalized URN for that same resource.
79
155
 
80
156
  Args:
@@ -86,11 +162,8 @@ class UrnConverter:
86
162
  if str(url).startswith(self.urn_base):
87
163
  # In this case the value is already in the expected format and nothing needs to be done.
88
164
  return AnyUrl(url)
89
- patterns = (self._build_pattern(url[-1]) for url in self.url_bases)
90
- matches = (self._extract_id(str(url), p) for p in patterns)
91
- identifier = next((m for m in matches if m), None)
92
- if identifier:
93
- return AnyUrl(self.build_urn(identifier))
165
+ if identifier := self._extract_id_from_url(url):
166
+ return AnyUrl(self.get_urn(identifier))
94
167
 
95
168
  return None
96
169
 
@@ -149,7 +222,7 @@ def convert_uris_to_urns(
149
222
  for v in variables:
150
223
  field = getattr(v, field_name, None)
151
224
  if field:
152
- if urn := next((c.convert_to_urn(field) for c in converters), None):
225
+ if urn := next((c.convert_url_to_urn(field) for c in converters), None):
153
226
  setattr(v, field_name, urn)
154
227
  else:
155
228
  logger.error(
@@ -33,7 +33,11 @@ class VardokId(VardokIdResponse):
33
33
  model: VardokIdResponse,
34
34
  ) -> "VardokId":
35
35
  """Create a VariableDefinition instance from a CompleteResponse."""
36
- return VardokId.model_construct(**model.model_dump())
36
+ self = VardokId.from_dict(model.model_dump())
37
+ if not self:
38
+ msg = f"Could not construct a VardokId instance from {model}"
39
+ raise ValueError(msg)
40
+ return self
37
41
 
38
42
  def __str__(self) -> str:
39
43
  """Format as indented YAML."""
@@ -32,7 +32,11 @@ class VardokVardefIdPair(VardokVardefIdPairResponse):
32
32
  model: VardokVardefIdPairResponse,
33
33
  ) -> "VardokVardefIdPair":
34
34
  """Create a VardokVardefIdPair instance from a VardokVardefIdPairResponse."""
35
- return VardokVardefIdPair.model_construct(**model.model_dump())
35
+ self = VardokVardefIdPair.from_dict(model.model_dump())
36
+ if not self:
37
+ msg = f"Could not construct a VardokVardefIdPair instance from {model}"
38
+ raise ValueError(msg)
39
+ return self
36
40
 
37
41
  def __str__(self) -> str:
38
42
  """Format as indented YAML."""
@@ -82,7 +82,11 @@ class VariableDefinition(CompleteResponse):
82
82
  model: CompleteResponse,
83
83
  ) -> "VariableDefinition":
84
84
  """Create a VariableDefinition instance from a CompleteResponse."""
85
- return VariableDefinition.model_construct(**model.model_dump())
85
+ self = VariableDefinition.from_dict(model.model_dump())
86
+ if not self:
87
+ msg = f"Could not construct a VariableDefinition instance from {model}"
88
+ raise ValueError(msg)
89
+ return self
86
90
 
87
91
  @vardef_exception_handler
88
92
  def list_validity_periods(self) -> list["VariableDefinition"]:
@@ -2,6 +2,8 @@ import contextlib
2
2
  from pathlib import Path
3
3
 
4
4
  import pytest
5
+ from cloudpathlib.local import LocalGSClient
6
+ from cloudpathlib.local import LocalGSPath
5
7
  from datadoc_model.all_optional.model import DatadocMetadata
6
8
  from datadoc_model.all_optional.model import DataType
7
9
  from datadoc_model.all_optional.model import Variable
@@ -21,6 +23,7 @@ from dapla_metadata.datasets._merge import InconsistentDatasetsWarning
21
23
  from dapla_metadata.datasets._merge import check_dataset_consistency
22
24
  from dapla_metadata.datasets._merge import check_ready_to_merge
23
25
  from dapla_metadata.datasets._merge import check_variables_consistency
26
+ from dapla_metadata.datasets.core import Datadoc
24
27
  from tests.datasets.constants import TEST_BUCKET_NAMING_STANDARD_COMPATIBLE_PATH
25
28
  from tests.datasets.constants import VARIABLE_DATA_TYPES
26
29
  from tests.datasets.constants import VARIABLE_SHORT_NAMES
@@ -227,3 +230,61 @@ def test_check_variables_consistency(
227
230
  assert r.success, f"'{r.message}' failed but should have passed"
228
231
  else:
229
232
  assert all(r.success for r in results)
233
+
234
+
235
+ def test_bucket_check_ok_when_both_params_are_gs_paths(mocker):
236
+ """Test the functionality of `check_dataset_consistency`.
237
+
238
+ Verify the desired behavior when BOTH parameters are gs-paths (no Path() conversion occurs). In
239
+ this case no `Bucket name` warning should be issued.
240
+ """
241
+ _patch_gs_utils(mocker)
242
+ resource_json = (
243
+ Path(__file__).parent
244
+ / "resources"
245
+ / "existing_metadata_file"
246
+ / "person_testdata_p2020-12-31_p2020-12-31_v1__DOC.json"
247
+ )
248
+ resource_parquet = (
249
+ Path(__file__).parent
250
+ / "resources"
251
+ / "datasets"
252
+ / "person_testdata_p2021-12-31_p2021-12-31_v1.parquet"
253
+ )
254
+ assert resource_parquet.exists(), f"Parquet resource missing: {resource_parquet}"
255
+ assert resource_json.exists(), f"JSON resource missing: {resource_json}"
256
+ directory = "ssb-dapla-felles-data-produkt-test/datadoc/brukertest/10/sykefratot/klargjorte_data/"
257
+ dataset_gs = LocalGSPath(
258
+ f"gs://{directory}person_testdata_p2021-12-31_p2021-12-31_v1.parquet"
259
+ )
260
+ metadata_doc_gs = LocalGSPath(
261
+ f"gs://{directory}person_testdata_p2021-12-31_p2021-12-31_v1__DOC.json"
262
+ )
263
+ metadata_doc_gs.parent.mkdir(parents=True, exist_ok=True)
264
+ metadata_doc_gs.write_text(resource_json.read_text(), encoding="utf-8")
265
+ assert metadata_doc_gs.exists(), "Metadata document was not written to LocalGS"
266
+ dataset_gs.parent.mkdir(parents=True, exist_ok=True)
267
+ dataset_gs.write_bytes(resource_parquet.read_bytes())
268
+ assert dataset_gs.exists(), "Parquet file was not written to LocalGS"
269
+ dd = Datadoc(
270
+ dataset_path=str(dataset_gs),
271
+ metadata_document_path=str(metadata_doc_gs),
272
+ errors_as_warnings=True,
273
+ )
274
+ _assert_bucket_ok(dd.dataset_consistency_status, BUCKET_NAME_MESSAGE)
275
+
276
+
277
+ def _assert_bucket_ok(results: list, expected_msg: str):
278
+ bucket_checks = [r for r in results if expected_msg in r.message]
279
+ assert bucket_checks, f"Expected at least one check for {expected_msg}."
280
+ assert all(r.success for r in bucket_checks), (
281
+ f"Expected {expected_msg} to have success == True when both are gs-paths."
282
+ )
283
+
284
+
285
+ def _patch_gs_utils(mocker):
286
+ mocker.patch(
287
+ "dapla_metadata.datasets.utility.utils.google.auth.default", autospec=True
288
+ )
289
+ mocker.patch("dapla_metadata.datasets.utility.utils.GSClient", LocalGSClient)
290
+ mocker.patch("dapla_metadata.datasets.utility.utils.GSPath", LocalGSPath)
@@ -3,17 +3,20 @@ import logging
3
3
  import datadoc_model.all_optional.model as all_optional_model
4
4
  import pytest
5
5
  from pydantic import AnyUrl
6
+ from typeguard import suppress_type_checks
6
7
 
7
8
  from dapla_metadata.datasets.core import Datadoc
8
9
  from dapla_metadata.datasets.utility.urn import URN_ERROR_MESSAGE_BASE
10
+ from dapla_metadata.datasets.utility.urn import ReferenceUrlTypes
9
11
  from dapla_metadata.datasets.utility.urn import SsbNaisDomains
12
+ from dapla_metadata.datasets.utility.urn import UrlVisibility
10
13
  from dapla_metadata.datasets.utility.urn import klass_urn_converter
11
14
  from dapla_metadata.datasets.utility.urn import vardef_urn_converter
12
15
 
13
16
  EXAMPLE_KLASS_ID = "91"
14
- EXAMPLE_KLASS_URN = AnyUrl(klass_urn_converter.build_urn(EXAMPLE_KLASS_ID))
17
+ EXAMPLE_KLASS_URN = AnyUrl(klass_urn_converter.get_urn(EXAMPLE_KLASS_ID))
15
18
  EXAMPLE_VARDEF_ID = "hd8sks89"
16
- EXAMPLE_VARDEF_URN = AnyUrl(vardef_urn_converter.build_urn(EXAMPLE_VARDEF_ID))
19
+ EXAMPLE_VARDEF_URN = AnyUrl(vardef_urn_converter.get_urn(EXAMPLE_VARDEF_ID))
17
20
 
18
21
  VARIABLE_DEFINITION_URN_TEST_CASES = [
19
22
  *[
@@ -52,7 +55,7 @@ def test_convert_to_vardef_urn(
52
55
  expected_result: AnyUrl | None,
53
56
  expect_warning: bool, # noqa: ARG001
54
57
  ):
55
- assert vardef_urn_converter.convert_to_urn(case) == expected_result
58
+ assert vardef_urn_converter.convert_url_to_urn(case) == expected_result
56
59
 
57
60
 
58
61
  @pytest.mark.parametrize(
@@ -88,6 +91,66 @@ def test_convert_to_vardef_urn_end_to_end(
88
91
  assert (URN_ERROR_MESSAGE_BASE in caplog.text) is expect_warning
89
92
 
90
93
 
94
+ @pytest.mark.parametrize("identifier", [EXAMPLE_VARDEF_ID])
95
+ @pytest.mark.parametrize("visibility", ["internal", "public"])
96
+ @pytest.mark.parametrize(
97
+ "url_type", [ReferenceUrlTypes.API, ReferenceUrlTypes.FRONTEND]
98
+ )
99
+ def test_vardef_get_url(
100
+ url_type: ReferenceUrlTypes, visibility: UrlVisibility, identifier: str
101
+ ):
102
+ url = vardef_urn_converter.get_url(identifier, url_type, visibility)
103
+ assert url is not None
104
+ assert url.endswith("/" + identifier)
105
+ if url_type == ReferenceUrlTypes.API:
106
+ assert url.startswith("https://metadata.")
107
+ else:
108
+ assert url.startswith("https://catalog.")
109
+ if visibility == "internal":
110
+ assert ".intern." in url
111
+ else:
112
+ assert ".intern." not in url
113
+
114
+
115
+ @pytest.mark.parametrize(
116
+ ("urn_or_url", "identifier"),
117
+ [
118
+ ("https://www.vg.no", None),
119
+ (EXAMPLE_VARDEF_URN, EXAMPLE_VARDEF_ID),
120
+ (
121
+ f"https://catalog.ssb.no/variable-definitions/{EXAMPLE_VARDEF_ID}",
122
+ EXAMPLE_VARDEF_ID,
123
+ ),
124
+ (
125
+ AnyUrl(
126
+ f"https://metadata.intern.test.ssb.no/variable-definitions/{EXAMPLE_VARDEF_ID}"
127
+ ),
128
+ EXAMPLE_VARDEF_ID,
129
+ ),
130
+ ],
131
+ )
132
+ def test_vardef_get_id(urn_or_url: str | AnyUrl, identifier: str | None):
133
+ assert vardef_urn_converter.get_id(urn_or_url) == identifier
134
+
135
+
136
+ @pytest.mark.parametrize(
137
+ ("identifier", "expected"),
138
+ [
139
+ (EXAMPLE_VARDEF_ID, True),
140
+ ("invalid-id", False),
141
+ ("123", False),
142
+ ("12345678", True),
143
+ ("123456789", False),
144
+ ("abcdEFGH", False),
145
+ ("", False),
146
+ (None, False),
147
+ ],
148
+ )
149
+ @suppress_type_checks
150
+ def test_vardef_is_id(identifier: str, expected: bool):
151
+ assert vardef_urn_converter.is_id(identifier) is expected
152
+
153
+
91
154
  CLASSIFICATION_URN_TEST_CASES = [
92
155
  (
93
156
  f"https://www.ssb.no/klass/klassifikasjoner/{EXAMPLE_KLASS_ID}",
@@ -126,7 +189,7 @@ def test_convert_to_klass_urn(
126
189
  expected_result: str,
127
190
  expect_warning: bool, # noqa: ARG001
128
191
  ):
129
- assert klass_urn_converter.convert_to_urn(case) == expected_result
192
+ assert klass_urn_converter.convert_url_to_urn(case) == expected_result
130
193
 
131
194
 
132
195
  @pytest.mark.parametrize(
@@ -160,3 +223,63 @@ def test_convert_to_klass_urn_end_to_end(
160
223
  else:
161
224
  assert meta.variables[0].classification_uri == expected_result
162
225
  assert (URN_ERROR_MESSAGE_BASE in caplog.text) is expect_warning
226
+
227
+
228
+ @pytest.mark.parametrize("identifier", [EXAMPLE_KLASS_ID])
229
+ @pytest.mark.parametrize("visibility", ["internal", "public"])
230
+ @pytest.mark.parametrize(
231
+ "url_type", [ReferenceUrlTypes.API, ReferenceUrlTypes.FRONTEND]
232
+ )
233
+ def test_klass_get_url(
234
+ url_type: ReferenceUrlTypes, visibility: UrlVisibility, identifier: str
235
+ ):
236
+ url = klass_urn_converter.get_url(identifier, url_type, visibility)
237
+ if visibility == "internal":
238
+ # Klass doesn't have an internal representation
239
+ assert url is None
240
+ else:
241
+ assert url is not None
242
+ assert url.endswith("/" + identifier)
243
+ if url_type == ReferenceUrlTypes.API:
244
+ assert url.startswith("https://data.")
245
+ else:
246
+ assert url.startswith("https://www.ssb.")
247
+
248
+
249
+ @pytest.mark.parametrize(
250
+ ("urn_or_url", "identifier"),
251
+ [
252
+ ("https://www.vg.no", None),
253
+ (EXAMPLE_KLASS_URN, EXAMPLE_KLASS_ID),
254
+ (
255
+ f"https://www.ssb.no/klass/klassifikasjoner/{EXAMPLE_KLASS_ID}",
256
+ EXAMPLE_KLASS_ID,
257
+ ),
258
+ (
259
+ AnyUrl(
260
+ f"https://data.ssb.no/api/klass/v1/classifications/{EXAMPLE_KLASS_ID}"
261
+ ),
262
+ EXAMPLE_KLASS_ID,
263
+ ),
264
+ ],
265
+ )
266
+ def test_klass_get_id(urn_or_url: str | AnyUrl, identifier: str | None):
267
+ assert klass_urn_converter.get_id(urn_or_url) == identifier
268
+
269
+
270
+ @pytest.mark.parametrize(
271
+ ("identifier", "expected"),
272
+ [
273
+ (EXAMPLE_KLASS_ID, True),
274
+ ("invalid-id", False),
275
+ ("123", True),
276
+ ("1", True),
277
+ ("123456789", False),
278
+ ("abcdEFGH", False),
279
+ ("", False),
280
+ (None, False),
281
+ ],
282
+ )
283
+ @suppress_type_checks
284
+ def test_klass_is_id(identifier: str, expected: bool):
285
+ assert klass_urn_converter.is_id(identifier) is expected
@@ -253,6 +253,30 @@ def test_create_patch_change_short_name(variable_definition: VariableDefinition)
253
253
  mock_create_patch.assert_not_called()
254
254
 
255
255
 
256
+ def test_from_model(
257
+ variable_definition: VariableDefinition,
258
+ ):
259
+ """This covers a bug that was reported in.
260
+
261
+ It was caused by an incorrect implementation in the from_model
262
+ method. The only thing we're testing is that no exceptions are
263
+ raised in this flow.
264
+ """
265
+ mock_api_response = MagicMock(name="VariableDefinition")
266
+ mock_api_response.classification_reference = "702"
267
+ with patch.object(
268
+ VariableDefinition,
269
+ "create_patch",
270
+ return_value=mock_api_response,
271
+ ) as mock_create_patch:
272
+ my_patch = VariableDefinition.from_model(variable_definition)
273
+ my_patch.create_patch_from_file(
274
+ file_path=VARIABLE_DEFINITION_EDITING_FILES_DIR
275
+ / "variable_definition_landbak_wypvb3wd_2025-05-02T10-06-20.yaml",
276
+ )
277
+ mock_create_patch.assert_called_once()
278
+
279
+
256
280
  def test_create_patch_from_file_path_not_set(variable_definition: VariableDefinition):
257
281
  my_patch = variable_definition
258
282
  my_patch.set_file_path(file_path=None)