Skip to content

Commit

Permalink
Split compare_metadata into utils.compare_meta (#754)
Browse files Browse the repository at this point in the history
* Split compare_metadata into utils.compare_meta

* Debug

* Debug
  • Loading branch information
dachengx committed Aug 30, 2023
1 parent a03d2a5 commit a466a94
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 38 deletions.
39 changes: 1 addition & 38 deletions strax/context.py
Expand Up @@ -8,8 +8,6 @@
import json
import numpy as np
import pandas as pd
import click
import deepdiff
import strax
import inspect
import types
Expand Down Expand Up @@ -1690,9 +1688,6 @@ def compare_metadata(self, run_id, target, old_metadata):
:param old_metadata: path to metadata to compare, or a dictionary, or a tuple with
another run_id, target to compare against the metadata of the first id-target pair
"""
color_values = lambda oldval, newval: (
click.style(oldval, fg='red', bold=True), click.style(newval, fg='green', bold=True))
underline = lambda text, bold=True: click.style(text, bold=bold, underline=True)

# new metadata for the given runid + target; fetch from context
new_metadata = self.get_metadata(run_id, target)
Expand All @@ -1707,39 +1702,7 @@ def compare_metadata(self, run_id, target, old_metadata):
else:
raise ValueError(f"Expected old_metadata as `str` or `dict` got {type(old_metadata)}")

differences = deepdiff.DeepDiff(old_metadata, new_metadata)
for key, value in differences.items():
if key in ['values_changed', 'iterable_item_added', 'iterable_item_removed']:
print(underline(f"\n> {key}"))
for kk, vv in value.items():
if key == "values_changed":
old_values = vv['old_value']
new_values = vv['new_value']
elif key == "iterable_item_added":
old_values = "-"
new_values = vv
else: # if key == "iterable_item_removed":
old_values = vv
new_values = "-"
old, new = color_values(old_values, new_values)
click.secho(f"\t in {kk[4:]}", bold=False)
print(f"\t\t{old} -> {new}")
elif key in ['dictionary_item_added', 'dictionary_item_removed']:
color = "red" if "removed" in key else "green"
print(underline(f"\n> {key:25s}"), end="->")
click.secho(f"\t{', '.join(value)}", fg=color)
elif key in ['type_changes']:
print(underline(f"\n> {key}"))
for kk, vv in value.items():
click.secho(f"\t{kk}")
oldtype = vv['old_type']
newtype = vv['new_type']
keyold, keynew = color_values('old_type', 'new_type')
valueold, valuenew = color_values(vv['old_value'], vv['new_value'])
print(f"\t\t{keyold:10s} : {oldtype} ({valueold})")
print(f"\t\t{keynew:10s} : {newtype} ({valuenew})")
else:
raise KeyError(f"Unkown key in comparison {key}")
strax.utils.compare_dict(old_metadata, new_metadata)

def run_metadata(self, run_id, projection=None) -> dict:
"""
Expand Down
43 changes: 43 additions & 0 deletions strax/utils.py
Expand Up @@ -19,6 +19,8 @@
from collections.abc import Mapping
from warnings import warn
import os
import click
import deepdiff


# Change numba's caching backend from pickle to dill
Expand Down Expand Up @@ -311,6 +313,47 @@ def deterministic_hash(thing, length=10):
return b32encode(digest)[:length].decode('ascii').lower()


@export
def compare_dict(old: dict, new: dict):
"""Compare two dictionaries and print the differences"""
differences = deepdiff.DeepDiff(old, new)
color_values = lambda oldval, newval: (
click.style(oldval, fg='red', bold=True), click.style(newval, fg='green', bold=True))
underline = lambda text, bold=True: click.style(text, bold=bold, underline=True)
for key, value in differences.items():
if key in ['values_changed', 'iterable_item_added', 'iterable_item_removed']:
print(underline(f"\n> {key}"))
for kk, vv in value.items():
if key == "values_changed":
old_values = vv['old_value']
new_values = vv['new_value']
elif key == "iterable_item_added":
old_values = "-"
new_values = vv
else: # if key == "iterable_item_removed":
old_values = vv
new_values = "-"
old, new = color_values(old_values, new_values)
click.secho(f"\t in {kk[4:]}", bold=False)
print(f"\t\t{old} -> {new}")
elif key in ['dictionary_item_added', 'dictionary_item_removed']:
color = "red" if "removed" in key else "green"
print(underline(f"\n> {key:25s}"), end="->")
click.secho(f"\t{', '.join(value)}", fg=color)
elif key in ['type_changes']:
print(underline(f"\n> {key}"))
for kk, vv in value.items():
click.secho(f"\t{kk}")
oldtype = vv['old_type']
newtype = vv['new_type']
keyold, keynew = color_values('old_type', 'new_type')
valueold, valuenew = color_values(vv['old_value'], vv['new_value'])
print(f"\t\t{keyold:10s} : {oldtype} ({valueold})")
print(f"\t\t{keynew:10s} : {newtype} ({valuenew})")
else:
raise KeyError(f"Unkown key in comparison {key}")


@export
def formatted_exception():
"""Return human-readable multiline string with info
Expand Down

0 comments on commit a466a94

Please sign in to comment.