[diffoscope] 01/03: Tidy diffoscope/difference.py

Chris Lamb chris at chris-lamb.co.uk
Fri Jun 16 07:07:39 CEST 2017


This is an automated email from the git hooks/post-receive script.

lamby pushed a commit to branch experimental
in repository diffoscope.

commit 04008ee4172d2b7cab96dfb50dc766d7f91648b2
Author: Chris Lamb <lamby at debian.org>
Date:   Fri Jun 16 12:22:39 2017 +0800

    Tidy diffoscope/difference.py
---
 diffoscope/difference.py | 171 ++++++++++++++++++++++++++++++++---------------
 1 file changed, 117 insertions(+), 54 deletions(-)

diff --git a/diffoscope/difference.py b/diffoscope/difference.py
index ca45041..2b29a3f 100644
--- a/diffoscope/difference.py
+++ b/diffoscope/difference.py
@@ -23,9 +23,9 @@ import logging
 import subprocess
 
 from .exc import RequiredToolNotFound
-from .excludes import command_excluded
 from .diff import diff, reverse_unified_diff
 from .config import Config
+from .excludes import command_excluded
 from .profiling import profile
 
 DIFF_CHUNK = 4096
@@ -33,38 +33,18 @@ DIFF_CHUNK = 4096
 logger = logging.getLogger(__name__)
 
 
-class VisualDifference(object):
-    def __init__(self, data_type, content, source):
-        self._data_type = data_type
-        self._content = content
-        self._source = source
-
-    @property
-    def data_type(self):
-        return self._data_type
-
-    @property
-    def content(self):
-        return self._content
-
-    @property
-    def source(self):
-        return self._source
-
-    def size(self):
-        return len(self.data_type) + len(self.content) + len(self.source)
-
-
 class Difference(object):
     def __init__(self, unified_diff, path1, path2, source=None, comment=None, has_internal_linenos=False, details=None):
+        self._unified_diff = unified_diff
+
         self._comments = []
         if comment:
             if type(comment) is list:
                 self._comments.extend(comment)
             else:
                 self._comments.append(comment)
-        self._unified_diff = unified_diff
-        # allow to override declared file paths, useful when comparing
+
+        # Allow to override declared file paths, useful when comparing
         # tempfiles
         if source:
             if type(source) is list:
@@ -75,11 +55,13 @@ class Difference(object):
         else:
             self._source1 = path1
             self._source2 = path2
+
         # Ensure renderable types
         if not isinstance(self._source1, str):
             raise TypeError("path1/source[0] is not a string")
         if not isinstance(self._source2, str):
             raise TypeError("path2/source[1] is not a string")
+
         # Whether the unified_diff already contains line numbers inside itself
         self._has_internal_linenos = has_internal_linenos
         self._details = details or []
@@ -87,20 +69,32 @@ class Difference(object):
         self._size_cache = None
 
     def __repr__(self):
-        return '<Difference %s -- %s %s>' % (self._source1, self._source2, self._details)
+        return "<Difference %s -- %s %s>" % (
+            self._source1,
+            self._source2,
+            self._details,
+        )
 
     def get_reverse(self):
-        logger.debug('reverse orig %s %s', self.source1, self.source2)
+        logger.debug("Reverse orig %s %s", self.source1, self.source2)
+
         if self._visuals:
