dapla-toolbelt-metadata 0.1.2__py3-none-any.whl → 0.2.1__py3-none-any.whl

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 (23) hide show
  1. dapla_metadata/__init__.py +5 -0
  2. {dataset → dapla_metadata/datasets}/code_list.py +2 -2
  3. {dataset → dapla_metadata/datasets}/config.py +9 -5
  4. {dataset → dapla_metadata/datasets}/core.py +75 -91
  5. {dataset → dapla_metadata/datasets}/dataset_parser.py +1 -1
  6. {dataset → dapla_metadata/datasets}/model_validation.py +17 -11
  7. {dataset → dapla_metadata/datasets}/statistic_subject_mapping.py +9 -8
  8. {dataset → dapla_metadata/datasets}/user_info.py +3 -3
  9. {dataset → dapla_metadata/datasets}/utility/constants.py +4 -0
  10. {dataset → dapla_metadata/datasets}/utility/utils.py +92 -5
  11. {dapla_toolbelt_metadata-0.1.2.dist-info → dapla_toolbelt_metadata-0.2.1.dist-info}/METADATA +9 -20
  12. dapla_toolbelt_metadata-0.2.1.dist-info/RECORD +22 -0
  13. dapla_toolbelt_metadata-0.1.2.dist-info/RECORD +0 -21
  14. {dataset → dapla_metadata/datasets}/__init__.py +0 -0
  15. {dataset → dapla_metadata/datasets}/dapla_dataset_path_info.py +0 -0
  16. {dataset → dapla_metadata/datasets}/external_sources/__init__.py +0 -0
  17. {dataset → dapla_metadata/datasets}/external_sources/external_sources.py +0 -0
  18. {dataset → dapla_metadata/datasets}/model_backwards_compatibility.py +0 -0
  19. {dataset → dapla_metadata/datasets}/py.typed +0 -0
  20. {dataset → dapla_metadata/datasets}/utility/__init__.py +0 -0
  21. {dataset → dapla_metadata/datasets}/utility/enums.py +0 -0
  22. {dapla_toolbelt_metadata-0.1.2.dist-info → dapla_toolbelt_metadata-0.2.1.dist-info}/LICENSE +0 -0
  23. {dapla_toolbelt_metadata-0.1.2.dist-info → dapla_toolbelt_metadata-0.2.1.dist-info}/WHEEL +0 -0
@@ -0,0 +1,5 @@
1
+ """Tools and clients for working with the Dapla Metadata system."""
2
+
3
+ import datadoc_model.model as datadoc_model
4
+
5
+ from . import datasets
@@ -4,8 +4,8 @@ import logging
4
4
  from dataclasses import dataclass
5
5
  from typing import TYPE_CHECKING
6
6
 
7
- from dataset.external_sources.external_sources import GetExternalSource
8
- from dataset.utility.enums import SupportedLanguages
7
+ from dapla_metadata.datasets.external_sources.external_sources import GetExternalSource
8
+ from dapla_metadata.datasets.utility.enums import SupportedLanguages
9
9
 
10
10
  if TYPE_CHECKING:
11
11
  from concurrent.futures import ThreadPoolExecutor
@@ -10,10 +10,11 @@ from pprint import pformat
10
10
  from dotenv import dotenv_values
11
11
  from dotenv import load_dotenv
12
12
 
13
- from dataset.utility.enums import DaplaRegion
14
- from dataset.utility.enums import DaplaService
15
-
16
- logging.basicConfig(level=logging.DEBUG, force=True)
13
+ from dapla_metadata.datasets.utility.constants import (
14
+ DATADOC_STATISTICAL_SUBJECT_SOURCE_URL,
15
+ )
16
+ from dapla_metadata.datasets.utility.enums import DaplaRegion
17
+ from dapla_metadata.datasets.utility.enums import DaplaService
17
18
 
18
19
  logger = logging.getLogger(__name__)
19
20
 
@@ -52,7 +53,10 @@ def get_jupyterhub_user() -> str | None:
52
53
 
53
54
  def get_statistical_subject_source_url() -> str | None:
54
55
  """Get the URL to the statistical subject source."""
55
- return _get_config_item("DATADOC_STATISTICAL_SUBJECT_SOURCE_URL")
56
+ return (
57
+ _get_config_item("DATADOC_STATISTICAL_SUBJECT_SOURCE_URL")
58
+ or DATADOC_STATISTICAL_SUBJECT_SOURCE_URL
59
+ )
56
60
 
57
61
 
