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.
Files changed (242) hide show
  1. {direct_cli-0.3.10 → direct_cli-0.3.12}/CHANGELOG.md +111 -0
  2. {direct_cli-0.3.10 → direct_cli-0.3.12}/CLAUDE.md +2 -1
  3. {direct_cli-0.3.10 → direct_cli-0.3.12}/PKG-INFO +325 -54
  4. {direct_cli-0.3.10 → direct_cli-0.3.12}/README.md +324 -53
  5. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/tapi_yandex_direct/resource_mapping.py +6 -0
  6. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/tapi_yandex_direct/tapi_yandex_direct.pyi +1 -0
  7. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/auth.py +4 -6
  8. direct_cli-0.3.12/direct_cli/cli.py +343 -0
  9. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/adextensions.py +16 -4
  10. direct_cli-0.3.12/direct_cli/commands/adgroups.py +1235 -0
  11. direct_cli-0.3.12/direct_cli/commands/ads.py +2318 -0
  12. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/audiencetargets.py +7 -3
  13. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/bidmodifiers.py +19 -2
  14. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/bids.py +63 -6
  15. direct_cli-0.3.12/direct_cli/commands/campaigns.py +2678 -0
  16. direct_cli-0.3.12/direct_cli/commands/clients.py +284 -0
  17. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/dynamicads.py +1 -2
  18. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/dynamicfeedadtargets.py +1 -1
  19. direct_cli-0.3.12/direct_cli/commands/feeds.py +400 -0
  20. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/keywordbids.py +59 -9
  21. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/keywords.py +414 -5
  22. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/retargeting.py +40 -3
  23. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/sitelinks.py +27 -7
  24. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/strategies.py +220 -7
  25. direct_cli-0.3.12/direct_cli/commands/v4account.py +734 -0
  26. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/v4events.py +2 -0
  27. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/v4finance.py +10 -5
  28. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/v4forecast.py +2 -0
  29. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/v4goals.py +2 -0
  30. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/v4tags.py +2 -0
  31. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/v4wordstat.py +2 -0
  32. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/vcards.py +87 -0
  33. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/utils.py +247 -17
  34. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/v4/money.py +11 -6
  35. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/v4_contracts.py +25 -17
  36. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/wsdl_coverage.py +82 -1
  37. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli.egg-info/PKG-INFO +325 -54
  38. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli.egg-info/SOURCES.txt +5 -0
  39. {direct_cli-0.3.10 → direct_cli-0.3.12}/pyproject.toml +1 -1
  40. {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/anonymize_cassettes.py +7 -15
  41. {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/build_api_coverage_report.py +1 -3
  42. direct_cli-0.3.12/scripts/build_wsdl_optional_field_audit.py +312 -0
  43. {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/check_reports_drift.py +7 -5
  44. {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/check_wsdl_drift.py +1 -5
  45. {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/patch_vendor_imports.py +1 -2
  46. {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/refresh_wsdl_cache.py +3 -1
  47. {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/sandbox_write_live.py +1 -1
  48. {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/test_safe_commands.sh +1 -1
  49. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/API_COVERAGE.md +33 -0
  50. direct_cli-0.3.12/tests/WSDL_OPTIONAL_FIELD_AUDIT.md +5239 -0
  51. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/api_coverage_payloads.py +30 -11
  52. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/conftest.py +129 -61
  53. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_api_coverage.py +18 -16
  54. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_auth_bw.py +3 -1
  55. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_auth_oauth.py +111 -0
  56. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_auth_op.py +3 -1
  57. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_balance.py +7 -3
  58. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_cli.py +378 -2
  59. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_cli_contract.py +6 -0
  60. direct_cli-0.3.12/tests/test_dry_run.py +11240 -0
  61. direct_cli-0.3.12/tests/test_env_loading.py +136 -0
  62. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_integration.py +2 -2
  63. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_integration_write.py +9 -7
  64. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_low_coverage_payloads.py +8 -5
  65. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_transport_contract.py +3 -3
  66. direct_cli-0.3.12/tests/test_unknown_option_hints.py +173 -0
  67. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4_contracts.py +62 -10
  68. direct_cli-0.3.12/tests/test_v4_exit_codes.py +131 -0
  69. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4_live_contracts.py +7 -7
  70. direct_cli-0.3.12/tests/test_v4account.py +1021 -0
  71. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4finance_read.py +11 -22
  72. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v5_live_write.py +13 -14
  73. direct_cli-0.3.12/tests/test_wsdl_parity_gate.py +3168 -0
  74. direct_cli-0.3.10/direct_cli/cli.py +0 -213
  75. direct_cli-0.3.10/direct_cli/commands/adgroups.py +0 -314
  76. direct_cli-0.3.10/direct_cli/commands/ads.py +0 -798
  77. direct_cli-0.3.10/direct_cli/commands/campaigns.py +0 -1061
  78. direct_cli-0.3.10/direct_cli/commands/clients.py +0 -143
  79. direct_cli-0.3.10/direct_cli/commands/feeds.py +0 -178
  80. direct_cli-0.3.10/direct_cli/commands/v4account.py +0 -281
  81. direct_cli-0.3.10/tests/test_dry_run.py +0 -4424
  82. direct_cli-0.3.10/tests/test_v4account.py +0 -410
  83. direct_cli-0.3.10/tests/test_wsdl_parity_gate.py +0 -735
  84. {direct_cli-0.3.10 → direct_cli-0.3.12}/.env.example +0 -0
  85. {direct_cli-0.3.10 → direct_cli-0.3.12}/.github/copilot-instructions.md +0 -0
  86. {direct_cli-0.3.10 → direct_cli-0.3.12}/.github/workflows/api-coverage.yml +0 -0
  87. {direct_cli-0.3.10 → direct_cli-0.3.12}/.github/workflows/claude.yml +0 -0
  88. {direct_cli-0.3.10 → direct_cli-0.3.12}/.github/workflows/quality.yml +0 -0
  89. {direct_cli-0.3.10 → direct_cli-0.3.12}/.gitignore +0 -0
  90. {direct_cli-0.3.10 → direct_cli-0.3.12}/AGENTS.md +0 -0
  91. {direct_cli-0.3.10 → direct_cli-0.3.12}/MANIFEST.in +0 -0
  92. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/__init__.py +0 -0
  93. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_deprecated.py +0 -0
  94. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_smoke_probes.py +0 -0
  95. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/__init__.py +0 -0
  96. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/tapi_yandex_direct/__init__.py +0 -0
  97. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/tapi_yandex_direct/endpoints.py +0 -0
  98. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/tapi_yandex_direct/exceptions.py +0 -0
  99. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/tapi_yandex_direct/tapi_yandex_direct.py +0 -0
  100. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/tapi_yandex_direct/v4/__init__.py +0 -0
  101. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/tapi_yandex_direct/v4/adapter.py +0 -0
  102. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/tapi_yandex_direct/v4/adapter.pyi +0 -0
  103. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/_vendor/tapi_yandex_direct/v4/resource_mapping.py +0 -0
  104. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/api.py +0 -0
  105. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/__init__.py +0 -0
  106. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/adimages.py +0 -0
  107. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/advideos.py +0 -0
  108. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/agencyclients.py +0 -0
  109. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/auth.py +0 -0
  110. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/balance.py +0 -0
  111. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/businesses.py +0 -0
  112. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/changes.py +0 -0
  113. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/creatives.py +0 -0
  114. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/dictionaries.py +0 -0
  115. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/keywordsresearch.py +0 -0
  116. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/leads.py +0 -0
  117. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/negativekeywordsharedsets.py +0 -0
  118. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/reports.py +0 -0
  119. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/smartadtargets.py +0 -0
  120. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/turbopages.py +0 -0
  121. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/commands/v4shells.py +0 -0
  122. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/output.py +0 -0
  123. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/reports_coverage.py +0 -0
  124. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/smoke_matrix.py +0 -0
  125. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli/v4/__init__.py +0 -0
  126. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli.egg-info/dependency_links.txt +0 -0
  127. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli.egg-info/entry_points.txt +0 -0
  128. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli.egg-info/requires.txt +0 -0
  129. {direct_cli-0.3.10 → direct_cli-0.3.12}/direct_cli.egg-info/top_level.txt +0 -0
  130. {direct_cli-0.3.10 → direct_cli-0.3.12}/docs/audits/issue-198-mutating-wsdl-audit.md +0 -0
  131. {direct_cli-0.3.10 → direct_cli-0.3.12}/docs/superpowers/plans/2026-04-12-issue-32-completion.md +0 -0
  132. {direct_cli-0.3.10 → direct_cli-0.3.12}/docs/superpowers/specs/2026-04-23-vendor-tapi-yandex-direct-design.md +0 -0
  133. {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/build_api_coverage_checklist.py +0 -0
  134. {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/refresh_reports_cache.py +0 -0
  135. {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/release_pypi.sh +0 -0
  136. {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/sandbox_write_audit.py +0 -0
  137. {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/test_dangerous_commands.sh +0 -0
  138. {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/test_sandbox_write.sh +0 -0
  139. {direct_cli-0.3.10 → direct_cli-0.3.12}/scripts/update_vendor.sh +0 -0
  140. {direct_cli-0.3.10 → direct_cli-0.3.12}/setup.cfg +0 -0
  141. {direct_cli-0.3.10 → direct_cli-0.3.12}/setup.py +0 -0
  142. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/API_ISSUE_AUDIT.md +0 -0
  143. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/MANUAL_COVERAGE.md +0 -0
  144. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/__init__.py +0 -0
  145. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/_orphan_store.py +0 -0
  146. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteAdExtensions.test_add_delete.yaml +0 -0
  147. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteAdGroups.test_add_update_delete.yaml +0 -0
  148. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteAdImages.test_add_delete.yaml +0 -0
  149. {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
  150. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteAudienceTargets.test_add_delete.yaml +0 -0
  151. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteBidModifiersAdd.test_add_delete_mobile.yaml +0 -0
  152. {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
  153. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteBids.test_set_bid.yaml +0 -0
  154. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteBidsRead.test_bids_get.yaml +0 -0
  155. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteBidsRead.test_bids_set_auto.yaml +0 -0
  156. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteCampaignDraftLifecycle.test_draft_create_get_delete.yaml +0 -0
  157. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteCampaigns.test_campaign_lifecycle.yaml +0 -0
  158. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteDynamicAds.test_add_update_delete.yaml +0 -0
  159. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteFeeds.test_add_update_delete.yaml +0 -0
  160. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteKeywordBids.test_set_keyword_bid.yaml +0 -0
  161. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteKeywords.test_add_update_delete.yaml +0 -0
  162. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteNegativeKeywordSharedSets.test_add_update_delete.yaml +0 -0
  163. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteRetargeting.test_add_delete.yaml +0 -0
  164. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteRetargetingUpdate.test_retargeting_update.yaml +0 -0
  165. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteSitelinks.test_add_delete.yaml +0 -0
  166. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteSmartAdTargets.test_add_update_delete.yaml +0 -0
  167. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteStrategies.test_strategies_lifecycle.yaml +0 -0
  168. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/cassettes/test_integration_write/TestWriteVCards.test_add_delete.yaml +0 -0
  169. {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
  170. {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
  171. {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
  172. {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
  173. {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
  174. {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
  175. {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
  176. {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
  177. {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
  178. {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
  179. {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
  180. {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
  181. {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
  182. {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
  183. {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
  184. {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
  185. {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
  186. {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
  187. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/fixtures/test-video.mp4 +0 -0
  188. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/reports_cache/raw/fields-list.html +0 -0
  189. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/reports_cache/raw/headers.html +0 -0
  190. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/reports_cache/raw/period.html +0 -0
  191. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/reports_cache/raw/spec.html +0 -0
  192. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/reports_cache/raw/type.html +0 -0
  193. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/reports_cache/spec.json +0 -0
  194. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_auth_write_json.py +0 -0
  195. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_changes.py +0 -0
  196. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_comprehensive.py +0 -0
  197. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_reports_drift.py +0 -0
  198. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_reports_parsing.py +0 -0
  199. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_sandbox_write_audit.py +0 -0
  200. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_smoke_matrix.py +0 -0
  201. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4_foundation.py +0 -0
  202. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4_runtime_shape.py +0 -0
  203. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4_safety.py +0 -0
  204. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4events.py +0 -0
  205. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4finance_money.py +0 -0
  206. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4forecast.py +0 -0
  207. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4goals.py +0 -0
  208. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4tags.py +0 -0
  209. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_v4wordstat.py +0 -0
  210. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/test_vendor_imports.py +0 -0
  211. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/adextensions.xml +0 -0
  212. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/adgroups.xml +0 -0
  213. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/adimages.xml +0 -0
  214. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/ads.xml +0 -0
  215. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/advideos.xml +0 -0
  216. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/agencyclients.xml +0 -0
  217. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/audiencetargets.xml +0 -0
  218. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/bidmodifiers.xml +0 -0
  219. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/bids.xml +0 -0
  220. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/businesses.xml +0 -0
  221. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/campaigns.xml +0 -0
  222. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/changes.xml +0 -0
  223. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/clients.xml +0 -0
  224. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/creatives.xml +0 -0
  225. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/dictionaries.xml +0 -0
  226. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/dynamicfeedadtargets.xml +0 -0
  227. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/dynamictextadtargets.xml +0 -0
  228. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/feeds.xml +0 -0
  229. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/imports/adextensiontypes.xsd +0 -0
  230. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/imports/general.xsd +0 -0
  231. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/imports/generalclients.xsd +0 -0
  232. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/keywordbids.xml +0 -0
  233. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/keywords.xml +0 -0
  234. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/keywordsresearch.xml +0 -0
  235. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/leads.xml +0 -0
  236. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/negativekeywordsharedsets.xml +0 -0
  237. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/retargetinglists.xml +0 -0
  238. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/sitelinks.xml +0 -0
  239. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/smartadtargets.xml +0 -0
  240. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/strategies.xml +0 -0
  241. {direct_cli-0.3.10 → direct_cli-0.3.12}/tests/wsdl_cache/turbopages.xml +0 -0
  242. {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