Skip to content

Commit

Permalink
✨ fixed literal import | improved code quality
Browse files Browse the repository at this point in the history
  • Loading branch information
danielhasan1 committed Sep 4, 2023
1 parent 820e52f commit c142d51
Show file tree
Hide file tree
Showing 14 changed files with 141 additions and 15 deletions.
2 changes: 1 addition & 1 deletion fastapi_listing/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@
# READ_REPLICA_ENV: str = "READ_REPLICA_ALLOWED"
# DB_SESSION_ENV: str = "DB_SESSION"

READ_REPLICA_ENABLED: bool = False
# READ_REPLICA_ENABLED: bool = False
10 changes: 10 additions & 0 deletions fastapi_listing/ctyping.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
__all__ = [
"SqlAlchemyQuery",
"SqlAlchemySession",
"FastapiRequest",
"AnySqlAlchemyColumn",
"SqlAlchemyModel",
"BasePage",
"Page"
]

from typing import TypeVar, List, Dict, Union, Sequence, Generic
from typing_extensions import TypedDict
from fastapi import Request
Expand Down
22 changes: 21 additions & 1 deletion fastapi_listing/filters/generic_filters.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,23 @@
__all__ = [
"CommonFilterImpl",
"EqualityFilter",
"InEqualityFilter",
"InDataFilter",
"BetweenUnixMilliSecDateFilter",
"StringStartsWithFilter",
"StringEndsWithFilter",
"StringContainsFilter",
"StringLikeFilter",
"DataGreaterThanFilter",
"DataGreaterThanEqualToFilter",
"DataLessThanFilter",
"DataLessThanEqualToFilter",
"DataGropByElementFilter",
"DataDistinctByElementFilter",
"HasFieldValue",
"MySqlNativeDateFormateRangeFilter",
]

from typing import Callable, Optional
from datetime import datetime

Expand All @@ -9,7 +29,7 @@

class CommonFilterImpl(FilterAbstract):

