dapla-toolbelt-metadata 0.9.2__tar.gz → 0.9.4__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 (239) hide show
  1. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/PKG-INFO +1 -1
  2. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/pyproject.toml +1 -1
  3. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/core.py +10 -6
  4. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/model_validation.py +28 -19
  5. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/utility/constants.py +14 -0
  6. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/utility/enums.py +7 -0
  7. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/utility/utils.py +143 -6
  8. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/variable_definition.py +11 -4
  9. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/test_datadoc_metadata.py +0 -92
  10. dapla_toolbelt_metadata-0.9.4/tests/datasets/test_pseudonymization.py +534 -0
  11. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/test_utils.py +7 -0
  12. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/test_validators.py +16 -0
  13. dapla_toolbelt_metadata-0.9.4/tests/variable_definitions/resources/variable_definition_editing_files/variable_definition_var_test_wypvb3wd_2025-09-18T14-19-28.yaml +62 -0
  14. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/test_variable_definition.py +22 -0
  15. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/uv.lock +335 -309
  16. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.cookiecutter.json +0 -0
  17. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.cruft.json +0 -0
  18. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.editorconfig +0 -0
  19. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.gitattributes +0 -0
  20. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  21. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  22. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.github/dependabot.yml +0 -0
  23. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.github/labels.yml +0 -0
  24. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.github/release-drafter.yml +0 -0
  25. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.github/workflows/constraints.txt +0 -0
  26. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.github/workflows/docs.yml +0 -0
  27. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.github/workflows/labeler.yml +0 -0
  28. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.github/workflows/release.yml +0 -0
  29. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.github/workflows/tests.yml +0 -0
  30. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.gitignore +0 -0
  31. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.pre-commit-config.yaml +0 -0
  32. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.vscode/settings.json +0 -0
  33. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/CODEOWNERS +0 -0
  34. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/CODE_OF_CONDUCT.md +0 -0
  35. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/CONTRIBUTING.md +0 -0
  36. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/LICENSE +0 -0
  37. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/Makefile +0 -0
  38. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/README.md +0 -0
  39. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/SECURITY.md +0 -0
  40. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/backstage.yaml +0 -0
  41. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/bin/__init__.py +0 -0
  42. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/bin/openapi_generate_post_process.sh +0 -0
  43. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/bin/upgrade_metadata_file.py +0 -0
  44. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/datasets/create_metadata_for_new_dataset.ipynb +0 -0
  45. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/datasets/create_metadata_for_new_period.ipynb +0 -0
  46. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/datasets/resources/sykefratot/klargjorte_data/person_testdata_p2021_v1__DOC.json +0 -0
  47. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/standards/navnestandard.ipynb +0 -0
  48. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/les_variabeldefinisjon.ipynb +0 -0
  49. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/les_variabeldefinisjoner.ipynb +0 -0
  50. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/migrer_variabeldefinisjoner.ipynb +0 -0
  51. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/ny_gyldighetsperiode_variabeldefinisjon.ipynb +0 -0
  52. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/ny_variabeldefinisjon.ipynb +0 -0
  53. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/publiser_variabeldefinisjon_eksternt.ipynb +0 -0
  54. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/publiser_variabeldefinisjon_internt.ipynb +0 -0
  55. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/rediger_publisert_variabeldefinisjon.ipynb +0 -0
  56. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/rediger_utkast_variabeldefinisjon.ipynb +0 -0
  57. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/reserver_kortnavn.ipynb +0 -0
  58. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/sjekk_kortnavn_variabeldefinisjon.ipynb +0 -0
  59. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/sjekk_migrerte_variabeldefinisjoner.ipynb +0 -0
  60. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/slett_utkast_variabeldefinisjon.ipynb +0 -0
  61. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/docs/Makefile +0 -0
  62. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/docs/codeofconduct.md +0 -0
  63. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/docs/conf.py +0 -0
  64. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/docs/contributing.md +0 -0
  65. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/docs/index.md +0 -0
  66. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/docs/license.md +0 -0
  67. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/docs/make.bat +0 -0
  68. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/docs/reference.md +0 -0
  69. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/docs/templates/package.rst_t +0 -0
  70. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/docs/vardef_client.md +0 -0
  71. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/noxfile.py +0 -0
  72. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/schemas/jsonschema/complete-response-schema.json +0 -0
  73. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/sonar-project.properties +0 -0
  74. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/__init__.py +0 -0
  75. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/_shared/__init__.py +0 -0
  76. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/_shared/config.py +0 -0
  77. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/_shared/enums.py +0 -0
  78. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/_shared/py.typed +0 -0
  79. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/dapla/__init__.py +0 -0
  80. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/dapla/user_info.py +0 -0
  81. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/__init__.py +0 -0
  82. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/_merge.py +0 -0
  83. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/code_list.py +0 -0
  84. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/compatibility/__init__.py +0 -0
  85. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/compatibility/_handlers.py +0 -0
  86. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/compatibility/_utils.py +0 -0
  87. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/compatibility/model_backwards_compatibility.py +0 -0
  88. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/dapla_dataset_path_info.py +0 -0
  89. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/dataset_parser.py +0 -0
  90. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/external_sources/__init__.py +0 -0
  91. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/external_sources/external_sources.py +0 -0
  92. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/py.typed +0 -0
  93. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/statistic_subject_mapping.py +0 -0
  94. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/utility/__init__.py +0 -0
  95. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/standards/__init__.py +0 -0
  96. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/standards/name_validator.py +0 -0
  97. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/standards/standard_validators.py +0 -0
  98. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/standards/utils/__init__.py +0 -0
  99. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/standards/utils/constants.py +0 -0
  100. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/__init__.py +0 -0
  101. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/.openapi-generator/FILES +0 -0
  102. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/.openapi-generator/VERSION +0 -0
  103. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/.openapi-generator-ignore +0 -0
  104. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/README.md +0 -0
  105. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/__init__.py +0 -0
  106. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/__init__.py +0 -0
  107. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/api/__init__.py +0 -0
  108. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/api/data_migration_api.py +0 -0
  109. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/api/draft_variable_definitions_api.py +0 -0
  110. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/api/patches_api.py +0 -0
  111. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/api/validity_periods_api.py +0 -0
  112. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/api/variable_definitions_api.py +0 -0
  113. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/api_client.py +0 -0
  114. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/api_response.py +0 -0
  115. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/configuration.py +0 -0
  116. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/CompleteResponse.md +0 -0
  117. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/Contact.md +0 -0
  118. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/DataMigrationApi.md +0 -0
  119. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/Draft.md +0 -0
  120. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/DraftVariableDefinitionsApi.md +0 -0
  121. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/LanguageStringType.md +0 -0
  122. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/Owner.md +0 -0
  123. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/Patch.md +0 -0
  124. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/PatchesApi.md +0 -0
  125. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/PublicApi.md +0 -0
  126. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/SupportedLanguages.md +0 -0
  127. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/UpdateDraft.md +0 -0
  128. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/ValidityPeriod.md +0 -0
  129. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/ValidityPeriodsApi.md +0 -0
  130. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/VariableDefinitionsApi.md +0 -0
  131. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/docs/VariableStatus.md +0 -0
  132. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/exceptions.py +0 -0
  133. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/__init__.py +0 -0
  134. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/complete_response.py +0 -0
  135. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/contact.py +0 -0
  136. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/draft.py +0 -0
  137. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/get_vardok_vardef_mapping_by_id200_response.py +0 -0
  138. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/language_string_type.py +0 -0
  139. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/owner.py +0 -0
  140. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/patch.py +0 -0
  141. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/problem.py +0 -0
  142. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/update_draft.py +0 -0
  143. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/validity_period.py +0 -0
  144. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/vardok_id_response.py +0 -0
  145. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/vardok_vardef_id_pair_response.py +0 -0
  146. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/models/variable_status.py +0 -0
  147. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/py.typed +0 -0
  148. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/rest.py +0 -0
  149. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_utils/__init__.py +0 -0
  150. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_utils/_client.py +0 -0
  151. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_utils/config.py +0 -0
  152. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_utils/constants.py +0 -0
  153. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_utils/files.py +0 -0
  154. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_utils/template_files.py +0 -0
  155. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_utils/variable_definition_files.py +0 -0
  156. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/exceptions.py +0 -0
  157. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/vardef.py +0 -0
  158. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/vardok_id.py +0 -0
  159. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/vardok_vardef_id_pair.py +0 -0
  160. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/__init__.py +0 -0
  161. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/conftest.py +0 -0
  162. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/dapla/__init__.py +0 -0
  163. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/dapla/test_user_info.py +0 -0
  164. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/__init__.py +0 -0
  165. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/conftest.py +0 -0
  166. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/constants.py +0 -0
  167. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/code_list/code_list.csv +0 -0
  168. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/code_list/code_list_en.csv +0 -0
  169. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/code_list/code_list_nb.csv +0 -0
  170. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/code_list/code_list_nn.csv +0 -0
  171. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/code_list/empty.csv +0 -0
  172. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/code_list/no_code.csv +0 -0
  173. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/datasets/fewer_variables_p2021-12-31_p2021-12-31_v1.parquet +0 -0
  174. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/datasets/ifpn/klargjorte_data/person_testdata_p2021-12-31_p2021-12-31_v1.parquet +0 -0
  175. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/datasets/person_data.csv +0 -0
  176. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/datasets/person_data_v1.parquet +0 -0
  177. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/datasets/person_data_v1.parquet.gzip +0 -0
  178. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/datasets/person_testdata_p2021-12-31_p2021-12-31_v1.parquet +0 -0
  179. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/datasets/sasdata.sas7bdat +0 -0
  180. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/compatibility/README.md +0 -0
  181. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/compatibility/v0_1_1/person_data_v1__DOC.json +0 -0
  182. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/compatibility/v1_0_0/person_data_v1__DOC.json +0 -0
  183. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/compatibility/v2_1_0/person_data_v1__DOC.json +0 -0
  184. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/compatibility/v2_2_0/person_data_v1__DOC.json +0 -0
  185. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/compatibility/v3_1_0/person_data_v1__DOC.json +0 -0
  186. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/compatibility/v3_2_0/person_data_v1__DOC.json +0 -0
  187. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/compatibility/v3_3_0/person_data_v1__DOC.json +0 -0
  188. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/compatibility/v4_0_0/person_data_v1__DOC.json +0 -0
  189. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/compatibility/v5_0_1/person_data_v1__DOC.json +0 -0
  190. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/compatibility/v6_0_0/person_data_v1__DOC.json +0 -0
  191. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/fewer_variables_p2020-12-31_p2020-12-31_v1__DOC.json +0 -0
  192. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/invalid_id_field/person_data_v1__DOC.json +0 -0
  193. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/person_data_v1__DOC.json +0 -0
  194. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/person_testdata_p2020-12-31_p2020-12-31_v1__DOC.json +0 -0
  195. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/pseudo/dataset_and_pseudo/no_pseudo_v4_0_0_person_data_v1__DOC.json +0 -0
  196. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/pseudo/dataset_and_pseudo/person_data_v1__DOC.json +0 -0
  197. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/pseudo/dataset_and_pseudo/v4_0_0_person_data_v1__DOC.json +0 -0
  198. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/pseudo/pseudo/person_data_v1__DOC.json +0 -0
  199. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/pseudo/pseudo_missing_variables/person_data_v1__DOC.json +0 -0
  200. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/valid_id_field/person_data_v1__DOC.json +0 -0
  201. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/valid_variable_id_field/person_data_v1__DOC.json +0 -0
  202. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/klargjorte_data/person_testdata_p2021-12-31_p2021-12-31_v1.parquet +0 -0
  203. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/klargjorte_data/person_testdata_p2021-12-31_p2021-12-31_v1__DOC.json +0 -0
  204. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/statistical_subject_structure/empty.xml +0 -0
  205. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/statistical_subject_structure/extract_secondary_subject.xml +0 -0
  206. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/statistical_subject_structure/missing_language.xml +0 -0
  207. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/statistical_subject_structure/simple.xml +0 -0
  208. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/test_code_list.py +0 -0
  209. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/test_dapla_dataset_path_info.py +0 -0
  210. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/test_dataset_consistency.py +0 -0
  211. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/test_dataset_parser.py +0 -0
  212. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/test_model_backwards_compatibility.py +0 -0
  213. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/test_statistic_subject_mapping.py +0 -0
  214. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/standards/__init__.py +0 -0
  215. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/standards/conftest.py +0 -0
  216. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/standards/test_check_naming_standard.py +0 -0
  217. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/utils/__init__.py +0 -0
  218. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/utils/constants.py +0 -0
  219. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/utils/microcks_testcontainer.py +0 -0
  220. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/__init__.py +0 -0
  221. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/conftest.py +0 -0
  222. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/constants.py +0 -0
  223. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/resources/openapi/variable-definitions-internal.yml +0 -0
  224. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/resources/variable_definition_editing_files/classification_reference.yaml +0 -0
  225. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/resources/variable_definition_editing_files/date_and_definition.yaml +0 -0
  226. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/resources/variable_definition_editing_files/variable_definition_landbak_wypvb3wd_2025-05-02T10-06-20.yaml +0 -0
  227. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/test_config.py +0 -0
  228. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/test_template_files.py +0 -0
  229. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/test_vardef.py +0 -0
  230. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/test_variable_definition_files.py +0 -0
  231. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/vardef_client/__init__.py +0 -0
  232. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/vardef_client/api/__init__.py +0 -0
  233. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/vardef_client/api/test_happy_path.py +0 -0
  234. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/vardef_client/models/__init__.py +0 -0
  235. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/vardef_client/models/test_models_instantiation.py +0 -0
  236. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/vardef_client/test_exceptions.py +0 -0
  237. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/vardef-maintenance/README.md +0 -0
  238. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/vardef-maintenance/vardef-maintenance.toml +0 -0
  239. {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/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.2
3
+ Version: 0.9.4
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
@@ -2,7 +2,7 @@
2
2
  name = "dapla-toolbelt-metadata"
3
3
  description = "Dapla Toolbelt Metadata"
4
4
  license = "MIT"
5
- version = "0.9.2"
5
+ version = "0.9.4"
6
6
  classifiers = ["Development Status :: 4 - Beta"]
7
7
  readme = "README.md"
8
8
  authors = [{ name = "Statistics Norway", email = "metadata@ssb.no" }]
@@ -46,6 +46,7 @@ from dapla_metadata.datasets.utility.utils import (
46
46
  )
47
47
  from dapla_metadata.datasets.utility.utils import set_dataset_owner
48
48
  from dapla_metadata.datasets.utility.utils import set_default_values_dataset
49
+ from dapla_metadata.datasets.utility.utils import set_default_values_pseudonymization
49
50
  from dapla_metadata.datasets.utility.utils import set_default_values_variables
50
51
 
51
52
  if TYPE_CHECKING:
@@ -444,9 +445,12 @@ class Datadoc:
444
445
  variable_short_name: str,
445
446
  pseudonymization: all_optional_model.Pseudonymization | None = None,
446
447
  ) -> None:
