direct-cli 0.2.6__tar.gz → 0.2.8__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 (132) hide show
  1. {direct_cli-0.2.6 → direct_cli-0.2.8}/.github/workflows/api-coverage.yml +0 -1
  2. {direct_cli-0.2.6 → direct_cli-0.2.8}/AGENTS.md +117 -0
  3. direct_cli-0.2.8/PKG-INFO +941 -0
  4. direct_cli-0.2.8/README.md +904 -0
  5. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/__init__.py +4 -3
  6. direct_cli-0.2.8/direct_cli/_deprecated.py +11 -0
  7. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/cli.py +2 -5
  8. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/adextensions.py +6 -30
  9. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/adgroups.py +46 -38
  10. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/adimages.py +21 -8
  11. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/ads.py +53 -42
  12. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/advideos.py +0 -3
  13. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/agencyclients.py +123 -22
  14. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/audiencetargets.py +41 -20
  15. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/bidmodifiers.py +58 -90
  16. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/bids.py +5 -20
  17. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/campaigns.py +108 -37
  18. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/changes.py +9 -9
  19. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/clients.py +18 -10
  20. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/creatives.py +8 -8
  21. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/dictionaries.py +16 -8
  22. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/dynamicads.py +42 -20
  23. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/feeds.py +3 -56
  24. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/keywordbids.py +59 -13
  25. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/keywords.py +6 -21
  26. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/keywordsresearch.py +0 -3
  27. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/leads.py +0 -3
  28. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/negativekeywordsharedsets.py +2 -12
  29. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/retargeting.py +38 -17
  30. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/sitelinks.py +14 -8
  31. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/smartadtargets.py +98 -45
  32. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/turbopages.py +0 -3
  33. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/vcards.py +74 -7
  34. direct_cli-0.2.8/direct_cli/utils.py +266 -0
  35. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/wsdl_coverage.py +1 -17
  36. direct_cli-0.2.8/direct_cli.egg-info/PKG-INFO +941 -0
  37. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli.egg-info/SOURCES.txt +1 -0
  38. direct_cli-0.2.8/direct_cli.egg-info/entry_points.txt +3 -0
  39. {direct_cli-0.2.6 → direct_cli-0.2.8}/pyproject.toml +2 -2
  40. {direct_cli-0.2.6 → direct_cli-0.2.8}/scripts/build_api_coverage_report.py +0 -1
  41. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/conftest.py +9 -33
  42. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/test_api_coverage.py +88 -45
  43. direct_cli-0.2.8/tests/test_cli.py +192 -0
  44. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/test_comprehensive.py +0 -3
  45. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/test_dry_run.py +547 -295
  46. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/test_integration_write.py +33 -131
  47. direct_cli-0.2.6/PKG-INFO +0 -582
  48. direct_cli-0.2.6/README.md +0 -545
  49. direct_cli-0.2.6/direct_cli/utils.py +0 -121
  50. direct_cli-0.2.6/direct_cli.egg-info/PKG-INFO +0 -582
  51. direct_cli-0.2.6/direct_cli.egg-info/entry_points.txt +0 -3
  52. direct_cli-0.2.6/tests/test_cli.py +0 -116
  53. {direct_cli-0.2.6 → direct_cli-0.2.8}/.env.example +0 -0
  54. {direct_cli-0.2.6 → direct_cli-0.2.8}/.github/copilot-instructions.md +0 -0
  55. {direct_cli-0.2.6 → direct_cli-0.2.8}/.github/workflows/claude-code-review.yml +0 -0
  56. {direct_cli-0.2.6 → direct_cli-0.2.8}/.github/workflows/claude.yml +0 -0
  57. {direct_cli-0.2.6 → direct_cli-0.2.8}/.gitignore +0 -0
  58. {direct_cli-0.2.6 → direct_cli-0.2.8}/CLAUDE.md +0 -0
  59. {direct_cli-0.2.6 → direct_cli-0.2.8}/MANIFEST.in +0 -0
  60. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/api.py +0 -0
  61. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/auth.py +0 -0
  62. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/__init__.py +0 -0
  63. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/businesses.py +0 -0
  64. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/commands/reports.py +0 -0
  65. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/output.py +0 -0
  66. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli/reports_coverage.py +0 -0
  67. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli.egg-info/dependency_links.txt +0 -0
  68. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli.egg-info/requires.txt +0 -0
  69. {direct_cli-0.2.6 → direct_cli-0.2.8}/direct_cli.egg-info/top_level.txt +0 -0
  70. {direct_cli-0.2.6 → direct_cli-0.2.8}/docs/superpowers/plans/2026-04-12-issue-32-completion.md +0 -0
  71. {direct_cli-0.2.6 → direct_cli-0.2.8}/scripts/check_reports_drift.py +0 -0
  72. {direct_cli-0.2.6 → direct_cli-0.2.8}/scripts/check_wsdl_drift.py +0 -0
  73. {direct_cli-0.2.6 → direct_cli-0.2.8}/scripts/refresh_reports_cache.py +0 -0
  74. {direct_cli-0.2.6 → direct_cli-0.2.8}/scripts/refresh_wsdl_cache.py +0 -0
  75. {direct_cli-0.2.6 → direct_cli-0.2.8}/scripts/release_pypi.sh +0 -0
  76. {direct_cli-0.2.6 → direct_cli-0.2.8}/setup.cfg +0 -0
  77. {direct_cli-0.2.6 → direct_cli-0.2.8}/setup.py +0 -0
  78. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/__init__.py +0 -0
  79. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/cassettes/test_integration_write/TestWriteAdExtensions.test_add_delete.yaml +0 -0
  80. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/cassettes/test_integration_write/TestWriteAdGroups.test_add_update_delete.yaml +0 -0
  81. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/cassettes/test_integration_write/TestWriteAdImages.test_add_delete.yaml +0 -0
  82. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/cassettes/test_integration_write/TestWriteAds.test_add_text_ad_update_delete.yaml +0 -0
  83. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/cassettes/test_integration_write/TestWriteAudienceTargets.test_add_delete.yaml +0 -0
  84. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/cassettes/test_integration_write/TestWriteBidModifiersAdd.test_add_delete_mobile.yaml +0 -0
  85. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/cassettes/test_integration_write/TestWriteBidModifiersSet.test_set_without_id_is_rejected.yaml +0 -0
  86. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/cassettes/test_integration_write/TestWriteBids.test_set_bid.yaml +0 -0
  87. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/cassettes/test_integration_write/TestWriteCampaigns.test_campaign_lifecycle.yaml +0 -0
  88. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/cassettes/test_integration_write/TestWriteDynamicAds.test_add_update_delete.yaml +0 -0
  89. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/cassettes/test_integration_write/TestWriteFeeds.test_add_update_delete.yaml +0 -0
  90. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/cassettes/test_integration_write/TestWriteKeywordBids.test_set_keyword_bid.yaml +0 -0
  91. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/cassettes/test_integration_write/TestWriteKeywords.test_add_update_delete.yaml +0 -0
  92. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/cassettes/test_integration_write/TestWriteNegativeKeywordSharedSets.test_add_update_delete.yaml +0 -0
  93. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/cassettes/test_integration_write/TestWriteRetargeting.test_add_delete.yaml +0 -0
  94. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/cassettes/test_integration_write/TestWriteSitelinks.test_add_delete.yaml +0 -0
  95. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/cassettes/test_integration_write/TestWriteSmartAdTargets.test_add_update_delete.yaml +0 -0
  96. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/cassettes/test_integration_write/TestWriteVCards.test_add_delete.yaml +0 -0
  97. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/reports_cache/raw/fields-list.html +0 -0
  98. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/reports_cache/raw/headers.html +0 -0
  99. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/reports_cache/raw/spec.html +0 -0
  100. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/reports_cache/raw/type.html +0 -0
  101. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/reports_cache/spec.json +0 -0
  102. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/test_auth_bw.py +0 -0
  103. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/test_auth_op.py +0 -0
  104. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/test_integration.py +0 -0
  105. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/test_reports_drift.py +0 -0
  106. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/adextensions.xml +0 -0
  107. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/adgroups.xml +0 -0
  108. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/adimages.xml +0 -0
  109. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/ads.xml +0 -0
  110. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/advideos.xml +0 -0
  111. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/agencyclients.xml +0 -0
  112. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/audiencetargets.xml +0 -0
  113. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/bidmodifiers.xml +0 -0
  114. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/bids.xml +0 -0
  115. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/businesses.xml +0 -0
  116. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/campaigns.xml +0 -0
  117. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/changes.xml +0 -0
  118. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/clients.xml +0 -0
  119. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/creatives.xml +0 -0
  120. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/dictionaries.xml +0 -0
  121. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/dynamictextadtargets.xml +0 -0
  122. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/feeds.xml +0 -0
  123. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/keywordbids.xml +0 -0
  124. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/keywords.xml +0 -0
  125. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/keywordsresearch.xml +0 -0
  126. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/leads.xml +0 -0
  127. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/negativekeywordsharedsets.xml +0 -0
  128. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/retargetinglists.xml +0 -0
  129. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/sitelinks.xml +0 -0
  130. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/smartadtargets.xml +0 -0
  131. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/turbopages.xml +0 -0
  132. {direct_cli-0.2.6 → direct_cli-0.2.8}/tests/wsdl_cache/vcards.xml +0 -0
