Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions src/objdictgen/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ def main(debugopts: DebugOpts, args: Sequence[str]|None = None):
""", aliases=['compare'])
subp.add_argument('od1', help="Object dictionary")
subp.add_argument('od2', help="Object dictionary")
subp.add_argument('-v', '--verbose', action="count", default=0, help="Verbose output (can be used multiple times)")
subp.add_argument('--show', action="store_true", help="Show difference data")
subp.add_argument('--internal', action="store_true", help="Diff internal object")
subp.add_argument('--data', action="store_true", help="Show difference as data")
Expand All @@ -166,9 +167,7 @@ def main(debugopts: DebugOpts, args: Sequence[str]|None = None):
""", aliases=['cat'])
subp.add_argument('od', nargs="+", help="Object dictionary")
subp.add_argument('-i', '--index', action="append", help="Specify parameter index to show")
subp.add_argument('--all', action="store_true",
help="Show all subindexes, including subindex 0")
subp.add_argument('--compact', action="store_true", help="Compact listing")
subp.add_argument('-v', '--verbose', action="count", default=0, help="Verbose output (can be used multiple times)")
subp.add_argument('--raw', action="store_true", help="Show raw parameter values")
subp.add_argument('--short', action="store_true", help="Do not list sub-index")
subp.add_argument('--unused', action="store_true", help="Include unused profile parameters")
Expand Down Expand Up @@ -275,7 +274,7 @@ def main(debugopts: DebugOpts, args: Sequence[str]|None = None):
od2 = open_od(opts.od2, validate=not opts.novalidate)

lines = list(format_diff_nodes(od1, od2, data=opts.data, raw=opts.raw,
internal=opts.internal, show=opts.show))
internal=opts.internal, show=opts.show, verbose=opts.verbose))

for line in lines:
print(line)
Expand Down
55 changes: 30 additions & 25 deletions src/objdictgen/printing.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,9 @@
@dataclass
class FormatNodeOpts:
""" Options for formatting the node """
compact: bool = False
verbose: int = 0
short: bool = False
unused: bool = False
all: bool = False
raw: bool = False
internal: bool = False

