Skip to main content

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

move_imports-0.4-py3-none-any.whl (6.0 kB view details)

Uploaded Python 3

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

Hashes for move_imports-0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 8a301648f6cd1dacc72379f029953ea679de3cc2256f40125d90413491d2e8f3
MD5 5dac78f2d2cad90dcbc5afa40629a12c
BLAKE2b-256 87779738b69f30fc3e874ac1655f91a7a0816f343181a868615c27d7bd9956b6

See more details on using hashes here.

Provenance

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page