Skip to content

Commit 2cb29aa

Browse files
committed
Extract simple classes and types in common.py and create public repository.py interface
1 parent 26cb8c9 commit 2cb29aa

25 files changed

+88
-73
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ to check [SQLAlchemy asyncio documentation](https://docs.sqlalchemy.org/en/20/or
178178
The `SQLAlchemyRepository` and `SQLAlchemyAsyncRepository` class can be used simply by extending them.
179179

180180
```python
181-
from sqlalchemy_bind_manager import SQLAlchemyRepository
181+
from sqlalchemy_bind_manager.repository import SQLAlchemyRepository
182182

183183

184184
class MyModel(model_declarative_base):

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,4 @@ select = ["E", "F", "I"]
7272

7373
[tool.ruff.per-file-ignores]
7474
"__init__.py" = ["F401"]
75+
"repository.py" = ["F401"]

sqlalchemy_bind_manager/__init__.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,6 @@
33
SQLAlchemyBindManager,
44
SQLAlchemyConfig,
55
)
6-
from ._repository import (
7-
PaginatedResult,
8-
SortDirection,
9-
SQLAlchemyAsyncRepository,
10-
SQLAlchemyRepository,
11-
)
126
from ._unit_of_work import (
137
AsyncUnitOfWork,
148
UnitOfWork,
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
from .async_ import SQLAlchemyAsyncRepository
2-
from .base_repository import PaginatedResult, SortDirection
2+
from .base_repository import SortDirection
3+
from .common import Cursor, CursorPaginatedResult, PaginatedResult
34
from .sync import SQLAlchemyRepository

sqlalchemy_bind_manager/_repository/async_.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,10 @@
1818
from .._transaction_handler import AsyncSessionHandler
1919
from ..exceptions import InvalidConfig, ModelNotFound
2020
from .base_repository import (
21-
MODEL,
22-
PRIMARY_KEY,
2321
BaseRepository,
24-
Cursor,
25-
CursorPaginatedResult,
26-
PaginatedResult,
2722
SortDirection,
2823
)
24+
from .common import MODEL, PRIMARY_KEY, Cursor, CursorPaginatedResult, PaginatedResult
2925

3026

3127
class SQLAlchemyAsyncRepository(Generic[MODEL], BaseRepository[MODEL], ABC):

sqlalchemy_bind_manager/_repository/base_repository.py

Lines changed: 10 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -12,61 +12,31 @@
1212
Mapping,
1313
Tuple,
1414
Type,
15-
TypeVar,
1615
Union,
1716
)
1817

19-
from pydantic import BaseModel
20-
from pydantic.generics import GenericModel
2118
from sqlalchemy import asc, desc, func, inspect, select
2219
from sqlalchemy.orm import Mapper, aliased, class_mapper, lazyload
2320
from sqlalchemy.orm.exc import UnmappedClassError
2421
from sqlalchemy.sql import Select
2522

2623
from sqlalchemy_bind_manager.exceptions import InvalidModel, UnmappedProperty
2724

28-
MODEL = TypeVar("MODEL")
29-
PRIMARY_KEY = Union[str, int, tuple, dict]
25+
from .common import (
26+
MODEL,
27+
Cursor,
28+
CursorPageInfo,
29+
CursorPaginatedResult,
30+
PageInfo,
31+
PaginatedResult,
32+
)
3033

3134

3235
class SortDirection(Enum):
3336
ASC = partial(asc)
3437
DESC = partial(desc)
3538

3639

37-
class PageInfo(BaseModel):
38-
page: int
39-
items_per_page: int
40-
total_pages: int
41-
total_items: int
42-
has_next_page: bool
43-
has_previous_page: bool
44-
45-
46-
class PaginatedResult(GenericModel, Generic[MODEL]):
47-
items: List[MODEL]
48-
page_info: PageInfo
49-
50-
51-
class CursorPageInfo(BaseModel):
52-
items_per_page: int
53-
total_items: int
54-
has_next_page: bool = False
55-
has_previous_page: bool = False
56-
start_cursor: Union[str, None] = None
57-
end_cursor: Union[str, None] = None
58-
59-
60-
class CursorPaginatedResult(GenericModel, Generic[MODEL]):
61-
items: List[MODEL]
62-
page_info: CursorPageInfo
63-
64-
65-
class Cursor(BaseModel):
66-
column: str
67-
value: str
68-
69-
7040
class BaseRepository(Generic[MODEL], ABC):
7141
_max_query_limit: int = 50
7242
_model: Type[MODEL]
@@ -435,7 +405,8 @@ def _build_cursor_paginated_result(
435405
return result_structure
436406

437407
def encode_cursor(self, cursor: Cursor) -> str:
438-
return b64encode(cursor.json().encode()).decode()
408+
serialised_cursor = cursor.json()
409+
return b64encode(serialised_cursor.encode()).decode()
439410

440411
def decode_cursor(self, cursor: str) -> Cursor:
441412
return Cursor.parse_raw(b64decode(cursor))
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from typing import Generic, List, TypeVar, Union
2+
3+
from pydantic import BaseModel
4+
from pydantic.generics import GenericModel
5+
6+
MODEL = TypeVar("MODEL")
7+
PRIMARY_KEY = Union[str, int, tuple, dict]
8+
9+
10+
class PageInfo(BaseModel):
11+
page: int
12+
items_per_page: int
13+
total_pages: int
14+
total_items: int
15+
has_next_page: bool
16+
has_previous_page: bool
17+
18+
19+
class PaginatedResult(GenericModel, Generic[MODEL]):
20+
items: List[MODEL]
21+
page_info: PageInfo
22+
23+
24+
class CursorPageInfo(BaseModel):
25+
items_per_page: int
26+
total_items: int
27+
has_next_page: bool = False
28+
has_previous_page: bool = False
29+
start_cursor: Union[str, None] = None
30+
end_cursor: Union[str, None] = None
31+
32+
33+
class CursorPaginatedResult(GenericModel, Generic[MODEL]):
34+
items: List[MODEL]
35+
page_info: CursorPageInfo
36+
37+
38+
class Cursor(BaseModel):
39+
column: str
40+
value: str

sqlalchemy_bind_manager/_repository/sync.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,10 @@
1818
from .._transaction_handler import SessionHandler
1919
from ..exceptions import InvalidConfig, ModelNotFound
2020
from .base_repository import (
21-
MODEL,
22-
PRIMARY_KEY,
2321
BaseRepository,
24-
Cursor,
25-
CursorPaginatedResult,
26-
PaginatedResult,
2722
SortDirection,
2823
)
24+
from .common import MODEL, PRIMARY_KEY, Cursor, CursorPaginatedResult, PaginatedResult
2925

3026

3127
class SQLAlchemyRepository(Generic[MODEL], BaseRepository[MODEL], ABC):

sqlalchemy_bind_manager/_unit_of_work.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@
44
from sqlalchemy.ext.asyncio import AsyncSession
55
from sqlalchemy.orm import Session
66

7-
from sqlalchemy_bind_manager import SQLAlchemyAsyncRepository, SQLAlchemyRepository
87
from sqlalchemy_bind_manager._bind_manager import SQLAlchemyAsyncBind, SQLAlchemyBind
98
from sqlalchemy_bind_manager._transaction_handler import (
109
AsyncSessionHandler,
1110
SessionHandler,
1211
)
12+
from sqlalchemy_bind_manager.repository import (
13+
SQLAlchemyAsyncRepository,
14+
SQLAlchemyRepository,
15+
)
1316

1417

1518
class UnitOfWork:

sqlalchemy_bind_manager/protocols.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
runtime_checkable,
1010
)
1111

12-
from sqlalchemy_bind_manager._repository.base_repository import (
12+
from sqlalchemy_bind_manager._repository.common import (
1313
MODEL,
1414
PRIMARY_KEY,
15+
)
16+
from sqlalchemy_bind_manager.repository import (
1517
Cursor,
1618
CursorPaginatedResult,
1719
PaginatedResult,

0 commit comments

Comments
 (0)