dapla-toolbelt-metadata 0.2.6__tar.gz → 0.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of dapla-toolbelt-metadata might be problematic. Click here for more details.
- {dapla_toolbelt_metadata-0.2.6 → dapla_toolbelt_metadata-0.4.0}/PKG-INFO +1 -1
- {dapla_toolbelt_metadata-0.2.6 → dapla_toolbelt_metadata-0.4.0}/pyproject.toml +31 -4
- {dapla_toolbelt_metadata-0.2.6 → dapla_toolbelt_metadata-0.4.0}/src/dapla_metadata/__init__.py +1 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/_shared/__init__.py +1 -0
- {dapla_toolbelt_metadata-0.2.6/src/dapla_metadata/datasets → dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/_shared}/config.py +42 -11
- {dapla_toolbelt_metadata-0.2.6/src/dapla_metadata/datasets/utility → dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/_shared}/enums.py +8 -15
- {dapla_toolbelt_metadata-0.2.6/src/dapla_metadata/datasets → dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/_shared}/user_info.py +30 -3
- {dapla_toolbelt_metadata-0.2.6 → dapla_toolbelt_metadata-0.4.0}/src/dapla_metadata/datasets/core.py +4 -2
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/datasets/utility/enums.py +16 -0
- {dapla_toolbelt_metadata-0.2.6 → dapla_toolbelt_metadata-0.4.0}/src/dapla_metadata/datasets/utility/utils.py +13 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/__init__.py +7 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/_client.py +30 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/config.py +49 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/exceptions.py +66 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/.openapi-generator/FILES +22 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/.openapi-generator/VERSION +1 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/.openapi-generator-ignore +6 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/README.md +148 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/__init__.py +0 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/__init__.py +52 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/api/__init__.py +9 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/api/data_migration_api.py +313 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/api/draft_variable_definitions_api.py +919 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/api/patches_api.py +919 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/api/public_api.py +915 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/api/validity_periods_api.py +876 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/api/variable_definitions_api.py +1205 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/api_client.py +779 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/api_response.py +27 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/configuration.py +474 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/docs/CompleteResponse.md +51 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/docs/Contact.md +30 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/docs/DataMigrationApi.md +90 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/docs/Draft.md +42 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/docs/DraftVariableDefinitionsApi.md +259 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/docs/LanguageStringType.md +31 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/docs/Owner.md +31 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/docs/Patch.md +43 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/docs/PatchesApi.md +249 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/docs/PublicApi.md +218 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/docs/SupportedLanguages.md +15 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/docs/UpdateDraft.md +44 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/docs/ValidityPeriod.md +42 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/docs/ValidityPeriodsApi.md +236 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/docs/VariableDefinitionsApi.md +304 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/docs/VariableStatus.md +17 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/exceptions.py +193 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/models/__init__.py +30 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/models/complete_response.py +284 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/models/contact.py +94 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/models/draft.py +243 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/models/klass_reference.py +99 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/models/language_string_type.py +104 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/models/owner.py +90 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/models/patch.py +289 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/models/problem.py +118 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/models/rendered_contact.py +92 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/models/rendered_variable_definition.py +235 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/models/supported_languages.py +33 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/models/update_draft.py +307 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/models/validity_period.py +259 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/models/variable_status.py +33 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/py.typed +0 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/generated/vardef_client/rest.py +249 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/vardef.py +173 -0
- dapla_toolbelt_metadata-0.4.0/src/dapla_metadata/variable_definitions/variable_definition.py +212 -0
- {dapla_toolbelt_metadata-0.2.6 → dapla_toolbelt_metadata-0.4.0}/LICENSE +0 -0
- {dapla_toolbelt_metadata-0.2.6 → dapla_toolbelt_metadata-0.4.0}/README.md +0 -0
- {dapla_toolbelt_metadata-0.2.6 → dapla_toolbelt_metadata-0.4.0}/src/dapla_metadata/datasets/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.2.6 → dapla_toolbelt_metadata-0.4.0}/src/dapla_metadata/datasets/code_list.py +0 -0
- {dapla_toolbelt_metadata-0.2.6 → dapla_toolbelt_metadata-0.4.0}/src/dapla_metadata/datasets/dapla_dataset_path_info.py +0 -0
- {dapla_toolbelt_metadata-0.2.6 → dapla_toolbelt_metadata-0.4.0}/src/dapla_metadata/datasets/dataset_parser.py +0 -0
- {dapla_toolbelt_metadata-0.2.6 → dapla_toolbelt_metadata-0.4.0}/src/dapla_metadata/datasets/external_sources/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.2.6 → dapla_toolbelt_metadata-0.4.0}/src/dapla_metadata/datasets/external_sources/external_sources.py +0 -0
- {dapla_toolbelt_metadata-0.2.6 → dapla_toolbelt_metadata-0.4.0}/src/dapla_metadata/datasets/model_backwards_compatibility.py +0 -0
- {dapla_toolbelt_metadata-0.2.6 → dapla_toolbelt_metadata-0.4.0}/src/dapla_metadata/datasets/model_validation.py +0 -0
- {dapla_toolbelt_metadata-0.2.6 → dapla_toolbelt_metadata-0.4.0}/src/dapla_metadata/datasets/py.typed +0 -0
- {dapla_toolbelt_metadata-0.2.6 → dapla_toolbelt_metadata-0.4.0}/src/dapla_metadata/datasets/statistic_subject_mapping.py +0 -0
- {dapla_toolbelt_metadata-0.2.6 → dapla_toolbelt_metadata-0.4.0}/src/dapla_metadata/datasets/utility/__init__.py +0 -0
- {dapla_toolbelt_metadata-0.2.6 → dapla_toolbelt_metadata-0.4.0}/src/dapla_metadata/datasets/utility/constants.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "dapla-toolbelt-metadata"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.4.0"
|
|
4
4
|
description = "Dapla Toolbelt Metadata"
|
|
5
5
|
authors = ["Team Metadata <metadata@ssb.no>"]
|
|
6
6
|
license = "MIT"
|
|
@@ -62,24 +62,35 @@ types-setuptools = "*"
|
|
|
62
62
|
types-beautifulsoup4 = ">=4.12.0.20240511"
|
|
63
63
|
ipykernel = "^6.29.5"
|
|
64
64
|
rich = "^13.9.4"
|
|
65
|
+
bpython = "^0.24"
|
|
66
|
+
testcontainers = { version = "^4.8.2", extras = ["generic"] }
|
|
65
67
|
|
|
66
68
|
[tool.pytest.ini_options]
|
|
67
69
|
pythonpath = ["src"]
|
|
68
70
|
|
|
69
|
-
|
|
70
71
|
[tool.coverage.paths]
|
|
71
72
|
source = ["src", "*/site-packages"]
|
|
72
|
-
tests = ["tests", "*/tests"]
|
|
73
|
+
tests = ["tests", "*/tests", "*/test"]
|
|
73
74
|
|
|
74
75
|
[tool.coverage.run]
|
|
75
76
|
branch = true
|
|
76
77
|
source = ["dapla_metadata"]
|
|
77
|
-
omit = [
|
|
78
|
+
omit = [
|
|
79
|
+
"tests/*",
|
|
80
|
+
"__init__.py",
|
|
81
|
+
"*/dapla_metadata/variable_definitions/generated/*",
|
|
82
|
+
]
|
|
78
83
|
relative_files = true
|
|
79
84
|
|
|
80
85
|
[tool.coverage.report]
|
|
81
86
|
show_missing = true
|
|
82
87
|
fail_under = 80
|
|
88
|
+
omit = ["*/dapla_metadata/variable_definitions/generated/*"]
|
|
89
|
+
|
|
90
|
+
[tool.black]
|
|
91
|
+
# We don't want to format generated files because it creates large diffs
|
|
92
|
+
# when generated code is updated.
|
|
93
|
+
extend-exclude = "/generated/"
|
|
83
94
|
|
|
84
95
|
[tool.mypy]
|
|
85
96
|
plugins = ["pydantic.mypy"]
|
|
@@ -88,10 +99,20 @@ warn_unreachable = true
|
|
|
88
99
|
pretty = true
|
|
89
100
|
show_column_numbers = true
|
|
90
101
|
show_error_context = true
|
|
102
|
+
# Generated code is not high quality, just ignore the problems there
|
|
103
|
+
exclude = "generated/vardef_client/.*"
|
|
104
|
+
|
|
105
|
+
[[tool.mypy.overrides]]
|
|
106
|
+
module = ["dapla_metadata.variable_definitions.generated.vardef_client.*"]
|
|
107
|
+
warn_unreachable = false
|
|
108
|
+
ignore_errors = true
|
|
109
|
+
disable_error_code = ["unreachable"]
|
|
110
|
+
|
|
91
111
|
|
|
92
112
|
[[tool.mypy.overrides]]
|
|
93
113
|
# Allow missing type hints in third-party libraries without type information.
|
|
94
114
|
module = [
|
|
115
|
+
"nox",
|
|
95
116
|
"dapla",
|
|
96
117
|
"gcsfs",
|
|
97
118
|
"pyarrow",
|
|
@@ -99,6 +120,9 @@ module = [
|
|
|
99
120
|
"datadoc_model",
|
|
100
121
|
"datadoc_model.model",
|
|
101
122
|
"pytest_mock",
|
|
123
|
+
"testcontainers.*",
|
|
124
|
+
"yaml",
|
|
125
|
+
"httpx",
|
|
102
126
|
]
|
|
103
127
|
ignore_missing_imports = true
|
|
104
128
|
|
|
@@ -149,6 +173,9 @@ max-complexity = 15
|
|
|
149
173
|
[tool.ruff.lint.pydocstyle]
|
|
150
174
|
convention = "google" # You can also use "numpy".
|
|
151
175
|
|
|
176
|
+
[tool.ruff.lint.flake8-pytest-style]
|
|
177
|
+
fixture-parentheses = false
|
|
178
|
+
|
|
152
179
|
[tool.ruff.lint.pep8-naming]
|
|
153
180
|
classmethod-decorators = [
|
|
154
181
|
"classmethod",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Utility code intended to be used by multiple packages within this project, but not by end users."""
|
|
@@ -10,11 +10,12 @@ from pprint import pformat
|
|
|
10
10
|
from dotenv import dotenv_values
|
|
11
11
|
from dotenv import load_dotenv
|
|
12
12
|
|
|
13
|
+
from dapla_metadata._shared.enums import DaplaEnvironment
|
|
14
|
+
from dapla_metadata._shared.enums import DaplaRegion
|
|
15
|
+
from dapla_metadata._shared.enums import DaplaService
|
|
13
16
|
from dapla_metadata.datasets.utility.constants import (
|
|
14
17
|
DATADOC_STATISTICAL_SUBJECT_SOURCE_URL,
|
|
15
18
|
)
|
|
16
|
-
from dapla_metadata.datasets.utility.enums import DaplaRegion
|
|
17
|
-
from dapla_metadata.datasets.utility.enums import DaplaService
|
|
18
19
|
|
|
19
20
|
logger = logging.getLogger(__name__)
|
|
20
21
|
|
|
@@ -22,7 +23,10 @@ DOT_ENV_FILE_PATH = Path(__file__).parent.joinpath(".env")
|
|
|
22
23
|
|
|
23
24
|
JUPYTERHUB_USER = "JUPYTERHUB_USER"
|
|
24
25
|
DAPLA_REGION = "DAPLA_REGION"
|
|
26
|
+
DAPLA_ENVIRONMENT = "DAPLA_ENVIRONMENT"
|
|
25
27
|
DAPLA_SERVICE = "DAPLA_SERVICE"
|
|
28
|
+
DAPLA_GROUP_CONTEXT = "DAPLA_GROUP_CONTEXT"
|
|
29
|
+
OIDC_TOKEN = "OIDC_TOKEN" # noqa: S105
|
|
26
30
|
|
|
27
31
|
env_loaded = False
|
|
28
32
|
|
|
@@ -38,43 +42,70 @@ def _load_dotenv_file() -> None:
|
|
|
38
42
|
)
|
|
39
43
|
|
|
40
44
|
|
|
41
|
-
def
|
|
42
|
-
"""Get a config item. Makes sure all access is logged.
|
|
45
|
+
def get_config_item(item: str, *, raising: bool = False) -> str | None:
|
|
46
|
+
"""Get a config item. Makes sure all access is logged.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
item: The name of the environment variable to obtain.
|
|
50
|
+
raising: `True` if an exception should be raised when the item isn't present.
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
The set value or `None`
|
|
54
|
+
|
|
55
|
+
Raises:
|
|
56
|
+
OSError: Only if `raising` is True and the item is not found.
|
|
57
|
+
"""
|
|
43
58
|
_load_dotenv_file()
|
|
44
|
-
value = os.
|
|
59
|
+
value = os.environ.get(item)
|
|
60
|
+
if raising and not value:
|
|
61
|
+
msg = f"Environment variable {item} not defined."
|
|
62
|
+
raise OSError(msg)
|
|
45
63
|
logger.debug("Config accessed. %s", item)
|
|
46
64
|
return value
|
|
47
65
|
|
|
48
66
|
|
|
49
67
|
def get_jupyterhub_user() -> str | None:
|
|
50
68
|
"""Get the JupyterHub user name."""
|
|
51
|
-
return
|
|
69
|
+
return get_config_item(JUPYTERHUB_USER)
|
|
52
70
|
|
|
53
71
|
|
|
54
72
|
def get_statistical_subject_source_url() -> str | None:
|
|
55
73
|
"""Get the URL to the statistical subject source."""
|
|
56
74
|
return (
|
|
57
|
-
|
|
75
|
+
get_config_item("DATADOC_STATISTICAL_SUBJECT_SOURCE_URL")
|
|
58
76
|
or DATADOC_STATISTICAL_SUBJECT_SOURCE_URL
|
|
59
77
|
)
|
|
60
78
|
|
|
61
79
|
|
|
62
80
|
def get_dapla_region() -> DaplaRegion | None:
|
|
63
81
|
"""Get the Dapla region we're running on."""
|
|
64
|
-
if region :=
|
|
82
|
+
if region := get_config_item(DAPLA_REGION):
|
|
65
83
|
return DaplaRegion(region)
|
|
66
84
|
|
|
67
85
|
return None
|
|
68
86
|
|
|
69
87
|
|
|
88
|
+
def get_dapla_environment() -> DaplaEnvironment | None:
|
|
89
|
+
"""Get the Dapla environment we're running on."""
|
|
90
|
+
if env := get_config_item(DAPLA_ENVIRONMENT):
|
|
91
|
+
return DaplaEnvironment(env)
|
|
92
|
+
|
|
93
|
+
return None
|
|
94
|
+
|
|
95
|
+
|
|
70
96
|
def get_dapla_service() -> DaplaService | None:
|
|
71
97
|
"""Get the Dapla service we're running on."""
|
|
72
|
-
if service :=
|
|
98
|
+
if service := get_config_item(DAPLA_SERVICE):
|
|
73
99
|
return DaplaService(service)
|
|
74
100
|
|
|
75
101
|
return None
|
|
76
102
|
|
|
77
103
|
|
|
78
|
-
def get_oidc_token() -> str | None:
|
|
104
|
+
def get_oidc_token(*, raising: bool = False) -> str | None:
|
|
79
105
|
"""Get the JWT token from the environment."""
|
|
80
|
-
return
|
|
106
|
+
return get_config_item(OIDC_TOKEN, raising=raising)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def get_dapla_group_context(*, raising: bool = False) -> str | None:
|
|
110
|
+
"""Get the group which the user has chosen to represent."""
|
|
111
|
+
return get_config_item(DAPLA_GROUP_CONTEXT, raising=raising)
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
"""Enumerations used in Datadoc."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
1
|
from enum import Enum
|
|
6
2
|
|
|
7
3
|
|
|
@@ -14,6 +10,14 @@ class DaplaRegion(str, Enum):
|
|
|
14
10
|
CLOUD_RUN = "CLOUD_RUN"
|
|
15
11
|
|
|
16
12
|
|
|
13
|
+
class DaplaEnvironment(str, Enum):
|
|
14
|
+
"""Dapla lifecycle environment."""
|
|
15
|
+
|
|
16
|
+
PROD = "PROD"
|
|
17
|
+
TEST = "TEST"
|
|
18
|
+
DEV = "DEV"
|
|
19
|
+
|
|
20
|
+
|
|
17
21
|
class DaplaService(str, Enum):
|
|
18
22
|
"""Dapla services."""
|
|
19
23
|
|
|
@@ -22,14 +26,3 @@ class DaplaService(str, Enum):
|
|
|
22
26
|
VS_CODE = "VS_CODE"
|
|
23
27
|
R_STUDIO = "R_STUDIO"
|
|
24
28
|
KILDOMATEN = "KILDOMATEN"
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class SupportedLanguages(str, Enum):
|
|
28
|
-
"""The list of languages metadata may be recorded in.
|
|
29
|
-
|
|
30
|
-
Reference: https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry
|
|
31
|
-
"""
|
|
32
|
-
|
|
33
|
-
NORSK_BOKMÅL = "nb"
|
|
34
|
-
NORSK_NYNORSK = "nn"
|
|
35
|
-
ENGLISH = "en"
|
|
@@ -6,9 +6,9 @@ from typing import Protocol
|
|
|
6
6
|
|
|
7
7
|
import jwt
|
|
8
8
|
|
|
9
|
-
from dapla_metadata.
|
|
10
|
-
from dapla_metadata.
|
|
11
|
-
from dapla_metadata.
|
|
9
|
+
from dapla_metadata._shared import config
|
|
10
|
+
from dapla_metadata._shared.enums import DaplaRegion
|
|
11
|
+
from dapla_metadata._shared.enums import DaplaService
|
|
12
12
|
|
|
13
13
|
logger = logging.getLogger(__name__)
|
|
14
14
|
|
|
@@ -86,3 +86,30 @@ def get_user_info_for_current_platform() -> UserInfo:
|
|
|
86
86
|
"Was not possible to retrieve user information! Some fields may not be set.",
|
|
87
87
|
)
|
|
88
88
|
return UnknownUserInfo()
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def get_owner() -> str:
|
|
92
|
+
"""Returns the owner read from the GROUP_CONTEXT environment variable."""
|
|
93
|
+
if group := config.get_dapla_group_context():
|
|
94
|
+
return parse_team_name(group)
|
|
95
|
+
msg = "DAPLA_GROUP_CONTEXT environment variable not found"
|
|
96
|
+
raise OSError(msg)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def parse_team_name(group: str) -> str:
|
|
100
|
+
"""Parses the group to get the current team.
|
|
101
|
+
|
|
102
|
+
>>> parse_team_name(dapla-metadata-developers)
|
|
103
|
+
(dapla-metadata)
|
|
104
|
+
|
|
105
|
+
>>> parse_team_name(dapla-metadata-data-admins)
|
|
106
|
+
(dapla-metadata)
|
|
107
|
+
|
|
108
|
+
>>> parse_team_name(dapla-metadata)
|
|
109
|
+
(dapla)
|
|
110
|
+
|
|
111
|
+
>>> parse_team_name(dapla-metadata-not-real-name)
|
|
112
|
+
(dapla-metadata-not-real)
|
|
113
|
+
"""
|
|
114
|
+
parts = group.split("-")
|
|
115
|
+
return "-".join(parts[:-2] if group.endswith("data-admins") else parts[:-1])
|
{dapla_toolbelt_metadata-0.2.6 → dapla_toolbelt_metadata-0.4.0}/src/dapla_metadata/datasets/core.py
RENAMED
|
@@ -13,8 +13,8 @@ from typing import TYPE_CHECKING
|
|
|
13
13
|
from datadoc_model import model
|
|
14
14
|
from datadoc_model.model import DataSetStatus
|
|
15
15
|
|
|
16
|
-
from dapla_metadata.
|
|
17
|
-
from dapla_metadata.
|
|
16
|
+
from dapla_metadata._shared import config
|
|
17
|
+
from dapla_metadata._shared import user_info
|
|
18
18
|
from dapla_metadata.datasets.dapla_dataset_path_info import DaplaDatasetPathInfo
|
|
19
19
|
from dapla_metadata.datasets.dataset_parser import DatasetParser
|
|
20
20
|
from dapla_metadata.datasets.model_backwards_compatibility import (
|
|
@@ -42,6 +42,7 @@ from dapla_metadata.datasets.utility.utils import (
|
|
|
42
42
|
num_obligatory_variables_fields_completed,
|
|
43
43
|
)
|
|
44
44
|
from dapla_metadata.datasets.utility.utils import override_dataset_fields
|
|
45
|
+
from dapla_metadata.datasets.utility.utils import set_dataset_owner
|
|
45
46
|
from dapla_metadata.datasets.utility.utils import set_default_values_dataset
|
|
46
47
|
from dapla_metadata.datasets.utility.utils import set_default_values_variables
|
|
47
48
|
|
|
@@ -189,6 +190,7 @@ class Datadoc:
|
|
|
189
190
|
self._set_metadata(existing_metadata or extracted_metadata)
|
|
190
191
|
set_default_values_variables(self.variables)
|
|
191
192
|
set_default_values_dataset(self.dataset)
|
|
193
|
+
set_dataset_owner(self.dataset)
|
|
192
194
|
self._create_variables_lookup()
|
|
193
195
|
|
|
194
196
|
def _get_existing_file_path(
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""Enumerations used in Datadoc."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from enum import Enum
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class SupportedLanguages(str, Enum):
|
|
9
|
+
"""The list of languages metadata may be recorded in.
|
|
10
|
+
|
|
11
|
+
Reference: https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
NORSK_BOKMÅL = "nb"
|
|
15
|
+
NORSK_NYNORSK = "nn"
|
|
16
|
+
ENGLISH = "en"
|
|
@@ -14,6 +14,7 @@ from datadoc_model.model import Assessment
|
|
|
14
14
|
from datadoc_model.model import DataSetState
|
|
15
15
|
from datadoc_model.model import VariableRole
|
|
16
16
|
|
|
17
|
+
from dapla_metadata._shared import user_info
|
|
17
18
|
from dapla_metadata.datasets.utility.constants import (
|
|
18
19
|
DATASET_FIELDS_FROM_EXISTING_METADATA,
|
|
19
20
|
)
|
|
@@ -139,6 +140,18 @@ def set_default_values_dataset(dataset: model.Dataset) -> None:
|
|
|
139
140
|
dataset.contains_personal_data = False
|
|
140
141
|
|
|
141
142
|
|
|
143
|
+
def set_dataset_owner(dataset: model.Dataset) -> None:
|
|
144
|
+
"""Sets the owner of the dataset from the DAPLA_GROUP_CONTEXT enviornment variable.
|
|
145
|
+
|
|
146
|
+
Args:
|
|
147
|
+
dataset: The dataset object to set default values on.
|
|
148
|
+
"""
|
|
149
|
+
try:
|
|
150
|
+
dataset.owner = user_info.get_owner()
|
|
151
|
+
except OSError:
|
|
152
|
+
logger.exception("Failed to find environment variable DAPLA_GROUP_CONTEXT")
|
|
153
|
+
|
|
154
|
+
|
|
142
155
|
def set_variables_inherit_from_dataset(
|
|
143
156
|
dataset: model.Dataset,
|
|
144
157
|
variables: list,
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"""Client for working with Variable Definitions at Statistics Norway."""
|
|
2
|
+
|
|
3
|
+
from .generated.vardef_client import models
|
|
4
|
+
from .generated.vardef_client.exceptions import * # noqa: F403
|
|
5
|
+
from .vardef import Vardef
|
|
6
|
+
from .variable_definition import CompletePatchOutput
|
|
7
|
+
from .variable_definition import VariableDefinition
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from dapla_metadata.variable_definitions.config import get_vardef_client_configuration
|
|
2
|
+
from dapla_metadata.variable_definitions.generated.vardef_client.api_client import (
|
|
3
|
+
ApiClient,
|
|
4
|
+
)
|
|
5
|
+
from dapla_metadata.variable_definitions.generated.vardef_client.configuration import (
|
|
6
|
+
Configuration,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class VardefClient:
|
|
11
|
+
_client: ApiClient | None = None
|
|
12
|
+
_config: Configuration | None = None
|
|
13
|
+
|
|
14
|
+
@classmethod
|
|
15
|
+
def get_config(cls) -> Configuration | None:
|
|
16
|
+
"""Get the client configuration object."""
|
|
17
|
+
return cls._config
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
def set_config(cls, config: Configuration) -> None:
|
|
21
|
+
"""Set the client configuration object."""
|
|
22
|
+
cls._config = config
|
|
23
|
+
|
|
24
|
+
@classmethod
|
|
25
|
+
def get_client(cls) -> ApiClient:
|
|
26
|
+
if not cls._client:
|
|
27
|
+
if not cls._config:
|
|
28
|
+
cls._config = get_vardef_client_configuration()
|
|
29
|
+
cls._client = ApiClient(cls._config)
|
|
30
|
+
return cls._client
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from dapla_metadata._shared.config import get_config_item
|
|
2
|
+
from dapla_metadata._shared.config import get_dapla_environment
|
|
3
|
+
from dapla_metadata._shared.config import get_dapla_group_context
|
|
4
|
+
from dapla_metadata._shared.config import get_oidc_token
|
|
5
|
+
from dapla_metadata._shared.enums import DaplaEnvironment
|
|
6
|
+
from dapla_metadata.variable_definitions.generated.vardef_client.configuration import (
|
|
7
|
+
Configuration,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
VARDEF_HOST_TEST = "https://metadata.intern.test.ssb.no"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def get_active_group() -> str:
|
|
14
|
+
"""Get the group the user currently represents.
|
|
15
|
+
|
|
16
|
+
Returns:
|
|
17
|
+
A string with the active group.
|
|
18
|
+
"""
|
|
19
|
+
return str(get_dapla_group_context(raising=True))
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def get_vardef_host() -> str:
|
|
23
|
+
"""Get the host for the server to make requests to.
|
|
24
|
+
|
|
25
|
+
Based on standard Dapla platform environment variables, or variables specific
|
|
26
|
+
to Vardef if these are not available.
|
|
27
|
+
|
|
28
|
+
Raises:
|
|
29
|
+
NotImplementedError: When Vardef is not available for the current environment.
|
|
30
|
+
"""
|
|
31
|
+
match get_dapla_environment():
|
|
32
|
+
case DaplaEnvironment.PROD:
|
|
33
|
+
msg = "Vardef is not available in prod."
|
|
34
|
+
raise NotImplementedError(msg)
|
|
35
|
+
case DaplaEnvironment.TEST:
|
|
36
|
+
return VARDEF_HOST_TEST
|
|
37
|
+
case DaplaEnvironment.DEV:
|
|
38
|
+
msg = "Vardef is not available in dev."
|
|
39
|
+
raise NotImplementedError(msg)
|
|
40
|
+
case _:
|
|
41
|
+
return get_config_item("VARDEF_HOST") or "http://localhost:8080"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def get_vardef_client_configuration() -> Configuration:
|
|
45
|
+
"""Build a config to be supplied to the `ApiClient`."""
|
|
46
|
+
return Configuration(
|
|
47
|
+
host=get_vardef_host(),
|
|
48
|
+
access_token=get_oidc_token(raising=True),
|
|
49
|
+
)
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""Vardef client exceptions."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from functools import wraps
|
|
5
|
+
|
|
6
|
+
from dapla_metadata.variable_definitions.generated.vardef_client.exceptions import (
|
|
7
|
+
OpenApiException,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class VardefClientException(OpenApiException):
|
|
12
|
+
"""Custom exception to represent errors encountered in the Vardef client.
|
|
13
|
+
|
|
14
|
+
This exception extracts and formats error details from a JSON response body
|
|
15
|
+
provided by the Vardef API, enabling more descriptive error messages.
|
|
16
|
+
If the response body cannot be parsed as JSON or lacks expected keys,
|
|
17
|
+
default values are used to provide meaningful feedback.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
def __init__(self, response_body: str) -> None:
|
|
21
|
+
"""Initialize the exception with a JSON-formatted response body.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
response_body (str): The JSON string containing error details
|
|
25
|
+
from the Vardef API response.
|
|
26
|
+
|
|
27
|
+
Attributes:
|
|
28
|
+
status (str): The status code from the response, or "Unknown status"
|
|
29
|
+
if not available or the response is invalid.
|
|
30
|
+
detail (str || list): A detailed error message from the response, or
|
|
31
|
+
"No detail provided" if not provided. If "Constraint violation"
|
|
32
|
+
detail contains 'field' and 'message'.
|
|
33
|
+
response_body (str): The raw response body string, stored for
|
|
34
|
+
debugging purposes.
|
|
35
|
+
"""
|
|
36
|
+
try:
|
|
37
|
+
data = json.loads(response_body)
|
|
38
|
+
self.status = data.get("status", "Unknown status")
|
|
39
|
+
if data.get("title") == "Constraint Violation":
|
|
40
|
+
violations = data.get("violations", [])
|
|
41
|
+
self.detail = "".join(
|
|
42
|
+
f"\n{violation.get('field', 'Unknown field')}: {violation.get('message', 'No message provided')}"
|
|
43
|
+
for violation in violations
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
else:
|
|
47
|
+
self.detail = data.get("detail", "No detail provided")
|
|
48
|
+
self.response_body = response_body
|
|
49
|
+
except (json.JSONDecodeError, TypeError):
|
|
50
|
+
self.status = "Unknown"
|
|
51
|
+
self.detail = "Could not decode error response from API"
|
|
52
|
+
data = None
|
|
53
|
+
super().__init__(f"Status {self.status}: {self.detail}")
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def vardef_exception_handler(method): # noqa: ANN201, ANN001
|
|
57
|
+
"""Decorator for handling exceptions in Vardef."""
|
|
58
|
+
|
|
59
|
+
@wraps(method)
|
|
60
|
+
def _impl(self, *method_args, **method_kwargs): # noqa: ANN001, ANN002, ANN003
|
|
61
|
+
try:
|
|
62
|
+
return method(self, *method_args, **method_kwargs)
|
|
63
|
+
except OpenApiException as e:
|
|
64
|
+
raise VardefClientException(e.body) from e
|
|
65
|
+
|
|
66
|
+
return _impl
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
vardef_client/api/__init__.py
|
|
2
|
+
vardef_client/api/data_migration_api.py
|
|
3
|
+
vardef_client/api/draft_variable_definitions_api.py
|
|
4
|
+
vardef_client/api/patches_api.py
|
|
5
|
+
vardef_client/api/public_api.py
|
|
6
|
+
vardef_client/api/validity_periods_api.py
|
|
7
|
+
vardef_client/api/variable_definitions_api.py
|
|
8
|
+
vardef_client/models/__init__.py
|
|
9
|
+
vardef_client/models/complete_response.py
|
|
10
|
+
vardef_client/models/contact.py
|
|
11
|
+
vardef_client/models/draft.py
|
|
12
|
+
vardef_client/models/klass_reference.py
|
|
13
|
+
vardef_client/models/language_string_type.py
|
|
14
|
+
vardef_client/models/owner.py
|
|
15
|
+
vardef_client/models/patch.py
|
|
16
|
+
vardef_client/models/problem.py
|
|
17
|
+
vardef_client/models/rendered_contact.py
|
|
18
|
+
vardef_client/models/rendered_variable_definition.py
|
|
19
|
+
vardef_client/models/supported_languages.py
|
|
20
|
+
vardef_client/models/update_draft.py
|
|
21
|
+
vardef_client/models/validity_period.py
|
|
22
|
+
vardef_client/models/variable_status.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
7.9.0
|