58
62
  def get_dapla_region() -> DaplaRegion | None:
@@ -13,28 +13,37 @@ from typing import TYPE_CHECKING
13
13
  from datadoc_model import model
14
14
  from datadoc_model.model import DataSetStatus
15
15
 
16
- from dataset import config
17
- from dataset import user_info
18
- from dataset.dapla_dataset_path_info import DaplaDatasetPathInfo
19
- from dataset.dataset_parser import DatasetParser
20
- from dataset.model_backwards_compatibility import is_metadata_in_container_structure
21
- from dataset.model_backwards_compatibility import upgrade_metadata
22
- from dataset.model_validation import ValidateDatadocMetadata
23
- from dataset.statistic_subject_mapping import StatisticSubjectMapping
24
- from dataset.utility.constants import DATASET_FIELDS_FROM_EXISTING_METADATA
25
- from dataset.utility.constants import DEFAULT_SPATIAL_COVERAGE_DESCRIPTION
26
- from dataset.utility.constants import INCONSISTENCIES_MESSAGE
27
- from dataset.utility.constants import METADATA_DOCUMENT_FILE_SUFFIX
28
- from dataset.utility.constants import NUM_OBLIGATORY_DATASET_FIELDS
29
- from dataset.utility.constants import NUM_OBLIGATORY_VARIABLES_FIELDS
30
- from dataset.utility.utils import calculate_percentage
31
- from dataset.utility.utils import derive_assessment_from_state
32
- from dataset.utility.utils import get_timestamp_now
33
- from dataset.utility.utils import normalize_path
34
- from dataset.utility.utils import num_obligatory_dataset_fields_completed
35
- from dataset.utility.utils import num_obligatory_variables_fields_completed
36
- from dataset.utility.utils import set_default_values_dataset
37
- from dataset.utility.utils import set_default_values_variables
16
+ from dapla_metadata.datasets import config
17
+ from dapla_metadata.datasets import user_info
18
+ from dapla_metadata.datasets.dapla_dataset_path_info import DaplaDatasetPathInfo
19
+ from dapla_metadata.datasets.dataset_parser import DatasetParser
20
+ from dapla_metadata.datasets.model_backwards_compatibility import (
21
+ is_metadata_in_container_structure,
22
+ )
23
+ from dapla_metadata.datasets.model_backwards_compatibility import upgrade_metadata
24
+ from dapla_metadata.datasets.model_validation import ValidateDatadocMetadata
25
+ from dapla_metadata.datasets.statistic_subject_mapping import StatisticSubjectMapping
26
+ from dapla_metadata.datasets.utility.constants import (
27
+ DEFAULT_SPATIAL_COVERAGE_DESCRIPTION,
28
+ )
29
+ from dapla_metadata.datasets.utility.constants import INCONSISTENCIES_MESSAGE
30
+ from dapla_metadata.datasets.utility.constants import METADATA_DOCUMENT_FILE_SUFFIX
31
+ from dapla_metadata.datasets.utility.constants import NUM_OBLIGATORY_DATASET_FIELDS
32
+ from dapla_metadata.datasets.utility.constants import NUM_OBLIGATORY_VARIABLES_FIELDS
33
+ from dapla_metadata.datasets.utility.utils import calculate_percentage
34
+ from dapla_metadata.datasets.utility.utils import derive_assessment_from_state
35
+ from dapla_metadata.datasets.utility.utils import get_timestamp_now
36
+ from dapla_metadata.datasets.utility.utils import merge_variables
37
+ from dapla_metadata.datasets.utility.utils import normalize_path
38
+ from dapla_metadata.datasets.utility.utils import (
39
+ num_obligatory_dataset_fields_completed,
40
+ )
41
+ from dapla_metadata.datasets.utility.utils import (
42
+ num_obligatory_variables_fields_completed,
43
+ )
44
+ from dapla_metadata.datasets.utility.utils import override_dataset_fields
45
+ from dapla_metadata.datasets.utility.utils import set_default_values_dataset
46
+ from dapla_metadata.datasets.utility.utils import set_default_values_variables
38
47
 
39
48
  if TYPE_CHECKING:
40
49
  import pathlib
