| #!/usr/bin/env python |
| |
| from __future__ import print_function |
| |
| desc = """Generate the difference of two YAML files into a new YAML file (works on |
| pair of directories too). A new attribute 'Added' is set to True or False |
| depending whether the entry is added or removed from the first input to the |
| next. |
| |
| The tools requires PyYAML.""" |
| |
| import yaml |
| |
| # Try to use the C parser. |
| try: |
| from yaml import CLoader as Loader |
| except ImportError: |
| from yaml import Loader |
| |
| import optrecord |
| import argparse |
| from collections import defaultdict |
| |
| if __name__ == "__main__": |
| parser = argparse.ArgumentParser(description=desc) |
| parser.add_argument( |
| "yaml_dir_or_file_1", |
| help="An optimization record file or a directory searched for optimization " |
| "record files that are used as the old version for the comparison", |
| ) |
| parser.add_argument( |
| "yaml_dir_or_file_2", |
| help="An optimization record file or a directory searched for optimization " |
| "record files that are used as the new version for the comparison", |
| ) |
| parser.add_argument( |
| "--jobs", |
| "-j", |
| default=None, |
| type=int, |
| help="Max job count (defaults to %(default)s, the current CPU count)", |
| ) |
| parser.add_argument( |
| "--max-size", |
| "-m", |
| default=100000, |
| type=int, |
| help="Maximum number of remarks stored in an output file", |
| ) |
| parser.add_argument( |
| "--no-progress-indicator", |
| "-n", |
| action="store_true", |
| default=False, |
| help="Do not display any indicator of how many YAML files were read.", |
| ) |
| parser.add_argument("--output", "-o", default="diff{}.opt.yaml") |
| args = parser.parse_args() |
| |
| files1 = optrecord.find_opt_files(args.yaml_dir_or_file_1) |
| files2 = optrecord.find_opt_files(args.yaml_dir_or_file_2) |
| |
| print_progress = not args.no_progress_indicator |
| all_remarks1, _, _ = optrecord.gather_results(files1, args.jobs, print_progress) |
| all_remarks2, _, _ = optrecord.gather_results(files2, args.jobs, print_progress) |
| |
| added = set(all_remarks2.values()) - set(all_remarks1.values()) |
| removed = set(all_remarks1.values()) - set(all_remarks2.values()) |
| |
| for r in added: |
| r.Added = True |
| for r in removed: |
| r.Added = False |
| |
| result = list(added | removed) |
| for r in result: |
| r.recover_yaml_structure() |
| |
| for i in range(0, len(result), args.max_size): |
| with open(args.output.format(i / args.max_size), "w") as stream: |
| yaml.dump_all(result[i : i + args.max_size], stream) |