asana-api-cli 1.2.1__tar.gz → 1.4.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.
Files changed (69) hide show
  1. asana_api_cli-1.4.0/LICENSE +21 -0
  2. {asana_api_cli-1.2.1/src/asana_api_cli.egg-info → asana_api_cli-1.4.0}/PKG-INFO +19 -3
  3. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/README.md +16 -1
  4. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/pyproject.toml +3 -2
  5. asana_api_cli-1.4.0/src/asana_api_cli/cli/__init__.py +96 -0
  6. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/access_requests.py +2 -1
  7. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/allocations.py +2 -1
  8. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/attachments.py +2 -1
  9. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/audit_log_api.py +2 -1
  10. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/batch_api.py +2 -1
  11. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/budgets.py +2 -1
  12. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/custom_field_settings.py +2 -1
  13. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/custom_fields.py +2 -1
  14. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/custom_types.py +2 -1
  15. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/events.py +2 -1
  16. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/exports.py +2 -1
  17. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/goal_relationships.py +2 -1
  18. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/goals.py +2 -1
  19. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/jobs.py +2 -1
  20. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/memberships.py +2 -1
  21. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/organization_exports.py +2 -1
  22. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/portfolio_memberships.py +2 -1
  23. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/portfolios.py +2 -1
  24. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/project_briefs.py +2 -1
  25. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/project_memberships.py +2 -1
  26. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/project_portfolio_settings.py +2 -1
  27. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/project_statuses.py +2 -1
  28. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/project_templates.py +2 -1
  29. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/projects.py +2 -1
  30. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/rates.py +2 -1
  31. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/reactions.py +2 -1
  32. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/roles.py +2 -1
  33. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/rules.py +2 -1
  34. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/sections.py +2 -1
  35. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/status_updates.py +2 -1
  36. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/stories.py +2 -1
  37. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/tags.py +2 -1
  38. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/task_templates.py +2 -1
  39. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/tasks.py +2 -1
  40. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/team_memberships.py +2 -1
  41. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/teams.py +2 -1
  42. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/time_periods.py +2 -1
  43. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/time_tracking_categories.py +2 -1
  44. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/time_tracking_entries.py +2 -1
  45. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/timesheet_approval_statuses.py +2 -1
  46. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/typeahead.py +2 -1
  47. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/user_task_lists.py +2 -1
  48. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/users.py +2 -1
  49. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/webhooks.py +2 -1
  50. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/workspace_memberships.py +2 -1
  51. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/cli/workspaces.py +2 -1
  52. asana_api_cli-1.4.0/src/asana_api_cli/click_ext.py +109 -0
  53. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/session.py +13 -11
  54. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/version.py +1 -0
  55. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0/src/asana_api_cli.egg-info}/PKG-INFO +19 -3
  56. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli.egg-info/SOURCES.txt +1 -0
  57. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/tests/test_codegen.py +21 -8
  58. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/tests/test_formatter.py +6 -13
  59. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/tests/test_session.py +2 -0
  60. asana_api_cli-1.2.1/LICENSE +0 -190
  61. asana_api_cli-1.2.1/src/asana_api_cli/cli/__init__.py +0 -140
  62. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/setup.cfg +0 -0
  63. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/__init__.py +0 -0
  64. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli/formatter.py +0 -0
  65. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli.egg-info/dependency_links.txt +0 -0
  66. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli.egg-info/entry_points.txt +0 -0
  67. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli.egg-info/requires.txt +0 -0
  68. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/src/asana_api_cli.egg-info/top_level.txt +0 -0
  69. {asana_api_cli-1.2.1 → asana_api_cli-1.4.0}/tests/test_version.py +0 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Masanao Izumo
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -1,12 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: asana-api-cli
3
- Version: 1.2.1
3
+ Version: 1.4.0
4
4
  Summary: Command-line wrapper around the official Asana Python SDK
5
5
  Author-email: Masanao Izumo <asana@masanao.site>
6
- License-Expression: Apache-2.0
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
+ Project-URL: Changelog, https://github.com/izumo-m/asana-api-cli/blob/main/CHANGELOG.md
10
11
  Requires-Python: >=3.10
11
12
  Description-Content-Type: text/markdown
12
13
  License-File: LICENSE
@@ -47,6 +48,21 @@ export ASANA_ACCESS_TOKEN="1/12345..."
47
48
  export ASANA_DEFAULT_WORKSPACE="12345678" # optional
