Skip to content

Lint dos exemplos e dos notebooks com as regras de correção - #302

Merged
bdcdo merged 3 commits into
mainfrom
chore/lint-dos-exemplos-211
Oct 29, 2026
Merged

bdcdo merged 3 commits into
mainfrom
chore/lint-dos-exemplos-211

Conversation

@bdcdo

@bdcdo bdcdo commented Oct 29, 2026 •

Copy link
Copy Markdown
Owner

O CI e o pre-commit conferiam só src/ e tests/, e os exemplos em example/ (8 notebooks e example_09_web_search.py), de onde se copia código, ficavam fora do lint. A célula que configura a chave nos oito notebooks usava except: com pass, que engole também o Ctrl+C e o secret ausente no Colab.

O que muda

  • example/ruff.toml dá aos exemplos só as regras de correção: E, F, B, I, UP, S110 e BLE, com extend do pyproject.toml para versão do Python e comprimento de linha. Ficam de fora as regras de estilo de biblioteca (T201, D, ANN, INP001, Q000 e o resto do ALL).
  • A escolha foi o ruff.toml dentro de example/, e não per-file-ignores no pyproject.toml, como a issue propunha: per-file-ignores só tira regras do ALL, e chegar a este conjunto por eles exigiria listar cada família que fica de fora, com toda família nova do ruff passando a valer nos exemplos sem ninguém escolher. Como o ruff usa a configuração mais próxima de cada arquivo, a mesma invocação ruff check src tests example confere src/ e tests/ pelo pyproject.toml e example/ pelo arquivo novo. O comentário no topo do ruff.toml registra isso.
  • Os notebooks capturam ImportError fora do Colab e as três exceções que google.colab.userdata.get levanta (SecretNotFoundError, NotebookAccessError, TimeoutException, conferidas no código-fonte do colabtools), e imprimem a mensagem. Os imports seguem a ordem do isort, as duas f-strings sem placeholder perdem o f e o índice sem uso do iterrows vira _.
  • O job quality roda ruff check src tests example; o pre-commit dispara também em example/ e o hook ruff-check casa os notebooks pelo tipo jupyter.
  • A formatação de example/ fica fora do CI e do pre-commit: o ruff format reescreveria 9 dos 10 arquivos (298 linhas trocadas, 150 delas com aspas simples e 33 com o alinhamento dos comentários que explicam cada argumento e cada linha de dado).
  • CONTRIBUTING.md e CHANGELOG.md (em Alterado).

O trabalho reaproveita, por cherry-pick conferido hunk a hunk, os commits de um branch local antigo que nunca virou PR; a parte dele que tocava documentação e os notebooks 04 e 08 já tinha entrado pelo #264.

Closes #211

bdcdo added 2 commits October 29, 2026 17:32
A célula de configuração dos oito notebooks trocava o except sem tipo
com pass, que engolia também o Ctrl+C e o secret ausente, por except
ImportError fora do Colab e pelas três exceções que userdata.get levanta,
com a mensagem impressa. Os imports seguem a ordem do isort, a f-string
sem placeholder perde o f e o índice sem uso do iterrows vira _.
…rreção (#211)

example/ruff.toml troca o select ALL por E, F, B, I, UP, S110 e BLE, sem
as regras de estilo de biblioteca; per-file-ignores só tiram regras do ALL.
O ruff usa a configuração mais próxima de cada arquivo, então a mesma
invocação confere src/ e tests/ pelo pyproject.toml e example/ por esse
arquivo. A formatação de example/ fica fora, porque o ruff format
reescreveria 9 dos 10 arquivos e desfaria o alinhamento dos comentários.
@bdcdo

bdcdo commented Oct 29, 2026 •

Copy link
Copy Markdown
Owner Author

Bloco de evidência

Base (origin/main, ec33265)

O comando novo do CI na base, sem example/ruff.toml, cai no select = ["ALL"] do pyproject:

$ uv run --extra dev ruff check src tests example --statistics
Found 483 errors.     # exit 1

Os arquivos de example/ da base conferidos com o example/ruff.toml deste ramo (git archive origin/main example pyproject.toml + o arquivo novo):

$ uv run --extra dev ruff check example --statistics
9	I001	[*] unsorted-imports
8	E722	[ ] bare-except
8	S110	[ ] try-except-pass
2	F541	[*] f-string-missing-placeholders
1	B007	[ ] unused-loop-control-variable
Found 28 errors.      # exit 1

O hook ruff-check do pre-commit deste ramo, rodado sobre cópias dos arquivos da base (01_basic.ipynb e example_09_web_search.py) postas em example/:

$ uv run --extra dev pre-commit run ruff-check --files example/zz_base.ipynb example/zz_base.py
ruff check...............................................................Failed
E722 Do not use bare `except`
S110 `try`-`except`-`pass` detected, consider logging the exception
I001 [*] Import block is un-sorted or un-formatted   (x2)
Found 4 errors.       # exit 1

Ramo (4e16e50f)

$ uv run --extra dev ruff check example
All checks passed!    # exit 0
$ uv run --extra dev ruff check src tests example
All checks passed!    # exit 0
$ uv run --extra dev pre-commit run ruff-check --all-files
ruff check...............................................................Passed
$ uv run --extra dev pre-commit run ruff-format --all-files
ruff format..............................................................Passed

ruff check src tests não muda: All checks passed! na base e no ramo. Sem known-first-party o ruff.toml daria 9 I001, e sem o ignore = ["E501"] daria 11 E501; os dois foram conferidos removendo a linha.

Casos cobertos

Caso Esperado Obtido
except: sem tipo (E722) nos 8 notebooks 0 no ramo 0 (8 na base)
try/except/pass (S110) nos 8 notebooks 0 no ramo 0 (8 na base)
imports fora de ordem (I001) 0 0 (9 na base)
f-string sem placeholder (F541) 0 0 (2 na base)
variável de laço sem uso (B007) 0 0 (1 na base)
ruff check src tests inalterado passa na base e no ramo
pre-commit dispara em example/ e lê .ipynb falha nos arquivos da base falhou com 4 erros
ruff format não toca example/ hook e CI excluem a pasta hook Passed com --all-files; CI segue com src tests
notebooks continuam válidos nbformat.validate passa passa nos 8
tests/test_exemplos.py passa 46 passed
exceções do Colab existem userdata define as três SecretNotFoundError, NotebookAccessError, TimeoutException em google/colab/userdata.py do googlecolab/colabtools

Testes

Mesmo comando nos dois (--extra dev --extra all --extra search-all --extra polars --extra excel --extra codex, --cov-branch):

passados pulados falhas cobertura
base 2192 0 0 99,96%
ramo 2192 0 0 99,96%

As duas linhas descobertas, nos dois, são codex.py:723-724 (except ImportError: pass do openai_codex), que só roda sem o extra codex; o CI combina a cobertura de jobs com e sem ele. O ramo não toca src/ nem tests/. ruff format --check src tests, ty check, vulture e deptry src passam no ramo.

O commit 4e16e50, do simplificador de diff, só encurta um comentário do .pre-commit-config.yaml; depois dele, ruff check src tests example e os hooks ruff-check e ruff-format com --all-files passaram de novo.

Risco: alto por mexer no gate do CI; um lint novo que reprove PRs alheios em example/ se desfaz com o revert do squash.

SHA revisado: 4e16e50

@bdcdo
bdcdo merged commit 53a4270 into main Oct 29, 2026
13 checks passed
@bdcdo
bdcdo deleted the chore/lint-dos-exemplos-211 branch October 29, 2026 20:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Lint dos exemplos e dos notebooks

1 participant