direct-cli 0.2.6__tar.gz → 0.2.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {direct_cli-0.2.6 → direct_cli-0.2.7}/.github/workflows/api-coverage.yml +0 -1
- {direct_cli-0.2.6 → direct_cli-0.2.7}/AGENTS.md +116 -0
- direct_cli-0.2.7/PKG-INFO +921 -0
- direct_cli-0.2.7/README.md +884 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/cli.py +0 -5
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/adextensions.py +6 -30
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/adgroups.py +46 -38
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/adimages.py +21 -8
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/ads.py +53 -42
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/advideos.py +0 -3
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/agencyclients.py +123 -22
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/audiencetargets.py +41 -20
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/bidmodifiers.py +58 -29
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/bids.py +5 -20
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/campaigns.py +108 -37
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/changes.py +9 -9
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/clients.py +18 -10
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/creatives.py +8 -8
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/dictionaries.py +16 -8
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/dynamicads.py +42 -20
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/feeds.py +3 -56
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/keywordbids.py +59 -13
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/keywords.py +6 -21
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/keywordsresearch.py +0 -3
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/leads.py +0 -3
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/negativekeywordsharedsets.py +2 -12
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/retargeting.py +38 -17
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/sitelinks.py +14 -8
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/smartadtargets.py +98 -45
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/turbopages.py +0 -3
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/vcards.py +74 -7
- direct_cli-0.2.7/direct_cli/utils.py +266 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/wsdl_coverage.py +0 -13
- direct_cli-0.2.7/direct_cli.egg-info/PKG-INFO +921 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/pyproject.toml +1 -1
- {direct_cli-0.2.6 → direct_cli-0.2.7}/scripts/build_api_coverage_report.py +0 -1
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/conftest.py +9 -33
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/test_api_coverage.py +88 -44
- direct_cli-0.2.7/tests/test_cli.py +167 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/test_comprehensive.py +0 -3
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/test_dry_run.py +546 -271
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/test_integration_write.py +82 -113
- direct_cli-0.2.6/PKG-INFO +0 -582
- direct_cli-0.2.6/README.md +0 -545
- direct_cli-0.2.6/direct_cli/utils.py +0 -121
- direct_cli-0.2.6/direct_cli.egg-info/PKG-INFO +0 -582
- direct_cli-0.2.6/tests/test_cli.py +0 -116
- {direct_cli-0.2.6 → direct_cli-0.2.7}/.env.example +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/.github/copilot-instructions.md +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/.github/workflows/claude-code-review.yml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/.github/workflows/claude.yml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/.gitignore +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/CLAUDE.md +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/MANIFEST.in +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/__init__.py +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/api.py +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/auth.py +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/__init__.py +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/businesses.py +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/commands/reports.py +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/output.py +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli/reports_coverage.py +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli.egg-info/SOURCES.txt +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli.egg-info/dependency_links.txt +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli.egg-info/entry_points.txt +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli.egg-info/requires.txt +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/direct_cli.egg-info/top_level.txt +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/docs/superpowers/plans/2026-04-12-issue-32-completion.md +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/scripts/check_reports_drift.py +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/scripts/check_wsdl_drift.py +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/scripts/refresh_reports_cache.py +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/scripts/refresh_wsdl_cache.py +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/scripts/release_pypi.sh +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/setup.cfg +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/setup.py +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/__init__.py +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/cassettes/test_integration_write/TestWriteAdExtensions.test_add_delete.yaml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/cassettes/test_integration_write/TestWriteAdGroups.test_add_update_delete.yaml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/cassettes/test_integration_write/TestWriteAdImages.test_add_delete.yaml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/cassettes/test_integration_write/TestWriteAds.test_add_text_ad_update_delete.yaml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/cassettes/test_integration_write/TestWriteAudienceTargets.test_add_delete.yaml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/cassettes/test_integration_write/TestWriteBidModifiersAdd.test_add_delete_mobile.yaml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/cassettes/test_integration_write/TestWriteBidModifiersSet.test_set_without_id_is_rejected.yaml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/cassettes/test_integration_write/TestWriteBids.test_set_bid.yaml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/cassettes/test_integration_write/TestWriteCampaigns.test_campaign_lifecycle.yaml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/cassettes/test_integration_write/TestWriteDynamicAds.test_add_update_delete.yaml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/cassettes/test_integration_write/TestWriteFeeds.test_add_update_delete.yaml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/cassettes/test_integration_write/TestWriteKeywordBids.test_set_keyword_bid.yaml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/cassettes/test_integration_write/TestWriteKeywords.test_add_update_delete.yaml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/cassettes/test_integration_write/TestWriteNegativeKeywordSharedSets.test_add_update_delete.yaml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/cassettes/test_integration_write/TestWriteRetargeting.test_add_delete.yaml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/cassettes/test_integration_write/TestWriteSitelinks.test_add_delete.yaml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/cassettes/test_integration_write/TestWriteSmartAdTargets.test_add_update_delete.yaml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/cassettes/test_integration_write/TestWriteVCards.test_add_delete.yaml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/reports_cache/raw/fields-list.html +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/reports_cache/raw/headers.html +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/reports_cache/raw/spec.html +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/reports_cache/raw/type.html +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/reports_cache/spec.json +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/test_auth_bw.py +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/test_auth_op.py +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/test_integration.py +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/test_reports_drift.py +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/adextensions.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/adgroups.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/adimages.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/ads.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/advideos.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/agencyclients.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/audiencetargets.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/bidmodifiers.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/bids.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/businesses.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/campaigns.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/changes.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/clients.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/creatives.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/dictionaries.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/dynamictextadtargets.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/feeds.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/keywordbids.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/keywords.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/keywordsresearch.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/leads.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/negativekeywordsharedsets.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/retargetinglists.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/sitelinks.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/smartadtargets.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/tests/wsdl_cache/turbopages.xml +0 -0
- {direct_cli-0.2.6 → direct_cli-0.2.7}/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,122 @@ 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 dynamicads set-bids --id 789 --bid 12.5
|
|
110
|
+
direct dictionaries get-geo-regions --region-ids 225 --fields GeoRegionId,GeoRegionName
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Invalid examples:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
direct dictionaries get-geo-regions --json '{"GeoRegionIds":[225]}' --fields GeoRegionId,GeoRegionName
|
|
117
|
+
direct dynamicads set-bids --id 789 --bid 12.5 --json '{"StrategyPriority":"HIGH"}'
|
|
118
|
+
direct dictionaries get-geo-regions \
|
|
119
|
+
--region-ids 225 \
|
|
120
|
+
--fields GeoRegionId,GeoRegionName
|
|
121
|
+
direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
|
|
122
|
+
direct changes check-campaigns --timestamp "2026-04-14 00:00:00"
|
|
123
|
+
```
|
|
124
|
+
|
|
9
125
|
## Build, Test, and Lint Commands
|
|
10
126
|
|
|
11
127
|
### Installation
|