Manual Rápido e Configurações

Ambiente virtual (VENV)

O venv (vitual envirement) é uma ferramenta integrada ao Python que permite criar ambientes virtuais. Um ambiente virtual é uma instalação isolada do Python que inclui seus próprios executáveis e uma cópia independente dos pacotes instalados. Isso ajuda a gerenciar dependências e versões de bibliotecas para projetos diferentes, evitando conflitos. 

A pasta .venv geralmente fica na raiz do diretório do projeto (ao lado do diretório do código Django). Isso facilita a organização e o isolamento. Adicione a pasta venv ao arquivo .gitignore para garantir que ela não seja versionada no controle de versão.

o uso do.venv é mais organizado e limpo visualmente, do que sem o ponto, e muitas equipes e editores o preferem.

Estrutura de um ambiente virtual

Depois de criado, o diretório do ambiente virtual contém:

  • bin/ ou Scripts/: Contém os executáveis (incluindo o Python).
  • lib/: Armazena bibliotecas instaladas.
  • pyvenv.cfg: Arquivo de configuração do ambiente.

Instalar o Ambiente Virtual

-m venv: Usa o módulo venv para criar o ambiente virtual. .venv é o nome da pasta onde o ambiente virtual será criado. Se estiver usando um projeto django já pronto, basta dar o comando dentro da pasta principal do projeto, e depois instale as dependencias necessárias como django.

bash
$ python -m venv .venv
$ py -0 # mostra todas as versões instaladas do python no windows
$ py -3.12 -m venv .venv # caso queira usar uma versão especifica do python para criar a venv

| Ativando e Desativando a VENV

Após ativado, o python dará preferencia para executar as versões dos pacotes do python do ambiente virtual, basta dar um pip list para visualizar. Quando ativada o nome do ambiente virtual aparecerá no terminal (por exemplo, (venv) antes do prompt). Para desativar basta usar a palavra deactivate, ou, feche o terminal.

Windows

bash
$ .venv\Scripts\activate
$ deactivate # de qualquer pasta para sair da venv

Linux/macOS

bash
$ source .venv/bin/activate
$ deactvate # para sair da venv de qualquer pasta

Comandos Pyenv

O Pyenv é uma ferramenta de gerenciamento de versões do Python. Permite que você instale, troque e gerencie várias versões diferentes do Python na mesma máquina, de forma isolada e sem afetar o Python que já vem com o sistema operacional. Uma de suas facilidades é caso Precise testar um código em várias versões do Python, é possivel faze-lo com um comando. O pyenv não funciona no windows mas existe um projeto chamado pyenv-win, que traz algo parecido pro Windows. obs.: O Python que instalado via .exe no Windows não é controlado pelo pyenv. O pyenv so controla versões instaladas por ele. O pyenv não sobrescreve a instalação do Python feita via .exe.
A melhor pratica é usar pyenv local <versão> para cada projeto, pois cria um arquivo oculto chamado .python-version no diretório atual (seu projeto), travando a versão que você quer usar com pyenv. Toda vez que entrar no diretório o pyenv automaticamente muda para essa versão do Python.
bash
$ Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1" # Instala Versão para windows
$ pyenv install 3.10.0	# Baixa e instala o Python 3.10.0
$ pyenv uninstall 3.10.0 # desinstala
$ pyenv commands # lista os comandos
$ pyenv install -l # lista as versões do Python disponíveis
$ pyenv global 3.10.0 # Define a versão global padrão
$ pyenv local 3.8.0 # Define a versão apenas dentro da pasta atual (ex: um projeto específico)
$ pyenv versions # Lista as versões instaladas
$ pyenv exec python -m venv .venv # Cria um ambiente virtual com o Python global do pyenv não do sistema (instalada com exe)
$ pyenv shell 3.9.1 # Troca de versão só na sessão atual do terminal

Dependencias

