Skip to content

Commit d79bf6c

Browse files
committed
feat: treat unitofmeasurement like other complex types
1 parent 2eef0f9 commit d79bf6c

7 files changed

Lines changed: 149 additions & 153 deletions

File tree

frost_sta_client/__init__.py

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,34 @@
1-
from frost_sta_client import model
2-
from frost_sta_client import dao
3-
from frost_sta_client import query
4-
from frost_sta_client import service
5-
6-
from frost_sta_client.model.actuator import Actuator
7-
from frost_sta_client.model.datastream import Datastream
8-
from frost_sta_client.model.entity import Entity
9-
from frost_sta_client.model.feature_of_interest import FeatureOfInterest
10-
from frost_sta_client.model.historical_location import HistoricalLocation
11-
from frost_sta_client.model.location import Location
12-
from frost_sta_client.model.multi_datastream import MultiDatastream
13-
from frost_sta_client.model.observation import Observation
14-
from frost_sta_client.model.observedproperty import ObservedProperty
15-
from frost_sta_client.model.sensor import Sensor
16-
from frost_sta_client.model.task import Task
17-
from frost_sta_client.model.tasking_capability import TaskingCapability
18-
from frost_sta_client.model.thing import Thing
19-
from frost_sta_client.model.ext.unitofmeasurement import UnitOfMeasurement
20-
from frost_sta_client.service.sensorthingsservice import SensorThingsService
21-
from frost_sta_client.service.auth_handler import AuthHandler
22-
from frost_sta_client.model.ext.entity_type import EntityTypes
23-
from frost_sta_client.model.ext.entity_list import EntityList
24-
from frost_sta_client.model.ext.data_array_value import DataArrayValue
25-
from frost_sta_client.model.ext.data_array_document import DataArrayDocument
26-
27-
import jsonpickle
28-
29-
jsonpickle.load_backend('demjson3', 'encode', 'decode', 'JSONDecodeError')
30-
jsonpickle.set_preferred_backend('demjson3')
31-
jsonpickle.set_decoder_options("demjson3", decode_float=float)
32-
33-
from .__version__ import (__title__, __version__, __license__, __author__, __contact__, __url__,
34-
__description__, __copyright__)
1+
from frost_sta_client import model
2+
from frost_sta_client import dao
3+
from frost_sta_client import query
4+
from frost_sta_client import service
5+
6+
from frost_sta_client.model.actuator import Actuator
7+
from frost_sta_client.model.datastream import Datastream
8+
from frost_sta_client.model.entity import Entity
9+
from frost_sta_client.model.feature_of_interest import FeatureOfInterest
10+
from frost_sta_client.model.historical_location import HistoricalLocation
11+
from frost_sta_client.model.location import Location
12+
from frost_sta_client.model.multi_datastream import MultiDatastream
13+
from frost_sta_client.model.observation import Observation
14+
from frost_sta_client.model.observedproperty import ObservedProperty
15+
from frost_sta_client.model.sensor import Sensor
16+
from frost_sta_client.model.task import Task
17+
from frost_sta_client.model.tasking_capability import TaskingCapability
18+
from frost_sta_client.model.thing import Thing
19+
from frost_sta_client.generated.odata.datamodel import UnitOfMeasurement
20+
from frost_sta_client.service.sensorthingsservice import SensorThingsService
21+
from frost_sta_client.service.auth_handler import AuthHandler
22+
from frost_sta_client.model.ext.entity_type import EntityTypes
23+
from frost_sta_client.model.ext.entity_list import EntityList
24+
from frost_sta_client.model.ext.data_array_value import DataArrayValue
25+
from frost_sta_client.model.ext.data_array_document import DataArrayDocument
26+
27+
import jsonpickle
28+
29+
jsonpickle.load_backend('demjson3', 'encode', 'decode', 'JSONDecodeError')
30+
jsonpickle.set_preferred_backend('demjson3')
31+
jsonpickle.set_decoder_options("demjson3", decode_float=float)
32+
33+
from .__version__ import (__title__, __version__, __license__, __author__, __contact__, __url__,
34+
__description__, __copyright__)
Lines changed: 108 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -1,108 +1,108 @@
1-
# Copyright (C) 2021 Fraunhofer Institut IOSB, Fraunhoferstr. 1, D 76131
2-
# Karlsruhe, Germany.
3-
#
4-
# This program is free software: you can redistribute it and/or modify
5-
# it under the terms of the GNU Lesser General Public License as published by
6-
# the Free Software Foundation, either version 3 of the License, or
7-
# (at your option) any later version.
8-
#
9-
# This program is distributed in the hope that it will be useful,
10-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12-
# GNU Lesser General Public License for more details.
13-
#
14-
# You should have received a copy of the GNU Lesser General Public License
15-
# along with this program. If not, see <http://www.gnu.org/licenses/>.
16-
17-
EntityTypes = {
18-
'Datastream': {
19-
'singular': 'Datastream',
20-
'plural': 'Datastreams',
21-
'class': 'frost_sta_client.model.datastream.Datastream',
22-
'relations_list': ['Sensor', 'Thing', 'ObservedProperty', 'Observations']
23-
},
24-
'MultiDatastream': {
25-
'singular': 'MultiDatastream',
26-
'plural': 'MultiDatastreams',
27-
'class': 'frost_sta_client.model.multi_datastream.MultiDatastream',
28-
'relations_list': ['Sensor', 'Thing', 'ObservedProperties', 'Observations']
29-
},
30-
'FeatureOfInterest': {
31-
'singular': 'FeatureOfInterest',
32-
'plural': 'FeaturesOfInterest',
33-
'class': 'frost_sta_client.model.feature_of_interest.FeatureOfInterest',
34-
'relations_list': ['Observations']
35-
},
36-
'HistoricalLocation': {
37-
'singular': 'HistoricalLocation',
38-
'plural': 'HistoricalLocations',
39-
'class': 'frost_sta_client.model.historical_location.HistoricalLocation',
40-
'relations_list': ['Thing', 'Locations']
41-
},
42-
'Actuator': {
43-
'singular': 'Actuator',
44-
'plural': 'Actuators',
45-
'class': 'frost_sta_client.model.actuator.Actuator',
46-
'relations_list': ['TaskingCapabilities']
47-
},
48-
'Location': {
49-
'singular': 'Location',
50-
'plural': 'Locations',
51-
'class': 'frost_sta_client.model.location.Location',
52-
'relations_list': ['Things', 'HistoricalLocations']
53-
},
54-
'Observation': {
55-
'singular': 'Observation',
56-
'plural': 'Observations',
57-
'class': 'frost_sta_client.model.observation.Observation',
58-
'relations_list': ['FeatureOfInterest', 'Datastream', 'MultiDatastream']
59-
},
60-
'Thing': {
61-
'singular': 'Thing',
62-
'plural': 'Things',
63-
'class': 'frost_sta_client.model.thing.Thing',
64-
'relations_list': ['Datastreams', 'MultiDatastreams', 'Locations', 'HistoricalLocations', 'TaskingCapabilities']
65-
},
66-
'ObservedProperty': {
67-
'singular': 'ObservedProperty',
68-
'plural': 'ObservedProperties',
69-
'class': 'frost_sta_client.model.observedproperty.ObservedProperty',
70-
'relations_list': ['Datastreams', 'MultiDatastreams']
71-
},
72-
'Sensor': {
73-
'singular': 'Sensor',
74-
'plural': 'Sensors',
75-
'class': 'frost_sta_client.model.sensor.Sensor',
76-
'relations_list': ['Datastreams', 'MultiDatastreams']
77-
},
78-
'Task': {
79-
'singular': 'Task',
80-
'plural': 'Tasks',
81-
'class': 'frost_sta_client.model.task.Task',
82-
'relations_list': ['TaskingCapability']
83-
},
84-
'TaskingCapability': {
85-
'singular': 'TaskingCapability',
86-
'plural': 'TaskingCapabilities',
87-
'class': 'frost_sta_client.model.tasking_capability.TaskingCapability',
88-
'relations_list': ['Tasks', 'Actuator', 'Thing']
89-
},
90-
'UnitOfMeasurement': {
91-
'singular': 'UnitOfMeasurement',
92-
'plural': 'UnitOfMeasurements',
93-
'class': 'frost_sta_client.model.ext.unitofmeasurement.UnitOfMeasurement'
94-
},
95-
'EntityList': {
96-
'singular': 'EntityList',
97-
'plural': 'EntityLists',
98-
'class': 'frost_sta_client.model.ext.entity_list.EntityList'
99-
}
100-
}
101-
102-
list_for_class = {}
103-
for key, entity_type in EntityTypes.items():
104-
list_for_class[entity_type["class"]] = entity_type["plural"]
105-
106-
def get_list_for_class(clazz):
107-
clazz_name = clazz.__module__ + "." + clazz.__name__
108-
return list_for_class[clazz_name]
1+
# Copyright (C) 2021 Fraunhofer Institut IOSB, Fraunhoferstr. 1, D 76131
2+
# Karlsruhe, Germany.
3+
#
4+
# This program is free software: you can redistribute it and/or modify
5+
# it under the terms of the GNU Lesser General Public License as published by
6+
# the Free Software Foundation, either version 3 of the License, or
7+
# (at your option) any later version.
8+
#
9+
# This program is distributed in the hope that it will be useful,
10+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
# GNU Lesser General Public License for more details.
13+
#
14+
# You should have received a copy of the GNU Lesser General Public License
15+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
16+
17+
EntityTypes = {
18+
'Datastream': {
19+
'singular': 'Datastream',
20+
'plural': 'Datastreams',
21+
'class': 'frost_sta_client.model.datastream.Datastream',
22+
'relations_list': ['Sensor', 'Thing', 'ObservedProperty', 'Observations']
23+
},
24+
'MultiDatastream': {
25+
'singular': 'MultiDatastream',
26+
'plural': 'MultiDatastreams',
27+
'class': 'frost_sta_client.model.multi_datastream.MultiDatastream',
28+
'relations_list': ['Sensor', 'Thing', 'ObservedProperties', 'Observations']
29+
},
30+
'FeatureOfInterest': {
31+
'singular': 'FeatureOfInterest',
32+
'plural': 'FeaturesOfInterest',
33+
'class': 'frost_sta_client.model.feature_of_interest.FeatureOfInterest',
34+
'relations_list': ['Observations']
35+
},
36+
'HistoricalLocation': {
37+
'singular': 'HistoricalLocation',
38+
'plural': 'HistoricalLocations',
39+
'class': 'frost_sta_client.model.historical_location.HistoricalLocation',
40+
'relations_list': ['Thing', 'Locations']
41+
},
42+
'Actuator': {
43+
'singular': 'Actuator',
44+
'plural': 'Actuators',
45+
'class': 'frost_sta_client.model.actuator.Actuator',
46+
'relations_list': ['TaskingCapabilities']
47+
},
48+
'Location': {
49+
'singular': 'Location',
50+
'plural': 'Locations',
51+
'class': 'frost_sta_client.model.location.Location',
52+
'relations_list': ['Things', 'HistoricalLocations']
53+
},
54+
'Observation': {
55+
'singular': 'Observation',
56+
'plural': 'Observations',
57+
'class': 'frost_sta_client.model.observation.Observation',
58+
'relations_list': ['FeatureOfInterest', 'Datastream', 'MultiDatastream']
59+
},
60+
'Thing': {
61+
'singular': 'Thing',
62+
'plural': 'Things',
63+
'class': 'frost_sta_client.model.thing.Thing',
64+
'relations_list': ['Datastreams', 'MultiDatastreams', 'Locations', 'HistoricalLocations', 'TaskingCapabilities']
65+
},
66+
'ObservedProperty': {
67+
'singular': 'ObservedProperty',
68+
'plural': 'ObservedProperties',
69+
'class': 'frost_sta_client.model.observedproperty.ObservedProperty',
70+
'relations_list': ['Datastreams', 'MultiDatastreams']
71+
},
72+
'Sensor': {
73+
'singular': 'Sensor',
74+
'plural': 'Sensors',
75+
'class': 'frost_sta_client.model.sensor.Sensor',
76+
'relations_list': ['Datastreams', 'MultiDatastreams']
77+
},
78+
'Task': {
79+
'singular': 'Task',
80+
'plural': 'Tasks',
81+
'class': 'frost_sta_client.model.task.Task',
82+
'relations_list': ['TaskingCapability']
83+
},
84+
'TaskingCapability': {
85+
'singular': 'TaskingCapability',
86+
'plural': 'TaskingCapabilities',
87+
'class': 'frost_sta_client.model.tasking_capability.TaskingCapability',
88+
'relations_list': ['Tasks', 'Actuator', 'Thing']
89+
},
90+
'UnitOfMeasurement': {
91+
'singular': 'UnitOfMeasurement',
92+
'plural': 'UnitOfMeasurements',
93+
'class': 'frost_sta_client.generated.odata.datamodel.UnitOfMeasurement'
94+
},
95+
'EntityList': {
96+
'singular': 'EntityList',
97+
'plural': 'EntityLists',
98+
'class': 'frost_sta_client.model.ext.entity_list.EntityList'
99+
}
100+
}
101+
102+
list_for_class = {}
103+
for key, entity_type in EntityTypes.items():
104+
list_for_class[entity_type["class"]] = entity_type["plural"]
105+
106+
def get_list_for_class(clazz):
107+
clazz_name = clazz.__module__ + "." + clazz.__name__
108+
return list_for_class[clazz_name]

