Пример #1
0
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)
Пример #2
0
    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)