Closed
[python] Fix Python preprocess handling for numeric YAML scalars#11143
Conversation
Co-authored-by: msyyc <70930885+msyyc@users.noreply.github.com>
Co-authored-by: msyyc <70930885+msyyc@users.noreply.github.com>
Co-authored-by: msyyc <70930885+msyyc@users.noreply.github.com>
Copilot
AI
changed the title
[WIP] Fix AttributeError in preprocess update_description
Fix Python preprocess handling for numeric YAML scalars
Jul 2, 2026
msyyc
reviewed
Jul 2, 2026
Co-authored-by: msyyc <70930885+msyyc@users.noreply.github.com>
Co-authored-by: msyyc <70930885+msyyc@users.noreply.github.com>
Co-authored-by: msyyc <70930885+msyyc@users.noreply.github.com>
commit: |
Contributor
|
All changed packages have been documented.
Show changes
|
|
You can try these changes here
|
Contributor
|
move to #11162 |
msyyc
added a commit
to msyyc/typespec
that referenced
this pull request
Jul 3, 2026
The emitter force-quoting fix makes the non-string description/enum-name handling from microsoft#11143 unnecessary, so revert those pygen changes and their tests, leaving a focused emitter-only fix. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
live1206
pushed a commit
to live1206/typespec
that referenced
this pull request
Jul 7, 2026
…crosoft#11162) fix microsoft#11138 ## Problem For a date-like TypeSpec label such as: ```typespec union ApiVersion { string; `2020-01-01`: "2020-01-01"; } ``` the emitter's `enumName()` correctly computes the enum member name as the string `2020_01_01`. However, the code model is serialized with **js-yaml (YAML 1.2)**, which dumps this scalar **unquoted** (`name: 2020_01_01`). The Python generator then parses the YAML with **PyYAML (YAML 1.1)**, where `2020_01_01` is a valid integer separator syntax, so the name is read back as the integer `20200101` — corrupting the enum member name. This is the underlying root cause behind microsoft#11143. That PR worked around the crash in pygen by reconstructing the name from the enum `value` via regex, rather than fixing the corruption at the source. ## Fix **Emitter (root cause)** — force-quote string scalars when serializing the code model so every string round-trips faithfully through PyYAML: - Added a shared `dumpCodeModelToYaml()` helper (`forceQuotes: true, quotingType: '"'`) in `external-process.ts`, used by both the node and pyodide serialization paths. **pygen (defensive)** — simplified enum value name handling to a plain `str()` coercion so the generator stays robust to any scalar, letting the existing digit → `ENUM_` prefixing produce `ENUM_2020_01_01`. ## Tests - New emitter unit test (`emitter/test/external-process.test.ts`) asserting ambiguous scalars are quoted and round-trip as strings. - Updated pygen unit tests covering both the happy path (string `2021_01_01` → `ENUM_2021_01_01`) and the defensive fallback (int `20210101` → `ENUM_20210101`). Verified end-to-end: emitter dump → PyYAML load now yields the string `'2020_01_01'` (previously `int 20200101`). Emitter vitest (4 passed) and pygen pytest (16 passed) green. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
tadelesh
pushed a commit
that referenced
this pull request
Jul 9, 2026
…1162) fix #11138 ## Problem For a date-like TypeSpec label such as: ```typespec union ApiVersion { string; `2020-01-01`: "2020-01-01"; } ``` the emitter's `enumName()` correctly computes the enum member name as the string `2020_01_01`. However, the code model is serialized with **js-yaml (YAML 1.2)**, which dumps this scalar **unquoted** (`name: 2020_01_01`). The Python generator then parses the YAML with **PyYAML (YAML 1.1)**, where `2020_01_01` is a valid integer separator syntax, so the name is read back as the integer `20200101` — corrupting the enum member name. This is the underlying root cause behind #11143. That PR worked around the crash in pygen by reconstructing the name from the enum `value` via regex, rather than fixing the corruption at the source. ## Fix **Emitter (root cause)** — force-quote string scalars when serializing the code model so every string round-trips faithfully through PyYAML: - Added a shared `dumpCodeModelToYaml()` helper (`forceQuotes: true, quotingType: '"'`) in `external-process.ts`, used by both the node and pyodide serialization paths. **pygen (defensive)** — simplified enum value name handling to a plain `str()` coercion so the generator stays robust to any scalar, letting the existing digit → `ENUM_` prefixing produce `ENUM_2020_01_01`. ## Tests - New emitter unit test (`emitter/test/external-process.test.ts`) asserting ambiguous scalars are quoted and round-trip as strings. - Updated pygen unit tests covering both the happy path (string `2021_01_01` → `ENUM_2021_01_01`) and the defensive fallback (int `20210101` → `ENUM_20210101`). Verified end-to-end: emitter dump → PyYAML load now yields the string `'2020_01_01'` (previously `int 20200101`). Emitter vitest (4 passed) and pygen pytest (16 passed) green. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The Python client preprocessor could crash when TypeSpec union enum values emitted numeric YAML scalars, e.g. date-like backtick labels. Numeric descriptions hit
rstrip, and numeric enum value names hit snake-case conversion.Preprocess normalization
Regression coverage
This now preprocesses without raising
AttributeErrororTypeErrorfrom Python string helpers.