GithubHelp home page GithubHelp logo

vladefr97 / async_api_sprint_2 Goto Github PK

View Code? Open in Web Editor NEW
0.0 0.0 0.0 80 KB

Проектная работа 5 спринта. Погружаемся в рефакторинг и ревью прошлых решений.

Makefile 0.14% Dockerfile 0.61% Python 99.24%

async_api_sprint_2's People

Contributors

tatitrif avatar vladefr97 avatar

Watchers

 avatar  avatar

async_api_sprint_2's Issues

Code review

Приветствую! Хорошая работа, но еще есть что улучшить.

  1. [исправить] При инъекции внешнего сервиса лучше использовать абстрактный класс. Тоже самое касается и redis. Проблемы могут возникнуть, когда будет принято решение заменить redis на memcached, а es на что-то другое.
    Как это может быть реализовано, например для redis:
    from abc import ABC
    
    class AsyncCacheStorage(ABC):
        @abstractmethod
        async def get(self, key: str, **kwargs):
            pass
    
        @abstractmethod
        async def set(self, key: str, value: str, expire: int, **kwargs):
            pass
    
    В итоге запись redis: Redis = Depends(get_redis) можно заменить на cache: AsyncCacheStorage = Depends(get_redis), а es=Depends(get_elastic) заменится на text_search: FullTextSearch = Depends(get_elastic). Здесь главное, чтобы используемый класс кэширования/полнотекстового поиска реализовал методы абстрактного класса. В итоге, если необходимо будет заменить redis на memcached, то надо будет только изменить cache: AsyncCacheStorage = Depends(get_memcached).
  2. [исправить] Этот параметр лучше убрать в конфиг. Во-первых, так все настройки будут лежать в одном месте. Во-вторых, другим программистам, которые будут развивать и поддерживать сервис, не надо будет искать настраиваемые параметры по всему проекту.
  3. [можно лучше] page и size можно поместить в отдельный класс и потом везде использовать в качестве dependency:
    class Paginator(BaseModel):
        page_number: int = Query(default=0, alias='page[number]')
        page_size: int = Query(default=10, alias='page[size]')
    
    @router.get('/')
    async def get_items(paginator: Paginator = Depends()):
        ...
    
    Профит в том, что его можно переиспользовать и тем самым мы избавляемся от дублирования кода.
    Кстати, с остальными параметрами функции вы можете сделать тоже самое. Это по сути ответ на вопрос в todo.
  4. [исправить] Этот маркер можно указать один раз и не дублировать его для всех тестов https://github.com/pytest-dev/pytest-asyncio#pytestmarkasyncio
  5. [можно лучше] Рекомендую для всех тестов придерживаться подхода ААА. Т.е., делать перенос строки после каждой логической единицы, выполняемой в тесте, если тело теста превышает 3 строки. Под логическими единицами подразумевается: подготовка, вызов тестируемого объекта и сравнение результата теста (assert). Если в тесте меньше трех строк, то можно не делать переносы.

[optional] Exponential backoff

Реализовать работу с внешними сервисами через exponential backoff

Оценка: 8

[optional] OpenAPI

Подготовить документацию для клиентов сервиса, используя OpenAPI

Оценка: 5

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.