Update README.md
This commit is contained in:
26
README.md
26
README.md
@@ -1,6 +1,6 @@
|
|||||||
# megasniff
|
# megasniff
|
||||||
|
|
||||||
### Автоматическая валидация данных по схеме и сборка объекта в одном флаконе
|
### Автоматическая валидация данных по схеме, сборка и разборка объекта в одном флаконе
|
||||||
|
|
||||||
#### Как применять:
|
#### Как применять:
|
||||||
|
|
||||||
@@ -18,7 +18,8 @@ class SomeSchema1:
|
|||||||
c: SomeSchema2 | str | None
|
c: SomeSchema2 | str | None
|
||||||
|
|
||||||
|
|
||||||
class SomeSchema2(typing.TypedDict):
|
@dataclasses.dataclass
|
||||||
|
class SomeSchema2:
|
||||||
field1: dict
|
field1: dict
|
||||||
field2: float
|
field2: float
|
||||||
field3: typing.Optional[SomeSchema1]
|
field3: typing.Optional[SomeSchema1]
|
||||||
@@ -28,12 +29,16 @@ class SomeSchema2(typing.TypedDict):
|
|||||||
import megasniff
|
import megasniff
|
||||||
|
|
||||||
infl = megasniff.SchemaInflatorGenerator()
|
infl = megasniff.SchemaInflatorGenerator()
|
||||||
fn = infl.schema_to_inflator(SomeSchema1)
|
defl = megasniff.SchemaDeflatorGenerator()
|
||||||
|
fn_in = infl.schema_to_inflator(SomeSchema1)
|
||||||
|
fn_out = defl.schema_to_deflator(SomeSchema1)
|
||||||
|
|
||||||
# 3. Проверяем что всё работает
|
# 3. Проверяем что всё работает
|
||||||
|
|
||||||
fn({'a': 1, 'b': 2, 'c': {'field1': {}, 'field2': '1.1', 'field3': None}})
|
data = fn_in({'a': 1, 'b': 2, 'c': {'field1': {}, 'field2': '1.1', 'field3': None}})
|
||||||
# SomeSchema1(a=1, b=2.0, c={'field1': {}, 'field2': 1.1, 'field3': None})
|
# SomeSchema1(a=1, b=2.0, c={'field1': {}, 'field2': 1.1, 'field3': None})
|
||||||
|
fn_out(data)
|
||||||
|
# {'a': 1, 'b': 2.0, 'c': {'field1': {}, 'field2': 1.1, 'field3': None}}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -47,7 +52,11 @@ fn({'a': 1, 'b': 2, 'c': {'field1': {}, 'field2': '1.1', 'field3': None}})
|
|||||||
- не проверяет типы generic-словарей, кортежей (реализация ожидается)
|
- не проверяет типы generic-словарей, кортежей (реализация ожидается)
|
||||||
- пользовательские проверки типов должны быть реализованы через наследование и проверки в конструкторе
|
- пользовательские проверки типов должны быть реализованы через наследование и проверки в конструкторе
|
||||||
- опциональный `strict-mode`: выключение приведения базовых типов
|
- опциональный `strict-mode`: выключение приведения базовых типов
|
||||||
- может генерировать кортежи верхнеуровневых объектов при наличии описания схемы (полезно при развертывании аргументов)
|
- для inflation может генерировать кортежи верхнеуровневых объектов при наличии описания схемы (полезно при
|
||||||
|
развертывании аргументов)
|
||||||
|
- `TypedDict` поддерживается только для inflation из-за сложностей выбора варианта при сборке `Union`-полей
|
||||||
|
- для deflation поддерживается включение режима `explicit_casts`, приводящего типы к тем, которые указаны в
|
||||||
|
аннотациях (не распространяется на `Union`-типы, т.к. невозможно определить какой из них должен быть выбран)
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
@@ -88,6 +97,9 @@ class A:
|
|||||||
```
|
```
|
||||||
>>> {"a": [1, 1.1, "321"]}
|
>>> {"a": [1, 1.1, "321"]}
|
||||||
<<< A(a=[1, 1, 321])
|
<<< A(a=[1, 1, 321])
|
||||||
|
>>> A(a=[1, 1.1, "321"])
|
||||||
|
<<< {"a": [1, 1.1, "321"]} # explicit_casts=False
|
||||||
|
<<< {"a": [1, 1, 321]} # explicit_casts=True
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Strict-mode on:
|
#### Strict-mode on:
|
||||||
@@ -101,11 +113,15 @@ class A:
|
|||||||
```
|
```
|
||||||
>>> {"a": [1, 1.1, "321"]}
|
>>> {"a": [1, 1.1, "321"]}
|
||||||
<<< FieldValidationException, т.к. 1.1 не является int
|
<<< FieldValidationException, т.к. 1.1 не является int
|
||||||
|
>>> A(a=[1, 1.1, "321"])
|
||||||
|
<<< FieldValidationException, т.к. 1.1 не является int
|
||||||
```
|
```
|
||||||
|
|
||||||
### Tuple unwrap
|
### Tuple unwrap
|
||||||
|
|
||||||
```
|
```
|
||||||
fn = infl.schema_to_inflator(
|
fn = infl.schema_to_inflator(
|
||||||
(('a', int), TupleSchemaItem(Optional[list[int]], key_name='b', has_default=True, default=None)))
|
(('a', int), TupleSchemaItem(Optional[list[int]], key_name='b', has_default=True, default=None)))
|
||||||
```
|
```
|
||||||
|
|
||||||
Создаёт `fn: (dict[str,Any]) -> tuple[int, Optional[list[int]]]: ...` (сигнатура остаётся `(dict[str,Any])->tuple`)
|
Создаёт `fn: (dict[str,Any]) -> tuple[int, Optional[list[int]]]: ...` (сигнатура остаётся `(dict[str,Any])->tuple`)
|
||||||
Reference in New Issue
Block a user