bin/sort-scala-imports @ d5b61fd8e30a
more shit
| author | Steve Losh <steve@stevelosh.com> |
|---|---|
| date | Tue, 24 Dec 2013 10:17:39 -0500 |
| parents | 640ad1959549 |
| 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)