Compare commits

8 Commits

Author SHA1 Message Date
Georg K
3529809970 fix: use CI_COMMIT_TAG from gitlab to detect version 2022-07-28 02:18:00 +03:00
Georg K
1f320c1ad8 fix: put private pypi version to environment 2022-07-28 02:16:54 +03:00
Georg K
c4b5c20ff4 fix: version equals to upstream 2022-07-28 02:04:55 +03:00
Georg K
69141302cf fix: test loop fixture rename to event_loop 2022-07-28 01:58:33 +03:00
Georg K
df2ef1adc0 feat: remove raise_validation_errors 2022-07-28 01:53:44 +03:00
Georg K
76dd0106be fix: update tests 2022-07-28 01:53:23 +03:00
Georg K
9d488db276 bump: update setup extras_require packages for test, ci; feat: update requirements/*.txt 2022-07-28 01:24:20 +03:00
Georg K
4d7e5b0384 fix: fix tags 2022-03-30 20:27:36 +03:00
14 changed files with 108 additions and 104 deletions

View File

@@ -3,8 +3,9 @@ stages:
publish-pypi: publish-pypi:
stage: package stage: package
image: python:3.8 image: python:3.10
script: script:
- sed -i -e 's/1.12.1/${CI_COMMIT_TAG}/g' aiohttp_pydantic/__init__.py
- pip install -U setuptools wheel pip; pip install invoke - pip install -U setuptools wheel pip; pip install invoke
- invoke upload --pypi-user ${PYPI_REPO_USER} --pypi-password ${PYPI_REPO_PASSWORD} --pypi-url ${PYPI_REPO_URL} - invoke upload --pypi-user ${PYPI_REPO_USER} --pypi-password ${PYPI_REPO_PASSWORD} --pypi-url ${PYPI_REPO_URL}
only: only:

View File

@@ -1,5 +1,5 @@
from .view import PydanticView from .view import PydanticView
__version__ = "1.12.1_0" __version__ = "1.12.1"
__all__ = ("PydanticView", "__version__") __all__ = ("PydanticView", "__version__")

View File

@@ -14,14 +14,11 @@ def setup(
url_prefix: str = "/oas", url_prefix: str = "/oas",
enable: bool = True, enable: bool = True,
version_spec: Optional[str] = None, version_spec: Optional[str] = None,
title_spec: Optional[str] = None, title_spec: Optional[str] = None
raise_validation_errors: bool = False,
): ):
if enable: if enable:
oas_app = web.Application() oas_app = web.Application()
oas_app["apps to expose"] = tuple(apps_to_expose) or (app,) oas_app["apps to expose"] = tuple(apps_to_expose) or (app,)
for a in oas_app["apps to expose"]:
a['raise_validation_errors'] = raise_validation_errors
oas_app["index template"] = jinja2.Template( oas_app["index template"] = jinja2.Template(
resources.read_text("aiohttp_pydantic.oas", "index.j2") resources.read_text("aiohttp_pydantic.oas", "index.j2")
) )

View File

@@ -127,10 +127,7 @@ def inject_params(
else: else:
injector.inject(self.request, args, kwargs) injector.inject(self.request, args, kwargs)
except ValidationError as error: except ValidationError as error:
if self.request.app['raise_validation_errors']: return await self.on_validation_error(error, injector.context)
raise
else:
return await self.on_validation_error(error, injector.context)
return await handler(self, *args, **kwargs) return await handler(self, *args, **kwargs)

View File

@@ -3,4 +3,7 @@ requires = [
"setuptools >= 46.4.0", "setuptools >= 46.4.0",
"wheel", "wheel",
] ]
build-backend = "setuptools.build_meta" build-backend = "setuptools.build_meta"
[tool.pytest.ini_options]
asyncio_mode = "auto"

View File

@@ -1,42 +1,42 @@
async-timeout==3.0.1 aiohttp==3.8.1
attrs==21.2.0 aiosignal==1.2.0
bleach==4.0.0 async-timeout==4.0.2
certifi==2021.5.30 atomicwrites==1.4.1
cffi==1.14.6 attrs==21.4.0
chardet==4.0.0 bleach==5.0.1
charset-normalizer==2.0.4 certifi==2022.6.15
codecov==2.1.11 charset-normalizer==2.1.0
colorama==0.4.4 codecov==2.1.12
coverage==5.5 colorama==0.4.5
cryptography==3.4.7 commonmark==0.9.1
docutils==0.17.1 coverage==6.4.2
idna==3.2 docutils==0.19
importlib-metadata==4.6.3 frozenlist==1.3.0
idna==3.3
importlib-metadata==4.12.0
iniconfig==1.1.1 iniconfig==1.1.1
jeepney==0.7.1 keyring==23.7.0
keyring==23.0.1 multidict==6.0.2
multidict==5.1.0 packaging==21.3
packaging==21.0 pkginfo==1.8.3
pkginfo==1.7.1 pluggy==1.0.0
pluggy==0.13.1 py==1.11.0
py==1.10.0 Pygments==2.12.0
pycparser==2.20 pyparsing==3.0.9
Pygments==2.9.0 pytest==7.1.2
pyparsing==2.4.7 pytest-aiohttp==1.0.4
pytest==6.1.2 pytest-asyncio==0.19.0
pytest-aiohttp==0.3.0 pytest-cov==3.0.0
pytest-cov==2.10.1 pywin32-ctypes==0.2.0
readme-renderer==29.0 readme-renderer==35.0
requests==2.26.0 requests==2.28.1
requests-toolbelt==0.9.1 requests-toolbelt==0.9.1
rfc3986==1.5.0 rfc3986==2.0.0
SecretStorage==3.3.1 rich==12.5.1
six==1.16.0 six==1.16.0
toml==0.10.2 tomli==2.0.1
tqdm==4.62.0 twine==4.0.1
twine==3.4.2 urllib3==1.26.11
typing-extensions==3.10.0.0
urllib3==1.26.6
webencodings==0.5.1 webencodings==0.5.1
yarl==1.6.3 yarl==1.7.2
zipp==3.5.0 zipp==3.8.1

View File

@@ -1,23 +1,28 @@
async-timeout==3.0.1 aiohttp==3.8.1
attrs==21.2.0 aiosignal==1.2.0
bleach==4.0.0 async-timeout==4.0.2
chardet==4.0.0 atomicwrites==1.4.1
coverage==5.5 attrs==21.4.0
docutils==0.17.1 bleach==5.0.1
idna==3.2 charset-normalizer==2.1.0
colorama==0.4.5
coverage==6.4.2
docutils==0.19
frozenlist==1.3.0
idna==3.3
iniconfig==1.1.1 iniconfig==1.1.1
multidict==5.1.0 multidict==6.0.2
packaging==21.0 packaging==21.3
pluggy==0.13.1 pluggy==1.0.0
py==1.10.0 py==1.11.0
Pygments==2.9.0 Pygments==2.12.0
pyparsing==2.4.7 pyparsing==3.0.9
pytest==6.1.2 pytest==7.1.2
pytest-aiohttp==0.3.0 pytest-aiohttp==1.0.4
pytest-cov==2.10.1 pytest-asyncio==0.19.0
readme-renderer==29.0 pytest-cov==3.0.0
readme-renderer==35.0
six==1.16.0 six==1.16.0
toml==0.10.2 tomli==2.0.1
typing-extensions==3.10.0.0
webencodings==0.5.1 webencodings==0.5.1
yarl==1.6.3 yarl==1.7.2

View File

@@ -36,14 +36,14 @@ install_requires =
[options.extras_require] [options.extras_require]
test = test =
pytest==6.1.2 pytest==7.1.2
pytest-aiohttp==0.3.0 pytest-aiohttp==1.0.4
pytest-cov==2.10.1 pytest-cov==3.0.0
readme-renderer==29.0 readme-renderer==35.0
ci = ci =
%(test)s %(test)s
codecov==2.1.11 codecov==2.1.12
twine==3.4.2 twine==4.0.1
[options.packages.find] [options.packages.find]
exclude = exclude =

View File

@@ -37,13 +37,14 @@ class ArticleView(PydanticView):
async def test_post_an_article_with_wrong_type_field_should_return_an_error_message( async def test_post_an_article_with_wrong_type_field_should_return_an_error_message(
aiohttp_client, loop aiohttp_client, event_loop
): ):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleView) app.router.add_view("/article", ArticleView)
client = await aiohttp_client(app) client = await aiohttp_client(app)
resp = await client.post("/article", json={"name": "foo", "nb_page": "foo"}) resp = await client.post("/article", json={"name": "foo", "nb_page": "foo"})
assert resp.status == 400 assert resp.status == 400
assert resp.content_type == "application/json" assert resp.content_type == "application/json"
assert await resp.json() == [ assert await resp.json() == [

View File

@@ -98,7 +98,7 @@ async def ensure_content_durability(client):
@pytest.fixture @pytest.fixture
async def generated_oas(aiohttp_client, loop) -> web.Application: async def generated_oas(aiohttp_client, event_loop) -> web.Application:
app = web.Application() app = web.Application()
app.router.add_view("/pets", PetCollectionView) app.router.add_view("/pets", PetCollectionView)
app.router.add_view("/pets/{id}", PetItemView) app.router.add_view("/pets/{id}", PetItemView)

View File

@@ -29,7 +29,7 @@ class ArticleView(PydanticView):
async def test_post_an_article_without_required_field_should_return_an_error_message( async def test_post_an_article_without_required_field_should_return_an_error_message(
aiohttp_client, loop aiohttp_client, event_loop
): ):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleView) app.router.add_view("/article", ArticleView)
@@ -49,7 +49,7 @@ async def test_post_an_article_without_required_field_should_return_an_error_mes
async def test_post_an_article_with_wrong_type_field_should_return_an_error_message( async def test_post_an_article_with_wrong_type_field_should_return_an_error_message(
aiohttp_client, loop aiohttp_client, event_loop
): ):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleView) app.router.add_view("/article", ArticleView)
@@ -68,7 +68,7 @@ async def test_post_an_article_with_wrong_type_field_should_return_an_error_mess
] ]
async def test_post_an_array_json_is_supported(aiohttp_client, loop): async def test_post_an_array_json_is_supported(aiohttp_client, event_loop):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleView) app.router.add_view("/article", ArticleView)
@@ -81,7 +81,7 @@ async def test_post_an_array_json_is_supported(aiohttp_client, loop):
async def test_post_an_array_json_to_an_object_model_should_return_an_error( async def test_post_an_array_json_to_an_object_model_should_return_an_error(
aiohttp_client, loop aiohttp_client, event_loop
): ):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleView) app.router.add_view("/article", ArticleView)
@@ -101,7 +101,7 @@ async def test_post_an_array_json_to_an_object_model_should_return_an_error(
async def test_post_an_object_json_to_a_list_model_should_return_an_error( async def test_post_an_object_json_to_a_list_model_should_return_an_error(
aiohttp_client, loop aiohttp_client, event_loop
): ):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleView) app.router.add_view("/article", ArticleView)
@@ -120,7 +120,7 @@ async def test_post_an_object_json_to_a_list_model_should_return_an_error(
] ]
async def test_post_a_valid_article_should_return_the_parsed_type(aiohttp_client, loop): async def test_post_a_valid_article_should_return_the_parsed_type(aiohttp_client, event_loop):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleView) app.router.add_view("/article", ArticleView)

View File

@@ -61,7 +61,7 @@ class ArticleViewWithSignatureGroup(PydanticView):
async def test_get_article_without_required_header_should_return_an_error_message( async def test_get_article_without_required_header_should_return_an_error_message(
aiohttp_client, loop aiohttp_client, event_loop
): ):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleView) app.router.add_view("/article", ArticleView)
@@ -81,7 +81,7 @@ async def test_get_article_without_required_header_should_return_an_error_messag
async def test_get_article_with_wrong_header_type_should_return_an_error_message( async def test_get_article_with_wrong_header_type_should_return_an_error_message(
aiohttp_client, loop aiohttp_client, event_loop
): ):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleView) app.router.add_view("/article", ArticleView)
@@ -101,7 +101,7 @@ async def test_get_article_with_wrong_header_type_should_return_an_error_message
async def test_get_article_with_valid_header_should_return_the_parsed_type( async def test_get_article_with_valid_header_should_return_the_parsed_type(
aiohttp_client, loop aiohttp_client, event_loop
): ):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleView) app.router.add_view("/article", ArticleView)
@@ -116,7 +116,7 @@ async def test_get_article_with_valid_header_should_return_the_parsed_type(
async def test_get_article_with_valid_header_containing_hyphen_should_be_returned( async def test_get_article_with_valid_header_containing_hyphen_should_be_returned(
aiohttp_client, loop aiohttp_client, event_loop
): ):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleView) app.router.add_view("/article", ArticleView)
@@ -130,7 +130,7 @@ async def test_get_article_with_valid_header_containing_hyphen_should_be_returne
assert await resp.json() == {"signature": "2020-10-04T18:01:00"} assert await resp.json() == {"signature": "2020-10-04T18:01:00"}
async def test_wrong_value_to_header_defined_with_str_enum(aiohttp_client, loop): async def test_wrong_value_to_header_defined_with_str_enum(aiohttp_client, event_loop):
app = web.Application() app = web.Application()
app.router.add_view("/coord", ViewWithEnumType) app.router.add_view("/coord", ViewWithEnumType)
@@ -153,7 +153,7 @@ async def test_wrong_value_to_header_defined_with_str_enum(aiohttp_client, loop)
assert resp.content_type == "application/json" assert resp.content_type == "application/json"
async def test_correct_value_to_header_defined_with_str_enum(aiohttp_client, loop): async def test_correct_value_to_header_defined_with_str_enum(aiohttp_client, event_loop):
app = web.Application() app = web.Application()
app.router.add_view("/coord", ViewWithEnumType) app.router.add_view("/coord", ViewWithEnumType)
@@ -164,7 +164,7 @@ async def test_correct_value_to_header_defined_with_str_enum(aiohttp_client, loo
assert resp.content_type == "application/json" assert resp.content_type == "application/json"
async def test_with_signature_group(aiohttp_client, loop): async def test_with_signature_group(aiohttp_client, event_loop):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleViewWithSignatureGroup) app.router.add_view("/article", ArticleViewWithSignatureGroup)

View File

@@ -11,7 +11,7 @@ class ArticleView(PydanticView):
async def test_get_article_with_correct_path_parameters_should_return_parameters_in_path( async def test_get_article_with_correct_path_parameters_should_return_parameters_in_path(
aiohttp_client, loop aiohttp_client, event_loop
): ):
app = web.Application() app = web.Application()
app.router.add_view("/article/{author_id}/tag/{tag}/before/{date}", ArticleView) app.router.add_view("/article/{author_id}/tag/{tag}/before/{date}", ArticleView)
@@ -24,7 +24,7 @@ async def test_get_article_with_correct_path_parameters_should_return_parameters
async def test_get_article_with_wrong_path_parameters_should_return_error( async def test_get_article_with_wrong_path_parameters_should_return_error(
aiohttp_client, loop aiohttp_client, event_loop
): ):
app = web.Application() app = web.Application()
app.router.add_view("/article/{author_id}/tag/{tag}/before/{date}", ArticleView) app.router.add_view("/article/{author_id}/tag/{tag}/before/{date}", ArticleView)

View File

@@ -55,7 +55,7 @@ class ArticleViewWithPaginationGroup(PydanticView):
async def test_get_article_without_required_qs_should_return_an_error_message( async def test_get_article_without_required_qs_should_return_an_error_message(
aiohttp_client, loop aiohttp_client, event_loop
): ):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleView) app.router.add_view("/article", ArticleView)
@@ -75,7 +75,7 @@ async def test_get_article_without_required_qs_should_return_an_error_message(
async def test_get_article_with_wrong_qs_type_should_return_an_error_message( async def test_get_article_with_wrong_qs_type_should_return_an_error_message(
aiohttp_client, loop aiohttp_client, event_loop
): ):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleView) app.router.add_view("/article", ArticleView)
@@ -95,7 +95,7 @@ async def test_get_article_with_wrong_qs_type_should_return_an_error_message(
async def test_get_article_with_valid_qs_should_return_the_parsed_type( async def test_get_article_with_valid_qs_should_return_the_parsed_type(
aiohttp_client, loop aiohttp_client, event_loop
): ):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleView) app.router.add_view("/article", ArticleView)
@@ -114,7 +114,7 @@ async def test_get_article_with_valid_qs_should_return_the_parsed_type(
async def test_get_article_with_valid_qs_and_omitted_optional_should_return_default_value( async def test_get_article_with_valid_qs_and_omitted_optional_should_return_default_value(
aiohttp_client, loop aiohttp_client, event_loop
): ):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleView) app.router.add_view("/article", ArticleView)
@@ -133,7 +133,7 @@ async def test_get_article_with_valid_qs_and_omitted_optional_should_return_defa
async def test_get_article_with_multiple_value_for_qs_age_must_failed( async def test_get_article_with_multiple_value_for_qs_age_must_failed(
aiohttp_client, loop aiohttp_client, event_loop
): ):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleView) app.router.add_view("/article", ArticleView)
@@ -153,7 +153,7 @@ async def test_get_article_with_multiple_value_for_qs_age_must_failed(
assert resp.content_type == "application/json" assert resp.content_type == "application/json"
async def test_get_article_with_multiple_value_of_tags(aiohttp_client, loop): async def test_get_article_with_multiple_value_of_tags(aiohttp_client, event_loop):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleView) app.router.add_view("/article", ArticleView)
@@ -172,7 +172,7 @@ async def test_get_article_with_multiple_value_of_tags(aiohttp_client, loop):
assert resp.content_type == "application/json" assert resp.content_type == "application/json"
async def test_get_article_with_one_value_of_tags_must_be_a_list(aiohttp_client, loop): async def test_get_article_with_one_value_of_tags_must_be_a_list(aiohttp_client, event_loop):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleView) app.router.add_view("/article", ArticleView)
@@ -191,7 +191,7 @@ async def test_get_article_with_one_value_of_tags_must_be_a_list(aiohttp_client,
assert resp.content_type == "application/json" assert resp.content_type == "application/json"
async def test_get_article_without_required_field_page(aiohttp_client, loop): async def test_get_article_without_required_field_page(aiohttp_client, event_loop):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleViewWithPaginationGroup) app.router.add_view("/article", ArticleViewWithPaginationGroup)
@@ -210,7 +210,7 @@ async def test_get_article_without_required_field_page(aiohttp_client, loop):
assert resp.content_type == "application/json" assert resp.content_type == "application/json"
async def test_get_article_with_page(aiohttp_client, loop): async def test_get_article_with_page(aiohttp_client, event_loop):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleViewWithPaginationGroup) app.router.add_view("/article", ArticleViewWithPaginationGroup)
@@ -222,7 +222,7 @@ async def test_get_article_with_page(aiohttp_client, loop):
assert resp.content_type == "application/json" assert resp.content_type == "application/json"
async def test_get_article_with_page_and_page_size(aiohttp_client, loop): async def test_get_article_with_page_and_page_size(aiohttp_client, event_loop):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleViewWithPaginationGroup) app.router.add_view("/article", ArticleViewWithPaginationGroup)
@@ -236,7 +236,7 @@ async def test_get_article_with_page_and_page_size(aiohttp_client, loop):
assert resp.content_type == "application/json" assert resp.content_type == "application/json"
async def test_get_article_with_page_and_wrong_page_size(aiohttp_client, loop): async def test_get_article_with_page_and_wrong_page_size(aiohttp_client, event_loop):
app = web.Application() app = web.Application()
app.router.add_view("/article", ArticleViewWithPaginationGroup) app.router.add_view("/article", ArticleViewWithPaginationGroup)