Use cYAML if it is available in Python. (#2010)

This commit is contained in:
Todd Gamblin 2016-10-12 18:25:18 -07:00 committed by GitHub
parent b27f4e3aeb
commit d861a52ebe
3 changed files with 21 additions and 4 deletions

View file

@ -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)

View file

@ -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:

View file

@ -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