def read_yaml(yaml_path): import yaml import re with open(yaml_path, mode='r') as f: try: # use SafeLoader's over Loader to prevent against arbitrary python object execution # Use C loaders if possible, faster from yaml import CSafeLoader as Loader # CLoader except ImportError: from yaml import SafeLoader as Loader # Loader _mapping_tag = yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG def dict_constructor(loader, node): return OrderedDict(loader.construct_pairs(node)) Loader.add_constructor(_mapping_tag, dict_constructor) # compiled resolver to correctly parse scientific notation numbers Loader.add_implicit_resolver( u'tag:yaml.org,2002:float', re.compile(u'''^(?: [-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+]?[0-9]+)? |[-+]?(?:[0-9][0-9_]*)(?:[eE][-+]?[0-9]+) |\\.[0-9_]+(?:[eE][-+]?[0-9]+)? |[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]* |[-+]?\\.(?:inf|Inf|INF) |\\.(?:nan|NaN|NAN))$''', re.X), list(u'-+0123456789.')) return yaml.load(f, Loader=Loader)
from yaml import SafeLoader as Loader #pragma: no cover from hepdata_validator import LATEST_SCHEMA_VERSION from hepdata_validator.submission_file_validator import SubmissionFileValidator from hepdata_validator.data_file_validator import DataFileValidator from hepdata_converter.parsers import Parser, ParsedData, Table import os, re # Allow for a bug in PyYAML where numbers like 1e+04 are parsed as strings not as floats. # See https://stackoverflow.com/a/30462009 # Try replacing PyYAML by ruamel.yaml in future? Loader.add_implicit_resolver( u'tag:yaml.org,2002:float', re.compile( u'''^(?: [-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+]?[0-9]+)? |[-+]?(?:[0-9][0-9_]*)(?:[eE][-+]?[0-9]+) |\\.[0-9_]+(?:[eE][-+][0-9]+)? |[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]* |[-+]?\\.(?:inf|Inf|INF) |\\.(?:nan|NaN|NAN))$''', re.X), list(u'-+0123456789.')) class YAML(Parser): help = 'Parses New HEPData YAML format. Input parameter should be path to ' \ 'the directory where submission.yaml file ' \ 'is present (or direct filepath to the submission.yaml file)' def __init__(self, *args, **kwargs): super(YAML, self).__init__(*args, **kwargs) self.validator_schema_version = kwargs.get('validator_schema_version', LATEST_SCHEMA_VERSION)