fh-pydantic-form 0.1.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of fh-pydantic-form might be problematic. Click here for more details.
- fh_pydantic_form/__init__.py +90 -0
- fh_pydantic_form/field_renderers.py +1033 -0
- fh_pydantic_form/form_parser.py +537 -0
- fh_pydantic_form/form_renderer.py +713 -0
- fh_pydantic_form/py.typed +0 -0
- fh_pydantic_form/registry.py +145 -0
- fh_pydantic_form/type_helpers.py +42 -0
- fh_pydantic_form-0.1.2.dist-info/METADATA +327 -0
- fh_pydantic_form-0.1.2.dist-info/RECORD +11 -0
- fh_pydantic_form-0.1.2.dist-info/WHEEL +4 -0
- fh_pydantic_form-0.1.2.dist-info/licenses/LICENSE +13 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import datetime
|
|
2
|
+
from typing import Literal, get_origin
|
|
3
|
+
|
|
4
|
+
from pydantic import BaseModel
|
|
5
|
+
|
|
6
|
+
from fh_pydantic_form.field_renderers import (
|
|
7
|
+
BaseModelFieldRenderer,
|
|
8
|
+
BooleanFieldRenderer,
|
|
9
|
+
DateFieldRenderer,
|
|
10
|
+
ListFieldRenderer,
|
|
11
|
+
LiteralFieldRenderer,
|
|
12
|
+
NumberFieldRenderer,
|
|
13
|
+
StringFieldRenderer,
|
|
14
|
+
TimeFieldRenderer,
|
|
15
|
+
)
|
|
16
|
+
from fh_pydantic_form.form_renderer import PydanticForm, list_manipulation_js
|
|
17
|
+
from fh_pydantic_form.registry import FieldRendererRegistry
|
|
18
|
+
from fh_pydantic_form.type_helpers import (
|
|
19
|
+
_get_underlying_type_if_optional,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def register_default_renderers() -> None:
|
|
24
|
+
"""
|
|
25
|
+
Register built-in renderers for common types
|
|
26
|
+
|
|
27
|
+
This method sets up:
|
|
28
|
+
- Simple type renderers (str, bool, int, float, date, time)
|
|
29
|
+
- Special field renderers (Detail)
|
|
30
|
+
- Predicate-based renderers (Literal fields, lists, BaseModels)
|
|
31
|
+
"""
|
|
32
|
+
# Import renderers by getting them from globals
|
|
33
|
+
|
|
34
|
+
# Simple types
|
|
35
|
+
FieldRendererRegistry.register_type_renderer(str, StringFieldRenderer)
|
|
36
|
+
FieldRendererRegistry.register_type_renderer(bool, BooleanFieldRenderer)
|
|
37
|
+
FieldRendererRegistry.register_type_renderer(int, NumberFieldRenderer)
|
|
38
|
+
FieldRendererRegistry.register_type_renderer(float, NumberFieldRenderer)
|
|
39
|
+
FieldRendererRegistry.register_type_renderer(datetime.date, DateFieldRenderer)
|
|
40
|
+
FieldRendererRegistry.register_type_renderer(datetime.time, TimeFieldRenderer)
|
|
41
|
+
|
|
42
|
+
# Register Literal field renderer
|
|
43
|
+
def is_literal_field(field_info):
|
|
44
|
+
"""Check if field is a Literal type"""
|
|
45
|
+
annotation = getattr(field_info, "annotation", None)
|
|
46
|
+
if not annotation:
|
|
47
|
+
return False
|
|
48
|
+
underlying_type = _get_underlying_type_if_optional(annotation)
|
|
49
|
+
origin = get_origin(underlying_type)
|
|
50
|
+
return origin is Literal
|
|
51
|
+
|
|
52
|
+
FieldRendererRegistry.register_type_renderer_with_predicate(
|
|
53
|
+
is_literal_field, LiteralFieldRenderer
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
# Register list renderer for List[*] types
|
|
57
|
+
def is_list_field(field_info):
|
|
58
|
+
"""Check if field is a list type"""
|
|
59
|
+
annotation = getattr(field_info, "annotation", None)
|
|
60
|
+
return (
|
|
61
|
+
annotation is not None
|
|
62
|
+
and hasattr(annotation, "__origin__")
|
|
63
|
+
and annotation.__origin__ is list
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
FieldRendererRegistry.register_type_renderer_with_predicate(
|
|
67
|
+
is_list_field, ListFieldRenderer
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
# Register the BaseModelFieldRenderer for Pydantic models
|
|
71
|
+
def is_basemodel_field(field_info):
|
|
72
|
+
"""Check if field is a BaseModel"""
|
|
73
|
+
annotation = getattr(field_info, "annotation", None)
|
|
74
|
+
underlying_type = _get_underlying_type_if_optional(annotation)
|
|
75
|
+
|
|
76
|
+
return (
|
|
77
|
+
isinstance(underlying_type, type)
|
|
78
|
+
and issubclass(underlying_type, BaseModel)
|
|
79
|
+
and not is_list_field(field_info)
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
FieldRendererRegistry.register_type_renderer_with_predicate(
|
|
83
|
+
is_basemodel_field, BaseModelFieldRenderer
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
register_default_renderers()
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
__all__ = ["PydanticForm", "FieldRendererRegistry", "list_manipulation_js"]
|