@@ -51,7 +51,6 @@ jobs:
51
51
  print(f"- Missing methods: {summary['missing_service_methods']}")
52
52
  print(f"- Unexpected methods: {summary['unexpected_service_methods']}")
53
53
  print(f"- Strict parity OK: {summary['strict_parity_ok']}")
54
- print(f"- Alias groups: {len(report['aliases'])}")
55
54
  print(f"- Non-WSDL services: {len(report['non_wsdl_services'])}")
56
55
  print(f"- CLI helpers: {len(report['cli_helpers'])}")
57
56
  PY
@@ -6,6 +6,123 @@ This document provides essential information for AI coding agents working on the
6
6
 
7
7
  Direct CLI is a command-line interface for the Yandex Direct API, built with Python and Click. It provides commands for managing campaigns, ad groups, ads, keywords, reports, and other Yandex Direct resources.
8
8
 
9
+ ## CLI Convention
10
+
11
+ The current CLI convention is defined as follows.
12
+
13
+ ### CLI Contract
14
+
15
+ The canonical command shape is:
16
+
17
+ ```bash
18
+ direct <group> <command> [flags]
19
+ ```
20
+
21
+ Naming rules:
22
+
23
+ - `group`:
24
+ - lowercase ASCII only
25
+ - no underscores
26
+ - multiword groups are concatenated
27
+ - examples: `dynamicads`, `smartadtargets`, `negativekeywordsharedsets`
28
+
29
+ - `command`:
30
+ - lowercase only
31
+ - multiword commands use kebab-case
32
+ - examples: `get`, `set-bids`, `check-campaigns`, `has-search-volume`
33
+
34
+ ### Input Rules
35
+
36
+ - All user-facing input must be passed only through typed CLI flags.
37
+ - `--json` is not part of the public CLI contract.
38
+ - User-facing parameters must not be passed through `--json`.
39
+ - The CLI must not accept `SelectionCriteria`, nested payloads, update payloads, bidding rules, or any other user-facing command input through `--json`.
40
+ - Typed flags and JSON blobs must not be mixed as part of one public command contract.
41
+ - If the API requires a complex object, the CLI must expose explicit flags or subcommands instead of forwarding raw JSON.
42
+
43
+ ### Command Formatting Rules
44
+
45
+ - Every canonical CLI command must be written strictly on a single line.
46
+ - Multi-line command formatting is not allowed.
47
+ - Shell line continuation using `\` is forbidden in canonical documentation, help text, tests, and examples.
48
+
49
+ Allowed:
50
+
51
+ ```bash
52
+ direct dictionaries get-geo-regions --region-ids 225,187 --fields GeoRegionId,GeoRegionName
53
+ ```
54
+
55
+ Not allowed:
56
+
57
+ ```bash
58
+ direct dictionaries get-geo-regions \
59
+ --region-ids 225,187 \
60
+ --fields GeoRegionId,GeoRegionName
61
+ ```
62
+
63
+ ### Flag Design Rules
64
+
65
+ - List inputs use comma-separated CLI syntax where appropriate.
66
+ - Money and bid values stay human-readable in CLI input and are converted internally to the API wire format.
67
+ - Selector fields remain explicit flags, for example:
68
+ - `--id`
69
+ - `--campaign-id`
70
+ - `--adgroup-id`
71
+ - Nested API structures must be projected into typed flags instead of blob JSON.
72
+ - Help text must not advertise JSON as an alternative input path.
73
+
74
+ ### Datetime Rules
75
+
76
+ - Datetime parameters must be passed in the format `YYYY-MM-DDTHH:MM:SS`.
77
+ - Datetime values must be passed as a single shell token.
78
+ - Canonical examples must not use timezone suffixes like `Z`.
79
+ - Canonical examples must not use quoted space-separated datetime values.
80
+
81
+ Use:
82
+
83
+ ```bash
84
+ direct changes check-campaigns --timestamp 2026-04-14T00:00:00
85
+ ```
86
+
87
+ Do not use:
88
+
89
+ ```bash
90
+ direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
91
+ direct changes check-campaigns --timestamp "2026-04-14 00:00:00"
92
+ ```
93
+
94
+ ### Documentation Contract
95
+
96
+ - `README` must use only canonical syntax.
97
+ - `README` must use only single-line command examples.
98
+ - Canonical examples must not contain `--json`.
99
+ - Help output and tests must enforce the same contract.
100
+
101
+ ### Examples
102
+
103
+ Valid canonical examples:
104
+
105
+ ```bash
106
+ direct campaigns get --ids 1,2,3
107
+ direct changes check-campaigns --timestamp 2026-04-14T00:00:00
108
+ direct keywordsresearch has-search-volume --keywords "buy laptop,buy desktop"
109
+ direct smartadtargets update --id 456 --priority HIGH
110
+ direct dynamicads set-bids --id 789 --bid 12.5
111
+ direct dictionaries get-geo-regions --region-ids 225 --fields GeoRegionId,GeoRegionName
112
+ ```
113
+
114
+ Invalid examples:
115
+
116
+ ```bash
117
+ direct dictionaries get-geo-regions --json '{"GeoRegionIds":[225]}' --fields GeoRegionId,GeoRegionName
118
+ direct dynamicads set-bids --id 789 --bid 12.5 --json '{"StrategyPriority":"HIGH"}'
119
+ direct dictionaries get-geo-regions \
120
+ --region-ids 225 \
121
+ --fields GeoRegionId,GeoRegionName
122
+ direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
123
+ direct changes check-campaigns --timestamp "2026-04-14 00:00:00"
124
+ ```
125
+
9
126
  ## Build, Test, and Lint Commands
10
127
 
11
128
  ### Installation