diff options
author | S. Solomon Darnell | 2025-03-28 21:52:21 -0500 |
---|---|---|
committer | S. Solomon Darnell | 2025-03-28 21:52:21 -0500 |
commit | 4a52a71956a8d46fcb7294ac71734504bb09bcc2 (patch) | |
tree | ee3dc5af3b6313e921cd920906356f5d4febc4ed /.venv/lib/python3.12/site-packages/deepdiff/commands.py | |
parent | cc961e04ba734dd72309fb548a2f97d67d578813 (diff) | |
download | gn-ai-master.tar.gz |
Diffstat (limited to '.venv/lib/python3.12/site-packages/deepdiff/commands.py')
-rw-r--r-- | .venv/lib/python3.12/site-packages/deepdiff/commands.py | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/deepdiff/commands.py b/.venv/lib/python3.12/site-packages/deepdiff/commands.py new file mode 100644 index 00000000..1859e35a --- /dev/null +++ b/.venv/lib/python3.12/site-packages/deepdiff/commands.py @@ -0,0 +1,232 @@ +import click +import sys +from decimal import Decimal +from pprint import pprint +from deepdiff.diff import ( + DeepDiff, + CUTOFF_DISTANCE_FOR_PAIRS_DEFAULT, + CUTOFF_INTERSECTION_FOR_PAIRS_DEFAULT, + logger +) +from deepdiff import Delta, DeepSearch, extract as deep_extract +from deepdiff.serialization import load_path_content, save_content_to_path + +try: + import orjson +except ImportError: + orjson = None + + +@click.group() +def cli(): + """A simple command line tool.""" + pass # pragma: no cover. + + +@cli.command() +@click.argument('t1', type=click.Path(exists=True, resolve_path=True)) +@click.argument('t2', type=click.Path(exists=True, resolve_path=True)) +@click.option('--cutoff-distance-for-pairs', required=False, default=CUTOFF_DISTANCE_FOR_PAIRS_DEFAULT, type=float, show_default=True) +@click.option('--cutoff-intersection-for-pairs', required=False, default=CUTOFF_INTERSECTION_FOR_PAIRS_DEFAULT, type=float, show_default=True) +@click.option('--cache-size', required=False, default=0, type=int, show_default=True) +@click.option('--cache-tuning-sample-size', required=False, default=0, type=int, show_default=True) +@click.option('--cache-purge-level', required=False, default=1, type=click.IntRange(0, 2), show_default=True) +@click.option('--create-patch', is_flag=True, show_default=True) +@click.option('--exclude-paths', required=False, type=str, show_default=False, multiple=True) +@click.option('--exclude-regex-paths', required=False, type=str, show_default=False, multiple=True) +@click.option('--math-epsilon', required=False, type=Decimal, show_default=False) +@click.option('--get-deep-distance', is_flag=True, show_default=True) +@click.option('--group-by', required=False, type=str, show_default=False, multiple=False) +@click.option('--ignore-order', is_flag=True, show_default=True) +@click.option('--ignore-string-type-changes', is_flag=True, show_default=True) +@click.option('--ignore-numeric-type-changes', is_flag=True, show_default=True) +@click.option('--ignore-type-subclasses', is_flag=True, show_default=True) +@click.option('--ignore-string-case', is_flag=True, show_default=True) +@click.option('--ignore-nan-inequality', is_flag=True, show_default=True) +@click.option('--include-private-variables', is_flag=True, show_default=True) +@click.option('--log-frequency-in-sec', required=False, default=0, type=int, show_default=True) +@click.option('--max-passes', required=False, default=10000000, type=int, show_default=True) +@click.option('--max_diffs', required=False, default=None, type=int, show_default=True) +@click.option('--threshold-to-diff-deeper', required=False, default=0.33, type=float, show_default=False) +@click.option('--number-format-notation', required=False, type=click.Choice(['f', 'e'], case_sensitive=True), show_default=True, default="f") +@click.option('--progress-logger', required=False, type=click.Choice(['info', 'error'], case_sensitive=True), show_default=True, default="info") +@click.option('--report-repetition', is_flag=True, show_default=True) +@click.option('--significant-digits', required=False, default=None, type=int, show_default=True) +@click.option('--truncate-datetime', required=False, type=click.Choice(['second', 'minute', 'hour', 'day'], case_sensitive=True), show_default=True, default=None) +@click.option('--verbose-level', required=False, default=1, type=click.IntRange(0, 2), show_default=True) +@click.option('--debug', is_flag=True, show_default=False) +def diff( + *args, **kwargs +): + """ + Deep Diff Commandline + + Deep Difference of content in files. + It can read csv, tsv, json, yaml, and toml files. + + T1 and T2 are the path to the files to be compared with each other. + """ + debug = kwargs.pop('debug') + kwargs['ignore_private_variables'] = not kwargs.pop('include_private_variables') + kwargs['progress_logger'] = logger.info if kwargs['progress_logger'] == 'info' else logger.error + create_patch = kwargs.pop('create_patch') + t1_path = kwargs.pop("t1") + t2_path = kwargs.pop("t2") + t1_extension = t1_path.split('.')[-1] + t2_extension = t2_path.split('.')[-1] + + for name, t_path, t_extension in [('t1', t1_path, t1_extension), ('t2', t2_path, t2_extension)]: + try: + kwargs[name] = load_path_content(t_path, file_type=t_extension) + except Exception as e: # pragma: no cover. + if debug: # pragma: no cover. + raise # pragma: no cover. + else: # pragma: no cover. + sys.exit(str(f"Error when loading {name}: {e}")) # pragma: no cover. + + # if (t1_extension != t2_extension): + if t1_extension in {'csv', 'tsv'}: + kwargs['t1'] = [dict(i) for i in kwargs['t1']] + if t2_extension in {'csv', 'tsv'}: + kwargs['t2'] = [dict(i) for i in kwargs['t2']] + + if create_patch: + # Disabling logging progress since it will leak into stdout + kwargs['log_frequency_in_sec'] = 0 + + try: + diff = DeepDiff(**kwargs) + except Exception as e: # pragma: no cover. No need to test this. + sys.exit(str(e)) # pragma: no cover. No need to test this. + + if create_patch: + try: + delta = Delta(diff) + except Exception as e: # pragma: no cover. + if debug: # pragma: no cover. + raise # pragma: no cover. + else: # pragma: no cover. + sys.exit(f"Error when loading the patch (aka delta): {e}") # pragma: no cover. + + # printing into stdout + sys.stdout.buffer.write(delta.dumps()) + else: + try: + print(diff.to_json(indent=2)) + except Exception: + pprint(diff, indent=2) + + +@cli.command() +@click.argument('path', type=click.Path(exists=True, resolve_path=True)) +@click.argument('delta_path', type=click.Path(exists=True, resolve_path=True)) +@click.option('--backup', '-b', is_flag=True, show_default=True) +@click.option('--raise-errors', is_flag=True, show_default=True) +@click.option('--debug', is_flag=True, show_default=False) +def patch( + path, delta_path, backup, raise_errors, debug +): + """ + Deep Patch Commandline + + Patches a file based on the information in a delta file. + The delta file can be created by the deep diff command and + passing the --create-patch argument. + + Deep Patch is similar to Linux's patch command. + The difference is that it is made for patching data. + It can read csv, tsv, json, yaml, and toml files. + + """ + try: + delta = Delta(delta_path=delta_path, raise_errors=raise_errors) + except Exception as e: # pragma: no cover. + if debug: # pragma: no cover. + raise # pragma: no cover. + else: # pragma: no cover. + sys.exit(str(f"Error when loading the patch (aka delta) {delta_path}: {e}")) # pragma: no cover. + + extension = path.split('.')[-1] + + try: + content = load_path_content(path, file_type=extension) + except Exception as e: # pragma: no cover. + sys.exit(str(f"Error when loading {path}: {e}")) # pragma: no cover. + + result = delta + content + + try: + save_content_to_path(result, path, file_type=extension, keep_backup=backup) + except Exception as e: # pragma: no cover. + if debug: # pragma: no cover. + raise # pragma: no cover. + else: # pragma: no cover. + sys.exit(str(f"Error when saving {path}: {e}")) # pragma: no cover. + + +@cli.command() +@click.argument('item', required=True, type=str) +@click.argument('path', type=click.Path(exists=True, resolve_path=True)) +@click.option('--ignore-case', '-i', is_flag=True, show_default=True) +@click.option('--exact-match', is_flag=True, show_default=True) +@click.option('--exclude-paths', required=False, type=str, show_default=False, multiple=True) +@click.option('--exclude-regex-paths', required=False, type=str, show_default=False, multiple=True) +@click.option('--verbose-level', required=False, default=1, type=click.IntRange(0, 2), show_default=True) +@click.option('--debug', is_flag=True, show_default=False) +def grep(item, path, debug, **kwargs): + """ + Deep Grep Commandline + + Grep through the contents of a file and find the path to the item. + It can read csv, tsv, json, yaml, and toml files. + + """ + kwargs['case_sensitive'] = not kwargs.pop('ignore_case') + kwargs['match_string'] = kwargs.pop('exact_match') + + try: + content = load_path_content(path) + except Exception as e: # pragma: no cover. + if debug: # pragma: no cover. + raise # pragma: no cover. + else: # pragma: no cover. + sys.exit(str(f"Error when loading {path}: {e}")) # pragma: no cover. + + try: + result = DeepSearch(content, item, **kwargs) + except Exception as e: # pragma: no cover. + if debug: # pragma: no cover. + raise # pragma: no cover. + else: # pragma: no cover. + sys.exit(str(f"Error when running deep search on {path}: {e}")) # pragma: no cover. + pprint(result, indent=2) + + +@cli.command() +@click.argument('path_inside', required=True, type=str) +@click.argument('path', type=click.Path(exists=True, resolve_path=True)) +@click.option('--debug', is_flag=True, show_default=False) +def extract(path_inside, path, debug): + """ + Deep Extract Commandline + + Extract an item from a file based on the path that is passed. + It can read csv, tsv, json, yaml, and toml files. + + """ + try: + content = load_path_content(path) + except Exception as e: # pragma: no cover. + if debug: # pragma: no cover. + raise # pragma: no cover. + else: # pragma: no cover. + sys.exit(str(f"Error when loading {path}: {e}")) # pragma: no cover. + + try: + result = deep_extract(content, path_inside) + except Exception as e: # pragma: no cover. + if debug: # pragma: no cover. + raise # pragma: no cover. + else: # pragma: no cover. + sys.exit(str(f"Error when running deep search on {path}: {e}")) # pragma: no cover. + pprint(result, indent=2) |