Skip to content

Commit

Permalink
Merge branch 'release/0.32.1'
Browse files Browse the repository at this point in the history
  • Loading branch information
ri-gilfanov committed Jul 21, 2021
2 parents 97a4b17 + 2972704 commit dd1bb06
Show file tree
Hide file tree
Showing 11 changed files with 204 additions and 94 deletions.
46 changes: 7 additions & 39 deletions aiohttp_sqlalchemy/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

from aiohttp_sqlalchemy.constants import DEFAULT_KEY, SA_DEFAULT_KEY
from aiohttp_sqlalchemy.decorators import sa_decorator
from aiohttp_sqlalchemy.deprecation import _handle_deprecation
from aiohttp_sqlalchemy.exceptions import (
DuplicateAppKeyError,
DuplicateRequestKeyError,
Expand All @@ -37,18 +38,15 @@
ListDeleteMixin,
ListEditMixin,
ListViewMixin,
OffsetPagination,
OffsetPaginationMixin,
PrimaryKeyMixin,
SABaseView,
SAMixin,
SAModelDeleteMixin,
SAModelEditMixin,
SAModelMixin,
SAModelView,
SAModelViewMixin,
)

__version__ = '0.30.0'
__version__ = '0.32.1'

__all__ = [
'DEFAULT_KEY',
Expand All @@ -65,30 +63,16 @@
'ListEditMixin',
'ListViewMixin',

'OffsetPagination',
'OffsetPaginationMixin',
'PrimaryKeyMixin',

'SABaseView',
'SA_DEFAULT_KEY',

'SAModelMixin',
'SAModelDeleteMixin',
'SAModelEditMixin',
'SAModelViewMixin',

'SAItemAddMixin',
'SAItemDeleteMixin',
'SAItemEditMixin',
'SAItemViewMixin',

'SAListAddMixin',
'SAListDeleteMixin',
'SAListEditMixin',
'SAListViewMixin',

'SAMixin',
'SAModelView',
'SAPrimaryKeyMixin',
'bind',
'get_session',
'get_session_factory',
Expand Down Expand Up @@ -173,23 +157,7 @@ def __getattr__(name: str) -> Any:
)
return web_handlers

DEPRECATION_MAP = {
'SAItemAddMixin': 'ItemAddMixin',
'SAItemDeleteMixin': 'ItemDeleteMixin',
'SAItemEditMixin': 'ItemEditMixin',
'SAItemViewMixin': 'ItemViewMixin',
'SAListAddMixin': 'ListAddMixin',
'SAListDeleteMixin': 'ListDeleteMixin',
'SAListEditMixin': 'ListEditMixin',
'SAListViewMixin': 'ListViewMixin',
'SAPrimaryKeyMixin': 'PrimaryKeyMixin',
}
if name in DEPRECATION_MAP.keys():
warnings.warn(
f'`{name}` is deprecated. '
f'Use `{DEPRECATION_MAP[name]}`.',
DeprecationWarning,
stacklevel=2,
)
return getattr(web_handlers, DEPRECATION_MAP[name])
name = _handle_deprecation(name)
if name:
return globals().get(name)
raise AttributeError(f"module {__name__} has no attribute {name}")
30 changes: 30 additions & 0 deletions aiohttp_sqlalchemy/deprecation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import warnings
from typing import Any

DEPRECATION_MAP = {
'OffsetPagination': 'OffsetPaginationMixin',
'SAItemAddMixin': 'ItemAddMixin',
'SAItemDeleteMixin': 'ItemDeleteMixin',
'SAItemEditMixin': 'ItemEditMixin',
'SAItemViewMixin': 'ItemViewMixin',
'SAListAddMixin': 'ListAddMixin',
'SAListDeleteMixin': 'ListDeleteMixin',
'SAListEditMixin': 'ListEditMixin',
'SAListViewMixin': 'ListViewMixin',
'SAModelDeleteMixin': 'DeleteStatementMixin',
'SAModelEditMixin': 'UpdateStatementMixin',
'SAModelViewMixin': 'SelectStatementMixin',
'SAPrimaryKeyMixin': 'PrimaryKeyMixin',
}


