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.

@@ -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"]