Use cYAML if it is available in Python. (#2010)
This commit is contained in:
parent
b27f4e3aeb
commit
d861a52ebe
3 changed files with 21 additions and 4 deletions
10
bin/spack
10
bin/spack
|
@ -40,6 +40,16 @@ SPACK_PREFIX = os.path.dirname(os.path.dirname(SPACK_FILE))
|
||||||
# Allow spack libs to be imported in our scripts
|
# Allow spack libs to be imported in our scripts
|
||||||
SPACK_LIB_PATH = os.path.join(SPACK_PREFIX, "lib", "spack")
|
SPACK_LIB_PATH = os.path.join(SPACK_PREFIX, "lib", "spack")
|
||||||
sys.path.insert(0, SPACK_LIB_PATH)
|
sys.path.insert(0, SPACK_LIB_PATH)
|
||||||
|
|
||||||
|
# Try to use system YAML if it is available, as it might have libyaml
|
||||||
|
# support (for faster loading via C). Load it before anything in
|
||||||
|
# lib/spack/external so it will take precedence over Spack's PyYAML.
|
||||||
|
try:
|
||||||
|
import yaml
|
||||||
|
except ImportError:
|
||||||
|
pass # ignore and use slow yaml
|
||||||
|
|
||||||
|
# Add external libs
|
||||||
SPACK_EXTERNAL_LIBS = os.path.join(SPACK_LIB_PATH, "external")
|
SPACK_EXTERNAL_LIBS = os.path.join(SPACK_LIB_PATH, "external")
|
||||||
sys.path.insert(0, SPACK_EXTERNAL_LIBS)
|
sys.path.insert(0, SPACK_EXTERNAL_LIBS)
|
||||||
|
|
||||||
|
|
|
@ -98,7 +98,7 @@
|
||||||
import base64
|
import base64
|
||||||
import hashlib
|
import hashlib
|
||||||
import imp
|
import imp
|
||||||
import sys
|
import ctypes
|
||||||
from StringIO import StringIO
|
from StringIO import StringIO
|
||||||
from operator import attrgetter
|
from operator import attrgetter
|
||||||
|
|
||||||
|
@ -203,6 +203,9 @@
|
||||||
|
|
||||||
legal_deps = tuple(special_types) + alldeps
|
legal_deps = tuple(special_types) + alldeps
|
||||||
|
|
||||||
|
"""Max integer helps avoid passing too large a value to cyaml."""
|
||||||
|
maxint = 2 ** (ctypes.sizeof(ctypes.c_int) * 8 - 1) - 1
|
||||||
|
|
||||||
|
|
||||||
def validate_deptype(deptype):
|
def validate_deptype(deptype):
|
||||||
if isinstance(deptype, str):
|
if isinstance(deptype, str):
|
||||||
|
@ -969,7 +972,7 @@ def dag_hash(self, length=None):
|
||||||
return self._hash[:length]
|
return self._hash[:length]
|
||||||
else:
|
else:
|
||||||
yaml_text = syaml.dump(
|
yaml_text = syaml.dump(
|
||||||
self.to_node_dict(), default_flow_style=True, width=sys.maxint)
|
self.to_node_dict(), default_flow_style=True, width=maxint)
|
||||||
sha = hashlib.sha1(yaml_text)
|
sha = hashlib.sha1(yaml_text)
|
||||||
b32_hash = base64.b32encode(sha.digest()).lower()[:length]
|
b32_hash = base64.b32encode(sha.digest()).lower()[:length]
|
||||||
if self.concrete:
|
if self.concrete:
|
||||||
|
|
|
@ -32,6 +32,10 @@
|
||||||
|
|
||||||
"""
|
"""
|
||||||
import yaml
|
import yaml
|
||||||
|
try:
|
||||||
|
from yaml import CLoader as Loader, CDumper as Dumper
|
||||||
|
except ImportError as e:
|
||||||
|
from yaml import Loader, Dumper
|
||||||
from yaml.nodes import *
|
from yaml.nodes import *
|
||||||
from yaml.constructor import ConstructorError
|
from yaml.constructor import ConstructorError
|
||||||
from ordereddict_backport import OrderedDict
|
from ordereddict_backport import OrderedDict
|
||||||
|
@ -64,7 +68,7 @@ def mark(obj, node):
|
||||||
obj._end_mark = node.end_mark
|
obj._end_mark = node.end_mark
|
||||||
|
|
||||||
|
|
||||||
class OrderedLineLoader(yaml.Loader):
|
class OrderedLineLoader(Loader):
|
||||||
"""YAML loader that preserves order and line numbers.
|
"""YAML loader that preserves order and line numbers.
|
||||||
|
|
||||||
Mappings read in by this loader behave like an ordered dict.
|
Mappings read in by this loader behave like an ordered dict.
|
||||||
|
@ -156,7 +160,7 @@ def construct_mapping(self, node, deep=False):
|
||||||
u'tag:yaml.org,2002:str', OrderedLineLoader.construct_yaml_str)
|
u'tag:yaml.org,2002:str', OrderedLineLoader.construct_yaml_str)
|
||||||
|
|
||||||
|
|
||||||
class OrderedLineDumper(yaml.Dumper):
|
class OrderedLineDumper(Dumper):
|
||||||
"""Dumper that preserves ordering and formats ``syaml_*`` objects.
|
"""Dumper that preserves ordering and formats ``syaml_*`` objects.
|
||||||
|
|
||||||
This dumper preserves insertion ordering ``syaml_dict`` objects
|
This dumper preserves insertion ordering ``syaml_dict`` objects
|
||||||
|
|
Loading…
Reference in a new issue