bin/sort-scala-imports @ 791da81abb65

yet more shit
author Steve Losh <steve@stevelosh.com>
date Wed, 15 Jan 2014 17:54:29 -0500
parents d5b61fd8e30a
children dd2ad752826b
#!/usr/bin/env python

import re, sys
from operator import attrgetter


bracket_padding = None

def next_line():
    return sys.stdin.readline().rstrip('\n')

l = next_line()

while not l.startswith('import '):
    sys.stdout.write(l + '\n')
    l = next_line()

class ImportGroup(object):
    def __init__(self, line):
        self.main_line = line.rstrip()
        self.guts = []

    def slurp(self):
        global l, bracket_padding

        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] == " ":
                    bracket_padding = " "
                else:
                    bracket_padding = ""

            prefix, rest = self.main_line.split('{', 1)

            guts = [item.strip() for item in
                    re.split(", +| +|,", rest.strip('{}, '))]
            guts.sort(key=lambda s: s.lower())

            self.main_line = '%s{%s%s%s}' % (prefix,
                                             bracket_padding,
                                             ', '.join(guts),
                                             bracket_padding)
            l = next_line()
        elif self.main_line.endswith('{'):
            while True:
                l = next_line()
                if l.rstrip().endswith('}'):
                    l = next_line()
                    break
                else:
                    self.guts.append(l.strip().rstrip(','))
        else:
            l = next_line()

    def spit(self):
        sys.stdout.write(self.main_line + '\n')

        if self.guts:
            self.guts.sort(key=lambda g: g.lower())
            sys.stdout.write('  ' +
                             ',\n  '.join(self.guts) +
                             '\n}\n')

    def key(self):
        return self.main_line.lower().replace('{', '@')

imports = []
while l.startswith('import '):
    ig = ImportGroup(l)
    ig.slurp()
    imports.append(ig)

imports.sort(key=lambda ig: ig.key())

for i in imports:
    i.spit()

sys.stdout.write(l + '\n')

for l in sys.stdin.readlines():
    sys.stdout.write(l)