Dependências, são bibliotecas, pacotes ou outros módulos externos necessarios para executar o projeto com as versões exatas. Em um projeto Django, o próprio Django é uma dependência. A maioria do servidores suporta um arquivo especial que contém dependencias, requeriments.txt (arquivo de bloqueio, lock file), que pode ser criado manualmente na pasta base do projeto. Mas pode ser feito automaticamente com o comando abaixo, que gerará o arquivo com todas as dependencias do projeto.

O termo "lock the package" ou "locking in dependencies" refere-se ao processo de fixar as versões exatas das dependências de um projeto em um arquivo de bloqueio (lock file). Isso garante que o ambiente de desenvolvimento e produção utilizem as mesmas versões das bibliotecas, evitando inconsistências ou problemas devido a atualizações inesperadas. Facilita a recriação do ambiente do projeto no futuro ou em outro lugar, com as mesmas dependências e evita que atualizações automáticas de pacotes introduzam falhas ou vulnerabilidades.

Criar e Instalar dependências

bash
$ python -m pip freeze > requirements.txt
$ pip install -r  .\requirements.txt # Instala as dependências

Exibir todas bibliotecas e versões

É possível usar o resultado para manualmente colar no arquivo requeriments.txt

bash
$ pip freeze

Variáveis de Ambiente Python

A biblioteca python-dotenv é usada para carregar variáveis de ambiente a partir de um arquivo .env para dentro do ambiente de execução Python (como se fossem os.environ). Ela é muito útil para armazenar configurações sensíveis ou variáveis que mudam por ambiente, como senhas, tokens, URLs, portas, etc.

Instalar Biblioteca python-dotenv

bash
$ pip install python-dotenv

| DotEnv Python

.env
API_KEY=123456abcdef
DEBUG=True
PORT=8000
dotenv.py
from dotenv import load_dotenv
import os

# Carrega as variáveis do arquivo .env
load_dotenv(override=True) # override (falso por padrão)  informa que a prioridade são as variáveis do arquivo .env ao invés das variáveis do sistema com mesmo nome.

# Acessa como se fosse uma variável de ambiente do sistema
api_key = os.getenv("API_KEY")
debug_mode = os.getenv("DEBUG")
port = os.getenv("PORT")

print(f"API_KEY: {api_key}, DEBUG: {debug_mode}, PORT: {port}")

Posso usar o environ.get('VAR'), mas a melhor pratica para leitura de variáveis é getenv, mas use environ para alterar o valor: os.environ['VAR'] = 'valor'


Configurações Extras, Estrutura e Ambiente Python

Melhores configurações para sistemas python, django:
  • Pylance ( que é a extensão oficial da Microsoft para o VS Code que usa o Pyright internamente para fornecer recursos de IntelliSense e type-checking direto no editor),
  •  Ruff para lintring e formatter,
  • prettier (que foca mais em xml, css, json, django, html etc...),
  • UV, 
  • code runner. 

Use EditorConfig para regras gerais, Ruff para Python, Prettier para JavaScript/HTML. Alinhe configurações (ex.: comprimento de linha) para evitar conflitos.

O Code Runner é uma extensão opcional do VS Code que permite executar rapidamente pequenos trechos de código de várias linguagens diretamente no terminal ou na aba de saída (output) do editor, sem a necessidade de criar um projeto ou configurar um ambiente inteiro. Quando ativado aparece no icone do play: run code. Com ele é possivel executar apenas um trecho de codigo, limpar terminal e executar novamente e etc.

O uv É um gerenciador de ambientes + instalador de pacotes + resolvedor de dependências, tudo em um só. É uma alternativa super rápida ao pip + venv + virtualenv + pip-tools. Função da UV:

Função Equivalente
Criar ambientes virtuais Igual ao python -m venv
Instalar pacotes Igual ao pip install
Resolver dependências rápido Tipo um pip-tools turbo
Rodar projetos Python Tipo um pipx run, mas mais rápido


