Skip to content

Commit

Permalink
rename and move Config class to model.transformer
Browse files Browse the repository at this point in the history
  • Loading branch information
glorpen committed May 3, 2022
1 parent 859c118 commit da54b56
Show file tree
Hide file tree
Showing 10 changed files with 38 additions and 34 deletions.
7 changes: 4 additions & 3 deletions src/glorpen/config/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import contextlib

from glorpen.config.config import Config
from glorpen.config.model.transformer import Transformer
from glorpen.config.model.schema import Schema
from glorpen.config.validation import Validator


Expand All @@ -12,8 +13,8 @@ def _try_import():
return


def default(validator: Validator = None):
c = Config(validator or Validator())
def default(schema: Schema = None, validator: Validator = None):
c = Transformer(schema or Schema(), validator or Validator())

from glorpen.config.fields.simple import UnionType, SimpleTypes, CollectionTypes, BooleanType, PathType, LiteralType

Expand Down
2 changes: 1 addition & 1 deletion src/glorpen/config/fields/log.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import logging
import typing

from glorpen.config.config import ConfigType
from glorpen.config.model.transformer import ConfigType
from glorpen.config.model.schema import Field


Expand Down
2 changes: 1 addition & 1 deletion src/glorpen/config/fields/simple.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import pathlib
import typing

from glorpen.config.config import ConfigType, CollectionValueError
from glorpen.config.model.transformer import ConfigType, CollectionValueError
from glorpen.config.model import schema


Expand Down
2 changes: 1 addition & 1 deletion src/glorpen/config/fields/version.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import semver

from glorpen.config.config import ConfigType
from glorpen.config.model.transformer import ConfigType
from glorpen.config.model.schema import Field


Expand Down
2 changes: 2 additions & 0 deletions src/glorpen/config/model/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ def is_type_subclass(self, class_or_tuple):
return isinstance(self.type, type) and issubclass(self.type, class_or_tuple)


# TODO: ForwardRef

class Schema:
def generate(self, tp, options=None):
return self._any_to_field(tp, options or {})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,14 @@
import types
import typing

from glorpen.config.model import schema
from glorpen.config.model.schema import Schema
from glorpen.config.model.schema import Field, Schema
from glorpen.config.validation import Validator

_NoneType = types.NoneType if hasattr(types, "NoneType") else type(None)


class DataConverter(typing.Protocol):
def __call__(self, data: typing.Any, type, metadata=None, default_factory=None):
def __call__(self, data: typing.Any, model: Field):
pass


Expand All @@ -22,7 +21,7 @@ def __init__(self, converter: DataConverter):
self._converter = converter

@abc.abstractmethod
def to_model(self, data: typing.Any, model: schema.Field):
def to_model(self, data: typing.Any, model: Field):
pass


Expand Down Expand Up @@ -61,16 +60,16 @@ def _format_items(cls, items: ValueErrorItems):
yield f"{f_key}{key_suffix}{f_msg}"


class Config:
"""Config validator and normalizer."""
class Transformer:
"""Config normalizer."""

_validator: typing.Optional[Validator]
_registered_types: typing.List[ConfigType]

def __init__(self, schema: Schema,
validator: typing.Optional[Validator] = None,
types: typing.Optional[typing.Iterable[typing.Type[ConfigType]]] = None):
super(Config, self).__init__()
super(Transformer, self).__init__()

self._schema = schema
self._registered_types = []
Expand All @@ -81,7 +80,7 @@ def __init__(self, schema: Schema,
self.register_type(t)

@classmethod
def _handle_optional_values(cls, model: schema.Field):
def _handle_optional_values(cls, model: Field):
if model.type is _NoneType:
return None
if model.type is typing.Union and model.has_arg_with_type(_NoneType):
Expand All @@ -91,7 +90,7 @@ def _handle_optional_values(cls, model: schema.Field):

raise ValueError("No value provided")

def _as_model(self, data: typing.Any, model: schema.Field):
def _as_model(self, data: typing.Any, model: Field):
if data is None:
return self._handle_optional_values(model)

Expand All @@ -116,7 +115,7 @@ def _get_default_factory(cls, field: dataclasses.Field):
else:
return None

def _from_named_fields(self, data: typing.Dict, model: schema.Field):
def _from_named_fields(self, data: typing.Dict, model: Field):
kwargs = {}
errors = {}
known_fields = set()
Expand All @@ -138,7 +137,7 @@ def _from_named_fields(self, data: typing.Dict, model: schema.Field):
self._validator.validate(instance)
return instance

def _from_type(self, data: typing.Any, model: schema.Field):
def _from_type(self, data: typing.Any, model: Field):
for reg_type in self._registered_types:
value = reg_type.to_model(data=data, model=model)
if value is not None:
Expand Down
8 changes: 4 additions & 4 deletions tests/fields/test_log.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import logging

from glorpen.config import Config
from glorpen.config.fields.log import LogLevelType, LogLevel
from glorpen.config.fields.log import LogLevel, LogLevelType
from glorpen.config.model.schema import Schema
from glorpen.config.model.transformer import Transformer


def create_config() -> Config:
return Config(schema=Schema(), types=[LogLevelType])
def create_config() -> Transformer:
return Transformer(schema=Schema(), types=[LogLevelType])


def test_level():
Expand Down
6 changes: 3 additions & 3 deletions tests/fields/test_simple.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@

import pytest

from glorpen.config import Config
from glorpen.config.fields.simple import BooleanType, LiteralType, PathType, CollectionTypes, SimpleTypes
from glorpen.config.fields.simple import BooleanType, CollectionTypes, LiteralType, PathType, SimpleTypes
from glorpen.config.model.schema import Schema
from glorpen.config.model.transformer import Transformer
from glorpen.config.validation import Validator


def create_config(types=None):
return Config(schema=Schema(), validator=Validator(), types=types)
return Transformer(schema=Schema(), validator=Validator(), types=types)


class Dummy:
Expand Down
6 changes: 3 additions & 3 deletions tests/fields/test_version.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
from semver import VersionInfo

from glorpen.config import Config
from glorpen.config.fields.version import VersionType
from glorpen.config.model.schema import Schema
from glorpen.config.model.transformer import Transformer


def create_config() -> Config:
return Config(schema=Schema(), types=[VersionType])
def create_config():
return Transformer(schema=Schema(), types=[VersionType])


def test_version():
Expand Down
16 changes: 9 additions & 7 deletions tests/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@

import pytest

from glorpen.config.config import Config
from glorpen.config.fields.simple import SimpleTypes
from glorpen.config.model.schema import Schema
from glorpen.config.model.transformer import Transformer
from glorpen.config.validation import Validator


def create_config(types=None):
return Config(schema=Schema(), validator=Validator(), types=types)
return Transformer(schema=Schema(), validator=Validator(), types=types)


def test_default_import():
from glorpen.config import default
assert isinstance(default(), Config)
assert isinstance(default(), Transformer)


class TestConfig:
Expand Down Expand Up @@ -69,10 +69,12 @@ def validate(self):
assert self.password == self.password_repeated, "Bad password"

with pytest.raises(ValueError, match="Bad password"):
c.to_model({
"password": "test1",
"password_repeated": "test2"
}, Data)
c.to_model(
{
"password": "test1",
"password_repeated": "test2"
}, Data
)

def test_validation_with_exception(self):
c = create_config()
Expand Down

0 comments on commit da54b56

Please sign in to comment.