Série API em Flask - Parte 4 - Configurando o Makefile
Para melhorar nosso desenvolvimento, coloco no arquivo Makefile todos os comandos que utilizo durante o processo de desenvolvimento de software. Leia o artigo e veja algumas dicas e como o make
pode facilitar nossa vida.
Para entendimento, segue os capítulos que serão abordados.
Capítulo 1: Introdução, configuração e Hello World
Capítulo 2: Organizando as dependências e requerimentos
Capítulo 3: Configurando o pytest e nosso primeiro teste
Capítulo 4: Configurando o Makefile. Estamos aqui
Capítulo 5: Adicionando o MongoDB
Capítulo 6: Criando e testando o modelo de usuários
Capítulo 7: Criando usuários
Capítulo 8: Listando usuários
Capítulo 9: Buscando usuários
Capítulo 10: Editando um usuário
Capítulo 11: Deletando um usuário
Capítulo 12: Autênticação por JWT
Capítulo 13: Criando um container Docker
Capítulo 14: Arquivos de configuração para Deploy na Digital Ocean
Capítulo 15: Automatizando o processo de deploy com Fabric
Capítulo 16: CI e CD com Jenkins, Python, Flask e Fabric
Capítulo 17: Utilizando o RabbitMQ com Flask e Sendgrid para enviar e-mails de boas vindas e ativar a conta do usuário
O repositório com todo o código fonte esta aqui. Os capítulos estão em branches
.
MakeFile
O Make é um utilitário criado para automatizar o processo de construção de aplicações executando o compilador, linkador, testes, e até mesmo fazendo o deploy, entre outras operações possíveis.
O Makefile, é um arquivo de configurações que possui instruções para executar um processo. Podendo ser, conforme dito acima, executar testes, gerar arquivos binários e etc…
Particulamente eu gosto de utilizar esse método por questões de organização, documentação e facilitar o uso de comandos que serão utilizados repetidamente. Também posso encadear uma lista de instruções antes de executar a instrução solicitada. Isso ficará mais claro após a configuração e exemplos.
Configurações adicionais
Em nosso arquivo setup.cfg
adicione o conteúdo abaixo para configurar o flake8
e isort
[flake8]
exclude = application.py, conftest.py
[isort]
skip=application.py,conftest.py
default_section = THIRDPARTY
known_first_party = apps
known_flask = flask
sections = FUTURE,STDLIB,FLASK,THIRDPARTY,FIRSTPARTY,LOCALFOLDER
import_heading_future = Future
import_heading_stdlib = Python
import_heading_thirdparty = Third
import_heading_firstparty = Apps
import_heading_localfolder = Local
indent=' '
multi_line_output=3
O help
O MakeFile exige que os comandos sejam identados por tabulação de 4 espaços. O primeiro passo é criar uma entrada help:
e especificar o uso do comando através do @echo
. Em seguida definimos qual será o comando parão do nosso make
através do .DEFAULT
.
$ cat Makefile
.DEFAULT: help
help:
@echo "make clean"
@echo " prepare development environment, use only once"
@echo "make clean-build"
@echo " Clear all build directories"
@echo "make isort"
@echo " run isort command cli in development features"
@echo "make lint"
@echo " run lint"
@echo "make test"
@echo " run tests"
@echo "make run"
@echo " run the web application"
O clean
Nossa primeira cadeia de instruções são comandos linux que irão deletar todos os arquivos .pyc e pyo
e diretórios pycache e .DS_Store
.
.py: São arquivos com o código fonte que escrevemos.
.pyc: Estes arquivos são compilados para binários. Ao importar um módulo o python irá compilar o fonte contendo somente o fonte. Após ser importado e passado pelo processo de compilação a primeira vez esse módulo será importado mais rápido.
.pyo: Possui a mesma caracteristicas do
.pyc
porém otimizado com a flag-O
.
clean:
find . -name '*.pyc' -exec rm --force {} +
find . -name '*.pyo' -exec rm --force {} +
find . | grep -E "__pycache__|.pyc|.DS_Store$$" | xargs rm -rf
O clean-build
Quando instalamos um pacote via python setup.py install
ou pip install -e .
Fizemos esse processo para instalar os testes no capítulo anterior.
clean-build:
rm --force --recursive build/
rm --force --recursive dist/
rm --force --recursive *.egg-info
O Isort
O Isort é um utilitário para padronizar as importações de pacotes no código fonte. É útil pois cada desenvolvedor tem uma maneira de codificar que nem sempre é igual ao outro. Logo dessa forma o isort
padroniza todo o código fonte.
isort:
sh -c "isort --skip-glob=.tox --recursive . "
O lint
Escolhi flake8
como utilitário para padronizar o código. Quando executamos o comando ele avisa qual arquivo, linha e uma descrição do erro. Observe que o este comando irá executar o clean também.
lint: clean
flake8
O teste
Para executar os testes conforme o capítulo anterior chamamos o pytest
. Mas para facilitar podemos chamar clean
encadeado com o lint
que por sua vez executa o test
test: lint
pytest --verbose --color=yes
O run
Por fim a execução da aplicação utilizando o make run
. Veja que antes de executar a aplicação ele executa um clean
, lint
e test
. Assim previnimos que antes de começar a desenvolver estaremos executando os testes e demais comandos
run: test
python application.py
Conclusão.
O arquivo final Makefile
fica assim:
.PHONY: help clean test clean-build isort run
.DEFAULT: help
help:
@echo "make clean"
@echo " prepare development environment, use only once"
@echo "make clean-build"
@echo " Clear all build directories"
@echo "make isort"
@echo " run isort command cli in development features"
@echo "make lint"
@echo " run lint"
@echo "make test"
@echo " run tests"
@echo "make run"
@echo " run the web application"
clean:
find . -name '*.pyc' -exec rm --force {} +
find . -name '*.pyo' -exec rm --force {} +
find . | grep -E "__pycache__|.pyc|.DS_Store$$" | xargs rm -rf
clean-build:
rm --force --recursive build/
rm --force --recursive dist/
rm --force --recursive *.egg-info
isort:
sh -c "isort --skip-glob=.tox --recursive . "
lint: clean
flake8
test: lint
pytest --verbose --color=yes
run: test
python application.py
Pode parecer perfumaria, entretanto, através do comando make
e de suas configurações Makefile
podemos padronizar e organizar o desenvolvimento de nossa aplicação.
Próxima seção vamos fazer uma conexão com o banco de dados MongoDB, um pouco do uso do docker. Até breve, abraços a todos.
Próximo artigo: Adicionando o MongoDB