@@ -138,10 +147,11 @@ class Datadoc:
138
147
  """
139
148
  extracted_metadata: model.DatadocMetadata | None = None
140
149
  existing_metadata: model.DatadocMetadata | None = None
141
- if self.metadata_document is not None and self.metadata_document.exists():
150
+ if self.metadata_document and self.metadata_document.exists():
142
151
  existing_metadata = self._extract_metadata_from_existing_document(
143
152
  self.metadata_document,
144
153
  )
154
+
145
155
  if (
146
156
  self.dataset_path is not None
147
157
  and self.dataset == model.Dataset()
@@ -157,14 +167,7 @@ class Datadoc:
157
167
  and extracted_metadata is not None
158
168
  and existing_metadata is not None
159
169
  ):
160
- if (
161
- extracted_metadata.dataset is not None
162
- and extracted_metadata.dataset.file_path is not None
163
- ):
164
- existing_file_path = extracted_metadata.dataset.file_path
165
- else:
166
- msg = "Could not access existing dataset file path"
167
- raise ValueError(msg)
170
+ existing_file_path = self._get_existing_file_path(extracted_metadata)
168
171
  self._check_ready_to_merge(
169
172
  self.dataset_path,
170
173
  Path(existing_file_path),
@@ -181,31 +184,39 @@ class Datadoc:
181
184
  self.metadata_document = self.build_metadata_document_path(
182
185
  self.dataset_path,
183
186
  )
184
- if merged_metadata.dataset and merged_metadata.variables:
185
- self.dataset = merged_metadata.dataset
186
- self.variables = merged_metadata.variables
187
- else:
188
- msg = "Could not read metadata"
189
- raise ValueError(msg)
190
- elif (
191
- existing_metadata
192
- and existing_metadata.dataset
193
- and existing_metadata.variables
187
+ self._set_metadata(merged_metadata)
188
+ else:
189
+ self._set_metadata(existing_metadata or extracted_metadata)
190
+ set_default_values_variables(self.variables)
191
+ set_default_values_dataset(self.dataset)
192
+ self._create_variables_lookup()
193
+
194
+ def _get_existing_file_path(
195
+ self,
196
+ extracted_metadata: model.DatadocMetadata | None,
197
+ ) -> str:
198
+ if (
199
+ extracted_metadata is not None
200
+ and extracted_metadata.dataset is not None
201
+ and extracted_metadata.dataset.file_path is not None
194
202
  ):
195
- self.dataset = existing_metadata.dataset
196
- self.variables = existing_metadata.variables
197
- elif (
198
- extracted_metadata
199
- and extracted_metadata.dataset
200
- and extracted_metadata.variables
203
+ return extracted_metadata.dataset.file_path
204
+ msg = "Could not access existing dataset file path"
205
+ raise ValueError(msg)
206
+
207
+ def _set_metadata(
208
+ self,
209
+ merged_metadata: model.DatadocMetadata | None,
210
+ ) -> None:
211
+ if not merged_metadata or not (
212
+ merged_metadata.dataset and merged_metadata.variables
201
213
  ):
202
- self.dataset = extracted_metadata.dataset
203
- self.variables = extracted_metadata.variables
204
- else:
205
214
  msg = "Could not read metadata"
206
215
  raise ValueError(msg)
207
- set_default_values_variables(self.variables)
208
- set_default_values_dataset(self.dataset)
216
+ self.dataset = merged_metadata.dataset
217
+ self.variables = merged_metadata.variables
218
+
219
+ def _create_variables_lookup(self) -> None:
209
220
  self.variables_lookup = {
210
221
  v.short_name: v for v in self.variables if v.short_name
211
222
  }
@@ -300,55 +311,28 @@ class Datadoc:
300
311
  "No existing metadata found, no merge to perform. Continuing with extracted metadata.",
301
312
  )
302
313
  return extracted_metadata or model.DatadocMetadata()
314
+
303
315
  if not extracted_metadata:
304
316
  return existing_metadata
317
+
305
318
  # Use the extracted metadata as a base
306
319
  merged_metadata = model.DatadocMetadata(
307
320
  dataset=copy.deepcopy(extracted_metadata.dataset),
308
321
  variables=[],
309
322
  )
310
- if (
311
- merged_metadata.dataset is not None
312
- and existing_metadata.dataset is not None
313
- ):
314
- # Override the fields as defined
315
- for field in DATASET_FIELDS_FROM_EXISTING_METADATA:
316
- setattr(
317
- merged_metadata.dataset,
318
- field,
319
- getattr(existing_metadata.dataset, field),
320
- )
323
+
324
+ override_dataset_fields(
325
+ merged_metadata=merged_metadata,
326
+ existing_metadata=existing_metadata,
327
+ )
321
328
 
322
329
  # Merge variables.
323
330
  # For each extracted variable, copy existing metadata into the merged metadata
324
- if (
325
- existing_metadata.variables is not None
326
- and extracted_metadata is not None
327
- and extracted_metadata.variables is not None
328
- and merged_metadata.variables is not None
329
- ):
330
- for extracted in extracted_metadata.variables:
331
- existing = next(
332
- (
333
- existing
334
- for existing in existing_metadata.variables
335
- if existing.short_name == extracted.short_name
336
- ),
337
- None,
338
- )
339
- if existing:
340
- existing.id = None # Set to None so that it will be set assigned a fresh ID later
341
- existing.contains_data_from = (
342
- extracted.contains_data_from or existing.contains_data_from
343
- )
344
- existing.contains_data_until = (
345
- extracted.contains_data_until or existing.contains_data_until
346
- )
347
- merged_metadata.variables.append(existing)
348
- else:
349
- # If there is no existing metadata for this variable, we just use what we have extracted
350
- merged_metadata.variables.append(extracted)
351
- return merged_metadata
331
+ return merge_variables(
332
+ existing_metadata=existing_metadata,
333
+ extracted_metadata=extracted_metadata,
334
+ merged_metadata=merged_metadata,
335
+ )
352
336
 
353
337
  def _extract_metadata_from_existing_document(
354
338
  self,
@@ -19,7 +19,7 @@ from datadoc_model.model import LanguageStringTypeItem
19
19
  from datadoc_model.model import Variable
20
20
  from pyarrow import parquet as pq
21
21
 
22
- from dataset.utility.enums import SupportedLanguages
22
+ from dapla_metadata.datasets.utility.enums import SupportedLanguages
23
23
 
24
24
  if TYPE_CHECKING:
25
25
  import pyarrow as pa
@@ -11,17 +11,23 @@ from datadoc_model import model
11
11
  from pydantic import model_validator
12
12
  from typing_extensions import Self
13
13
 
14
- from dataset.utility.constants import DATE_VALIDATION_MESSAGE
15
- from dataset.utility.constants import NUM_OBLIGATORY_DATASET_FIELDS
16
- from dataset.utility.constants import NUM_OBLIGATORY_VARIABLES_FIELDS
17
- from dataset.utility.constants import OBLIGATORY_METADATA_WARNING
18
- from dataset.utility.utils import get_missing_obligatory_dataset_fields
19
- from dataset.utility.utils import get_missing_obligatory_variables_fields
20
- from dataset.utility.utils import get_timestamp_now
21
- from dataset.utility.utils import incorrect_date_order
22
- from dataset.utility.utils import num_obligatory_dataset_fields_completed
23
- from dataset.utility.utils import num_obligatory_variables_fields_completed
24
- from dataset.utility.utils import set_variables_inherit_from_dataset
14
+ from dapla_metadata.datasets.utility.constants import DATE_VALIDATION_MESSAGE
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
+ from dapla_metadata.datasets.utility.constants import OBLIGATORY_METADATA_WARNING
18
+ from dapla_metadata.datasets.utility.utils import get_missing_obligatory_dataset_fields
19
+ from dapla_metadata.datasets.utility.utils import (
20
+ get_missing_obligatory_variables_fields,
21
+ )
22
+ from dapla_metadata.datasets.utility.utils import get_timestamp_now
23
+ from dapla_metadata.datasets.utility.utils import incorrect_date_order
24
+ from dapla_metadata.datasets.utility.utils import (
25
+ num_obligatory_dataset_fields_completed,
26
+ )
27
+ from dapla_metadata.datasets.utility.utils import (
28
+ num_obligatory_variables_fields_completed,
29
+ )
30
+ from dapla_metadata.datasets.utility.utils import set_variables_inherit_from_dataset
25
31
 
26
32
  if TYPE_CHECKING:
27
33
  from datetime import datetime
@@ -9,8 +9,8 @@ import requests
9
9
  from bs4 import BeautifulSoup
10
10
  from bs4 import ResultSet
11
11
 
12
- from dataset.external_sources.external_sources import GetExternalSource
13
- from dataset.utility.enums import SupportedLanguages
12
+ from dapla_metadata.datasets.external_sources.external_sources import GetExternalSource
13
+ from dapla_metadata.datasets.utility.enums import SupportedLanguages
14
14
 
15
15
  if TYPE_CHECKING:
16
16
  from concurrent.futures import ThreadPoolExecutor
@@ -116,17 +116,18 @@ class StatisticSubjectMapping(GetExternalSource):
116
116
 
117
117
  Returns a BeautifulSoup ResultSet.
118
118
  """
