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
24 changes: 20 additions & 4 deletions pyformat.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,20 +29,23 @@
from __future__ import unicode_literals

import io
from pathlib import Path
import signal
import sys

import autoflake
import autopep8
import docformatter
import isort
import unify


__version__ = '1.0a0'


def formatters(aggressive, apply_config, filename='',
remove_all_unused_imports=False, remove_unused_variables=False):
remove_all_unused_imports=False, remove_unused_variables=False,
sort_imports=False):
"""Return list of code formatters."""
if aggressive:
yield lambda code: autoflake.fix_code(
Expand All @@ -60,17 +63,27 @@ def formatters(aggressive, apply_config, filename='',
yield lambda code: autopep8.fix_code(code, options=autopep8_options)
yield docformatter.format_code
yield unify.format_code
if sort_imports:
yield _format_by_isort


def _format_by_isort(code):
config_dict = {
'settings_path': Path('.').resolve().absolute()
}
config = isort.Config(**config_dict)
return isort.code(code=code, config=config)


def format_code(source, aggressive=False, apply_config=False, filename='',
remove_all_unused_imports=False,
remove_unused_variables=False):
remove_unused_variables=False, sort_imports=False):
"""Return formatted source code."""
formatted_source = source

for fix in formatters(
aggressive, apply_config, filename,
remove_all_unused_imports, remove_unused_variables):
remove_all_unused_imports, remove_unused_variables, sort_imports):
formatted_source = fix(formatted_source)

return formatted_source
Expand All @@ -96,7 +109,8 @@ def format_file(filename, args, standard_out):
apply_config=args.config,
filename=filename,
remove_all_unused_imports=args.remove_all_unused_imports,
remove_unused_variables=args.remove_unused_variables)
remove_unused_variables=args.remove_unused_variables,
sort_imports=args.sort_imports)

if source != formatted_source:
if args.in_place:
Expand Down Expand Up @@ -179,6 +193,8 @@ def parse_args(argv):
'(requires "aggressive")')
parser.add_argument('--remove-unused-variables', action='store_true',
help='remove unused variables (requires "aggressive")')
parser.add_argument('--sort-imports', action='store_true',
help='sort imports')
parser.add_argument('-j', '--jobs', type=int, metavar='n', default=1,
help='number of parallel jobs; '
'match CPU count if value is less than 1')
Expand Down
3 changes: 2 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ def version():
install_requires=['autoflake>=0.6.6',
'autopep8>=1.2.2',
'docformatter>=0.7',
'unify>=0.2'],
'unify>=0.2',
'isort>=5.9.3'],
entry_points={
'console_scripts': ['pyformat = pyformat:main']},
test_suite='test_pyformat')
31 changes: 31 additions & 0 deletions test_pyformat.py
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,37 @@ def test():
with open(filename) as f:
self.assertEqual('''\

def test():
return 42
''', f.read())


def test_sort_imports(self):
with temporary_file("""\
import sys, os
from __future__ import absolute_import
import path

def test():
return 42
""") as filename:
output_file = io.StringIO()
pyformat._main(argv=['my_fake_program',
'--in-place',
'--sort-imports',
filename],
standard_out=output_file,
standard_error=None)
with open(filename) as f:
self.assertEqual('''\
from __future__ import absolute_import

import os
import sys

import path


def test():
return 42
''', f.read())
Expand Down