Skip to content

Commit 27de76d

Browse files
update to ssno v2.1.0
1 parent fe04375 commit 27de76d

File tree

11 files changed

+91
-23
lines changed

11 files changed

+91
-23
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
Log of changes in the versions
44

5+
## v2.1.0.0
6+
- update to ssno v2.1.0
7+
58
## v2.0.0.0
69

710
- update to ssno v2.0.0

CITATION.cff

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ authors:
55
given-names: "Matthias"
66
orcid: "https://orcid.org/0000-0001-8729-0482"
77
title: "ssnolib"
8-
version: 2.0.0.0
9-
doi: 10.5281/zenodo.17434452
10-
date-released: 2025-10-27
8+
version: 2.1.0.0
9+
doi: 10.5281/zenodo.17467919
10+
date-released: 2025-10-28
1111
url: "https://github.com/matthiasprobst/ssnolib"

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
![Tests](https://github.com/matthiasprobst/SSNOlib/actions/workflows/tests.yml/badge.svg)
44
![Coverage](https://codecov.io/gh/matthiasprobst/SSNOlib/branch/main/graph/badge.svg)
55
![Python Versions](https://img.shields.io/badge/python-3.8%20%7C%203.9%20%7C%203.10%20%7C%203.11%20%7C%203.12%20%7C%203.13-blue)
6-
![SSNO Version](https://img.shields.io/badge/ssno-2.0.0-orange)
6+
![SSNO Version](https://img.shields.io/badge/ssno-2.1.0-orange)
77
![License](https://img.shields.io/github/license/matthiasprobst/SSNOlib)
88

9-
A Python library to work with the [SSNO ontology](https://matthiasprobst.github.io/ssno/2.0.0). It provides Python classes for ontology concepts and facilitates the creation of RDF files (JSON-LD, TTL, XML). RDF files are both human- and machine-readable, and most importantly, machine-actionable. The library can be integrated into your data (conversion) pipelines.
9+
A Python library to work with the [SSNO ontology](https://matthiasprobst.github.io/ssno/2.1.0). It provides Python classes for ontology concepts and facilitates the creation of RDF files (JSON-LD, TTL, XML). RDF files are both human- and machine-readable, and most importantly, machine-actionable. The library can be integrated into your data (conversion) pipelines.
1010

1111
## Features
1212
- Python classes for all SSNO ontology concepts

codemeta.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"license": "https://spdx.org/licenses/MIT",
55
"codeRepository": "git+https://github.com/matthiasprobst/ssnolib",
66
"name": "ssnolib",
7-
"version": "2.0.0.0",
7+
"version": "2.1.0.0",
88
"description": "Python library for working with the SSNO ontology. ",
99
"applicationCategory": "Engineering",
1010
"programmingLanguage": [

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[metadata]
22
name = ssnolib
3-
version = 2.0.0.0
3+
version = 2.1.0.0
44
author = Matthias Probst
55
author_email = matthias.probst@kit.edu
66
description = SSNOlib is a Python library for working with the Standard Name Ontology (SSNO).

ssnolib/hdf5/allotrope.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
from typing import Optional, Union, List, Tuple, Any
22

33
from ontolutils import Thing, namespaces, urirefs
4-
from pydantic import Field
5-
from pydantic import field_validator
4+
from ontolutils.typing import ResourceType
5+
from pydantic import Field, field_validator
66
from pydantic.functional_validators import WrapValidator
77
from typing_extensions import Annotated
88

9-
from .. import StandardNameTable
9+
from .. import StandardNameTable, StandardName
1010
from ..dcat import Dataset as DcatDataset
1111

1212

@@ -26,12 +26,19 @@ def is_hdf5_root_path(path: str, handler):
2626
HDF5RootPath = Annotated[str, WrapValidator(is_internal_hdf5_path)]
2727

2828

29-
@namespaces(hdf5="http://purl.allotrope.org/ontologies/hdf5/1.8#")
29+
@namespaces(
30+
ssno="https://matthiasprobst.github.io/ssno#",
31+
hdf5="http://purl.allotrope.org/ontologies/hdf5/1.8#"
32+
)
3033
@urirefs(Dataset='hdf5:Dataset',
31-
name='hdf5:name')
34+
name='hdf5:name',
35+
standardName="ssno:standardName",
36+
hasStandardName="ssno:hasStandardName")
3237
class Dataset(Thing):
3338
"""Dataset"""
3439
name: HDF5Path
40+
standardName: Optional[str] = Field(default=None, alias="standard_name")
41+
hasStandardName: Optional[Union[ResourceType, StandardName]] = Field(alias="has_standard_name", default=None)
3542

3643

3744
@namespaces(hdf5="http://purl.allotrope.org/ontologies/hdf5/1.8#")

ssnolib/m4i/variable.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from typing import Optional, Union, List
33

44
from ontolutils import namespaces, urirefs, parse_unit, LangString
5+
from ontolutils.typing import ResourceType
56
from pydantic import Field, field_validator
67

78
from ssnolib.pimsii import Variable
@@ -38,7 +39,7 @@ class NumericalVariable(Variable):
3839
hasUnit: Optional[str] = Field(alias="has_unit", default=None)
3940
hasNumericalValue: Optional[Union[float, List[float]]] = Field(alias="has_numerical_value", default=None)
4041
hasMaximumValue: Optional[float] = Field(alias="has_maximum_value", default=None)
41-
hasStandardName: Optional[StandardName] = Field(alias="has_standard_name", default=None)
42+
hasStandardName: Optional[Union[ResourceType, StandardName]] = Field(alias="has_standard_name", default=None)
4243

4344
@field_validator("hasUnit", mode='before')
4445
@classmethod

ssnolib/pimsii/property.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from typing import Union, Optional
22

33
from ontolutils import namespaces, urirefs
4+
from ontolutils.typing import ResourceType
45
from pydantic import Field, HttpUrl, field_validator
56

67
from ssnolib.ssno import StandardName
@@ -12,11 +13,4 @@
1213
@urirefs(Property='pims:Property',
1314
hasStandardName='ssno:hasStandardName')
1415
class Property(Variable):
15-
hasStandardName: Optional[Union[StandardName, HttpUrl]] = Field(alias="has_standard_name", default=None)
16-
17-
@field_validator("hasStandardName", mode='before')
18-
@classmethod
19-
def _hasStandardName(cls, hasStandardName: Union[StandardName, HttpUrl, str], cfg):
20-
if isinstance(hasStandardName, StandardName):
21-
return hasStandardName
22-
return str(HttpUrl(hasStandardName))
16+
hasStandardName: Optional[Union[StandardName, ResourceType]] = Field(alias="has_standard_name", default=None)

ssnolib/pimsii/variable.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
11
from typing import Optional, Union, List
22

33
from ontolutils import Thing, namespaces, urirefs, LangString
4+
from ontolutils.typing import ResourceType
45
from pydantic import Field
56

7+
from ssnolib.ssno.standard_name import StandardName
8+
69

710
@namespaces(pims="http://www.molmod.info/semantics/pims-ii.ttl#",
8-
m4i="http://w3id.org/nfdi4ing/metadata4ing#")
11+
m4i="http://w3id.org/nfdi4ing/metadata4ing#",
12+
ssno="https://matthiasprobst.github.io/ssno#")
913
@urirefs(Variable='pims:Variable',
1014
hasVariableDescription='m4i:hasVariableDescription',
1115
hasSymbol='m4i:hasSymbol',
1216
hasValue='m4i:hasValue',
17+
hasStandardName='ssno:hasStandardName'
1318
)
1419
class Variable(Thing):
15-
hasVariableDescription: Optional[Union[LangString, List[LangString]]] = Field(default=None, alias="has_variable_description")
20+
hasVariableDescription: Optional[Union[LangString, List[LangString]]] = Field(default=None,
21+
alias="has_variable_description")
1622
hasSymbol: Optional[str] = Field(default=None, alias="has_symbol")
1723
hasValue: Optional[Union[int, float]] = Field(default=None, alias="has_value")
24+
hasStandardName: Optional[Union[StandardName, ResourceType]] = Field(default=None, alias="has_standard_name")

tests/test_hdf5.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import pydantic
44

5+
from ssnolib import StandardName
56
from ssnolib.hdf5 import File, Dataset, Group
67

78

@@ -23,7 +24,61 @@ def testDataset(self):
2324
ds1 = Dataset(name='/Dataset1')
2425
self.assertEqual(ds1.name, '/Dataset1')
2526

27+
ds2 = Dataset(name='/Group1/Dataset2', standard_name="x_velocity")
28+
self.assertEqual(ds2.name, '/Group1/Dataset2')
29+
self.assertEqual(ds2.standard_name, "x_velocity")
30+
self.assertEqual(ds2.serialize("ttl"), """@prefix hdf5: <http://purl.allotrope.org/ontologies/hdf5/1.8#> .
31+
@prefix ssno: <https://matthiasprobst.github.io/ssno#> .
32+
33+
[] a hdf5:Dataset ;
34+
hdf5:name "/Group1/Dataset2" ;
35+
ssno:standardName "x_velocity" .
36+
37+
""")
38+
39+
with self.assertRaises(pydantic.ValidationError):
40+
Dataset(name='/Group1/Dataset3', has_standard_name="x_velocity")
41+
42+
ds3 = Dataset(name='/Group1/Dataset3',
43+
has_standard_name=StandardName(standard_name="y_velocity",
44+
unit="http://qudt.org/vocab/unit/M-PER-SEC")
45+
)
46+
self.assertEqual(ds3.name, '/Group1/Dataset3')
47+
self.assertEqual(ds3.has_standard_name.standard_name, "y_velocity")
48+
self.assertEqual(ds3.has_standard_name.unit, "http://qudt.org/vocab/unit/M-PER-SEC")
49+
self.assertEqual(ds3.serialize("ttl"), """@prefix hdf5: <http://purl.allotrope.org/ontologies/hdf5/1.8#> .
50+
@prefix ssno: <https://matthiasprobst.github.io/ssno#> .
51+
52+
[] a hdf5:Dataset ;
53+
hdf5:name "/Group1/Dataset3" ;
54+
ssno:hasStandardName [ a ssno:StandardName ;
55+
ssno:standardName "y_velocity" ;
56+
ssno:unit <http://qudt.org/vocab/unit/M-PER-SEC> ] .
57+
58+
""")
59+
60+
sn = StandardName(id="https://doi.org/123/sn1",
61+
standard_name="z_velocity",
62+
unit="http://qudt.org/vocab/unit/M-PER-SEC")
63+
ds4 = Dataset(name='/Group1/Dataset4', has_standard_name=sn.id)
64+
self.assertEqual(ds4.name, '/Group1/Dataset4')
65+
self.assertEqual(ds4.has_standard_name, sn.id)
66+
self.assertEqual(ds4.serialize("ttl"), """@prefix hdf5: <http://purl.allotrope.org/ontologies/hdf5/1.8#> .
67+
@prefix ssno: <https://matthiasprobst.github.io/ssno#> .
68+
69+
[] a hdf5:Dataset ;
70+
hdf5:name "/Group1/Dataset4" ;
71+
ssno:hasStandardName <https://doi.org/123/sn1> .
72+
73+
""")
74+
2675
def testGroup(self):
2776
with self.assertRaises(pydantic.ValidationError):
2877
Group(name='Group1')
2978
grp1 = Group(name='/Group1')
79+
self.assertEqual(grp1.serialize("ttl"), """@prefix hdf5: <http://purl.allotrope.org/ontologies/hdf5/1.8#> .
80+
81+
[] a hdf5:Group ;
82+
hdf5:name "/Group1" .
83+
84+
""")

0 commit comments

Comments
 (0)