pushmetrics-cli 0.1.0__py3-none-any.whl

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 (86) hide show
  1. pm/__init__.py +1 -0
  2. pm/__main__.py +4 -0
  3. pm/_alias.py +164 -0
  4. pm/auth/__init__.py +0 -0
  5. pm/auth/device_flow.py +187 -0
  6. pm/auth/exchange.py +79 -0
  7. pm/auth/jwt_cache.py +163 -0
  8. pm/auth/secret_files.py +58 -0
  9. pm/auth/session.py +440 -0
  10. pm/auth/store.py +160 -0
  11. pm/auth/token.py +289 -0
  12. pm/cli.py +282 -0
  13. pm/client/__init__.py +68 -0
  14. pm/client/access_tokens.py +54 -0
  15. pm/client/base.py +229 -0
  16. pm/client/blocks.py +461 -0
  17. pm/client/databases.py +147 -0
  18. pm/client/favorites.py +14 -0
  19. pm/client/folders.py +10 -0
  20. pm/client/integrations.py +14 -0
  21. pm/client/organizations.py +20 -0
  22. pm/client/recipients.py +92 -0
  23. pm/client/reports.py +148 -0
  24. pm/client/roles.py +100 -0
  25. pm/client/runs.py +134 -0
  26. pm/client/saved_blocks.py +13 -0
  27. pm/client/tableau.py +108 -0
  28. pm/client/users.py +71 -0
  29. pm/client/webhooks.py +43 -0
  30. pm/client/workspaces.py +34 -0
  31. pm/commands/__init__.py +0 -0
  32. pm/commands/_block_factory.py +762 -0
  33. pm/commands/_helpers.py +178 -0
  34. pm/commands/auth.py +222 -0
  35. pm/commands/block.py +26 -0
  36. pm/commands/chart.py +20 -0
  37. pm/commands/db.py +291 -0
  38. pm/commands/email.py +13 -0
  39. pm/commands/explore.py +20 -0
  40. pm/commands/favorites.py +77 -0
  41. pm/commands/folders.py +113 -0
  42. pm/commands/help.py +643 -0
  43. pm/commands/integrations.py +95 -0
  44. pm/commands/metrics_view.py +195 -0
  45. pm/commands/organizations.py +56 -0
  46. pm/commands/recipient.py +226 -0
  47. pm/commands/reports.py +364 -0
  48. pm/commands/roles.py +102 -0
  49. pm/commands/runs.py +214 -0
  50. pm/commands/saved_blocks.py +97 -0
  51. pm/commands/sftp.py +19 -0
  52. pm/commands/slack.py +13 -0
  53. pm/commands/slides.py +216 -0
  54. pm/commands/sql.py +17 -0
  55. pm/commands/tableau.py +148 -0
  56. pm/commands/token.py +107 -0
  57. pm/commands/users.py +262 -0
  58. pm/commands/webhooks.py +132 -0
  59. pm/commands/workspace.py +156 -0
  60. pm/config.py +192 -0
  61. pm/errors.py +228 -0
  62. pm/log.py +63 -0
  63. pm/models/__init__.py +31 -0
  64. pm/models/access_tokens.py +25 -0
  65. pm/models/blocks.py +21 -0
  66. pm/models/databases.py +15 -0
  67. pm/models/favorites.py +14 -0
  68. pm/models/folders.py +14 -0
  69. pm/models/integrations.py +20 -0
  70. pm/models/organizations.py +13 -0
  71. pm/models/recipients.py +41 -0
  72. pm/models/reports.py +16 -0
  73. pm/models/roles.py +22 -0
  74. pm/models/runs.py +56 -0
  75. pm/models/saved_blocks.py +15 -0
  76. pm/models/users.py +36 -0
  77. pm/models/webhooks.py +23 -0
  78. pm/models/workspaces.py +16 -0
  79. pm/output.py +92 -0
  80. pm/types.py +130 -0
  81. pm/validators.py +499 -0
  82. pushmetrics_cli-0.1.0.dist-info/METADATA +221 -0
  83. pushmetrics_cli-0.1.0.dist-info/RECORD +86 -0
  84. pushmetrics_cli-0.1.0.dist-info/WHEEL +5 -0
  85. pushmetrics_cli-0.1.0.dist-info/entry_points.txt +2 -0
  86. pushmetrics_cli-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,221 @@