🧠 PEP8, "Python Enhancement Proposal" (Proposta de Aprimoramento do Python), é um documento oficial do Python que define regras e boas práticas de formatação de código para manter o código limpo, organizado e legível.
No proprio vscode, embaixo, mostra alguns erros e warnings. É importante corrigi-los ou ignora-los, se realmente não der para corrigi-los. Por exemplo, Line too long (95 > 79 characters) flake8 (E501) [97, 80], informa que a linha está muito grande, quando o recomendado é até 79. fazendo comentarios na frente da linha com erro pode ser corrigido, como #noqa.

A ferramenta Ruff Controla a qualidade e formatação do código Python, corrige problemas automaticamente e detecta más práticas. É uma ferramenta moderna e ultra rápida para análise e formatação de código Python. Ele combina várias funções que antes você precisava de várias ferramentas separadas (tipo flake8, pylint, isort, black, etc).  Tem extensão official ára vscode.

Quando você aperta Enter no teclado ao escrever código, o computador precisa gravar no arquivo uma informação dizendo: "Aqui termina uma linha e começa outra." Essa informação é chamada de "caractere de final de linha", também conhecida como EOL (End of Line).

Tipo Nome técnico Código invisível no arquivo Onde é comum
LF Line Feed \n Sistemas Linux, macOS, servidores
CRLF Carriage Return + Line Feed \r\n Windows
CR (antigo) Carriage Return \r Sistemas Mac antigos (pré-OSX)

O problema é que se você abre um projeto feito no Linux com LF e salva no Windows com CRLF, o git vai achar que você mexeu em todas as linhas, só por conta da diferença de final de linha. Além disso, algumas linguagens, servidores ou ferramentas dão erro se o EOL estiver trocado. essas configurações pode ser ajustadas direto no vscode ou usando o arquivo .editorconfig.

Comandos UV