447
- """Adds a new pseudo variable to the list of pseudonymized variables also sets is_personal_data to true.
448
+ """Adds a new pseudo variable to the list of pseudonymized variables.
448
449
 
449
- If there is no pseudonymization supplied an empty Pseudonymization structure will be added to the model.
450
+ If `pseudonymization` is not supplied, an empty Pseudonymization structure
451
+ will be created and assigned to the variable.
452
+ If an encryption algorithm is recognized (one of the standard Dapla algorithms), default values are filled
453
+ for any missing fields.
450
454
 
451
455
  Args:
452
456
  variable_short_name: The short name for the variable that one wants to update the pseudo for.
@@ -454,15 +458,15 @@ class Datadoc:
454
458
 
455
459
  """
456
460
  variable = self.variables_lookup[variable_short_name]
457
- variable.pseudonymization = (
458
- pseudonymization or all_optional_model.Pseudonymization()
459
- )
461
+ if pseudonymization:
462
+ set_default_values_pseudonymization(variable, pseudonymization)
463
+ else:
464
+ variable.pseudonymization = all_optional_model.Pseudonymization()
460
465
 
461
466
  def remove_pseudonymization(self, variable_short_name: str) -> None:
462
467
  """Removes a pseudo variable by using the shortname.
463
468
 
