* Vendor ruamel.yaml v0.17.21 * Add unit test for whitespace regression * Add an abstraction layer in Spack to wrap ruamel.yaml All YAML operations are routed through spack.util.spack_yaml The custom classes have been adapted to the new ruamel.yaml class hierarchy. Fixed line annotation issue in "spack config blame"
48 lines
1.3 KiB
Python
48 lines
1.3 KiB
Python
# coding: utf-8
|
|
|
|
"""
|
|
You cannot subclass bool, and this is necessary for round-tripping anchored
|
|
bool values (and also if you want to preserve the original way of writing)
|
|
|
|
bool.__bases__ is type 'int', so that is what is used as the basis for ScalarBoolean as well.
|
|
|
|
You can use these in an if statement, but not when testing equivalence
|
|
"""
|
|
|
|
from ruamel.yaml.anchor import Anchor
|
|
|
|
if False: # MYPY
|
|
from typing import Text, Any, Dict, List # NOQA
|
|
|
|
__all__ = ['ScalarBoolean']
|
|
|
|
|
|
class ScalarBoolean(int):
|
|
def __new__(cls, *args, **kw):
|
|
# type: (Any, Any, Any) -> Any
|
|
anchor = kw.pop('anchor', None)
|
|
b = int.__new__(cls, *args, **kw)
|
|
if anchor is not None:
|
|
b.yaml_set_anchor(anchor, always_dump=True)
|
|
return b
|
|
|
|
@property
|
|
def anchor(self):
|
|
# type: () -> Any
|
|
if not hasattr(self, Anchor.attrib):
|
|
setattr(self, Anchor.attrib, Anchor())
|
|
return getattr(self, Anchor.attrib)
|
|
|
|
def yaml_anchor(self, any=False):
|
|
# type: (bool) -> Any
|
|
if not hasattr(self, Anchor.attrib):
|
|
return None
|
|
if any or self.anchor.always_dump:
|
|
return self.anchor
|
|
return None
|
|
|
|
def yaml_set_anchor(self, value, always_dump=False):
|
|
# type: (Any, bool) -> None
|
|
self.anchor.value = value
|
|
self.anchor.always_dump = always_dump
|