Refactor modules to move import statements to the header
Project description
move-imports
A script to move imports to the top of the module. Suppose a module with inline import like this
import requests
from math import sin
import datetime as dt
BASE_SCENARIO = """
##########
# Accounts
"""
def foo():
from math import (
sin, cos as cos_
)
return sin(1), cos_(0)
def bar():
from math import tan
return tan(1)
Executing
$ move-imports path/to_refactor.py --isort --rewrite
will produce
import datetime as dt
from math import cos as cos_, sin, tan
import requests
BASE_SCENARIO = """
##########
# Accounts
"""
def foo():
return sin(1), cos_(0)
def bar():
return tan(1)
Install
$ pip --user install move-imports
or the development version, directly from the git repo
$ pip --user install git+https://github.com/mgaitan/move-imports
Skip cases
To keep an inline import you could add a comment in the same line or above the stament with "avoid circular import" or "noqa".
def foo():
# avoid circular import
import baz
def foo():
import baz # noqa
Incremental refactoring
Sometimes inline imports statements are there for a reason. Circular imports, optional dependendencies, etc.
To manage this, it's useful to go step by step, checking a changed module is ok before to move to the next one.
With a combination of --start-from-last
and --limit-to LIMIT_TO
arguments you could incrementally refactor a whole package.
For instance, calling repeteadly the following command
$ move-imports --isort --rewrite --start-from-last --limit-to=1 tests/billing/**/*.py
will recursively traverse tests/billing/
refactoring one module at a time. Thus, the worflow would be:
- run,
- test,
- optionally revert and skip problematic imports or modify manually
- repeat
Running tests
Clone the repo and install pytest
$ pytest
Command line interface
$ move-imports --help
usage: move-imports [-h] [--start-from-last] [--limit-to LIMIT_TO] [--debug]
[--show-only] [--safe] [--isort]
[paths [paths ...]]
positional arguments:
paths Path/s to refactor. Glob supported enclosed in quotes
optional arguments:
-h, --help show this help message and exit
--start-from-last Incremental refactor
--limit-to LIMIT_TO Stop processing after N files. Use with --start-from-
last
--debug Make verbose output
--show-only write the result to stdin
--safe Only move stdlib or thirdparty imports
--isort Apply isort
Acknowledgement
Thanks to Shiphero for give me the time to do this.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
File details
Details for the file move_imports-0.4-py3-none-any.whl
.
File metadata
- Download URL: move_imports-0.4-py3-none-any.whl
- Upload date:
- Size: 6.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.20.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.40.2 CPython/3.6.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8a301648f6cd1dacc72379f029953ea679de3cc2256f40125d90413491d2e8f3 |
|
MD5 | 5dac78f2d2cad90dcbc5afa40629a12c |
|
BLAKE2b-256 | 87779738b69f30fc3e874ac1655f91a7a0816f343181a868615c27d7bd9956b6 |