6
6
7
7
import sys
8
8
from array import array
9
+ from collections .abc import Iterable
9
10
from typing import List , Optional , Any
10
11
from dataclasses import dataclass , field
11
12
from enum import IntEnum
21
22
_ureg = get_unit_registry ()
22
23
_DISABLE_FOREX_API = True # See https://github.com/NREL/GEOPHIRES-X/issues/236#issuecomment-2414681434
23
24
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
+
24
32
class HasQuantity (ABC ):
25
33
26
34
def quantity (self ) -> PlainQuantity :
@@ -63,14 +71,15 @@ class OutputParameter(HasQuantity):
63
71
"""
64
72
65
73
Name : str = ""
66
- display_name :str = None
74
+ display_name : str = None
67
75
value : Any = 0
68
76
ToolTipText : str = ""
69
77
UnitType : IntEnum = Units .NONE
70
78
PreferredUnits : Enum = Units .NONE
71
79
# set to PreferredUnits by default assuming that the current units are the preferred units -
72
80
# they will only change if the read function reads a different unit associated with a parameter
73
81
CurrentUnits : Enum = PreferredUnits
82
+ json_parameter_type : str = None
74
83
75
84
@property
76
85
def UnitsMatch (self ) -> str :
@@ -86,6 +95,23 @@ def __post_init__(self):
86
95
if self .display_name is None :
87
96
self .display_name : str = self .Name
88
97
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
89
115
90
116
@dataclass
91
117
class Parameter (HasQuantity ):
@@ -152,7 +178,7 @@ def __post_init__(self):
152
178
153
179
value : bool = None
154
180
DefaultValue : bool = value
155
- json_parameter_type : str = 'boolean'
181
+ json_parameter_type : str = _JSON_PARAMETER_TYPE_BOOLEAN
156
182
157
183
158
184
@dataclass
@@ -174,7 +200,7 @@ def __post_init__(self):
174
200
value : int = None
175
201
DefaultValue : int = value
176
202
AllowableRange : List [int ] = field (default_factory = list )
177
- json_parameter_type : str = 'integer'
203
+ json_parameter_type : str = _JSON_PARAMETER_TYPE_INTEGER
178
204
179
205
def coerce_value_to_enum (self ):
180
206
if self .ValuesEnum is not None :
@@ -207,7 +233,7 @@ def __post_init__(self):
207
233
DefaultValue : float = 0.0
208
234
Min : float = - 1.8e30
209
235
Max : float = 1.8e30
210
- json_parameter_type : str = 'number'
236
+ json_parameter_type : str = _JSON_PARAMETER_TYPE_NUMBER
211
237
212
238
213
239
@dataclass
@@ -222,11 +248,11 @@ class strParameter(Parameter):
222
248
"""
223
249
def __post_init__ (self ):
224
250
if self .value is None :
225
- self .value :str = self .DefaultValue
251
+ self .value : str = self .DefaultValue
226
252
227
253
value : str = None
228
254
DefaultValue : str = value
229
- json_parameter_type : str = 'string'
255
+ json_parameter_type : str = _JSON_PARAMETER_TYPE_STRING
230
256
231
257
232
258
@dataclass
@@ -246,13 +272,13 @@ class listParameter(Parameter):
246
272
247
273
def __post_init__ (self ):
248
274
if self .value is None :
249
- self .value :str = self .DefaultValue
275
+ self .value : str = self .DefaultValue
250
276
251
277
value : List [float ] = None
252
278
DefaultValue : List [float ] = field (default_factory = list )
253
279
Min : float = - 1.8e308
254
280
Max : float = 1.8e308
255
- json_parameter_type : str = 'array'
281
+ json_parameter_type : str = _JSON_PARAMETER_TYPE_ARRAY
256
282
257
283
258
284
def ReadParameter (ParameterReadIn : ParameterEntry , ParamToModify , model ):
0 commit comments