48
49
  ```
49
50
 
51
+ ## Shell completion
52
+
53
+ `asana-api` is built with Click, which supports dynamic shell completion.
54
+ To enable bash completion, add the following line to your `~/.bashrc`:
55
+
56
+ ```bash
57
+ eval "$(_ASANA_API_COMPLETE=bash_source asana-api)"
58
+ ```
59
+
60
+ Then reload the shell (`source ~/.bashrc` or open a new terminal). Pressing
61
+ `<TAB>` after `asana-api` will now complete subcommands and options.
62
+
63
+ For `zsh` or `fish`, replace `bash_source` with `zsh_source` or `fish_source`
64
+ and add the line to `~/.zshrc` or `~/.config/fish/config.fish` respectively.
65
+
50
66
  ## Usage
51
67
 
52
68
  ```bash
@@ -102,4 +118,4 @@ for building from source, project layout, and library usage.
102
118
 
103
119
  ## License
104
120
 
105
- [Apache License 2.0](https://github.com/izumo-m/asana-api-cli/blob/main/LICENSE)
121
+ [MIT License](https://github.com/izumo-m/asana-api-cli/blob/main/LICENSE)
@@ -29,6 +29,21 @@ export ASANA_ACCESS_TOKEN="1/12345..."
29
29
  export ASANA_DEFAULT_WORKSPACE="12345678" # optional
30
30
  ```
31
31
 
32
+ ## Shell completion
33
+
34
+ `asana-api` is built with Click, which supports dynamic shell completion.
35
+ To enable bash completion, add the following line to your `~/.bashrc`:
36
+
37
+ ```bash
38
+ eval "$(_ASANA_API_COMPLETE=bash_source asana-api)"
39
+ ```
40
+
41
+ Then reload the shell (`source ~/.bashrc` or open a new terminal). Pressing
42
+ `<TAB>` after `asana-api` will now complete subcommands and options.
43
+
44
+ For `zsh` or `fish`, replace `bash_source` with `zsh_source` or `fish_source`
45
+ and add the line to `~/.zshrc` or `~/.config/fish/config.fish` respectively.
46
+
32
47
  ## Usage
33
48
 
34
49
  ```bash
@@ -84,4 +99,4 @@ for building from source, project layout, and library usage.
84
99
 
85
100
  ## License
86
101
 
87
- [Apache License 2.0](https://github.com/izumo-m/asana-api-cli/blob/main/LICENSE)
102
+ [MIT License](https://github.com/izumo-m/asana-api-cli/blob/main/LICENSE)
@@ -1,10 +1,10 @@
1
1
  [project]
2
2
  name = "asana-api-cli"
3
- version = "1.2.1"
3
+ version = "1.4.0"
4
4
  description = "Command-line wrapper around the official Asana Python SDK"
5
5
  authors = [{name = "Masanao Izumo", email = "asana@masanao.site"}]
6
6
  readme = "README.md"
7
- license = "Apache-2.0"
7
+ license = "MIT"
8
8
  requires-python = ">=3.10"
9
9
  dependencies = [
10
10
  "click>=8.1,<9",
@@ -17,6 +17,7 @@ dependencies = [
17
17
  Homepage = "https://github.com/izumo-m/asana-api-cli"
18
18
  Repository = "https://github.com/izumo-m/asana-api-cli"
19
19
  Issues = "https://github.com/izumo-m/asana-api-cli/issues"
20
+ Changelog = "https://github.com/izumo-m/asana-api-cli/blob/main/CHANGELOG.md"
20
21
 
21
22
  [project.scripts]
22
23
  asana-api = "asana_api_cli.cli:main"
@@ -0,0 +1,96 @@
1
+ # This file is auto-generated by tools/codegen.py — do not edit manually.
2
+ from __future__ import annotations
3
+
4
+ import click
5
+
6
+ from asana_api_cli.click_ext import LazyGroup
7
+ from asana_api_cli.session import runtime
8
+ from asana_api_cli.version import version_string
9
+
10
+
11
+ LAZY_SUBCOMMANDS: dict[str, tuple[str, str]] = {
12
+ "access-requests": ("asana_api_cli.cli.access_requests:access_requests_group", "AccessRequests commands."),
13
+ "allocations": ("asana_api_cli.cli.allocations:allocations_group", "Allocations commands."),
14
+ "attachments": ("asana_api_cli.cli.attachments:attachments_group", "Attachments commands."),
15
+ "audit-log-api": ("asana_api_cli.cli.audit_log_api:audit_log_api_group", "AuditLogAPI commands."),
16
+ "batch-api": ("asana_api_cli.cli.batch_api:batch_api_group", "BatchAPI commands."),
17
+ "budgets": ("asana_api_cli.cli.budgets:budgets_group", "Budgets commands."),
18
+ "custom-field-settings": ("asana_api_cli.cli.custom_field_settings:custom_field_settings_group", "CustomFieldSettings commands."),
19
+ "custom-fields": ("asana_api_cli.cli.custom_fields:custom_fields_group", "CustomFields commands."),
20
+ "custom-types": ("asana_api_cli.cli.custom_types:custom_types_group", "CustomTypes commands."),
21
+ "events": ("asana_api_cli.cli.events:events_group", "Events commands."),
22
+ "exports": ("asana_api_cli.cli.exports:exports_group", "Exports commands."),
23
+ "goal-relationships": ("asana_api_cli.cli.goal_relationships:goal_relationships_group", "GoalRelationships commands."),
24
+ "goals": ("asana_api_cli.cli.goals:goals_group", "Goals commands."),
25
+ "jobs": ("asana_api_cli.cli.jobs:jobs_group", "Jobs commands."),
26
+ "memberships": ("asana_api_cli.cli.memberships:memberships_group", "Memberships commands."),
27
+ "organization-exports": ("asana_api_cli.cli.organization_exports:organization_exports_group", "OrganizationExports commands."),
28
+ "portfolio-memberships": ("asana_api_cli.cli.portfolio_memberships:portfolio_memberships_group", "PortfolioMemberships commands."),
29
+ "portfolios": ("asana_api_cli.cli.portfolios:portfolios_group", "Portfolios commands."),
30
+ "project-briefs": ("asana_api_cli.cli.project_briefs:project_briefs_group", "ProjectBriefs commands."),
31
+ "project-memberships": ("asana_api_cli.cli.project_memberships:project_memberships_group", "ProjectMemberships commands."),
32
+ "project-portfolio-settings": ("asana_api_cli.cli.project_portfolio_settings:project_portfolio_settings_group", "ProjectPortfolioSettings commands."),
33
+ "project-statuses": ("asana_api_cli.cli.project_statuses:project_statuses_group", "ProjectStatuses commands."),
34
+ "project-templates": ("asana_api_cli.cli.project_templates:project_templates_group", "ProjectTemplates commands."),
35
+ "projects": ("asana_api_cli.cli.projects:projects_group", "Projects commands."),
36
+ "rates": ("asana_api_cli.cli.rates:rates_group", "Rates commands."),
37
+ "reactions": ("asana_api_cli.cli.reactions:reactions_group", "Reactions commands."),
38
+ "roles": ("asana_api_cli.cli.roles:roles_group", "Roles commands."),
39
+ "rules": ("asana_api_cli.cli.rules:rules_group", "Rules commands."),
40
+ "sections": ("asana_api_cli.cli.sections:sections_group", "Sections commands."),
41
+ "status-updates": ("asana_api_cli.cli.status_updates:status_updates_group", "StatusUpdates commands."),
42
+ "stories": ("asana_api_cli.cli.stories:stories_group", "Stories commands."),
43
+ "tags": ("asana_api_cli.cli.tags:tags_group", "Tags commands."),
44
+ "task-templates": ("asana_api_cli.cli.task_templates:task_templates_group", "TaskTemplates commands."),
45
+ "tasks": ("asana_api_cli.cli.tasks:tasks_group", "Tasks commands."),
46
+ "team-memberships": ("asana_api_cli.cli.team_memberships:team_memberships_group", "TeamMemberships commands."),
47
+ "teams": ("asana_api_cli.cli.teams:teams_group", "Teams commands."),
48
+ "time-periods": ("asana_api_cli.cli.time_periods:time_periods_group", "TimePeriods commands."),
49
+ "time-tracking-categories": ("asana_api_cli.cli.time_tracking_categories:time_tracking_categories_group", "TimeTrackingCategories commands."),
50
+ "time-tracking-entries": ("asana_api_cli.cli.time_tracking_entries:time_tracking_entries_group", "TimeTrackingEntries commands."),
51
+ "timesheet-approval-statuses": ("asana_api_cli.cli.timesheet_approval_statuses:timesheet_approval_statuses_group", "TimesheetApprovalStatuses commands."),
52
+ "typeahead": ("asana_api_cli.cli.typeahead:typeahead_group", "Typeahead commands."),
53
+ "user-task-lists": ("asana_api_cli.cli.user_task_lists:user_task_lists_group", "UserTaskLists commands."),
54
+ "users": ("asana_api_cli.cli.users:users_group", "Users commands."),
55
+ "webhooks": ("asana_api_cli.cli.webhooks:webhooks_group", "Webhooks commands."),
56
+ "workspace-memberships": ("asana_api_cli.cli.workspace_memberships:workspace_memberships_group", "WorkspaceMemberships commands."),
57
+ "workspaces": ("asana_api_cli.cli.workspaces:workspaces_group", "Workspaces commands."),
58
+ }
59
+
60
+
61
+ @click.group(cls=LazyGroup, lazy_subcommands=LAZY_SUBCOMMANDS)
62
+ @click.version_option(version_string(), prog_name="asana-api")
63
+ @click.option("--host", default=None, help="Override API base URL (default: https://app.asana.com/api/1.0)")
64
+ @click.option("--proxy", default=None, help="HTTP/HTTPS proxy URL")
65
+ @click.option("--no-verify-ssl", is_flag=True, default=False, help="Disable TLS certificate verification (insecure)")
66
+ @click.option("--ca-cert", "ca_cert", default=None, type=click.Path(exists=True, dir_okay=False), help="Path to a PEM bundle of trusted CA certificates")
67
+ @click.option("--page-limit", "page_limit", type=int, default=None, help="Default per-page size for paginated endpoints")
68
+ @click.option("--retries", type=int, default=None, help="Number of retries on 429/5xx responses (default: 5)")
69
+ @click.option("--timeout", type=float, default=None, help="Per-request timeout in seconds")
70
+ @click.option("--access-token", "access_token", default=None, help="Asana personal access token (default: $ASANA_ACCESS_TOKEN)")
71
+ @click.option("--temp-dir", "temp_dir", default=None, type=click.Path(file_okay=False), help="Directory for temporary downloads")
72
+ @click.option("--debug", is_flag=True, default=False, help="Print HTTP request/response to stderr for troubleshooting")
73
+ def main(
74
+ host: str | None,
75
+ proxy: str | None,
76
+ no_verify_ssl: bool,
77
+ ca_cert: str | None,
78
+ page_limit: int | None,
79
+ retries: int | None,
80
+ timeout: float | None,
81
+ access_token: str | None,
82
+ temp_dir: str | None,
83
+ debug: bool,
84
+ ) -> None:
85
+ """Asana API CLI (SDK-backed wrapper)."""
86
+ runtime.host = host
87
+ runtime.proxy = proxy
88
+ runtime.verify_ssl = not no_verify_ssl
89
+ runtime.ssl_ca_cert = ca_cert
90
+ runtime.page_limit = page_limit
91
+ runtime.retries = retries
92
+ runtime.timeout = timeout
93
+ if access_token:
94
+ runtime.access_token = access_token
95
+ runtime.temp_dir = temp_dir
96
+ runtime.debug = debug
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import AccessRequestsApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("access-requests")
14
+ @click.group("access-requests", cls=GroupWithGlobalOptions)
14
15
  def access_requests_group() -> None:
15
16
  """AccessRequests commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import AllocationsApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("allocations")
14
+ @click.group("allocations", cls=GroupWithGlobalOptions)
14
15
  def allocations_group() -> None:
15
16
  """Allocations commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import AttachmentsApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("attachments")
14
+ @click.group("attachments", cls=GroupWithGlobalOptions)
14
15
  def attachments_group() -> None:
15
16
  """Attachments commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import AuditLogAPIApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("audit-log-api")
14
+ @click.group("audit-log-api", cls=GroupWithGlobalOptions)
14
15
  def audit_log_api_group() -> None:
15
16
  """AuditLogAPI commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import BatchAPIApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("batch-api")
14
+ @click.group("batch-api", cls=GroupWithGlobalOptions)
14
15
  def batch_api_group() -> None:
15
16
  """BatchAPI commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import BudgetsApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("budgets")
14
+ @click.group("budgets", cls=GroupWithGlobalOptions)
14
15
  def budgets_group() -> None:
15
16
  """Budgets commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import CustomFieldSettingsApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("custom-field-settings")
14
+ @click.group("custom-field-settings", cls=GroupWithGlobalOptions)
14
15
  def custom_field_settings_group() -> None:
15
16
  """CustomFieldSettings commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import CustomFieldsApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("custom-fields")
14
+ @click.group("custom-fields", cls=GroupWithGlobalOptions)
14
15
  def custom_fields_group() -> None:
15
16
  """CustomFields commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import CustomTypesApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("custom-types")
14
+ @click.group("custom-types", cls=GroupWithGlobalOptions)
14
15
  def custom_types_group() -> None:
15
16
  """CustomTypes commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import EventsApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("events")
14
+ @click.group("events", cls=GroupWithGlobalOptions)
14
15
  def events_group() -> None:
15
16
  """Events commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import ExportsApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("exports")
14
+ @click.group("exports", cls=GroupWithGlobalOptions)
14
15
  def exports_group() -> None:
15
16
  """Exports commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import GoalRelationshipsApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("goal-relationships")
14
+ @click.group("goal-relationships", cls=GroupWithGlobalOptions)
14
15
  def goal_relationships_group() -> None:
15
16
  """GoalRelationships commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import GoalsApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("goals")
14
+ @click.group("goals", cls=GroupWithGlobalOptions)
14
15
  def goals_group() -> None:
15
16
  """Goals commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import JobsApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("jobs")
14
+ @click.group("jobs", cls=GroupWithGlobalOptions)
14
15
  def jobs_group() -> None:
15
16
  """Jobs commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import MembershipsApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("memberships")
14
+ @click.group("memberships", cls=GroupWithGlobalOptions)
14
15
  def memberships_group() -> None:
15
16
  """Memberships commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import OrganizationExportsApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("organization-exports")
14
+ @click.group("organization-exports", cls=GroupWithGlobalOptions)
14
15
  def organization_exports_group() -> None:
15
16
  """OrganizationExports commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import PortfolioMembershipsApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("portfolio-memberships")
14
+ @click.group("portfolio-memberships", cls=GroupWithGlobalOptions)
14
15
  def portfolio_memberships_group() -> None:
15
16
  """PortfolioMemberships commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import PortfoliosApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("portfolios")
14
+ @click.group("portfolios", cls=GroupWithGlobalOptions)
14
15
  def portfolios_group() -> None:
15
16
  """Portfolios commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import ProjectBriefsApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("project-briefs")
14
+ @click.group("project-briefs", cls=GroupWithGlobalOptions)
14
15
  def project_briefs_group() -> None:
15
16
  """ProjectBriefs commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import ProjectMembershipsApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("project-memberships")
14
+ @click.group("project-memberships", cls=GroupWithGlobalOptions)
14
15
  def project_memberships_group() -> None:
15
16
  """ProjectMemberships commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import ProjectPortfolioSettingsApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("project-portfolio-settings")
14
+ @click.group("project-portfolio-settings", cls=GroupWithGlobalOptions)
14
15
  def project_portfolio_settings_group() -> None:
15
16
  """ProjectPortfolioSettings commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import ProjectStatusesApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("project-statuses")
14
+ @click.group("project-statuses", cls=GroupWithGlobalOptions)
14
15
  def project_statuses_group() -> None:
15
16
  """ProjectStatuses commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import ProjectTemplatesApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("project-templates")
14
+ @click.group("project-templates", cls=GroupWithGlobalOptions)
14
15
  def project_templates_group() -> None:
15
16
  """ProjectTemplates commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import ProjectsApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("projects")
14
+ @click.group("projects", cls=GroupWithGlobalOptions)
14
15
  def projects_group() -> None:
15
16
  """Projects commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import RatesApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("rates")
14
+ @click.group("rates", cls=GroupWithGlobalOptions)
14
15
  def rates_group() -> None:
15
16
  """Rates commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import ReactionsApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("reactions")
14
+ @click.group("reactions", cls=GroupWithGlobalOptions)
14
15
  def reactions_group() -> None:
15
16
  """Reactions commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import RolesApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("roles")
14
+ @click.group("roles", cls=GroupWithGlobalOptions)
14
15
  def roles_group() -> None:
15
16
  """Roles commands."""
16
17
 
@@ -6,11 +6,12 @@ from typing import Any
6
6
  import click
7
7
  from asana import RulesApi
8
8
 
9
+ from asana_api_cli.click_ext import GroupWithGlobalOptions
9
10
  from asana_api_cli.formatter import formatted
10
11
  from asana_api_cli.session import AsanaSession, resolve_body, resolve_workspace
11
12
 
12
13
 
13
- @click.group("rules")
14
+ @click.group("rules", cls=GroupWithGlobalOptions)
14
15
  def rules_group() -> None:
15
16
  """Rules commands."""
16
17