Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Fixed

- **Extensible enum member normalization collision now handled correctly** — the generator had two related defects. *(1) Normalization collision*: when two distinct swagger enum wire values normalize to the same C# identifier (for example, `Etc/GMT+4` and `Etc/GMT-4` both → `EtcGMT4` after stripping sign characters), the second Swagger-order claimant was silently dropped and the identifier was assigned to whichever value appeared first, irrespective of alphabetic order. *(2) Reserved name collision*: when a swagger value normalized to a mandatory struct member name (`Equals`, `GetHashCode`, `ToString`), the generator emitted a property with that name, which shadowed the required override method and produced CS0102 duplicate-definition compile errors. The hardened two-phase assignment (AzureUX-BPM commits d5cb672..07b2718, PR 16971205) pre-scans natural names in phase 1, then in phase 2 assigns in deterministic sorted order so the alphabetically-first wire value keeps the unsuffixed name (`Etc/GMT+4` → `EtcGMT4`) and each subsequent claimant receives a numeric suffix (`Etc/GMT-4` → `EtcGMT42`); reserved names are instead suffixed with `Value`. An empirical scan of all 100 checked-in connector clients against the frozen 2026-08-28 ARM swagger snapshot (cache manifest SHA256 `ED9C3FB8911D0F28C8D5038CE33ABEE38F7265D186249C8C66CC5C4B7B7CF2C8`) found one connector with active normalization collisions in the current swagger: Plumsail (Timezone enum). Plumsail is regenerated; the remaining 99 clients are unchanged. ([#181](https://github.com/Azure/Connectors-NET-SDK/issues/181))

The eleven connectors named in the original issue as affected by the reserved-name variant of this bug (Blackbaudaltruconsti, Blackbaudcrmconstitu, Dataflows, Documentscorepackapi, Dynamicssmbsaas, Etsy, Iaconnectmsoffice, Meisterplan, Powerassist, Tabscannerreceiptocr, Workpoint365) are no longer present in the current ARM connector catalog and their swagger is not in the frozen cache; Etsy is present in the catalog but its current swagger carries no reserved-name collision. No reserved-name collision was found in any of the 97 currently-generated connectors.

### Breaking Changes

