Skip to content

Commit 2b8b451

Browse files
committed
add pprint as values dumper
1 parent defc08d commit 2b8b451

File tree

4 files changed

+65
-2
lines changed

4 files changed

+65
-2
lines changed

nested_diff/cli.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,44 @@ def decode(self, data):
450450
return out
451451

452452

453+
class PprintDumper(Dumper):
454+
"""Pprint dumper."""
455+
456+
def __init__(self, **kwargs):
457+
"""Initialize dumper."""
458+
super().__init__()
459+
460+
import pprint
461+
462+
self.codec = pprint.PrettyPrinter(**self.get_opts(kwargs))
463+
464+
def encode(self, data):
465+
"""Encode data as pprint does."""
466+
return self.codec.pformat(data)
467+
468+
@staticmethod
469+
def get_opts(opts):
470+
"""Extend options by default values.
471+
472+
Args:
473+
opts: Kwargs for pprint.PrettyPrinter as dict.
474+
475+
Returns:
476+
Options extended by default values.
477+
478+
"""
479+
defaults = {
480+
'indent': 1,
481+
'width': 80,
482+
'depth': None,
483+
'compact': True,
484+
'sort_dicts': True,
485+
}
486+
defaults.update(opts)
487+
488+
return defaults
489+
490+
453491
class TomlDumper(Dumper):
454492
"""TOML dumper."""
455493

nested_diff/diff_tool.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ def get_optional_args_parser(self):
148148
)
149149
parser.add_argument(
150150
'--values',
151-
choices=('repr', 'none', 'json', 'yaml'),
151+
choices=('repr', 'none', 'json', 'pprint', 'yaml'),
152152
default='repr',
153153
help='values format; "none" means no values printed, "repr" is a '
154154
'python representation of the object, rest are themselves; default'
@@ -332,6 +332,8 @@ def __init__(self, *args, **kwargs):
332332

333333
if values == 'json':
334334
self.__val_encoder = nested_diff.cli.JsonDumper(indent=2)
335+
elif values == 'pprint':
336+
self.__val_encoder = nested_diff.cli.PprintDumper()
335337
elif values == 'yaml':
336338
self.__val_encoder = nested_diff.cli.YamlDumper(
337339
explicit_start=False,

tests/cli/test_diff_tool.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,6 @@ def test_term_ofmt(capsys, expected, rpath):
350350
assert captured.out == expected
351351

352352

353-
@pytest.mark.skipif(sys.version_info < (3, 6), reason='different keys order')
354353
def test_toml_fmt(capsys, expected, rpath):
355354
exit_code = nested_diff.diff_tool.App(
356355
args=(
@@ -714,6 +713,24 @@ def test_values_json(capsys, expected, rpath):
714713
assert captured.out == expected
715714

716715

716+
@pytest.mark.skipif(sys.version_info < (3, 8), reason="no 'sort_dicts' option")
717+
def test_values_pprint(capsys, expected, rpath):
718+
exit_code = nested_diff.diff_tool.App(
719+
args=(
720+
rpath('shared.a.ini'),
721+
rpath('shared.b.ini'),
722+
'--values',
723+
'pprint',
724+
),
725+
).run()
726+
727+
captured = capsys.readouterr()
728+
assert captured.err == ''
729+
assert exit_code == 1
730+
731+
assert captured.out == expected
732+
733+
717734
def test_values_yaml(capsys, expected, rpath):
718735
exit_code = nested_diff.diff_tool.App(
719736
args=(
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{'one'}
2+
{'ein'}
3+
- '1'
4+
+ 'uno'
5+
- {'two'}
6+
- {'zwei': '2'}

0 commit comments

Comments
 (0)