Skip to content

Finds set of patches to transform one code into another

Notifications You must be signed in to change notification settings

StepicOrg/amorph

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

33 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Amorph

Package for Python source code transformation.

>>> from amorph import patch_with_closest
>>> source = '''
... def f(a, b):
...    return a + b
... '''
>>> samples = [
... '''
... def f(a, b):
...    return a * b
... ''',
... '''
... def f(a, b):
...    return sum([a for i in range(b)])
... '''
... ]
>>> for patch in patch_with_closest(source, samples):
...     print(patch)
Replace char #26 with '*'

Use cases

Patch with given sample

from amorph import patch_with_sample

patches = patch_with_sample(source, sample)

Specify patch method

Currently diff, tokens and ast methods available. To use ast patching you should run the API server first.

from amorph import patch_with_closest, patch_with_sample, Method

patches = patch_with_sample(source, sample, method=Method.DIFF)
patches = patch_with_closest(source, samples, method=Method.DIFF)

Find closest code

from amorph.utils import find_closest

closest_sample = find_closest(source, sample)

Custom metric

from amorph import patch_with_closest
from amorph.utils import find_closest

def dummy_metric(source, sample):
    return source.count('def') - sample.count('def')

closest_sample = find_closest(source, samples, metric=dummy_metric)
patches = patch_with_closest(source, samples, metric=dummy_metric)

Nested objects

from amorph import patch_with_closest, patch_with_sample
from amorph.utils import find_closest
from operator import itemgetter

source = {'code': 'print(input())'}
samples = [{'code': 'print("Hello World!")'}, {'code': 'print("Bye Bye!")'}]
get_code = itemgetter('code')

closest = find_closest(source, samples, key=get_code)
patches = patch_with_sample(source, closest, key=get_code)
patches = patch_with_closest(source, samples, key=get_code)