Skip to content

Commit 59c4a90

Browse files
Merge pull request #83 from EasyScience/develop
Release 1.1.1
2 parents 3a3738f + 8b2e5fb commit 59c4a90

File tree

8 files changed

+44
-13
lines changed

8 files changed

+44
-13
lines changed

src/easyscience/Objects/Variable.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -721,6 +721,14 @@ def fixed(self, value: bool):
721721
raise ValueError
722722
self._fixed = value
723723

724+
@property
725+
def free(self) -> bool:
726+
return not self.fixed
727+
728+
@free.setter
729+
def free(self, value: bool) -> None:
730+
self.fixed = not value
731+
724732
@property
725733
def error(self) -> float:
726734
"""

src/easyscience/Objects/core.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ class ComponentSerializer:
3232

3333
_CORE = True
3434

35+
def __deepcopy__(self, memo):
36+
return self.from_dict(self.as_dict())
37+
3538
def encode(self, skip: Optional[List[str]] = None, encoder: Optional[EC] = None, **kwargs) -> Any:
3639
"""
3740
Use an encoder to covert an EasyScience object into another format. Default is to a dictionary using `DictSerializer`.
@@ -41,7 +44,6 @@ def encode(self, skip: Optional[List[str]] = None, encoder: Optional[EC] = None,
4144
:param kwargs: Any additional key word arguments to be passed to the encoder
4245
:return: encoded object containing all information to reform an EasyScience object.
4346
"""
44-
4547
if encoder is None:
4648
encoder = DictSerializer
4749
encoder_obj = encoder()

src/easyscience/Objects/new_variable/parameter.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,14 @@ def fixed(self, fixed: bool) -> None:
301301
raise ValueError(f'{fixed=} must be a boolean. Got {type(fixed)}')
302302
self._fixed = fixed
303303

304+
@property
305+
def free(self) -> bool:
306+
return not self.fixed
307+
308+
@free.setter
309+
def free(self, value: bool) -> None:
310+
self.fixed = not value
311+
304312
@property
305313
def bounds(self) -> Tuple[numbers.Number, numbers.Number]:
306314
"""

src/easyscience/Utils/io/template.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -257,11 +257,7 @@ def _convert_from_dict(d):
257257
mod = __import__(modname, globals(), locals(), [classname], 0)
258258
if hasattr(mod, classname):
259259
cls_ = getattr(mod, classname)
260-
data = {
261-
k: BaseEncoderDecoder._convert_from_dict(v)
262-
for k, v in d.items()
263-
if not (k.startswith('@') or k == 'unique_name')
264-
}
260+
data = {k: BaseEncoderDecoder._convert_from_dict(v) for k, v in d.items() if not k.startswith('@')}
265261
return cls_(**data)
266262
elif np is not None and modname == 'numpy' and classname == 'array':
267263
if d['dtype'].startswith('complex'):

src/easyscience/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '1.1.0'
1+
__version__ = '1.1.1'

tests/unit_tests/Objects/test_BaseObj.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,23 @@ def check_dict(check, item):
236236
check_dict(expected, obtained)
237237

238238

239+
def test_baseobj_dict_roundtrip(clear, setup_pars: dict):
240+
# When
241+
name = setup_pars["name"]
242+
del setup_pars["name"]
243+
obj = BaseObj(name, **setup_pars, unique_name='special_name')
244+
obj_dict = obj.as_dict()
245+
246+
global_object.map._clear()
247+
248+
# Then
249+
new_obj = BaseObj.from_dict(obj_dict)
250+
251+
# Expect
252+
new_obj_dict = new_obj.as_dict()
253+
assert obj_dict == new_obj_dict
254+
255+
239256
def test_baseobj_dir(setup_pars):
240257
name = setup_pars["name"]
241258
del setup_pars["name"]

tests/unit_tests/utils/io_tests/test_core.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,8 @@ def __init__(self, name: str = "A", **kwargs):
131131

132132

133133
class B(BaseObj):
134-
def __init__(self, a, b):
135-
super(B, self).__init__("B", a=a)
134+
def __init__(self, a, b, unique_name):
135+
super(B, self).__init__("B", a=a, unique_name=unique_name)
136136
self.b = b
137137

138138

tests/unit_tests/utils/io_tests/test_dict.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -207,16 +207,16 @@ def test_custom_class_encode_data(dp_kwargs: dict, dp_cls: Type[DescriptorNumber
207207

208208
def test_custom_class_full_encode_with_numpy():
209209
class B(BaseObj):
210-
def __init__(self, a, b):
211-
super(B, self).__init__("B", a=a)
210+
def __init__(self, a, b, unique_name):
211+
super(B, self).__init__("B", a=a, unique_name=unique_name)
212212
self.b = b
213213
# Same as in __init__.py for easyscience
214214
try:
215215
version = metadata.version('easyscience') # 'easyscience' is the name of the package in 'setup.py
216216
except metadata.PackageNotFoundError:
217217
version = '0.0.0'
218218

219-
obj = B(DescriptorNumber("a", 1.0, unique_name="a"), np.array([1.0, 2.0, 3.0]))
219+
obj = B(DescriptorNumber("a", 1.0, unique_name="a"), np.array([1.0, 2.0, 3.0]), unique_name="B_0")
220220
full_enc = obj.encode(encoder=DictSerializer, full_encode=True)
221221
expected = {
222222
"@module": "tests.unit_tests.utils.io_tests.test_dict",
@@ -248,7 +248,7 @@ def __init__(self, a, b):
248248

249249
def test_custom_class_full_decode_with_numpy():
250250
global_object.map._clear()
251-
obj = B(DescriptorNumber("a", 1.0), np.array([1.0, 2.0, 3.0]))
251+
obj = B(DescriptorNumber("a", 1.0), np.array([1.0, 2.0, 3.0]), unique_name="B_0")
252252
full_enc = obj.encode(encoder=DictSerializer, full_encode=True)
253253
global_object.map._clear()
254254
obj2 = B.decode(full_enc, decoder=DictSerializer)

0 commit comments

Comments
 (0)