Yaml to dataclass loader
Project description
Bentoudev.dataclass
Yaml to dataclass loader. Validates objects based on type information.
Supports folowing types:
- classes marked as dataclass (from
dataclasses
) - int, str, float, list
- Enum (from
enum
) - Optional, List, Dict, Union (from
typing
) - forward references to not yet known types (see example), including self-referencing
Install
pip install bentoudev.dataclass
Documentation
Work in progress, for now, check out examples below or browse the source code.
Example
@dataclass
class Person:
name: str
age: int
money: float
yaml_content = (
'name: John\n'
'age: 30\n'
'money: 400.50'
)
obj = load_yaml_dataclass(Person, 'Person', yaml_content)
assert obj.name == 'John'
Inline loaders
If you need to load complex class from a single value (like string), you can use @inline_loader
attribute
import bentoudev.dataclass.yaml_loader
import bentoudev.dataclass.base
@dataclass
@inline_loader(source_type=str, field_name='name')
class ObjFromStr:
name: str
foo: int
bar: float
@dataclass
class Container:
value: ObjFromStr
obj = load_yaml_dataclass(Container, 'pretty file name', 'value: ThisIsMyName')
assert obj.value.name == 'ThisIsMyName'
Forward references to external types
Sometimes you might want to load dataclass that forward references foreign types, from other modules, in form of a string. In order to support such types, loader must be supplied with list of them.
@dataclass
class MyDataclass:
foo: Optional['my_namespace.project.model.my_ext_dataclass']
local_types = base.get_types_from_modules([__name__, 'my_namespace.project.model.my_ext_dataclass'])
my_obj: MyDataclass = yaml_loader.load_yaml_dataclass(MyDataclass, 'pretty file name', yaml_content, ext_types=local_types)
Self referencing types
Additionaly to external types, self referencing is also supported
from dataclasses import dataclass
import bentoudev.dataclass.yaml_loader as yaml_loader
@dataclass
class MyDataclass:
my_string: str
self_nested: Optional['MyDataclass']
list_of_sth: List[str]
user_data: Dict[str, str]
yaml_content = (
'my_string: foo\n'
'self_nested:\n'
' my_string: bar\n'
' list_of_sth: inline_value\n'
'list_of_sth:\n'
'- first\n'
'- second\n'
'user_data:\n'
' anything: goes'
)
my_obj: MyDataclass = yaml_loader.load_yaml_dataclass(MyDataclass, 'pretty file name', yaml_content)
Remember lines
Additional information about source from which obj/field was loaded can be enabled by using @track_source
attribute, or setting always_track_source
parameter to True (disabled by default, but recomended). Such information is then used to print prettier errors in DataclassLoadError
.
class EKind(Enum):
FIRST = 1
SECOND = 2
@dataclass
class SomeClass:
kind: EKind
try:
obj = yaml_loader.load_yaml_dataclass(SomeClass, '[SomeClass] my_file.yml', 'kind: THIRD', always_track_source=True)
except DataclassLoadError as err:
print(err)
Outputs:
error: Got 'THIRD' when expecting enum 'EKind' with one of values: FIRST, SECOND
in "[SomeClass] my_file.yml", line 1, column 1:
kind: THIRD
^ (line: 1)
If you desire to retrieve this information and print error yourself, access it's source
field in error, or use injected methods get_root_source
or get_field_source
.
try:
obj = yaml_loader.load_yaml_dataclass(SomeClass, 'broken_file.yml', broken_yaml_content, always_track_source=True)
field_src = obj.get_field_source('my_field_name')
print(f"Value location line '{field_src.line_number}', column '{field_src.column_number}'")
except DataclassLoadError as err:
print(f"Error location line '{err.source.line_number}', column '{err.source.column_number}'")
Additionaly, you can control how many lines are loaded for code snippet and in which format line numbers are presented via error_code_snippet_lines
and error_format
(Pretty or MSVC compatible).
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for bentoudev.dataclass-1.4.0.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9760875ab56b35e36e1f2a48de0ff6d561738e063744c65848ff3fc597b2cee8 |
|
MD5 | a394975d36cd3866f7e4b33a8daee2e1 |
|
BLAKE2b-256 | e3e5d7b73c3ccfb14c04f251be34bb63fc22b13a53e91998311c6bd6da761c31 |
Hashes for bentoudev.dataclass-1.4.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 97d27bb62e155132ceb5c06226a54f7e391068e4a6c6f49fca77d7f476d2ee31 |
|
MD5 | db023755c5941de0cb86ade5d036c6bb |
|
BLAKE2b-256 | 6c281d3f6ad3844d3ea5a2c5fadcaa0bcf661ee4c7cdc42865ab14788331fa09 |