def save(self, parent=None): if self.filename is None: project_path = epyqlib.utils.qt.file_dialog( filters=self.filters, parent=parent, save=True, caption='Save Project As', ) if project_path is None: raise ProjectSaveCanceled() self.filename = pathlib.Path(project_path) project_directory = self.filename.parents[0] paths = Models() for name, path in self.paths.items(): if path is not None: paths[name] = path else: new_path = epyqlib.utils.qt.file_dialog( filters=self.data_filters, parent=parent, save=True, caption='Save {} As'.format(name.title()), ) if new_path is None: raise ProjectSaveCanceled() paths[name] = ( pathlib.Path(new_path).relative_to(project_directory) ) self.paths = paths with open(self.filename, 'w', newline='\n') as f: s = graham.dumps(self, indent=4).data f.write(s) if not s.endswith('\n'): f.write('\n') for path, model in zip(paths.values(), self.models.values()): s = graham.dumps(model.root, indent=4).data with open(project_directory / path, 'w', newline='\n') as f: f.write(s) if not s.endswith('\n'): f.write('\n')
def save(self, parent=None): if self.path is None: path = epyqlib.utils.qt.file_dialog( filters=self.filters, parent=parent, save=True, caption='Save Value Set As', ) if path is None: raise SaveCancelled() self.path = pathlib.Path(path) sorted_children = sorted(self.model.root.children) sorted_root = attr.evolve(self.model.root, children=sorted_children) s = graham.dumps(sorted_root, indent=4).data with open(self.path, 'w') as f: f.write(s) if not s.endswith('\n'): f.write('\n')
def test_overall(): # Attempt to recreate the List vs. many=True issues # https://repl.it/KFXo/3 subgroup = Group(name='subgroup') subgroup.leaves.append(Leaf(name='subgroup leaf')) group = Group() group.groups.append(subgroup) group.leaves.append(Leaf()) group.mixed_list.append(Leaf(name='mixed list leaf')) group.mixed_list.append(Group(name='mixed list group')) def json_dumps(instance): return json.dumps(attr.asdict(instance), indent=4) print(' - - - - - - before') print(json_dumps(group)) marshalled = graham.dumps(group) print() print(' - - - - - - serialized type', type(marshalled.data)) unmarshalled = graham.schema(Group).loads(marshalled.data) print() print(' - - - - - - after') print(json_dumps(unmarshalled.data)) print() print(' - - - - - - Original is equal to serialized/deserialized?') print(unmarshalled.data == group) assert unmarshalled.data == group
def test_sample_dumps_consistently(sample): dumped = graham.dumps(sample.root, indent=4) def load(s): return json.loads(s, object_pairs_hook=collections.OrderedDict) print() print(dumped.data) assert load(dumped.data) == load(serialized_sample)
def test_dump_no_version(): tag = 'test' @graham.schemify(tag=tag) @attr.s class Test(object): pass serialized = '{{"{tag_name}": "{tag}"}}' serialized = serialized.format( tag_name=type_name, tag=tag, ) assert graham.dumps(Test()).data == serialized
def cli(sym, hierarchy, parameters, value_set): value_set_file = value_set parameters_root, can_root = epcpm.symtoproject.load_can_file( can_file=sym, file_type=str(pathlib.Path(sym.name).suffix[1:]), parameter_hierarchy_file=hierarchy, ) project_model = epcpm.project.Project(models=epcpm.project.Models( parameters=epyqlib.attrsmodel.Model( root=parameters_root, columns=epyqlib.pm.parametermodel.columns, ), can=epyqlib.attrsmodel.Model( root=can_root, columns=epcpm.canmodel.columns, ), ), ) value_set = epyqlib.pm.valuesetmodel.create_blank( parameter_model=project_model.models.parameters, ) (parameters_root, ) = (node for node in value_set.parameter_model.root.children if node.name == "Parameters") epyqlib.pm.valuesetmodel.copy_parameter_data( value_set=value_set, human_names=False, base_node=parameters_root, calculate_unspecified_min_max=True, can_root=can_root, ) value_set_parameters = { parameter.name: parameter for parameter in value_set.model.root.children } parameters = json.load(parameters) for name, value in parameters.items(): value_set_parameters[name].value = value value_set_file.write(graham.dumps(value_set.model.root, indent=4).data)
def test_load_from_dump_to(): @graham.schemify(tag='test') @attr.s class Test(object): test = attr.ib() graham.attrib(attribute=test, field=marshmallow.fields.String( load_from='test_load_dump', dump_to='test_load_dump', )) test = Test(test='test string') serialized = '{{"{}": "test", "test_load_dump": "test string"}}'.format( type_name, ) assert graham.dumps(test).data == serialized assert graham.schema(Test).loads(serialized).data == test
def test_nonserialized(): @graham.schemify(tag='test') @attr.s class Test(object): test = attr.ib() graham.attrib( attribute=test, field=marshmallow.fields.String(), ) nope = attr.ib(default=None) test = Test(test='test') serialized = '{{"{}": "test", "test": "test"}}'.format(type_name) assert graham.dumps(test).data == serialized assert graham.schema(Test).loads(serialized).data == test
def test_dump_version(): tag = 'test' version = 42 @graham.schemify(tag=tag, version=version) @attr.s class Test(object): pass serialized = '{{"{tag_name}": "{tag}", "{version_name}": {version}}}' serialized = serialized.format( tag_name=type_name, tag=tag, version_name=version_name, version=version, ) assert graham.dumps(Test()).data == serialized
def test_hex_field(): @graham.schemify(tag='test') @attr.s(hash=False) class Test: field = attr.ib(metadata=graham.create_metadata( field=epcpm.canmodel.HexadecimalIntegerField(), ), ) none = attr.ib( default=None, metadata=graham.create_metadata( field=epcpm.canmodel.HexadecimalIntegerField( allow_none=True, ), ), ) t = Test(field=0x123) serialized = '{"_type": "test", "field": "0x123", "none": null}' assert graham.dumps(t).data == serialized assert graham.schema(Test).loads(serialized).data == t
def test_mixed_list_exclude(): @graham.schemify(tag='a') @attr.s class A(object): a = attr.ib( metadata=graham.create_metadata( field=marshmallow.fields.Integer(), ) ) @attr.s class B(object): b = attr.ib() @graham.schemify(tag='c') @attr.s class C(object): x = attr.ib( metadata=graham.create_metadata( field=graham.fields.MixedList( fields=( marshmallow.fields.Nested(graham.schema(A)), ), exclude=( B, ), ) ) ) c = C( x=[ A(a=1), A(a=2), B(b=3), ], ) marshalled = graham.dumps(c) data = json.loads(marshalled.data) assert all(d['_type'] == 'a' for d in data['x'])
def test_save(): assert reference_string == graham.dumps(reference_project, indent=4).data
def cli( sym, hierarchy, project, parameters, can, sunspec, epyq_value_set, add_tables, add_sunspec_types, ): parameters_root, can_root, sunspec_root = epcpm.symtoproject.load_can_file( can_file=sym, file_type=str(pathlib.Path(sym.name).suffix[1:]), parameter_hierarchy_file=hierarchy, ) project_path = pathlib.Path(project.name).parents[0] project_path.mkdir(parents=True, exist_ok=True) project_model = epcpm.project.Project( paths=epcpm.project.Models( parameters=relative_path(parameters.name, project_path), can=relative_path(can.name, project_path), sunspec=relative_path(sunspec.name, project_path), ), models=epcpm.project.Models( parameters=epyqlib.attrsmodel.Model( root=parameters_root, columns=epyqlib.pm.parametermodel.columns, ), can=epyqlib.attrsmodel.Model( root=can_root, columns=epcpm.canmodel.columns, ), sunspec=epyqlib.attrsmodel.Model( root=sunspec_root, columns=epcpm.sunspecmodel.columns, ), ), ) if add_sunspec_types: parameter_root = project_model.models.parameters.root enumerations = parameter_root.child_by_name("Enumerations") enumerations.append_child( epcpm.sunspecmodel.build_sunspec_types_enumeration(), ) epcpm.project._post_load(project_model) if add_tables: epcpm.symtoproject.go_add_tables( parameters_root=project_model.models.parameters.root, can_root=project_model.models.can.root, ) project.write(graham.dumps(project_model, indent=4).data) parameters.write(graham.dumps(parameters_root, indent=4).data) can.write(graham.dumps(can_root, indent=4).data) sunspec.write(graham.dumps(sunspec_root, indent=4).data) if epyq_value_set is not None: value_set = epyqlib.pm.valuesetmodel.create_blank( parameter_model=project_model.models.parameters, ) (parameters_root, ) = [ node for node in value_set.parameter_model.root.children if node.name == "Parameters" ] epyqlib.pm.valuesetmodel.copy_parameter_data( value_set=value_set, human_names=False, base_node=parameters_root, calculate_unspecified_min_max=True, symbol_root=can_root, ) epyq_value_set.write(graham.dumps(value_set.model.root, indent=4).data)