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

bogdandm / json2python-models / 11498135606

pending completion
11498135606

Pull #59

github

web-flow
Merge 2387ea51f into e2606e8f2
Pull Request #59: Modernize project setup and setup cron action job

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

97.67
/json_to_models/models/pydantic.py
1
from typing import List, Optional, Tuple
2✔
2

3
from .base import GenericModelCodeGenerator, KWAGRS_TEMPLATE, sort_kwargs, template
2✔
4
from ..dynamic_typing import (
2✔
5
    DDict,
6
    DList,
7
    DOptional,
8
    ImportPathList,
9
    MetaData,
10
    ModelMeta,
11
    Null,
12
    StringLiteral,
13
    StringSerializable,
14
    Unknown
15
)
16

17
DEFAULT_ORDER = (
2✔
18
    "*",
19
)
20

21

22
class PydanticModelCodeGenerator(GenericModelCodeGenerator):
2✔
23
    PYDANTIC_FIELD = template("Field({{ default }}{% if kwargs %}, KWAGRS_TEMPLATE{% endif %})"
2✔
24
                              .replace('KWAGRS_TEMPLATE', KWAGRS_TEMPLATE))
25
    default_types_style = {
2✔
26
        StringSerializable: {
27
            StringSerializable.TypeStyle.use_actual_type: True
28
        },
29
        StringLiteral: {
30
            StringLiteral.TypeStyle.use_literals: True
31
        }
32
    }
33

34
    def __init__(self, model: ModelMeta, **kwargs):
2✔
35
        """
36
        :param model: ModelMeta instance
37
        :param kwargs:
38
        """
39
        kwargs['post_init_converters'] = False
2✔
40
        super().__init__(model, **kwargs)
2✔
41

42
    def generate(self, nested_classes: List[str] = None, extra: str = "", **kwargs) \
2✔
43
            -> Tuple[ImportPathList, str]:
44
        imports, body = super(PydanticModelCodeGenerator, self).generate(
2✔
45
            bases='BaseModel',
46
            nested_classes=nested_classes,
47
            extra=extra
48
        )
49
        imports.append(('pydantic.v1', ['BaseModel', 'Field']))
2✔
50
        return imports, body
2✔
51

52
    def _filter_fields(self, fields):
2✔
53
        fields = super()._filter_fields(fields)
2✔
54
        filtered = []
2✔
55
        for field in fields:
2✔
56
            field_type = self.model.type[field]
2✔
57
            if field_type in (Unknown, Null):
2✔
58
                continue
2✔
59
            filtered.append(field)
2✔
60
        return filtered
2✔
61

62
    def field_data(self, name: str, meta: MetaData, optional: bool) -> Tuple[ImportPathList, dict]:
2✔
63
        """
64
        Form field data for template
65

66
        :param name: Original field name
67
        :param meta: Field metadata
68
        :param optional: Is field optional
69
        :return: imports, field data
70
        """
71
        imports, data = super().field_data(name, meta, optional)
2✔
72
        default: Optional[str] = None
2✔
73
        if optional:
2✔
74
            meta: DOptional
75
            if isinstance(meta.type, DList):
2✔
76
                default = "[]"
2✔
77
            elif isinstance(meta.type, DDict):
2✔
78
                default = "{}"
×
79
            else:
80
                default = "None"
2✔
81

82
        body_kwargs = self._get_field_kwargs(name, meta, optional, data)
2✔
83
        if body_kwargs:
2✔
84
            data["body"] = self.PYDANTIC_FIELD.render(
2✔
85
                default=default or '...',
86
                kwargs=sort_kwargs(body_kwargs, DEFAULT_ORDER)
87
            )
88
        elif default is not None:
2✔
89
            data["body"] = default
2✔
90
        return imports, data
2✔
91

92
    def _get_field_kwargs(self, name: str, meta: MetaData, optional: bool, data: dict):
2✔
93
        body_kwargs = {}
2✔
94
        if name != data["name"]:
2✔
95
            body_kwargs["alias"] = f'"{name}"'
2✔
96
        return body_kwargs
2✔
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