direct-cli 0.3.11__tar.gz → 0.3.13__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.11 → direct_cli-0.3.13}/AGENTS.md +6 -6
- {direct_cli-0.3.11 → direct_cli-0.3.13}/CHANGELOG.md +85 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/CLAUDE.md +2 -1
- {direct_cli-0.3.11 → direct_cli-0.3.13}/PKG-INFO +339 -79
- {direct_cli-0.3.11 → direct_cli-0.3.13}/README.md +338 -78
- direct_cli-0.3.13/direct_cli/_bidding_strategy.py +5558 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/_vendor/tapi_yandex_direct/resource_mapping.py +6 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/_vendor/tapi_yandex_direct/tapi_yandex_direct.pyi +1 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/auth.py +4 -6
- direct_cli-0.3.13/direct_cli/cli.py +343 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/adextensions.py +16 -4
- direct_cli-0.3.13/direct_cli/commands/adgroups.py +1235 -0
- direct_cli-0.3.13/direct_cli/commands/ads.py +2288 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/audiencetargets.py +7 -3
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/bidmodifiers.py +19 -2
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/bids.py +63 -6
- direct_cli-0.3.13/direct_cli/commands/campaigns.py +7484 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/changes.py +11 -5
- direct_cli-0.3.13/direct_cli/commands/clients.py +284 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/dynamicads.py +1 -2
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/dynamicfeedadtargets.py +1 -1
- direct_cli-0.3.13/direct_cli/commands/feeds.py +400 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/keywordbids.py +59 -9
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/keywords.py +414 -5
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/retargeting.py +40 -3
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/sitelinks.py +27 -7
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/strategies.py +220 -7
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/v4account.py +19 -32
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/vcards.py +87 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/utils.py +264 -22
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/v4/money.py +1 -1
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/v4_contracts.py +3 -6
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/wsdl_coverage.py +82 -1
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli.egg-info/PKG-INFO +339 -79
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli.egg-info/SOURCES.txt +5 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/pyproject.toml +1 -1
- {direct_cli-0.3.11 → direct_cli-0.3.13}/scripts/anonymize_cassettes.py +7 -15
- {direct_cli-0.3.11 → direct_cli-0.3.13}/scripts/build_api_coverage_report.py +2 -4
- direct_cli-0.3.13/scripts/build_wsdl_optional_field_audit.py +312 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/scripts/check_reports_drift.py +7 -5
- {direct_cli-0.3.11 → direct_cli-0.3.13}/scripts/check_wsdl_drift.py +1 -5
- {direct_cli-0.3.11 → direct_cli-0.3.13}/scripts/patch_vendor_imports.py +1 -2
- {direct_cli-0.3.11 → direct_cli-0.3.13}/scripts/refresh_wsdl_cache.py +3 -1
- {direct_cli-0.3.11 → direct_cli-0.3.13}/scripts/sandbox_write_live.py +1 -1
- {direct_cli-0.3.11 → direct_cli-0.3.13}/scripts/test_safe_commands.sh +1 -1
- direct_cli-0.3.13/tests/WSDL_OPTIONAL_FIELD_AUDIT.md +3292 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/api_coverage_payloads.py +358 -11
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/conftest.py +129 -61
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_api_coverage.py +18 -16
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_auth_bw.py +3 -1
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_auth_oauth.py +111 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_auth_op.py +3 -1
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_balance.py +7 -3
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_changes.py +29 -2
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_cli.py +377 -2
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_cli_contract.py +12 -1
- direct_cli-0.3.13/tests/test_dry_run.py +21772 -0
- direct_cli-0.3.13/tests/test_env_loading.py +136 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_integration.py +3 -3
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_integration_write.py +9 -7
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_low_coverage_payloads.py +25 -10
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_transport_contract.py +3 -3
- direct_cli-0.3.13/tests/test_unknown_option_hints.py +173 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_v4_contracts.py +1 -3
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_v4_exit_codes.py +18 -12
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_v4_live_contracts.py +6 -6
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_v4account.py +3 -8
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_v5_live_write.py +13 -14
- direct_cli-0.3.13/tests/test_wsdl_parity_gate.py +5675 -0
- direct_cli-0.3.11/direct_cli/cli.py +0 -213
- direct_cli-0.3.11/direct_cli/commands/adgroups.py +0 -314
- direct_cli-0.3.11/direct_cli/commands/ads.py +0 -798
- direct_cli-0.3.11/direct_cli/commands/campaigns.py +0 -1163
- direct_cli-0.3.11/direct_cli/commands/clients.py +0 -143
- direct_cli-0.3.11/direct_cli/commands/feeds.py +0 -178
- direct_cli-0.3.11/tests/test_dry_run.py +0 -4594
- direct_cli-0.3.11/tests/test_wsdl_parity_gate.py +0 -761
- {direct_cli-0.3.11 → direct_cli-0.3.13}/.env.example +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/.github/copilot-instructions.md +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/.github/workflows/api-coverage.yml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/.github/workflows/claude.yml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/.github/workflows/quality.yml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/.gitignore +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/MANIFEST.in +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/__init__.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/_deprecated.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/_smoke_probes.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/_vendor/__init__.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/_vendor/tapi_yandex_direct/__init__.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/_vendor/tapi_yandex_direct/endpoints.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/_vendor/tapi_yandex_direct/exceptions.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/_vendor/tapi_yandex_direct/tapi_yandex_direct.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/_vendor/tapi_yandex_direct/v4/__init__.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/_vendor/tapi_yandex_direct/v4/adapter.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/_vendor/tapi_yandex_direct/v4/adapter.pyi +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/_vendor/tapi_yandex_direct/v4/resource_mapping.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/api.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/__init__.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/adimages.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/advideos.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/agencyclients.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/auth.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/balance.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/businesses.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/creatives.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/dictionaries.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/keywordsresearch.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/leads.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/negativekeywordsharedsets.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/reports.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/smartadtargets.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/turbopages.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/v4events.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/v4finance.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/v4forecast.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/v4goals.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/v4shells.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/v4tags.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/commands/v4wordstat.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/output.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/reports_coverage.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/smoke_matrix.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli/v4/__init__.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli.egg-info/dependency_links.txt +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli.egg-info/entry_points.txt +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli.egg-info/requires.txt +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/direct_cli.egg-info/top_level.txt +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/docs/audits/issue-198-mutating-wsdl-audit.md +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/docs/superpowers/plans/2026-04-12-issue-32-completion.md +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/docs/superpowers/specs/2026-04-23-vendor-tapi-yandex-direct-design.md +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/scripts/build_api_coverage_checklist.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/scripts/refresh_reports_cache.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/scripts/release_pypi.sh +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/scripts/sandbox_write_audit.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/scripts/test_dangerous_commands.sh +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/scripts/test_sandbox_write.sh +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/scripts/update_vendor.sh +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/setup.cfg +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/setup.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/API_COVERAGE.md +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/API_ISSUE_AUDIT.md +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/MANUAL_COVERAGE.md +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/__init__.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/_orphan_store.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteAdExtensions.test_add_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteAdGroups.test_add_update_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteAdImages.test_add_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteAds.test_add_text_ad_update_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteAudienceTargets.test_add_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteBidModifiersAdd.test_add_delete_mobile.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteBidModifiersSet.test_set_without_id_is_rejected.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteBids.test_set_bid.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteBidsRead.test_bids_get.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteBidsRead.test_bids_set_auto.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteCampaignDraftLifecycle.test_draft_create_get_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteCampaigns.test_campaign_lifecycle.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteDynamicAds.test_add_update_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteFeeds.test_add_update_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteKeywordBids.test_set_keyword_bid.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteKeywords.test_add_update_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteNegativeKeywordSharedSets.test_add_update_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteRetargeting.test_add_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteRetargetingUpdate.test_retargeting_update.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteSitelinks.test_add_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteSmartAdTargets.test_add_update_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteStrategies.test_strategies_lifecycle.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_integration_write/TestWriteVCards.test_add_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_v5_live_write/test_v5_live_draft_adgroups_add_update_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_v5_live_write/test_v5_live_draft_adimages_add_get_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_v5_live_write/test_v5_live_draft_ads_add_update_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_v5_live_write/test_v5_live_draft_ads_suspend_resume_archive_unarchive.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_v5_live_write/test_v5_live_draft_advideos_add_get.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_v5_live_write/test_v5_live_draft_audiencetargets_add_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_v5_live_write/test_v5_live_draft_audiencetargets_suspend_resume.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_v5_live_write/test_v5_live_draft_bids_set.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_v5_live_write/test_v5_live_draft_campaign_create_get_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_v5_live_write/test_v5_live_draft_creatives_chain_advideo_to_creative.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_v5_live_write/test_v5_live_draft_dynamicads_add_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_v5_live_write/test_v5_live_draft_dynamicads_suspend_resume.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_v5_live_write/test_v5_live_draft_keywordbids_set.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_v5_live_write/test_v5_live_draft_keywords_add_update_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_v5_live_write/test_v5_live_draft_keywords_suspend_resume.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_v5_live_write/test_v5_live_draft_sitelinks_add_get_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_v5_live_write/test_v5_live_draft_smartadtargets_add_update_delete.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/cassettes/test_v5_live_write/test_v5_live_draft_smartadtargets_suspend_resume.yaml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/fixtures/test-video.mp4 +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/reports_cache/raw/fields-list.html +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/reports_cache/raw/headers.html +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/reports_cache/raw/period.html +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/reports_cache/raw/spec.html +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/reports_cache/raw/type.html +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/reports_cache/spec.json +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_auth_write_json.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_comprehensive.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_reports_drift.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_reports_parsing.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_sandbox_write_audit.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_smoke_matrix.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_v4_foundation.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_v4_runtime_shape.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_v4_safety.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_v4events.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_v4finance_money.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_v4finance_read.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_v4forecast.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_v4goals.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_v4tags.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_v4wordstat.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/test_vendor_imports.py +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/adextensions.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/adgroups.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/adimages.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/ads.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/advideos.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/agencyclients.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/audiencetargets.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/bidmodifiers.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/bids.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/businesses.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/campaigns.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/changes.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/clients.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/creatives.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/dictionaries.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/dynamicfeedadtargets.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/dynamictextadtargets.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/feeds.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/imports/adextensiontypes.xsd +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/imports/general.xsd +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/imports/generalclients.xsd +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/keywordbids.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/keywords.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/keywordsresearch.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/leads.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/negativekeywordsharedsets.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/retargetinglists.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/sitelinks.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/smartadtargets.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/strategies.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/turbopages.xml +0 -0
- {direct_cli-0.3.11 → direct_cli-0.3.13}/tests/wsdl_cache/vcards.xml +0 -0
|
@@ -73,21 +73,22 @@ direct dictionaries get-geo-regions \
|
|
|
73
73
|
|
|
74
74
|
### Datetime Rules
|
|
75
75
|
|
|
76
|
-
-
|
|
76
|
+
- Changes timestamps must match Yandex Direct API format `YYYY-MM-DDTHH:MM:SSZ`.
|
|
77
|
+
- Other datetime parameters use their method-specific documented format.
|
|
77
78
|
- Datetime values must be passed as a single shell token.
|
|
78
|
-
- Canonical examples must
|
|
79
|
+
- Canonical `changes` examples must use the `Z` suffix.
|
|
79
80
|
- Canonical examples must not use quoted space-separated datetime values.
|
|
80
81
|
|
|
81
82
|
Use:
|
|
82
83
|
|
|
83
84
|
```bash
|
|
84
|
-
direct changes check-campaigns --timestamp 2026-04-14T00:00:
|
|
85
|
+
direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
|
|
85
86
|
```
|
|
86
87
|
|
|
87
88
|
Do not use:
|
|
88
89
|
|
|
89
90
|
```bash
|
|
90
|
-
direct changes check-campaigns --timestamp 2026-04-14T00:00:
|
|
91
|
+
direct changes check-campaigns --timestamp 2026-04-14T00:00:00
|
|
91
92
|
direct changes check-campaigns --timestamp "2026-04-14 00:00:00"
|
|
92
93
|
```
|
|
93
94
|
|
|
@@ -104,7 +105,7 @@ Valid canonical examples:
|
|
|
104
105
|
|
|
105
106
|
```bash
|
|
106
107
|
direct campaigns get --ids 1,2,3
|
|
107
|
-
direct changes check-campaigns --timestamp 2026-04-14T00:00:
|
|
108
|
+
direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
|
|
108
109
|
direct keywordsresearch has-search-volume --keywords "buy laptop,buy desktop"
|
|
109
110
|
direct smartadtargets update --id 456 --priority HIGH
|
|
110
111
|
direct dynamicads set-bids --id 789 --bid 12.5
|
|
@@ -119,7 +120,6 @@ direct dynamicads set-bids --id 789 --bid 12.5 --json '{"StrategyPriority":"HIGH
|
|
|
119
120
|
direct dictionaries get-geo-regions \
|
|
120
121
|
--region-ids 225 \
|
|
121
122
|
--fields GeoRegionId,GeoRegionName
|
|
122
|
-
direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
|
|
123
123
|
direct changes check-campaigns --timestamp "2026-04-14 00:00:00"
|
|
124
124
|
```
|
|
125
125
|
|
|
@@ -1,5 +1,90 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.3.13
|
|
4
|
+
|
|
5
|
+
**Breaking changes:**
|
|
6
|
+
|
|
7
|
+
- `direct campaigns add` and `direct campaigns update` now require all
|
|
8
|
+
bidding-strategy money flags to be passed directly in micro-rubles,
|
|
9
|
+
matching the existing `--budget`, `--average-cpa`, `--bid-ceiling`, and
|
|
10
|
+
`--filter-average-cpc` contract. The CLI no longer accepts decimal currency
|
|
11
|
+
values or performs unit conversion for campaign money
|
|
12
|
+
inputs. Closes #399.
|
|
13
|
+
- `direct ads add` and `direct ads update` now apply the same API-native
|
|
14
|
+
micro-ruble contract to `--price-extension-price` and
|
|
15
|
+
`--price-extension-old-price`; price-extension values are no longer parsed
|
|
16
|
+
as decimal currency amounts.
|
|
17
|
+
|
|
18
|
+
## 0.3.12
|
|
19
|
+
|
|
20
|
+
**Added:**
|
|
21
|
+
|
|
22
|
+
- `direct ads update` now exposes `--callouts-add`, `--callouts-remove`,
|
|
23
|
+
and `--callouts-set` for managing the
|
|
24
|
+
`TextAdUpdateBase.CalloutSetting` field
|
|
25
|
+
(`ext:AdExtensionSetting`). Each flag accepts a comma-separated list
|
|
26
|
+
of `CALLOUT`-type ad-extension IDs; `--callouts-set` replaces the
|
|
27
|
+
full callout list and is mutually exclusive with the incremental
|
|
28
|
+
`--callouts-add` / `--callouts-remove` pair (enforced via
|
|
29
|
+
`click.UsageError` before any request is built). Flags are
|
|
30
|
+
TEXT_AD-only — per-subtype validation rejects them on `TEXT_IMAGE_AD`
|
|
31
|
+
/ `MOBILE_APP_AD` with the standard "not compatible with --type"
|
|
32
|
+
message. Empty CSV input is rejected up-front rather than silently
|
|
33
|
+
producing a no-op payload. Closes #238.
|
|
34
|
+
- `direct adgroups add` and `direct adgroups update` now expose
|
|
35
|
+
`--tracking-params` for the top-level `AdGroup*.TrackingParams`
|
|
36
|
+
field. Values are limited to the documented 1024-character maximum;
|
|
37
|
+
`update` does not require `--type` because the field belongs to the
|
|
38
|
+
ad group item itself, not a subtype block. Closes #242.
|
|
39
|
+
- `direct adgroups add` and `direct adgroups update` now expose
|
|
40
|
+
`--negative-keywords` and `--negative-keyword-shared-set-ids` for
|
|
41
|
+
`NegativeKeywords.Items` and `NegativeKeywordSharedSetIds.Items`.
|
|
42
|
+
Empty list input is rejected, shared-set IDs are parsed as integers,
|
|
43
|
+
and `update` treats either flag as a meaningful field for the
|
|
44
|
+
no-op guard. Closes #243.
|
|
45
|
+
- `direct ads update --type TEXT_AD` now exposes
|
|
46
|
+
`--video-extension-creative-id` for `TextAd.VideoExtension.CreativeId`
|
|
47
|
+
and `--price-extension-price`, `--price-extension-old-price`,
|
|
48
|
+
`--price-extension-price-qualifier`, and
|
|
49
|
+
`--price-extension-price-currency` for `TextAd.PriceExtension`.
|
|
50
|
+
These flags are TEXT_AD-only and are rejected on other ad subtypes
|
|
51
|
+
before any request is built. Closes #245.
|
|
52
|
+
- `direct vcards add` now exposes `--instant-messenger-client` and
|
|
53
|
+
`--instant-messenger-login` for `InstantMessenger.MessengerClient`
|
|
54
|
+
and `InstantMessenger.MessengerLogin`, plus the six
|
|
55
|
+
`--point-on-map-*` coordinate flags for `PointOnMap`. Partial
|
|
56
|
+
`InstantMessenger` or `PointOnMap` input is rejected with
|
|
57
|
+
`click.UsageError` so required nested WSDL fields are not omitted.
|
|
58
|
+
Closes #246.
|
|
59
|
+
- `direct feeds add` and `direct feeds update` now expose
|
|
60
|
+
`--remove-utm-tags`, `--feed-login`, and `--feed-password` for
|
|
61
|
+
`UrlFeed.RemoveUtmTags`, `UrlFeed.Login`, and `UrlFeed.Password`.
|
|
62
|
+
`feeds update` also exposes `--clear-feed-login` and
|
|
63
|
+
`--clear-feed-password` for the nillable credential fields, with
|
|
64
|
+
mutual-exclusion checks against the corresponding set flags.
|
|
65
|
+
`FileFeed` upload/base64 support was split to follow-up #264.
|
|
66
|
+
Closes #253.
|
|
67
|
+
- `direct retargeting add` and `direct retargeting update` now expose
|
|
68
|
+
`--description` for the optional retargeting-list `Description`
|
|
69
|
+
field. Description input is validated against the documented maximum
|
|
70
|
+
length before building the request, and update-only description
|
|
71
|
+
changes satisfy the no-op guard. Closes #256.
|
|
72
|
+
- `direct sitelinks add` now supports `TurboPageId` for
|
|
73
|
+
`SitelinkAddItem.TurboPageId` through the canonical `--sitelink`
|
|
74
|
+
pipe spec by accepting an optional fourth segment after
|
|
75
|
+
`Title|Href|Description`. Rows must provide either `Href` or
|
|
76
|
+
`TurboPageId`, so Turbo-only sitelinks are accepted without relaxing
|
|
77
|
+
empty-row validation. Closes #257.
|
|
78
|
+
|
|
79
|
+
**Changed:**
|
|
80
|
+
|
|
81
|
+
- WSDL parity now includes a soft optional-field audit for issue #239.
|
|
82
|
+
`scripts/build_wsdl_optional_field_audit.py --check` regenerates and
|
|
83
|
+
compares `tests/WSDL_OPTIONAL_FIELD_AUDIT.md`, covering cached mutating
|
|
84
|
+
WSDL item fields at unbounded nesting depth. Confirmed `minOccurs=0`
|
|
85
|
+
gaps are tracked as linked `missing_followup` rows instead of being
|
|
86
|
+
invisible to the required-field gate.
|
|
87
|
+
|
|
3
88
|
## 0.3.11
|
|
4
89
|
|
|
5
90
|
**Added:**
|
|
@@ -52,12 +52,13 @@ Click group-of-groups. Each Yandex Direct API resource = one file in `direct_cli
|
|
|
52
52
|
|
|
53
53
|
A guard in `tests/test_api_coverage.py::test_dry_run_exclusions_have_no_helper_or_legacy_rationale` enforces this — any rationale outside those five categories that uses the banned phrasing is a mis-classification: write a `PAYLOAD_CASES` fixture instead. See post-mortem in issue #199.
|
|
54
54
|
|
|
55
|
-
**WSDL parity gate:** `tests/test_wsdl_parity_gate.py` runs four invariant checks across every `add`/`update`/`set` command in `WRITE_SANDBOX
|
|
55
|
+
**WSDL parity gate:** `tests/test_wsdl_parity_gate.py` runs four hard invariant checks across every `add`/`update`/`set` command in `WRITE_SANDBOX`, plus one soft optional-field audit:
|
|
56
56
|
|
|
57
57
|
1. *Empty subtype no-op* — a mutating command with only the resource ID must refuse to send the payload (no silent no-op on the live API).
|
|
58
58
|
2. *Silent data loss* — a typed flag that does not belong to the chosen `--type` must raise `UsageError`, not be dropped.
|
|
59
59
|
3. *WSDL `minOccurs=1` not validated* — every required WSDL item field must be enforced either via Click `required=True` *or* a documented `UsageError` body check (listed in `INTERNAL_VALIDATION`).
|
|
60
60
|
4. *Strategy enum drift* — `STRATEGY_TYPES` (`direct_cli/commands/strategies.py`) must equal the subtype-of-one field names in `StrategyAddItem`.
|
|
61
|
+
5. *Optional-field visibility* — `scripts/build_wsdl_optional_field_audit.py --check` compares cached WSDL item fields (including `minOccurs=0`, at unbounded nesting depth) with `tests/WSDL_OPTIONAL_FIELD_AUDIT.md`. Confirmed misses stay soft-gated as `missing_followup` rows linked to GitHub issues; they do not fail CI as missing CLI flags until implemented.
|
|
61
62
|
|
|
62
63
|
Adding a new mutating command requires extending `COMMAND_WSDL_MAP` in `tests/test_wsdl_parity_gate.py` (the coverage test fails otherwise) and, if the WSDL request has a non-mechanical field name, also `WSDL_FIELD_TO_CLI_OPTION`. Tracked in issue #198.
|
|
63
64
|
|