/flask-dip

Primary LanguagePython

Flask - DIP

POC Flask application to apply repository pattern, dependency injection and inversion of control.

Installation

  1. Create a virtual environment at the root of the project:

py -m venv venv

  1. Activate virtual environment:
  • CMD: venv\Scripts\activate
  • Git Bash: source venv/Scripts/activate
  1. Install dependencies:

pip install -r requirements.txt

  1. Create a new Postgres database at your machine or in a container named flask_dip

  2. Update username, password and host of the connection URL on .env file at the root of the project

  3. Create Tables:

flask db_create

  1. Run the server on port 5000:

flask run

  1. Use a REST Client to make requests to the API, such as Insomnia or Postman.
  • Make a POST request to http://localhost:5000/createUser, with the following JSON body:
{
  "id": 1,
  "name": "Arthur"
}

Tests

  1. Follow previous steps until step 3 included

  2. Run tests:

pytest

Explanation [PT-BR]

Fiz esta POC com base principalmente em dois link:

  1. Precisamos falar de Injeção/Inversão de Dependência no Python
  1. Cosmic Python (Principalmente capítulos 1, 2 e 4)

Todo o trabalho que está na branch master foi feito utilizando uma estrutura de pastas que fui achando mais sensato. Já a branch folder_structure segue a estrutura de pastas do primeiro artigo linkado acima.

Dúvidas

  • Qual estrutura de pastas se encaixa melhor em uma aplicação de larga escala? É necessário alguma adaptação nelas?

  • Criei dois métodos para o UserService, e utilizo os dois métodos no endpoint de User, o qual contém a verificação de usuário existente. Esta é a forma mais correta de se fazer? Ou então deveria estar contida dentro de um método do service maior, que englobe os métodos add e get do UserRepository?

  • Escrevi dois testes unitários utilizando o FakeUserRepository apenas para exemplificar. Caso eu queira escrever um terceiro teste para a verificação de usuário existente, o mais correto seria construir um setup para um teste de integração no endpoint? Penso que se esta verificação estiver dentro do UserService, não precisaria de um teste de integração.

  • Alguma sugestão de mudança ou melhoria?