diff --git a/rusty_results/prelude.py b/rusty_results/prelude.py index ccc4161..f7cfa89 100644 --- a/rusty_results/prelude.py +++ b/rusty_results/prelude.py @@ -3,10 +3,6 @@ from typing import cast, TypeVar, Union, Callable, Generic, Iterator, Tuple, Dict, Any, Optional from rusty_results.exceptions import UnwrapException, EarlyReturnException -try: - from pydantic.fields import ModelField -except ImportError: # pragma: no cover - ... # base inner type generic T = TypeVar('T') @@ -278,70 +274,6 @@ def __invert__(self) -> T: """ return self.early_return() - @classmethod - def __get_validators__(cls): - yield cls.__validate - - @classmethod - def __validate(cls, value: Union["Some", "Empty", Dict], field: "ModelField"): - if isinstance(value, Some): - return cls.__validate_some(value, field) - elif isinstance(value, Empty): - return cls.__validate_empty(value, field) - elif isinstance(value, dict): - return cls.__validate_dict(value, field) - - raise TypeError("Unable to validate Option") # pragma: no cover - - @classmethod - def __validate_some(cls, value: "Some", field: "ModelField"): - import pydantic - - if not field.sub_fields: - raise TypeError("No subfields found for Some") - - field_value = field.sub_fields[0] - valid_value, error = field_value.validate(value.Some, {}, loc="") - if error: - # ignore type since it do not come from a base model - raise pydantic.ValidationError((error, ), Some) # type: ignore - - return Some(valid_value) - - @classmethod - def __validate_empty(cls, _: "Empty", field: "ModelField"): - if field.sub_fields: - raise TypeError("Empty value cannot be bound to external types") - - return Empty() - - @classmethod - def __validate_dict(cls, value: Dict, field: "ModelField"): - import pydantic - - if value == {}: - return Empty() - - if len(value) != 1: - raise TypeError( - "Extra object parameters found, Option can have strictly 0 (Empty) or 1 Value (Some)", - ) - - inner_value = value.get("Some") - if inner_value is None: - raise TypeError("Non Empty Option do not have a proper Value") - - if not field.sub_fields: - raise TypeError("Cannot check Option pydantic subfields validations") # pragma: no cover - - field_value = field.sub_fields[0] - valid_value, error = field_value.validate(value["Some"], {}, loc="") - if error: - # ignore type since it do not come from a base model - raise pydantic.ValidationError(error, Option) # type: ignore # pragma: no cover - - return Some(valid_value) - @dataclass(eq=True, frozen=True) class Some(OptionProtocol[T]): diff --git a/rusty_results/tests/serde/__init__.py b/rusty_results/tests/serde/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/rusty_results/tests/serde/test_option_empty.py b/rusty_results/tests/serde/test_option_empty.py deleted file mode 100644 index 76891f3..0000000 --- a/rusty_results/tests/serde/test_option_empty.py +++ /dev/null @@ -1,41 +0,0 @@ -import pydantic -import pytest -from rusty_results import Option, Empty -import json - - -class Model(pydantic.BaseModel): - optional_value: Option[str] - - -TEST_MODEL_SERIALIZED = '{"optional_value": {}}' - - -def test_serialize(): - model = Model(optional_value=Empty()) - assert model.json() == TEST_MODEL_SERIALIZED - - -def test_deserialize(): - model = Model(**json.loads(TEST_MODEL_SERIALIZED)) - assert model == Model(optional_value=Empty()) - - -def test_deserialize_fails(): - wrong_values = [ - 10, - {"foo": 10}, - ] - with pytest.raises(pydantic.ValidationError): - for value in wrong_values: - Model(foo=value) - - -def test_deserialize_wrong_number_of_values(): - with pytest.raises(pydantic.ValidationError): - Model(optional_value={"Empty": "foo", "Bar": "Baz"}) - - -def test_deserialize_inner_is_none(): - with pytest.raises(pydantic.ValidationError): - Model(optional_value={"Empty": None}) diff --git a/rusty_results/tests/serde/test_option_some.py b/rusty_results/tests/serde/test_option_some.py deleted file mode 100644 index b9d008e..0000000 --- a/rusty_results/tests/serde/test_option_some.py +++ /dev/null @@ -1,49 +0,0 @@ -import pydantic -import pytest - -from rusty_results import Option, Some -import json - - -class Model(pydantic.BaseModel): - optional_value: Option[str] - - -TEST_MODEL_SERIALIZED = '{"optional_value": {"Some": "foo bar"}}' - - -def test_serialize(): - model = Model(optional_value=Some("foo bar")) - assert model.json() == TEST_MODEL_SERIALIZED - - -def test_deserialize(): - model = Model(**json.loads(TEST_MODEL_SERIALIZED)) - assert model == Model(optional_value=Some("foo bar")) - - -def test_deserialize_fails(): - wrong_values = [ - 10, - {"foo": 10}, - ] - with pytest.raises(pydantic.ValidationError): - for value in wrong_values: - Model(foo=value) - - -def test_deserialize_wrong_value_raises(): - class Model(pydantic.BaseModel): - optional_value: Option[str] - with pytest.raises(pydantic.ValidationError): - Model(optional_value=Some((1, 2))) - - -def test_deserialize_wrong_number_of_values(): - with pytest.raises(pydantic.ValidationError): - Model(optional_value={"Some": "foo", "Bar": "Baz"}) - - -def test_deserialize_inner_is_none(): - with pytest.raises(pydantic.ValidationError): - Model(optional_value={"Some": None}) diff --git a/rusty_results/tests/serde/test_result_err.py b/rusty_results/tests/serde/test_result_err.py deleted file mode 100644 index 0e6ca48..0000000 --- a/rusty_results/tests/serde/test_result_err.py +++ /dev/null @@ -1,49 +0,0 @@ -import pydantic -import pytest -from rusty_results import Result, Err -import json - - -class Model(pydantic.BaseModel): - result_value: Result[int, str] - - -TEST_MODEL_SERIALIZED = '{"result_value": {"Error": "foo"}}' - - -def test_serialize(): - model = Model(result_value=Err("foo")) - assert model.json() == TEST_MODEL_SERIALIZED - - -def test_deserialize(): - model = Model(**json.loads(TEST_MODEL_SERIALIZED)) - assert model == Model(result_value=Err("foo")) - - -def test_deserialize_fails(): - wrong_values = [ - 10, - {"foo": 10}, - ] - with pytest.raises(pydantic.ValidationError): - for value in wrong_values: - Model(foo=value) - - -def test_deserialize_wrong_value_raises(): - class Model(pydantic.BaseModel): - optional_value: Result[str, str] - with pytest.raises(pydantic.ValidationError): - Model(optional_value=Err((1, 2))) - - -def test_deserialize_wrong_number_of_values(): - with pytest.raises(pydantic.ValidationError): - Model(optional_value={"Result": "foo", "Bar": "Baz"}) - - -def test_deserialize_inner_is_none(): - with pytest.raises(pydantic.ValidationError): - Model(optional_value={"Result": None}) - diff --git a/rusty_results/tests/serde/test_result_ok.py b/rusty_results/tests/serde/test_result_ok.py deleted file mode 100644 index d634bfd..0000000 --- a/rusty_results/tests/serde/test_result_ok.py +++ /dev/null @@ -1,48 +0,0 @@ -import pydantic -import pytest -from rusty_results import Result, Ok -import json - - -class Model(pydantic.BaseModel): - result_value: Result[int, str] - - -TEST_MODEL_SERIALIZED = '{"result_value": {"Ok": 10}}' - - -def test_serialize(): - model = Model(result_value=Ok(10)) - assert model.json() == TEST_MODEL_SERIALIZED - - -def test_deserialize(): - model = Model(**json.loads(TEST_MODEL_SERIALIZED)) - assert model == Model(result_value=Ok(10)) - - -def test_deserialize_fails(): - wrong_values = [ - 10, - {"foo": 10}, - ] - with pytest.raises(pydantic.ValidationError): - for value in wrong_values: - Model(foo=value) - - -def test_deserialize_wrong_value_raises(): - class Model(pydantic.BaseModel): - optional_value: Result[str, str] - with pytest.raises(pydantic.ValidationError): - Model(optional_value=Ok((1, 2))) - - -def test_deserialize_wrong_number_of_values(): - with pytest.raises(pydantic.ValidationError): - Model(optional_value={"Result": "foo", "Bar": "Baz"}) - - -def test_deserialize_inner_is_none(): - with pytest.raises(pydantic.ValidationError): - Model(optional_value={"Result": None}) diff --git a/setup.py b/setup.py index 23b3f43..72341ef 100644 --- a/setup.py +++ b/setup.py @@ -18,8 +18,5 @@ "Programming Language :: Python :: 3", "Operating System :: OS Independent", ], - extras_require={ - "pydantic": ["pydantic"] - }, python_requires='>=3.7' )