bin/sort-scala-imports @ d66bfb2537fe
more shit
author |
Steve Losh <steve@stevelosh.com> |
date |
Mon, 13 Jan 2014 09:55:17 -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)