direct-cli 0.3.10__tar.gz → 0.3.12__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.10 → direct_cli-0.3.12}/CHANGELOG.md +111 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/CLAUDE.md +2 -1
- {direct_cli-0.3.10 → direct_cli-0.3.12}/PKG-INFO +325 -54
- {direct_cli-0.3.10 → direct_cli-0.3.12}/README.md +324 -53
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/tapi_yandex_direct/resource_mapping.py +6 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/tapi_yandex_direct/tapi_yandex_direct.pyi +1 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/auth.py +4 -6
- direct_cli-0.3.12/direct_cli/cli.py +343 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/adextensions.py +16 -4
- direct_cli-0.3.12/direct_cli/commands/adgroups.py +1235 -0
- direct_cli-0.3.12/direct_cli/commands/ads.py +2318 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/audiencetargets.py +7 -3
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/bidmodifiers.py +19 -2
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/bids.py +63 -6
- direct_cli-0.3.12/direct_cli/commands/campaigns.py +2678 -0
- direct_cli-0.3.12/direct_cli/commands/clients.py +284 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/dynamicads.py +1 -2
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/dynamicfeedadtargets.py +1 -1
- direct_cli-0.3.12/direct_cli/commands/feeds.py +400 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/keywordbids.py +59 -9
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/keywords.py +414 -5
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/retargeting.py +40 -3
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/sitelinks.py +27 -7
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/strategies.py +220 -7
- direct_cli-0.3.12/direct_cli/commands/v4account.py +734 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/v4events.py +2 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/v4finance.py +10 -5
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/v4forecast.py +2 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/v4goals.py +2 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/v4tags.py +2 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/v4wordstat.py +2 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/vcards.py +87 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/utils.py +247 -17
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/v4/money.py +11 -6
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/v4_contracts.py +25 -17
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/wsdl_coverage.py +82 -1
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli.egg-info/PKG-INFO +325 -54
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli.egg-info/SOURCES.txt +5 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/pyproject.toml +1 -1
- {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/anonymize_cassettes.py +7 -15
- {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/build_api_coverage_report.py +1 -3
- direct_cli-0.3.12/scripts/build_wsdl_optional_field_audit.py +312 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/check_reports_drift.py +7 -5
- {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/check_wsdl_drift.py +1 -5
- {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/patch_vendor_imports.py +1 -2
- {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/refresh_wsdl_cache.py +3 -1
- {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/sandbox_write_live.py +1 -1
- {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/test_safe_commands.sh +1 -1
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/API_COVERAGE.md +33 -0
- direct_cli-0.3.12/tests/WSDL_OPTIONAL_FIELD_AUDIT.md +5239 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/api_coverage_payloads.py +30 -11
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/conftest.py +129 -61
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_api_coverage.py +18 -16
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_auth_bw.py +3 -1
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_auth_oauth.py +111 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_auth_op.py +3 -1
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_balance.py +7 -3
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_cli.py +378 -2
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_cli_contract.py +6 -0
- direct_cli-0.3.12/tests/test_dry_run.py +11240 -0
- direct_cli-0.3.12/tests/test_env_loading.py +136 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_integration.py +2 -2
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_integration_write.py +9 -7
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_low_coverage_payloads.py +8 -5
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_transport_contract.py +3 -3
- direct_cli-0.3.12/tests/test_unknown_option_hints.py +173 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4_contracts.py +62 -10
- direct_cli-0.3.12/tests/test_v4_exit_codes.py +131 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4_live_contracts.py +7 -7
- direct_cli-0.3.12/tests/test_v4account.py +1021 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4finance_read.py +11 -22
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v5_live_write.py +13 -14
- direct_cli-0.3.12/tests/test_wsdl_parity_gate.py +3168 -0
- direct_cli-0.3.10/direct_cli/cli.py +0 -213
- direct_cli-0.3.10/direct_cli/commands/adgroups.py +0 -314
- direct_cli-0.3.10/direct_cli/commands/ads.py +0 -798
- direct_cli-0.3.10/direct_cli/commands/campaigns.py +0 -1061
- direct_cli-0.3.10/direct_cli/commands/clients.py +0 -143
- direct_cli-0.3.10/direct_cli/commands/feeds.py +0 -178
- direct_cli-0.3.10/direct_cli/commands/v4account.py +0 -281
- direct_cli-0.3.10/tests/test_dry_run.py +0 -4424
- direct_cli-0.3.10/tests/test_v4account.py +0 -410
- direct_cli-0.3.10/tests/test_wsdl_parity_gate.py +0 -735
- {direct_cli-0.3.10 → direct_cli-0.3.12}/.env.example +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/.github/copilot-instructions.md +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/.github/workflows/api-coverage.yml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/.github/workflows/claude.yml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/.github/workflows/quality.yml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/.gitignore +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/AGENTS.md +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/MANIFEST.in +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/__init__.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_deprecated.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_smoke_probes.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/__init__.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/tapi_yandex_direct/__init__.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/tapi_yandex_direct/endpoints.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/tapi_yandex_direct/exceptions.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/tapi_yandex_direct/tapi_yandex_direct.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/tapi_yandex_direct/v4/__init__.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/tapi_yandex_direct/v4/adapter.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/tapi_yandex_direct/v4/adapter.pyi +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/tapi_yandex_direct/v4/resource_mapping.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/api.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/__init__.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/adimages.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/advideos.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/agencyclients.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/auth.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/balance.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/businesses.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/changes.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/creatives.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/dictionaries.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/keywordsresearch.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/leads.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/negativekeywordsharedsets.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/reports.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/smartadtargets.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/turbopages.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/v4shells.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/output.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/reports_coverage.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/smoke_matrix.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/v4/__init__.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli.egg-info/dependency_links.txt +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli.egg-info/entry_points.txt +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli.egg-info/requires.txt +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli.egg-info/top_level.txt +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/docs/audits/issue-198-mutating-wsdl-audit.md +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/docs/superpowers/plans/2026-04-12-issue-32-completion.md +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/docs/superpowers/specs/2026-04-23-vendor-tapi-yandex-direct-design.md +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/build_api_coverage_checklist.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/refresh_reports_cache.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/release_pypi.sh +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/sandbox_write_audit.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/test_dangerous_commands.sh +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/test_sandbox_write.sh +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/update_vendor.sh +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/setup.cfg +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/setup.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/API_ISSUE_AUDIT.md +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/MANUAL_COVERAGE.md +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/__init__.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/_orphan_store.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteAdExtensions.test_add_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteAdGroups.test_add_update_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteAdImages.test_add_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteAds.test_add_text_ad_update_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteAudienceTargets.test_add_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteBidModifiersAdd.test_add_delete_mobile.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteBidModifiersSet.test_set_without_id_is_rejected.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteBids.test_set_bid.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteBidsRead.test_bids_get.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteBidsRead.test_bids_set_auto.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteCampaignDraftLifecycle.test_draft_create_get_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteCampaigns.test_campaign_lifecycle.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteDynamicAds.test_add_update_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteFeeds.test_add_update_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteKeywordBids.test_set_keyword_bid.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteKeywords.test_add_update_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteNegativeKeywordSharedSets.test_add_update_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteRetargeting.test_add_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteRetargetingUpdate.test_retargeting_update.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteSitelinks.test_add_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteSmartAdTargets.test_add_update_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteStrategies.test_strategies_lifecycle.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteVCards.test_add_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_v5_live_write/test_v5_live_draft_adgroups_add_update_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_v5_live_write/test_v5_live_draft_adimages_add_get_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_v5_live_write/test_v5_live_draft_ads_add_update_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_v5_live_write/test_v5_live_draft_ads_suspend_resume_archive_unarchive.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_v5_live_write/test_v5_live_draft_advideos_add_get.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_v5_live_write/test_v5_live_draft_audiencetargets_add_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_v5_live_write/test_v5_live_draft_audiencetargets_suspend_resume.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_v5_live_write/test_v5_live_draft_bids_set.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_v5_live_write/test_v5_live_draft_campaign_create_get_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_v5_live_write/test_v5_live_draft_creatives_chain_advideo_to_creative.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_v5_live_write/test_v5_live_draft_dynamicads_add_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_v5_live_write/test_v5_live_draft_dynamicads_suspend_resume.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_v5_live_write/test_v5_live_draft_keywordbids_set.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_v5_live_write/test_v5_live_draft_keywords_add_update_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_v5_live_write/test_v5_live_draft_keywords_suspend_resume.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_v5_live_write/test_v5_live_draft_sitelinks_add_get_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_v5_live_write/test_v5_live_draft_smartadtargets_add_update_delete.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_v5_live_write/test_v5_live_draft_smartadtargets_suspend_resume.yaml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/fixtures/test-video.mp4 +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/reports_cache/raw/fields-list.html +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/reports_cache/raw/headers.html +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/reports_cache/raw/period.html +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/reports_cache/raw/spec.html +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/reports_cache/raw/type.html +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/reports_cache/spec.json +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_auth_write_json.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_changes.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_comprehensive.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_reports_drift.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_reports_parsing.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_sandbox_write_audit.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_smoke_matrix.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4_foundation.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4_runtime_shape.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4_safety.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4events.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4finance_money.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4forecast.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4goals.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4tags.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4wordstat.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_vendor_imports.py +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/adextensions.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/adgroups.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/adimages.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/ads.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/advideos.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/agencyclients.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/audiencetargets.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/bidmodifiers.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/bids.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/businesses.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/campaigns.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/changes.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/clients.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/creatives.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/dictionaries.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/dynamicfeedadtargets.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/dynamictextadtargets.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/feeds.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/imports/adextensiontypes.xsd +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/imports/general.xsd +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/imports/generalclients.xsd +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/keywordbids.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/keywords.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/keywordsresearch.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/leads.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/negativekeywordsharedsets.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/retargetinglists.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/sitelinks.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/smartadtargets.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/strategies.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/turbopages.xml +0 -0
- {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/vcards.xml +0 -0
|
@@ -1,5 +1,116 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.3.12
|
|
4
|
+
|
|
5
|
+
**Added:**
|
|
6
|
+
|
|
7
|
+
- `direct ads update` now exposes `--callouts-add`, `--callouts-remove`,
|
|
8
|
+
and `--callouts-set` for managing the
|
|
9
|
+
`TextAdUpdateBase.CalloutSetting` field
|
|
10
|
+
(`ext:AdExtensionSetting`). Each flag accepts a comma-separated list
|
|
11
|
+
of `CALLOUT`-type ad-extension IDs; `--callouts-set` replaces the
|
|
12
|
+
full callout list and is mutually exclusive with the incremental
|
|
13
|
+
`--callouts-add` / `--callouts-remove` pair (enforced via
|
|
14
|
+
`click.UsageError` before any request is built). Flags are
|
|
15
|
+
TEXT_AD-only — per-subtype validation rejects them on `TEXT_IMAGE_AD`
|
|
16
|
+
/ `MOBILE_APP_AD` with the standard "not compatible with --type"
|
|
17
|
+
message. Empty CSV input is rejected up-front rather than silently
|
|
18
|
+
producing a no-op payload. Closes #238.
|
|
19
|
+
- `direct adgroups add` and `direct adgroups update` now expose
|
|
20
|
+
`--tracking-params` for the top-level `AdGroup*.TrackingParams`
|
|
21
|
+
field. Values are limited to the documented 1024-character maximum;
|
|
22
|
+
`update` does not require `--type` because the field belongs to the
|
|
23
|
+
ad group item itself, not a subtype block. Closes #242.
|
|
24
|
+
- `direct adgroups add` and `direct adgroups update` now expose
|
|
25
|
+
`--negative-keywords` and `--negative-keyword-shared-set-ids` for
|
|
26
|
+
`NegativeKeywords.Items` and `NegativeKeywordSharedSetIds.Items`.
|
|
27
|
+
Empty list input is rejected, shared-set IDs are parsed as integers,
|
|
28
|
+
and `update` treats either flag as a meaningful field for the
|
|
29
|
+
no-op guard. Closes #243.
|
|
30
|
+
- `direct ads update --type TEXT_AD` now exposes
|
|
31
|
+
`--video-extension-creative-id` for `TextAd.VideoExtension.CreativeId`
|
|
32
|
+
and `--price-extension-price`, `--price-extension-old-price`,
|
|
33
|
+
`--price-extension-price-qualifier`, and
|
|
34
|
+
`--price-extension-price-currency` for `TextAd.PriceExtension`.
|
|
35
|
+
These flags are TEXT_AD-only and are rejected on other ad subtypes
|
|
36
|
+
before any request is built. Closes #245.
|
|
37
|
+
- `direct vcards add` now exposes `--instant-messenger-client` and
|
|
38
|
+
`--instant-messenger-login` for `InstantMessenger.MessengerClient`
|
|
39
|
+
and `InstantMessenger.MessengerLogin`, plus the six
|
|
40
|
+
`--point-on-map-*` coordinate flags for `PointOnMap`. Partial
|
|
41
|
+
`InstantMessenger` or `PointOnMap` input is rejected with
|
|
42
|
+
`click.UsageError` so required nested WSDL fields are not omitted.
|
|
43
|
+
Closes #246.
|
|
44
|
+
- `direct feeds add` and `direct feeds update` now expose
|
|
45
|
+
`--remove-utm-tags`, `--feed-login`, and `--feed-password` for
|
|
46
|
+
`UrlFeed.RemoveUtmTags`, `UrlFeed.Login`, and `UrlFeed.Password`.
|
|
47
|
+
`feeds update` also exposes `--clear-feed-login` and
|
|
48
|
+
`--clear-feed-password` for the nillable credential fields, with
|
|
49
|
+
mutual-exclusion checks against the corresponding set flags.
|
|
50
|
+
`FileFeed` upload/base64 support was split to follow-up #264.
|
|
51
|
+
Closes #253.
|
|
52
|
+
- `direct retargeting add` and `direct retargeting update` now expose
|
|
53
|
+
`--description` for the optional retargeting-list `Description`
|
|
54
|
+
field. Description input is validated against the documented maximum
|
|
55
|
+
length before building the request, and update-only description
|
|
56
|
+
changes satisfy the no-op guard. Closes #256.
|
|
57
|
+
- `direct sitelinks add` now supports `TurboPageId` for
|
|
58
|
+
`SitelinkAddItem.TurboPageId` through the canonical `--sitelink`
|
|
59
|
+
pipe spec by accepting an optional fourth segment after
|
|
60
|
+
`Title|Href|Description`. Rows must provide either `Href` or
|
|
61
|
+
`TurboPageId`, so Turbo-only sitelinks are accepted without relaxing
|
|
62
|
+
empty-row validation. Closes #257.
|
|
63
|
+
|
|
64
|
+
**Changed:**
|
|
65
|
+
|
|
66
|
+
- WSDL parity now includes a soft optional-field audit for issue #239.
|
|
67
|
+
`scripts/build_wsdl_optional_field_audit.py --check` regenerates and
|
|
68
|
+
compares `tests/WSDL_OPTIONAL_FIELD_AUDIT.md`, covering cached mutating
|
|
69
|
+
WSDL item fields at unbounded nesting depth. Confirmed `minOccurs=0`
|
|
70
|
+
gaps are tracked as linked `missing_followup` rows instead of being
|
|
71
|
+
invisible to the required-field gate.
|
|
72
|
+
|
|
73
|
+
## 0.3.11
|
|
74
|
+
|
|
75
|
+
**Added:**
|
|
76
|
+
|
|
77
|
+
- `direct campaigns add` and `direct campaigns update` now expose
|
|
78
|
+
`--tracking-params` for the campaign-level tracking query string
|
|
79
|
+
(`TextCampaign` / `DynamicTextCampaign` / `SmartCampaign` `.TrackingParams`).
|
|
80
|
+
`campaigns update` gained an optional `--type` discriminator —
|
|
81
|
+
required when `--tracking-params` is set, validated against
|
|
82
|
+
the three subtypes supported by the CLI. Backward compatible:
|
|
83
|
+
existing `campaigns update --id N --name X` calls without `--type`
|
|
84
|
+
keep working unchanged. Closes #230.
|
|
85
|
+
- `direct v4account account-management` now supports `--action Get`,
|
|
86
|
+
`Deposit`, `Invoice`, and `TransferMoney` in addition to `Update`,
|
|
87
|
+
matching the official v4 Live docs
|
|
88
|
+
(<https://yandex.ru/dev/direct/doc/dg-v4/reference/AccountManagement-docpage/>).
|
|
89
|
+
`Get` is read-only and accepts optional `--logins` / `--account-ids`
|
|
90
|
+
filters. `Deposit`, `Invoice`, and `TransferMoney` are financial
|
|
91
|
+
mutations: they need `--finance-token` (or `--master-token` +
|
|
92
|
+
`--operation-num` + `--finance-login`) and respect the existing
|
|
93
|
+
dry-run-unless-sandbox rule. A Click-side allow-list rejects flags
|
|
94
|
+
that do not belong to the chosen action before any body is built.
|
|
95
|
+
Refs #125.
|
|
96
|
+
|
|
97
|
+
**Fixed:**
|
|
98
|
+
|
|
99
|
+
- `direct v4 *` command wrappers now let `click.ClickException`
|
|
100
|
+
(including `UsageError` from `call_v4` shape validation) propagate to
|
|
101
|
+
Click instead of swallowing it in the generic `except Exception`.
|
|
102
|
+
Shape-validation errors keep their usage hint and exit with code 2,
|
|
103
|
+
matching Click's contract; non-Click runtime errors still surface
|
|
104
|
+
through `print_error` + `Abort` (exit 1). Closes #227.
|
|
105
|
+
|
|
106
|
+
**Breaking changes:**
|
|
107
|
+
|
|
108
|
+
- `direct v4finance get-credit-limits` no longer accepts `--logins`; the
|
|
109
|
+
request body now omits `param` per the official v4 Live docs
|
|
110
|
+
(<https://yandex.ru/dev/direct/doc/dg-v4/reference/GetCreditLimits.html>),
|
|
111
|
+
which define the body as `method`, `finance_token`, and `operation_num`
|
|
112
|
+
only. Refs #125.
|
|
113
|
+
|
|
3
114
|
## 0.3.10
|
|
4
115
|
|
|
5
116
|
**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
|
|