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.
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/PKG-INFO +1 -1
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/pyproject.toml +1 -1
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/core.py +10 -6
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/model_validation.py +28 -19
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/utility/constants.py +14 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/utility/enums.py +7 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/utility/utils.py +143 -6
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/variable_definition.py +11 -4
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/test_datadoc_metadata.py +0 -92
- dapla_toolbelt_metadata-0.9.4/tests/datasets/test_pseudonymization.py +534 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/test_utils.py +7 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/test_validators.py +16 -0
- 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
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/test_variable_definition.py +22 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/uv.lock +335 -309
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.cookiecutter.json +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.cruft.json +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.editorconfig +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.gitattributes +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.github/dependabot.yml +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.github/labels.yml +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.github/release-drafter.yml +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.github/workflows/constraints.txt +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.github/workflows/docs.yml +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.github/workflows/labeler.yml +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.github/workflows/release.yml +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.github/workflows/tests.yml +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.gitignore +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.pre-commit-config.yaml +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/.vscode/settings.json +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/CODEOWNERS +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/CODE_OF_CONDUCT.md +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/CONTRIBUTING.md +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/LICENSE +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/Makefile +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/README.md +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/SECURITY.md +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/backstage.yaml +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/bin/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/bin/openapi_generate_post_process.sh +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/bin/upgrade_metadata_file.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/datasets/create_metadata_for_new_dataset.ipynb +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/datasets/create_metadata_for_new_period.ipynb +0 -0
- {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
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/standards/navnestandard.ipynb +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/les_variabeldefinisjon.ipynb +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/les_variabeldefinisjoner.ipynb +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/migrer_variabeldefinisjoner.ipynb +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/ny_gyldighetsperiode_variabeldefinisjon.ipynb +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/ny_variabeldefinisjon.ipynb +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/publiser_variabeldefinisjon_eksternt.ipynb +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/publiser_variabeldefinisjon_internt.ipynb +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/rediger_publisert_variabeldefinisjon.ipynb +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/rediger_utkast_variabeldefinisjon.ipynb +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/reserver_kortnavn.ipynb +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/sjekk_kortnavn_variabeldefinisjon.ipynb +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/sjekk_migrerte_variabeldefinisjoner.ipynb +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/demo/variable_definitions/slett_utkast_variabeldefinisjon.ipynb +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/docs/Makefile +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/docs/codeofconduct.md +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/docs/conf.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/docs/contributing.md +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/docs/index.md +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/docs/license.md +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/docs/make.bat +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/docs/reference.md +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/docs/templates/package.rst_t +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/docs/vardef_client.md +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/noxfile.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/schemas/jsonschema/complete-response-schema.json +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/sonar-project.properties +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/_shared/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/_shared/config.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/_shared/enums.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/_shared/py.typed +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/dapla/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/dapla/user_info.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/_merge.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/code_list.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/compatibility/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/compatibility/_handlers.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/compatibility/_utils.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/compatibility/model_backwards_compatibility.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/dapla_dataset_path_info.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/dataset_parser.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/external_sources/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/external_sources/external_sources.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/py.typed +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/statistic_subject_mapping.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/utility/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/standards/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/standards/name_validator.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/standards/standard_validators.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/standards/utils/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/standards/utils/constants.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/.openapi-generator/FILES +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/.openapi-generator/VERSION +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/.openapi-generator-ignore +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/README.md +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/configuration.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/exceptions.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/py.typed +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_generated/vardef_client/rest.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_utils/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_utils/_client.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_utils/config.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_utils/constants.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_utils/files.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_utils/template_files.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/_utils/variable_definition_files.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/exceptions.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/vardef.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/vardok_id.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/variable_definitions/vardok_vardef_id_pair.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/conftest.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/dapla/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/dapla/test_user_info.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/conftest.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/constants.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/code_list/code_list.csv +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/code_list/code_list_en.csv +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/code_list/code_list_nb.csv +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/code_list/code_list_nn.csv +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/code_list/empty.csv +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/code_list/no_code.csv +0 -0
- {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
- {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
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/datasets/person_data.csv +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/datasets/person_data_v1.parquet +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/datasets/person_data_v1.parquet.gzip +0 -0
- {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
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/datasets/sasdata.sas7bdat +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/existing_metadata_file/compatibility/README.md +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/statistical_subject_structure/empty.xml +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/statistical_subject_structure/extract_secondary_subject.xml +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/statistical_subject_structure/missing_language.xml +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/resources/statistical_subject_structure/simple.xml +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/test_code_list.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/test_dapla_dataset_path_info.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/test_dataset_consistency.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/test_dataset_parser.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/test_model_backwards_compatibility.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/datasets/test_statistic_subject_mapping.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/standards/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/standards/conftest.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/standards/test_check_naming_standard.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/utils/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/utils/constants.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/utils/microcks_testcontainer.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/conftest.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/constants.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/resources/openapi/variable-definitions-internal.yml +0 -0
- {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
- {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
- {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
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/test_config.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/test_template_files.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/test_vardef.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/test_variable_definition_files.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/vardef_client/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/vardef_client/api/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/vardef_client/api/test_happy_path.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/vardef_client/models/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/vardef_client/models/test_models_instantiation.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/tests/variable_definitions/vardef_client/test_exceptions.py +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/vardef-maintenance/README.md +0 -0
- {dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/vardef-maintenance/vardef-maintenance.toml +0 -0
- {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.
|
|
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.
|
|
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" }]
|
{dapla_toolbelt_metadata-0.9.2 → dapla_toolbelt_metadata-0.9.4}/src/dapla_metadata/datasets/core.py
RENAMED
|
@@ -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
|
|
448
|
+
"""Adds a new pseudo variable to the list of pseudonymized variables.
|
|
448
449
|
|
|
449
|
-
If
|
|
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
|
-
|
|
458
|
-
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
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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 = [
|
|
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 =
|
|
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 =
|
|
180
|
-
>>> variables = [
|
|
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(
|
|
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=
|
|
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")
|