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