Commit 084611fe authored by Chris Lamb's avatar Chris Lamb 💬

Move diffoscope.Config to a more-standard and simpler singleton pattern and...

Move diffoscope.Config to a more-standard and simpler singleton pattern and validate constraints on every __setattr__.
Signed-off-by: Chris Lamb's avatarChris Lamb <lamby@debian.org>
parent 1c90457b
......@@ -118,7 +118,7 @@ def bail_if_non_existing(*paths):
sys.exit(2)
def compare_root_paths(path1, path2):
if not Config.general.new_file:
if not Config().new_file:
bail_if_non_existing(path1, path2)
if os.path.isdir(path1) and os.path.isdir(path2):
return compare_directories(path1, path2)
......@@ -168,7 +168,7 @@ def specialize(file):
def perform_fuzzy_matching(members1, members2):
if tlsh == None or Config.general.fuzzy_threshold == 0:
if tlsh == None or Config().fuzzy_threshold == 0:
return
already_compared = set()
# Perform local copies because they will be modified by consumer
......@@ -186,7 +186,7 @@ def perform_fuzzy_matching(members1, members2):
comparisons.sort(key=operator.itemgetter(0))
score, name2 = comparisons[0]
logger.debug('fuzzy top match %s %s: %d difference score', name1, name2, score)
if score < Config.general.fuzzy_threshold:
if score < Config().fuzzy_threshold:
yield name1, name2, score
already_compared.add(name2)
......
......@@ -278,7 +278,7 @@ class NonExistingFile(File):
@staticmethod
def recognizes(file):
if isinstance(file, FilesystemFile) and not os.path.lexists(file.name):
assert Config.general.new_file, '%s does not exist' % file.name
assert Config().new_file, '%s does not exist' % file.name
return True
return False
......
......@@ -217,7 +217,7 @@ class Container(object, metaclass=abc.ABCMeta):
comment = 'Files similar despite different names (difference score: %d)' % score
yield my_members.pop(my_name), other_members.pop(other_name), comment
p.step(2)
if Config.general.new_file:
if Config().new_file:
for my_member in my_members.values():
yield my_member, NonExistingFile('/dev/null', my_member), NO_COMMENT
p.step()
......
......@@ -3,6 +3,7 @@
# diffoscope: in-depth comparison of files, archives, and directories
#
# Copyright © 2015 Reiner Herrmann <reiner@reiner-h.de>
# Copyright © 2016 Chris Lamb <lamby@debian.org>
#
# diffoscope is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
......@@ -18,108 +19,43 @@
# along with diffoscope. If not, see <http://www.gnu.org/licenses/>.
# From http://stackoverflow.com/a/7864317
# Credits to kylealanhale
class classproperty(property):
def __get__(self, cls, owner):
return classmethod(self.fget).__get__(None, owner)()
class Config(object):
def __init__(self):
self._max_diff_block_lines = 256
self._max_diff_block_lines_parent = 50
self._max_diff_block_lines_saved = float("inf")
# html-dir output uses ratio * max-diff-block-lines as its limit
self._max_diff_block_lines_html_dir_ratio = 4
self._max_diff_input_lines = 2 ** 20 # GNU diff cannot process arbitrary large files :(
self._max_report_size = 2000 * 2 ** 10 # 2000 kB
self._max_report_child_size = 500 * 2 ** 10
self._fuzzy_threshold = 60
self._new_file = False
@classproperty
def general(cls):
if not hasattr(cls, '_general_config'):
cls._general_config = Config()
return cls._general_config
def _check_constraints(self):
if self._max_diff_block_lines < self._max_diff_block_lines_parent:
raise ValueError("max_diff_block_lines (%s) cannot be smaller than max_diff_block_lines_parent (%s)" %
(self._max_diff_block_lines, self._max_diff_block_lines_parent))
m = self._max_diff_block_lines_html_dir_ratio
if self._max_diff_block_lines_saved < m * self._max_diff_block_lines:
raise ValueError("max_diff_block_lines_saved (%s) cannot be smaller than %d*max_diff_block_lines (%s)" %
(self._max_diff_block_lines_saved, m, m*self._max_diff_block_lines))
@property
def max_diff_block_lines(self):
return self._max_diff_block_lines
@max_diff_block_lines.setter
def max_diff_block_lines(self, value):
self._max_diff_block_lines = value
self._check_constraints()
@property
def max_diff_block_lines_parent(self):
return self._max_diff_block_lines_parent
@max_diff_block_lines_parent.setter
def max_diff_block_lines_parent(self, value):
self._max_diff_block_lines_parent = value
self._check_constraints()
@property
def max_diff_block_lines_saved(self):
return self._max_diff_block_lines_saved
@max_diff_block_lines_saved.setter
def max_diff_block_lines_saved(self, value):
self._max_diff_block_lines_saved = value
self._check_constraints()
max_diff_block_lines = 256
max_diff_block_lines_parent = 50
max_diff_block_lines_saved = float("inf")
# html-dir output uses ratio * max-diff-block-lines as its limit
max_diff_block_lines_html_dir_ratio = 4
# GNU diff cannot process arbitrary large files :(
max_diff_input_lines = 2 ** 20
max_report_size = 2000 * 2 ** 10 # 2000 kB
max_report_child_size = 500 * 2 ** 10
new_file = False
fuzzy_threshold = 60
enforce_constraints = True
_singleton = {}
@property
def max_diff_block_lines_html_dir_ratio(self):
return self._max_diff_block_lines_html_dir_ratio
@property
def max_diff_input_lines(self):
return self._max_diff_input_lines
@max_diff_input_lines.setter
def max_diff_input_lines(self, value):
self._max_diff_input_lines = value
@property
def max_report_size(self):
return self._max_report_size
@max_report_size.setter
def max_report_size(self, value):
self._max_report_size = value
@property
def max_report_child_size(self):
return self._max_report_child_size
@max_report_child_size.setter
def max_report_child_size(self, value):
self._max_report_child_size = value
@property
def fuzzy_threshold(self):
return self._fuzzy_threshold
@fuzzy_threshold.setter
def fuzzy_threshold(self, value):
self._fuzzy_threshold = value
@property
def new_file(self):
return self._new_file
@new_file.setter
def new_file(self, value):
self._new_file = value
def __init__(self):
self.__dict__ = self._singleton
def __setattr__(self, k, v):
super(Config, self).__setattr__(k, v)
if self.enforce_constraints:
self.check_constraints()
def check_constraints(self):
if self.max_diff_block_lines < self.max_diff_block_lines_parent:
raise ValueError("max_diff_block_lines ({0.max_diff_block_lines}) "
"cannot be smaller than max_diff_block_lines_parent "
"({0.max_diff_block_lines_parent})".format(self),
)
max_ = self.max_diff_block_lines_html_dir_ratio * \
self.max_diff_block_lines
if self.max_diff_block_lines_saved < max_:
raise ValueError("max_diff_block_lines_saved "
"({0.max_diff_block_lines_saved}) cannot be smaller than "
"{0.max_diff_block_lines_html_dir_ratio} * "
"max_diff_block_lines ({1})".format(self, max_),
)
......@@ -113,7 +113,7 @@ class DiffParser(object):
else:
self._block_len = 1
self._direction = line[0]
max_lines = Config.general.max_diff_block_lines_saved
max_lines = Config().max_diff_block_lines_saved
if self._block_len >= max_lines:
return self.skip_block
else:
......@@ -123,7 +123,7 @@ class DiffParser(object):
def skip_block(self, line):
if self._remaining_hunk_lines == 0 or line[0] != self._direction:
removed = self._block_len - Config.general.max_diff_block_lines_saved
removed = self._block_len - Config().max_diff_block_lines_saved
if removed:
self._diff.write('%s[ %d lines removed ]\n' % (self._direction, removed))
return self.read_hunk(line)
......@@ -231,7 +231,7 @@ def empty_file_feeder():
def make_feeder_from_raw_reader(in_file, filter=lambda buf: buf):
def feeder(out_file):
max_lines = Config.general.max_diff_input_lines
max_lines = Config().max_diff_input_lines
line_count = 0
end_nl = False
h = None
......
......@@ -98,25 +98,25 @@ def create_parser():
help='Maximum bytes written in report. In html-dir '
'output, this is the max bytes of the parent page. '
'(0 to disable, default: %d)' %
Config.general.max_report_size,
Config().max_report_size,
default=None).completer=RangeCompleter(0,
Config.general.max_report_size, 200000)
Config().max_report_size, 200000)
group2.add_argument('--max-report-child-size', metavar='BYTES',
dest='max_report_child_size', type=int,
help='In html-dir output, this is the max bytes of '
'each child page. (0 to disable, default: %(default)s, '
'remaining in effect even with --no-default-limits)',
default=Config.general.max_report_child_size).completer=RangeCompleter(0,
Config.general.max_report_child_size, 50000)
default=Config().max_report_child_size).completer=RangeCompleter(0,
Config().max_report_child_size, 50000)
group2.add_argument('--max-diff-block-lines', dest='max_diff_block_lines',
metavar='LINES', type=int,
help='Maximum number of lines output per diff block. '
'In html-dir output, we use %d * this number instead, '
'taken over all pages. (0 to disable, default: %d)' %
(Config.general.max_diff_block_lines_html_dir_ratio,
Config.general.max_diff_block_lines),
(Config().max_diff_block_lines_html_dir_ratio,
Config().max_diff_block_lines),
default=None).completer=RangeCompleter(0,
Config.general.max_diff_block_lines, 5)
Config().max_diff_block_lines, 5)
group2.add_argument('--max-diff-block-lines-parent', dest='max_diff_block_lines_parent',
metavar='LINES', type=int,
help='In --html-dir output, this is maximum number of '
......@@ -124,8 +124,8 @@ def create_parser():
'before spilling it into child pages. (0 to disable, '
'default: %(default)s, remaining in effect even with '
'--no-default-limits)',
default=Config.general.max_diff_block_lines_parent).completer=RangeCompleter(0,
Config.general.max_diff_block_lines_parent, 200)
default=Config().max_diff_block_lines_parent).completer=RangeCompleter(0,
Config().max_diff_block_lines_parent, 200)
group2.add_argument('--max-diff-block-lines-saved', dest='max_diff_block_lines_saved',
metavar='LINES', type=int,
help='Maximum number of lines saved per diff block. '
......@@ -141,15 +141,15 @@ def create_parser():
group3.add_argument('--fuzzy-threshold', dest='fuzzy_threshold', type=int,
help='Threshold for fuzzy-matching '
'(0 to disable, %(default)s is default, 400 is high fuzziness)',
default=Config.general.fuzzy_threshold).completer=RangeCompleter(0,
default=Config().fuzzy_threshold).completer=RangeCompleter(0,
400, 20)
group3.add_argument('--max-diff-input-lines', dest='max_diff_input_lines',
metavar='LINES', type=int,
help='Maximum number of lines fed to diff(1). '
'(0 to disable, default: %d)' %
Config.general.max_diff_input_lines,
Config().max_diff_input_lines,
default=None).completer=RangeCompleter(0,
Config.general.max_diff_input_lines, 5000)
Config().max_diff_input_lines, 5000)
if not tlsh:
parser.epilog = 'File renaming detection based on fuzzy-matching is currently disabled. It can be enabled by installing the "tlsh" module available at https://github.com/trendmicro/tlsh'
......@@ -219,17 +219,17 @@ def maybe_set_limit(config, parsed_args, key):
def run_diffoscope(parsed_args):
if not tlsh and Config.general.fuzzy_threshold != parsed_args.fuzzy_threshold:
if not tlsh and Config().fuzzy_threshold != parsed_args.fuzzy_threshold:
logger.warning('Fuzzy-matching is currently disabled as the "tlsh" module is unavailable.')
maybe_set_limit(Config.general, parsed_args, "max_report_size")
maybe_set_limit(Config.general, parsed_args, "max_report_child_size")
maybe_set_limit(Config(), parsed_args, "max_report_size")
maybe_set_limit(Config(), parsed_args, "max_report_child_size")
# need to set them in this order due to Config._check_constraints
maybe_set_limit(Config.general, parsed_args, "max_diff_block_lines_saved")
maybe_set_limit(Config.general, parsed_args, "max_diff_block_lines_parent")
maybe_set_limit(Config.general, parsed_args, "max_diff_block_lines")
maybe_set_limit(Config.general, parsed_args, "max_diff_input_lines")
Config.general.fuzzy_threshold = parsed_args.fuzzy_threshold
Config.general.new_file = parsed_args.new_file
maybe_set_limit(Config(), parsed_args, "max_diff_block_lines_saved")
maybe_set_limit(Config(), parsed_args, "max_diff_block_lines_parent")
maybe_set_limit(Config(), parsed_args, "max_diff_block_lines")
maybe_set_limit(Config(), parsed_args, "max_diff_input_lines")
Config().fuzzy_threshold = parsed_args.fuzzy_threshold
Config().new_file = parsed_args.new_file
if parsed_args.debug:
logger.setLevel(logging.DEBUG)
set_locale()
......
......@@ -493,10 +493,10 @@ def row_was_output():
global spl_print_func, spl_print_ctrl, spl_rows, spl_current_page
spl_rows += 1
_, rotation_params = spl_print_ctrl
max_lines = Config.general.max_diff_block_lines
max_lines_parent = Config.general.max_diff_block_lines_parent
max_lines_ratio = Config.general.max_diff_block_lines_html_dir_ratio
max_report_child_size = Config.general.max_report_child_size
max_lines = Config().max_diff_block_lines
max_lines_parent = Config().max_diff_block_lines_parent
max_lines_ratio = Config().max_diff_block_lines_html_dir_ratio
max_report_child_size = Config().max_report_child_size
if not rotation_params:
# html-dir single output, don't need to rotate
if spl_rows >= max_lines:
......@@ -706,7 +706,7 @@ def output_html(difference, css_url=None, print_func=None):
"""
if print_func is None:
print_func = print
print_func = create_limited_print_func(print_func, Config.general.max_report_size)
print_func = create_limited_print_func(print_func, Config().max_report_size)
try:
output_header(css_url, print_func)
output_difference(difference, print_func, css_url, None, [])
......@@ -754,7 +754,7 @@ def output_html_directory(directory, difference, css_url=None, jquery_url=None):
jquery_url = None
with file_printer(directory, "index.html") as print_func:
print_func = create_limited_print_func(print_func, Config.general.max_report_size)
print_func = create_limited_print_func(print_func, Config().max_report_size)
try:
output_header(css_url, print_func)
output_difference(difference, print_func, css_url, directory, [])
......
......@@ -101,7 +101,7 @@ def test_skip_comparison_of_known_identical_files(deb1, deb2, monkeypatch):
assert './usr/share/doc/test/README.Debian' not in compared
def test_compare_non_existing(monkeypatch, deb1):
monkeypatch.setattr(Config.general, 'new_file', True)
monkeypatch.setattr(Config(), 'new_file', True)
difference = deb1.compare(NonExistingFile('/nonexisting', deb1))
assert difference.source2 == '/nonexisting'
assert difference.details[-1].source2 == '/dev/null'
......@@ -115,7 +115,7 @@ def test_dot_changes_internal_diff(dot_changes_differences):
@pytest.mark.skipif(miss_debian_module, reason='debian module is not installed')
def test_dot_changes_compare_non_existing(monkeypatch, dot_changes1):
monkeypatch.setattr(Config.general, 'new_file', True)
monkeypatch.setattr(Config(), 'new_file', True)
difference = dot_changes1.compare(NonExistingFile('/nonexisting', dot_changes1))
output_text(difference, print_func=print)
assert difference.source2 == '/nonexisting'
......@@ -209,7 +209,7 @@ def test_dot_dsc_internal_diff(dot_dsc_differences):
@pytest.mark.skipif(miss_debian_module, reason='debian module is not installed')
def test_dot_dsc_compare_non_existing(monkeypatch, dot_dsc1):
monkeypatch.setattr(Config.general, 'new_file', True)
monkeypatch.setattr(Config(), 'new_file', True)
difference = dot_dsc1.compare(NonExistingFile('/nonexisting', dot_dsc1))
output_text(difference, print_func=print)
assert difference.source2 == '/nonexisting'
......
......@@ -56,7 +56,7 @@ def test_differences(differences):
@skip_unless_tools_exist('enjarify', 'zipinfo', 'javap')
def test_compare_non_existing(monkeypatch, dex1):
monkeypatch.setattr(Config.general, 'new_file', True)
monkeypatch.setattr(Config(), 'new_file', True)
difference = dex1.compare(NonExistingFile('/nonexisting', dex1))
assert difference.source2 == '/nonexisting'
assert difference.details[-1].source2 == '/dev/null'
......@@ -51,7 +51,7 @@ def obj_differences(obj1, obj2):
@skip_unless_tools_exist('readelf')
def test_obj_compare_non_existing(monkeypatch, obj1):
monkeypatch.setattr(Config, 'new_file', True)
monkeypatch.setattr(Config(), 'new_file', True)
difference = obj1.compare(NonExistingFile('/nonexisting', obj1))
assert difference.source2 == '/nonexisting'
assert len(difference.details) > 0
......@@ -96,7 +96,7 @@ def test_lib_differences(lib_differences):
@skip_unless_tools_exist('readelf', 'objdump')
def test_lib_compare_non_existing(monkeypatch, lib1):
monkeypatch.setattr(Config, 'new_file', True)
monkeypatch.setattr(Config(), 'new_file', True)
difference = lib1.compare(NonExistingFile('/nonexisting', lib1))
assert difference.source2 == '/nonexisting'
assert len(difference.details) > 0
......
......@@ -54,7 +54,7 @@ def test_differences(differences):
@skip_unless_tools_exist('zipinfo')
def test_compare_non_existing(monkeypatch, epub1):
monkeypatch.setattr(Config.general, 'new_file', True)
monkeypatch.setattr(Config(), 'new_file', True)
difference = epub1.compare(NonExistingFile('/nonexisting', epub1))
assert difference.source2 == '/nonexisting'
assert difference.details[-1].source2 == '/dev/null'
......@@ -47,7 +47,7 @@ def test_diff(differences):
@skip_unless_tools_exist('showttf')
def test_compare_non_existing(monkeypatch, ttf1):
monkeypatch.setattr(Config, 'new_file', True)
monkeypatch.setattr(Config(), 'new_file', True)
difference = ttf1.compare(NonExistingFile('/nonexisting', ttf1))
assert difference.source2 == '/nonexisting'
assert len(difference.details) > 0
......@@ -81,7 +81,7 @@ def test_differences(differences):
@skip_unless_tools_exist('qemu-img')
@pytest.mark.skipif(miss_guestfs, reason='guestfs is missing')
def test_compare_non_existing(monkeypatch, img1):
monkeypatch.setattr(Config.general, 'new_file', True)
monkeypatch.setattr(Config(), 'new_file', True)
difference = img1.compare(NonExistingFile('/nonexisting', img1))
assert difference.source2 == '/nonexisting'
assert difference.details[-1].source2 == '/dev/null'
......@@ -56,7 +56,7 @@ def test_charsets(mo_no_charset, mo_iso8859_1):
@skip_unless_tools_exist('msgunfmt')
def test_compare_non_existing(monkeypatch, mo1):
monkeypatch.setattr(Config, 'new_file', True)
monkeypatch.setattr(Config(), 'new_file', True)
difference = mo1.compare(NonExistingFile('/nonexisting', mo1))
assert difference.source2 == '/nonexisting'
assert len(difference.details) > 0
......@@ -71,7 +71,7 @@ def test_content_diff(differences):
assert differences[1].unified_diff == expected_diff
def test_compare_non_existing(monkeypatch, gzip1):
monkeypatch.setattr(Config.general, 'new_file', True)
monkeypatch.setattr(Config(), 'new_file', True)
difference = gzip1.compare(NonExistingFile('/nonexisting', gzip1))
assert difference.source2 == '/nonexisting'
assert difference.details[-1].source2 == '/dev/null'
......@@ -46,7 +46,7 @@ def test_diff(differences):
@skip_unless_tools_exist('cd-iccdump')
def test_compare_non_existing(monkeypatch, icc1):
monkeypatch.setattr(Config, 'new_file', True)
monkeypatch.setattr(Config(), 'new_file', True)
difference = icc1.compare(NonExistingFile('/nonexisting', icc1))
assert difference.source2 == '/nonexisting'
assert len(difference.details) > 0
......
......@@ -46,7 +46,7 @@ def test_diff(differences):
@skip_unless_tools_exist('img2txt')
def test_compare_non_existing(monkeypatch, image1):
monkeypatch.setattr(Config, 'new_file', True)
monkeypatch.setattr(Config(), 'new_file', True)
difference = image1.compare(NonExistingFile('/nonexisting', image1))
assert difference.source2 == '/nonexisting'
assert len(difference.details) > 0
......@@ -49,7 +49,7 @@ def test_compressed_files(differences):
assert differences[1].details[2].source1 == './control.tar.gz'
def test_compare_non_existing(monkeypatch, ipk1):
monkeypatch.setattr(Config.general, 'new_file', True)
monkeypatch.setattr(Config(), 'new_file', True)
difference = ipk1.compare(NonExistingFile('/nonexisting', ipk1))
assert difference.source2 == '/nonexisting'
assert difference.details[-1].source2 == '/dev/null'
......@@ -64,7 +64,7 @@ def test_compressed_files(differences):
@skip_unless_tools_exist('isoinfo')
def test_compare_non_existing(monkeypatch, iso1):
monkeypatch.setattr(Config.general, 'new_file', True)
monkeypatch.setattr(Config(), 'new_file', True)
difference = iso1.compare(NonExistingFile('/nonexisting', iso1))
assert difference.source2 == '/nonexisting'
assert difference.details[-1].source2 == '/dev/null'
......@@ -46,7 +46,7 @@ def test_diff(differences):
@skip_unless_tools_exist('javap')
def test_compare_non_existing(monkeypatch, class1):
monkeypatch.setattr(Config, 'new_file', True)
monkeypatch.setattr(Config(), 'new_file', True)
difference = class1.compare(NonExistingFile('/nonexisting', class1))
assert difference.source2 == '/nonexisting'
assert len(difference.details) > 0
......@@ -43,7 +43,7 @@ def obj_differences(obj1, obj2):
@skip_unless_tools_exist('otool', 'lipo')
def test_obj_compare_non_existing(monkeypatch, obj1):
monkeypatch.setattr(Config, 'new_file', True)
monkeypatch.setattr(Config(), 'new_file', True)
difference = obj1.compare(NonExistingFile('/nonexisting', obj1))
assert difference.source2 == '/nonexisting'
assert len(difference.details) > 0
......
......@@ -51,7 +51,7 @@ def test_diff(differences):
@skip_unless_tools_exist('pedump')
def test_compare_non_existing(monkeypatch, exe1):
monkeypatch.setattr(Config, 'new_file', True)
monkeypatch.setattr(Config(), 'new_file', True)
difference = exe1.compare(NonExistingFile('/nonexisting', exe1))
assert difference.source2 == '/nonexisting'
assert len(difference.details) > 0
......@@ -66,5 +66,5 @@ no_permissions_tar = load_fixture(data('no-perms.tar'))
def test_no_permissions_dir_in_tarball(monkeypatch, no_permissions_tar):
# We want to make sure OSError is not raised.
# Comparing with non-existing file makes it easy to make sure all files are unpacked
monkeypatch.setattr(Config, 'new_file', True)
monkeypatch.setattr(Config(), 'new_file', True)
no_permissions_tar.compare(NonExistingFile('/nonexistent', no_permissions_tar))
......@@ -81,15 +81,15 @@ fuzzy_tar_in_tar2 = load_fixture(data('fuzzy-tar-in-tar2.tar'))
@pytest.mark.skipif(miss_tlsh, reason='tlsh is missing')
def test_no_fuzzy_matching(monkeypatch, fuzzy_tar_in_tar1, fuzzy_tar_in_tar2):
monkeypatch.setattr(Config, 'fuzzy_threshold', 0)
monkeypatch.setattr(Config(), 'fuzzy_threshold', 0)
difference = fuzzy_tar_in_tar1.compare(fuzzy_tar_in_tar2)
assert len(difference.details) == 1
assert difference.details[0].source1 == 'file list'
@pytest.mark.skipif(miss_tlsh, reason='tlsh is missing')
def test_no_fuzzy_matching_new_file(monkeypatch, fuzzy_tar_in_tar1, fuzzy_tar_in_tar2):
monkeypatch.setattr(Config, 'fuzzy_threshold', 0)
monkeypatch.setattr(Config, 'new_file', True)
monkeypatch.setattr(Config(), 'fuzzy_threshold', 0)
monkeypatch.setattr(Config(), 'new_file', True)
difference = fuzzy_tar_in_tar1.compare(fuzzy_tar_in_tar2)
assert len(difference.details) == 3
assert difference.details[1].source2 == '/dev/null'
......
......@@ -67,7 +67,8 @@ def data(filename):
)
def assert_non_existing(monkeypatch, fixture, has_null_source=True, has_details=True):
monkeypatch.setattr(Config.general, 'new_file', True)
monkeypatch.setattr(Config(), 'new_file', True)
assert Config().new_file, "didnt get patched"
difference = fixture.compare(NonExistingFile('/nonexisting', fixture))
......
......@@ -25,14 +25,15 @@ from diffoscope.difference import Difference
def test_too_much_input_for_diff(monkeypatch):
monkeypatch.setattr(Config, 'max_diff_input_lines', 20)
monkeypatch.setattr(Config(), 'max_diff_input_lines', 20)
too_long_text_a = io.StringIO("a\n" * 21)
too_long_text_b = io.StringIO("b\n" * 21)
difference = Difference.from_text_readers(too_long_text_a, too_long_text_b, 'a', 'b')
assert '[ Too much input for diff ' in difference.unified_diff
def test_too_long_diff_block_lines(monkeypatch):
monkeypatch.setattr(Config, 'max_diff_block_lines_saved', 10)
monkeypatch.setattr(Config(), 'enforce_constraints', False)
monkeypatch.setattr(Config(), 'max_diff_block_lines_saved', 10)
too_long_text_a = io.StringIO("a\n" * 21)
too_long_text_b = io.StringIO("b\n" * 21)
difference = Difference.from_text_readers(too_long_text_a, too_long_text_b, 'a', 'b')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment