dd2ad752826b

ssi
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Wed, 15 Jan 2014 10:48:05 -0500
parents d66bfb2537fe
children dca331c6bf8f
branches/tags (none)
files bin/sort-scala-imports

Changes

--- a/bin/sort-scala-imports	Mon Jan 13 09:55:17 2014 -0500
+++ b/bin/sort-scala-imports	Wed Jan 15 10:48:05 2014 -0500
@@ -18,42 +18,78 @@
 class ImportGroup(object):
     def __init__(self, line):
         self.main_line = line.rstrip()
+        self.prefix = None
         self.guts = []
 
+    def set_line(self):
+        """Set the main_line and guts for the given prefix and guts.
+
+        If the import will fit into 100 chars, the short group syntax will be
+        used.  Otherwise the longer one will be used.
+
+        """
+        prefix = self.prefix
+        guts = self.guts
+
+        if not prefix:
+            # This is just a single-line, single-item import, so we don't need
+            # to do any setup.
+            return
+
+        single = '%s{%s%s%s}' % (prefix,
+                                 bracket_padding,
+                                 ', '.join(guts),
+                                 bracket_padding)
+        if len(single) > 100:
+            self.main_line = prefix + '{'
+            self.guts = guts
+            self.guts.sort(key=lambda s: s.lower())
+        else:
+            self.main_line = single
+            self.guts = []
+
     def slurp(self):
         global l, bracket_padding
 
+        line = self.main_line
         if self.main_line.endswith('}'):
             # This is a line like: import foo.{ a, b, c }
             if bracket_padding is None:
-                if self.main_line[self.main_line.index("{") + 1] == " ":
+                if line[line.index("{") + 1] == " ":
                     bracket_padding = " "
                 else:
                     bracket_padding = ""
 
-            prefix, rest = self.main_line.split('{', 1)
+            prefix, rest = line.split('{', 1)
 
             guts = [item.strip() for item in
                     re.split(", +| +|,", rest.strip('{}, '))]
-            guts.sort(key=lambda s: s.lower())
+
+            self.prefix = prefix
+            self.guts = guts
 
-            self.main_line = '%s{%s%s%s}' % (prefix,
-                                             bracket_padding,
-                                             ', '.join(guts),
-                                             bracket_padding)
             l = next_line()
-        elif self.main_line.endswith('{'):
+        elif line.endswith('{'):
+            # This is the first line of a multi-line set
+            prefix = line.rstrip('{')
+            guts = []
             while True:
                 l = next_line()
                 if l.rstrip().endswith('}'):
                     l = next_line()
                     break
                 else:
-                    self.guts.append(l.strip().rstrip(','))
+                    guts.append(l.strip().rstrip(','))
+
+            self.prefix = prefix
+            self.guts = guts
         else:
+            # Just a normal single import line, pass it on.
             l = next_line()
 
     def spit(self):
+        self.set_line()
+
         sys.stdout.write(self.main_line + '\n')
 
         if self.guts:
@@ -71,6 +107,9 @@
     ig.slurp()
     imports.append(ig)
 
+if bracket_padding is None:
+    bracket_padding = " "
+
 imports.sort(key=lambda ig: ig.key())
 
 for i in imports: