<div dir="ltr">Hi, should this have been <div>from __future__ import print_function<br></div><div>?</div><div>Thanks,</div><div>-Aaron</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Oct 19, 2017 at 1:33 PM, CCTBX Commit via DLS Jenkins <span dir="ltr">&lt;<a href="mailto:graeme.winter@gmail.com" target="_blank">graeme.winter@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><tt>Repository : ssh://<a href="http://g18-sc-serv-04.diamond.ac.uk/cctbx" target="_blank">g18-sc-serv-04.diamond.<wbr>ac.uk/cctbx</a><br>On branch  : master<br><br><hr><br><br>commit d499b973be4c0443e607fbad13e495<wbr>bb450938a3<br>Author: Markus Gerstel &lt;<a href="mailto:markus.gerstel@diamond.ac.uk" target="_blank">markus.gerstel@diamond.ac.uk</a>&gt;<br>Date:   Thu Oct 19 21:33:54 2017 +0100<br><br>    Add --print_statement checking capability to libtbx.find_clutter<br><br><br><hr><br><br>d499b973be4c0443e607fbad13e495<wbr>bb450938a3<br> libtbx/command_line/find_<wbr>clutter.py | 12 +++++++++++-<br> libtbx/file_clutter.py        <wbr>      | 23 +++++++++++++++++++----<br> 2 files changed, 30 insertions(+), 5 deletions(-)<br><br>diff --git a/libtbx/command_line/find_<wbr>clutter.py b/libtbx/command_line/find_<wbr>clutter.py<br>index 27baa6d7b..66f4b46eb 100644<br><tt style="color:#800">--- a/libtbx/command_line/find_<wbr>clutter.py</tt><br><tt style="color:#008">+++ b/libtbx/command_line/find_<wbr>clutter.py</tt><br>@@ -13,6 +13,7 @@ def run(args):<br>   only_dos = False<br>   only_future = False<br>   flag_absolute_import = False<br><tt style="color:#008">+  flag_print_statement = False</tt><br>   #<br>   paths = []<br>   for arg in args:<br>@@ -34,6 +35,8 @@ def run(args):<br>       only_future = True<br>     elif (arg == &quot;--absolute_import&quot;):<br>       flag_absolute_import = True<br><tt style="color:#008">+    elif (arg == &quot;--print_statement&quot;):</tt><br><tt style="color:#008">+      flag_print_statement = True</tt><br>     else:<br>       paths.append(arg)<br>   if (len(paths) == 0): paths = [&quot;.&quot;]<br>@@ -45,9 +48,12 @@ def run(args):<br>   n_too_many_from_future_<wbr>import_division = 0<br>   n_missing_from_future_<wbr>import_absolute_import = 0<br>   n_too_many_from_future_<wbr>import_absolute_import = 0<br><tt style="color:#008">+  n_missing_from_future_<wbr>import_print_statement = 0</tt><br><tt style="color:#008">+  n_too_many_from_future_<wbr>import_print_statement = 0</tt><br>   n_bad_indentation = 0<br>   for info in gather(paths=paths, find_unused_imports=not flag_ni,<br><tt style="color:#800">-      find_bad_indentation=<wbr>flag_indentation, flag_absolute_import=flag_<wbr>absolute_import):</tt><br><tt style="color:#008">+      find_bad_indentation=<wbr>flag_indentation, flag_absolute_import=flag_<wbr>absolute_import,</tt><br><tt style="color:#008">+      flag_print_statement=<wbr>flag_print_statement):</tt><br>     if (info.is_cluttered(flag_x=<wbr>flag_x)):<br>       n_is_cluttered += 1<br>     if (info.n_bare_excepts &gt; 0):<br>@@ -62,6 +68,10 @@ def run(args):<br>       n_missing_from_future_<wbr>import_absolute_import += 1<br>     elif info.n_from_future_import_<wbr>absolute_import &gt; 1:<br>       n_too_many_from_future_<wbr>import_absolute_import += 1<br><tt style="color:#008">+    if info.n_from_future_import_<wbr>print_statement == 0:</tt><br><tt style="color:#008">+      n_missing_from_future_<wbr>import_print_statement += 1</tt><br><tt style="color:#008">+    elif info.n_from_future_import_<wbr>print_statement &gt; 1:</tt><br><tt style="color:#008">+      n_too_many_from_future_<wbr>import_print_statement += 1</tt><br>     if (info.bad_indentation is not None) and (flag_indentation) :<br>       n_bad_indentation += 1<br>     info.show(<br>diff --git a/libtbx/file_clutter.py b/libtbx/file_clutter.py<br>index 8af972751..768f06491 100644<br><tt style="color:#800">--- a/libtbx/file_clutter.py</tt><br><tt style="color:#008">+++ b/libtbx/file_clutter.py</tt><br>@@ -11,9 +11,12 @@ class file_clutter(object):<br>     &#39;^ from [ ]+ __future__ [ ]+ import [ \w,]+ division&#39;, re.VERBOSE)<br>   from_future_import_<wbr>absolute_import_pat = re.compile(<br>     &#39;^ from [ ]+ __future__ [ ]+ import [ \w,]+ absolute_import&#39;, re.VERBOSE)<br><tt style="color:#008">+  from_future_import_print_<wbr>statement_pat = re.compile(</tt><br><tt style="color:#008">+    &#39;^ from [ ]+ __future__ [ ]+ import [ \w,]+ print_statement&#39;, re.VERBOSE)</tt><br> <br>   def __init__(self, path, find_unused_imports=False,<br><tt style="color:#800">-      find_bad_indentation=<wbr>True, flag_absolute_import=False):</tt><br><tt style="color:#008">+      find_bad_indentation=<wbr>True, flag_absolute_import=False,</tt><br><tt style="color:#008">+      flag_print_statement=<wbr>False):</tt><br>     self.path = path<br>     self.is_executable = os.access(path, os.X_OK)<br>     self.dos_format = False<br>@@ -25,6 +28,8 @@ class file_clutter(object):<br>     self.n_from_future_<wbr>import_division = None<br>     self.flag_absolute_import = flag_absolute_import<br>     self.n_from_future_<wbr>import_absolute_import = None<br><tt style="color:#008">+    self.flag_print_statement = flag_print_statement</tt><br><tt style="color:#008">+    self.n_from_future_<wbr>import_print_statement = None</tt><br>     self.bad_indentation = None<br>     self.file_should_be_empty = False<br>     bytes = open(path, &quot;rb&quot;).read()<br>@@ -45,6 +50,7 @@ class file_clutter(object):<br>       if (path.endswith(&quot;.py&quot;)):<br>         self.n_from_future_<wbr>import_division = 0<br>         self.n_from_future_<wbr>import_absolute_import = 0<br><tt style="color:#008">+        self.n_from_future_<wbr>import_print_statement = 0</tt><br>         py_lines = bytes.splitlines()<br>         self.file_should_be_<wbr>empty = True<br>         for line in py_lines:<br>@@ -54,6 +60,8 @@ class file_clutter(object):<br>             self.n_from_<wbr>future_import_division += 1<br>           if self.from_future_import_<wbr>absolute_import_pat.search(<wbr>line):<br>             self.n_from_<wbr>future_import_absolute_import += 1<br><tt style="color:#008">+          if self.from_future_import_print_<wbr>statement_pat.search(line):</tt><br><tt style="color:#008">+            self.n_from_<wbr>future_import_print_statement += 1</tt><br>           ls = line.strip()<br>           if (    ls.startswith(&quot;except&quot;)<br>               and ls[6:].strip().startswith(&quot;:&quot;)<br>@@ -103,7 +111,8 @@ class file_clutter(object):<br>     if (self.has_unused_imports()):<br>       sapp(&quot;unused imports=%d&quot; % len(self.unused_imports))<br>     if self.file_should_be_empty:<br><tt style="color:#800">-      if self.n_from_future_import_<wbr>division == 0 and self.n_from_future_import_<wbr>absolute_import == 0:</tt><br><tt style="color:#008">+      if self.n_from_future_import_<wbr>division == 0 and self.n_from_future_import_<wbr>absolute_import == 0 and \</tt><br><tt style="color:#008">+         self.n_from_future_<wbr>import_print_statement:</tt><br>         sapp(&quot;file is empty, should be 0 byte file&quot;)<br>       else:<br>         sapp(&quot;file contains only &#39;from __future__ import&#39; and should be empty instead&quot;)<br>@@ -116,6 +125,11 @@ class file_clutter(object):<br>         sapp(&quot;missing &#39;from __future__ import absolute_import&#39;&quot;)<br>       elif self.n_from_future_import_<wbr>absolute_import &gt; 1:<br>         sapp(&quot;more than one appearance of &#39;from __future__ import absolute_import&#39;&quot;)<br><tt style="color:#008">+    if self.flag_print_statement and not self.file_should_be_empty:</tt><br><tt style="color:#008">+      if self.n_from_future_import_<wbr>print_statement == 0:</tt><br><tt style="color:#008">+        sapp(&quot;missing &#39;from __future__ import print_statement&#39;&quot;)</tt><br><tt style="color:#008">+      elif self.n_from_future_import_<wbr>print_statement &gt; 1:</tt><br><tt style="color:#008">+        sapp(&quot;more than one appearance of &#39;from __future__ import print_statement&#39;&quot;)</tt><br>     if (self.bad_indentation is not None) and (flag_indentation) :<br>       n_tab, n_space = self.bad_indentation<br>       sapp(&quot;non-standard indentation: %d space, %d tab&quot; % (n_space, n_tab))<br>@@ -144,11 +158,12 @@ def is_text_file(file_name):<br>     if (name.endswith(extension)): return True<br>   return False<br> <br><tt style="color:#800">-def gather(paths, find_unused_imports=False, find_bad_indentation=False, flag_absolute_import=False):</tt><br><tt style="color:#008">+def gather(paths, find_unused_imports=False, find_bad_indentation=False, flag_absolute_import=False, flag_print_statement=False):</tt><br>   clutter = []<br>   def capp():<br>     clutter.append(file_<wbr>clutter(path, find_unused_imports,<br><tt style="color:#800">-      find_bad_indentation=<wbr>find_bad_indentation, flag_absolute_import=flag_<wbr>absolute_import))</tt><br><tt style="color:#008">+      find_bad_indentation=<wbr>find_bad_indentation, flag_absolute_import=flag_<wbr>absolute_import,</tt><br><tt style="color:#008">+      flag_print_statement=<wbr>flag_print_statement))</tt><br>   for path in paths:<br>     if (not os.path.exists(path)):<br>       print &gt;&gt; sys.stderr, &quot;No such file or directory:&quot;, path<br></tt></div></blockquote></div><br></div>