464
469
  Updates the pseudo variable lookup by creating a new one.
465
- Sets is_personal_data to non pseudonymized encrypted personal data.
466
470
 
467
471
  Args:
468
472
  variable_short_name: The short name for the variable that one wants to remove the pseudo for.
@@ -13,20 +13,19 @@ 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
16
- from dapla_metadata.datasets.utility.constants import NUM_OBLIGATORY_VARIABLES_FIELDS
17
16
  from dapla_metadata.datasets.utility.constants import OBLIGATORY_METADATA_WARNING
18
17
  from dapla_metadata.datasets.utility.utils import get_missing_obligatory_dataset_fields
19
18
  from dapla_metadata.datasets.utility.utils import (
20
19
  get_missing_obligatory_variables_fields,
21
20
  )
21
+ from dapla_metadata.datasets.utility.utils import (
22
+ get_missing_obligatory_variables_pseudo_fields,
23
+ )
22
24
  from dapla_metadata.datasets.utility.utils import get_timestamp_now
23
25
  from dapla_metadata.datasets.utility.utils import incorrect_date_order
24
26
  from dapla_metadata.datasets.utility.utils import (
25
27
  num_obligatory_dataset_fields_completed,
26
28
  )
27
- from dapla_metadata.datasets.utility.utils import (
28
- num_obligatory_variables_fields_completed,
29
- )
30
29
  from dapla_metadata.datasets.utility.utils import set_variables_inherit_from_dataset