O uv não usa automaticamente a versão global do Python. Se o arquivo .python-version não existir antes de executar uv init, o uv escolhe uma versão padrão (como 3.10) com base em sua lógica interna, que prioriza versões estáveis e amplamente suportadas.
Após instalar, o terminal precisa ser reiniciado. Ao inicializar um projeto, ele cria/usa uma pasta com os arquivos: pyproject.toml.gitignore, .python-version, main.pyREADME.md.
com o uv pip install, usando o gerenciador ultrarrápido do uv, o pacote NÃO é adicionado em pyproject.toml (apenas usando uv add).
Assim que sincronizar todos os pacotes que estão(ou não estão) presentes no toml, serão instalados ou deletados.
uv run python <comando>: executa qualquer comando python. com o ambiente virtual gerenciado pelo uv. Ex.:  uv run python shell não depende do ambiente estar ativado, porque o uv executa direto no ambiente dele, mesmo se você não ativou.
bash
$ # =============================
$ # Instalação do UV
$ # =============================
$ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" # Instala o UV no Windows via PowerShell
$ curl -LsSf https://astral.sh/uv/install.sh | sh # Instala o UV no Linux/macOS
$ 
$ # =============================
$ # Inicialização de projeto e ambiente virtual
$ # =============================
$ uv init nome-do-projeto # Cria uma nova pasta com o nome fornecido e inicializa um projeto UV
$ uv init # Inicializa um projeto UV na pasta atual
$ uv init --name nome-do-projeto . # inicializa na pasta atual mas com o nome do projeto.
$ uv init --python 3.13 # Especificando a versão (se não tiver no seu sistema ou no pyenv ele baixará)
$ uv venv .venv # Cria um ambiente virtual usando o UV na pasta .venv
$ uv run src/main.py # Executa um script Python (sem ativar manualmente a venv)
$ uv python pin 3.10.0 # Baixa (se não existir) e define a versão do Python para 3.10.0 no .python-version (lembre-se de mudar a versão mínima manualmente no pyproject.toml)
$ 
$ # =============================
$ # Instalação e remoção de pacotes
$ # =============================
$ uv add requests # Adiciona pacotes ao projeto e os registra no pyproject.toml
$ uv add --dev ruff pyright # para melhor pratica separe os pacotes de produção dos de desenvolvimento.
$ uv remove requests # Remove o pacote do projeto e do pyproject.toml
$ uv add -r requirements.txt # Instala todos os pacotes listados no requirements.txt e atualiza o pyproject.toml
$ uv pip install django pytest # Instala pacotes como no pip
$ uv pip uninstall django # Remove pacotes
$ uv pip list # Lista todos os pacotes instalados
$ uv pip freeze # Lista os pacotes com as versões (como pip freeze)
$ uv pip show django # Mostra informações do pacote django
$ uv pip check # Verifica conflitos de dependências
$ 
$ # =============================
$ # GERENCIAMENTO DE PYTHON (como pyenv)
$ # =============================
$ uv python list # Lista todas as versões do Python disponíveis para instalar
$ uv python install 3.10.12 # Instala uma versão específica do Python
$ uv python use 3.10.12 # seleciona a versão para usar
$ uv python uninstall 3.10.12 # Remove uma versão do Python instalada via UV
$ uv run python --version # Vê a versão do projeto atual
$ 
$ # =============================
$ # Requisitos e sincronização
$ # =============================
$ uv pip compile pyproject.toml > requirements.txt # Gera um requirements.txt com base no pyproject.toml
$ uv pip sync requirements.txt # Instala os pacotes listados no requirements.txt e remove os extras
$ uv sync # Instala tudo conforme o pyproject.toml e uv.lock (se houver)
$ uv sync --no-dev # instala só as dependências para produção
$ uv lock # Gera ou atualiza o arquivo uv.lock (com travamento das versões exatas)
$ 
$ # =============================
$ # Ferramentas com UV (tools)
$ # =============================
$ uv tool install ruff # Instala uma ferramenta (CLI) como ruff globalmente (sem colocá-la no pyproject.toml)
$ uv tool list # lista as ferramentas instaladas globalmente
$ uvx ruff check --fix . # Corrige problemas automaticamente no diretório atual.
$ uv tool uninstall ruff # Remove a ferramenta instalada
$ 
$ # =============================
$ # Utilidades e ajuda
$ # =============================
$ uv --version # Mostra a versão atual do UV instalada
$ uv --help # Mostra ajuda e todos os comandos disponíveis
ignorando_erros_e_warnings_vscode_pep8.py
# ignora erro e warnings na linha totalmente
linha_grande = 'weqweqweqweqweq-bjtsgl4)h2zg_xi2#84!#l4)qpc!^(+agehfpth6@6mhqfzmzxqqweqweq' # noqa

# ignora apenas o erro de linha grande (maior que 79)
linha_grande = 'weqweqweqweqweq-bjtsgl4)h2zg_xi2#84!#l4)qpc!^(+agehfpth6@6mhqfzmzxqqweqweq' # noqa: E501

# ignora erro de criação de lista sem definir a tipagem
lista_declarada_sem_tipagem = [] # type: ignore
settings.json
{
    "python.testing.pytestEnabled": true,
    "python.testing.unittestEnabled": false,
    "python.testing.pytestArgs": [
        "."
    ],
    "python.testing.autoTestDiscoverOnSaveEnabled": true,
    //Cria uma marcação no vscode para indicar o limite padrão de códigos por linhas no python
    "editor.rulers": [
        79
    ],
}

Arquivo de configuração do vscode (localizado na pasta temporária .vscode).

