Skip to content

Commit 8ef3a71

Browse files
committed
fix issue when "default" is a function or a MISSING TYPE
1 parent 822709c commit 8ef3a71

File tree

3 files changed

+18
-17
lines changed

3 files changed

+18
-17
lines changed

datamodel/models.py

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from enum import Enum, EnumMeta
44
# Dataclass
55
import inspect
6-
from dataclasses import asdict as as_dict, dataclass, make_dataclass
6+
from dataclasses import asdict as as_dict, dataclass, make_dataclass, _MISSING_TYPE
77
from operator import attrgetter
88
from orjson import OPT_INDENT_2
99
from datamodel.fields import fields
@@ -427,9 +427,8 @@ def _apply_extra_metadata(cls, field_schema: dict, _metadata: dict):
427427
'label', 'validator', 'encoder', 'decoder',
428428
'default_factory', 'type'
429429
]
430-
_meta = {k: v for k, v in _metadata.items() if k not in _rejected}
431430

432-
if _meta:
431+
if _meta := {k: v for k, v in _metadata.items() if k not in _rejected}:
433432
field_schema["attrs"] = {
434433
**field_schema["attrs"],
435434
**_meta
@@ -447,11 +446,9 @@ def _apply_defaults_and_constraints(
447446
):
448447
"""Handle default values, secret fields, and min/max constraints."""
449448
if field.default:
450-
d = field.default
451-
if is_callable(d):
452-
field_schema['default'] = f"fn:{d!r}"
453-
else:
454-
field_schema['default'] = f"{d!s}"
449+
if not isinstance(field.default, _MISSING_TYPE) and not callable(field.default):
450+
d = field.default
451+
field_schema['default'] = f"fn:{d!r}" if is_callable(d) else f"{d!s}"
455452

456453
if secret is not None:
457454
field_schema['secret'] = secret
@@ -565,8 +562,8 @@ def schema(cls, as_dict=False, locale: Any = None):
565562
Args:
566563
as_dict (bool, optional): If True,
567564
returns the schema as a Python dictionary.
568-
If False,
569-
returns the schema as a JSON-encoded string. Defaults to False.
565+
If False, returns the schema as a JSON-encoded string.
566+
Defaults to False.
570567
locale (Any, optional):
571568
The locale to use for internationalization of schema
572569
elements like descriptions and labels. Defaults to None.
@@ -616,9 +613,7 @@ def schema(cls, as_dict=False, locale: Any = None):
616613
# Cache the computed schema for subsequent calls
617614
cls.__computed_schema__ = base_schema
618615

619-
if as_dict:
620-
return base_schema
621-
return json_encoder(base_schema)
616+
return base_schema if as_dict else json_encoder(base_schema)
622617

623618
def as_schema(self, top_level: bool = True) -> dict:
624619
"""as_schema.
@@ -693,7 +688,7 @@ def model(cls, dialect: str = "json", **kwargs) -> Any:
693688
result = None
694689
clsname = cls.__name__
695690
schema = cls.Meta.schema
696-
table = cls.Meta.name if cls.Meta.name else clsname.lower()
691+
table = cls.Meta.name or clsname.lower()
697692
columns = cls.columns(cls).items()
698693
if dialect == 'json':
699694
cols = {}

datamodel/version.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
'simple library based on python +3.8 to use Dataclass-syntax'
77
'for interacting with Data'
88
)
9-
__version__ = '0.8.10'
9+
__version__ = '0.8.11'
10+
__copyright__ = 'Copyright (c) 2020-2024 Jesus Lara'
1011
__author__ = 'Jesus Lara'
1112
__author_email__ = '[email protected]'
1213
__license__ = 'BSD'

examples/form_schema.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,10 @@ class Meta:
6868

6969
class BadgeAssign(BaseModel):
7070
reward_id: Reward = Field(
71-
required=True, fk='reward_id|reward', api='rewards', label="Badge"
71+
required=True,
72+
fk='reward_id|reward',
73+
api='rewards',
74+
label="Badge"
7275
)
7376
reward: str = Field(repr=False)
7477
receiver_email: Employee = Field(
@@ -81,7 +84,8 @@ class BadgeAssign(BaseModel):
8184
"url": "api/v1/adp_employees",
8285
"key": "job_code",
8386
"value": "job_code_title"
84-
}
87+
},
88+
default="Job Code"
8589
)
8690
# receiver_user: User = Field(
8791
# required=True,
@@ -105,5 +109,6 @@ class Meta:
105109
strict = True
106110

107111
schema = BadgeAssign.schema(as_dict=False)
112+
print('\n================================')
108113
print(schema)
109114
# pp.pprint(schema)

0 commit comments

Comments
 (0)