def _handle_deprecation(name: str) -> Any:
if name in DEPRECATION_MAP.keys():
warnings.warn(
f'`{name}` is deprecated. '
f'Use `{DEPRECATION_MAP[name]}`.',
DeprecationWarning,
stacklevel=3,
)
return DEPRECATION_MAP.get(name)
return None
2 changes: 1 addition & 1 deletion aiohttp_sqlalchemy/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ def get_session_factory(
"""
if isinstance(source, Request):
return cast(TOptSessionFactory, source.config_dict.get(key))
elif isinstance(source, Application):
if isinstance(source, Application):
return cast(TOptSessionFactory, source.get(key))
raise TypeError(
'Arg `source` must be `Application` or `Request` from `aiohttp.web`.'
Expand Down
91 changes: 55 additions & 36 deletions aiohttp_sqlalchemy/web_handlers.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import warnings
from abc import ABCMeta
from typing import Any, List, Optional

import aiohttp_things as ahth
from aiohttp.web import View
from aiohttp.web_urldispatcher import AbstractRoute
from sqlalchemy import delete, select, update
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.sql import Delete, Select, Update
from sqlalchemy_things.pagination import OffsetPaginator
from sqlalchemy_things.pagination import OffsetPage, OffsetPaginator

import aiohttp_sqlalchemy
from aiohttp_sqlalchemy.constants import SA_DEFAULT_KEY
from aiohttp_sqlalchemy.deprecation import _handle_deprecation
from aiohttp_sqlalchemy.utils import get_session


Expand All @@ -25,23 +25,58 @@ class SAModelMixin(SAMixin, metaclass=ABCMeta):
sa_model: Any = None # Not all developers use declarative mapping


class SAModelDeleteMixin(SAModelMixin):
class DeleteStatementMixin(SAModelMixin):
def get_delete_stmt(self, model: Any = None) -> Delete:
return delete(model or self.sa_model)


class SAModelEditMixin(SAModelMixin):
class UpdateStatementMixin(SAModelMixin):
def get_update_stmt(self, model: Any = None) -> Update:
return update(model or self.sa_model)


class SAModelViewMixin(SAModelMixin):
def get_sa_select_stmt(self, model: Any = None) -> Select:
class SelectStatementMixin(SAModelMixin):
def get_select_stmt(self, model: Any = None) -> Select:
return select(model or self.sa_model)


class OffsetPagination(ahth.PaginationMixin):
paginator = OffsetPaginator()
class OffsetPaginationMixin(ahth.PaginationMixin, SelectStatementMixin):
page_key: int = 1
page_key_adapter = int
paginator: OffsetPaginator = OffsetPaginator()

async def execute_select_stmt(
self,
model: Any = None,
key: Optional[str] = None,
) -> Optional[OffsetPage]:
async with self.get_sa_session().begin():
page = await self.paginator.get_page_async(
self.get_sa_session(key or self.sa_session_key),
self.get_select_stmt(model or self.sa_model),
self.page_key,
)
return page

async def prepare_context(self) -> None:
page: Optional[OffsetPage] = await self.execute_select_stmt()

if page:
route: AbstractRoute = self.request.match_info.route

self.context['items'] = page.items

if page.next:
kw = {'page_key': page.next}
self.context['next_url'] = route.url_for().with_query(kw)
else:
self.context['next_url'] = page.next

if page.previous:
kw = {'page_key': page.previous}
self.context['previous_url'] = route.url_for().with_query(kw)
else:
self.context['previous_url'] = page.previous


class PrimaryKeyMixin(ahth.PrimaryKeyMixin, SAModelMixin, metaclass=ABCMeta):
Expand All @@ -54,7 +89,7 @@ def sa_add(self, *, key: Optional[str] = None) -> None:


class ItemDeleteMixin(
SAModelDeleteMixin,
DeleteStatementMixin,
PrimaryKeyMixin,
metaclass=ABCMeta,
):
Expand All @@ -66,25 +101,25 @@ def get_delete_stmt(self, model: Any = None) -> Delete:

class ItemEditMixin(
ahth.ItemMixin,
SAModelEditMixin,
UpdateStatementMixin,
PrimaryKeyMixin,
metaclass=ABCMeta,
):
def get_sa_edit_stmt(self, model: Any = None) -> Update:
def get_update_stmt(self, model: Any = None) -> Update:
return super(). \
get_update_stmt(model). \
where(self.sa_pk_attr == self.pk)


class ItemViewMixin(
ahth.ItemMixin,
SAModelViewMixin,
SelectStatementMixin,
PrimaryKeyMixin,
metaclass=ABCMeta,
):
def get_select_stmt(self, model: Any = None) -> Select:
return super(). \
get_sa_select_stmt(model). \
get_select_stmt(model). \
where(self.sa_pk_attr == self.pk)


Expand All @@ -95,17 +130,17 @@ def sa_add_all(self, *, key: Optional[str] = None) -> None:
self.get_sa_session(key).add_all(self.items)


class ListDeleteMixin(ahth.ListMixin, SAModelDeleteMixin, metaclass=ABCMeta):
class ListDeleteMixin(ahth.ListMixin, DeleteStatementMixin, metaclass=ABCMeta):
pass


class ListEditMixin(ahth.ListMixin, SAModelEditMixin, metaclass=ABCMeta):
class ListEditMixin(ahth.ListMixin, UpdateStatementMixin, metaclass=ABCMeta):
pass


class ListViewMixin(
ahth.ListMixin,
SAModelViewMixin,
SelectStatementMixin,
metaclass=ABCMeta,
):
pass
Expand All @@ -120,23 +155,7 @@ class SAModelView(View, SAModelMixin):


def __getattr__(name: str) -> Any:
DEPRECATION_MAP = {
'SAItemAddMixin': 'ItemAddMixin',
'SAItemDeleteMixin': 'ItemDeleteMixin',
'SAItemEditMixin': 'ItemEditMixin',
'SAItemViewMixin': 'ItemViewMixin',
'SAListAddMixin': 'ListAddMixin',
'SAListDeleteMixin': 'ListDeleteMixin',
'SAListEditMixin': 'ListEditMixin',
'SAListViewMixin': 'ListViewMixin',
'SAPrimaryKeyMixin': 'PrimaryKeyMixin',
}
if name in DEPRECATION_MAP.keys():
warnings.warn(
f'`{name}` is deprecated. '
f'Use `{DEPRECATION_MAP[name]}`.',
DeprecationWarning,
stacklevel=2,
)
return getattr(aiohttp_sqlalchemy.web_handlers, DEPRECATION_MAP[name])
name = _handle_deprecation(name)
if name:
return globals().get(name)
raise AttributeError(f"module {__name__} has no attribute {name}")
10 changes: 5 additions & 5 deletions docs/reference.rst
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Class based views
-----------------
.. warning::

API of most classes of stabilizes to version 1.0.
API of most classes will be stabilized for 1.0 release.

.. autoclass:: aiohttp_sqlalchemy.SAMixin
:inherited-members:
Expand All @@ -26,17 +26,17 @@ Class based views
:members:
:show-inheritance:

.. autoclass:: aiohttp_sqlalchemy.SAModelDeleteMixin
.. autoclass:: aiohttp_sqlalchemy.DeleteStatementMixin
:inherited-members:
:members:
:show-inheritance:

.. autoclass:: aiohttp_sqlalchemy.SAModelEditMixin
.. autoclass:: aiohttp_sqlalchemy.UpdateStatementMixin
:inherited-members:
:members:
:show-inheritance:

.. autoclass:: aiohttp_sqlalchemy.SAModelViewMixin
.. autoclass:: aiohttp_sqlalchemy.SelectStatementMixin
:inherited-members:
:members:
:show-inheritance:
Expand Down Expand Up @@ -70,7 +70,7 @@ Instance mixins

List mixins
^^^^^^^^^^^
.. autoclass:: aiohttp_sqlalchemy.OffsetPagination
.. autoclass:: aiohttp_sqlalchemy.OffsetPaginationMixin
:inherited-members:
:members:
:show-inheritance:
Expand Down
22 changes: 21 additions & 1 deletion docs/releases.rst
Original file line number Diff line number Diff line change
@@ -1,7 +1,27 @@
========
Releases
========
Unreleased
Version 0.32
------------
* Added ``prepare_context()`` method for ``OffsetPaginationMixin``.


Version 0.31
------------
**Added**

* Added default ``page_key`` and ``page_key_adapter`` attributes
for ``OffsetPaginationMixin``;
* Added ``execute_select_stmt()`` method for ``OffsetPaginationMixin``.

**Deprecated**

* ``OffsetPagination`` is deprecated. Use ``OffsetPaginationMixin``;
* ``SAModelDeleteMixin`` is deprecated. Use ``DeleteStatementMixin``;
* ``SAModelEditMixin`` is deprecated. Use ``UpdateStatementMixin``;
* ``SAModelViewMixin`` is deprecated. Use ``SelectStatementMixin``.

Version 0.30
------------
**Deprecated**

Expand Down

0 comments on commit dd1bb06

Please sign in to comment.