- **Plumsail Timezone enum: seven members now map to positive-offset wire values** — the pre-fix generator assigned the unsuffixed name (`EtcGMT2`…`EtcGMT9`, `EtcGMT11`) to whichever swagger value appeared first, which happened to be the `-N` (negative-offset) value for most entries. The fix assigns based on sorted wire value, so `+N` (lower ASCII, sorts first) now owns the clean identifier. Callers using `EtcGMT2`, `EtcGMT3`, `EtcGMT4`, `EtcGMT7`, `EtcGMT8`, `EtcGMT9`, or `EtcGMT11` should verify they are using the intended timezone direction and rename usages if necessary. The new suffixed members (`EtcGMT22`, `EtcGMT32`, `EtcGMT42`, `EtcGMT72`, `EtcGMT82`, `EtcGMT92`, `EtcGMT112`) now expose the previously silently-dropped negative-offset wire values. Additionally, `EtcGMT6`, `EtcGMT5`, `EtcGMT10`, `EtcGMT1`, `EtcGMT0`, and `Gmt0` acquire new discriminated siblings (`EtcGMT62`, `EtcGMT52`, `EtcGMT102`, `EtcGMT15`, `EtcGMT02`/`EtcGMT03`, `Gmt02`/`Gmt03`) for values that were previously dropped. ([#181](https://github.com/Azure/Connectors-NET-SDK/issues/181))

- **Google Tasks and PDF.co operation name typos corrected** — `CraeteTaskAsync` is now `CreateTaskAsync`, and `PDFSerarchTextAsync` is now `PDFSearchTextAsync`. PDF.co callers must also rename `PDFSerarchTextInput` and the corresponding model-factory method to `PDFSearchTextInput`. Connector routes and wire payload names are unchanged.

<!-- MAINTAINER NOTE: release_notes.md continuously mirrors this [Unreleased]
Expand Down
8 changes: 8 additions & 0 deletions release_notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,16 @@

### Unreleased

#### Fixed

- **Extensible enum member normalization collision now handled correctly** — the generator had two related defects. *(1) Normalization collision*: when two distinct swagger enum wire values normalize to the same C# identifier (for example, `Etc/GMT+4` and `Etc/GMT-4` both → `EtcGMT4` after stripping sign characters), the second Swagger-order claimant was silently dropped and the identifier was assigned to whichever value appeared first, irrespective of alphabetic order. *(2) Reserved name collision*: when a swagger value normalized to a mandatory struct member name (`Equals`, `GetHashCode`, `ToString`), the generator emitted a property with that name, which shadowed the required override method and produced CS0102 duplicate-definition compile errors. The hardened two-phase assignment (AzureUX-BPM commits d5cb672..07b2718, PR 16971205) pre-scans natural names in phase 1, then in phase 2 assigns in deterministic sorted order so the alphabetically-first wire value keeps the unsuffixed name (`Etc/GMT+4` → `EtcGMT4`) and each subsequent claimant receives a numeric suffix (`Etc/GMT-4` → `EtcGMT42`); reserved names are instead suffixed with `Value`. An empirical scan of all 100 checked-in connector clients against the frozen 2026-08-28 ARM swagger snapshot (cache manifest SHA256 `ED9C3FB8911D0F28C8D5038CE33ABEE38F7265D186249C8C66CC5C4B7B7CF2C8`) found one connector with active normalization collisions in the current swagger: Plumsail (Timezone enum). Plumsail is regenerated; the remaining 99 clients are unchanged. ([#181](https://github.com/Azure/Connectors-NET-SDK/issues/181))

The eleven connectors named in the original issue as affected by the reserved-name variant of this bug (Blackbaudaltruconsti, Blackbaudcrmconstitu, Dataflows, Documentscorepackapi, Dynamicssmbsaas, Etsy, Iaconnectmsoffice, Meisterplan, Powerassist, Tabscannerreceiptocr, Workpoint365) are no longer present in the current ARM connector catalog and their swagger is not in the frozen cache; Etsy is present in the catalog but its current swagger carries no reserved-name collision. No reserved-name collision was found in any of the 97 currently-generated connectors.

#### Breaking Changes

- **Plumsail Timezone enum: seven members now map to positive-offset wire values** — the pre-fix generator assigned the unsuffixed name (`EtcGMT2`…`EtcGMT9`, `EtcGMT11`) to whichever swagger value appeared first, which happened to be the `-N` (negative-offset) value for most entries. The fix assigns based on sorted wire value, so `+N` (lower ASCII, sorts first) now owns the clean identifier. Callers using `EtcGMT2`, `EtcGMT3`, `EtcGMT4`, `EtcGMT7`, `EtcGMT8`, `EtcGMT9`, or `EtcGMT11` should verify they are using the intended timezone direction and rename usages if necessary. The new suffixed members (`EtcGMT22`, `EtcGMT32`, `EtcGMT42`, `EtcGMT72`, `EtcGMT82`, `EtcGMT92`, `EtcGMT112`) now expose the previously silently-dropped negative-offset wire values. Additionally, `EtcGMT6`, `EtcGMT5`, `EtcGMT10`, `EtcGMT1`, `EtcGMT0`, and `Gmt0` acquire new discriminated siblings (`EtcGMT62`, `EtcGMT52`, `EtcGMT102`, `EtcGMT15`, `EtcGMT02`/`EtcGMT03`, `Gmt02`/`Gmt03`) for values that were previously dropped. ([#181](https://github.com/Azure/Connectors-NET-SDK/issues/181))

- **Google Tasks and PDF.co operation name typos corrected** — `CraeteTaskAsync` is now `CreateTaskAsync`, and `PDFSerarchTextAsync` is now `PDFSearchTextAsync`. PDF.co callers must also rename `PDFSerarchTextInput` and the corresponding model-factory method to `PDFSearchTextInput`. Connector routes and wire payload names are unchanged.

### 0.14.0-preview.1 (2026-08-12)
Expand Down
62 changes: 55 additions & 7 deletions src/Azure.Connectors.Sdk/Generated/PlumsailExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3301,7 +3301,7 @@ public SizeJsonConverter() { }
public static Timezone AsiaMuscat { get; } = new("Asia/Muscat");

/// <summary>Etc/GMT-4</summary>
public static Timezone EtcGMT4 { get; } = new("Etc/GMT-4");
public static Timezone EtcGMT42 { get; } = new("Etc/GMT-4");

/// <summary>Asia/Baghdad</summary>
public static Timezone AsiaBaghdad { get; } = new("Asia/Baghdad");
Expand Down Expand Up @@ -3450,6 +3450,9 @@ public SizeJsonConverter() { }
/// <summary>Indian/Chagos</summary>
public static Timezone IndianChagos { get; } = new("Indian/Chagos");

/// <summary>Etc/GMT-6</summary>
public static Timezone EtcGMT62 { get; } = new("Etc/GMT-6");

/// <summary>America/Cuiaba</summary>
public static Timezone AmericaCuiaba { get; } = new("America/Cuiaba");

Expand Down Expand Up @@ -3508,7 +3511,7 @@ public SizeJsonConverter() { }
public static Timezone PacificEfate { get; } = new("Pacific/Efate");

/// <summary>Etc/GMT-11</summary>
public static Timezone EtcGMT11 { get; } = new("Etc/GMT-11");
public static Timezone EtcGMT112 { get; } = new("Etc/GMT-11");

/// <summary>America/Mexico_City</summary>
public static Timezone AmericaMexicoCity { get; } = new("America/Mexico_City");
Expand Down Expand Up @@ -3613,7 +3616,7 @@ public SizeJsonConverter() { }
public static Timezone IndianMayotte { get; } = new("Indian/Mayotte");

/// <summary>Etc/GMT-3</summary>
public static Timezone EtcGMT3 { get; } = new("Etc/GMT-3");
public static Timezone EtcGMT32 { get; } = new("Etc/GMT-3");

/// <summary>Australia/Brisbane</summary>
public static Timezone AustraliaBrisbane { get; } = new("Australia/Brisbane");
Expand Down Expand Up @@ -4011,6 +4014,9 @@ public SizeJsonConverter() { }
/// <summary>America/Paramaribo</summary>
public static Timezone AmericaParamaribo { get; } = new("America/Paramaribo");

/// <summary>Etc/GMT+3</summary>
public static Timezone EtcGMT3 { get; } = new("Etc/GMT+3");

/// <summary>America/Bogota</summary>
public static Timezone AmericaBogota { get; } = new("America/Bogota");

Expand Down Expand Up @@ -4125,6 +4131,9 @@ public SizeJsonConverter() { }
/// <summary>America/St_Thomas</summary>
public static Timezone AmericaStThomas { get; } = new("America/St_Thomas");

/// <summary>Etc/GMT+4</summary>
public static Timezone EtcGMT4 { get; } = new("Etc/GMT+4");

/// <summary>Asia/Bangkok</summary>
public static Timezone AsiaBangkok { get; } = new("Asia/Bangkok");

Expand All @@ -4150,7 +4159,7 @@ public SizeJsonConverter() { }
public static Timezone AsiaSaigon { get; } = new("Asia/Saigon");

/// <summary>Etc/GMT-7</summary>
public static Timezone EtcGMT7 { get; } = new("Etc/GMT-7");
public static Timezone EtcGMT72 { get; } = new("Etc/GMT-7");

/// <summary>America/Miquelon</summary>
public static Timezone AmericaMiquelon { get; } = new("America/Miquelon");
Expand Down Expand Up @@ -4186,7 +4195,7 @@ public SizeJsonConverter() { }
public static Timezone AsiaManila { get; } = new("Asia/Manila");

/// <summary>Etc/GMT-8</summary>
public static Timezone EtcGMT8 { get; } = new("Etc/GMT-8");
public static Timezone EtcGMT82 { get; } = new("Etc/GMT-8");

/// <summary>Africa/Johannesburg</summary>
public static Timezone AfricaJohannesburg { get; } = new("Africa/Johannesburg");
Expand Down Expand Up @@ -4222,7 +4231,7 @@ public SizeJsonConverter() { }
public static Timezone AfricaHarare { get; } = new("Africa/Harare");

/// <summary>Etc/GMT-2</summary>
public static Timezone EtcGMT2 { get; } = new("Etc/GMT-2");
public static Timezone EtcGMT22 { get; } = new("Etc/GMT-2");

/// <summary>Africa/Juba</summary>
public static Timezone AfricaJuba { get; } = new("Africa/Juba");
Expand Down Expand Up @@ -4261,7 +4270,7 @@ public SizeJsonConverter() { }
public static Timezone AsiaDili { get; } = new("Asia/Dili");

/// <summary>Etc/GMT-9</summary>
public static Timezone EtcGMT9 { get; } = new("Etc/GMT-9");
public static Timezone EtcGMT92 { get; } = new("Etc/GMT-9");

/// <summary>Asia/Tomsk</summary>
public static Timezone AsiaTomsk { get; } = new("Asia/Tomsk");
Expand Down Expand Up @@ -4302,6 +4311,12 @@ public SizeJsonConverter() { }
/// <summary>America/Hermosillo</summary>
public static Timezone AmericaHermosillo { get; } = new("America/Hermosillo");

/// <summary>Etc/GMT+7</summary>
public static Timezone EtcGMT7 { get; } = new("Etc/GMT+7");

/// <summary>Etc/GMT-12</summary>
public static Timezone EtcGMT122 { get; } = new("Etc/GMT-12");

/// <summary>Pacific/Tarawa</summary>
public static Timezone PacificTarawa { get; } = new("Pacific/Tarawa");

Expand Down Expand Up @@ -4338,18 +4353,30 @@ public SizeJsonConverter() { }
/// <summary>Etc/GMT</summary>
public static Timezone EtcGMT { get; } = new("Etc/GMT");

/// <summary>Etc/GMT+2</summary>
public static Timezone EtcGMT2 { get; } = new("Etc/GMT+2");

/// <summary>America/Noronha</summary>
public static Timezone AmericaNoronha { get; } = new("America/Noronha");

/// <summary>Atlantic/South_Georgia</summary>
public static Timezone AtlanticSouthGeorgia { get; } = new("Atlantic/South_Georgia");

/// <summary>Etc/GMT+8</summary>
public static Timezone EtcGMT8 { get; } = new("Etc/GMT+8");

/// <summary>Pacific/Pitcairn</summary>
public static Timezone PacificPitcairn { get; } = new("Pacific/Pitcairn");

/// <summary>Etc/GMT+9</summary>
public static Timezone EtcGMT9 { get; } = new("Etc/GMT+9");

/// <summary>Pacific/Gambier</summary>
public static Timezone PacificGambier { get; } = new("Pacific/Gambier");

/// <summary>Etc/GMT+11</summary>
public static Timezone EtcGMT11 { get; } = new("Etc/GMT+11");

/// <summary>Pacific/Pago_Pago</summary>
public static Timezone PacificPagoPago { get; } = new("Pacific/Pago_Pago");

Expand Down Expand Up @@ -4416,6 +4443,9 @@ public SizeJsonConverter() { }
/// <summary>Africa/Tunis</summary>
public static Timezone AfricaTunis { get; } = new("Africa/Tunis");

/// <summary>Etc/GMT-1</summary>
public static Timezone EtcGMT15 { get; } = new("Etc/GMT-1");

/// <summary>Europe/Berlin</summary>
public static Timezone EuropeBerlin { get; } = new("Europe/Berlin");

Expand Down Expand Up @@ -4509,6 +4539,9 @@ public SizeJsonConverter() { }
/// <summary>Asia/Samarkand</summary>
public static Timezone AsiaSamarkand { get; } = new("Asia/Samarkand");

/// <summary>Etc/GMT-5</summary>
public static Timezone EtcGMT52 { get; } = new("Etc/GMT-5");

/// <summary>Asia/Hebron</summary>
public static Timezone AsiaHebron { get; } = new("Asia/Hebron");

Expand All @@ -4530,6 +4563,9 @@ public SizeJsonConverter() { }
/// <summary>Pacific/Saipan</summary>
public static Timezone PacificSaipan { get; } = new("Pacific/Saipan");

/// <summary>Etc/GMT-10</summary>
public static Timezone EtcGMT102 { get; } = new("Etc/GMT-10");

/// <summary>Asia/Yakutsk</summary>
public static Timezone AsiaYakutsk { get; } = new("Asia/Yakutsk");

Expand Down Expand Up @@ -4851,6 +4887,12 @@ public SizeJsonConverter() { }
/// <summary>Etc/GMT+0</summary>
public static Timezone EtcGMT0 { get; } = new("Etc/GMT+0");

/// <summary>Etc/GMT-0</summary>
public static Timezone EtcGMT02 { get; } = new("Etc/GMT-0");

/// <summary>Etc/GMT0</summary>
public static Timezone EtcGMT03 { get; } = new("Etc/GMT0");

/// <summary>Etc/Greenwich</summary>
public static Timezone EtcGreenwich { get; } = new("Etc/Greenwich");

Expand All @@ -4860,6 +4902,12 @@ public SizeJsonConverter() { }
/// <summary>GMT+0</summary>
public static Timezone Gmt0 { get; } = new("GMT+0");

/// <summary>GMT-0</summary>
public static Timezone Gmt02 { get; } = new("GMT-0");

/// <summary>GMT0</summary>
public static Timezone Gmt03 { get; } = new("GMT0");

/// <summary>Greenwich</summary>
public static Timezone Greenwich { get; } = new("Greenwich");

Expand Down
Loading
Loading