frost_sta_client/odata_codegen/install_model.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -161,17 +161,13 @@ def write_wrapper(model_dir: str, singular: str, relations: List[str]) -> None:
161161
path = os.path.join(model_dir, f"{file_name}.py")
162162
imports: List[str] = []
163163
imports.append("from frost_sta_client.generated.odata import datamodel as _mdl")
164-
imports.append("from frost_sta_client.model.ext import unitofmeasurement as _uom")
165164
imports.append("from frost_sta_client.model.ext import entity_type as _etype")
166165
# DAO imports
167166
dao_mod = file_name
168167
dao_class = singular + 'Dao'
169168
imports.append(f"from frost_sta_client.dao.{dao_mod} import {dao_class}")
170169
imports.append("")
171170
body: List[str] = []
172-
body.append("# Ensure generated datamodel uses ext.UnitOfMeasurement for compatibility")
173-
body.append("_mdl.UnitOfMeasurement = _uom.UnitOfMeasurement")
174-
body.append("")
175171
body.append(f"class {singular}(_mdl.{singular}):")
176172
body.append(f" \"\"\"Compatibility wrapper around code-generated {singular} to provide DAO accessors.\"\"\"")
177173
body.append(" def get_dao(self, service):")

tests/test_integration.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
pytestmark = pytest.mark.skipif(os.environ.get('FROST_STA_CLIENT_RUN_INTEGRATION') != '1', reason='Integration tests require FROST server. Set FROST_STA_CLIENT_RUN_INTEGRATION=1 to run.')
44
from geojson import Point
55
from frost_sta_client.model import thing, sensor, observedproperty, datastream, observation, feature_of_interest
6-
from frost_sta_client.model.ext import unitofmeasurement
6+
from frost_sta_client.generated.odata.datamodel import UnitOfMeasurement
77

