Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 19 additions & 19 deletions lib/python/pyflyby/_cmdline.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
expand_py_files_from_args, read_file)
from pyflyby._importstmt import ImportFormatParams
from pyflyby._log import logger
from pyflyby._util import cached_attribute, indent
from pyflyby._util import cached_attribute, indent, IMPORT_FORMAT_DEFAULTS


def hfmt(s):
Expand Down Expand Up @@ -172,7 +172,7 @@ def callback(option, opt_str, value, parser):

if import_format_params:
group = optparse.OptionGroup(parser, "Pretty-printing options")
group.add_option('--align-imports', '--align', type='str', default="32",
group.add_option('--align-imports', '--align', type='str', default=str(IMPORT_FORMAT_DEFAULTS["align_imports"]),
metavar='N',
help=hfmt('''
Whether and how to align the 'import' keyword in
Expand All @@ -183,12 +183,12 @@ def callback(option, opt_str, value, parser):
necessary. If a comma-separated list of integers
(tab stops), then pick the column that results in
the fewest number of lines total per block.'''))
group.add_option('--from-spaces', type='int', default=3, metavar='N',
help=hfmt('''
group.add_option('--from-spaces', type='int', default=IMPORT_FORMAT_DEFAULTS["from_spaces"], metavar='N',
help=hfmt(f'''
The number of spaces after the 'from' keyword.
(Must be at least 1; default is 3.)'''))
(Must be at least 1; default is {IMPORT_FORMAT_DEFAULTS["from_spaces"]}.)'''))
group.add_option('--separate-from-imports', action='store_true',
default=False,
default=IMPORT_FORMAT_DEFAULTS["separate_from_imports"],
help=hfmt('''
Separate 'from ... import ...'
statements from 'import ...' statements.'''))
Expand All @@ -198,7 +198,7 @@ def callback(option, opt_str, value, parser):
(Default) Don't separate 'from ... import ...'
statements from 'import ...' statements.'''))
group.add_option('--align-future', action='store_true',
default=False,
default=IMPORT_FORMAT_DEFAULTS["align_future"],
help=hfmt('''
Align the 'from __future__ import ...' statement
like others.'''))
Expand All @@ -207,39 +207,39 @@ def callback(option, opt_str, value, parser):
help=hfmt('''
(Default) Don't align the 'from __future__ import
...' statement.'''))
group.add_option('--width', type='int', default=79, metavar='N',
help=hfmt('''
Maximum line length (default: 79).'''))
group.add_option('--black', action='store_true', default=False,
group.add_option('--width', type='int', default=IMPORT_FORMAT_DEFAULTS["max_line_length"], metavar='N',
help=hfmt(f'''
Maximum line length (default: {IMPORT_FORMAT_DEFAULTS["max_line_length"]}).'''))
group.add_option('--black', action='store_true', default=IMPORT_FORMAT_DEFAULTS["use_black"],
help=hfmt('''
Use black to format imports. If this option is
used, all other formatting options are ignored.'''))
group.add_option('--hanging-indent', type='choice', default='never',
group.add_option('--hanging-indent', type='choice', default=IMPORT_FORMAT_DEFAULTS["hanging_indent"],
choices=['never','auto','always'],
metavar='never|auto|always',
dest='hanging_indent',
help=hfmt('''
help=hfmt(f'''
How to wrap import statements that don't fit on
one line.
If --hanging-indent=always, then always indent
imported tokens at column 4 on the next line.
If --hanging-indent=never (default), then align
import tokens after "import (" (by default column
40); do so even if some symbols are so long that
this would exceed the width (by default 79)).
this would exceed the width (by default {IMPORT_FORMAT_DEFAULTS["max_line_length"]})).
If --hanging-indent=auto, then use hanging indent
only if it is necessary to prevent exceeding the
width (by default 79).
width (by default {IMPORT_FORMAT_DEFAULTS["max_line_length"]}).
'''))
def uniform_callback(option, opt_str, value, parser):
parser.values.separate_from_imports = False
parser.values.from_spaces = 3
parser.values.align_imports = '32'
parser.values.from_spaces = IMPORT_FORMAT_DEFAULTS["from_spaces"]
parser.values.align_imports = str(IMPORT_FORMAT_DEFAULTS["align_imports"])
group.add_option('--uniform', '-u', action="callback",
callback=uniform_callback,
help=hfmt('''
help=hfmt(f'''
(Default) Shortcut for --no-separate-from-imports
--from-spaces=3 --align-imports=32.'''))
--from-spaces={IMPORT_FORMAT_DEFAULTS["from_spaces"]} --align-imports={IMPORT_FORMAT_DEFAULTS["align_imports"]}.'''))
def unaligned_callback(option, opt_str, value, parser):
parser.values.separate_from_imports = True
parser.values.from_spaces = 1
Expand Down
11 changes: 7 additions & 4 deletions lib/python/pyflyby/_comms.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

from pyflyby._log import logger
from pyflyby._imports2s import SourceToSourceFileImportsTransformation
from pyflyby._importstmt import Import
from pyflyby._importstmt import Import, ImportFormatParams
import six

# These are comm targets that the frontend (lab/notebook) is expected to
Expand Down Expand Up @@ -85,7 +85,7 @@ def comm_close_handler(comm, message):
comms.pop(target)


def _reformat_helper(input_code, imports):
def _reformat_helper(input_code, imports, use_black):
from pyflyby._imports2s import reformat_import_statements

if PYFLYBY_START_MSG in input_code:
Expand All @@ -111,7 +111,9 @@ def _reformat_helper(input_code, imports):
transform.add_import(Import(imp))
middle = str(transform.output())

return reformat_import_statements(before + bmarker + middle + emarker + after)
params = ImportFormatParams(**{"use_black": True}) if use_black else None

return reformat_import_statements(before + bmarker + middle + emarker + after, params)

def comm_open_handler(comm, message):
"""
Expand All @@ -132,5 +134,6 @@ def _recv(msg):
if data["type"] == FORMATTING_IMPORTS:
msg_id = data.get('msg_id', None)
imports = data.get('imports', None)
fmt_code = _reformat_helper(data["input_code"], imports)
use_black = data.get('use_black', False)
fmt_code = _reformat_helper(data["input_code"], imports, use_black)
comm.send({"msg_id": msg_id, "formatted_code": str(fmt_code), "type": FORMATTING_IMPORTS})
4 changes: 3 additions & 1 deletion lib/python/pyflyby/_imports2s.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from pyflyby._importstmt import ImportFormatParams, ImportStatement
from pyflyby._log import logger
from pyflyby._parse import PythonBlock
from pyflyby._util import ImportPathCtx, Inf, NullCtx, memoize
from pyflyby._util import ImportPathCtx, Inf, NullCtx, memoize, IMPORT_FORMAT_DEFAULTS
import re
from six import exec_

Expand Down Expand Up @@ -269,6 +269,8 @@ def reformat_import_statements(codeblock, params=None):
:rtype:
`PythonBlock`
"""
if params is None:
params = ImportFormatParams(**IMPORT_FORMAT_DEFAULTS)
params = ImportFormatParams(params)
transformer = SourceToSourceFileImportsTransformation(codeblock)
return transformer.output(params=params)
Expand Down
11 changes: 11 additions & 0 deletions lib/python/pyflyby/_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -480,3 +480,14 @@ def nested(*mgrs):
with ExitStack() as stack:
ctxes = [stack.enter_context(mgr) for mgr in mgrs]
yield ctxes


IMPORT_FORMAT_DEFAULTS = {
"align_imports": 32,
"from_spaces": 3,
"separate_from_imports": False,
"max_line_length": 79,
"use_black": False,
"align_future": False,
"hanging_indent": "never"
}
20 changes: 10 additions & 10 deletions tests/test_imports2s.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@ def test_reformat_import_statements_1():
''').lstrip(), filename="/foo/test_reformat_import_statements_1.py")
output = reformat_import_statements(input)
expected = PythonBlock(dedent('''
import foo.bar4
from foo import bar1, bar2 as bar2x, bar3 as bar3x
from foo import bar1, bar2 as bar2x, bar3 as bar3x
import foo.bar4

from foo import bar0
from foo import bar0
''').lstrip(), filename="/foo/test_reformat_import_statements_1.py")
assert output == expected

Expand All @@ -50,10 +50,10 @@ def test_reformat_import_statements_star_1():
''').lstrip(), filename="/foo/test_reformat_import_statements_star_1.py")
output = reformat_import_statements(input)
expected = PythonBlock(dedent('''
from mod1 import f1a, f1b
from mod2 import *
from mod2 import f2a as F2A, f2b as F2B
from mod3 import f3a, f3b
from mod1 import f1a, f1b
from mod2 import *
from mod2 import f2a as F2A, f2b as F2B
from mod3 import f3a, f3b
''').lstrip(), filename="/foo/test_reformat_import_statements_star_1.py")
assert output == expected

Expand All @@ -65,8 +65,8 @@ def test_reformat_import_statements_multi_star_1():
''').lstrip())
output = reformat_import_statements(input)
expected = PythonBlock(dedent('''
from mod1 import *
from mod2 import *
from mod1 import *
from mod2 import *
''').lstrip())
assert output == expected

Expand All @@ -82,7 +82,7 @@ def test_reformat_import_statements_shadowed_1():
import a2 as a
import b
import c
from d import d
from d import d
''').lstrip())
assert output == expected

Expand Down