Skip to content

Commit 93cd08b

Browse files
OutputParameter.json_parameter_type
1 parent 4547c3b commit 93cd08b

File tree

2 files changed

+50
-8
lines changed

2 files changed

+50
-8
lines changed

src/geophires_x/Parameter.py

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import sys
88
from array import array
9+
from collections.abc import Iterable
910
from typing import List, Optional, Any
1011
from dataclasses import dataclass, field
1112
from enum import IntEnum
@@ -21,6 +22,13 @@
2122
_ureg = get_unit_registry()
2223
_DISABLE_FOREX_API = True # See https://github.com/NREL/GEOPHIRES-X/issues/236#issuecomment-2414681434
2324

25+
_JSON_PARAMETER_TYPE_STRING = 'string'
26+
_JSON_PARAMETER_TYPE_INTEGER = 'integer'
27+
_JSON_PARAMETER_TYPE_NUMBER = 'number'
28+
_JSON_PARAMETER_TYPE_ARRAY = 'array'
29+
_JSON_PARAMETER_TYPE_BOOLEAN = 'boolean'
30+
_JSON_PARAMETER_TYPE_OBJECT = 'object'
31+
2432
class HasQuantity(ABC):
2533

2634
def quantity(self) -> PlainQuantity:
@@ -63,14 +71,15 @@ class OutputParameter(HasQuantity):
6371
"""
6472

6573
Name: str = ""
66-
display_name:str =None
74+
display_name: str = None
6775
value: Any = 0
6876
ToolTipText: str = ""
6977
UnitType: IntEnum = Units.NONE
7078
PreferredUnits: Enum = Units.NONE
7179
# set to PreferredUnits by default assuming that the current units are the preferred units -
7280
# they will only change if the read function reads a different unit associated with a parameter
7381
CurrentUnits: Enum = PreferredUnits
82+
json_parameter_type: str = None
7483

7584
@property
7685
def UnitsMatch(self) -> str:
@@ -86,6 +95,23 @@ def __post_init__(self):
8695
if self.display_name is None:
8796
self.display_name: str = self.Name
8897

98+
if self.json_parameter_type is None:
99+
# Note that this is sensitive to order of comparison; unit test ensures correct behavior:
100+
# test_parameter.ParameterTestCase.test_output_parameter_json_types
101+
if isinstance(self.value, str):
102+
self.json_parameter_type = _JSON_PARAMETER_TYPE_STRING
103+
elif isinstance(self.value, bool):
104+
self.json_parameter_type = _JSON_PARAMETER_TYPE_BOOLEAN
105+
elif isinstance(self.value, int):
106+
self.json_parameter_type = _JSON_PARAMETER_TYPE_INTEGER
107+
elif isinstance(self.value, float):
108+
self.json_parameter_type = _JSON_PARAMETER_TYPE_NUMBER
109+
elif isinstance(self.value, dict):
110+
self.json_parameter_type = _JSON_PARAMETER_TYPE_OBJECT
111+
elif isinstance(self.value, Iterable):
112+
self.json_parameter_type = _JSON_PARAMETER_TYPE_ARRAY
113+
else:
114+
self.json_parameter_type = _JSON_PARAMETER_TYPE_OBJECT
89115

90116
@dataclass
91117
class Parameter(HasQuantity):
@@ -152,7 +178,7 @@ def __post_init__(self):
152178

153179
value: bool = None
154180
DefaultValue: bool = value
155-
json_parameter_type: str = 'boolean'
181+
json_parameter_type: str = _JSON_PARAMETER_TYPE_BOOLEAN
156182

157183

158184
@dataclass
@@ -174,7 +200,7 @@ def __post_init__(self):
174200
value: int = None
175201
DefaultValue: int = value
176202
AllowableRange: List[int] = field(default_factory=list)
177-
json_parameter_type: str = 'integer'
203+
json_parameter_type: str = _JSON_PARAMETER_TYPE_INTEGER
178204

179205
def coerce_value_to_enum(self):
180206
if self.ValuesEnum is not None:
@@ -207,7 +233,7 @@ def __post_init__(self):
207233
DefaultValue: float = 0.0
208234
Min: float = -1.8e30
209235
Max: float = 1.8e30
210-
json_parameter_type: str = 'number'
236+
json_parameter_type: str = _JSON_PARAMETER_TYPE_NUMBER
211237

212238

213239
@dataclass
@@ -222,11 +248,11 @@ class strParameter(Parameter):
222248
"""
223249
def __post_init__(self):
224250
if self.value is None:
225-
self.value:str = self.DefaultValue
251+
self.value: str = self.DefaultValue
226252

227253
value: str = None
228254
DefaultValue: str = value
229-
json_parameter_type: str = 'string'
255+
json_parameter_type: str = _JSON_PARAMETER_TYPE_STRING
230256

231257

232258
@dataclass
@@ -246,13 +272,13 @@ class listParameter(Parameter):
246272

247273
def __post_init__(self):
248274
if self.value is None:
249-
self.value:str = self.DefaultValue
275+
self.value: str = self.DefaultValue
250276

251277
value: List[float] = None
252278
DefaultValue: List[float] = field(default_factory=list)
253279
Min: float = -1.8e308
254280
Max: float = 1.8e308
255-
json_parameter_type: str = 'array'
281+
json_parameter_type: str = _JSON_PARAMETER_TYPE_ARRAY
256282

257283

258284
def ReadParameter(ParameterReadIn: ParameterEntry, ParamToModify, model):

tests/test_parameter.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,22 @@ def test_output_parameter_with_preferred_units(self):
151151
self.assertEqual(5.5, result.value[0])
152152
self.assertEqual(5.5, result.value[-1])
153153

154+
def test_output_parameter_json_types(self):
155+
cases = [
156+
('foo', 'string'),
157+
(1, 'integer'),
158+
(True, 'boolean'),
159+
([1, 2, 3], 'array'),
160+
({4, 5, 6}, 'array'),
161+
(None, 'object'),
162+
({'foo': 'bar'}, 'object'),
163+
]
164+
165+
for case in cases:
166+
with self.subTest(case=case):
167+
jpt = OutputParameter(value=case[0]).json_parameter_type
168+
self.assertEqual(case[1], jpt)
169+
154170
def test_convert_units_back_currency(self):
155171
model = self._new_model()
156172

0 commit comments

Comments
 (0)