From 224a795b2c47eaf563c0bea5bbfbc2e086ce253b Mon Sep 17 00:00:00 2001 From: Anish Mehta Date: Thu, 15 Oct 2026 17:01:05 +0530 Subject: [PATCH] fix(serialization-text): parse "none" as the None_ enum member TextParseNode capitalized the raw value to find the enum member, so "none" looked up "None", which Python enums cannot use. Generated enums name that member None_, and the text writer writes it as "none", so it did not round-trip and raised "Invalid key". Map it the same way JsonParseNode does. --- .../text/kiota_serialization_text/text_parse_node.py | 6 +++++- .../text/tests/unit/test_text_parse_node.py | 11 +++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/serialization/text/kiota_serialization_text/text_parse_node.py b/packages/serialization/text/kiota_serialization_text/text_parse_node.py index cb6819f4..3b1f3cb7 100644 --- a/packages/serialization/text/kiota_serialization_text/text_parse_node.py +++ b/packages/serialization/text/kiota_serialization_text/text_parse_node.py @@ -160,7 +160,11 @@ def get_enum_value(self, enum_class: K) -> Optional[K]: raw_key = self.get_str_value() camel_case_key = None if raw_key: - camel_case_key = raw_key[0].upper() + raw_key[1:] + if raw_key.lower() == "none": + # None is a reserved keyword in python + camel_case_key = "None_" + else: + camel_case_key = raw_key[0].upper() + raw_key[1:] if camel_case_key: try: return enum_class[camel_case_key] # type: ignore diff --git a/packages/serialization/text/tests/unit/test_text_parse_node.py b/packages/serialization/text/tests/unit/test_text_parse_node.py index db34dee1..0480261b 100644 --- a/packages/serialization/text/tests/unit/test_text_parse_node.py +++ b/packages/serialization/text/tests/unit/test_text_parse_node.py @@ -1,5 +1,6 @@ import json from datetime import date, datetime, time, timedelta +from enum import Enum from uuid import UUID import pytest @@ -114,6 +115,16 @@ def test_get_enum_value(): assert result == OfficeLocation.Dunhill +def test_get_enum_value_none_member(): + class RiskLevel(Enum): + Low = "low" + None_ = "none" + + parse_node = TextParseNode("none") + result = parse_node.get_enum_value(RiskLevel) + assert result == RiskLevel.None_ + + def test_get_object_value(sample_structured_data): with pytest.raises(Exception) as e_info: parse_node = TextParseNode(sample_structured_data)