Instalação ========== Overview -------- Esta página descreve o processo de instalação, configuração e execução local da aplicação. Instalação das ferramentas ~~~~~~~~~~~~~~~~~~~~~~~~~~ Para executar o projeto localmente, é necessário instalar as seguintes ferramentas: - `Python (^3.12) <#python>`__ - `venv <#venv>`__ - `pipx (opcional porém recomendado) <#pipx>`__ - `Poetry <#poetry>`__ - `Docker <#docker-e-compose>`__ Python ^^^^^^ Instalação do intérprete pode ser realizada de acordo com o manual disponível na `documentação oficial `__. Pode ser necessário realizar a instalação através dos repositórios do `deadsnakes `__. venv ^^^^ Ambientes virtuais são a maneira mais convencional de isolar a instalação de pacotes python no contexto do sistema operacional. A ferramenta pode ser instalada de acordo com a `documentação oficial `__. Pode ser necessário realizar a instalação através dos repositórios do `deadsnakes `__. pipx ^^^^ pipx é um gerenciador de pacotes que permite a execução de apliações Python em ambientes isolados. A instalação da ferramenta é opcional, porém recomendada para instalar o Python Poetry (ver próxima seção), que é utilizado para o gerenciamento de dependências do projeto. O processo de instalação está disponível na `documentação oficial `__. Poetry ^^^^^^ O Poetry é a ferramenta de gerenciamento de dependências do projeto; pode ser instalada de acordo com o manual encontrado na `documentação oficial `__; recomenda-se realizar a instalação através do ``pipx``. Docker e Compose ^^^^^^^^^^^^^^^^ Docker e a ferramenta auxiliar Compose são utilizados para isolar a execução de processos e aplicações em máquinas virtualizadas separadamente do ambiente do sistema operacional. Para instalar as ferramentas, siga os passos especificados para a distribuição do seu SO de acordo com a `documentação oficial `__. Instalação das dependências do projeto ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Antes de instalar qualquer módulo adicional no intérprete python, é importante isolar o ambiente da aplicação através de um ambiente virutal. Caso seja a primeira vez executando o sistema, talvez seja necessário criar os arquivos do ambiente local: .. code:: bash python3.12 -m venv venv Para instalar as dependências do projeto basta inicializar o ambiente virtual e executar o comando de instalação: .. code:: bash source venv/bin/activate poetry install Executando a aplicação localmente --------------------------------- Antes de inicializar a aplicação, é necessário ativar o container do banco de dados do projeto no `docker <#docker-e-compose>`__. Para verificar o status atual do container execute o comando ``docker ps``: .. code:: bash docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 918266dc5863 mongo "docker-entrypoint.s…" 6 days ago Up About an hour 27017/tcp metrify_mongo_1 Caso o container do metrify não conste na lista apresentada, execute o `compose <#docker-e-compose>`__ (dentro do projeto) para ativar os containers: .. code:: bash # Dependendo da versão do Docker instalada no sistema, execute "docker compose" ou "docker-compose", se o compose for instalado separadamente. Consultar documentação oficial. docker compose up -d mongo Creating metrify_mongo_1 ... done É necessário exportar as credenciais da aplicação em um arquivo ``.env`` para que seja possível realizar a integração com os serviços do Github; para fazer isso, adicione o arquivo na raiz do projeto da seguinte maneira: .. code:: diff . ├── .coverage ├── docker-compose.yml ├── docs │   ├── build │   ├── make.bat │   ├── Makefile │   └── source + ├── .env ├── .flaskenv ├── .github │   └── workflows ├── .gitignore ├── LICENSE.rst ├── metrify ... Registre os dados de configuração para a integração: .. code:: sh # .env APP_ID="app_id" PRIVATE_KEY_PATH="./.private-key.pem" INSTALLATION_ID="your_installation_id" As variáveis ``APP_ID`` e ``INSTALLATION_ID`` são referentes ao ID universal do Github App e ID da instalação do app na organização de destino, respectivamente. A variável de ambiente ``PRIVATE_KEY_PATH`` deve apontar para a localização do arquivo ``.pem`` da chave privada da aplicação (consultar com equipe de desenvolvimento para adquirir uma chave de acesso). Recomenda-se salvar a chave de acesso em um arquivo ``.private-key.pem`` na raiz do projeto, como demonstrado no exemplo de configuração, da seguinte maneira: .. code:: diff . ├── .coverage ├── docker-compose.yml ├── docs │   ├── build │   ├── make.bat │   ├── Makefile │   └── source ├── .env + ├── .private-key.pem ├── .flaskenv ├── .github │   └── workflows ├── .gitignore ├── LICENSE.rst ├── metrify ... Após a instalação de todos os recursos, certifique-se de ativar o ambiente virtual para executar o servidor Flask: .. code:: bash source venv/bin/activate flask run A aplicação estará disponível em no endereço ``127.0.0.1:5000``. Identificando diagnósticos via logs ----------------------------------- Por padrão, os logs do sistema serão amazenados em ``logs/``, em formato ``.jsonl``. Recomenda-se a ferramenta `jq `__ para navegação dos logs durante a depuração do código em desenvolvimento. .. code:: bash cat logs/metrify.jsonl | jq '. | select ( .level == "DEBUG" )' { "level": "DEBUG", "message": "2 found:\n {'/etc/timezone': 'America/Sao_Paulo', '/etc/localtime is a symlink to': 'America/Sao_Paulo'}", "timestamp": "2024-07-05T03:00:20.359235+00:00", "logger": "tzlocal", "module": "unix", "function": "_get_localzone_name", "line": 139, "thread_name": "MainThread" } { "level": "DEBUG", "message": "Looking for jobs to run", "timestamp": "2024-07-05T03:00:20.504614+00:00", "logger": "apscheduler.scheduler", "module": "base", "function": "_process_jobs", "line": 954, "thread_name": "APScheduler" } ... pre-commit ---------- O projeto é configurado para executar uma checagem rápida do código antes de cada commit no controle de versão. Para habilitar os *hooks*, basta executar o comando de instalação: .. code:: bash # Com o ambiente virtual ativo e após instalar as dependências do projeto (poetry install) pre-commit install Testes unitários ---------------- Estrutura ~~~~~~~~~ O repositório do projeto é disposto de acordo com a estrutura a seguir: :: . ├── metrify │   ├── hello │   │   ├── __init__.py │   │   ├── strategies.py │   │   └── routes.py │   ├── __init__.py │   └── metrify.py ├── poetry.lock ├── pyproject.toml ├── README.md ├── tests │   ├── hello │   │   ├── __init__.py │   │   └── test_strategies.py │   └── __init__.py └── tox.ini Onde os arquivos de teste no diretório ``tests/`` devem espelhar a disposição dos arquivos no diretório-fonte (``metrify/``). - A estrutura de diretórios deve ser identica aos pacotes de código de serviço; a nomenclatura dos arquivos de teste deve seguir o padrão “test_.py”, onde “src” refere-se ao nome do arquivo que está sendo testado. - A estrutura do código de teste deve espelhar o código que está sendo testado; o arquivo de teste deve seguir o padrão de um suite de testes (em forma de classe) por função testada, seguindo a nomenclatura "Test", onde "Subject" refere-se ao nome função sendo testada, em `PascalCase `__; cada caso de teste deve ser representado por um método da classe, com um nome descritivo. .. code:: python # file: tests.hello.test_strategies from metrify.hello.strategies import hello class TestHello: """Test suite for `hello` function""" def test_hello(self): """Returns 'Hello, World!'""" assert hello() == "Hello, World!" Executando testes e checagem com tox ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ O projeto está configurado para realizar a execução dos testes, formatação, linting e checagem através do `pytest `__, `autopep8 `__, `pylint `__ e `mypy `__, e automatizado através do `tox `__. É possível executar todos as checagens do sistema através do tox (via Poetry): .. code:: bash poetry run tox Executar etapas do processo de checagem separadamente: .. code:: bash poetry run pytest # testes poetry run pylint metrify tests # linter poetry run mypy metrify tests # type check Ou em arquivos individuais: .. code:: bash poetry run pylint metrify/hello/strategies.py poetry run pytest tests/hello/test_strategies.py ...