Skip to content

Commit 9fe7aae

Browse files
CLiu13myint
authored andcommitted
autoflake.py: Add --ignore-init-module-imports (#42)
When used, this new CLI argument will cause autoflake to ignore unused imports when checking any __init__.py files. New tests have also been added to accompany this new feature. Closes #35
1 parent 9258ef1 commit 9fe7aae

File tree

2 files changed

+60
-6
lines changed

2 files changed

+60
-6
lines changed

autoflake.py

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,9 @@ def filter_code(source, additional_imports=None,
331331
expand_star_imports=False,
332332
remove_all_unused_imports=False,
333333
remove_duplicate_keys=False,
334-
remove_unused_variables=False):
334+
remove_unused_variables=False,
335+
ignore_init_module_imports=False,
336+
):
335337
"""Yield code with unused imports removed."""
336338
imports = SAFE_IMPORTS
337339
if additional_imports:
@@ -340,8 +342,11 @@ def filter_code(source, additional_imports=None,
340342

341343
messages = check(source)
342344

343-
marked_import_line_numbers = frozenset(
344-
unused_import_line_numbers(messages))
345+
if ignore_init_module_imports:
346+
marked_import_line_numbers = frozenset()
347+
else:
348+
marked_import_line_numbers = frozenset(
349+
unused_import_line_numbers(messages))
345350
marked_unused_module = collections.defaultdict(lambda: [])
346351
for line_number, module_name in unused_import_module_name(messages):
347352
marked_unused_module[line_number].append(module_name)
@@ -589,7 +594,7 @@ def get_line_ending(line):
589594

590595
def fix_code(source, additional_imports=None, expand_star_imports=False,
591596
remove_all_unused_imports=False, remove_duplicate_keys=False,
592-
remove_unused_variables=False):
597+
remove_unused_variables=False, ignore_init_module_imports=False):
593598
"""Return code with all filtering run on it."""
594599
if not source:
595600
return source
@@ -608,7 +613,9 @@ def fix_code(source, additional_imports=None, expand_star_imports=False,
608613
expand_star_imports=expand_star_imports,
609614
remove_all_unused_imports=remove_all_unused_imports,
610615
remove_duplicate_keys=remove_duplicate_keys,
611-
remove_unused_variables=remove_unused_variables))))
616+
remove_unused_variables=remove_unused_variables,
617+
ignore_init_module_imports=ignore_init_module_imports,
618+
))))
612619

613620
if filtered_source == source:
614621
break
@@ -625,13 +632,22 @@ def fix_file(filename, args, standard_out):
625632

626633
original_source = source
627634

635+
isInitFile = os.path.basename(filename) == '__init__.py'
636+
637+
if args.ignore_init_module_imports and isInitFile:
638+
ignore_init_module_imports = True
639+
else:
640+
ignore_init_module_imports = False
641+
628642
filtered_source = fix_code(
629643
source,
630644
additional_imports=args.imports.split(',') if args.imports else None,
631645
expand_star_imports=args.expand_star_imports,
632646
remove_all_unused_imports=args.remove_all_unused_imports,
633647
remove_duplicate_keys=args.remove_duplicate_keys,
634-
remove_unused_variables=args.remove_unused_variables)
648+
remove_unused_variables=args.remove_unused_variables,
649+
ignore_init_module_imports=ignore_init_module_imports,
650+
)
635651

636652
if original_source != filtered_source:
637653
if args.in_place:
@@ -791,6 +807,9 @@ def _main(argv, standard_out, standard_error):
791807
parser.add_argument('--remove-all-unused-imports', action='store_true',
792808
help='remove all unused imports (not just those from '
793809
'the standard library)')
810+
parser.add_argument('--ignore-init-module-imports', action='store_true',
811+
help='exclude __init__.py when removing unused '
812+
'imports')
794813
parser.add_argument('--remove-duplicate-keys', action='store_true',
795814
help='remove all duplicate keys in objects')
796815
parser.add_argument('--remove-unused-variables', action='store_true',

test_autoflake.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,41 @@ def foo():
501501
"""
502502
self.assertEqual(line, ''.join(autoflake.filter_code(line)))
503503

504+
def test_with_ignore_init_module_imports_flag(self):
505+
# Need a temp directory in order to specify file name as __init__.py
506+
temp_directory = tempfile.mkdtemp(dir='.')
507+
temp_file = os.path.join(temp_directory, '__init__.py')
508+
try:
509+
with open(temp_file, 'w') as output:
510+
output.write('import re\n')
511+
512+
p = subprocess.Popen(
513+
list(AUTOFLAKE_COMMAND) +
514+
['--ignore-init-module-imports', temp_file],
515+
stdout=subprocess.PIPE)
516+
result = p.communicate()[0].decode('utf-8')
517+
518+
self.assertNotIn('import re', result)
519+
finally:
520+
shutil.rmtree(temp_directory)
521+
522+
def test_without_ignore_init_module_imports_flag(self):
523+
# Need a temp directory in order to specify file name as __init__.py
524+
temp_directory = tempfile.mkdtemp(dir='.')
525+
temp_file = os.path.join(temp_directory, '__init__.py')
526+
try:
527+
with open(temp_file, 'w') as output:
528+
output.write('import re\n')
529+
530+
p = subprocess.Popen(
531+
list(AUTOFLAKE_COMMAND) + [temp_file],
532+
stdout=subprocess.PIPE)
533+
result = p.communicate()[0].decode('utf-8')
534+
535+
self.assertIn('import re', result)
536+
finally:
537+
shutil.rmtree(temp_directory)
538+
504539
def test_fix_code(self):
505540
self.assertEqual(
506541
"""\

0 commit comments

Comments
 (0)