31
30
 
32
31
  if TYPE_CHECKING:
@@ -146,21 +145,31 @@ class ValidateDatadocMetadata(model.DatadocMetadata):
146
145
  ObligatoryVariableWarning: If not all obligatory variable metadata fields
147
146
  are filled in.
148
147
  """
149
- if self.variables is not None and num_obligatory_variables_fields_completed(
150
- self.variables,
151
- ) != (NUM_OBLIGATORY_VARIABLES_FIELDS * len(self.variables)):
152
- warnings.warn(
153
- f"{OBLIGATORY_METADATA_WARNING} {get_missing_obligatory_variables_fields(self.variables)}",
154
- ObligatoryVariableWarning,
155
- stacklevel=2,
156
- )
157
- logger.warning(
158
- "Type warning: %s.%s %s",
159
- ObligatoryVariableWarning,
160
- OBLIGATORY_METADATA_WARNING,
161
- get_missing_obligatory_variables_fields(self.variables),
162
- )
163
-
148
+ if self.variables is not None:
149
+ missing_fields_dict = {}
150
+ for d in get_missing_obligatory_variables_fields(self.variables):
151
+ for var, fields in d.items():
152
+ missing_fields_dict[var] = fields.copy()
153
+
154
+ for d in get_missing_obligatory_variables_pseudo_fields(self.variables):
155
+ for var, fields in d.items():
156
+ if var in missing_fields_dict:
157
+ missing_fields_dict[var].extend(fields)
158
+ else:
159
+ missing_fields_dict[var] = fields.copy()
160
+
161
+ missing_fields = [
162
+ {var: fields} for var, fields in missing_fields_dict.items()
163
+ ]
164
+ if missing_fields:
165
+ message = f"{OBLIGATORY_METADATA_WARNING} {missing_fields}"
166
+ warnings.warn(message, ObligatoryVariableWarning, stacklevel=2)
167
+ logger.warning(
168
+ "Type warning: %s.%s %s",
169
+ ObligatoryVariableWarning,
170
+ OBLIGATORY_METADATA_WARNING,
171
+ missing_fields,
172
+ )
164
173
  return self
165
174
 
166
175
 
@@ -47,6 +47,12 @@ OBLIGATORY_VARIABLES_METADATA_IDENTIFIERS = [
47
47
  "temporality_type",
48
48
  ]
49
49
 
50
+ OBLIGATORY_VARIABLES_PSEUDONYMIZATION_IDENTIFIERS = [
51
+ "encryption_algorithm",
52
+ "encryption_key_reference",
53
+ ]
54
+
55
+
50
56
  OBLIGATORY_VARIABLES_METADATA_IDENTIFIERS_MULTILANGUAGE = [
51
57
  "name",
52
58
  ]
@@ -91,3 +97,11 @@ METADATA_DOCUMENT_FILE_SUFFIX = "__DOC.json"
91
97
  DATADOC_STATISTICAL_SUBJECT_SOURCE_URL = (
92
98
  "https://www.ssb.no/xp/_/service/mimir/subjectStructurStatistics"
93
99
  )
100
+
101
+ PAPIS_STABLE_IDENTIFIER_TYPE = "FREG_SNR"
102
+ PAPIS_ENCRYPTION_KEY_REFERENCE = "papis-common-key-1"
103
+ DAEAD_ENCRYPTION_KEY_REFERENCE = "ssb-common-key-1"
104
+ ENCRYPTION_PARAMETER_SNAPSHOT_DATE = "snapshotDate"
105
+ ENCRYPTION_PARAMETER_KEY_ID = "keyId"
106
+ ENCRYPTION_PARAMETER_STRATEGY = "strategy"
107
+ ENCRYPTION_PARAMETER_STRATEGY_SKIP = "skip"
@@ -14,3 +14,10 @@ class SupportedLanguages(str, Enum):
14
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"
17
+
18
+
19
+ class EncryptionAlgorithm(str, Enum):
20
+ """Encryption algorithm values for pseudonymization algoprithms offered on Dapla."""
21
+
22
+ PAPIS_ENCRYPTION_ALGORITHM = "TINK-FPE"
23
+ DAEAD_ENCRYPTION_ALGORITHM = "TINK-DAEAD"
@@ -4,6 +4,7 @@ import datetime # import is needed in xdoctest
4
4
  import logging
5
5
  import pathlib
6
6
  import uuid
7
+ from typing import Any
7
8
  from typing import TypeAlias
8
9
 
9
10
  import datadoc_model.all_optional.model as all_optional_model
@@ -12,12 +13,16 @@ import google.auth
12
13
  from cloudpathlib import CloudPath
13
14
  from cloudpathlib import GSClient
14
15
  from cloudpathlib import GSPath
15
- from datadoc_model import model
16
16
  from datadoc_model.all_optional.model import Assessment
17
17
  from datadoc_model.all_optional.model import DataSetState
18
18
  from datadoc_model.all_optional.model import VariableRole
19
19
 
20
20
  from dapla_metadata.dapla import user_info
21
+ from dapla_metadata.datasets.utility.constants import DAEAD_ENCRYPTION_KEY_REFERENCE
22
+ from dapla_metadata.datasets.utility.constants import ENCRYPTION_PARAMETER_KEY_ID
23
+ from dapla_metadata.datasets.utility.constants import ENCRYPTION_PARAMETER_SNAPSHOT_DATE
24
+ from dapla_metadata.datasets.utility.constants import ENCRYPTION_PARAMETER_STRATEGY
25
+ from dapla_metadata.datasets.utility.constants import ENCRYPTION_PARAMETER_STRATEGY_SKIP
21
26
  from dapla_metadata.datasets.utility.constants import NUM_OBLIGATORY_VARIABLES_FIELDS
22
27
  from dapla_metadata.datasets.utility.constants import (
23
28
  OBLIGATORY_DATASET_METADATA_IDENTIFIERS,
@@ -31,6 +36,12 @@ from dapla_metadata.datasets.utility.constants import (
31
36
  from dapla_metadata.datasets.utility.constants import (
32
37
  OBLIGATORY_VARIABLES_METADATA_IDENTIFIERS_MULTILANGUAGE,
33
38
  )
39
+ from dapla_metadata.datasets.utility.constants import (
40
+ OBLIGATORY_VARIABLES_PSEUDONYMIZATION_IDENTIFIERS,
41
+ )
42
+ from dapla_metadata.datasets.utility.constants import PAPIS_ENCRYPTION_KEY_REFERENCE
43
+ from dapla_metadata.datasets.utility.constants import PAPIS_STABLE_IDENTIFIER_TYPE
44
+ from dapla_metadata.datasets.utility.enums import EncryptionAlgorithm
34
45
 
35
46
  logger = logging.getLogger(__name__)
36
47
 
@@ -39,12 +50,20 @@ DatadocMetadataType: TypeAlias = (
39
50
  )
40
51
  DatasetType: TypeAlias = all_optional_model.Dataset | required_model.Dataset
41
52
  VariableType: TypeAlias = all_optional_model.Variable | required_model.Variable
53
+ PseudonymizationType: TypeAlias = (
54
+ all_optional_model.Pseudonymization | required_model.Pseudonymization
55
+ )
42
56
  VariableListType: TypeAlias = (
43
57
  list[all_optional_model.Variable] | list[required_model.Variable]
44
58
  )
45
59
  OptionalDatadocMetadataType: TypeAlias = DatadocMetadataType | None
46
60
 
47
61
 
62
+ def get_current_date() -> str:
63
+ """Return a current date as str."""
64
+ return datetime.datetime.now(tz=datetime.timezone.utc).date().isoformat()
65
+
66
+
48
67
  def get_timestamp_now() -> datetime.datetime:
49
68
  """Return a timestamp for the current moment."""
50
69
  return datetime.datetime.now(tz=datetime.timezone.utc)
@@ -109,7 +128,7 @@ def set_default_values_variables(variables: list) -> None:
109
128
  variables: A list of variable objects to set default values on.
110
129
 
111
130
  Example:
112
- >>> variables = [model.Variable(short_name="pers",id=None, is_personal_data = None), model.Variable(short_name="fnr",id='9662875c-c245-41de-b667-12ad2091a1ee', is_personal_data=True)]
131
+ >>> variables = [all_optional_model.Variable(short_name="pers",id=None, is_personal_data = None), all_optional_model.Variable(short_name="fnr",id='9662875c-c245-41de-b667-12ad2091a1ee', is_personal_data=True)]
113
132
  >>> set_default_values_variables(variables)
114
133
  >>> isinstance(variables[0].id, uuid.UUID)
115
134
  True
@@ -138,7 +157,7 @@ def set_default_values_dataset(
138
157
  dataset: The dataset object to set default values on.
139
158
 
140
159
  Example:
141
- >>> dataset = model.Dataset(id=None)
160
+ >>> dataset = all_optional_model.Dataset(id=None)
142
161
  >>> set_default_values_dataset(dataset)
143
162
  >>> dataset.id is not None
144
163
  True
@@ -176,8 +195,8 @@ def set_variables_inherit_from_dataset(
176
195
  variables: A list of variable objects to update with dataset values.
177
196
 
178
197
  Example:
179
- >>> dataset = model.Dataset(short_name='person_data_v1', id='9662875c-c245-41de-b667-12ad2091a1ee', contains_data_from="2010-09-05", contains_data_until="2022-09-05")
180
- >>> variables = [model.Variable(short_name="pers", data_source=None, temporality_type=None, contains_data_from=None, contains_data_until=None)]
198
+ >>> dataset = all_optional_model.Dataset(short_name='person_data_v1', id='9662875c-c245-41de-b667-12ad2091a1ee', contains_data_from="2010-09-05", contains_data_until="2022-09-05")
199
+ >>> variables = [all_optional_model.Variable(short_name="pers", data_source=None, temporality_type=None, contains_data_from=None, contains_data_until=None)]
181
200
  >>> set_variables_inherit_from_dataset(dataset, variables)
182
201
 
183
202
  >>> variables[0].contains_data_from == dataset.contains_data_from
@@ -323,7 +342,9 @@ def num_obligatory_variables_fields_completed(variables: list) -> int:
323
342
  return num_completed
324
343
 
325
344
 
326
- def num_obligatory_variable_fields_completed(variable: model.Variable) -> int:
345
+ def num_obligatory_variable_fields_completed(
346
+ variable: all_optional_model.Variable,
347
+ ) -> int:
327
348
  """Count the number of obligatory fields completed for one variable.
