Add new connectors (Phase 3)#54
Conversation
There was a problem hiding this comment.
Pull request overview
This PR adds a new batch of generated managed-connector clients to the Azure Connectors Python SDK (Phase 3), including unit tests, usage samples, and documentation updates so the new connectors are discoverable and usable end-to-end.
Changes:
- Adds 10 new auto-generated async connector clients under
src/azure/connectors/and exports them fromazure.connectors. - Adds unit tests covering initialization, representative operations, and non-2xx error handling for each new connector.
- Adds sample usage scripts and updates docs (SDK README, samples README, changelog, connection-setup skill) to include the new connectors.
Reviewed changes
Copilot reviewed 32 out of 35 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
src/azure/connectors/universalprint.py |
Generated Universal Print connector client implementation. |
src/azure/connectors/azureeventgrid.py |
Generated Azure Event Grid connector client implementation. |
src/azure/connectors/azureiotcentral.py |
Generated Azure IoT Central connector client implementation. |
src/azure/connectors/cloudmersiveconvert.py |
Generated Cloudmersive Document Conversion connector client implementation. |
src/azure/connectors/dynamicsax.py |
Generated Dynamics 365 Fin & Ops (Dynamics AX) connector client implementation. |
src/azure/connectors/pdfco.py |
Generated PDF.co connector client implementation. |
src/azure/connectors/plumsail.py |
Generated Plumsail Documents connector client implementation. |
src/azure/connectors/sql.py |
Generated SQL Server connector client implementation. |
src/azure/connectors/zendesk.py |
Generated Zendesk connector client implementation. |
src/azure/connectors/pipedrive.py |
Generated Pipedrive connector client implementation. |
src/azure/connectors/__init__.py |
Exports the newly added connector clients from the package root. |
tests/test_universalprint.py |
Unit tests for Universal Print client behaviors and error handling. |
tests/test_azureeventgrid.py |
Unit tests for Azure Event Grid client behaviors and error handling. |
tests/test_azureiotcentral.py |
Unit tests for Azure IoT Central client behaviors and error handling. |
tests/test_cloudmersiveconvert.py |
Unit tests for Cloudmersive Convert client behaviors and error handling. |
tests/test_dynamicsax.py |
Unit tests for Dynamics AX client behaviors and error handling. |
tests/test_pdfco.py |
Unit tests for PDF.co client behaviors (including all-operations smoke coverage). |
tests/test_plumsail.py |
Unit tests for Plumsail client behaviors (including all-operations smoke coverage). |
tests/test_sql.py |
Unit tests for SQL client behaviors plus type/default smoke tests. |
tests/test_zendesk.py |
Unit tests for Zendesk client behaviors and error handling. |
tests/test_pipedrive.py |
Unit tests for Pipedrive client behaviors and error handling. |
samples/sample_connector_usage/sample_connector_usage_universalprint.py |
Usage sample for Universal Print. |
samples/sample_connector_usage/sample_connector_usage_azureeventgrid.py |
Usage sample for Azure Event Grid. |
samples/sample_connector_usage/sample_connector_usage_azureiotcentral.py |
Usage sample for Azure IoT Central. |
samples/sample_connector_usage/sample_connector_usage_cloudmersiveconvert.py |
Usage sample for Cloudmersive Convert. |
samples/sample_connector_usage/sample_connector_usage_dynamicsax.py |
Usage sample for Dynamics AX. |
samples/sample_connector_usage/sample_connector_usage_pdfco.py |
Usage sample for PDF.co. |
samples/sample_connector_usage/sample_connector_usage_plumsail.py |
Usage sample for Plumsail. |
samples/sample_connector_usage/sample_connector_usage_sql.py |
Usage sample for SQL Server. |
samples/sample_connector_usage/sample_connector_usage_zendesk.py |
Usage sample for Zendesk. |
samples/sample_connector_usage/sample_connector_usage_pipedrive.py |
Usage sample for Pipedrive. |
samples/sample_connector_usage/README.md |
Adds the new samples to the samples index table. |
README.md |
Updates the validated connectors table and total supported connector count. |
CHANGELOG.md |
Adds the 10 new connectors under the Unreleased “Added” section. |
.github/skills/connection-setup/SKILL.md |
Adds the new connector names to the supported list in the connection setup skill. |
…zure/connectors-python-sdk into hallvictoria/add-connectors-p3
|
To regen in this PR: signinghub, docuware, cloudmersiveconvert |
| """Url to the input PDF document""" | ||
| annotations_string: Optional[str] = None | ||
| """ | ||
| Annotation strings to be added to the PDF document. Format should be like |
There was a problem hiding this comment.
[Dobby] Non-blocking generation evidence: rebuilding from BPM PR 16445892 with the same connector selection reproduced this file except for docstrings. This PR contains escaped ASCII quotes (for example, "x;y;page;text"), while the current ARM Swagger snapshot contains typographic quotes. The change is documentation-only, but it prevents byte-identical regeneration from a live Swagger fetch. Please preserve a content-addressed Swagger cache for regeneration validation, or normalize typographic punctuation before diffing generated docstrings.
| order: Optional[int] = None | ||
| """ | ||
| Order of the user to which the fields will be assigned automatically. | ||
| Workflow in SigningHub orders recipients. This list begins with \"1\" for |
There was a problem hiding this comment.
[Dobby] Non-blocking generation evidence: rebuilding from BPM PR 16445892 reproduced this file except for docstrings. This PR has escaped ASCII quotes around 1, while the current ARM Swagger snapshot uses typographic quotes and apostrophes. No operation, parameter, or model contract changed; this is source-description drift. A deterministic regeneration check needs a pinned Swagger cache or a documented docstring-normalization policy.
| def connector_name(self) -> str: | ||
| return "azureeventgrid" | ||
|
|
||
| async def create_subscription_async( |
There was a problem hiding this comment.
[Dobby] Public-surface investigation requested: this emits a directly callable create_subscription_async for the non-deprecated, important CreateSubscription Swagger trigger. The .NET client represents the same x-ms-trigger operation as typed OnCreateSubscription trigger configuration/payload metadata rather than an async invocation method; the same representation difference appears for SQL and Zendesk triggers and several other connectors. This is not a naming-convention issue: snake_case is the Azure SDK Python convention. Please determine from the shared trigger/runtime contract whether Python should expose an equivalent typed trigger-registration surface, .NET should expose invocation, or both surfaces are deliberately required. Do not align either language by name alone; record the intended contract and add parity coverage.
There was a problem hiding this comment.
[Dobby] Follow-up from the requested end-to-end investigation: Python snake_case is correct under Azure SDK Python guidelines. The defect is trigger projection, not naming. x-ms-trigger routes are Connector Namespace triggerConfig registrations followed by callback delivery, so I filed #59 for the Python trigger architecture correction and required regression fixture. Separately, Python request serialization must use Swagger JSON wire names rather than asdict snake_case keys; that defect and tests are tracked in #60.
There was a problem hiding this comment.
[Dobby] Additional finding: the .NET side also violates the shared discovery rule for Dynamics AX by exposing internal GetExportableTableAsync and GetExportableTablesAsync as public methods despite their design-time discovery role. That is tracked separately in Azure/Connectors-NET-SDK#214. The required end state is therefore a shared BPM generator contract, not a one-way Python-to-.NET alignment.
| f"{self._connection_runtime_url}" | ||
| f"/v2" | ||
| f"/datasets" | ||
| f"/{quote(str(dataset), safe='')}" |
There was a problem hiding this comment.
Dataset/table path segments look under-encoded here — this 404s against a live Dataverse connection.
The connector routes on /v2/datasets/{org}/tables/{table}/items, where {org} is the environment URL (e.g. https://orgXXXX.crm.dynamics.com) and therefore contains ://. The apihub gateway decodes each path segment once and then normalizes the path, collapsing // → /. So each segment has to be double-encoded to survive routing; single-encoding the dataset (and leaving table unencoded) breaks it.
Repro against a live commondataservice connection, replicating this line exactly (quote(dataset, safe=''), table unencoded):
GET {runtime_url}/v2/datasets/https%3A%2F%2ForgXXXX.crm.dynamics.com/tables/accounts/items?$top=3
→ HTTP 404
{"Message":"No HTTP resource was found that matches the request URI
'.../v2/datasets/https:/orgXXXX.crm.dynamics.com/tables/accounts/items?$top=3'."}
Note the backend sees https:/orgXXXX (single slash) — the // collapsed after one decode. Double-encoding both segments returns 200.
For reference, the .NET SDK (Azure.Connectors.Sdk, CommondataserviceExtensions.GetItemsAsync) double-encodes both segments:
var path = $"/v2/datasets/{Uri.EscapeDataString(Uri.EscapeDataString(environment))}/tables/{Uri.EscapeDataString(Uri.EscapeDataString(tableName))}/items";Suggested fix (nested quote):
f"/{quote(quote(str(dataset), safe=''), safe='')}"
...
f"/{quote(quote(str(table), safe=''), safe='')}"The same single-encode-dataset / unencoded-table pattern repeats in the other dataset operations in this file (get_item, post_item, patch_item, get_on_new_items, get_on_updated_items, etc.), so they'd need the same change.
Description
Adds 12 new managed-connector clients to the Azure Connectors Python SDK, generated from ARM API swagger via the
CodefulSdkGenerator(--pythonDirectClient). Each connector ships with a typed async client, unit tests, a usage sample, and documentation updates. Generated connector files undersrc/azure/connectors/*.pyare committed unedited.Updates dataverse connector (commondataservice).
Fixes: https://github.com/Azure/azure-functions-bucees-planning/issues/1149
Addresses
cloudmersiveconvert,docuware, andsigninghubconnectors from #56Paired Generator PR
Changes
Testing
pytest)flake8 src/ tests/)Checklist
src/azure/connectors/*.py(unless regenerated)