| Index: abp/filters/diff_script.py | 
| =================================================================== | 
| --- a/abp/filters/diff_script.py | 
| +++ b/abp/filters/diff_script.py | 
| @@ -20,41 +20,57 @@ | 
| import argparse | 
| import io | 
| import sys | 
| +import os | 
| from .renderer import render_diff | 
| +from .parser import parse_filterlist | 
| __all__ = ['main'] | 
| -def parse_args(): | 
| +class MissingFilterListError(Exception): | 
| + """Error in finding a latest filter list, or base filter lists.""" | 
| + | 
| + | 
| +def _get_version(filterlist, base): | 
| 
 
Vasily Kuznetsov
2018/10/29 23:47:33
Nit: maybe this argument can just be called "filen
 
rhowell
2018/10/31 00:20:58
Done.
 
 | 
| + for line in parse_filterlist(filterlist): | 
| + if line.type == 'metadata' and line.key == 'Version': | 
| + return line.value | 
| + raise MissingFilterListError('Unable to find Version in {}'.format(base)) | 
| + | 
| + | 
| +def parse_args(args_in=None): | 
| parser = argparse.ArgumentParser(description='Render a filter list diff.') | 
| - parser.add_argument( | 
| - 'base', help='the older filter list that needs to be updated', | 
| - nargs='?') | 
| - parser.add_argument( | 
| - 'latest', help='the most recent version of the filter list', | 
| - nargs='?') | 
| - parser.add_argument( | 
| - 'outfile', help='output file for filter list diff', | 
| - default='-', nargs='?') | 
| - return parser.parse_args() | 
| + parser.add_argument('latest', | 
| + help='The most recent version of the filter list') | 
| + parser.add_argument('-o', '--output_dir', default=os.getcwd(), | 
| + help='The directory to write the diffs to') | 
| + parser.add_argument('base_files', nargs='+', | 
| + help='One or more archived filter lists') | 
| + return parser.parse_args(args_in) | 
| -def main(): | 
| +def main(args_in=None): | 
| """Entry point for the diff rendering script (fldiff).""" | 
| - args = parse_args() | 
| + arg = parse_args(args_in) | 
| - with io.open(args.base, 'r', encoding='utf-8') as base, \ | 
| - io.open(args.latest, 'r', encoding='utf-8') as latest: | 
| + with io.open(arg.latest, 'r', encoding='utf8') as latest_list: | 
| + latest = latest_list.readlines() | 
| + | 
| + for base_file in arg.base_files: | 
| + with io.open(base_file, 'r', encoding='utf8') as base_file: | 
| + base = base_file.readlines() | 
| lines = render_diff(base, latest) | 
| - if args.outfile == '-': | 
| - outfile = io.open(sys.stdout.fileno(), 'w', | 
| - closefd=False, | 
| - encoding=sys.stdout.encoding or 'utf-8') | 
| - else: | 
| - outfile = io.open(args.outfile, 'w', encoding='utf-8') | 
| + try: | 
| + version = _get_version(base, base_file.name) | 
| + except MissingFilterListError as exc: | 
| + sys.exit(exc) | 
| - with outfile: | 
| + # TODO: After removing the dict test, this .strip() can go | 
| + outfile = os.path.join(arg.output_dir.strip(), | 
| + 'diff{}.txt'.format(version)) | 
| + | 
| + with io.open(outfile, 'w', encoding='utf-8') as out_fp: | 
| for line in lines: | 
| - print(line, file=outfile) | 
| + out_fp.write(line + '\n') |