119
+ if not self.source_url:
120
+ logger.debug("No statistic subject url supplied")
121
+ return None
122
+
119
123
  try:
120
- url = str(self.source_url)
121
- response = requests.get(url, timeout=30)
124
+ response = requests.get(str(self.source_url), timeout=30)
122
125
  response.encoding = "utf-8"
123
- logger.debug("Got response %s from %s", response, url)
126
+ logger.debug("Got response %s from %s", response, self.source_url)
124
127
  soup = BeautifulSoup(response.text, features="xml")
125
128
  return soup.find_all("hovedemne")
126
129
  except requests.exceptions.RequestException:
127
- logger.exception(
128
- "Exception while fetching statistical structure ",
129
- )
130
+ logger.exception("Exception while fetching statistical structure")
130
131
  return None
131
132
 
132
133
  def _parse_statistic_subject_structure_xml(
@@ -6,9 +6,9 @@ from typing import Protocol
6
6
 
7
7
  import jwt
8
8
 
9
- from dataset import config
10
- from dataset.utility.enums import DaplaRegion
11
- from dataset.utility.enums import DaplaService
9
+ from dapla_metadata.datasets import config
10
+ from dapla_metadata.datasets.utility.enums import DaplaRegion
11
+ from dapla_metadata.datasets.utility.enums import DaplaService
12
12
 
13
13
  logger = logging.getLogger(__name__)
14
14
 
@@ -90,3 +90,7 @@ DATASET_FIELDS_FROM_EXISTING_METADATA = [
90
90
  ]
91
91
 
92
92
  METADATA_DOCUMENT_FILE_SUFFIX = "__DOC.json"
93
+
94
+ DATADOC_STATISTICAL_SUBJECT_SOURCE_URL = (
95
+ "https://www.ssb.no/xp/_/service/mimir/subjectStructurStatistics"
96
+ )
@@ -14,13 +14,20 @@ 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 dataset.utility.constants import NUM_OBLIGATORY_VARIABLES_FIELDS
18
- from dataset.utility.constants import OBLIGATORY_DATASET_METADATA_IDENTIFIERS
19
- from dataset.utility.constants import (
17
+ from dapla_metadata.datasets.utility.constants import (
18
+ DATASET_FIELDS_FROM_EXISTING_METADATA,
19
+ )
20
+ from dapla_metadata.datasets.utility.constants import NUM_OBLIGATORY_VARIABLES_FIELDS
21
+ from dapla_metadata.datasets.utility.constants import (
22
+ OBLIGATORY_DATASET_METADATA_IDENTIFIERS,
23
+ )
24
+ from dapla_metadata.datasets.utility.constants import (
20
25
  OBLIGATORY_DATASET_METADATA_IDENTIFIERS_MULTILANGUAGE,
21
26
  )
22
- from dataset.utility.constants import OBLIGATORY_VARIABLES_METADATA_IDENTIFIERS
23
- from dataset.utility.constants import (
27
+ from dapla_metadata.datasets.utility.constants import (
28
+ OBLIGATORY_VARIABLES_METADATA_IDENTIFIERS,
29
+ )
30
+ from dapla_metadata.datasets.utility.constants import (
24
31
  OBLIGATORY_VARIABLES_METADATA_IDENTIFIERS_MULTILANGUAGE,
25
32
  )
26
33
 
@@ -403,3 +410,83 @@ def running_in_notebook() -> bool:
403
410
  # interpreters and will throw a NameError. Therefore we're not running
404
411
  # in Jupyter.
405
412
  return False
413
+
414
+
415
+ def override_dataset_fields(
416
+ merged_metadata: model.DatadocMetadata,
417
+ existing_metadata: model.DatadocMetadata,
418
+ ) -> None:
419
+ """Overrides specific fields in the dataset of `merged_metadata` with values from the dataset of `existing_metadata`.
420
+
421
+ This function iterates over a predefined list of fields, `DATASET_FIELDS_FROM_EXISTING_METADATA`,
422
+ and sets the corresponding fields in the `merged_metadata.dataset` object to the values
423
+ from the `existing_metadata.dataset` object.
424
+
425
+ Args:
426
+ merged_metadata: An instance of `DatadocMetadata` containing the dataset to be updated.
427
+ existing_metadata: An instance of `DatadocMetadata` containing the dataset whose values are used to update `merged_metadata.dataset`.
428
+
429
+ Returns:
430
+ `None`.
431
+ """
432
+ if merged_metadata.dataset and existing_metadata.dataset:
433
+ # Override the fields as defined
434
+ for field in DATASET_FIELDS_FROM_EXISTING_METADATA:
435
+ setattr(
436
+ merged_metadata.dataset,
437
+ field,
438
+ getattr(existing_metadata.dataset, field),
439
+ )
440
+
441
+
442
+ def merge_variables(
443
+ existing_metadata: model.DatadocMetadata,
444
+ extracted_metadata: model.DatadocMetadata,
445
+ merged_metadata: model.DatadocMetadata,
446
+ ) -> model.DatadocMetadata:
447
+ """Merges variables from the extracted metadata into the existing metadata and updates the merged metadata.
448
+
449
+ This function compares the variables from `extracted_metadata` with those in `existing_metadata`.
450
+ For each variable in `extracted_metadata`, it checks if a variable with the same `short_name` exists
451
+ in `existing_metadata`. If a match is found, it updates the existing variable with information from
452
+ `extracted_metadata`. If no match is found, the variable from `extracted_metadata` is directly added to `merged_metadata`.
453
+
454
+ Args:
455
+ existing_metadata: The metadata object containing the current state of variables.
456
+ extracted_metadata: The metadata object containing new or updated variables to merge.
457
+ merged_metadata: The metadata object that will contain the result of the merge.
458
+
459
+ Returns:
460
+ model.DatadocMetadata: The `merged_metadata` object containing variables from both `existing_metadata`
461
+ and `extracted_metadata`.
462
+ """
463
+ if (
464
+ existing_metadata.variables is not None
465
+ and extracted_metadata is not None
466
+ and extracted_metadata.variables is not None
467
+ and merged_metadata.variables is not None
468
+ ):
469
+ for extracted in extracted_metadata.variables:
470
+ existing = next(
471
+ (
472
+ existing
473
+ for existing in existing_metadata.variables
474
+ if existing.short_name == extracted.short_name
475
+ ),
476
+ None,
477
+ )
478
+ if existing:
479
+ existing.id = (
480
+ None # Set to None so that it will be set assigned a fresh ID later
481
+ )
482
+ existing.contains_data_from = (
483
+ extracted.contains_data_from or existing.contains_data_from
484
+ )
485
+ existing.contains_data_until = (
486
+ extracted.contains_data_until or existing.contains_data_until
487
+ )
488
+ merged_metadata.variables.append(existing)
489
+ else:
490
+ # If there is no existing metadata for this variable, we just use what we have extracted
491
+ merged_metadata.variables.append(extracted)
492
+ return merged_metadata
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dapla-toolbelt-metadata
3
- Version: 0.1.2
3
+ Version: 0.2.1
4
4
  Summary: Dapla Toolbelt Metadata
5
5
  Home-page: https://github.com/statisticsnorway/dapla-toolbelt-metadata
6
6
  License: MIT
@@ -15,30 +15,17 @@ Classifier: Programming Language :: Python :: 3.11
15
15
  Classifier: Programming Language :: Python :: 3.12
16
16
  Requires-Dist: arrow (>=1.3.0)
17
17
  Requires-Dist: beautifulsoup4 (>=4.12.3)
18
- Requires-Dist: black (>=24.8.0,<25.0.0)
19
- Requires-Dist: bs4 (>=0.0.2,<0.0.3)
20
- Requires-Dist: click (>=8.0.1)
21
18
  Requires-Dist: cloudpathlib[gs] (>=0.17.0)
22
- Requires-Dist: coverage (>=7.6.1,<8.0.0)
23
19
  Requires-Dist: dapla-toolbelt (>=1.3.3)
24
- Requires-Dist: faker (>=26.1.0,<27.0.0)
25
- Requires-Dist: furo (>=2024.7.18,<2025.0.0)
26
- Requires-Dist: gunicorn (>=21.2.0)
27
20
  Requires-Dist: pandas (>=1.4.2)
28
- Requires-Dist: pre-commit (>=3.8.0,<4.0.0)
29
21
  Requires-Dist: pyarrow (>=8.0.0)
30
22
  Requires-Dist: pydantic (>=2.5.2)
31
- Requires-Dist: pygments (>=2.18.0,<3.0.0)
32
23
  Requires-Dist: pyjwt (>=2.8.0)
33
- Requires-Dist: pytest (>=8.3.2,<9.0.0)
34
- Requires-Dist: pytest-mock (>=3.14.0,<4.0.0)
35
24
  Requires-Dist: python-dotenv (>=1.0.1)
36
25
  Requires-Dist: requests (>=2.31.0)
37
- Requires-Dist: requests-mock (>=1.12.1,<2.0.0)
38
- Requires-Dist: ruff (>=0.5.6,<0.6.0)
39
26
  Requires-Dist: ssb-datadoc-model (>=6.0.0,<7.0.0)
40
27
  Requires-Dist: ssb-klass-python (>=0.0.9)
41
- Requires-Dist: types-beautifulsoup4 (>=4.12.0.20240511,<5.0.0.0)
28
+ Requires-Dist: typing-extensions (>=4.12.2)
42
29
  Project-URL: Changelog, https://github.com/statisticsnorway/dapla-toolbelt-metadata/releases
43
30
  Project-URL: Documentation, https://statisticsnorway.github.io/dapla-toolbelt-metadata
44
31
  Project-URL: Repository, https://github.com/statisticsnorway/dapla-toolbelt-metadata
@@ -71,14 +58,16 @@ Description-Content-Type: text/markdown
71
58
  [black]: https://github.com/psf/black
72
59
  [poetry]: https://python-poetry.org/
73
60
 
61
+ Tools and clients for working with the Dapla Metadata system.
62
+
74
63
  ## Features
75
64
 
76
- - TODO
65
+ - Create and update metadata for datasets (Datadoc).
77
66
 
78
- ## Requirements
67
+ ### Coming
79
68
 
80
- - TODO
81
- - Python
69
+ - Read, create and update variable definitions.
70
+ - Publish dataset metadata to Statistics Norway's data catalogue.
82
71
 
83
72
  ## Installation
84
73
 
@@ -90,7 +79,7 @@ pip install dapla-toolbelt-metadata
90
79
 
91
80
  ## Usage
92
81
 
93
- Please see the [Reference Guide] for details.
82
+ Instructions and examples may be found in the [Dapla Manual](https://manual.dapla.ssb.no/statistikkere/). Please see the [Reference Guide] for API documentation.
94
83
 
95
84
  ## Contributing
96
85
 
@@ -0,0 +1,22 @@
1
+ dapla_metadata/__init__.py,sha256=sGQ4msqsvSa-f2fs-og8KRsD97TP_yKz1YT8q9od2HM,137
2
+ dapla_metadata/datasets/__init__.py,sha256=TvzskpdFC6hGcC9_55URT5jr5wNAPzXuISd2UjJWM_8,280
3
+ dapla_metadata/datasets/code_list.py,sha256=kp1O6sUiUAP9WKlWY8IgHWx_1IOzJA63WveHqolgKmg,9082
4
+ dapla_metadata/datasets/config.py,sha256=0YrhmsCYRWU75bPr5Cb8qgU7HUvIMTEiMXiCoQ-REgQ,2161
5
+ dapla_metadata/datasets/core.py,sha256=GVqK7zH94ch9fJvhf04L61nNBk48XpjdmAZrY6lvj6I,21582
6
+ dapla_metadata/datasets/dapla_dataset_path_info.py,sha256=7wwVwykJUaRbqCZrAMsZsOd1p_xO8bHe5LhNOLE8j6k,21600
7
+ dapla_metadata/datasets/dataset_parser.py,sha256=PhhGvkUrmQ2nypYgg4JWushb7gFvde65XbRhmXdPZUI,7965
8
+ dapla_metadata/datasets/external_sources/__init__.py,sha256=qvIdXwqyEmXNUCB94ZtZXRzifdW4hiXASFFPtC70f6E,83
9
+ dapla_metadata/datasets/external_sources/external_sources.py,sha256=9eIcOIUbaodNX1w9Tj2wl4U4wUmr5kF1R0i01fKUzGs,2974
10
+ dapla_metadata/datasets/model_backwards_compatibility.py,sha256=69RKZwOrSyaBQvMCjOZiM-S-clVQu8cIKOUGGpI_87Y,19171
11
+ dapla_metadata/datasets/model_validation.py,sha256=j0yHxiV3QusAwzohUG-pSq-6ojhynnto0z_dD5cSnVs,6875
12
+ dapla_metadata/datasets/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ dapla_metadata/datasets/statistic_subject_mapping.py,sha256=QdC22DUBOdRgsfmTTEUr9CKCE8fKjMq6-Ezdr6Eof_A,6254
14
+ dapla_metadata/datasets/user_info.py,sha256=6cjIhYHUQmCKnhBjvH6GN3B6H3J-pOjc9NdQcs-NGsE,2589
15
+ dapla_metadata/datasets/utility/__init__.py,sha256=pp6tUcgUbo8iq9OPtFKQrTbLuI3uY7NHptwWSTpasOU,33
16
+ dapla_metadata/datasets/utility/constants.py,sha256=V9ixHTShK1uBcSesaVoKDSHzAh3CX1ATO-Z3wZHxAKs,2417
17
+ dapla_metadata/datasets/utility/enums.py,sha256=C-qlB9ZI4Oy3q1ehbuF0GD7lqJJbuaspY_e8BDFu5DU,727
18
+ dapla_metadata/datasets/utility/utils.py,sha256=wCRZBB3YwXTB_BaqDABaaeBjVmMZP8z3grjfTxX308k,18018
19
+ dapla_toolbelt_metadata-0.2.1.dist-info/LICENSE,sha256=np3IfD5m0ZUofn_kVzDZqliozuiO6wrktw3LRPjyEiI,1073
20
+ dapla_toolbelt_metadata-0.2.1.dist-info/METADATA,sha256=f-MfoB7t5lS8BJvjQkt7XyMCnHAYu75_PYnwcXhnOoA,4935
21
+ dapla_toolbelt_metadata-0.2.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
22
+ dapla_toolbelt_metadata-0.2.1.dist-info/RECORD,,
@@ -1,21 +0,0 @@
1
- dataset/__init__.py,sha256=TvzskpdFC6hGcC9_55URT5jr5wNAPzXuISd2UjJWM_8,280
2
- dataset/code_list.py,sha256=SqzassTXL-Gr4TqomXStJFiI5gSN0lXjbmZLDJadMrQ,9050
3
- dataset/config.py,sha256=Yu6AyeJdXsPLJzoxyhsjfj3CUMM6eDb5bNYen3i-omg,2015
4
- dataset/core.py,sha256=E7OmFM1iTKlKuvQXuwhucO3z5pKg8fTkE2TmOYFi7_M,22654
5
- dataset/dapla_dataset_path_info.py,sha256=7wwVwykJUaRbqCZrAMsZsOd1p_xO8bHe5LhNOLE8j6k,21600
6
- dataset/dataset_parser.py,sha256=AvN4cKaDvP4VwplNR5uvXJdiZh4ippNcFTBll-HhH-4,7949
7
- dataset/external_sources/__init__.py,sha256=qvIdXwqyEmXNUCB94ZtZXRzifdW4hiXASFFPtC70f6E,83
8
- dataset/external_sources/external_sources.py,sha256=9eIcOIUbaodNX1w9Tj2wl4U4wUmr5kF1R0i01fKUzGs,2974
9
- dataset/model_backwards_compatibility.py,sha256=69RKZwOrSyaBQvMCjOZiM-S-clVQu8cIKOUGGpI_87Y,19171
10
- dataset/model_validation.py,sha256=uj98wiz9SWbJc_He3kGGejy4JIIXM6RKaSccJfmo6wc,6672
11
- dataset/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
- dataset/statistic_subject_mapping.py,sha256=aOKQLvVNF4XWqVrDXVFUz-Hj_me6JeWW_uEPAKJvVJk,6145
13
- dataset/user_info.py,sha256=42PikdAQzC1FLOISC49yZO0IgVMWIq_QgxVD0xixaes,2541
14
- dataset/utility/__init__.py,sha256=pp6tUcgUbo8iq9OPtFKQrTbLuI3uY7NHptwWSTpasOU,33
15
- dataset/utility/constants.py,sha256=Wv1LIqq2P7ow6sToNdrTOAIMqvyPxNS2j6ArIB-GMds,2301
16
- dataset/utility/enums.py,sha256=C-qlB9ZI4Oy3q1ehbuF0GD7lqJJbuaspY_e8BDFu5DU,727
17
- dataset/utility/utils.py,sha256=j2A6DOgb4MmKaEGd5qW8DHxUsTZrZFLLAsvPW1BQIc0,14269
18
- dapla_toolbelt_metadata-0.1.2.dist-info/LICENSE,sha256=np3IfD5m0ZUofn_kVzDZqliozuiO6wrktw3LRPjyEiI,1073
19
- dapla_toolbelt_metadata-0.1.2.dist-info/METADATA,sha256=0L1tZ6_9p6ZMvFI-Zdc5fvClf_eRISrdWVrDzGXGemU,5158
20
- dapla_toolbelt_metadata-0.1.2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
21
- dapla_toolbelt_metadata-0.1.2.dist-info/RECORD,,
File without changes
File without changes
File without changes
File without changes