Expand Down Expand Up @@ -78,25 +77,26 @@ def format_node(
extra = f"{pname} (not loaded)"
profiles.append(extra)

if not kwargs.get("compact"):
yield f"{Fore.CYAN}File:{Style.RESET_ALL} {name}"
yield f"{Fore.CYAN}Name:{Style.RESET_ALL} {node.Name} [{node.Type.upper()}] {node.Description}"
yield f"{Fore.CYAN}File:{Style.RESET_ALL} {name}"
yield f"{Fore.CYAN}Name:{Style.RESET_ALL} {node.Name} [{node.Type.upper()}] {node.Description}"
if opts.verbose:
tp = ", ".join(profiles) or None
yield f"{Fore.CYAN}Profiles:{Style.RESET_ALL} {tp}"
if node.ID:
yield f"{Fore.CYAN}ID:{Style.RESET_ALL} {node.ID}"
yield ""
if node.ID:
yield f"{Fore.CYAN}ID:{Style.RESET_ALL} {node.ID}"
yield ""

index_range = None
header = ''
last_is_equal = False

for k in keys:

# Get the index range title
ir = maps.INDEX_RANGES.get_index_range(k)
if index_range != ir:
index_range = ir
if not opts.compact:
if opts.verbose:
header = Fore.YELLOW + ir.description + Style.RESET_ALL

obj = node.GetIndexEntry(k)
Expand All @@ -107,14 +107,19 @@ def format_node(
if obj == minusobj:
linegen = format_od_object(node, k, short=True)
lines = [remove_color(line) for line in linegen]
lines[0] = Fore.LIGHTBLACK_EX + lines[0] + f" {Fore.LIGHTRED_EX}<EQUAL>{Style.RESET_ALL}"
pre = " " if opts.verbose else ''
lines[0] = f"{pre}{Fore.LIGHTBLACK_EX}{lines[0]} {Fore.GREEN}<EQUAL>{Style.RESET_ALL}"
yield from lines
last_is_equal = True
continue

if last_is_equal and opts.verbose:
yield ""

# Yield the text for the index
lines = list(format_od_object(
node, k, short=opts.short, compact=opts.compact, unused=opts.unused,
verbose=opts.all, raw=opts.raw
node, k, short=opts.short, verbose=opts.verbose, unused=opts.unused,
raw=opts.raw
))

if opts.internal and lines[-1] == "":
Expand All @@ -133,12 +138,12 @@ def format_node(
obj = node.GetIndexEntry(k)
lines = pformat(obj, width=TERM_COLS).splitlines()
yield from lines
if not opts.compact:
if opts.verbose:
yield ""


def format_od_header(
node: Node, index: int, *, unused=False, compact=False, raw=False,
node: Node, index: int, *, unused=False, verbose=False, raw=False,
entry: TIndexEntry|None = None
) -> tuple[str, dict[str, str]]:
"""Get the print output for a dictionary entry header"""
Expand Down Expand Up @@ -194,13 +199,13 @@ def format_od_header(
'name': f"{Fore.LIGHTWHITE_EX}{t_name}{Style.RESET_ALL}",
'struct': f"{Fore.LIGHTYELLOW_EX}[{t_string.upper()}]{Style.RESET_ALL}",
'flags': f" {Fore.MAGENTA}{t_flags}{Style.RESET_ALL}" if flags else '',
'pre': ' ' if not compact else '',
'pre': ' ' if verbose else '',
}


def format_od_object(
node: Node, index: int, *, short=False, compact=False,
unused=False, verbose=False, raw=False,
node: Node, index: int, *, short=False,
unused=False, verbose: int=0, raw=False,
) -> Generator[str, None, None]:
"""Return the print formatting for an object dictionary entry."""

Expand All @@ -210,7 +215,7 @@ def format_od_object(

# Get the header for the entry and output it unless it is empty
line, fmt = format_od_header(
node, index, unused=unused, compact=compact, entry=param, raw=raw
node, index, unused=unused, verbose=verbose, entry=param, raw=raw
)
if not line:
return
Expand Down Expand Up @@ -278,7 +283,7 @@ def format_od_object(
t_comment = f"{Fore.LIGHTBLACK_EX}/* {t_comment} */{Style.RESET_ALL}"

# Omit printing the first element unless specifically requested
if (not verbose and i == 0
if (verbose < 2 and i == 0
and obj['struct'] & OD.MultipleSubindexes
and not t_comment
):
Expand Down Expand Up @@ -317,20 +322,20 @@ def format_od_object(
for infoentry in infos:
yield fmt.format(**infoentry)

if not compact and infos:
if verbose and infos:
yield ""


def format_diff_nodes(
od1: Node, od2: Node, *, data=False, raw=False,
od1: Node, od2: Node, *, data=False, raw=False, verbose: int=0,
internal=False, show=False
) -> Generator[str, None, None]:
""" Compare two object dictionaries and return the formatted differences. """

if internal or data:
diffs = jsonod.diff(od1, od2, internal=internal)
else:
diffs = text_diff(od1, od2, data_mode=raw)
diffs = text_diff(od1, od2, data_mode=raw, verbose=verbose)

rst = Style.RESET_ALL

Expand Down Expand Up @@ -395,7 +400,7 @@ def _pprint(text: str, prefix: str = ' '):
yield f"{Fore.RED}{chtype} {ppath} {change}{rst}"


def text_diff(od1: Node, od2: Node, data_mode: bool=False) -> TDiffNodes:
def text_diff(od1: Node, od2: Node, data_mode: bool=False, verbose: int=0) -> TDiffNodes:
""" Compare two object dictionaries as text and return the differences. """

# Get all indices for the nodes
Expand All @@ -412,10 +417,10 @@ def text_diff(od1: Node, od2: Node, data_mode: bool=False) -> TDiffNodes:
entry1: TIndexEntry = {}
entry2: TIndexEntry = {}
if index in keys1:
text1 = list(format_od_object(od1, index, unused=True))
text1 = list(format_od_object(od1, index, unused=True, verbose=verbose))
entry1 = od1.GetIndexEntry(index)
if index in keys2:
text2 = list(format_od_object(od2, index, unused=True))
text2 = list(format_od_object(od2, index, unused=True, verbose=verbose))
entry2 = od2.GetIndexEntry(index)

if data_mode:
Expand Down
6 changes: 3 additions & 3 deletions tests/test_printing.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def test_printing_format_node(odpath, file):
od.ID = 1

opts = FormatNodeOpts(
compact=False, short=False, unused=True, all=True, raw=False
verbose=True, short=False, unused=True, raw=False
)

lines = format_node(od, file, opts=opts)
Expand All @@ -27,7 +27,7 @@ def test_printing_format_node(odpath, file):
assert isinstance(line, str)

opts = FormatNodeOpts(
compact=False, short=False, unused=True, all=True, raw=False
verbose=True, short=False, unused=True, raw=False
)

lines = format_node(od, file, index=[0x1000], opts=opts)
Expand All @@ -36,7 +36,7 @@ def test_printing_format_node(odpath, file):
assert isinstance(line, str)

opts = FormatNodeOpts(
compact=False, short=False, unused=True, all=True, raw=False
verbose=True, short=False, unused=True, raw=False
)

with pytest.raises(ValueError) as exc:
Expand Down
Loading