Esempio n. 1
0
    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')
Esempio n. 2
0
    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')
Esempio n. 3
0
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
Esempio n. 4
0
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)
Esempio n. 5
0
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
Esempio n. 6
0
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)
Esempio n. 7
0
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
Esempio n. 8
0
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
Esempio n. 9
0
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
Esempio n. 10
0
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
Esempio n. 11
0
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'])
Esempio n. 12
0
def test_save():
    assert reference_string == graham.dumps(reference_project, indent=4).data
Esempio n. 13
0
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)