from __future__ import generators import py def test_newcode(): source = "i = 3" co = compile(source, '', 'exec') code = py.code.Code(co) newco = code.new() assert co == newco def test_ne(): code1 = py.code.Code(compile('foo = "bar"', '', 'exec')) assert code1 == code1 code2 = py.code.Code(compile('foo = "baz"', '', 'exec')) assert code2 != code1 def test_newcode_unknown_args(): code = py.code.Code(compile("", '', 'exec')) py.test.raises(TypeError, 'code.new(filename="hello")') def test_newcode_withfilename(): source = py.code.Source(""" def f(): def g(): pass """) co = compile(str(source)+'\n', 'nada', 'exec') obj = 'hello' newco = py.code.Code(co).new(rec=True, co_filename=obj) def walkcode(co): for x in co.co_consts: if isinstance(x, type(co)): for y in walkcode(x): yield y yield co names = [] for code in walkcode(newco): assert newco.co_filename == obj assert newco.co_filename is obj names.append(code.co_name) assert 'f' in names assert 'g' in names def test_newcode_with_filename(): source = "i = 3" co = compile(source, '', 'exec') code = py.code.Code(co) class MyStr(str): pass filename = MyStr("hello") filename.__source__ = py.code.Source(source) newco = code.new(rec=True, co_filename=filename) assert newco.co_filename is filename s = py.code.Source(newco) assert str(s) == source