1
+ Metadata-Version: 2.4
2
+ Name: pushmetrics-cli
3
+ Version: 0.1.0
4
+ Summary: Command-line interface for PushMetrics
5
+ Requires-Python: >=3.9
6
+ Description-Content-Type: text/markdown
7
+ Requires-Dist: click>=8.1
8
+ Requires-Dist: requests>=2.31
9
+ Requires-Dist: keyring>=24.0
10
+ Requires-Dist: pydantic>=2.0
11
+ Requires-Dist: tomli>=2.0; python_version < "3.11"
12
+ Provides-Extra: dev
13
+ Requires-Dist: pytest>=7.0; extra == "dev"
14
+ Requires-Dist: responses>=0.23; extra == "dev"
15
+ Requires-Dist: ruff>=0.6; extra == "dev"
16
+ Requires-Dist: build>=1.0; extra == "dev"
17
+ Requires-Dist: setuptools>=68; extra == "dev"
18
+ Requires-Dist: wheel; extra == "dev"
19
+ Requires-Dist: pyyaml>=6; extra == "dev"
20
+
21
+ # PushMetrics CLI (`pm`)
22
+
23
+ `pm` is the command-line client for [PushMetrics](https://pushmetrics.io). It talks to the same REST API the web app uses, with the same permissions: you see the reports, databases and users you have access to, in one workspace, nothing more.
24
+
25
+ Use it to run and debug reports, keep report definitions in git, feed CI pipelines, or give an AI coding agent a scriptable handle on your workspace. Every command has a `--json` mode.
26
+
27
+ The complete user guide is on the website: [PushMetrics CLI](https://pushmetrics.io/docs/admin/cli/).
28
+
29
+ ## Install
30
+
31
+ > **PLACEHOLDER (D1).** The install command depends on the distribution channel and is filled in at release time.
32
+
33
+ ```bash
34
+ # PLACEHOLDER (D1): install command goes here
35
+ pm --version
36
+ ```
37
+
38
+ Requires Python 3.9 or newer. Runs on macOS, Linux and Windows.
39
+
40
+ ## Quick start
41
+
42
+ 1. In the PushMetrics app, open **Settings → Access Tokens** (`/a/tokens`), click **New token**, and copy the `pmpat_...` value. It is shown once, and it is bound to the workspace that was active when you created it.
43
+ 2. Log in with the token. `pm` reads it from a hidden prompt, or from stdin when piped, and stores it in your OS credential store:
44
+
45
+ ```bash
46
+ pm login --token
47
+ pm whoami
48
+ ```
49
+
50
+ 3. Use it:
51
+
52
+ ```bash
53
+ pm report list
54
+ pm report get <report-uid>
55
+ pm report run <report-uid> --send-to-me
56
+ pm run list --last-days 2 --status failed
57
+ pm run logs <run-uid> --level ERROR
58
+ pm report list --json
59
+ ```
60
+
61
+ In CI, skip `pm login` and set `PM_API_TOKEN` instead.
62
+
63
+ > **PLACEHOLDER (D2).** Browser login (`pm login` without `--token`, Auth0 device flow) is documented here only if it ships in the first release.
64
+
65
+ ## Commands
66
+
67
+ `pm --help` lists every command. `pm <group> --help` lists a group's actions, `pm <group> <action> --help` the options, and `pm help <group>` shows a compact page with examples.
68
+
69
+ ```
70
+ Account:
71
+ login Log in with a personal access token.
72
+ logout Log out and forget the stored token or session.
73
+ whoami Show who you are logged in as, and the workspace.
74
+ token Personal access tokens for API / CLI authentication.
75
+ config Profiles: which PushMetrics server pm talks to.
76
+
77
+ Commands:
78
+ block Blocks of any type.
79
+ chart Charts (Plotly blocks).
80
+ database Databases, their schemas and tables.
81
+ email Email blocks.
82
+ explore Explore blocks (saved data views).
83
+ favorite Your favorite reports and other objects.
84
+ folder Folders that organize reports.
85
+ help Show compact help for a group, with examples.
86
+ integration Connected services (Slack, Tableau, Google Drive, ...).
87
+ metrics-view Metrics views (the semantic layer).
88
+ organization Your organization (the owner of workspaces).
89
+ recipient Recipients: who reports are delivered to.
90
+ report Reports and their runs.
91
+ role Roles and groups in the current workspace.
92
+ run Report runs: status, results and logs.
93
+ saved-block Saved blocks (reusable block templates).
94
+ sftp SFTP upload blocks.
95
+ slack Slack message blocks.
96
+ slides Google Slides blocks.
97
+ sql SQL query blocks.
98
+ tableau Tableau view blocks.
99
+ user Users in the current workspace.
100
+ webhook Webhooks that trigger report runs.
101
+ workspace Workspaces you belong to.
102
+ ```
103
+
104
+ The ones most people need:
105
+
106
+ | Command | What it does |
107
+ |---|---|
108
+ | `pm whoami` | Your user and the token's workspace. |
109
+ | `pm report list` | Reports in the workspace. `--name` filters by name, `--limit` caps the rows. |
110
+ | `pm report get <uid>` | One report. Full record with `--json`. |
111
+ | `pm report yaml <uid>` | The report's full YAML configuration, to stdout. |
112
+ | `pm report apply <file> --uid <uid>` | Write a YAML file back to a report. `--dry-run` shows the diff without saving. |
113
+ | `pm report run <uid>` | Start a run and print its uid. `--send-to-me` sends the email blocks to you and skips every other destination; `--email <address>` previews as a saved recipient. |
114
+ | `pm run list` | Recent runs, newest first. `--report <uid>`, `--last-days N`, `--status failed`, `--limit N`. |
115
+ | `pm run get <run-uid>` | A run's status and timing. |
116
+ | `pm run logs <run-uid>` | A run's log lines. `--level ERROR` keeps only errors. |
117
+ | `pm run results <run-uid>` | What each block of the run produced. |
118
+ | `pm token list` / `create <name>` / `revoke <id>` | Manage your personal access tokens. |
119
+ | `pm config list` | Profiles and the environment overrides in effect. |
120
+
121
+ `--json` works before or after the action (`pm --json report list` and `pm report list --json`). Data goes to stdout; messages and errors go to stderr. `pm` exits with `0` on success, `1` when a command fails and `2` when the command line is wrong.
122
+
123
+ ### Global options
124
+
125
+ | Option | Meaning |
126
+ |---|---|
127
+ | `--json` | Print JSON instead of tables. |
128
+ | `--quiet` | Suppress informational messages on stderr. Errors still print. |
129
+ | `-v`, `--verbose` | Log each request, its status and timing to stderr; response bodies on errors only. Tokens are never logged. |
130
+ | `--profile <name>` | Use a profile other than `default`. |
131
+ | `--api-url <url>` | Talk to a different PushMetrics address for one command. |
132
+ | `--version` | Print the version and exit. |
133
+
134
+ ### Environment variables
135
+
136
+ | Variable | Purpose |
137
+ |---|---|
138
+ | `PM_API_TOKEN` | A personal access token. Wins over a token stored by `pm login --token`. For CI and agents. |
139
+ | `PM_PROFILE` | Profile to use when no `--profile` is given. |
140
+ | `PM_API_URL` | Talk to this address instead of the profile's. |
141
+ | `PM_CONFIG_HOME` | Where configuration and fallback credential files live. Default: `~/.pm`. |
142
+
143
+ ## Several workspaces
144
+
145
+ A token works in one workspace. To work in a second one, create a token there and give it its own profile:
146
+
147
+ ```bash
148
+ pm config set acme api_url https://pushmetrics.io
149
+ pm --profile acme login --token
150
+ pm --profile acme report list
151
+ ```
152
+
153
+ `pm workspace switch` is for browser login only; with a token, the token decides the workspace.
154
+
155
+ ## Where credentials live
156
+
157
+ `pm login --token` stores the token in the OS credential store (macOS Keychain, Windows Credential Manager, Linux Secret Service) under the service name `pushmetrics-cli-pat`, one entry per profile. Without a usable credential store it falls back to `~/.pm/tokens.json`, mode `0600`.
158
+
159
+ `pm` also caches the short-lived access token it exchanges from your personal access token, under the service name `pushmetrics-cli-jwt` or in `~/.pm/jwt_cache.json` with mode `0600`.
160
+
161
+ `pm logout` removes both for the active profile. It does not revoke the token on the server; use `pm token revoke` or the Access Tokens page for that.
162
+
163
+ `pm` never takes a token on the command line and never prints one, in `-v` output or in errors. It only sends tokens over `https://`, except to `localhost`.
164
+
165
+ ## Troubleshooting
166
+
167
+ **`Not logged in. Run pm login --token with a personal access token, or set PM_API_TOKEN.`** Nothing stored for the active profile and `PM_API_TOKEN` unset. Tokens are stored per profile: check `pm config list`.
168
+
169
+ **`That does not look like a personal access token…`** What was pasted, piped or set in `PM_API_TOKEN` is not a `pmpat_...` value. Copy it again exactly.
170
+
171
+ **`Personal access token rejected (invalid, expired, or revoked).`** Create a new token and log in again.
172
+
173
+ **`Could not reach https://... (ConnectionError)…`** Network, or the wrong address: `pm config list` shows it.
174
+
175
+ **`Unknown profile: 'acme'…`** or **`Profile 'acme' has no api_url…`** Each message ends with the `pm config set` command that fixes it; see also [Several workspaces](#several-workspaces).
176
+
177
+ **`API ... failed: 403` / `404` with a `Hint:` line.** The hint names the next step: permissions in the token's workspace, or an id that is not visible there.
178
+
179
+ **Anything else.** Re-run with `pm -v ...` and look at the response status and body.
180
+
181
+ The [website guide](https://pushmetrics.io/docs/admin/cli/) lists every error with its fix.
182
+
183
+ ## Contributing
184
+
185
+ The CLI lives in the `cli/` directory of the PushMetrics monorepo and must not import anything from the backend packages (`superset/`, `prefect/`); a test enforces this. To work on it:
186
+
187
+ ```bash
188
+ cd cli
189
+ python -m venv .venv && source .venv/bin/activate
190
+ pip install -e '.[dev]' # contributors only; users install the released package
191
+ pytest tests/ -v
192
+ ruff check .
193
+ ```
194
+
195
+ Tests mock HTTP with the `responses` library and never reach a real backend. `tests/repo_only/` holds tests that read files outside `cli/`, such as `test_docs_commands_exist.py`, which checks every `pm` command written in this README and in the website guide against the real command tree; they run from a checkout and are not shipped in the sdist. CI runs the suite on every pull request that touches `cli/`.
196
+
197
+ When you run a real `pm` process during development, set `PM_CONFIG_HOME` to a scratch directory **and** `PYTHON_KEYRING_BACKEND=keyring.backends.fail.Keyring`. `PM_CONFIG_HOME` alone does not isolate credentials: the OS keyring is keyed by profile name, so a scratch run would read, and `pm logout` would delete, your real stored token.
198
+
199
+ **Adding a resource.** For anything with the standard CRUD shape (`/<resource>/` list, `/<resource>/<uid>` single, plus `POST`/`PUT`/`DELETE`):
200
+
201
+ 1. **Model** in `pm/models/<resource>.py`: a Pydantic `BaseModel` with `extra="allow"`; re-export from `pm/models/__init__.py`.
202
+ 2. **Client** in `pm/client/<resource>.py`: subclass `CrudClient[Model]`, set `base_path` and `model`. Register it on the `PMClient` facade in `pm/client/__init__.py`.
203
+ 3. **Commands** in `pm/commands/<resource>.py`: a `click.group(cls=AliasedGroup, aliases={"ls": "list"})` with `list/get/create/update/delete`; use `parse_data` and `merge_fields` from `pm/commands/_helpers.py` for the `--data '<json>'` pattern. Skip verbs the backend does not support.
204
+ 4. **Wire it** in `pm/cli.py` with `cli.add_command(...)`.
205
+ 5. **Tests** in `tests/test_client_<resource>.py`, asserting on model attributes.
206
+ 6. **Docs**: add the command to the website guide (`website/content/posts/docs/admin/2026-10-12-cli.md`); the docs test fails if a documented command does not exist.
207
+
208
+ Endpoint paths to mirror live in `frontend/src/shared/services/*.ts`; the frontend prefixes everything with `/api/v1`.
209
+
210
+ The `PMClient` facade is reusable from Python without the command layer:
211
+
212
+ ```python
213
+ from pm.client import PMClient
214
+ from pm.config import get_profile
215
+
216
+ client = PMClient.from_profile(get_profile("default"))
217
+ for report in client.reports.list():
218
+ print(report.uid, report.name)
219
+ ```
220
+
221
+ Authentication resolution order inside `PMSession.from_profile`: `PM_API_JWT` (a delegation JWT the PushMetrics AI agent sets, used as-is) > personal access token (`PM_API_TOKEN` or stored, exchanged at `/api/v1/security/exchange` for a short-lived workspace-scoped JWT) > Auth0 session cookies from a browser login. Bearer JWTs carry a `workspace_id` claim that the backend installs as the request's workspace, so a pure Bearer client has full workspace context; cookies are the interactive path only.
@@ -0,0 +1,86 @@
1
+ pm/__init__.py,sha256=kUR5RAFc7HCeiqdlX36dZOHkUI5wI6V_43RpEcD8b-0,22
2
+ pm/__main__.py,sha256=My8A9c5c8Mr3a7gRd3L8-5gC0OlxUg-_sAs4WEAbYFQ,61
3
+ pm/_alias.py,sha256=ubFoqcGf-99vAkX2dU7k0AIZ90ROouDS-HE00Goo5cM,7019
4
+ pm/cli.py,sha256=xhbHw3zVJkv_LafDRXOwe1tNWcg7ucYPe-s_fyz7tYI,9580
5
+ pm/config.py,sha256=xbV_XLLeDiapROdrCj4KZW4SrFAiD9s1hgayt64EO7o,7288
6
+ pm/errors.py,sha256=3amgyB4hy8jsDLZeXvp-u7L_7_-5k5AONawzfhgFF68,8548
7
+ pm/log.py,sha256=Objq2oJ7Xn1k9FeFffZBcmsPcPAsf3o_Gi4NUk4mEug,2058
8
+ pm/output.py,sha256=sJ50Kc3DGD3BvrlNyCWB3K5X3mgs--KqNaozCYaBHpE,2955
9
+ pm/types.py,sha256=Tr3yif30_u-5sEUt8dO-TB11VxPp-VMGsME5P3yv5x4,4460
10
+ pm/validators.py,sha256=Dlh-Q9e-M7keH6abjMlT2u7iB_GNcprUhV6Te1rNoTg,20803
11
+ pm/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ pm/auth/device_flow.py,sha256=qD2IVW2xbmP65WHxD4spKEAGyE7sZ9kfIPDR8Vb5M3w,5647
13
+ pm/auth/exchange.py,sha256=5PjMEni9ypOUP55xb5u5l_YQGMOqvPmWdhic90b_3l4,2584
14
+ pm/auth/jwt_cache.py,sha256=cXfXQXlAtCS349HmRBR-oYXwr9e_tnBScZjlbNYFmXs,6322
15
+ pm/auth/secret_files.py,sha256=STGsM4hFNNV1QA1PXltSldDftViI3ziE2d8zNFHedqA,2250
16
+ pm/auth/session.py,sha256=_Xj2pz20e6Xh3qDwxEnGJenNP_GZRlqlFSiJnzViU5A,19793
17
+ pm/auth/store.py,sha256=h5V550vcl9nS4i6jd8doLeoID1dEc42e3U29wOr2IOU,5433
18
+ pm/auth/token.py,sha256=E07ZzhzS1wOw-jN3gTSFQ5KAZ2Esrm9hGxBypdF2RKk,11425
19
+ pm/client/__init__.py,sha256=u9aLOhy46x7m2m6FqGREq7ZlRmGQWPRvp9AsDcGIXdE,2688
20
+ pm/client/access_tokens.py,sha256=8YskI77NmkKNHxro6N9-ZxlhjoJHceRPCb1sb7FO7T0,2080
21
+ pm/client/base.py,sha256=pylQFVGoB7_yJjb8Q13O2r2yK1IRVddeGu25o5tPpes,9602
22
+ pm/client/blocks.py,sha256=lhVRr7yedE9-cJLjuDj3fMR8TVdL2FyMzH0Gwe68E8U,19775
23
+ pm/client/databases.py,sha256=9MUVSEfKwSlevm75UzJH9cpHAKee415EnP1Cw8FkZ-Q,5848
24
+ pm/client/favorites.py,sha256=hp2Z_euyWx2tWLPXYrlqwRRhprzEVEeL5Ty4rWxrjVg,399
25
+ pm/client/folders.py,sha256=so4gtcm2ebJgX2eCclPI1zJQ00sPEaz2T1ZdJDkbIGY,242
26
+ pm/client/integrations.py,sha256=vHij-yzc1N7Tw0C81gjGCL0ht8ndP3ibUjw12PiBaYE,427
27
+ pm/client/organizations.py,sha256=BOriQDGdA_vh7jpWZ88MPNw3lRvguPAvXOhcnuF41y8,680
28
+ pm/client/recipients.py,sha256=G0G8niHJE0y9SMKkQTfdzEfd_r1cqbE7sjocD6BcguM,4157
29
+ pm/client/reports.py,sha256=3YPvc-K5MKdJPzshmswXVDb2ySjTQX3Krflca5_nEXo,5976
30
+ pm/client/roles.py,sha256=6Xz8lkQCwy6HRoWopWir2TMmCzZfnmqK7Bf-wZYpORc,3655
31
+ pm/client/runs.py,sha256=G6senexffb68xFvBXcphcUnRAY-Pvg2nrIH_RGaxtfU,5324
32
+ pm/client/saved_blocks.py,sha256=3KKvdpfQrvLZ2pvK5I3q40yyfqGHJ47KctemDFdxfJI,343
33
+ pm/client/tableau.py,sha256=cE9Cc6p4v71B4eu_lhrPizwu6fCLr1nrzMrRCHzoc1M,4149
34
+ pm/client/users.py,sha256=2vUr4P4pf3qv2YAnxaYZbEFZubMeHp-g7CQB-sjZ3IY,2727
35
+ pm/client/webhooks.py,sha256=LEOHJC69RjLuALrju48gBhv7OTMDyUpdcV1jkOKnN9I,1661
36
+ pm/client/workspaces.py,sha256=LstcckxgT3bj-V06Mpn7lq6cpuSo3RTLJFPwSRiaFLY,1344
37
+ pm/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
+ pm/commands/_block_factory.py,sha256=vO5GLNljwGr4k_OGdCCsfzdRDfmx_d2IEMu2JEBiE2c,26616
39
+ pm/commands/_helpers.py,sha256=BEJ9-gejIo2mFJYDAGOdCOgwXOxROxaf7-rmHNg0Iw8,6209
40
+ pm/commands/auth.py,sha256=gPYphqxXi5eYb0wKYgWBvc2ZhWMFdxJW2VydUum_g8Q,7524
41
+ pm/commands/block.py,sha256=_-5mo3g-gqRSyV4twzwSitrwaWrUhFdd3hEB7RR2Jto,1081
42
+ pm/commands/chart.py,sha256=DngYL7H-olY5-ieKQRsJOwbn7ZR4QTI3BEEabMz5odo,640
43
+ pm/commands/db.py,sha256=-1vYc9z5BN1_zdtMMmpgam-lg8bEFS4xOWy1dQBXgsY,8002
44
+ pm/commands/email.py,sha256=KTFVjiJR3i0fDUYYPbtjIuiKP4N6AAlwoPt5A7YyylY,317
45
+ pm/commands/explore.py,sha256=gHr_RrqrpRGSKppkrqFLPm1WP0SDuN9gyLjNzS2TDJs,722
46
+ pm/commands/favorites.py,sha256=V3JmuVivyUYkhcU-zMCuhv_FjvOL6w_JF1otr9WGveY,2264
47
+ pm/commands/folders.py,sha256=5sFkrhCiBTTayUzgtqfAgjiiZQLk-1eu_joYAYoE39w,3564
48
+ pm/commands/help.py,sha256=rMz6UOYDfgqtbKm6WFXhlu6YormZhRZdge67oM2-OwY,25450
49
+ pm/commands/integrations.py,sha256=xTnczDyZ5xBht_A9y40FbYZW01rJ4PNLrAk8qiJjNlA,3053
50
+ pm/commands/metrics_view.py,sha256=xLSLVh6MjmJrh_Hg-QNnpKQAru7JrWOqNH80g19Xaqs,6437
51
+ pm/commands/organizations.py,sha256=MvhqbvB-pz6EDryUhwUJT8eCE1FLWS4FmgtG9k4KNQQ,1812
52
+ pm/commands/recipient.py,sha256=7h6lM0QzZnXX46_cZVDBwf-44Aj3qBorulopsOlgqKQ,7400
53
+ pm/commands/reports.py,sha256=7ic95i2Hrbj8NzbI-EHFBxlkl7rb_-1YOo-1V3KOUqs,10701
54
+ pm/commands/roles.py,sha256=1ptAs7MiTjDRHdzyEm8woP-d8lXosJi0YWLV6N0udNg,3030
55
+ pm/commands/runs.py,sha256=JQQKgiTy6eZFwkqNQPmd45YqDkEY5zDbw-uxACdtJuc,5880
56
+ pm/commands/saved_blocks.py,sha256=KHYKPBkN4Pv43Xtk_1t2uFFcI9_Mx75Nf1ezdgZb4G4,2928
57
+ pm/commands/sftp.py,sha256=HNtUgRqnSzlUqz2xHpgODMiaTL2PcWnHpdFJG0sqCfs,597
58
+ pm/commands/slack.py,sha256=efpdNmjEtQlRU-bzSt9-t1Qya2FssfYoWEU8SORlFVc,333
59
+ pm/commands/slides.py,sha256=ZhxQHvz5jvU4wDOAj8641BaTjfynMn7ByGEZP4wNwCE,7532
60
+ pm/commands/sql.py,sha256=8TYyf3paA2i3F9VH0plDQH6MQaeyC3X6-QBWnIlqcC4,445
61
+ pm/commands/tableau.py,sha256=ORfqxrg05sxrYxsbUmwiLWaQA5-222vXLJjcRZiBzxg,4456
62
+ pm/commands/token.py,sha256=HMJQX_D72DzzrfqyJmAkWdL45JNkM_RdOA6xLe0QMAU,3059
63
+ pm/commands/users.py,sha256=6yhmWs-DvOgqUOVinfEZS2tMMwY_TRaOoB-HlfEH7vw,7417
64
+ pm/commands/webhooks.py,sha256=CEVKGY6yyoU1Z3H4qXjp8o4XzXqDr06c_WhFIVDdNC4,4080
65
+ pm/commands/workspace.py,sha256=5b-JBdt9Gf52Yd7j2Z4msWMPVViU5tZ83t0qMJ1TAEI,4008
66
+ pm/models/__init__.py,sha256=QvlJH1J8jgzNPk3hL_nqBSRriFeyVRHaM_uL-50Hm7Y,834
67
+ pm/models/access_tokens.py,sha256=ry1J3kBHYO4axRGK9UpA5cb-Bkbbayve5xYbPHCHX7Q,855
68
+ pm/models/blocks.py,sha256=eVK-7AQ6OKJGNpaAIqgGoW_05w_Amu4swdtfFSkGjsE,612
69
+ pm/models/databases.py,sha256=c-kp6_hmQM_vLjMazlNBDC29Ze1ptXsalbOUfPwk1Ak,360
70
+ pm/models/favorites.py,sha256=jV2yWWZdEePCcBPg7QfP79_X-dZGrIg9zPkZz89FUzw,387
71
+ pm/models/folders.py,sha256=RXEMMzcpYM_Oi_zXzeGxKicCIlT0iK3Ijzv5n66e_-Q,307
72
+ pm/models/integrations.py,sha256=Te3orO7yRGqvwlLxZjqZTlh8K97ykGLmFwsbzkUn-xQ,588
73
+ pm/models/organizations.py,sha256=5rIBdt27-shnf1zsW0zVvKybXR7V0Y2e0tPiMQFvyu0,277
74
+ pm/models/recipients.py,sha256=WBbT0pyZF1h3vGOEO7DfstI0YK8bc0MYHPrnHmlibNM,1479
75
+ pm/models/reports.py,sha256=-3AeYBX_X7Q8y8eMA1RcKe6BwQSBHF0RTjSYRsYDEa0,383
76
+ pm/models/roles.py,sha256=PgIkOHMTNipmWfiTZ0PAYubtxVdZp6S9VuMgPH0ksAg,671
77
+ pm/models/runs.py,sha256=wM5vT1lUV1HVDCbK5-BYtkFoCHIp52ySQ_iLo_xXnvU,1740
78
+ pm/models/saved_blocks.py,sha256=WWA2aE3wWBWAAawiA_xBNzzUSRhoatimnFNld1D3R5A,464
79
+ pm/models/users.py,sha256=Oy6PVdZ6eQBotNI39UHV5c7__B7MD0rz80xc4PZOZ-Q,1399
80
+ pm/models/webhooks.py,sha256=RdfX_iLmD-1e6-l7Pv3YPVz5K6Cg-bN5K37NNKoiMRI,794
81
+ pm/models/workspaces.py,sha256=n6VSA1-N1t8wMM1GRy1A7KQfSmW-TlKpQiECIqzj0ss,469
82
+ pushmetrics_cli-0.1.0.dist-info/METADATA,sha256=NsXc6rHqQLpC9z9xYzuCoSevRcG5Wfm5PcnxmaMxf1A,11691
83
+ pushmetrics_cli-0.1.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
84
+ pushmetrics_cli-0.1.0.dist-info/entry_points.txt,sha256=heeWTw5f41hzT2ZRs6NuT2cJg4NpLc_NZX1mi78M93w,34
85
+ pushmetrics_cli-0.1.0.dist-info/top_level.txt,sha256=EyGjaLlndAMIL4TKnkAuosD9vW0v2Ci2tenil9yD3MU,3
86
+ pushmetrics_cli-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ pm = pm.cli:cli
@@ -0,0 +1 @@
1
+ pm