From c05afbb95e3344257a0f0902c6b28fa6c95e4e6b Mon Sep 17 00:00:00 2001 From: rapsealk Date: Tue, 3 Dec 2024 17:27:43 +0900 Subject: [PATCH 1/5] feat: Add representer to `enum.StrEnum` --- lib/yaml/representer.py | 8 +++++++- tests/test_dump_load.py | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/yaml/representer.py b/lib/yaml/representer.py index 808ca06df..c0778f2d5 100644 --- a/lib/yaml/representer.py +++ b/lib/yaml/representer.py @@ -5,7 +5,7 @@ from .error import * from .nodes import * -import datetime, copyreg, types, base64, collections +import datetime, copyreg, types, base64, collections, sys class RepresenterError(YAMLError): pass @@ -236,6 +236,12 @@ def represent_undefined(self, data): SafeRepresenter.add_representer(str, SafeRepresenter.represent_str) +if sys.version_info >= (3, 11): + from enum import StrEnum + + SafeRepresenter.add_multi_representer(StrEnum, + SafeRepresenter.represent_str) + SafeRepresenter.add_representer(bytes, SafeRepresenter.represent_binary) diff --git a/tests/test_dump_load.py b/tests/test_dump_load.py index 8c4352bd1..b84d7654f 100644 --- a/tests/test_dump_load.py +++ b/tests/test_dump_load.py @@ -1,3 +1,5 @@ +import sys + import pytest import yaml @@ -13,3 +15,15 @@ def test_load_no_loader(): def test_load_safeloader(): assert yaml.load("- foo\n", Loader=yaml.SafeLoader) + + +def test_dump_str_enum(): + if sys.version_info < (3, 11): + return + + from enum import StrEnum + + class ContentType(StrEnum): + YAML = "YAML" + + assert yaml.load(yaml.dump(ContentType.YAML, Dumper=yaml.SafeDumper), Loader=yaml.SafeLoader) == ContentType.YAML From 0cbe6382afb4a0e77e2639d54dafe1cb4d7a1199 Mon Sep 17 00:00:00 2001 From: Jeongseok Kang Date: Wed, 4 Dec 2024 16:07:31 +0900 Subject: [PATCH 2/5] Update representer.py --- lib/yaml/representer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/yaml/representer.py b/lib/yaml/representer.py index c0778f2d5..80f8870e9 100644 --- a/lib/yaml/representer.py +++ b/lib/yaml/representer.py @@ -145,7 +145,7 @@ def represent_none(self, data): return self.represent_scalar('tag:yaml.org,2002:null', 'null') def represent_str(self, data): - return self.represent_scalar('tag:yaml.org,2002:str', data) + return self.represent_scalar('tag:yaml.org,2002:str', str(data)) def represent_binary(self, data): if hasattr(base64, 'encodebytes'): From 33bd7333b3ac1266267abe11e70d0f9ce31fe79b Mon Sep 17 00:00:00 2001 From: Jeongseok Kang Date: Fri, 30 May 2025 09:57:45 +0900 Subject: [PATCH 3/5] Update test_dump_load.py --- tests/test_dump_load.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/test_dump_load.py b/tests/test_dump_load.py index b84d7654f..1cbcc9d6f 100644 --- a/tests/test_dump_load.py +++ b/tests/test_dump_load.py @@ -17,13 +17,11 @@ def test_load_safeloader(): assert yaml.load("- foo\n", Loader=yaml.SafeLoader) +@pytest.mark.skipif(sys.version_info < (3, 11), reason="Requires Python 3.11 or higher") def test_dump_str_enum(): - if sys.version_info < (3, 11): - return - from enum import StrEnum class ContentType(StrEnum): YAML = "YAML" - assert yaml.load(yaml.dump(ContentType.YAML, Dumper=yaml.SafeDumper), Loader=yaml.SafeLoader) == ContentType.YAML + assert yaml.safe_load(yaml.safe_dump(ContentType.YAML)) == ContentType.YAML From 7417023cdcb0614700cc8f5e2a1bfece85628d90 Mon Sep 17 00:00:00 2001 From: Jeongseok Kang Date: Fri, 30 May 2025 13:26:22 +0900 Subject: [PATCH 4/5] Update representer.py --- lib/yaml/representer.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/yaml/representer.py b/lib/yaml/representer.py index 80f8870e9..fbcc2bb1f 100644 --- a/lib/yaml/representer.py +++ b/lib/yaml/representer.py @@ -7,6 +7,10 @@ import datetime, copyreg, types, base64, collections, sys +if sys.version_info >= (3, 11): + from enum import IntEnum StrEnum + + class RepresenterError(YAMLError): pass @@ -33,6 +37,9 @@ def represent(self, data): def represent_data(self, data): if self.ignore_aliases(data): self.alias_key = None + if sys.version_info >= (3, 11): + if isinstance(data, (IntEnum, StrEnum)): + data = data.value else: self.alias_key = id(data) if self.alias_key is not None: @@ -145,7 +152,7 @@ def represent_none(self, data): return self.represent_scalar('tag:yaml.org,2002:null', 'null') def represent_str(self, data): - return self.represent_scalar('tag:yaml.org,2002:str', str(data)) + return self.represent_scalar('tag:yaml.org,2002:str', data) def represent_binary(self, data): if hasattr(base64, 'encodebytes'): @@ -236,12 +243,6 @@ def represent_undefined(self, data): SafeRepresenter.add_representer(str, SafeRepresenter.represent_str) -if sys.version_info >= (3, 11): - from enum import StrEnum - - SafeRepresenter.add_multi_representer(StrEnum, - SafeRepresenter.represent_str) - SafeRepresenter.add_representer(bytes, SafeRepresenter.represent_binary) From 8571ecfd0f0b0b573974b8d6e4931c7934d545dc Mon Sep 17 00:00:00 2001 From: Jeongseok Kang Date: Fri, 30 May 2025 13:45:39 +0900 Subject: [PATCH 5/5] Update representer.py --- lib/yaml/representer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/yaml/representer.py b/lib/yaml/representer.py index fbcc2bb1f..601ed6304 100644 --- a/lib/yaml/representer.py +++ b/lib/yaml/representer.py @@ -8,7 +8,7 @@ import datetime, copyreg, types, base64, collections, sys if sys.version_info >= (3, 11): - from enum import IntEnum StrEnum + from enum import IntEnum, StrEnum class RepresenterError(YAMLError):