Skip to content

Commit a5394c0

Browse files
ingydotnetperlpunk
authored andcommitted
Add custom constructors to multiple loaders
When someone writes a subclass of the YAMLObject class, the constructors will now be added to all 3 (non-safe) loaders. Furthermore, we support the class variable `yaml_loader` being a list, offering more control of which loaders are affected. To support safe_load in your custom class you could add this: yaml_loader = yaml.SafeLoader yaml_loader = yaml.YAMLObject.yaml_loader yaml_loader.append(yaml.SafeLoader)
1 parent 8d7a780 commit a5394c0

2 files changed

Lines changed: 14 additions & 4 deletions

File tree

lib/yaml/__init__.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,12 @@ class YAMLObjectMetaclass(type):
381381
def __init__(cls, name, bases, kwds):
382382
super(YAMLObjectMetaclass, cls).__init__(name, bases, kwds)
383383
if 'yaml_tag' in kwds and kwds['yaml_tag'] is not None:
384-
cls.yaml_loader.add_constructor(cls.yaml_tag, cls.from_yaml)
384+
if isinstance(cls.yaml_loader, list):
385+
for loader in cls.yaml_loader:
386+
loader.add_constructor(cls.yaml_tag, cls.from_yaml)
387+
else:
388+
cls.yaml_loader.add_constructor(cls.yaml_tag, cls.from_yaml)
389+
385390
cls.yaml_dumper.add_representer(cls, cls.to_yaml)
386391

387392
class YAMLObject(object):
@@ -393,7 +398,7 @@ class YAMLObject(object):
393398
__metaclass__ = YAMLObjectMetaclass
394399
__slots__ = () # no direct instantiation, so allow immutable subclasses
395400

396-
yaml_loader = Loader
401+
yaml_loader = [Loader, FullLoader, UnsafeLoader]
397402
yaml_dumper = Dumper
398403

399404
yaml_tag = None

lib3/yaml/__init__.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,12 @@ class YAMLObjectMetaclass(type):
378378
def __init__(cls, name, bases, kwds):
379379
super(YAMLObjectMetaclass, cls).__init__(name, bases, kwds)
380380
if 'yaml_tag' in kwds and kwds['yaml_tag'] is not None:
381-
cls.yaml_loader.add_constructor(cls.yaml_tag, cls.from_yaml)
381+
if isinstance(cls.yaml_loader, list):
382+
for loader in cls.yaml_loader:
383+
loader.add_constructor(cls.yaml_tag, cls.from_yaml)
384+
else:
385+
cls.yaml_loader.add_constructor(cls.yaml_tag, cls.from_yaml)
386+
382387
cls.yaml_dumper.add_representer(cls, cls.to_yaml)
383388

384389
class YAMLObject(metaclass=YAMLObjectMetaclass):
@@ -389,7 +394,7 @@ class YAMLObject(metaclass=YAMLObjectMetaclass):
389394

390395
__slots__ = () # no direct instantiation, so allow immutable subclasses
391396

392-
yaml_loader = Loader
397+
yaml_loader = [Loader, FullLoader, UnsafeLoader]
393398
yaml_dumper = Dumper
394399

395400
yaml_tag = None

0 commit comments

Comments
 (0)