Skip to content

Commit 4af6766

Browse files
authored
Merge pull request #142 from octue/dcmi-changes
DCMI changes - update to use term_name, and use full range of available terms.
2 parents afc4c2d + 47aeeb1 commit 4af6766

File tree

6 files changed

+161
-28
lines changed

6 files changed

+161
-28
lines changed

lenses/lenses.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,25 @@ def _remove_dimension(arr, dim):
121121
return arr
122122

123123

124+
def _convert_dcmi_term_to_term_name(doc):
125+
"""Convert document.metadata entries from 'term' (capitalized label) to 'term_name' (lowercase name).
126+
127+
Old format: {"term": "Identifier", "value": "..."}
128+
New format: {"term_name": "identifier", "value": "..."}
129+
"""
130+
131+
if "document" not in doc or "metadata" not in doc["document"]:
132+
return doc
133+
134+
for entry in doc["document"]["metadata"]:
135+
if "term" in entry:
136+
# Convert capitalized label to lowercase name
137+
term_value = entry.pop("term")
138+
entry["term_name"] = term_value.lower()
139+
140+
return doc
141+
142+
124143
def alpha_3_to_alpha_4(doc):
125144
"""Convert documents compliant with alpha-3 to documents compliant with alpha-4"""
126145

@@ -130,6 +149,7 @@ def alpha_3_to_alpha_4(doc):
130149
_move_available_hub_heights_to_restricted,
131150
_rename_dimension_to_axis,
132151
_collapse_singleton_dimensions,
152+
_convert_dcmi_term_to_term_name,
133153
]
134154
for lens in lenses:
135155
doc = lens(doc)

power-curve-schema/examples/generic-120-3-with-extra-parameters.json

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,20 @@
22
"document": {
33
"metadata": [
44
{
5-
"term": "Identifier",
5+
"term_name": "identifier",
66
"value": "126b9e41-722f-49ab-9586-b55188adf420"
77
},
88
{
9-
"term": "Format",
9+
"term_name": "format",
1010
"value": "IEC61400-16-1"
1111
},
1212
{
13-
"term": "Source",
13+
"term_name": "source",
1414
"value": "Doc 12345 - Rev 01"
15+
},
16+
{
17+
"term_name": "type",
18+
"value": "Dataset"
1519
}
1620
]
1721
},

power-curve-schema/examples/generic-120-3.json

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,20 @@
22
"document": {
33
"metadata": [
44
{
5-
"term": "Identifier",
5+
"term_name": "identifier",
66
"value": "126b9e41-722f-49ab-9586-b55188adf420"
77
},
88
{
9-
"term": "Format",
9+
"term_name": "format",
1010
"value": "IEC61400-16-1"
1111
},
1212
{
13-
"term": "Source",
13+
"term_name": "source",
1414
"value": "Doc 12345 - Rev 01"
15+
},
16+
{
17+
"term_name": "type",
18+
"value": "Dataset"
1519
}
1620
]
1721
},

power-curve-schema/examples/generic-274-20.json

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,20 @@
22
"document": {
33
"metadata": [
44
{
5-
"term": "Identifier",
5+
"term_name": "identifier",
66
"value": "6d3ff892-8763-4448-aab9-ab8454bf6ec5"
77
},
88
{
9-
"term": "Format",
9+
"term_name": "format",
1010
"value": "IEC61400-16-1"
1111
},
1212
{
13-
"term": "Source",
13+
"term_name": "source",
1414
"value": "Doc 56789 - Rev 01"
15+
},
16+
{
17+
"term_name": "type",
18+
"value": "Dataset"
1519
}
1620
]
1721
},

power-curve-schema/schema.json