88

99
def test_create_thing(sensorthings_service):
@@ -34,7 +34,7 @@ def test_crud_datastream(sensorthings_service):
3434
definition='http://www.example.org/op',
3535
description='OP')
3636
sensorthings_service.create(op)
37-
um = unitofmeasurement.UnitOfMeasurement(
37+
um = UnitOfMeasurement(
3838
name="degree Celsius",
3939
symbol="°C",
4040
definition="physical definition...")
@@ -84,7 +84,7 @@ def test_crud_observation(sensorthings_service):
8484
definition='http://www.example.org/op_obs',
8585
description='OP Obs')
8686
sensorthings_service.create(op)
87-
um = unitofmeasurement.UnitOfMeasurement(
87+
um = UnitOfMeasurement(
8888
name="degree Celsius",
8989
symbol="°C",
9090
definition="physical definition...")

tests/test_integration_extended.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
pytestmark = pytest.mark.skipif(os.environ.get('FROST_STA_CLIENT_RUN_INTEGRATION') != '1', reason='Integration tests require FROST server. Set FROST_STA_CLIENT_RUN_INTEGRATION=1 to run.')
44
from geojson import Point
55
from frost_sta_client.model import thing, sensor, observedproperty, datastream, feature_of_interest
6-
from frost_sta_client.model.ext import unitofmeasurement
6+
from frost_sta_client.generated.odata.datamodel import UnitOfMeasurement
77
from frost_sta_client.model.ext.data_array_value import DataArrayValue as DAV
88
from frost_sta_client.model.ext.data_array_document import DataArrayDocument
99
from frost_sta_client.model.observation import Observation
@@ -47,7 +47,7 @@ def test_create_observations_with_data_array(sensorthings_service):
4747
sensorthings_service.create(s)
4848
op = observedproperty.ObservedProperty(name='OP DA', definition='http://op.example.org', description='op')
4949
sensorthings_service.create(op)
50-
u = unitofmeasurement.UnitOfMeasurement(name='degree Celsius', symbol='°C', definition='ucum:Cel')
50+
u = UnitOfMeasurement(name='degree Celsius', symbol='°C', definition='ucum:Cel')
5151
ds = datastream.Datastream(name='DS DA', description='d', observation_type='OM_Measurement', unit_of_measurement=u, thing=t, sensor=s, observed_property=op)
5252
sensorthings_service.create(ds)
5353
foi = feature_of_interest.FeatureOfInterest(name='FOI DA', description='d', encoding_type='application/geo+json', feature=Point((9.1, 48.7)))

tests/test_model_equality_all.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from frost_sta_client.model.actuator import Actuator
1010
from frost_sta_client.model.tasking_capability import TaskingCapability
1111
from frost_sta_client.model.task import Task
12-
from frost_sta_client.model.ext.unitofmeasurement import UnitOfMeasurement
12+
from frost_sta_client.generated.odata.datamodel import UnitOfMeasurement
1313

1414
def test_equality_thing():
1515
a = Thing(id=1, name='A', description='d', properties={'x': 1})

tests/test_property_validation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from frost_sta_client.model.actuator import Actuator
1111
from frost_sta_client.model.historical_location import HistoricalLocation
1212
from frost_sta_client.model.location import Location
13-
from frost_sta_client.model.ext.unitofmeasurement import UnitOfMeasurement
13+
from frost_sta_client.generated.odata.datamodel import UnitOfMeasurement
1414

1515
def test_observed_property_properties_must_be_dict():
1616
op = ObservedProperty()

0 commit comments

Comments
 (0)