settings_completo_python_django_react.json
{
  // Zoom geral da interface do VS Code
  "window.zoomLevel": 0,
  // Ativa o breadcrumb (navegação por trilha de pastas/arquivos no topo)
  "breadcrumbs.enabled": true,
  // Tamanho da fonte no editor de código
  "editor.fontSize": 24,
  // Tamanho da fonte no console de depuração (Debug Console)
  "debug.console.fontSize": 24,
  // Tamanho da fonte no terminal integrado
  "terminal.integrated.fontSize": 24,
  // Mostra a margem esquerda para breakpoint e outras marcas
  "editor.glyphMargin": true,
  // Localização da barra lateral (activity bar), pode ser "left", "right" ou "default"
  "workbench.activityBar.location": "default",
  // Exibe numeração de linhas no editor
  "editor.lineNumbers": "on",
  // Final de linha padrão para novos arquivos (Unix LF)
  "files.eol": "\n",
  // Exibe apenas o nome curto dos arquivos nas abas abertas
  "workbench.editor.labelFormat": "short",
  // Número de espaços por tabulação (indentação)
  "editor.tabSize": 2,
  // Regras visuais verticais para comprimento de linha (79 → PEP8, 120 → comum em JS/TS)
  "editor.rulers": [
    79,
    120
  ],
  // Tema de ícones da interface, opcional
  "workbench.iconTheme": "vscode-jetbrains-icon-theme-2023-dark",
  // Tema de cores geral do editor do otavio, opcional
  "workbench.colorTheme": "OM Theme (Default Dracula Italic)",
  // Desativa o agrupamento automático de pastas com um único arquivo dentro
  "explorer.compactFolders": false,
  // Desativa a miniatura do código no lado direito (minimap)
  "editor.minimap.enabled": false,
  // Faz o VS Code abrir arquivos sempre em abas fixas, sem modo preview
  "workbench.editor.enablePreview": false,
  // Limpa o output anterior sempre antes de rodar o Code Runner
  "code-runner.clearPreviousOutput": true,
  // Faz o Code Runner ignorar a seleção e sempre rodar o arquivo todo
  "code-runner.ignoreSelection": true,
  // Salva o arquivo automaticamente antes de rodar o Code Runner
  "code-runner.saveFileBeforeRun": true,
  // Faz o Code Runner executar os códigos no terminal integrado
  "code-runner.runInTerminal": true,
  // Quando o Code Runner termina, ele foca no terminal
  "code-runner.preserveFocus": false,
  // Define os comandos personalizados para cada linguagem no Code Runner
  "code-runner.executorMap": {
    // Para Python → Limpa o terminal e executa o Python
    "python": "clear ; python -u",
    // Para TypeScript → Executa usando tsx
    "typescript": "npx tsx"
  },
  // Regex customizada para Tailwind CSS encontrar classes dentro de funções como clsx()
  "tailwindCSS.experimental.classRegex": [
    [
      "clsx\\(([^)]*)\\)",
      "(?:'|\"|`)([^']*)(?:'|\"|`)"
    ]
  ],
  // 🎯 Configurações específicas para arquivos Python:
  "[python]": {
    // Formatter padrão → Ruff (formatador + linter ultra rápido)
    "editor.defaultFormatter": "charliermarsh.ruff",
    // Formatar automaticamente ao salvar
    "editor.formatOnSave": true,
    // Tamanho da tabulação: 4 espaços (padrão Python)
    "editor.tabSize": 4,
    // Sempre usar espaços ao invés de tabs
    "editor.insertSpaces": true,
    // Corrigir lint e organizar imports automaticamente ao salvar
    "editor.codeActionsOnSave": {
      "source.fixAll.ruff": "explicit",
      "source.organizeImports.ruff": "explicit"
    }
  },
  // Define o caminho do Python a ser usado no VS Code
  "python.defaultInterpreterPath": ".\\.venv\\Scripts\\python.exe", // Para Mac/Linux seria "./.venv/bin/python"
  // Ativa sugestões automáticas de auto-import no Python
  "python.analysis.autoImportCompletions": true,
  // Faz o terminal já abrir com o ambiente virtual ativado
  "python.terminal.activateEnvInCurrentTerminal": true,
  "python.terminal.activateEnvironment": true,
  // Define o Pylance como linguagem server do Python (autocompletar + intellisense)
  "python.languageServer": "Pylance",
  // Diz onde o VS Code deve procurar os ambientes virtuais
  "python.venvPath": ".venv",
  // 🛠 Formatação geral + ESLint + Prettier
  // Formatter padrão global → Prettier
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  // Formatar ao salvar qualquer arquivo
  "editor.formatOnSave": true,
  // Faz o Emmet funcionar corretamente com Django e outros
  "emmet.includeLanguages": {
    "django-html": "html",
    "javascript": "javascriptreact",
    "typescript": "typescriptreact"
  },
  // Corrige ESLint automaticamente ao salvar (para JS/TS)
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": "explicit"
  },
  // 🎯 Formatadores específicos por linguagem:
  "[javascript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[xml]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[svg]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[html]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[django-html]": {
    // Desativa formatar ao salvar especificamente para Django HTML
    "editor.formatOnSave": false,
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    // Ativa sugestões rápidas dentro de arquivos django-html
    "editor.quickSuggestions": {
      "other": true,
      "comments": true,
      "strings": true
    }
  }
}

