mkdir -p meu_projeto
cd meu_projeto
Selecione a versão da linguagem a ser utilizada. Neste exemplo, será usada linguagem Python. Aqui, pode-se usar a ferramenta que desejar. Contudo pyenv (própria ao Python) e asdf (Package managemment) são usados.
Gera um arquivo .python-version
pyenv install <VERSION>
pyenv local <VERSION>
- == versão do Python escolhida para usar dentro daquele projeto
- == local: permanece apenas dentro daquele projeto (raiz/folhas)
- == global: global, vai para todo o sistema.
asdf plugin-add python
asdf install python <VERSION>
asdf <local | global> python <VERSION>
Selecione a ferramenta para gerência os ambientes virtuais de seu projeto. Isso permitirá uma mais fácil gerência de suas dependências. Aqui, o PIPx e o ASDF serão utilizados para a instalação do Poetry.
pipx install poetry
Note a repetição de comandos a partir do asdf.
- negativo == repete comando e só muda os nomes.
- positivo == permite unificar e generalizar a instalação das ferramentas.
asdf plugin-add poetry
asdf install poetry <VERSION>
asdf <local | global> poetry <VERSION>
poetry init # inicia a estrutura do projeto
poetry shell # inicia ambiente virtual
poetry add <PACKAGE> # adiciona pacote ao projeto
poetry add --dev <PACKAGE> # adiciona pacote para desenvolvimento do projeto
O git permite a gerência de modificações do código. Quando auxiliado a um repositório remoto, o código fica resistente.
git init # inicia o controle de versão
Antes de continuar, crie um .gitignore. Isso para que o git não versione aquilo que se deseja ignorar. Não se esqueça de preenche-lo, vá em gitignore.io.
touch .gitignore
git add -p . # seleciona mudanças a se adicionar
git commit -m "<MENSAGEM>" # grava as modificações
git push # sobe as modificações para repositório online
meu_projeto
├── .gitignore # o que se deseja ignorar
├── .python.version # arquivo produzido por pipx: guarda a versão do python
├── poetry.lock # arquivo produzido por poetry: guarda as versões das libs
├── pyproject.toml # arquivo produzido por poetry: guarda as informações das libs
├── README.md # arquivo de informações sobre o projeto
├── LICENSE # arquivo que contém a licença sob a qual está este software
├── .git # diretório que guarda as informações sobre as versões do código
├── .venv # diretório que guarda as informações sobre os ambientes virtuais
└── docs # diretório que guarda as documentações do projeto
└── index.md
└── meu_projeto # diretório que guarda os códigos do projeto
└── tests # diretório que guarda os testes dos projeto
└── __init__.py
Utilizado para o entendimento do contexto do código.
- OBS 1: será realizada a instalação de uma ferramenta, mas existem outras.
- OBS 2: não os padrões de testes utilizados nesta seção de instalação.
O Pytest será adicionado apenas como dependência de desenvolvimento. Pelo fato de ser relativo ao momento de desenvolvimento, apenas. Caso fizesse parte do código, --dev seria retirado.
- OBS 1: o Poetry já cria um diretório tests com um arquivo init.py.
- OBS 2: init.py é necessário para o funcionamento do Pytest.
- OBS 2: caso o Poetry não tenha criado um diretório tests, crie você.
poetry add --dev pytest # instalação do pytest
pytest # roda os testes
- OBS 1: pytest: busca diretório docs e arquivos iniciados por test.
└── tests # diretório que guarda os testes dos projeto
└── __init__.py
└── test_meu_test.py
Para que haja uma padronização do modo de codar, utiliza-se uma ferramenta que formata o código de quem desenvolve. Neste exemplo, será utilizada a ferramenta chamada blue.
poetry add --dev blue # instalação do blue
blue . # roda o blue para todos os arquivos
Também será utilizada a ferramenta isort, que ordena os imports (em Python)
poetry add --dev isort # instalação do isort
isort . # roda o isort para todos os arquivos
Documentar um projeto é essencial. Mkdocs serve para isso, será a ferramenta instalada.
- OBS 1: o comando mkdocs new . cria o diretório docs, caso já não exista.
poetry add --dev mkdocs # instalação do mkdocs
mkdocs new . # cria os arquivos index.md e mkdocs.yml dentro do diretório docs
- OBS 1: index.md -> armazena a documentação
- OBS 2: mkdocks.yml -> armazena o nome do site da documentação
└── docs # diretório que guarda as documentações do projeto
└── index.md
└── mkdocs.yml
Procuram manter os códigos em conformidade com uma forma simples de desenvolver. Além disso, busca garantir uma acessível leitura posterior do código.
- Erros de sintaxe
- Pontenciais problemas 1 Nomes duplicados 2 Nomes ruins 3 Códigos inseguros
- Análise de complexidade de códigos
- Violações de códigos
Será utilizada a ferramenta prospector, que comporta várias outras ferramentas para especifícações.
poetry add --dev prospector # instalação do prospector
prospector # roda as análises
prospector --with-tool pep257 # roda as análises relativas à PEP 257
prospector --doc-warning # roda as análises relativas a docs
Selecione as ferramentas para verificar a integridade das libs usadas.
- OBS 1: adicionado ao contexto de desenvolvimento.
- OBS 2: será realizada a instalação de uma ferramenta, mas existem outras.
poetry add --dev pip-audit # instalação do pip-audit
- pyenv | asdf
- pipx | asdf
- git
- poetry
- pytest
- blue
- isort
- mkdocs
- prospector
- pip-audit
- flake8 ➜ checador da pep-8
- pylint ➜ padronização, conversões e erros
- pydocstyle ➜ checador da pep-257
- bandit ➜ problemas de segurança
- radon ➜ busca de complexidade de código
- prospector ➜ agregador de ferramentas (Flake8, Mccabe, Pylint, PEP-8, PEP-257)
- mypy ➜ checador de sugestões de tipo
Busca evitar o excesso de programas a instalar um a um. Aqui, GNU Make será utilizado na criação de uma Makefile.
- OBS: essa é a formulação do make
# Este é o Makefile.
#.PHONY == make evita de procurar no sistema
.PHONY venv install format lint test sec
# @ == serve para o make não mostrar o programa que está sendo executado.
venv:
@poetry shell
install:
@poetry install
format:
@blue .
@isort .
lint:
@blue --check .
@isort --check .
@prospector --with-tool pep257 --doc-warning --no-autodetect
test:
@pytest -v
sec:
@pip-audit
make # executa todos os comandos
make venv # executa o venv
make install # executa o install
make format # executa o format
make lint # executa o lint
make test # executa o test
make sec # executa o sec
(GIT HOOKS)
O git possui formas de verificação, usadas antes de alguma adição de código. Dentro do diretório .git/hooks repousam esse scripts: os hooks. Para este exemplo, será criado um arquivo específico: pre-commit.amostra.
touch meu_projeto/.git/hooks/pre-commit.amostra
chmox +x meu_projeto.git/hooks/pre-commit.amostra # permissão de execução
Nesta parte, este arquivo será preenchido com comandos do Makefile já criado.
make lint
make test
Agora, adicione e commit os arquivos normalmente.
git add meu_projeto/arquivo_principal.py
git commit -m "Teste de hooks."
(GITHUB ACTIONS, GITLAB PIPELINES, BITBUCKET BAMBOO)
Existe mais um nível de verificação para seu código, no repositório externo. Neste exemplo, será utilizado o GitHub Actions.
mkdir -p meu_projeto/.github/workflows/
touch meu_projeto/.github/workflows/continous_integration.yml
name: Continous Integration
on: [push]
jobs:
lint_and_test:
runs-on: ubuntu-latest
steps:
- name: Set up python
uses: actions/setup-python@v2
with:
python-version: 3.10.2
- name: Check out repository
uses: actions/checkout@v2
- name: Install poetry
uses: snok/install-poetry@v1
with:
virtualenvs-in-project: true
- name: Load cached venv
id: cached-poetry-dependencies
uses: actions/cache@v2
with:
path: .venv
key: venv-${{ hashFiles('**/poetry.lock') }}
- name: Install dependencies
if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'
run: poetry install --no-interaction
- name: Lint
run: poetry run make lint
- name: Run tests
run: poetry run make test
Existe mais um nível de verificação para seu código, no repositório externo. Neste exemplo, será utilizado o GitLab CI.
touch meu_projeto/.gitlab-ci.yml
- OBS 1: script == o que deverá rodar linha a linha
- OBS 2: artifacts == o que será baixado após o build
- OBS 3: only == rode apenas enquanto estiver na master
image: python:latest
stages:
- nome_do_stage
- testes
before_script:
- apt update -y
- apt upgrade -y
nome_do_stage:
stage: nome_do_stage
script:
- echo "Apenas um teste do GitLab CI e nada mais."
# - pip install jedi blue isort radon prospector
# - blue .
artifacts:
paths:
- meu_projeto
only:
- master
testes:unitarios:
stage: testes
script:
- python -m unittest .