Source

dotfiles / bin / sort-scala-imports

Full commit
#!/usr/bin/env python

import sys
from operator import attrgetter


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
        if self.main_line.endswith('}'):
            # This is a line like: import foo.{ a, b, c }
            prefix, rest = self.main_line.split('{', 1)
            guts = [item.strip() for item in
                    rest.rstrip('}, ').split(',')]
            guts.sort(key=lambda s: s.lower())
            self.main_line = '%s{ %s }' % (prefix, ', '.join(guts))
            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)