"""Docstring.""" import csv import os import sys def main(): """Entrypoint.""" upc = sys.argv[1] qa_dir = f'data/qa/{upc}' prod_dir = f'data/prod/{upc}' qa_files = load_media_dir(qa_dir) prod_files = load_media_dir(prod_dir) results = {} for filename in set(list(qa_files.keys()) + list(prod_files.keys())): data = { 'error_msg': '', 'diffs': None } if filename not in qa_files: data['error_msg'] = 'qa file does not exist' elif filename not in prod_files: data['error_msg'] = 'prod file does not exist' else: data['diffs'] = diff_dicts( load_media_info(qa_files[filename]), load_media_info(prod_files[filename]), [ 'Writing library' ] ) results[filename] = data with open(f'{upc}.csv', 'w', newline='') as csvfile: fieldnames = ['filename', 'error_msg', 'key', 'qa_val', 'prod_val'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() for filename, value in results.items(): row = { 'filename': filename, 'error_msg': value['error_msg'], 'key': '', 'qa_val': '', 'prod_val': '' } if not value['diffs']: writer.writerow(row) else: for key, values in value['diffs'].items(): row['key'] = key row['qa_val'] = values[0], row['prod_val'] = values[1] writer.writerow(row) def diff_dicts(left, right, ignore_keys): """Compare two dicts, return diff.""" results = {} for key in set(list(left.keys()) + list(right.keys())): if key in ignore_keys: continue left_val = left.get(key) right_val = right.get(key) if left_val != right_val: results[key] = (left.get(key), right.get(key)) return results def load_media_info(path): """Read metadata into dict.""" sep = ':' with open(f'{path}.txt', 'rb') as f: raw_data = f.read() try: data = raw_data.decode('ascii') except UnicodeDecodeError: data = raw_data.decode('utf-8') results = {} for line in data.splitlines(): if sep not in line: continue parts = line.split(sep) key = parts[0].strip() value = parts[1].strip() results[key] = value return results def load_media_dir(path): """Read files in dir into dict.""" return { x.name: x.path for x in os.scandir(path) if x.is_file() and not x.name.endswith('.txt') } if __name__ == '__main__': main()