👉 Essas configurações deixam seu VS Code bem ajustado para Django + Python + Tailwind + JS/TS,
👉 Integra Ruff, Prettier, ESLint, Code Runner, Emmet e configurações de fonte, zoom e formatação.

.editorconfig
# EditorConfig helps developers define and maintain consistent coding styles across editors and IDEs

root = true

# Regras padrão para todos os arquivos
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 4
max_line_length = 79

# Regras específicas para arquivos Python
[*.py]
indent_style = space
indent_size = 4
max_line_length = 79

# Regras específicas para arquivos HTML, CSS, JS, etc.
[*.{html,css,js,ts}]
indent_style = space
indent_size = 2
max_line_length = 120

# Ignorar arquivos de migração do Django (opcional)
[migrations/*.py]
max_line_length = off

Salve o arquivo .editorconfig na raiz do seu projeto. O VS Code vai aplicar automaticamente as regras ao salvar os arquivos.

end_of_line = lf no .editorconfig faz o VSCode sempre salvar os arquivos com o tipo de EOL (final de linha) correto.

extensions.json
{
  "recommendations": [
    "ms-python.python",
    "tamasfe.even-better-toml",
    "esbenp.prettier-vscode",
    "charliermarsh.ruff",
    "formulahendry.code-runner",
    "bradlc.vscode-tailwindcss",
    "chadalen.vscode-jetbrains-icon-theme",
    "omthemes.omthemes"
  ]
}

Aqui voce pode configurar as recomendações de extensões para seu projeto vscode (fica salvo na pasta .vscode). e logo em seguida abrir as extensão e filtrar por recomendações para instalar as que faltam no vscode.

Clique em recommended

pyproject.toml
# ============================
# 📌 INFORMAÇÕES DO PROJETO
# ============================
[project]
name = "project1"                   # Nome do projeto (usado em instalação, PyPI, etc.)
version = "0.0.1"                   # Versão atual do projeto
description = "project1"             # Descrição breve do projeto
readme = "README.md"                # Caminho para o arquivo README (exibido no PyPI, por exemplo)
license = "MIT"                     # Licença do projeto (pode ser MIT, GPL, etc.)
authors = [{ name = "Seu nome", email = "seu@email.com" }]  # Nome e e-mail do autor
requires-python = ">=3.13"          # Versão mínima do Python exigida
dependencies = ["python-dotenv>=1.1.0"]  # Dependências obrigatórias (instalam com pip install .)

[project.urls]
Homepage = "https://www.diogomamedio.com.br/"  # Link para a homepage do projeto
# Outros links opcionais: documentação, repositório, issues etc.

[project.optional-dependencies]
dev = ["ruff", "pyright", "pytest", "pytest-xdist"]  # Dependências opcionais (grupo dev)

[project.scripts]
# Scripts de linha de comando. O comando será `project1` e executará o método `run_from_script`
# dentro de `src/my_package/my_module.py`
project1 = "my_package.my_module:run_from_script"

# ============================
# 📌 CONFIGURAÇÃO DO RUFF (Lint e formatação)
# ============================
[tool.ruff]
line-length = 79                   # Comprimento máximo de linha
target-version = "py313"           # Versão alvo do Python para checks específicos
fix = true                         # Corrige automaticamente problemas simples
show-fixes = true                  # Mostra os fixes feitos
indent-width = 4                   # Tamanho da indentação
exclude = ["venv", ".venv", "env", ".env", "node_modules", "__pycache__"]  # Pastas ignoradas

[tool.ruff.lint]
select = [                         # Regras (linters) que o Ruff vai aplicar
    "ASYNC", "A", "ANN", "B", "BLE", "C4", "C90", "COM", "E", "EM", "ERA",
    "EXE", "F", "FBT", "FIX", "I", "ICN", "ISC", "Q", "RET", "RSE", "S",
    "SIM", "SLF", "T10", "T20", "TC", "TD", "TRY", "UP", "W", "YTT", "RUF", "N",
]
ignore = ["T201", "COM812", "ANN201"] # Regras ignoradas, "ANN201" é o typehint

[tool.ruff.lint.per-file-ignores]
"tests/**/*.py" = ["ANN201", "S101"]  # Ignora essas regras apenas para os arquivos de teste

[tool.ruff.format]
quote-style = "double"             # Força o uso de aspas duplas na formatação
indent-style = "space"             # Usa espaços (e não tabs)
line-ending = "lf"                 # Final de linha (LF = padrão Unix/Linux)

[tool.ruff.lint.isort]
known-first-party = ["my_package"]  # Diz ao Ruff que o pacote interno do projeto é `my_package`

# ============================
# 📌 CONFIGURAÇÃO DO PYRIGHT (Type Checking)
# ============================
[tool.pyright]
typeCheckingMode = "strict"         # Checagem de tipos no modo mais rigoroso
pythonVersion = "3.13"              # Versão alvo do Python
include = ["src", "tests"]          # Pastas onde o Pyright irá rodar
exclude = [                         # Pastas a serem ignoradas pelo Pyright
    "**/venv", "**/.venv", "**/env", "**/.env", "**/node_modules", "**/__pycache__",
]
venv = ".venv"                      # Nome da pasta do virtualenv
venvPath = "."                      # Caminho até o virtualenv
executionEnvironments = [{ root = "src" }]  # Define o ambiente raiz para o Pyright

# ============================
# 📌 CONFIGURAÇÃO DO PYTEST (Testes)
# ============================
[tool.pytest.ini_options]
addopts = "-s --color=yes --tb=short"  # Opções padrão para rodar os testes
pythonpath = ["src"]                   # Inclui a pasta `src` no sys.path para facilitar os imports
testpaths = ["tests"]                  # Pasta onde os testes estão localizados

# ============================
# 📌 CONFIGURAÇÃO DE BUILD (Setuptools)
# ============================
[build-system]
requires = ["setuptools", "wheel"]      # Dependências necessárias para build
build-backend = "setuptools.build_meta" # Backend de build que será usado

[tool.setuptools.packages.find]
where = ["src"]                        # Indica ao setuptools para procurar pacotes apenas dentro de `src`

[tool.setuptools]
package-dir = { "" = "src" }           # Mapeia o diretório raiz dos pacotes para a pasta `src`

O arquivo pyproject.toml é o padrão moderno de configuração para projetos Python. Ele centralizou todas as ferramentas pois antes, cada ferramenta tinha um arquivo separado: setup.cfgsetup.py,.flake8tox.ini.  ruffus, Mypy, pytest, black e etc utilizam esses arquivos para configuração. Ele pode substituir até mesmo o arquivo requirements.json. Ele é como o packge.json em node.

👉 Esse arquivo  é um setup moderno para projetos Python, preparado para:
✔️ Lint (Ruff)
✔️ Type checking (Pyright)
✔️ Testes (Pytest)
✔️ Build (Setuptools)
✔️ Scripts de terminal
✔️ Estrutura com src/

Assuntos Relacionados