def __init__(self, dao=None, request: Optional[Request]=None, *, extra_context: dict,
def __init__(self, dao=None, request: Optional[Request] = None, *, extra_context: dict,
field_extract_fn: Callable[[str], AnySqlAlchemyColumn]):
# lambda x: getattr(Model, x)
self.dao = dao
Expand Down
2 changes: 2 additions & 0 deletions fastapi_listing/interceptors/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
__all__ = ["IterativeFilterInterceptor", "IndiSorterInterceptor"]

from fastapi_listing.interceptors.iterative_filter_interceptor import IterativeFilterInterceptor
from fastapi_listing.interceptors.individual_sorter_interceptor import IndiSorterInterceptor
7 changes: 6 additions & 1 deletion fastapi_listing/interface/listing_meta_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,12 @@
from typing import Protocol
except ImportError:
from typing_extensions import Protocol
from typing import Dict, Literal, Type, TypedDict
from typing import Dict, Type, TypedDict

try:
from typing import Literal
except ImportError:
from typing_extensions import Literal

from fastapi_listing.abstracts import (AbsSortingStrategy, AbsPaginatingStrategy, AbsQueryStrategy,
AbstractListingFeatureParamsAdapter)
Expand Down
9 changes: 5 additions & 4 deletions fastapi_listing/loader.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
__all__ = [
"register"
]


import inspect

from fastapi_listing.service import ListingService
from fastapi_listing.factory import filter_factory, _generic_factory, strategy_factory, interceptor_factory
from fastapi_listing.errors import MissingExpectedAttribute
from fastapi_listing.dao import GenericDao

__all__ = [
"register"
]


def _validate_strategy_attributes(cls: ListingService):
if not cls.default_srt_on:
Expand Down
2 changes: 2 additions & 0 deletions fastapi_listing/middlewares.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
__all__ = ['DaoSessionBinderMiddleware']

from contextvars import ContextVar, Token
from typing import Optional, Callable
from contextlib import contextmanager
Expand Down
2 changes: 2 additions & 0 deletions fastapi_listing/paginator/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
__all__ = ["ListingPage", "BaseListingPage"]

from fastapi_listing.paginator.page_builder import PaginationStrategy
from fastapi_listing.paginator.default_page_format import ListingPage, BaseListingPage
7 changes: 6 additions & 1 deletion fastapi_listing/service/adapters.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
from typing import Literal, Optional, List
from typing import Optional, List

try:
from typing import Literal
except ImportError:
from typing_extensions import Literal

from fastapi import Request

Expand Down
83 changes: 80 additions & 3 deletions fastapi_listing/service/config.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,101 @@
from typing import Literal, Optional, TypedDict, Type
from typing import Optional, TypedDict, Type

try:
from typing import Literal
except ImportError:
from typing_extensions import Literal

# from fastapi_listing.interface.listing_meta_info import ListingMetaData
from fastapi_listing.service.adapters import CoreListingParamsAdapter


class ListingMetaData(TypedDict):
"""A Typedict for configuring fastapi-listing behaviour"""

filter_mapper: dict
"""
The filter_mapper is a collection of allowed filters on listing that will be used by consumers. Defaults to '{}'
"""

sort_mapper: dict
default_srt_ord: Literal["asc", "dsc"]
"""
The sort_mapper is a collection of fields allowed to be used for sort on listing that will be used by consumer.
Defaults to '{}'
"""

default_srt_on: str
"""primary model field that will be used to sort the listing response by default. No Default value provided."""

default_srt_ord: Literal["asc", "dsc"]
"""The default order which will be used to return listing response. Defaults to 'dsc' """

paginating_strategy: str
"""
Reference of strategy class used to paginate listing response. Must be registered with strategy_factory.
Defaults to 'default_paginator'
"""

query_strategy: str
"""
Reference of strategy class used to generate listing query object. Must be registered with strategy_factory.
Defaults to 'default_query'
"""

sorting_strategy: str
"""
Reference of strategy class used to apply sorting on query object. Must be registered with strategy_factory.
Defaults to 'default_sorter'
"""

sort_mecha: str
"""
Reference of interceptor class that applies sorting requested by client utilising sort_mapper.
Must be registered with interceptor_factory.
Defaults to 'indi_sorter_interceptor'
"""

filter_mecha: str
"""
Reference of interceptor class that applies filter requested by client utilising filter_mapper.
Must be registered with interceptor factory.
Defaults to 'iterative_filter_interceptor'
"""

default_page_size: int
"""The default number of items that a page should contain. Defaults to '10' """

max_page_size: int
"""
Maximum number of items that a page should contain. Ignore any upper page size limit than this.
Defaults to '50'
"""

feature_params_adapter: Type[CoreListingParamsAdapter]
"""
Reference of the adapter class used to get listing feature(filter/sorter/paginator) parameters.
Lets users make fastapi-listing adapt to their current code base.
Defaults to 'CoreListingParamsAdapter'
"""

allow_count_query_by_paginator: bool
"""
Restrict/Allow fastapi-listing default paginator to extract total count. This lets you avoid slow
count queries on big table to avoid performance hiccups.
Defaults to 'True'
"""

extra_context: dict
"""
A common datastructure used to store any context data that a user may wanna pass from router.
Like path params or query params or anything.
Available throughout the entire fastapi-listing lifespan.
User can access it in
strategies
interceptors
filters
or almost anywhere in their code where they are writing their listing API dependency using/extending fastapi-listing
core features.
Defaults to '{}'
"""


def MetaInfo(
Expand Down
2 changes: 0 additions & 2 deletions fastapi_listing/sorter/page_sorter.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@

class SortingOrderStrategy(AbsSortingStrategy):

name = "default_sorter"

def __init__(self, model: SqlAlchemyModel = None, request: FastapiRequest = None):
self.model = model
self.request = request
Expand Down
3 changes: 3 additions & 0 deletions fastapi_listing/strategies/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@

__all__ = ['QueryStrategy', 'PaginationStrategy', 'SortingOrderStrategy']

from fastapi_listing.strategies.query_strategy import QueryStrategy
from fastapi_listing.paginator import PaginationStrategy # noqa: F401
from fastapi_listing.sorter import SortingOrderStrategy # noqa: F401
Expand Down
3 changes: 1 addition & 2 deletions fastapi_listing/strategies/query_strategy.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@


class QueryStrategy(AbsQueryStrategy):

name = "default_query"
"""Default query strategy class. Generates a simple query with requested fields from same model."""

def get_inst_attr_to_read(self, custom_fields: bool, field_list: list, dao: GenericDao):
inst_fields = []
Expand Down
2 changes: 2 additions & 0 deletions fastapi_listing/utils.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
__all__ = ['dictify_query_params']

import json
from urllib.parse import unquote
from typing import Union, List, Optional, Type
Expand Down

0 comments on commit c142d51

Please sign in to comment.