aboutsummaryrefslogtreecommitdiff
path: root/.venv/lib/python3.12/site-packages/deepdiff/commands.py
diff options
context:
space:
mode:
Diffstat (limited to '.venv/lib/python3.12/site-packages/deepdiff/commands.py')
-rw-r--r--.venv/lib/python3.12/site-packages/deepdiff/commands.py232
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)