plugsync-cli 0.7.0__tar.gz → 0.8.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 (47) hide show
  1. plugsync_cli-0.8.0/LICENSE +35 -0
  2. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/PKG-INFO +13 -11
  3. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/README.md +7 -5
  4. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/__init__.py +1 -1
  5. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/client.py +92 -0
  6. plugsync_cli-0.8.0/plugsync_cli/commands/connector.py +659 -0
  7. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/commands/plugin.py +10 -0
  8. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli.egg-info/PKG-INFO +13 -11
  9. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli.egg-info/SOURCES.txt +3 -0
  10. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/pyproject.toml +9 -7
  11. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_api_contract.py +7 -0
  12. plugsync_cli-0.8.0/tests/test_connector_prewarm_commands.py +517 -0
  13. plugsync_cli-0.8.0/tests/test_packaging_license.py +68 -0
  14. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_plugin_commands.py +13 -0
  15. plugsync_cli-0.7.0/plugsync_cli/commands/connector.py +0 -253
  16. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/bundler.py +0 -0
  17. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/commands/__init__.py +0 -0
  18. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/commands/auth.py +0 -0
  19. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/commands/diff.py +0 -0
  20. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/commands/log.py +0 -0
  21. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/commands/preview.py +0 -0
  22. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/commands/pull.py +0 -0
  23. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/commands/push.py +0 -0
  24. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/commands/rollback.py +0 -0
  25. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/commands/validate.py +0 -0
  26. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/compat.py +0 -0
  27. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/config.py +0 -0
  28. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/context.py +0 -0
  29. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/findings.py +0 -0
  30. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/main.py +0 -0
  31. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/schema_defaults.py +0 -0
  32. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/serializer.py +0 -0
  33. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli.egg-info/dependency_links.txt +0 -0
  34. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli.egg-info/entry_points.txt +0 -0
  35. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli.egg-info/requires.txt +0 -0
  36. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli.egg-info/top_level.txt +0 -0
  37. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/setup.cfg +0 -0
  38. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_auth_commands.py +0 -0
  39. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_client.py +0 -0
  40. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_commands.py +0 -0
  41. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_compat.py +0 -0
  42. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_config.py +0 -0
  43. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_connector_commands.py +0 -0
  44. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_e2e_draft_api.py +0 -0
  45. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_hand_edited_yaml.py +0 -0
  46. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_schema_defaults.py +0 -0
  47. {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_serializer.py +0 -0
@@ -0,0 +1,35 @@
1
+ plugsync-cli
2
+ Copyright (c) 2026 Exelab S.r.l. All rights reserved.
3
+
4
+ This package is the plugsync command-line interface (the "CLI"), client
5
+ software distributed by Exelab S.r.l. ("Exelab") for use with the plugsync
6
+ service. It is not open source software.
7
+
8
+ The right to install and use the CLI is granted by paragraph 11.2 of the
9
+ plugsync Terms of Service (the "Terms"), published at:
10
+
11
+ https://plugsync.com/it/terms
12
+
13
+ Paragraph 11.2 of the Terms reads:
14
+
15
+ 11.2 Software client. Per la durata del Contratto Exelab concede al
16
+ Cliente una licenza non esclusiva, non trasferibile e gratuita di
17
+ installare e utilizzare la CLI e il Server MCP al solo fine di utilizzare
18
+ il Servizio, nel rispetto dell'Articolo 6.
19
+
20
+ (Courtesy translation: For the term of the Agreement, Exelab grants the
21
+ Customer a non-exclusive, non-transferable, free-of-charge license to
22
+ install and use the CLI and the MCP Server solely for the purpose of using
23
+ the Service, in compliance with Article 6.)
24
+
25
+ No other right is granted. Exelab remains the sole owner of the CLI and of
26
+ every intellectual property right in it (paragraph 11.1 of the Terms).
27
+ Warranties and liability are governed by the Terms. Capitalised words have
28
+ the meaning given to them in the Terms.
29
+
30
+ The Terms are drafted in Italian, which is the authoritative text; any
31
+ translation, including the one above, is provided as a courtesy only. Where
32
+ this notice and the Terms differ, the Terms prevail.
33
+
34
+ Third-party components that the CLI depends on are distributed under their
35
+ own open source licenses, which continue to govern them.
@@ -1,18 +1,16 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plugsync-cli
3
- Version: 0.7.0
3
+ Version: 0.8.0
4
4
  Summary: Command-line client for plugsync HubSpot connectors -- manage connectors and plugins like code, no repo checkout required
5
5
  Author-email: Exelab <hello@plugsync.com>
6
- License: Proprietary
6
+ License-Expression: LicenseRef-Proprietary
7
7
  Project-URL: Homepage, https://plugsync.com
8
- Project-URL: Documentation, https://github.com/exelab/plugsync/blob/main/docs/content/reference/plugins/dev-loop.md
9
- Project-URL: Repository, https://github.com/exelab/plugsync
10
- Project-URL: Issues, https://github.com/exelab/plugsync/issues
8
+ Project-URL: Documentation, https://docs.plugsync.com/reference/cli/
9
+ Project-URL: Terms of Service, https://plugsync.com/it/terms
11
10
  Keywords: plugsync,hubspot,cli,connectors,integration
12
11
  Classifier: Development Status :: 4 - Beta
13
12
  Classifier: Environment :: Console
14
13
  Classifier: Intended Audience :: Developers
15
- Classifier: License :: Other/Proprietary License
16
14
  Classifier: Operating System :: OS Independent
17
15
  Classifier: Programming Language :: Python :: 3
18
16
  Classifier: Programming Language :: Python :: 3.12
@@ -20,6 +18,7 @@ Classifier: Programming Language :: Python :: 3.13
20
18
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
21
19
  Requires-Python: >=3.12
22
20
  Description-Content-Type: text/markdown
21
+ License-File: LICENSE
23
22
  Requires-Dist: click>=8.1
24
23
  Requires-Dist: httpx>=0.27
25
24
  Requires-Dist: pyyaml>=6.0
@@ -28,6 +27,7 @@ Provides-Extra: dev
28
27
  Requires-Dist: pytest>=8.0; extra == "dev"
29
28
  Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
30
29
  Requires-Dist: respx>=0.21; extra == "dev"
30
+ Dynamic: license-file
31
31
 
32
32
  # plugsync-cli
33
33
 
@@ -91,11 +91,13 @@ against the API at the start of any command that talks to it, warning
91
91
  ## Documentation
92
92
 
93
93
  Full reference docs, including the plugin authoring dev-loop, live at
94
- [docs.plugsync.com](https://docs.plugsync.com) and in the
95
- [plugsync repository](https://github.com/exelab/plugsync/tree/main/docs).
94
+ [docs.plugsync.com](https://docs.plugsync.com).
96
95
 
97
96
  ## License
98
97
 
99
- Proprietary. This CLI talks to the plugsync SaaS API; see
100
- [plugsync.com/terms](https://plugsync.com/terms) for the terms governing use
101
- of the plugsync service.
98
+ Proprietary, not open source. The license to install and use this CLI is
99
+ granted by paragraph 11.2 of the plugsync Terms of Service, published at
100
+ [plugsync.com/it/terms](https://plugsync.com/it/terms): a non-exclusive,
101
+ non-transferable, free-of-charge license, for the term of your plugsync
102
+ agreement, solely for the purpose of using the plugsync service. The
103
+ `LICENSE` file shipped with the package carries the full notice.
@@ -60,11 +60,13 @@ against the API at the start of any command that talks to it, warning
60
60
  ## Documentation
61
61
 
62
62
  Full reference docs, including the plugin authoring dev-loop, live at
63
- [docs.plugsync.com](https://docs.plugsync.com) and in the
64
- [plugsync repository](https://github.com/exelab/plugsync/tree/main/docs).
63
+ [docs.plugsync.com](https://docs.plugsync.com).
65
64
 
66
65
  ## License
67
66
 
68
- Proprietary. This CLI talks to the plugsync SaaS API; see
69
- [plugsync.com/terms](https://plugsync.com/terms) for the terms governing use
70
- of the plugsync service.
67
+ Proprietary, not open source. The license to install and use this CLI is
68
+ granted by paragraph 11.2 of the plugsync Terms of Service, published at
69
+ [plugsync.com/it/terms](https://plugsync.com/it/terms): a non-exclusive,
70
+ non-transferable, free-of-charge license, for the term of your plugsync
71
+ agreement, solely for the purpose of using the plugsync service. The
72
+ `LICENSE` file shipped with the package carries the full notice.
@@ -1,2 +1,2 @@
1
1
  """PluSync CLI — git-like connector management."""
2
- __version__ = "0.7.0"
2
+ __version__ = "0.8.0"
@@ -145,6 +145,98 @@ class PlugSyncClient:
145
145
  r.raise_for_status()
146
146
  return r.json()
147
147
 
148
+ def prewarm_start(
149
+ self,
150
+ connector_id: str,
151
+ *,
152
+ dry_run: bool = False,
153
+ modified_after: str | None = None,
154
+ entities: list[str] | None = None,
155
+ store_id: str | None = None,
156
+ ) -> dict:
157
+ """Start an identity map pre-warm job (#1885), returning the job.
158
+
159
+ The API answers 202 with the job already running in the background;
160
+ progress is read back with `prewarm_get`. `modified_after` is an ISO
161
+ 8601 timestamp with a timezone and turns the run into an incremental
162
+ pass. Unset options are left out of the body so the server defaults
163
+ apply.
164
+ """
165
+ body: dict = {"dry_run": dry_run}
166
+ if modified_after is not None:
167
+ body["modified_after"] = modified_after
168
+ if entities:
169
+ body["entities"] = list(entities)
170
+ if store_id is not None:
171
+ body["store_id"] = store_id
172
+ with self._client() as c:
173
+ r = c.post(
174
+ self._url(f"/connectors/{connector_id}/identity-prewarm"), json=body
175
+ )
176
+ r.raise_for_status()
177
+ return r.json()
178
+
179
+ def prewarm_list(self, connector_id: str) -> list[dict]:
180
+ """The connector's most recent pre-warm jobs, newest first."""
181
+ with self._client() as c:
182
+ r = c.get(self._url(f"/connectors/{connector_id}/identity-prewarm"))
183
+ r.raise_for_status()
184
+ return r.json().get("jobs", [])
185
+
186
+ def prewarm_get(self, connector_id: str, job_id: str) -> dict:
187
+ """One pre-warm job with its per-entity progress."""
188
+ with self._client() as c:
189
+ r = c.get(
190
+ self._url(f"/connectors/{connector_id}/identity-prewarm/{job_id}")
191
+ )
192
+ r.raise_for_status()
193
+ return r.json()
194
+
195
+ def prewarm_findings(
196
+ self,
197
+ connector_id: str,
198
+ job_id: str,
199
+ *,
200
+ finding: str | None = None,
201
+ limit: int = 200,
202
+ offset: int = 0,
203
+ ) -> dict:
204
+ """A page of a job's findings: ambiguous values and conflicting mappings."""
205
+ params: dict = {"limit": limit, "offset": offset}
206
+ if finding is not None:
207
+ params["finding"] = finding
208
+ with self._client() as c:
209
+ r = c.get(
210
+ self._url(
211
+ f"/connectors/{connector_id}/identity-prewarm/{job_id}/findings"
212
+ ),
213
+ params=params,
214
+ )
215
+ r.raise_for_status()
216
+ return r.json()
217
+
218
+ def prewarm_resume(self, connector_id: str, job_id: str) -> dict:
219
+ """Resume an interrupted or failed pre-warm job from its cursor."""
220
+ with self._client() as c:
221
+ r = c.post(
222
+ self._url(
223
+ f"/connectors/{connector_id}/identity-prewarm/{job_id}/resume"
224
+ )
225
+ )
226
+ r.raise_for_status()
227
+ return r.json()
228
+
229
+ def prewarm_cancel(self, connector_id: str, job_id: str) -> dict:
230
+ """Cancel a pre-warm job for good: it cannot be resumed afterwards."""
231
+ with self._client() as c:
232
+ r = c.post(
233
+ self._url(
234
+ f"/connectors/{connector_id}/identity-prewarm/{job_id}/cancel"
235
+ )
236
+ )
237
+ r.raise_for_status()
238
+ return r.json()
239
+
148
240
  def get_draft(self, connector_id: str) -> dict:
149
241
  """The connector's editable config (backend DraftResponse).
150
242