asana-api-cli 2.1.1__tar.gz → 3.0.0__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.
- {asana_api_cli-2.1.1 → asana_api_cli-3.0.0}/PKG-INFO +77 -33
- asana_api_cli-2.1.1/src/asana_api_cli.egg-info/PKG-INFO → asana_api_cli-3.0.0/README.md +65 -49
- {asana_api_cli-2.1.1 → asana_api_cli-3.0.0}/pyproject.toml +17 -3
- asana_api_cli-3.0.0/src/asana_api_cli/cli.py +1107 -0
- asana_api_cli-3.0.0/src/asana_api_cli/click_ext.py +481 -0
- {asana_api_cli-2.1.1 → asana_api_cli-3.0.0}/src/asana_api_cli/formatter.py +9 -5
- asana_api_cli-3.0.0/src/asana_api_cli/redactor.py +216 -0
- asana_api_cli-3.0.0/src/asana_api_cli/session.py +363 -0
- asana_api_cli-3.0.0/src/asana_api_cli/structured_arg.py +203 -0
- {asana_api_cli-2.1.1 → asana_api_cli-3.0.0}/src/asana_api_cli/version.py +3 -2
- asana_api_cli-2.1.1/README.md → asana_api_cli-3.0.0/src/asana_api_cli.egg-info/PKG-INFO +93 -30
- {asana_api_cli-2.1.1 → asana_api_cli-3.0.0}/src/asana_api_cli.egg-info/SOURCES.txt +4 -0
- {asana_api_cli-2.1.1 → asana_api_cli-3.0.0}/src/asana_api_cli.egg-info/requires.txt +1 -1
- asana_api_cli-3.0.0/tests/test_cli.py +639 -0
- asana_api_cli-3.0.0/tests/test_cli_invocation.py +711 -0
- {asana_api_cli-2.1.1 → asana_api_cli-3.0.0}/tests/test_cli_surface.py +18 -0
- asana_api_cli-3.0.0/tests/test_click_ext.py +326 -0
- {asana_api_cli-2.1.1 → asana_api_cli-3.0.0}/tests/test_formatter.py +24 -17
- {asana_api_cli-2.1.1 → asana_api_cli-3.0.0}/tests/test_py310_compat.py +10 -3
- asana_api_cli-2.1.1/tests/test_session.py → asana_api_cli-3.0.0/tests/test_redactor.py +35 -157
- asana_api_cli-3.0.0/tests/test_session.py +404 -0
- asana_api_cli-3.0.0/tests/test_structured_arg.py +217 -0
- {asana_api_cli-2.1.1 → asana_api_cli-3.0.0}/tests/test_version.py +9 -6
- asana_api_cli-2.1.1/src/asana_api_cli/cli.py +0 -659
- asana_api_cli-2.1.1/src/asana_api_cli/click_ext.py +0 -265
- asana_api_cli-2.1.1/src/asana_api_cli/session.py +0 -413
- asana_api_cli-2.1.1/tests/test_cli.py +0 -259
- asana_api_cli-2.1.1/tests/test_cli_invocation.py +0 -489
- asana_api_cli-2.1.1/tests/test_click_ext.py +0 -176
- {asana_api_cli-2.1.1 → asana_api_cli-3.0.0}/LICENSE +0 -0
- {asana_api_cli-2.1.1 → asana_api_cli-3.0.0}/setup.cfg +0 -0
- {asana_api_cli-2.1.1 → asana_api_cli-3.0.0}/src/asana_api_cli/__init__.py +0 -0
- {asana_api_cli-2.1.1 → asana_api_cli-3.0.0}/src/asana_api_cli.egg-info/dependency_links.txt +0 -0
- {asana_api_cli-2.1.1 → asana_api_cli-3.0.0}/src/asana_api_cli.egg-info/entry_points.txt +0 -0
- {asana_api_cli-2.1.1 → asana_api_cli-3.0.0}/src/asana_api_cli.egg-info/top_level.txt +0 -0
|
@@ -1,20 +1,29 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: asana-api-cli
|
|
3
|
-
Version:
|
|
3
|
+
Version: 3.0.0
|
|
4
4
|
Summary: Command-line wrapper around the official Asana Python SDK
|
|
5
|
-
Author
|
|
5
|
+
Author: Masanao Izumo
|
|
6
6
|
License-Expression: MIT
|
|
7
7
|
Project-URL: Homepage, https://github.com/izumo-m/asana-api-cli
|
|
8
8
|
Project-URL: Repository, https://github.com/izumo-m/asana-api-cli
|
|
9
9
|
Project-URL: Issues, https://github.com/izumo-m/asana-api-cli/issues
|
|
10
10
|
Project-URL: Changelog, https://github.com/izumo-m/asana-api-cli/blob/main/CHANGELOG.md
|
|
11
|
+
Keywords: asana,cli,python-asana
|
|
12
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
18
|
+
Classifier: Topic :: Office/Business :: Groupware
|
|
19
|
+
Classifier: Topic :: Utilities
|
|
11
20
|
Requires-Python: >=3.10
|
|
12
21
|
Description-Content-Type: text/markdown
|
|
13
22
|
License-File: LICENSE
|
|
14
23
|
Requires-Dist: click>=8.0
|
|
15
24
|
Requires-Dist: jq>=1.6
|
|
16
25
|
Requires-Dist: tabulate>=0.9
|
|
17
|
-
Requires-Dist: asana<6,>=5.2
|
|
26
|
+
Requires-Dist: asana<6,>=5.0.2
|
|
18
27
|
Dynamic: license-file
|
|
19
28
|
|
|
20
29
|
# asana-api-cli
|
|
@@ -159,14 +168,14 @@ asana-api workspaces get-workspaces
|
|
|
159
168
|
asana-api projects get-projects-for-workspace
|
|
160
169
|
asana-api projects get-projects --workspace <WORKSPACE_GID>
|
|
161
170
|
|
|
162
|
-
# List
|
|
171
|
+
# List every task in a project (walks every page by default)
|
|
163
172
|
asana-api tasks get-tasks --project <PROJECT_GID>
|
|
164
173
|
|
|
165
174
|
# Preview the first few items
|
|
166
|
-
asana-api tasks get-tasks --project <PROJECT_GID> --
|
|
175
|
+
asana-api tasks get-tasks --project <PROJECT_GID> --item-limit 5
|
|
167
176
|
|
|
168
|
-
#
|
|
169
|
-
asana-api tasks get-tasks --project <PROJECT_GID> --
|
|
177
|
+
# One HTTP call: return the first page + the next_page cursor
|
|
178
|
+
asana-api tasks get-tasks --project <PROJECT_GID> --limit 100 --full-payload
|
|
170
179
|
|
|
171
180
|
# Single task
|
|
172
181
|
asana-api tasks get-task --task <TASK_GID>
|
|
@@ -203,33 +212,50 @@ the Asana API accepts in place of workspace.
|
|
|
203
212
|
|
|
204
213
|
## Pagination
|
|
205
214
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
|
212
|
-
|
|
213
|
-
|
|
|
214
|
-
| `--
|
|
215
|
-
|
|
216
|
-
`--
|
|
217
|
-
|
|
218
|
-
`--page-
|
|
219
|
-
|
|
220
|
-
when the default doesn't suit (e.g. very large response items).
|
|
215
|
+
Paginatable commands like `tasks get-tasks` expose every pagination input
|
|
216
|
+
of the `python-asana` SDK as a CLI flag. Each flag maps 1:1 to an SDK
|
|
217
|
+
`Configuration` property, `opts` key, or method kwarg, so you can probe
|
|
218
|
+
SDK behavior from the shell before writing any Python.
|
|
219
|
+
|
|
220
|
+
| CLI flag | SDK input | Effect |
|
|
221
|
+
|----------|-----------|--------|
|
|
222
|
+
| (none) | — | SDK default: walks every page automatically and outputs a flat JSON list of items |
|
|
223
|
+
| `--limit N` | `opts["limit"]` | Per-page size sent to the server (Asana API requires 1-100) |
|
|
224
|
+
| `--offset <TOKEN>` | `opts["offset"]` | Pagination cursor (the `next_page.offset` from a previous response) |
|
|
225
|
+
| `--page-limit N` | `Configuration.page_limit` | Same as `--limit` via Configuration (default: 100). Silently ignored when `--no-return-page-iterator` or `--full-payload` is set |
|
|
226
|
+
| `--item-limit N` | kwarg `item_limit=N` | Stop after N items have been collected. Silently ignored when `--no-return-page-iterator` or `--full-payload` is set |
|
|
227
|
+
| `--return-page-iterator` / `--no-return-page-iterator` | `Configuration.return_page_iterator` | Toggle the SDK page iterator (default: enabled). `--no-return-page-iterator` disables auto-pagination — the command runs one HTTP request and outputs the raw `{data, next_page}` dict |
|
|
228
|
+
| `--full-payload` | kwarg `full_payload=True` | Same effect as `--no-return-page-iterator` (per-call kwarg form) |
|
|
221
229
|
|
|
222
230
|
```bash
|
|
223
|
-
#
|
|
224
|
-
asana-api tasks get-tasks --project <PID>
|
|
231
|
+
# Default: walk every page, return a flat list of items
|
|
232
|
+
asana-api tasks get-tasks --project <PID>
|
|
225
233
|
|
|
226
|
-
#
|
|
227
|
-
asana-api tasks get-tasks --project <PID> --
|
|
234
|
+
# Cap the result to the first 250 items
|
|
235
|
+
asana-api tasks get-tasks --project <PID> --item-limit 250
|
|
228
236
|
|
|
229
|
-
#
|
|
237
|
+
# Single HTTP call: one page + next_page cursor
|
|
238
|
+
asana-api tasks get-tasks --project <PID> --limit 100 --no-return-page-iterator
|
|
239
|
+
|
|
240
|
+
# Resume from a cursor
|
|
230
241
|
asana-api tasks get-tasks --project <PID> --offset <TOKEN>
|
|
231
242
|
```
|
|
232
243
|
|
|
244
|
+
### Deprecated flags (v2.x → v3.0)
|
|
245
|
+
|
|
246
|
+
The following v2 flags are retained as deprecation aliases. Each emits a
|
|
247
|
+
stderr warning and forwards to the corresponding v3 flag; they will be
|
|
248
|
+
removed in a future release.
|
|
249
|
+
|
|
250
|
+
| Deprecated | Replacement |
|
|
251
|
+
|------------|-------------|
|
|
252
|
+
| `--all-items` | (no-op; walking every page is now the default) |
|
|
253
|
+
| `--page-size N` | `--limit N` |
|
|
254
|
+
| `--max-items N` | `--item-limit N` |
|
|
255
|
+
|
|
256
|
+
Combining a deprecated alias with its v3 counterpart (e.g. `--page-size`
|
|
257
|
+
together with `--limit`) is rejected with a usage error.
|
|
258
|
+
|
|
233
259
|
## Global options
|
|
234
260
|
|
|
235
261
|
These options work at any level of the command tree, so the following are
|
|
@@ -242,17 +268,35 @@ asana-api tasks get-tasks --project <PID> --debug
|
|
|
242
268
|
|
|
243
269
|
When the same option is given at multiple levels, the later one wins.
|
|
244
270
|
|
|
271
|
+
Every non-extension flag below maps 1:1 to a property of
|
|
272
|
+
`asana.Configuration` (or a per-call SDK kwarg) — see
|
|
273
|
+
[`docs/cli-sdk-mapping.md`](https://github.com/izumo-m/asana-api-cli/blob/main/docs/cli-sdk-mapping.md)
|
|
274
|
+
for the exact destination of each.
|
|
275
|
+
|
|
245
276
|
| Option | Description |
|
|
246
277
|
|--------|-------------|
|
|
247
278
|
| `--access-token TOKEN` | Asana personal access token (default: `$ASANA_ACCESS_TOKEN`) |
|
|
248
279
|
| `--host URL` | Override API base URL (default: `https://app.asana.com/api/1.0`) |
|
|
249
280
|
| `--proxy URL` | HTTP/HTTPS proxy URL |
|
|
250
|
-
| `--no-verify-ssl` |
|
|
251
|
-
| `--ca-cert PATH` | Path to a PEM bundle of trusted CA certificates |
|
|
252
|
-
| `--
|
|
253
|
-
| `--
|
|
254
|
-
| `--
|
|
255
|
-
| `--
|
|
281
|
+
| `--verify-ssl / --no-verify-ssl` | Toggle TLS certificate verification (default: True) |
|
|
282
|
+
| `--ssl-ca-cert PATH` | Path to a PEM bundle of trusted CA certificates |
|
|
283
|
+
| `--cert-file PATH` | Client TLS certificate for mTLS |
|
|
284
|
+
| `--key-file PATH` | Client TLS private key for mTLS |
|
|
285
|
+
| `--assert-hostname / --no-assert-hostname` | Toggle urllib3 hostname assertion (tri-state: unspecified → urllib3 default) |
|
|
286
|
+
| `--retry-strategy VALUE` | Override `Configuration.retry_strategy` fields. `VALUE` accepts shorthand (`total=5,backoff_factor=1.5,raise_on_status=false`), a JSON object (`'{"total":5,"status_forcelist":[429,500]}'`), or `@path` to a JSON file. List-typed fields require the JSON form. See [`docs/cli-sdk-mapping.md`](https://github.com/izumo-m/asana-api-cli/blob/main/docs/cli-sdk-mapping.md#structured-value-format-api-key-api-key-prefix-retry-strategy) for the field list |
|
|
287
|
+
| `--request-timeout SECONDS` | Per-request timeout in seconds |
|
|
288
|
+
| `--connection-pool-maxsize N` | Max urllib3 connections cached per host (default: cpu_count × 5) |
|
|
289
|
+
| `--temp-folder-path PATH` | Directory for temporary downloads |
|
|
290
|
+
| `--safe-chars-for-path-param S` | Extra characters treated as safe when percent-encoding path parameters |
|
|
291
|
+
| `--logger-format FMT` | Python logging format string for the SDK loggers |
|
|
292
|
+
| `--logger-file PATH` | Path the SDK loggers write to when set |
|
|
293
|
+
| `--multibyte-filenames` | Emit RFC 5987 `filename*=UTF-8''<percent-encoded>` on multipart uploads so Asana decodes non-ASCII attachment filenames correctly |
|
|
294
|
+
| `--debug` | Print HTTP request/response traces to stderr for troubleshooting (`Authorization` values are masked) |
|
|
295
|
+
|
|
296
|
+
Asana only accepts Bearer-token authentication, so `--username`,
|
|
297
|
+
`--password`, `--api-key`, and `--api-key-prefix` are also exposed for
|
|
298
|
+
1:1 parity with `Configuration` but are inert as of python-asana 5.2.4
|
|
299
|
+
— see the disclosure in [`docs/cli-sdk-mapping.md`](https://github.com/izumo-m/asana-api-cli/blob/main/docs/cli-sdk-mapping.md#no-op-auth-properties).
|
|
256
300
|
|
|
257
301
|
## Development
|
|
258
302
|
|
|
@@ -1,22 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: asana-api-cli
|
|
3
|
-
Version: 2.1.1
|
|
4
|
-
Summary: Command-line wrapper around the official Asana Python SDK
|
|
5
|
-
Author-email: Masanao Izumo <asana@masanao.site>
|
|
6
|
-
License-Expression: MIT
|
|
7
|
-
Project-URL: Homepage, https://github.com/izumo-m/asana-api-cli
|
|
8
|
-
Project-URL: Repository, https://github.com/izumo-m/asana-api-cli
|
|
9
|
-
Project-URL: Issues, https://github.com/izumo-m/asana-api-cli/issues
|
|
10
|
-
Project-URL: Changelog, https://github.com/izumo-m/asana-api-cli/blob/main/CHANGELOG.md
|
|
11
|
-
Requires-Python: >=3.10
|
|
12
|
-
Description-Content-Type: text/markdown
|
|
13
|
-
License-File: LICENSE
|
|
14
|
-
Requires-Dist: click>=8.0
|
|
15
|
-
Requires-Dist: jq>=1.6
|
|
16
|
-
Requires-Dist: tabulate>=0.9
|
|
17
|
-
Requires-Dist: asana<6,>=5.2
|
|
18
|
-
Dynamic: license-file
|
|
19
|
-
|
|
20
1
|
# asana-api-cli
|
|
21
2
|
|
|
22
3
|
A CLI that exposes **every method of the official
|
|
@@ -159,14 +140,14 @@ asana-api workspaces get-workspaces
|
|
|
159
140
|
asana-api projects get-projects-for-workspace
|
|
160
141
|
asana-api projects get-projects --workspace <WORKSPACE_GID>
|
|
161
142
|
|
|
162
|
-
# List
|
|
143
|
+
# List every task in a project (walks every page by default)
|
|
163
144
|
asana-api tasks get-tasks --project <PROJECT_GID>
|
|
164
145
|
|
|
165
146
|
# Preview the first few items
|
|
166
|
-
asana-api tasks get-tasks --project <PROJECT_GID> --
|
|
147
|
+
asana-api tasks get-tasks --project <PROJECT_GID> --item-limit 5
|
|
167
148
|
|
|
168
|
-
#
|
|
169
|
-
asana-api tasks get-tasks --project <PROJECT_GID> --
|
|
149
|
+
# One HTTP call: return the first page + the next_page cursor
|
|
150
|
+
asana-api tasks get-tasks --project <PROJECT_GID> --limit 100 --full-payload
|
|
170
151
|
|
|
171
152
|
# Single task
|
|
172
153
|
asana-api tasks get-task --task <TASK_GID>
|
|
@@ -203,33 +184,50 @@ the Asana API accepts in place of workspace.
|
|
|
203
184
|
|
|
204
185
|
## Pagination
|
|
205
186
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
|
212
|
-
|
|
213
|
-
|
|
|
214
|
-
| `--
|
|
215
|
-
|
|
216
|
-
`--
|
|
217
|
-
|
|
218
|
-
`--page-
|
|
219
|
-
|
|
220
|
-
when the default doesn't suit (e.g. very large response items).
|
|
187
|
+
Paginatable commands like `tasks get-tasks` expose every pagination input
|
|
188
|
+
of the `python-asana` SDK as a CLI flag. Each flag maps 1:1 to an SDK
|
|
189
|
+
`Configuration` property, `opts` key, or method kwarg, so you can probe
|
|
190
|
+
SDK behavior from the shell before writing any Python.
|
|
191
|
+
|
|
192
|
+
| CLI flag | SDK input | Effect |
|
|
193
|
+
|----------|-----------|--------|
|
|
194
|
+
| (none) | — | SDK default: walks every page automatically and outputs a flat JSON list of items |
|
|
195
|
+
| `--limit N` | `opts["limit"]` | Per-page size sent to the server (Asana API requires 1-100) |
|
|
196
|
+
| `--offset <TOKEN>` | `opts["offset"]` | Pagination cursor (the `next_page.offset` from a previous response) |
|
|
197
|
+
| `--page-limit N` | `Configuration.page_limit` | Same as `--limit` via Configuration (default: 100). Silently ignored when `--no-return-page-iterator` or `--full-payload` is set |
|
|
198
|
+
| `--item-limit N` | kwarg `item_limit=N` | Stop after N items have been collected. Silently ignored when `--no-return-page-iterator` or `--full-payload` is set |
|
|
199
|
+
| `--return-page-iterator` / `--no-return-page-iterator` | `Configuration.return_page_iterator` | Toggle the SDK page iterator (default: enabled). `--no-return-page-iterator` disables auto-pagination — the command runs one HTTP request and outputs the raw `{data, next_page}` dict |
|
|
200
|
+
| `--full-payload` | kwarg `full_payload=True` | Same effect as `--no-return-page-iterator` (per-call kwarg form) |
|
|
221
201
|
|
|
222
202
|
```bash
|
|
223
|
-
#
|
|
224
|
-
asana-api tasks get-tasks --project <PID>
|
|
203
|
+
# Default: walk every page, return a flat list of items
|
|
204
|
+
asana-api tasks get-tasks --project <PID>
|
|
205
|
+
|
|
206
|
+
# Cap the result to the first 250 items
|
|
207
|
+
asana-api tasks get-tasks --project <PID> --item-limit 250
|
|
225
208
|
|
|
226
|
-
#
|
|
227
|
-
asana-api tasks get-tasks --project <PID> --
|
|
209
|
+
# Single HTTP call: one page + next_page cursor
|
|
210
|
+
asana-api tasks get-tasks --project <PID> --limit 100 --no-return-page-iterator
|
|
228
211
|
|
|
229
|
-
#
|
|
212
|
+
# Resume from a cursor
|
|
230
213
|
asana-api tasks get-tasks --project <PID> --offset <TOKEN>
|
|
231
214
|
```
|
|
232
215
|
|
|
216
|
+
### Deprecated flags (v2.x → v3.0)
|
|
217
|
+
|
|
218
|
+
The following v2 flags are retained as deprecation aliases. Each emits a
|
|
219
|
+
stderr warning and forwards to the corresponding v3 flag; they will be
|
|
220
|
+
removed in a future release.
|
|
221
|
+
|
|
222
|
+
| Deprecated | Replacement |
|
|
223
|
+
|------------|-------------|
|
|
224
|
+
| `--all-items` | (no-op; walking every page is now the default) |
|
|
225
|
+
| `--page-size N` | `--limit N` |
|
|
226
|
+
| `--max-items N` | `--item-limit N` |
|
|
227
|
+
|
|
228
|
+
Combining a deprecated alias with its v3 counterpart (e.g. `--page-size`
|
|
229
|
+
together with `--limit`) is rejected with a usage error.
|
|
230
|
+
|
|
233
231
|
## Global options
|
|
234
232
|
|
|
235
233
|
These options work at any level of the command tree, so the following are
|
|
@@ -242,17 +240,35 @@ asana-api tasks get-tasks --project <PID> --debug
|
|
|
242
240
|
|
|
243
241
|
When the same option is given at multiple levels, the later one wins.
|
|
244
242
|
|
|
243
|
+
Every non-extension flag below maps 1:1 to a property of
|
|
244
|
+
`asana.Configuration` (or a per-call SDK kwarg) — see
|
|
245
|
+
[`docs/cli-sdk-mapping.md`](https://github.com/izumo-m/asana-api-cli/blob/main/docs/cli-sdk-mapping.md)
|
|
246
|
+
for the exact destination of each.
|
|
247
|
+
|
|
245
248
|
| Option | Description |
|
|
246
249
|
|--------|-------------|
|
|
247
250
|
| `--access-token TOKEN` | Asana personal access token (default: `$ASANA_ACCESS_TOKEN`) |
|
|
248
251
|
| `--host URL` | Override API base URL (default: `https://app.asana.com/api/1.0`) |
|
|
249
252
|
| `--proxy URL` | HTTP/HTTPS proxy URL |
|
|
250
|
-
| `--no-verify-ssl` |
|
|
251
|
-
| `--ca-cert PATH` | Path to a PEM bundle of trusted CA certificates |
|
|
252
|
-
| `--
|
|
253
|
-
| `--
|
|
254
|
-
| `--
|
|
255
|
-
| `--
|
|
253
|
+
| `--verify-ssl / --no-verify-ssl` | Toggle TLS certificate verification (default: True) |
|
|
254
|
+
| `--ssl-ca-cert PATH` | Path to a PEM bundle of trusted CA certificates |
|
|
255
|
+
| `--cert-file PATH` | Client TLS certificate for mTLS |
|
|
256
|
+
| `--key-file PATH` | Client TLS private key for mTLS |
|
|
257
|
+
| `--assert-hostname / --no-assert-hostname` | Toggle urllib3 hostname assertion (tri-state: unspecified → urllib3 default) |
|
|
258
|
+
| `--retry-strategy VALUE` | Override `Configuration.retry_strategy` fields. `VALUE` accepts shorthand (`total=5,backoff_factor=1.5,raise_on_status=false`), a JSON object (`'{"total":5,"status_forcelist":[429,500]}'`), or `@path` to a JSON file. List-typed fields require the JSON form. See [`docs/cli-sdk-mapping.md`](https://github.com/izumo-m/asana-api-cli/blob/main/docs/cli-sdk-mapping.md#structured-value-format-api-key-api-key-prefix-retry-strategy) for the field list |
|
|
259
|
+
| `--request-timeout SECONDS` | Per-request timeout in seconds |
|
|
260
|
+
| `--connection-pool-maxsize N` | Max urllib3 connections cached per host (default: cpu_count × 5) |
|
|
261
|
+
| `--temp-folder-path PATH` | Directory for temporary downloads |
|
|
262
|
+
| `--safe-chars-for-path-param S` | Extra characters treated as safe when percent-encoding path parameters |
|
|
263
|
+
| `--logger-format FMT` | Python logging format string for the SDK loggers |
|
|
264
|
+
| `--logger-file PATH` | Path the SDK loggers write to when set |
|
|
265
|
+
| `--multibyte-filenames` | Emit RFC 5987 `filename*=UTF-8''<percent-encoded>` on multipart uploads so Asana decodes non-ASCII attachment filenames correctly |
|
|
266
|
+
| `--debug` | Print HTTP request/response traces to stderr for troubleshooting (`Authorization` values are masked) |
|
|
267
|
+
|
|
268
|
+
Asana only accepts Bearer-token authentication, so `--username`,
|
|
269
|
+
`--password`, `--api-key`, and `--api-key-prefix` are also exposed for
|
|
270
|
+
1:1 parity with `Configuration` but are inert as of python-asana 5.2.4
|
|
271
|
+
— see the disclosure in [`docs/cli-sdk-mapping.md`](https://github.com/izumo-m/asana-api-cli/blob/main/docs/cli-sdk-mapping.md#no-op-auth-properties).
|
|
256
272
|
|
|
257
273
|
## Development
|
|
258
274
|
|
|
@@ -1,16 +1,27 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "asana-api-cli"
|
|
3
|
-
version = "
|
|
3
|
+
version = "3.0.0"
|
|
4
4
|
description = "Command-line wrapper around the official Asana Python SDK"
|
|
5
|
-
authors = [{name = "Masanao Izumo"
|
|
5
|
+
authors = [{name = "Masanao Izumo"}]
|
|
6
6
|
readme = "README.md"
|
|
7
7
|
license = "MIT"
|
|
8
8
|
requires-python = ">=3.10"
|
|
9
|
+
keywords = ["asana", "cli", "python-asana"]
|
|
10
|
+
classifiers = [
|
|
11
|
+
"Development Status :: 5 - Production/Stable",
|
|
12
|
+
"Environment :: Console",
|
|
13
|
+
"Intended Audience :: Developers",
|
|
14
|
+
"Operating System :: OS Independent",
|
|
15
|
+
"Programming Language :: Python :: 3",
|
|
16
|
+
"Programming Language :: Python :: 3 :: Only",
|
|
17
|
+
"Topic :: Office/Business :: Groupware",
|
|
18
|
+
"Topic :: Utilities",
|
|
19
|
+
]
|
|
9
20
|
dependencies = [
|
|
10
21
|
"click>=8.0",
|
|
11
22
|
"jq>=1.6",
|
|
12
23
|
"tabulate>=0.9",
|
|
13
|
-
"asana>=5.2,<6",
|
|
24
|
+
"asana>=5.0.2,<6",
|
|
14
25
|
]
|
|
15
26
|
|
|
16
27
|
[project.urls]
|
|
@@ -30,6 +41,8 @@ dev = [
|
|
|
30
41
|
"build>=1,<2",
|
|
31
42
|
"twine>=6,<7",
|
|
32
43
|
"vermin>=1.6,<2",
|
|
44
|
+
"vcrpy>=6",
|
|
45
|
+
"pytest-recording>=0.13",
|
|
33
46
|
]
|
|
34
47
|
|
|
35
48
|
[build-system]
|
|
@@ -80,5 +93,6 @@ no_parse_comments = true
|
|
|
80
93
|
|
|
81
94
|
[tool.pytest.ini_options]
|
|
82
95
|
testpaths = ["tests"]
|
|
96
|
+
pythonpath = ["tests"]
|
|
83
97
|
addopts = ""
|
|
84
98
|
disable_test_id_escaping_and_forfeit_all_rights_to_community_support = true
|