328
349
 
329
350
  This function calculates the total number of obligatory fields that have
@@ -349,6 +370,25 @@ def num_obligatory_variable_fields_completed(variable: model.Variable) -> int:
349
370
  return NUM_OBLIGATORY_VARIABLES_FIELDS - len(missing_metadata)
350
371
 
351
372
 
373
+ def num_obligatory_pseudo_fields_missing(
374
+ variables: list[all_optional_model.Variable],
375
+ ) -> int:
376
+ """Counts the number of obligatory pseudonymization fields are missing.
377
+
378
+ Args:
379
+ variables: The variables to count obligatory fields for.
380
+
381
+ Returns:
382
+ The number of obligatory pseudonymization fields that are missing.
383
+ """
384
+ return sum(
385
+ getattr(v.pseudonymization, field, None) is None
386
+ for v in variables
387
+ if v.pseudonymization is not None
388
+ for field in OBLIGATORY_VARIABLES_PSEUDONYMIZATION_IDENTIFIERS
389
+ )
390
+
391
+
352
392
  def get_missing_obligatory_dataset_fields(
353
393
  dataset: DatasetType,
354
394
  ) -> list:
@@ -415,6 +455,40 @@ def get_missing_obligatory_variables_fields(variables: list) -> list[dict]:
415
455
  return [item for item in missing_variables_fields if next(iter(item.values()))]
