Skip to content

feat: credentials retry, OAuth guide and coverage for wizard and CLI path - #22

Merged
djachenko merged 7 commits into
masterfrom
test/26.09.05.coverage_gaps
Sep 11, 2026
Merged

feat: credentials retry, OAuth guide and coverage for wizard and CLI path#22
djachenko merged 7 commits into
masterfrom
test/26.09.05.coverage_gaps

Conversation

@djachenko

@djachenko djachenko commented Sep 5, 2026

Copy link
Copy Markdown
Owner

Wizard

Кривой или несуществующий путь к credentials.json больше не роняет визард — промпт повторяется до валидного файла. Пустой ввод берёт свежайший client_secret_*.json из ~/Downloads, если он есть; выбор файла вынесен в _latest_download().

В текст визарда добавлена подсказка про уже существующий клиент: его секрет повторно не скачивается, нужен Client secrets → Add secret.

Docs

Новый docs/oauth-client.md — пошаговое получение credentials.json, с нуля и для существующего клиента. README дополнен объяснением, почему у каждого свой OAuth-клиент, и предупреждением про unverified-app warning. В CLAUDE.md добавлены docs/, scripts/, tests/ в структуру и ссылка в раздел OAuth.

Tests

47 → 72.

  • test_setup.py — модуль не был покрыт вообще: не-tty гейт, flow из credentials_path, ретрай на несуществующем пути, подстановка из Downloads, _latest_download()
  • test_client.pyclient_config(): ключ уходит в client_secret, CLIENT_ID и эндпоинты на месте
  • test_integration.py — сквозной путь через настоящий _create_app(): граф DI, goodoc file.docx от CLI до Drive, --no-open, отказ на неподдерживаемом формате, login до визарда, logout

Замокана только внешняя граница: googleapiclient.build, Credentials.from_authorized_user_file, webbrowser.

Вся сьюта типизирована: хинты в сигнатурах и фикстурах, Iterator[...] у yield-фикстур, алиас CreateFiles в conftest. Из-за импорта из conftest понадобился known-first-party в настройках isort.

Style

Тернарники в setup.py развёрнуты в if/else; в проверке suggestion — walrus. Разворачивание вскрыло ошибку типа: тернарник склеивал Path и Path | None в один вывод и прятал нуллабельность от mypy, теперь стоит явная аннотация.

Литералы-структуры и длинные сигнатуры разнесены на строки по образцу MIME_MAP.

CI

scripts/no_ternary.py — AST-проверка на ast.IfExp, без зависимостей. Отдельный job style в tests.yml; основной tests остался вызовом reusable workflow из repokit.

Своё правило понадобилось потому, что у ruff такого нет: SIM108 требует ровно обратного — заменять if/else на тернарник.

@djachenko
djachenko merged commit 7613d24 into master Sep 11, 2026
17 checks passed
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.

1 participant