コード例 #1
0
ファイル: yaml_merge.py プロジェクト: bbenshab/yamlpath
def merge_multidoc(yaml_file, yaml_editor, log, merger, merger_primed):
    """Merge all documents within a multi-document source."""
    exit_state = 0
    for (yaml_data, doc_loaded) in Parsers.get_yaml_multidoc_data(
        yaml_editor, log, yaml_file
    ):
        if not doc_loaded:
            # An error message has already been logged
            exit_state = 3
            break
        try:
            if merger_primed:
                merger.merge_with(yaml_data)
            else:
                merger.data = yaml_data
                merger_primed = True
        except MergeException as mex:
            log.error(mex)
            exit_state = 6
            break
        except YAMLPathException as yex:
            log.error(yex)
            exit_state = 7
            break

    log.debug("yaml_merge::merge_multidoc:  Reporting status, {}."
              .format(exit_state))
    return exit_state
コード例 #2
0
    def test_get_yaml_multidoc_data_literally(self, quiet_logger):
        serialized_yaml = """---
document: 1st
has: data
...
---
document: 2nd
has: different data
"""
        yaml = Parsers.get_yaml_editor()
        doc_id = 0
        for (data, loaded) in Parsers.get_yaml_multidoc_data(yaml,
                                                             quiet_logger,
                                                             serialized_yaml,
                                                             literal=True):
            assert loaded == True
            if doc_id == 0:
                document = "1st"
                has = "data"
            else:
                document = "2nd"
                has = "different data"
            doc_id = doc_id + 1

            assert data["document"] == document
            assert data["has"] == has
コード例 #3
0
ファイル: yaml_validate.py プロジェクト: wwkimball/yamlpath
def process_file(log, yaml, yaml_file):
    """Process a (potentially multi-doc) YAML file."""
    logcap = LogErrorCap()
    subdoc_index = 0
    exit_state = 0
    file_name = "STDIN" if yaml_file.strip() == "-" else yaml_file
    for (_,
         doc_loaded) in Parsers.get_yaml_multidoc_data(yaml, logcap,
                                                       yaml_file):
        if doc_loaded:
            log.verbose("{}/{} is valid.".format(file_name, subdoc_index))
        else:
            # An error message has been captured
            exit_state = 2
            log.info("{}/{} is invalid due to:".format(file_name,
                                                       subdoc_index))
            for line in logcap.lines:
                log.info("  * {}".format(line))
        logcap.lines.clear()
        subdoc_index += 1

    return exit_state
コード例 #4
0
def get_doc_mergers(
    log: ConsolePrinter, yaml_editor: YAML, config: MergerConfig,
    yaml_file: str
) -> Tuple[List[Merger], bool]:
    """Create a list of Mergers, one for each source document."""
    docs_loaded = True
    if yaml_file != "-" and not isfile(yaml_file):
        log.error("Not a file:  {}".format(yaml_file))
        return ([], False)

    doc_mergers: List[Merger] = []
    for (yaml_data, doc_loaded) in Parsers.get_yaml_multidoc_data(
        yaml_editor, log, yaml_file
    ):
        if not doc_loaded:
            # An error message has already been logged
            doc_mergers.clear()
            docs_loaded = False
            break

        doc_mergers.append(Merger(log, yaml_data, config))

    return (doc_mergers, docs_loaded)
コード例 #5
0
ファイル: yaml_diff.py プロジェクト: wwkimball/yamlpath
def get_docs(log, yaml_editor, yaml_file):
    """Get all documents from a YAML/JSON/Compatible file."""
    docs_loaded = True
    docs = []
    if yaml_file != "-" and not isfile(yaml_file):
        log.error("File not found:  {}".format(yaml_file))
        return ([], False)

    for (yaml_data,
         doc_loaded) in Parsers.get_yaml_multidoc_data(yaml_editor, log,
                                                       yaml_file):
        if not doc_loaded:
            # An error message has already been logged
            docs.clear()
            docs_loaded = False
            break

        if (not isinstance(yaml_data, (list, dict))
                and len(str(yaml_data)) < 1):
            yaml_data = None

        docs.append(yaml_data)

    return (docs, docs_loaded)
コード例 #6
0
ファイル: yaml_paths.py プロジェクト: bbenshab/yamlpath
def process_yaml_file(
    args, yaml, log, yaml_file, processor, search_values, search_keys,
    include_key_aliases, include_value_aliases, file_tally = 0
):
    """Process a (potentially multi-doc) YAML file."""
    # Try to open the file
    exit_state = 0
    subdoc_index = -1

    # pylint: disable=too-many-nested-blocks
    for (yaml_data, doc_loaded) in Parsers.get_yaml_multidoc_data(
        yaml, log, yaml_file
    ):
        file_tally += 1
        subdoc_index += 1
        if not doc_loaded:
            # An error message has already been logged
            exit_state = 3
            continue

        # Process all searches
        processor.data = yaml_data
        yaml_paths = []
        for expression in args.search:
            exterm = get_search_term(log, expression)
            log.debug(("yaml_paths::process_yaml_file:"
                    + "converting search expression '{}' into '{}'"
                    ).format(expression, exterm))
            if exterm is None:
                exit_state = 1
                continue

            for result in search_for_paths(
                    log, processor, yaml_data, exterm, args.pathsep,
                    search_values=search_values, search_keys=search_keys,
                    search_anchors=args.refnames,
                    include_key_aliases=include_key_aliases,
                    include_value_aliases=include_value_aliases,
                    decrypt_eyaml=args.decrypt,
                    expand_children=args.expand):
                # Record only unique results
                add_entry = True
                for entry in yaml_paths:
                    if str(result) == str(entry[1]):
                        add_entry = False
                        break
                if add_entry:
                    yaml_paths.append((expression, result))

        if not yaml_paths:
            # Nothing further to do when there are no results
            continue

        if args.except_expression:
            for expression in args.except_expression:
                exterm = get_search_term(log, expression)
                log.debug(("yaml_paths::process_yaml_file:"
                        + "converted except expression '{}' into '{}'"
                        ).format(expression, exterm))
                if exterm is None:
                    exit_state = 1
                    continue

                for result in search_for_paths(
                        log, processor, yaml_data, exterm, args.pathsep,
                        search_values=search_values,
                        search_keys=search_keys,
                        search_anchors=args.refnames,
                        include_key_aliases=include_key_aliases,
                        include_value_aliases=include_value_aliases,
                        decrypt_eyaml=args.decrypt,
                        expand_children=args.expand):
                    for entry in yaml_paths:
                        if str(result) == str(entry[1]):
                            yaml_paths.remove(entry)
                            break  # Entries are already unique

        print_results(
            args, processor, yaml_file, yaml_paths, subdoc_index)

    return exit_state
コード例 #7
0
ファイル: func.py プロジェクト: wwkimball/yamlpath
def get_yaml_multidoc_data(*args, **kwargs):
    """Relay function call to static method."""
    for (data, loaded) in Parsers.get_yaml_multidoc_data(*args, **kwargs):
        yield (data, loaded)