416
456
 
417
457
 
458
+ def get_missing_obligatory_variables_pseudo_fields(
459
+ variables: list[all_optional_model.Variable],
460
+ ) -> list[dict]:
461
+ """Identify obligatory variable pseudonymization fields that are missing values for each variable.
462
+
463
+ This function checks for obligatory fields that are directly missing
464
+ (i.e., set to `None`).
465
+
466
+ Args:
467
+ variables: A list of variable objects to check for missing obligatory pseudonymization fields.
468
+
469
+ Returns:
470
+ A list of dictionaries with variable short names as keys and list of missing
471
+ obligatory variable pseudonymization fields as values. This includes:
472
+ - Fields that are directly `None` and are listed as obligatory metadata.
473
+ """
474
+ return [
475
+ {
476
+ v.short_name: [
477
+ key
478
+ for key, value in v.pseudonymization.model_dump().items()
479
+ if _is_missing_metadata(
480
+ key,
481
+ value,
482
+ OBLIGATORY_VARIABLES_PSEUDONYMIZATION_IDENTIFIERS,
483
+ [],
484
+ )
485
+ ]
486
+ }
487
+ for v in variables
488
+ if v.pseudonymization is not None
489
+ ]
490
+
491
+
418
492
  def running_in_notebook() -> bool:
