Skip to content

Add new connectors (Phase 3)#54

Open
hallvictoria wants to merge 14 commits into
mainfrom
hallvictoria/add-connectors-p3
Open

Add new connectors (Phase 3)#54
hallvictoria wants to merge 14 commits into
mainfrom
hallvictoria/add-connectors-p3

Conversation

@hallvictoria

@hallvictoria hallvictoria commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

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 under src/azure/connectors/*.py are committed unedited.

Updates dataverse connector (commondataservice).

Fixes: https://github.com/Azure/azure-functions-bucees-planning/issues/1149
Addresses cloudmersiveconvert, docuware, and signinghub connectors from #56

Paired Generator PR

Changes

Connector Module
Universal Print azure.connectors.universalprint
Azure Event Grid azure.connectors.azureeventgrid
Azure IoT Central azure.connectors.azureiotcentral
Cloudmersive Document Conversion azure.connectors.cloudmersiveconvert
Fin & Ops Apps (Dynamics 365) azure.connectors.dynamicsax
PDF.co azure.connectors.pdfco
Plumsail Documents azure.connectors.plumsail
SQL Server azure.connectors.sql
Zendesk azure.connectors.zendesk
Pipedrive azure.connectors.pipedrive
Docuware azure.connectors.docuware
Signing Hub azure.connectors.signinghub
Dataverse azure.connectors.commondataservice

Testing

  • Unit tests added/updated
  • All existing tests pass (pytest)
  • Linting passes (flake8 src/ tests/)
  • Manual testing (describe below if applicable)

Checklist

  • Code follows the project's coding conventions
  • No modifications to generated connector files in src/azure/connectors/*.py (unless regenerated)
  • Type hints added to all public API signatures
  • Documentation updated (if behavior changed)
  • CHANGELOG.md updated (if user-facing change)

@hallvictoria
hallvictoria marked this pull request as ready for review July 14, 2026 22:06
@hallvictoria
hallvictoria requested a review from a team as a code owner July 14, 2026 22:06
@hallvictoria
hallvictoria requested a review from Copilot July 15, 2026 14:50

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 from azure.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.

Comment thread src/azure/connectors/pdfco.py Outdated
Comment thread tests/test_pdfco.py Outdated

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 37 out of 41 changed files in this pull request and generated 4 comments.

Comment thread src/azure/connectors/universalprint.py
Comment thread src/azure/connectors/zendesk.py
Comment thread src/azure/connectors/zendesk.py
Comment thread CHANGELOG.md
@hallvictoria

Copy link
Copy Markdown
Contributor Author

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

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[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

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[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.

Comment thread src/azure/connectors/azureeventgrid.py Outdated
def connector_name(self) -> str:
return "azureeventgrid"

async def create_subscription_async(

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[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.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[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.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[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='')}"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants