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.
- plugsync_cli-0.8.0/LICENSE +35 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/PKG-INFO +13 -11
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/README.md +7 -5
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/__init__.py +1 -1
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/client.py +92 -0
- plugsync_cli-0.8.0/plugsync_cli/commands/connector.py +659 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/commands/plugin.py +10 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli.egg-info/PKG-INFO +13 -11
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli.egg-info/SOURCES.txt +3 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/pyproject.toml +9 -7
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_api_contract.py +7 -0
- plugsync_cli-0.8.0/tests/test_connector_prewarm_commands.py +517 -0
- plugsync_cli-0.8.0/tests/test_packaging_license.py +68 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_plugin_commands.py +13 -0
- plugsync_cli-0.7.0/plugsync_cli/commands/connector.py +0 -253
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/bundler.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/commands/__init__.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/commands/auth.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/commands/diff.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/commands/log.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/commands/preview.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/commands/pull.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/commands/push.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/commands/rollback.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/commands/validate.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/compat.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/config.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/context.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/findings.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/main.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/schema_defaults.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli/serializer.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli.egg-info/dependency_links.txt +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli.egg-info/entry_points.txt +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli.egg-info/requires.txt +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/plugsync_cli.egg-info/top_level.txt +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/setup.cfg +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_auth_commands.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_client.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_commands.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_compat.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_config.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_connector_commands.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_e2e_draft_api.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_hand_edited_yaml.py +0 -0
- {plugsync_cli-0.7.0 → plugsync_cli-0.8.0}/tests/test_schema_defaults.py +0 -0
- {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.
|
|
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://
|
|
9
|
-
Project-URL:
|
|
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)
|
|
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.
|
|
100
|
-
|
|
101
|
-
|
|
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)
|
|
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.
|
|
69
|
-
|
|
70
|
-
|
|
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.
|
|
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
|
|