@@ -28,10 +28,10 @@ def reformat_code(code):
2828def order_future_lines (code ):
2929 """
3030 Returns the code block with any ``__future__`` import lines sorted, and
31- then any ``future`` import lines sorted.
31+ then any ``future`` import lines sorted, then any ``builtins`` import lines
32+ sorted.
3233
33- This only sorts the lines within the expected blocks:
34- __future__ first, then future imports, then regular code.
34+ This only sorts the lines within the expected blocks.
3535
3636 See test_order_future_lines() for an example.
3737 """
@@ -46,6 +46,9 @@ def order_future_lines(code):
4646 future_line_numbers = [i for i , line in enumerate (lines )
4747 if line .startswith ('from future' )]
4848
49+ builtins_line_numbers = [i for i , line in enumerate (lines )
50+ if line .startswith ('from builtins' )]
51+
4952 assert code .lstrip () == code , ('internal usage error: '
5053 'dedent the code before calling order_future_lines()' )
5154
@@ -58,12 +61,18 @@ def mymin(numbers):
5861 assert mymax (uufuture_line_numbers ) <= mymin (future_line_numbers ), \
5962 'the __future__ and future imports are out of order'
6063
64+ # assert mymax(future_line_numbers) <= mymin(builtins_line_numbers), \
65+ # 'the future and builtins imports are out of order'
66+
6167 uul = sorted ([lines [i ] for i in uufuture_line_numbers ])
6268 sorted_uufuture_lines = dict (zip (uufuture_line_numbers , uul ))
6369
6470 fl = sorted ([lines [i ] for i in future_line_numbers ])
6571 sorted_future_lines = dict (zip (future_line_numbers , fl ))
6672
73+ bl = sorted ([lines [i ] for i in builtins_line_numbers ])
74+ sorted_builtins_lines = dict (zip (builtins_line_numbers , bl ))
75+
6776 # Replace the old unsorted "from __future__ import ..." lines with the
6877 # new sorted ones:
6978 new_lines = []
@@ -72,6 +81,8 @@ def mymin(numbers):
7281 new_lines .append (sorted_uufuture_lines [i ])
7382 elif i in future_line_numbers :
7483 new_lines .append (sorted_future_lines [i ])
84+ elif i in builtins_line_numbers :
85+ new_lines .append (sorted_builtins_lines [i ])
7586 else :
7687 new_lines .append (lines [i ])
7788 return '\n ' .join (new_lines )
0 commit comments