419
493
  """Return True if running in Jupyter Notebook."""
420
494
  try:
@@ -425,3 +499,66 @@ def running_in_notebook() -> bool:
425
499
  # interpreters and will throw a NameError. Therefore we're not running
426
500
  # in Jupyter.
427
501
  return False
502
+
503
+
504
+ def _ensure_encryption_parameters(
505
+ existing: list[dict[str, Any]] | None,
506
+ required: dict[str, Any],
507
+ ) -> list[dict[str, Any]]:
508
+ """Ensure required key/value pairs exist in parameters list."""
509
+ result = list(existing or [])
510
+
511
+ # Ensure each required key is present in at least one dict
512
+ for key, value in required.items():
513
+ if not any(key in d for d in result):
514
+ result.append({key: value})
515
+
516
+ return result
517
+
518
+
519
+ def set_default_values_pseudonymization(
520
+ variable: VariableType,
521
+ pseudonymization: PseudonymizationType | None,
522
+ ) -> None:
523
+ """Populate pseudonymization fields with defaults based on the encryption algorithm.
524
+
525
+ Updates the encryption key reference and encryption parameters if they are not set,
526
+ handling both PAPIS and DAED algorithms. Leaves unknown algorithms unchanged.
527
+ """
528
+ if pseudonymization is None:
529
+ return
530
+ if variable.pseudonymization is None:
531
+ variable.pseudonymization = pseudonymization
532
+ match pseudonymization.encryption_algorithm:
533
+ case EncryptionAlgorithm.PAPIS_ENCRYPTION_ALGORITHM.value:
534
+ if not pseudonymization.encryption_key_reference:
535
+ pseudonymization.encryption_key_reference = (
536
+ PAPIS_ENCRYPTION_KEY_REFERENCE
537
+ )
538
+ base_params = {
539
+ ENCRYPTION_PARAMETER_KEY_ID: PAPIS_ENCRYPTION_KEY_REFERENCE,
540
+ ENCRYPTION_PARAMETER_STRATEGY: ENCRYPTION_PARAMETER_STRATEGY_SKIP,
541
+ }
542
+ if pseudonymization.stable_identifier_type == PAPIS_STABLE_IDENTIFIER_TYPE:
543
+ base_params[ENCRYPTION_PARAMETER_SNAPSHOT_DATE] = get_current_date()
544
+ pseudonymization.encryption_algorithm_parameters = (
545
+ _ensure_encryption_parameters(
546
+ pseudonymization.encryption_algorithm_parameters,
547
+ base_params,
548
+ )
549
+ )
550
+ case EncryptionAlgorithm.DAEAD_ENCRYPTION_ALGORITHM.value:
551
+ if not pseudonymization.encryption_key_reference:
552
+ pseudonymization.encryption_key_reference = (
553
+ DAEAD_ENCRYPTION_KEY_REFERENCE
554
+ )
555
+ pseudonymization.encryption_algorithm_parameters = (
556
+ _ensure_encryption_parameters(
557
+ pseudonymization.encryption_algorithm_parameters,
558
+ {
559
+ ENCRYPTION_PARAMETER_KEY_ID: DAEAD_ENCRYPTION_KEY_REFERENCE,
560
+ },
561
+ )
562
+ )
563
+ case _:
564
+ pass
@@ -49,6 +49,10 @@ from dapla_metadata.variable_definitions.exceptions import vardef_file_error_han
49
49
 
50
50
  logger = logging.getLogger(__name__)
51
51
 
52
+ IDENTICAL_PATCH_ERROR_MESSAGE = (
53
+ "No changes detected in supported fields. Not creating identical patch."
54
+ )
55
+
52
56
 
53
57
  class VariableDefinition(CompleteResponse):
54
58
  """A Variable Definition.
@@ -274,11 +278,14 @@ class VariableDefinition(CompleteResponse):
274
278
  Returns:
275
279
  VariableDefinition: Variable Definition with all details.
276
280
  """
281
+ new_patch = _read_file_to_model(
282
+ file_path or self.get_file_path(),
283
+ Patch,
284
+ )
285
+ if new_patch == Patch.from_dict(self.to_dict()):
286
+ raise ValueError(IDENTICAL_PATCH_ERROR_MESSAGE)
277
287
  return self.create_patch(
278
- patch=_read_file_to_model(
279
- file_path or self.get_file_path(),
280
- Patch,
281
- ),
288
+ patch=new_patch,
282
289
  valid_from=valid_from,
283
290
  )
284
291
 
@@ -19,7 +19,6 @@ from datadoc_model.all_optional.model import Dataset
19
19
  from datadoc_model.all_optional.model import DataSetState
20
20
  from datadoc_model.all_optional.model import DataSetStatus