Lines changed: 60 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -538,31 +538,72 @@
538538
"properties": {
539539
"metadata": {
540540
"title": "Dublin-Core Metadata",
541-
"description": "Add metadata according to the Dublin Core Metadata Initiative (DCMI) elements/1.1. See https://www.dublincore.org/specifications/dublin-core/dcmi-terms/#section-3 for detailed information on each element.",
541+
"description": "Add metadata according to the Dublin Core Metadata Initiative (DCMI) terms. See https://www.dublincore.org/specifications/dublin-core/dcmi-terms/ for detailed information on each term.",
542542
"type": "array",
543543
"items": {
544544
"type": "object",
545-
"required": ["term", "value"],
545+
"required": ["term_name", "value"],
546546
"additionalProperties": false,
547547
"properties": {
548-
"term": {
549-
"title": "Term",
550-
"description": "The DCMI Element label",
548+
"term_name": {
549+
"title": "Term Name",
550+
"description": "The DCMI Term or Element name (see https://www.dublincore.org/specifications/dublin-core/dcmi-terms/)",
551551
"enum": [
552-
"Contributor",
553-
"Coverage",
554-
"Creator",
555-
"Date",
556-
"Description",
557-
"Format",
558-
"Identifier",
559-
"Language",
560-
"Publisher",
561-
"Relation",
562-
"Rights",
563-
"Source",
564-
"Subject",
565-
"Type"
552+
"abstract",
553+
"accessRights",
554+
"accrualMethod",
555+
"accrualPeriodicity",
556+
"accrualPolicy",
557+
"alternative",
558+
"audience",
559+
"available",
560+
"bibliographicCitation",
561+
"conformsTo",
562+
"contributor",
563+
"coverage",
564+
"created",
565+
"creator",
566+
"date",
567+
"dateAccepted",
568+
"dateCopyrighted",
569+
"dateSubmitted",
570+
"description",
571+
"educationLevel",
572+
"extent",
573+
"format",
574+
"hasFormat",
575+
"hasPart",
576+
"hasVersion",
577+
"identifier",
578+
"instructionalMethod",
579+
"isFormatOf",
580+
"isPartOf",
581+
"isReferencedBy",
582+
"isReplacedBy",
583+
"isRequiredBy",
584+
"issued",
585+
"isVersionOf",
586+
"language",
587+
"license",
588+
"mediator",
589+
"medium",
590+
"modified",
591+
"provenance",
592+
"publisher",
593+
"references",
594+
"relation",
595+
"replaces",
596+
"requires",
597+
"rights",
598+
"rightsHolder",
599+
"source",
600+
"spatial",
601+
"subject",
602+
"tableOfContents",
603+
"temporal",
604+
"title",
605+
"type",
606+
"valid"
566607
]
567608
},
568609
"value": {

test/test_lenses.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
_add_power_reference_location,
1212
_change_shear_coefficient_to_vertical_shear_exponent,
1313
_collapse_singleton_dimensions,
14+
_convert_dcmi_term_to_term_name,
1415
_move_available_hub_heights_to_restricted,
1516
_rename_dimension_to_axis,
1617
)
@@ -218,3 +219,62 @@ def test_collapse_singleton_dimensions_no_singletons(generic_120_3_alpha_3):
218219
assert mode_after["parameters"][1] == mode_before["parameters"][1]
219220
assert mode_after["power"] == mode_before["power"]
220221
assert mode_after["thrust_coefficient"] == mode_before["thrust_coefficient"]
222+
223+
224+
def test_convert_dcmi_term_to_term_name(generic_120_3_alpha_3):
225+
"""Should convert 'term' property to 'term_name' and lowercase the value"""
226+
# Verify initial state - fixture has old format
227+
metadata = generic_120_3_alpha_3["document"]["metadata"]
228+
assert metadata[0]["term"] == "Identifier"
229+
assert metadata[1]["term"] == "Format"
230+
assert metadata[2]["term"] == "Source"
231+
232+
transformed = _convert_dcmi_term_to_term_name(generic_120_3_alpha_3)
233+
234+
metadata = transformed["document"]["metadata"]
235+
# Check term was renamed to term_name and lowercased
236+
assert "term" not in metadata[0]
237+
assert metadata[0]["term_name"] == "identifier"
238+
assert metadata[0]["value"] == "126b9e41-722f-49ab-9586-b55188adf420"
239+
240+
assert "term" not in metadata[1]
241+
assert metadata[1]["term_name"] == "format"
242+
assert metadata[1]["value"] == "IEC61400-16-1"
243+
244+
assert "term" not in metadata[2]
245+
assert metadata[2]["term_name"] == "source"
246+
assert metadata[2]["value"] == "Doc 12345 - Rev 01"
247+
248+
249+
def test_convert_dcmi_term_to_term_name_no_op_when_already_converted(generic_120_3_alpha_3):
250+
"""Should not modify documents that already use term_name"""
251+
# Convert to new format first
252+
generic_120_3_alpha_3["document"]["metadata"] = [
253+
{"term_name": "identifier", "value": "test-id"},
254+
{"term_name": "format", "value": "IEC61400-16-1"},
255+
]
256+
257+
metadata_before = copy.deepcopy(generic_120_3_alpha_3["document"]["metadata"])
258+
transformed = _convert_dcmi_term_to_term_name(generic_120_3_alpha_3)
259+
metadata_after = transformed["document"]["metadata"]
260+
261+
# Should be unchanged
262+
assert metadata_after == metadata_before
263+
264+
265+
def test_convert_dcmi_term_to_term_name_handles_missing_document(generic_120_3_alpha_3):
266+
"""Should handle documents without a document section gracefully"""
267+
del generic_120_3_alpha_3["document"]
268+
269+
# Should not raise an error
270+
transformed = _convert_dcmi_term_to_term_name(generic_120_3_alpha_3)
271+
assert "document" not in transformed
272+
273+
274+
def test_convert_dcmi_term_to_term_name_handles_missing_metadata(generic_120_3_alpha_3):
275+
"""Should handle documents without metadata section gracefully"""
276+
del generic_120_3_alpha_3["document"]["metadata"]
277+
278+
# Should not raise an error
279+
transformed = _convert_dcmi_term_to_term_name(generic_120_3_alpha_3)
280+
assert "metadata" not in transformed["document"]

0 commit comments

Comments
 (0)