Skip to content

Commit 591d221

Browse files
authored
Cli (#11)
Cli режим
1 parent 805e6f9 commit 591d221

57 files changed

Lines changed: 12007 additions & 18 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.ai/cli-guidelines.md

Lines changed: 506 additions & 0 deletions
Large diffs are not rendered by default.

CHANGELOG.md

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,58 @@ and this project adheres to Semantic Versioning.
88
## [Unreleased]
99

1010
### Added
11-
- Нет изменений.
11+
- Добавлена базовая CLI-оболочка: `avito --help`, `avito --version`, `avito version`,
12+
`avito help` и единый вход через `python -m avito`.
13+
- Задокументирован первый CLI-контракт: глобальные флаги, режимы вывода,
14+
разделение stdout/stderr, безопасный JSON/human-рендеринг ошибок и стабильные
15+
exit codes.
16+
- Добавлены локальные CLI-команды учетных записей: `avito account add`,
17+
`avito account list`, `avito account use`, `avito account current`,
18+
`avito account delete` и alias `avito account remove`.
19+
- CLI хранит учетные записи в локальных JSON-файлах с правами доступа к файлам и
20+
маскирует секреты во всех режимах вывода; первая версия использует plaintext
21+
storage без OS keychain.
22+
- Для безопасного ввода `client_secret` добавлены скрытый интерактивный prompt и
23+
`--client-secret-stdin`; `--client-secret` и совместимый `--api-key` оставлены
24+
для явной автоматизации с учетом риска попадания значения в историю shell.
25+
- Добавлена registry-backed справка `avito help <resource>` и
26+
`avito help <resource> <action>` для локальных команд, helper workflows,
27+
aliases и API command candidates без создания `AvitoClient`.
28+
- Добавлена основа сериализации результатов CLI: SDK-модели выводятся через
29+
публичный `model_dump()` / `to_dict()`, секреты маскируются после
30+
сериализации, а `PaginatedList` по умолчанию выгружает только ограниченный
31+
набор страниц.
32+
- Подключен первый registry-backed API slice CLI: `avito account get-self` и
33+
`avito account get-balance --user-id ...` вызывают публичный `AvitoClient`,
34+
проходят через общий слой приведения аргументов, сериализации и безопасного
35+
JSON/human-вывода.
36+
- Расширено read-only CLI-покрытие API: все поддержанные sync Swagger-bound
37+
GET/HEAD-команды регистрируются через CLI registry, проходят fake-transport
38+
smoke coverage и проверяются фазой `scripts/lint_cli_coverage.py --phase read`;
39+
read-bindings без достаточных factory/method аргументов оформлены как
40+
временные исключения до Stage 10C.
41+
- Добавлены CLI safety primitives для будущих write/destructive API-команд:
42+
registry хранит проверенную safety policy, destructive/expensive команды
43+
требуют prompt, `--yes` или точный `--confirm`, а `--dry-run` публикуется
44+
только для SDK-методов с публичным `dry_run`.
45+
- Расширено write CLI-покрытие API: generic-safe sync Swagger-bound write-команды
46+
регистрируются через CLI registry, проходят fake-transport smoke coverage и
47+
проверяются фазой `scripts/lint_cli_coverage.py --phase write`; write-bindings,
48+
которым нужен CLI adapter или уточнение binding metadata, оформлены как
49+
временные исключения до Stage 10C.
50+
- Добавлены публичные CLI helper workflows: `account-health show`,
51+
`listing-health show`, `chat-summary show`, `order-summary show`,
52+
`review-summary show`, `promotion-summary show` и `capabilities show`;
53+
команды вызывают только публичные методы `AvitoClient`, поддерживают JSON/human
54+
вывод и не входят в Swagger one-to-one coverage.
55+
- Добавлены локальные CLI-команды конфигурации и диагностики: `avito config get`,
56+
`avito config set`, `avito config unset`, `avito config list --show-source`,
57+
`avito status`, `avito doctor` и `avito completion bash|zsh|fish`; команды
58+
работают без сетевых вызовов и не раскрывают секреты.
59+
- Добавлена публичная CLI-документация: quickstart в README, how-to для
60+
профилей и ежедневных workflows, стабильный reference контракт, объяснение
61+
архитектуры registry/coverage и ссылки из разделов security, auth/config и
62+
API coverage.
1263

1364
## [2.1.0] - 2026-05-08
1465

Makefile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ MKDOCS_ENV=DISABLE_MKDOCS_2_WARNING=true NO_MKDOCS_2_WARNING=1
66

77
check: test quality
88

9-
quality: typecheck lint python-guidelines-lint swagger-lint architecture-lint async-parity-lint docstring-lint build
9+
quality: typecheck lint python-guidelines-lint swagger-lint cli-lint architecture-lint async-parity-lint docstring-lint build
1010

1111
build: clean
1212
poetry build
@@ -41,6 +41,9 @@ swagger-update:
4141
swagger-lint:
4242
poetry run python scripts/lint_swagger_bindings.py --strict
4343

44+
cli-lint:
45+
poetry run python scripts/lint_cli_coverage.py --strict
46+
4447
architecture-lint:
4548
poetry run python scripts/lint_architecture.py
4649

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,20 @@ print(ad.title)
2424

2525
По умолчанию настройки читаются из переменных окружения с префиксом `AVITO_`.
2626

27+
CLI использует тот же публичный SDK и удобен для smoke-проверок, скриптов и
28+
операционных задач:
29+
30+
```bash
31+
avito account add main --client-id client-id --user-id 123
32+
avito --profile main account get-self
33+
avito --json --no-input --profile main account get-balance --user-id 123
34+
```
35+
36+
`account add` спросит `Client Secret` скрытым prompt. Для CI используйте
37+
`--client-secret-stdin`, чтобы не передавать секрет в аргументах shell.
38+
Подробно: [CLI how-to](https://18studio.github.io/avito_python_api/how-to/cli/)
39+
и [CLI reference](https://18studio.github.io/avito_python_api/reference/cli/).
40+
2741
`avito-py` — Python SDK для работы с Avito API через единые sync/async фасады
2842
`AvitoClient` и `AsyncAvitoClient`.
2943

avito/__main__.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
1-
"""Точка входа модуля для локальной smoke-проверки."""
2-
3-
from avito.client import AvitoClient
4-
5-
6-
def main() -> None:
7-
"""Создает фасад, чтобы `python -m avito` работал как smoke-проверка."""
8-
9-
AvitoClient()
1+
"""Точка входа `python -m avito`."""
102

3+
from avito.cli.app import main
114

125
if __name__ == "__main__":
136
main()

avito/cli/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
"""CLI package for avito-py."""
2+
3+
from avito.cli.app import app, main
4+
5+
__all__ = ("app", "main")

0 commit comments

Comments
 (0)