21
21
  from datadoc_model.all_optional.model import DataType
22
- from datadoc_model.all_optional.model import Pseudonymization
23
22
  from datadoc_model.all_optional.model import Variable
24
23
  from datadoc_model.all_optional.model import VariableRole
25
24
  from pydantic import ValidationError
@@ -39,7 +38,6 @@ from tests.datasets.constants import TEST_EXISTING_METADATA_WITH_VALID_ID_DIRECT
39
38
  from tests.datasets.constants import TEST_NAMING_STANDARD_COMPATIBLE_DATASET
40
39
  from tests.datasets.constants import TEST_PARQUET_FILEPATH
41
40
  from tests.datasets.constants import TEST_PROCESSED_DATA_POPULATION_DIRECTORY
42
- from tests.datasets.constants import TEST_PSEUDO_DIRECTORY
43
41
  from tests.datasets.constants import TEST_RESOURCES_DIRECTORY
44
42
 
45
43
  if TYPE_CHECKING:
@@ -583,93 +581,3 @@ def test_merge_with_fewer_variables_in_existing_metadata(tmp_path):
583
581
  "bankinnskudd",
584
582
  "dato",
585
583
  ]
586
-
587
-
588
- @pytest.mark.parametrize(
589
- "existing_metadata_path",
590
- [TEST_PSEUDO_DIRECTORY / "dataset_and_pseudo"],
591
- )
592
- def test_add_pseudo_variable(
593
- existing_metadata_file: Path, # noqa: ARG001
594
- metadata: Datadoc,
595
- ):
596
- test_variable = "sykepenger"
597
- is_personal_data = metadata.variables_lookup[test_variable].is_personal_data
598
- metadata.add_pseudonymization(test_variable)
599
- assert metadata.variables_lookup[test_variable].pseudonymization is not None
600
- assert metadata.variables_lookup[test_variable].is_personal_data == is_personal_data
601
-
602
-
603
- @pytest.mark.parametrize(
604
- "existing_metadata_path",
605
- [TEST_PSEUDO_DIRECTORY / "dataset_and_pseudo"],
606
- )
607
- def test_add_pseudo_variable_non_existent_variable_name(
608
- existing_metadata_file: Path, # noqa: ARG001
609
- metadata: Datadoc,
610
- ):
611
- with pytest.raises(KeyError):
612
- metadata.add_pseudonymization("new_pseudo_variable")
613
-
614
-
615
- @pytest.mark.parametrize(
616
- "existing_metadata_path",
617
- [TEST_PSEUDO_DIRECTORY / "dataset_and_pseudo"],
618
- )
619
- def test_existing_metadata_file_update_pseudonymization(
620
- existing_metadata_file: Path, # noqa: ARG001
621
- metadata: Datadoc,
622
- ):
623
- metadata.add_pseudonymization("pers_id")
624
- variable = metadata.variables_lookup["pers_id"]
625
-
626
- assert variable.pseudonymization is not None
627
- assert variable.pseudonymization.encryption_algorithm is None
628
- variable.pseudonymization.encryption_algorithm = "new_encryption_algorithm"
629
- assert variable.pseudonymization.encryption_algorithm == "new_encryption_algorithm"
630
-
631
-
632
- @pytest.mark.parametrize(
633
- "existing_metadata_path",
634
- [TEST_PSEUDO_DIRECTORY / "dataset_and_pseudo"],
635
- )
636
- def test_update_pseudo(
637
- existing_metadata_file: Path, # noqa: ARG001
638
- metadata: Datadoc,
639
- ):
640
- variable = metadata.variables_lookup["pers_id"]
641
-
642
- pseudo = Pseudonymization(encryption_algorithm="new_encryption_algorithm")
643
-
644
- metadata.add_pseudonymization("pers_id", pseudo)
645
-
646
- assert variable.pseudonymization is not None
647
- assert variable.pseudonymization.encryption_algorithm == "new_encryption_algorithm"
648
- assert variable.pseudonymization.encryption_algorithm_parameters is None
649
-
650
-
651
- @pytest.mark.parametrize(
652
- "existing_metadata_path",
653
- [TEST_PSEUDO_DIRECTORY / "dataset_and_pseudo"],
654
- )
655
- def test_remove_pseudo_variable(
656
- existing_metadata_file: Path, # noqa: ARG001
657
- metadata: Datadoc,
658
- ):
659
- test_variable = "alm_inntekt"
660
- is_personal_data = metadata.variables_lookup[test_variable].is_personal_data
661
- metadata.remove_pseudonymization(test_variable)
662
- assert metadata.variables_lookup[test_variable].is_personal_data == is_personal_data
663
- assert metadata.variables_lookup[test_variable].pseudonymization is None
664
-
665
-
666
- @pytest.mark.parametrize(
667
- "existing_metadata_path",
668
- [TEST_PSEUDO_DIRECTORY / "dataset_and_pseudo"],
669
- )
670
- def test_remove_pseudo_variable_non_existent_variable_name(
671
- existing_metadata_file: Path, # noqa: ARG001
672
- metadata: Datadoc,
673
- ):
674
- with pytest.raises(KeyError):
675
- metadata.remove_pseudonymization("fnr")