-            raise NotImplementedError("reversing VisualDifference is not yet implemented")
-        difference = Difference(
-            None if self.unified_diff is None else reverse_unified_diff(self.unified_diff),
+            raise NotImplementedError(
+                "Reversing VisualDifference is not yet implemented",
+            )
+
+        diff = self.unified_diff
+        if diff is not None:
+            diff = reverse_unified_diff(self.unified_diff)
+
+        return Difference(
+            diff,
             self.source2,
             self.source1,
-            comment = self.comments,
-            has_internal_linenos = self.has_internal_linenos,
-            details = [d.get_reverse() for d in self._details])
-        return difference
+            comment=self.comments,
+            has_internal_linenos=self.has_internal_linenos,
+            details=[d.get_reverse() for d in self._details],
+        )
 
     def equals(self, other):
         return self == other or (
@@ -122,9 +116,12 @@ class Difference(object):
         return self._size_cache
 
     def has_children(self):
-        """Whether there are children.
+        """
+        Whether there are children.
+
+        Useful for e.g. choosing whether to display [+]/[-] controls.
+        """
 
-        Useful for e.g. choosing whether to display [+]/[-] controls."""
         return self._unified_diff is not None or self._details or self._visuals
 
     @staticmethod
@@ -133,31 +130,47 @@ class Difference(object):
             unified_diff = diff(feeder1, feeder2)
             if not unified_diff:
                 return None
-            return Difference(unified_diff, path1, path2, source, comment, **kwargs)
+            return Difference(
+                unified_diff,
+                path1,
+                path2,
+                source,
+                comment,
+                **kwargs
+            )
         except RequiredToolNotFound:
             difference = Difference(None, path1, path2, source)
-            difference.add_comment('diff is not available!')
+            difference.add_comment("diff is not available")
             if comment:
                 difference.add_comment(comment)
             return difference
 
     @staticmethod
     def from_text(content1, content2, *args, **kwargs):
-        return Difference.from_feeder(make_feeder_from_text(content1),
-                                      make_feeder_from_text(content2),
-                                      *args, **kwargs)
+        return Difference.from_feeder(
+            make_feeder_from_text(content1),
+            make_feeder_from_text(content2),
+            *args,
+            **kwargs
+        )
 
     @staticmethod
     def from_raw_readers(file1, file2, *args, **kwargs):
-        return Difference.from_feeder(make_feeder_from_raw_reader(file1),
-                                      make_feeder_from_raw_reader(file2),
-                                      *args, **kwargs)
+        return Difference.from_feeder(
+            make_feeder_from_raw_reader(file1),
+            make_feeder_from_raw_reader(file2),
+            *args,
+            **kwargs
+        )
 
     @staticmethod
     def from_text_readers(file1, file2, *args, **kwargs):
-        return Difference.from_feeder(make_feeder_from_text_reader(file1),
-                                      make_feeder_from_text_reader(file2),
-                                      *args, **kwargs)
+        return Difference.from_feeder(
+            make_feeder_from_text_reader(file1),
+            make_feeder_from_text_reader(file2),
+            *args,
+            **kwargs
+        )
 
     @staticmethod
     def from_command(klass, path1, path2, *args, **kwargs):
@@ -187,15 +200,28 @@ class Difference(object):
             source_cmd = command1 or command2
             kwargs['source'] = source_cmd.shell_cmdline()
 
-        difference = Difference.from_feeder(feeder1, feeder2, path1, path2, *args, **kwargs)
+        difference = Difference.from_feeder(
+            feeder1,
+            feeder2,
+            path1,
+            path2,
+            *args,
+            **kwargs
+        )
         if not difference:
             return None
+
         if command1 and command1.stderr_content:
-            difference.add_comment('stderr from `%s`:' % ' '.join(command1.cmdline()))
+            difference.add_comment("stderr from `{}`:".format(
+                ' '.join(command1.cmdline()),
+            ))
             difference.add_comment(command1.stderr_content)
         if command2 and command2.stderr_content:
-            difference.add_comment('stderr from `%s`:' % ' '.join(command2.cmdline()))
+            difference.add_comment("stderr from `{}`:".format(
+                ' '.join(command2.cmdline()),
+            ))
             difference.add_comment(command2.stderr_content)
+
         return difference
 
     @property
@@ -247,30 +273,63 @@ class Difference(object):
         self._visuals.extend(visuals)
         self._size_cache = None
 
+
+class VisualDifference(object):
+    def __init__(self, data_type, content, source):
+        self._data_type = data_type
+        self._content = content
+        self._source = source
+
+    @property
+    def data_type(self):
+        return self._data_type
+
+    @property
+    def content(self):
+        return self._content
+
+    @property
+    def source(self):
+        return self._source
+
+    def size(self):
+        return len(self.data_type) + len(self.content) + len(self.source)
+
+
 def make_feeder_from_text_reader(in_file, filter=lambda text_buf: text_buf):
     def encoding_filter(text_buf):
         return filter(text_buf).encode('utf-8')
     return make_feeder_from_raw_reader(in_file, encoding_filter)
 
+
 def make_feeder_from_command(command):
     def feeder(out_file):
         with profile('command', command.cmdline()[0]):
-            end_nl = make_feeder_from_raw_reader(command.stdout, command.filter)(out_file)
+            feeder = make_feeder_from_raw_reader(
+                command.stdout,
+                command.filter,
+            )
+            end_nl = feeder(out_file)
             if command.poll() is None:
                 command.terminate()
             returncode = command.wait()
         if returncode not in (0, -signal.SIGTERM):
-            raise subprocess.CalledProcessError(returncode, command.cmdline(), output=command.stderr.getvalue())
+            raise subprocess.CalledProcessError(
+                returncode,
+                command.cmdline(),
+                output=command.stderr.getvalue(),
+            )
         return end_nl
     return feeder
 
+
 def make_feeder_from_raw_reader(in_file, filter=lambda buf: buf):
     def feeder(out_file):
         max_lines = Config().max_diff_input_lines
         line_count = 0
         end_nl = False
         h = None
-        if max_lines < float("inf"):
+        if max_lines < float('inf'):
             h = hashlib.sha1()
         for buf in in_file:
             line_count += 1
@@ -281,11 +340,14 @@ def make_feeder_from_raw_reader(in_file, filter=lambda buf: buf):
                 out_file.write(out)
             end_nl = buf[-1] == '\n'
         if h and line_count >= max_lines:
-            out_file.write('[ Too much input for diff (SHA1: {}) ]\n'.format(h.hexdigest()).encode('utf-8'))
+            out_file.write("[ Too much input for diff (SHA1: {}) ]\n".format(
+                h.hexdigest(),
+            ).encode('utf-8'))
             end_nl = True
         return end_nl
     return feeder
 
+
 def make_feeder_from_text(content):
     def feeder(f):
         for offset in range(0, len(content), DIFF_CHUNK):
@@ -293,6 +355,7 @@ def make_feeder_from_text(content):
         return content and content[-1] == '\n'
     return feeder
 
+
 def empty_file_feeder():
     def feeder(f):
         return False

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/reproducible/diffoscope.git


More information about the diffoscope mailing list