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