direct-cli 0.3.3__tar.gz → 0.3.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- direct_cli-0.3.5/.github/workflows/quality.yml +33 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/PKG-INFO +69 -58
- {direct_cli-0.3.3 → direct_cli-0.3.5}/README.md +64 -57
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/tapi_yandex_direct/tapi_yandex_direct.py +102 -8
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/auth.py +98 -1
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/cli.py +2 -5
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/audiencetargets.py +5 -2
- direct_cli-0.3.5/direct_cli/commands/auth.py +421 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/bidmodifiers.py +3 -20
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/dictionaries.py +3 -5
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/dynamicads.py +5 -2
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/dynamicfeedadtargets.py +1 -3
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/reports.py +6 -8
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/strategies.py +154 -34
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/v4account.py +78 -15
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/v4finance.py +169 -0
- direct_cli-0.3.5/direct_cli/commands/v4wordstat.py +157 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/smoke_matrix.py +8 -2
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/v4_contracts.py +52 -20
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli.egg-info/PKG-INFO +69 -58
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli.egg-info/SOURCES.txt +6 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli.egg-info/requires.txt +4 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/pyproject.toml +27 -1
- {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/sandbox_write_live.py +122 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/test_safe_commands.sh +18 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/API_COVERAGE.md +4 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/MANUAL_COVERAGE.md +4 -3
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/api_coverage_payloads.py +6 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_api_coverage.py +115 -0
- direct_cli-0.3.5/tests/test_auth_oauth.py +1405 -0
- direct_cli-0.3.5/tests/test_cli_contract.py +192 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_dry_run.py +54 -5
- direct_cli-0.3.5/tests/test_low_coverage_payloads.py +853 -0
- direct_cli-0.3.5/tests/test_reports_parsing.py +245 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_smoke_matrix.py +154 -3
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_v4_contracts.py +13 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_v4_live_contracts.py +36 -0
- direct_cli-0.3.5/tests/test_v4_safety.py +17 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_v4account.py +109 -3
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_v4finance_money.py +178 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_v4finance_read.py +59 -4
- direct_cli-0.3.5/tests/test_v4wordstat.py +250 -0
- direct_cli-0.3.3/direct_cli/commands/auth.py +0 -202
- direct_cli-0.3.3/tests/test_auth_oauth.py +0 -657
- direct_cli-0.3.3/tests/test_v4_safety.py +0 -15
- {direct_cli-0.3.3 → direct_cli-0.3.5}/.env.example +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/.github/copilot-instructions.md +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/.github/workflows/api-coverage.yml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/.github/workflows/claude-code-review.yml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/.github/workflows/claude.yml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/.gitignore +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/AGENTS.md +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/CHANGELOG.md +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/CLAUDE.md +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/MANIFEST.in +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/__init__.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_deprecated.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_smoke_probes.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/__init__.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/tapi_yandex_direct/__init__.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/tapi_yandex_direct/endpoints.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/tapi_yandex_direct/exceptions.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/tapi_yandex_direct/resource_mapping.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/tapi_yandex_direct/tapi_yandex_direct.pyi +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/tapi_yandex_direct/v4/__init__.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/tapi_yandex_direct/v4/adapter.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/tapi_yandex_direct/v4/adapter.pyi +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/tapi_yandex_direct/v4/resource_mapping.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/api.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/__init__.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/adextensions.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/adgroups.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/adimages.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/ads.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/advideos.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/agencyclients.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/balance.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/bids.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/businesses.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/campaigns.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/changes.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/clients.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/creatives.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/feeds.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/keywordbids.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/keywords.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/keywordsresearch.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/leads.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/negativekeywordsharedsets.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/retargeting.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/sitelinks.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/smartadtargets.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/turbopages.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/v4events.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/v4goals.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/v4shells.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/vcards.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/output.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/reports_coverage.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/utils.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/v4/__init__.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/v4/money.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/wsdl_coverage.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli.egg-info/dependency_links.txt +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli.egg-info/entry_points.txt +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli.egg-info/top_level.txt +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/docs/superpowers/plans/2026-04-12-issue-32-completion.md +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/docs/superpowers/specs/2026-04-23-vendor-tapi-yandex-direct-design.md +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/anonymize_cassettes.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/build_api_coverage_checklist.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/build_api_coverage_report.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/check_reports_drift.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/check_wsdl_drift.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/patch_vendor_imports.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/refresh_reports_cache.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/refresh_wsdl_cache.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/release_pypi.sh +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/test_dangerous_commands.sh +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/test_sandbox_write.sh +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/update_vendor.sh +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/setup.cfg +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/setup.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/API_ISSUE_AUDIT.md +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/__init__.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_adgroups_add_update_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_adimages_add_get_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_ads_add_update_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_ads_suspend_resume_archive_unarchive.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_advideos_add_get.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_audiencetargets_add_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_audiencetargets_suspend_resume.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_bids_set.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_campaign_create_get_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_creatives_chain_advideo_to_creative.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_dynamicads_add_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_dynamicads_suspend_resume.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_keywordbids_set.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_keywords_add_update_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_keywords_suspend_resume.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_sitelinks_add_get_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_smartadtargets_add_update_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_smartadtargets_suspend_resume.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteAdExtensions.test_add_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteAdGroups.test_add_update_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteAdImages.test_add_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteAds.test_add_text_ad_update_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteAudienceTargets.test_add_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteBidModifiersAdd.test_add_delete_mobile.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteBidModifiersSet.test_set_without_id_is_rejected.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteBids.test_set_bid.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteCampaignDraftLifecycle.test_draft_create_get_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteCampaigns.test_campaign_lifecycle.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteDynamicAds.test_add_update_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteFeeds.test_add_update_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteKeywordBids.test_set_keyword_bid.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteKeywords.test_add_update_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteNegativeKeywordSharedSets.test_add_update_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteRetargeting.test_add_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteSitelinks.test_add_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteSmartAdTargets.test_add_update_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteVCards.test_add_delete.yaml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/conftest.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/fixtures/test-video.mp4 +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/reports_cache/raw/fields-list.html +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/reports_cache/raw/headers.html +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/reports_cache/raw/period.html +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/reports_cache/raw/spec.html +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/reports_cache/raw/type.html +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/reports_cache/spec.json +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_auth_bw.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_auth_op.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_balance.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_cli.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_comprehensive.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_integration.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_integration_live_write.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_integration_write.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_reports_drift.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_transport_contract.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_v4_foundation.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_v4events.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_v4goals.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_vendor_imports.py +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/adextensions.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/adgroups.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/adimages.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/ads.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/advideos.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/agencyclients.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/audiencetargets.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/bidmodifiers.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/bids.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/businesses.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/campaigns.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/changes.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/clients.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/creatives.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/dictionaries.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/dynamicfeedadtargets.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/dynamictextadtargets.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/feeds.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/imports/adextensiontypes.xsd +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/imports/general.xsd +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/imports/generalclients.xsd +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/keywordbids.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/keywords.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/keywordsresearch.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/leads.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/negativekeywordsharedsets.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/retargetinglists.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/sitelinks.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/smartadtargets.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/strategies.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/turbopages.xml +0 -0
- {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/vcards.xml +0 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: Quality
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: ["main"]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
quality:
|
|
10
|
+
name: quality
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- name: Checkout repository
|
|
14
|
+
uses: actions/checkout@v4
|
|
15
|
+
|
|
16
|
+
- name: Set up Python
|
|
17
|
+
uses: actions/setup-python@v5
|
|
18
|
+
with:
|
|
19
|
+
python-version: "3.11"
|
|
20
|
+
|
|
21
|
+
- name: Install package with dev dependencies
|
|
22
|
+
run: |
|
|
23
|
+
python -m pip install --upgrade pip
|
|
24
|
+
pip install -e ".[dev]"
|
|
25
|
+
|
|
26
|
+
- name: Lint
|
|
27
|
+
run: ruff check .
|
|
28
|
+
|
|
29
|
+
- name: Type check
|
|
30
|
+
run: mypy .
|
|
31
|
+
|
|
32
|
+
- name: Run offline tests
|
|
33
|
+
run: pytest -m "not integration"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: direct-cli
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.5
|
|
4
4
|
Summary: Command-line interface for Yandex Direct API
|
|
5
5
|
Author: axisrow
|
|
6
6
|
License: MIT
|
|
@@ -33,9 +33,13 @@ Requires-Dist: pytest-recording>=0.13; extra == "dev"
|
|
|
33
33
|
Requires-Dist: vcrpy>=6.0; extra == "dev"
|
|
34
34
|
Requires-Dist: black>=22.0; extra == "dev"
|
|
35
35
|
Requires-Dist: flake8>=4.0; extra == "dev"
|
|
36
|
+
Requires-Dist: mypy>=1.8; extra == "dev"
|
|
37
|
+
Requires-Dist: ruff>=0.1; extra == "dev"
|
|
36
38
|
Requires-Dist: requests>=2.0; extra == "dev"
|
|
37
39
|
Requires-Dist: beautifulsoup4>=4.12; extra == "dev"
|
|
38
40
|
Requires-Dist: lxml>=4.9; extra == "dev"
|
|
41
|
+
Requires-Dist: types-setuptools; extra == "dev"
|
|
42
|
+
Requires-Dist: types-tabulate; extra == "dev"
|
|
39
43
|
|
|
40
44
|
# Direct CLI
|
|
41
45
|
|
|
@@ -82,7 +86,9 @@ OAuth and profile commands:
|
|
|
82
86
|
```bash
|
|
83
87
|
direct auth login
|
|
84
88
|
direct auth login --profile agency1
|
|
89
|
+
direct auth login --profile agency1 --format json
|
|
85
90
|
direct auth login --code abc123 --profile agency1
|
|
91
|
+
printf '%s\n' abc123 | direct auth login --code-stdin --profile agency1
|
|
86
92
|
direct auth list
|
|
87
93
|
direct auth use --profile agency1
|
|
88
94
|
direct auth status --profile agency1
|
|
@@ -95,6 +101,10 @@ Notes:
|
|
|
95
101
|
- `--login` remains Direct client login.
|
|
96
102
|
- Authorization is performed via `direct auth login`.
|
|
97
103
|
- OAuth profiles store refresh tokens and refresh access tokens automatically.
|
|
104
|
+
- In a non-interactive shell, run `direct auth login --profile NAME` first, then finish with `direct auth login --code-stdin --profile NAME` and pass the browser code on stdin.
|
|
105
|
+
- `direct auth login --code CODE --profile NAME` remains supported for compatibility, but `--code-stdin` avoids exposing the code in process arguments.
|
|
106
|
+
- If the first non-interactive step includes `--client-secret`, the secret is remembered for the matching completion step.
|
|
107
|
+
- If a profile already stores a confidential OAuth client, `direct auth login --code CODE --profile NAME` reuses the saved `client_id` and `client_secret`.
|
|
98
108
|
- `direct auth login --oauth-token TOKEN` is a manual access-token import and does not auto-refresh.
|
|
99
109
|
- Alias `auth_login` is not supported.
|
|
100
110
|
|
|
@@ -155,6 +165,19 @@ direct v4events get-events-log --from 2026-04-14T00:00:00 --to 2026-04-15T00:00:
|
|
|
155
165
|
direct v4events get-events-log --from 2026-04-14T00:00:00 --to 2026-04-15T00:00:00 --currency RUB --limit 100 --offset 0 --format table
|
|
156
166
|
```
|
|
157
167
|
|
|
168
|
+
### V4 Live Wordstat Reports
|
|
169
|
+
|
|
170
|
+
Wordstat reports are asynchronous. Direct CLI makes exactly one API call per
|
|
171
|
+
command and does not poll automatically; repeat `list-reports` or `get-report`
|
|
172
|
+
yourself until the report is ready.
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
direct v4wordstat create-report --phrases "buy laptop,buy desktop" --geo-ids 213
|
|
176
|
+
direct v4wordstat list-reports --format table
|
|
177
|
+
direct v4wordstat get-report --report-id 123 --format table
|
|
178
|
+
direct v4wordstat delete-report --report-id 123
|
|
179
|
+
```
|
|
180
|
+
|
|
158
181
|
### V4 Live Finance
|
|
159
182
|
|
|
160
183
|
Finance methods require an extra financial token for money operations. In the
|
|
@@ -165,13 +188,16 @@ per-request token from `--master-token`, `--operation-num`, and
|
|
|
165
188
|
`--finance-login`; alternatively pass a precomputed token with `--finance-token`.
|
|
166
189
|
Environment variables are
|
|
167
190
|
`YANDEX_DIRECT_MASTER_TOKEN`, `YANDEX_DIRECT_FINANCE_LOGIN`,
|
|
168
|
-
`YANDEX_DIRECT_FINANCE_TOKEN`, and `YANDEX_DIRECT_OPERATION_NUM`.
|
|
169
|
-
|
|
170
|
-
|
|
191
|
+
`YANDEX_DIRECT_FINANCE_TOKEN`, and `YANDEX_DIRECT_OPERATION_NUM`.
|
|
192
|
+
`transfer-money` and `pay-campaigns` are dry-run-only in this release and
|
|
193
|
+
always require `--dry-run`; `create-invoice` can be sent live when `--dry-run`
|
|
194
|
+
is omitted. Dry-run output masks the financial token.
|
|
171
195
|
|
|
172
196
|
```bash
|
|
197
|
+
direct v4finance get-clients-units --logins client-login,other-client --format table
|
|
173
198
|
direct v4finance get-credit-limits --logins client-login --master-token MASTER_TOKEN --operation-num 123 --finance-login agency-login
|
|
174
199
|
direct v4finance get-credit-limits --logins client-login,other-client --format table
|
|
200
|
+
direct v4finance create-invoice --payment 123=100.50 --payment 456=25 --currency RUB --master-token MASTER_TOKEN --operation-num 124 --finance-login agency-login --dry-run
|
|
175
201
|
direct v4finance check-payment --custom-transaction-id A123456789012345678901234567890B
|
|
176
202
|
direct v4finance transfer-money --from-campaign-id 123 --to-campaign-id 456 --amount 100.50 --currency RUB --master-token MASTER_TOKEN --operation-num 123 --finance-login agency-login --dry-run
|
|
177
203
|
direct v4finance pay-campaigns --campaign-ids 123,456 --amount 100.50 --currency RUB --contract-id CONTRACT_ID --pay-method Bank --master-token MASTER_TOKEN --operation-num 123 --finance-login agency-login --dry-run
|
|
@@ -179,12 +205,15 @@ direct v4finance pay-campaigns --campaign-ids 123,456 --amount 100.50 --currency
|
|
|
179
205
|
|
|
180
206
|
### V4 Live Shared Account
|
|
181
207
|
|
|
182
|
-
Shared-account mutations
|
|
183
|
-
`--
|
|
208
|
+
Shared-account mutations require `--dry-run` in production and can be sent live
|
|
209
|
+
only with top-level `--sandbox`. These commands follow the official v4 Live
|
|
210
|
+
shared-account method shapes: `EnableSharedAccount` accepts one client `Login`,
|
|
211
|
+
and `AccountManagement` updates shared-account settings through `Accounts`.
|
|
184
212
|
|
|
185
213
|
```bash
|
|
186
214
|
direct v4account enable-shared-account --client-login client-login --dry-run
|
|
187
215
|
direct v4account account-management --action Update --account-id 1327944 --day-budget 100.50 --spend-mode Default --money-in-sms Yes --money-out-sms No --email ops@example.com --money-warning-value 25 --dry-run
|
|
216
|
+
direct --sandbox v4account enable-shared-account --client-login client-login
|
|
188
217
|
```
|
|
189
218
|
|
|
190
219
|
### CLI Convention
|
|
@@ -254,13 +283,8 @@ Allowed:
|
|
|
254
283
|
direct dictionaries get-geo-regions --region-ids 225,187 --fields GeoRegionId,GeoRegionName
|
|
255
284
|
```
|
|
256
285
|
|
|
257
|
-
Not allowed:
|
|
258
|
-
|
|
259
|
-
```bash
|
|
260
|
-
direct dictionaries get-geo-regions \
|
|
261
|
-
--region-ids 225,187 \
|
|
262
|
-
--fields GeoRegionId,GeoRegionName
|
|
263
|
-
```
|
|
286
|
+
Not allowed: splitting a canonical `direct ...` command over multiple shell
|
|
287
|
+
lines with `\`.
|
|
264
288
|
|
|
265
289
|
#### Flag Design Rules
|
|
266
290
|
|
|
@@ -286,12 +310,8 @@ Use:
|
|
|
286
310
|
direct changes check-campaigns --timestamp 2026-04-14T00:00:00
|
|
287
311
|
```
|
|
288
312
|
|
|
289
|
-
Do not use:
|
|
290
|
-
|
|
291
|
-
```bash
|
|
292
|
-
direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
|
|
293
|
-
direct changes check-campaigns --timestamp "2026-04-14 00:00:00"
|
|
294
|
-
```
|
|
313
|
+
Do not use: a timestamp with a `Z` suffix, or a quoted timestamp that contains
|
|
314
|
+
a space between the date and time.
|
|
295
315
|
|
|
296
316
|
#### Documentation Contract
|
|
297
317
|
|
|
@@ -313,17 +333,9 @@ direct dynamicads set-bids --id 789 --bid 12500000 --context-bid 9000000 --prior
|
|
|
313
333
|
direct dictionaries get-geo-regions --name Moscow --region-ids 225,187 --exact-names Москва,Санкт-Петербург --fields GeoRegionId,GeoRegionName
|
|
314
334
|
```
|
|
315
335
|
|
|
316
|
-
Invalid examples
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
direct dictionaries get-geo-regions --json '{"GeoRegionIds":[225]}' --fields GeoRegionId,GeoRegionName
|
|
320
|
-
direct dynamicads set-bids --id 789 --bid 12500000 --json '{"StrategyPriority":"HIGH"}'
|
|
321
|
-
direct dictionaries get-geo-regions \
|
|
322
|
-
--region-ids 225 \
|
|
323
|
-
--fields GeoRegionId,GeoRegionName
|
|
324
|
-
direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
|
|
325
|
-
direct changes check-campaigns --timestamp "2026-04-14 00:00:00"
|
|
326
|
-
```
|
|
336
|
+
Invalid examples include command lines that pass raw JSON flags, use shell
|
|
337
|
+
line continuations, add timezone suffixes to CLI datetimes, or quote
|
|
338
|
+
space-separated datetime values.
|
|
327
339
|
|
|
328
340
|
#### Campaigns
|
|
329
341
|
|
|
@@ -435,8 +447,8 @@ direct dynamicads set-bids --id 789 --bid 12500000 --context-bid 9000000 --prior
|
|
|
435
447
|
|
|
436
448
|
# Shared bidding strategies
|
|
437
449
|
direct strategies get --limit 5
|
|
438
|
-
direct strategies add --name "Shared Clicks" --type WbMaximumClicks --
|
|
439
|
-
direct strategies update --id 42 --
|
|
450
|
+
direct strategies add --name "Shared Clicks" --type WbMaximumClicks --spend-limit 1000000000 --average-cpc 30000000 --dry-run
|
|
451
|
+
direct strategies update --id 42 --type WbMaximumClicks --average-cpc 35000000 --dry-run
|
|
440
452
|
direct strategies archive --id 42 --dry-run
|
|
441
453
|
|
|
442
454
|
# Dynamic feed ad targets
|
|
@@ -611,6 +623,11 @@ The report contains one row per `WRITE_SANDBOX` command:
|
|
|
611
623
|
The same OAuth token works for both production and the sandbox; no separate
|
|
612
624
|
sandbox token is needed.
|
|
613
625
|
|
|
626
|
+
For `v4account` sandbox smoke, `enable-shared-account` uses
|
|
627
|
+
`YANDEX_DIRECT_V4ACCOUNT_CLIENT_LOGIN` or falls back to `YANDEX_DIRECT_LOGIN`.
|
|
628
|
+
`account-management` requires `YANDEX_DIRECT_V4ACCOUNT_ACCOUNT_ID`; without it
|
|
629
|
+
the runner reports `NOT_COVERED` for that command.
|
|
630
|
+
|
|
614
631
|
#### Re-recording write cassettes
|
|
615
632
|
|
|
616
633
|
The `integration_write` pytest tier still replays stored write-test traffic
|
|
@@ -731,7 +748,9 @@ OAuth и profile-команды:
|
|
|
731
748
|
```bash
|
|
732
749
|
direct auth login
|
|
733
750
|
direct auth login --profile agency1
|
|
751
|
+
direct auth login --profile agency1 --format json
|
|
734
752
|
direct auth login --code abc123 --profile agency1
|
|
753
|
+
printf '%s\n' abc123 | direct auth login --code-stdin --profile agency1
|
|
735
754
|
direct auth list
|
|
736
755
|
direct auth use --profile agency1
|
|
737
756
|
direct auth status --profile agency1
|
|
@@ -740,6 +759,10 @@ direct --profile agency1 campaigns get
|
|
|
740
759
|
|
|
741
760
|
Примечания:
|
|
742
761
|
- OAuth profiles сохраняют refresh token и автоматически обновляют access token.
|
|
762
|
+
- В non-interactive shell сначала выполните `direct auth login --profile NAME`, затем завершите через `direct auth login --code-stdin --profile NAME` и передайте browser code через stdin.
|
|
763
|
+
- `direct auth login --code CODE --profile NAME` сохраняется для совместимости, но `--code-stdin` не раскрывает код в process arguments.
|
|
764
|
+
- Если первый non-interactive шаг включает `--client-secret`, secret запоминается для последующего completion step.
|
|
765
|
+
- Если profile уже хранит confidential OAuth client, `direct auth login --code CODE --profile NAME` использует сохраненные `client_id` и `client_secret`.
|
|
743
766
|
- `direct auth login --oauth-token TOKEN` импортирует access token вручную и не включает auto-refresh.
|
|
744
767
|
|
|
745
768
|
Порядок выбора credentials:
|
|
@@ -881,13 +904,8 @@ Allowed:
|
|
|
881
904
|
direct dictionaries get-geo-regions --region-ids 225,187 --fields GeoRegionId,GeoRegionName
|
|
882
905
|
```
|
|
883
906
|
|
|
884
|
-
Not allowed:
|
|
885
|
-
|
|
886
|
-
```bash
|
|
887
|
-
direct dictionaries get-geo-regions \
|
|
888
|
-
--region-ids 225,187 \
|
|
889
|
-
--fields GeoRegionId,GeoRegionName
|
|
890
|
-
```
|
|
907
|
+
Not allowed: splitting a canonical `direct ...` command over multiple shell
|
|
908
|
+
lines with `\`.
|
|
891
909
|
|
|
892
910
|
#### Flag Design Rules
|
|
893
911
|
|
|
@@ -913,12 +931,8 @@ Use:
|
|
|
913
931
|
direct changes check-campaigns --timestamp 2026-04-14T00:00:00
|
|
914
932
|
```
|
|
915
933
|
|
|
916
|
-
Do not use:
|
|
917
|
-
|
|
918
|
-
```bash
|
|
919
|
-
direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
|
|
920
|
-
direct changes check-campaigns --timestamp "2026-04-14 00:00:00"
|
|
921
|
-
```
|
|
934
|
+
Do not use: a timestamp with a `Z` suffix, or a quoted timestamp that contains
|
|
935
|
+
a space between the date and time.
|
|
922
936
|
|
|
923
937
|
#### Documentation Contract
|
|
924
938
|
|
|
@@ -939,17 +953,9 @@ direct dynamicads set-bids --id 789 --bid 12500000
|
|
|
939
953
|
direct dictionaries get-geo-regions --region-ids 225 --fields GeoRegionId,GeoRegionName
|
|
940
954
|
```
|
|
941
955
|
|
|
942
|
-
Invalid examples
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
direct dictionaries get-geo-regions --json '{"GeoRegionIds":[225]}' --fields GeoRegionId,GeoRegionName
|
|
946
|
-
direct dynamicads set-bids --id 789 --bid 12500000 --json '{"StrategyPriority":"HIGH"}'
|
|
947
|
-
direct dictionaries get-geo-regions \
|
|
948
|
-
--region-ids 225 \
|
|
949
|
-
--fields GeoRegionId,GeoRegionName
|
|
950
|
-
direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
|
|
951
|
-
direct changes check-campaigns --timestamp "2026-04-14 00:00:00"
|
|
952
|
-
```
|
|
956
|
+
Invalid examples include command lines that pass raw JSON flags, use shell
|
|
957
|
+
line continuations, add timezone suffixes to CLI datetimes, or quote
|
|
958
|
+
space-separated datetime values.
|
|
953
959
|
|
|
954
960
|
#### Кампании
|
|
955
961
|
|
|
@@ -1061,8 +1067,8 @@ direct dynamicads set-bids --id 789 --bid 12500000 --context-bid 9000000 --prior
|
|
|
1061
1067
|
|
|
1062
1068
|
# Общие стратегии ставок
|
|
1063
1069
|
direct strategies get --limit 5
|
|
1064
|
-
direct strategies add --name "Общая стратегия" --type WbMaximumClicks --
|
|
1065
|
-
direct strategies update --id 42 --
|
|
1070
|
+
direct strategies add --name "Общая стратегия" --type WbMaximumClicks --spend-limit 1000000000 --average-cpc 30000000 --dry-run
|
|
1071
|
+
direct strategies update --id 42 --type WbMaximumClicks --average-cpc 35000000 --dry-run
|
|
1066
1072
|
direct strategies archive --id 42 --dry-run
|
|
1067
1073
|
|
|
1068
1074
|
# Динамические таргеты по фиду
|
|
@@ -1206,6 +1212,11 @@ best-effort. Отчёт содержит одну строку на каждую
|
|
|
1206
1212
|
Один и тот же OAuth-токен работает и для продакшена, и для sandbox; отдельный
|
|
1207
1213
|
sandbox-токен не нужен.
|
|
1208
1214
|
|
|
1215
|
+
Для `v4account` sandbox smoke команда `enable-shared-account` использует
|
|
1216
|
+
`YANDEX_DIRECT_V4ACCOUNT_CLIENT_LOGIN` или fallback на `YANDEX_DIRECT_LOGIN`.
|
|
1217
|
+
Для `account-management` нужна переменная
|
|
1218
|
+
`YANDEX_DIRECT_V4ACCOUNT_ACCOUNT_ID`; без неё runner покажет `NOT_COVERED`.
|
|
1219
|
+
|
|
1209
1220
|
#### Перезапись write-кассет
|
|
1210
1221
|
|
|
1211
1222
|
Уровень `integration_write` в pytest всё ещё воспроизводит сохранённый
|
|
@@ -43,7 +43,9 @@ OAuth and profile commands:
|
|
|
43
43
|
```bash
|
|
44
44
|
direct auth login
|
|
45
45
|
direct auth login --profile agency1
|
|
46
|
+
direct auth login --profile agency1 --format json
|
|
46
47
|
direct auth login --code abc123 --profile agency1
|
|
48
|
+
printf '%s\n' abc123 | direct auth login --code-stdin --profile agency1
|
|
47
49
|
direct auth list
|
|
48
50
|
direct auth use --profile agency1
|
|
49
51
|
direct auth status --profile agency1
|
|
@@ -56,6 +58,10 @@ Notes:
|
|
|
56
58
|
- `--login` remains Direct client login.
|
|
57
59
|
- Authorization is performed via `direct auth login`.
|
|
58
60
|
- OAuth profiles store refresh tokens and refresh access tokens automatically.
|
|
61
|
+
- In a non-interactive shell, run `direct auth login --profile NAME` first, then finish with `direct auth login --code-stdin --profile NAME` and pass the browser code on stdin.
|
|
62
|
+
- `direct auth login --code CODE --profile NAME` remains supported for compatibility, but `--code-stdin` avoids exposing the code in process arguments.
|
|
63
|
+
- If the first non-interactive step includes `--client-secret`, the secret is remembered for the matching completion step.
|
|
64
|
+
- If a profile already stores a confidential OAuth client, `direct auth login --code CODE --profile NAME` reuses the saved `client_id` and `client_secret`.
|
|
59
65
|
- `direct auth login --oauth-token TOKEN` is a manual access-token import and does not auto-refresh.
|
|
60
66
|
- Alias `auth_login` is not supported.
|
|
61
67
|
|
|
@@ -116,6 +122,19 @@ direct v4events get-events-log --from 2026-04-14T00:00:00 --to 2026-04-15T00:00:
|
|
|
116
122
|
direct v4events get-events-log --from 2026-04-14T00:00:00 --to 2026-04-15T00:00:00 --currency RUB --limit 100 --offset 0 --format table
|
|
117
123
|
```
|
|
118
124
|
|
|
125
|
+
### V4 Live Wordstat Reports
|
|
126
|
+
|
|
127
|
+
Wordstat reports are asynchronous. Direct CLI makes exactly one API call per
|
|
128
|
+
command and does not poll automatically; repeat `list-reports` or `get-report`
|
|
129
|
+
yourself until the report is ready.
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
direct v4wordstat create-report --phrases "buy laptop,buy desktop" --geo-ids 213
|
|
133
|
+
direct v4wordstat list-reports --format table
|
|
134
|
+
direct v4wordstat get-report --report-id 123 --format table
|
|
135
|
+
direct v4wordstat delete-report --report-id 123
|
|
136
|
+
```
|
|
137
|
+
|
|
119
138
|
### V4 Live Finance
|
|
120
139
|
|
|
121
140
|
Finance methods require an extra financial token for money operations. In the
|
|
@@ -126,13 +145,16 @@ per-request token from `--master-token`, `--operation-num`, and
|
|
|
126
145
|
`--finance-login`; alternatively pass a precomputed token with `--finance-token`.
|
|
127
146
|
Environment variables are
|
|
128
147
|
`YANDEX_DIRECT_MASTER_TOKEN`, `YANDEX_DIRECT_FINANCE_LOGIN`,
|
|
129
|
-
`YANDEX_DIRECT_FINANCE_TOKEN`, and `YANDEX_DIRECT_OPERATION_NUM`.
|
|
130
|
-
|
|
131
|
-
|
|
148
|
+
`YANDEX_DIRECT_FINANCE_TOKEN`, and `YANDEX_DIRECT_OPERATION_NUM`.
|
|
149
|
+
`transfer-money` and `pay-campaigns` are dry-run-only in this release and
|
|
150
|
+
always require `--dry-run`; `create-invoice` can be sent live when `--dry-run`
|
|
151
|
+
is omitted. Dry-run output masks the financial token.
|
|
132
152
|
|
|
133
153
|
```bash
|
|
154
|
+
direct v4finance get-clients-units --logins client-login,other-client --format table
|
|
134
155
|
direct v4finance get-credit-limits --logins client-login --master-token MASTER_TOKEN --operation-num 123 --finance-login agency-login
|
|
135
156
|
direct v4finance get-credit-limits --logins client-login,other-client --format table
|
|
157
|
+
direct v4finance create-invoice --payment 123=100.50 --payment 456=25 --currency RUB --master-token MASTER_TOKEN --operation-num 124 --finance-login agency-login --dry-run
|
|
136
158
|
direct v4finance check-payment --custom-transaction-id A123456789012345678901234567890B
|
|
137
159
|
direct v4finance transfer-money --from-campaign-id 123 --to-campaign-id 456 --amount 100.50 --currency RUB --master-token MASTER_TOKEN --operation-num 123 --finance-login agency-login --dry-run
|
|
138
160
|
direct v4finance pay-campaigns --campaign-ids 123,456 --amount 100.50 --currency RUB --contract-id CONTRACT_ID --pay-method Bank --master-token MASTER_TOKEN --operation-num 123 --finance-login agency-login --dry-run
|
|
@@ -140,12 +162,15 @@ direct v4finance pay-campaigns --campaign-ids 123,456 --amount 100.50 --currency
|
|
|
140
162
|
|
|
141
163
|
### V4 Live Shared Account
|
|
142
164
|
|
|
143
|
-
Shared-account mutations
|
|
144
|
-
`--
|
|
165
|
+
Shared-account mutations require `--dry-run` in production and can be sent live
|
|
166
|
+
only with top-level `--sandbox`. These commands follow the official v4 Live
|
|
167
|
+
shared-account method shapes: `EnableSharedAccount` accepts one client `Login`,
|
|
168
|
+
and `AccountManagement` updates shared-account settings through `Accounts`.
|
|
145
169
|
|
|
146
170
|
```bash
|
|
147
171
|
direct v4account enable-shared-account --client-login client-login --dry-run
|
|
148
172
|
direct v4account account-management --action Update --account-id 1327944 --day-budget 100.50 --spend-mode Default --money-in-sms Yes --money-out-sms No --email ops@example.com --money-warning-value 25 --dry-run
|
|
173
|
+
direct --sandbox v4account enable-shared-account --client-login client-login
|
|
149
174
|
```
|
|
150
175
|
|
|
151
176
|
### CLI Convention
|
|
@@ -215,13 +240,8 @@ Allowed:
|
|
|
215
240
|
direct dictionaries get-geo-regions --region-ids 225,187 --fields GeoRegionId,GeoRegionName
|
|
216
241
|
```
|
|
217
242
|
|
|
218
|
-
Not allowed:
|
|
219
|
-
|
|
220
|
-
```bash
|
|
221
|
-
direct dictionaries get-geo-regions \
|
|
222
|
-
--region-ids 225,187 \
|
|
223
|
-
--fields GeoRegionId,GeoRegionName
|
|
224
|
-
```
|
|
243
|
+
Not allowed: splitting a canonical `direct ...` command over multiple shell
|
|
244
|
+
lines with `\`.
|
|
225
245
|
|
|
226
246
|
#### Flag Design Rules
|
|
227
247
|
|
|
@@ -247,12 +267,8 @@ Use:
|
|
|
247
267
|
direct changes check-campaigns --timestamp 2026-04-14T00:00:00
|
|
248
268
|
```
|
|
249
269
|
|
|
250
|
-
Do not use:
|
|
251
|
-
|
|
252
|
-
```bash
|
|
253
|
-
direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
|
|
254
|
-
direct changes check-campaigns --timestamp "2026-04-14 00:00:00"
|
|
255
|
-
```
|
|
270
|
+
Do not use: a timestamp with a `Z` suffix, or a quoted timestamp that contains
|
|
271
|
+
a space between the date and time.
|
|
256
272
|
|
|
257
273
|
#### Documentation Contract
|
|
258
274
|
|
|
@@ -274,17 +290,9 @@ direct dynamicads set-bids --id 789 --bid 12500000 --context-bid 9000000 --prior
|
|
|
274
290
|
direct dictionaries get-geo-regions --name Moscow --region-ids 225,187 --exact-names Москва,Санкт-Петербург --fields GeoRegionId,GeoRegionName
|
|
275
291
|
```
|
|
276
292
|
|
|
277
|
-
Invalid examples
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
direct dictionaries get-geo-regions --json '{"GeoRegionIds":[225]}' --fields GeoRegionId,GeoRegionName
|
|
281
|
-
direct dynamicads set-bids --id 789 --bid 12500000 --json '{"StrategyPriority":"HIGH"}'
|
|
282
|
-
direct dictionaries get-geo-regions \
|
|
283
|
-
--region-ids 225 \
|
|
284
|
-
--fields GeoRegionId,GeoRegionName
|
|
285
|
-
direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
|
|
286
|
-
direct changes check-campaigns --timestamp "2026-04-14 00:00:00"
|
|
287
|
-
```
|
|
293
|
+
Invalid examples include command lines that pass raw JSON flags, use shell
|
|
294
|
+
line continuations, add timezone suffixes to CLI datetimes, or quote
|
|
295
|
+
space-separated datetime values.
|
|
288
296
|
|
|
289
297
|
#### Campaigns
|
|
290
298
|
|
|
@@ -396,8 +404,8 @@ direct dynamicads set-bids --id 789 --bid 12500000 --context-bid 9000000 --prior
|
|
|
396
404
|
|
|
397
405
|
# Shared bidding strategies
|
|
398
406
|
direct strategies get --limit 5
|
|
399
|
-
direct strategies add --name "Shared Clicks" --type WbMaximumClicks --
|
|
400
|
-
direct strategies update --id 42 --
|
|
407
|
+
direct strategies add --name "Shared Clicks" --type WbMaximumClicks --spend-limit 1000000000 --average-cpc 30000000 --dry-run
|
|
408
|
+
direct strategies update --id 42 --type WbMaximumClicks --average-cpc 35000000 --dry-run
|
|
401
409
|
direct strategies archive --id 42 --dry-run
|
|
402
410
|
|
|
403
411
|
# Dynamic feed ad targets
|
|
@@ -572,6 +580,11 @@ The report contains one row per `WRITE_SANDBOX` command:
|
|
|
572
580
|
The same OAuth token works for both production and the sandbox; no separate
|
|
573
581
|
sandbox token is needed.
|
|
574
582
|
|
|
583
|
+
For `v4account` sandbox smoke, `enable-shared-account` uses
|
|
584
|
+
`YANDEX_DIRECT_V4ACCOUNT_CLIENT_LOGIN` or falls back to `YANDEX_DIRECT_LOGIN`.
|
|
585
|
+
`account-management` requires `YANDEX_DIRECT_V4ACCOUNT_ACCOUNT_ID`; without it
|
|
586
|
+
the runner reports `NOT_COVERED` for that command.
|
|
587
|
+
|
|
575
588
|
#### Re-recording write cassettes
|
|
576
589
|
|
|
577
590
|
The `integration_write` pytest tier still replays stored write-test traffic
|
|
@@ -692,7 +705,9 @@ OAuth и profile-команды:
|
|
|
692
705
|
```bash
|
|
693
706
|
direct auth login
|
|
694
707
|
direct auth login --profile agency1
|
|
708
|
+
direct auth login --profile agency1 --format json
|
|
695
709
|
direct auth login --code abc123 --profile agency1
|
|
710
|
+
printf '%s\n' abc123 | direct auth login --code-stdin --profile agency1
|
|
696
711
|
direct auth list
|
|
697
712
|
direct auth use --profile agency1
|
|
698
713
|
direct auth status --profile agency1
|
|
@@ -701,6 +716,10 @@ direct --profile agency1 campaigns get
|
|
|
701
716
|
|
|
702
717
|
Примечания:
|
|
703
718
|
- OAuth profiles сохраняют refresh token и автоматически обновляют access token.
|
|
719
|
+
- В non-interactive shell сначала выполните `direct auth login --profile NAME`, затем завершите через `direct auth login --code-stdin --profile NAME` и передайте browser code через stdin.
|
|
720
|
+
- `direct auth login --code CODE --profile NAME` сохраняется для совместимости, но `--code-stdin` не раскрывает код в process arguments.
|
|
721
|
+
- Если первый non-interactive шаг включает `--client-secret`, secret запоминается для последующего completion step.
|
|
722
|
+
- Если profile уже хранит confidential OAuth client, `direct auth login --code CODE --profile NAME` использует сохраненные `client_id` и `client_secret`.
|
|
704
723
|
- `direct auth login --oauth-token TOKEN` импортирует access token вручную и не включает auto-refresh.
|
|
705
724
|
|
|
706
725
|
Порядок выбора credentials:
|
|
@@ -842,13 +861,8 @@ Allowed:
|
|
|
842
861
|
direct dictionaries get-geo-regions --region-ids 225,187 --fields GeoRegionId,GeoRegionName
|
|
843
862
|
```
|
|
844
863
|
|
|
845
|
-
Not allowed:
|
|
846
|
-
|
|
847
|
-
```bash
|
|
848
|
-
direct dictionaries get-geo-regions \
|
|
849
|
-
--region-ids 225,187 \
|
|
850
|
-
--fields GeoRegionId,GeoRegionName
|
|
851
|
-
```
|
|
864
|
+
Not allowed: splitting a canonical `direct ...` command over multiple shell
|
|
865
|
+
lines with `\`.
|
|
852
866
|
|
|
853
867
|
#### Flag Design Rules
|
|
854
868
|
|
|
@@ -874,12 +888,8 @@ Use:
|
|
|
874
888
|
direct changes check-campaigns --timestamp 2026-04-14T00:00:00
|
|
875
889
|
```
|
|
876
890
|
|
|
877
|
-
Do not use:
|
|
878
|
-
|
|
879
|
-
```bash
|
|
880
|
-
direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
|
|
881
|
-
direct changes check-campaigns --timestamp "2026-04-14 00:00:00"
|
|
882
|
-
```
|
|
891
|
+
Do not use: a timestamp with a `Z` suffix, or a quoted timestamp that contains
|
|
892
|
+
a space between the date and time.
|
|
883
893
|
|
|
884
894
|
#### Documentation Contract
|
|
885
895
|
|
|
@@ -900,17 +910,9 @@ direct dynamicads set-bids --id 789 --bid 12500000
|
|
|
900
910
|
direct dictionaries get-geo-regions --region-ids 225 --fields GeoRegionId,GeoRegionName
|
|
901
911
|
```
|
|
902
912
|
|
|
903
|
-
Invalid examples
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
direct dictionaries get-geo-regions --json '{"GeoRegionIds":[225]}' --fields GeoRegionId,GeoRegionName
|
|
907
|
-
direct dynamicads set-bids --id 789 --bid 12500000 --json '{"StrategyPriority":"HIGH"}'
|
|
908
|
-
direct dictionaries get-geo-regions \
|
|
909
|
-
--region-ids 225 \
|
|
910
|
-
--fields GeoRegionId,GeoRegionName
|
|
911
|
-
direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
|
|
912
|
-
direct changes check-campaigns --timestamp "2026-04-14 00:00:00"
|
|
913
|
-
```
|
|
913
|
+
Invalid examples include command lines that pass raw JSON flags, use shell
|
|
914
|
+
line continuations, add timezone suffixes to CLI datetimes, or quote
|
|
915
|
+
space-separated datetime values.
|
|
914
916
|
|
|
915
917
|
#### Кампании
|
|
916
918
|
|
|
@@ -1022,8 +1024,8 @@ direct dynamicads set-bids --id 789 --bid 12500000 --context-bid 9000000 --prior
|
|
|
1022
1024
|
|
|
1023
1025
|
# Общие стратегии ставок
|
|
1024
1026
|
direct strategies get --limit 5
|
|
1025
|
-
direct strategies add --name "Общая стратегия" --type WbMaximumClicks --
|
|
1026
|
-
direct strategies update --id 42 --
|
|
1027
|
+
direct strategies add --name "Общая стратегия" --type WbMaximumClicks --spend-limit 1000000000 --average-cpc 30000000 --dry-run
|
|
1028
|
+
direct strategies update --id 42 --type WbMaximumClicks --average-cpc 35000000 --dry-run
|
|
1027
1029
|
direct strategies archive --id 42 --dry-run
|
|
1028
1030
|
|
|
1029
1031
|
# Динамические таргеты по фиду
|
|
@@ -1167,6 +1169,11 @@ best-effort. Отчёт содержит одну строку на каждую
|
|
|
1167
1169
|
Один и тот же OAuth-токен работает и для продакшена, и для sandbox; отдельный
|
|
1168
1170
|
sandbox-токен не нужен.
|
|
1169
1171
|
|
|
1172
|
+
Для `v4account` sandbox smoke команда `enable-shared-account` использует
|
|
1173
|
+
`YANDEX_DIRECT_V4ACCOUNT_CLIENT_LOGIN` или fallback на `YANDEX_DIRECT_LOGIN`.
|
|
1174
|
+
Для `account-management` нужна переменная
|
|
1175
|
+
`YANDEX_DIRECT_V4ACCOUNT_ACCOUNT_ID`; без неё runner покажет `NOT_COVERED`.
|
|
1176
|
+
|
|
1170
1177
|
#### Перезапись write-кассет
|
|
1171
1178
|
|
|
1172
1179
|
Уровень `integration_write` в pytest всё ещё воспроизводит сохранённый
|