facebookincubator / Bowler

Safe code refactoring for modern Python.
https://pybowler.io/
MIT License
1.53k stars 89 forks source link

Move `rename_transform` outside of `Query.rename` #93

Open orsinium opened 5 years ago

orsinium commented 5 years ago

For example, you want to rename node only if it matches some pattern. You can do this:

def modify(node: LN, capture: Capture, filename: Filename) -> None:
  if re.match(...):
    rename_transform(...)

However, rename_transform isn't available for import. BTW, it's can be really useful to have bowler.modifiers with some common modifiers to reuse them. Maybe, moving rename_transform in it is a good start. Same for add_argument_transform, encapsulate_transform etc

And what if use _modifier instead of _transform?

I can do PR for it if you agree with the point.

thatch commented 5 years ago

That example would make a great filter, would that solve much of the use case?

orsinium commented 5 years ago

Filter can cover situation with choosing the right action, but not case with some simple preparation. For example, do relative imports if possible: make relative path if possible and pass it into rename_trfansform, otherwise use absolute import.

amyreese commented 5 years ago

Moving away from closures for these transforms will also be necessary to eventually support Windows (or Py3.8+ on Mac) where multiprocessing uses spawned processes.