Lucas Simon

Web Developer. lucassrod@gmail.com

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.

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.

  1. .py: São arquivos com o código fonte que escrevemos.

  2. .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.

  3. .pyo: Possui a mesma caracteristicas do .pyc porém otimizado com a flag -O.

Fonte

clean:
    find . -name '*.pyc' -exec rm --force {} +
    find . -name '*.pyo' -exec rm --force {} +
    find . | grep -E "__pycache__|.pyc|.DS_Store$$" | xargs rm -rf

MakeClean

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 . "

Isort in action

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

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

MakeTest

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

MakeTest

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