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