On Thu, Jun 07, 2012 at 12:03:30PM +0800, Zhou Zheng Sheng wrote: > Hi, > > Since there is no coverage report on tests in vdsm, if a PEP 8 patch > passes the tests, we still not sure if there is no mistake in it. > Viewing the diff reports on all the changes consumes a lot of time, and > some small but fatal mistakes(like misspelling variable name) can easily > be ignored by human eyes. > > So I have a try on the compiler module of Python. I write a tool named > 'pydiff'. pydiff parses two Python scripts into Abstract Syntax Trees. > These data structures can reflect the logic of the code, and pydiff > performs a recursive compare on the trees. Then pydiff reports > differences and the corresponding line numbers. In this way, pydiff > ignores code style changes, and reports only logical changes of the code. > > I think this tool can save us a lot of time. After a PEP 8 patch passes > vdsm tests and pydiff, I will get some confidence on the patch and it > probably does not break anything in vdsm.
This is a very nice tool. Thanks for sharing it. I would like to see all authors of PEP8 patches use this to check their patches for semantic correctness. This should greatly improve our ability to complete the PEP8 cleanup quickly. > Here is a usage example: > > -------- test_o.py -------- > def foo(a, b): > pass > > if __name__ == '__main__': > A = [1, 2, 3] > print (4, 5, 6), \ > "over" > foo(1, 2) > print 'Hello World' > > > -------- test_n.py -------- > def foo(a, b): > pass > > if __name__ == '__main__': > A = [1, > 2, 3] > print (4, 5, 6), "over" > fooo( > 1, 2) > print ('Hello ' > 'World') > > > Some differences of the files are just a matter of style. The only > significant difference is the function call "foo()" is misspelled in > "test_n.py". > > Run pydiff.py, it will report: > > $ python pydiff.py test_*.py > 1 difference(s) > first file: test_n.py > second file: test_o.py > > ((8, 'fooo'), (8, 'foo')) > > This report tells us that 'fooo' in line 8 of "test_n.py" is different > from 'foo' in line 8 of "test_o.py". > > > It can also find insertions or deletions. Here is another simple example: > > ---- old.py ---- > print 'Hello 1' > print 'Hello 2' > print 'Hello 3' > print 'Hello 4' > print 'Hello 5' > > ---- new.py ---- > print 'Hello 1' > print 'Hello 3' > print 'Hello 4' > print 'Hello 5' > print 'Hello 5' > > Run pydiff: > > $ pydiff old.py new.py > 2 difference(s) > first file: old.py > second file: new.py > > ((2, Printnl([Const('Hello 2')], None)), (2, None)) > > ((5, None), (5, Printnl([Const('Hello 5')], None))) > > Here "((2, Printnl([Const('Hello 2')], None)), (2, None))" means there > is a print statement in line 2 of old.py, but no corresponding statement > in new.py, so we can know the statement is deleted in new.py. > "((5, None), (5, Printnl([Const('Hello 5')], None)))" means there is a > print statement in line 5 of new.py, but no corresponding statement in > old.py, so we can know the statement is inserted in new.py. > > > Sometimes the change in code logic is acceptable, for example, change > "aDict.has_key(Key)" into "Key in aDict". pydiff can report a difference > in this case, but it is up to the user to judge whether it's acceptable. > pydiff is just a tool to help you finding these changes. > > I hope it can be helpful for PEP 8 patch reviewers. If you find any > bugs, please let me know. The script is in the attachment. > > -- > Thanks and best regards! > > Zhou Zheng Sheng / 周征晟 > E-mail: zhshz...@linux.vnet.ibm.com > Telephone: 86-10-82454397 > > _______________________________________________ > vdsm-devel mailing list > vdsm-devel@lists.fedorahosted.org > https://fedorahosted.org/mailman/listinfo/vdsm-devel -- Adam Litke <a...@us.ibm.com> IBM Linux Technology Center _______________________________________________ vdsm-devel mailing list vdsm-devel@lists.fedorahosted.org https://fedorahosted.org/mailman/listinfo/vdsm-devel