• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

bogdandm / json2python-models / 3822451468

pending completion
3822451468

Pull #55

github

GitHub
Merge 8c3a0adb5 into cdd441319
Pull Request #55: Add python3.11 to test matrix

1553 of 1584 relevant lines covered (98.04%)

4.9 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.62
/json_to_models/models/dataclasses.py
1
from inspect import isclass
5✔
2
from typing import List, Tuple
5✔
3

4
from .base import GenericModelCodeGenerator, KWAGRS_TEMPLATE, METADATA_FIELD_NAME, sort_kwargs, template
5✔
5
from ..dynamic_typing import (DDict, DList, DOptional, ImportPathList, MetaData, ModelMeta, StringSerializable)
5✔
6

7
DEFAULT_ORDER = (
5✔
8
    ("default", "default_factory"),
9
    "*",
10
    ("metadata",)
11
)
12

13

14
class DataclassModelCodeGenerator(GenericModelCodeGenerator):
5✔
15
    DC_DECORATOR = template(f"dataclass{{% if kwargs %}}({KWAGRS_TEMPLATE}){{% endif %}}")
5✔
16
    DC_FIELD = template(f"field({KWAGRS_TEMPLATE})")
5✔
17

18
    def __init__(self, model: ModelMeta, meta=False, dataclass_kwargs: dict = None, **kwargs):
5✔
19
        """
20
        :param model: ModelMeta instance
21
        :param meta: Enable generation of metadata as attrib argument
22
        :param dataclass_kwargs: kwargs for @dataclass() decorators
23
        :param kwargs:
24
        """
25
        super().__init__(model, **kwargs)
5✔
26
        self.no_meta = not meta
5✔
27
        self.dataclass_kwargs = dataclass_kwargs or {}
5✔
28

29
    @property
5✔
30
    def decorators(self) -> Tuple[ImportPathList, List[str]]:
5✔
31
        imports, decorators = super().decorators
5✔
32
        imports.append(('dataclasses', ['dataclass', 'field']))
5✔
33
        decorators.insert(0, self.DC_DECORATOR.render(kwargs=self.dataclass_kwargs))
5✔
34
        return imports, decorators
5✔
35

36
    def field_data(self, name: str, meta: MetaData, optional: bool) -> Tuple[ImportPathList, dict]:
5✔
37
        """
38
        Form field data for template
39

40
        :param name: Original field name
41
        :param meta: Field metadata
42
        :param optional: Is field optional
43
        :return: imports, field data
44
        """
45
        imports, data = super().field_data(name, meta, optional)
5✔
46
        body_kwargs = {}
5✔
47
        if optional:
5✔
48
            meta: DOptional
49
            if isinstance(meta.type, DList):
5✔
50
                body_kwargs["default_factory"] = "list"
5✔
51
            elif isinstance(meta.type, DDict):
5✔
52
                body_kwargs["default_factory"] = "dict"
×
53
            else:
54
                body_kwargs["default"] = "None"
5✔
55
                if isclass(meta.type) and issubclass(meta.type, StringSerializable):
5✔
56
                    pass
57
        elif isclass(meta) and issubclass(meta, StringSerializable):
5✔
58
            pass
59

60
        if not self.no_meta and name != data["name"]:
5✔
61
            body_kwargs["metadata"] = {METADATA_FIELD_NAME: name}
5✔
62
        if len(body_kwargs) == 1 and next(iter(body_kwargs.keys())) == "default":
5✔
63
            data["body"] = body_kwargs["default"]
5✔
64
        elif body_kwargs:
5✔
65
            data["body"] = self.DC_FIELD.render(kwargs=sort_kwargs(body_kwargs, DEFAULT_ORDER))
5✔
66
        return imports, data
5✔
67

68
    @property
5✔
69
    def convert_strings_kwargs(self) -> Tuple[ImportPathList, dict]:
5✔
70
        """
71
        :return: Imports and Dict with kw-arguments for `json_to_models.models.string_converters.convert_strings` decorator.
72
        """
73
        imports, kwargs = super().convert_strings_kwargs
5✔
74
        imports.append(('json_to_models.models', ['ClassType']))
5✔
75
        kwargs["class_type"] = 'ClassType.Dataclass'
5✔
76
        return imports, kwargs
5✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc