commit
						3d70917758
					
				
							
								
								
									
										18
									
								
								CHANGELOG
								
								
								
								
							
							
						
						
									
										18
									
								
								CHANGELOG
								
								
								
								
							|  | @ -1,3 +1,21 @@ | ||||||
|  | Changes between 1.3.0 and 1.3.1 | ||||||
|  | ================================================== | ||||||
|  | 
 | ||||||
|  | - make py.test.cmdline.main() return the exitstatus  | ||||||
|  |   instead of raising (which is still done by py.cmdline.pytest()) | ||||||
|  |   and make it so that py.test.cmdline.main() can be called | ||||||
|  |   multiple times, at least as far as py.test's internal  | ||||||
|  |   state is concerned - previously it would raise an exception | ||||||
|  |   on the second time.  | ||||||
|  | 
 | ||||||
|  | - improve tracebacks presentation:  | ||||||
|  |   - raises shows shorter more relevant tracebacks | ||||||
|  | 
 | ||||||
|  | - improve support for raises and other dynamically compiled code by | ||||||
|  |   manipulating python's linecache.cache instead of the previous | ||||||
|  |   rather hacky way of creating custom code objects.  This makes  | ||||||
|  |   it seemlessly work on Jython and PyPy at least.  | ||||||
|  | 
 | ||||||
| Changes between 1.2.1 and 1.3.0 | Changes between 1.2.1 and 1.3.0 | ||||||
| ================================================== | ================================================== | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,7 +1,10 @@ | ||||||
| """ | """ | ||||||
| this little helper allows to run tests multiple times | this little helper allows to run tests multiple times | ||||||
| in the same process.  useful for running tests from  | in the same process.  useful for running tests from  | ||||||
| a console. | a console.   | ||||||
|  | 
 | ||||||
|  | NOTE: since 1.3.1 you can just call py.test.cmdline.main()  | ||||||
|  | multiple times - no special logic needed.  | ||||||
| """ | """ | ||||||
| import py, sys | import py, sys | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -8,7 +8,7 @@ dictionary or an import path. | ||||||
| 
 | 
 | ||||||
| (c) Holger Krekel and others, 2004-2010 | (c) Holger Krekel and others, 2004-2010 | ||||||
| """ | """ | ||||||
| __version__ = version = "1.3.0" | __version__ = version = "1.3.1a1" | ||||||
| 
 | 
 | ||||||
| import py.apipkg | import py.apipkg | ||||||
| 
 | 
 | ||||||
|  | @ -25,7 +25,6 @@ py.apipkg.initpkg(__name__, dict( | ||||||
|         'pytest':     '._cmdline.pytest:main', |         'pytest':     '._cmdline.pytest:main', | ||||||
|         'pylookup':   '._cmdline.pylookup:main', |         'pylookup':   '._cmdline.pylookup:main', | ||||||
|         'pycountloc': '._cmdline.pycountlog:main', |         'pycountloc': '._cmdline.pycountlog:main', | ||||||
|         'pytest':     '._test.cmdline:main', |  | ||||||
|         'pylookup':   '._cmdline.pylookup:main', |         'pylookup':   '._cmdline.pylookup:main', | ||||||
|         'pycountloc': '._cmdline.pycountloc:main', |         'pycountloc': '._cmdline.pycountloc:main', | ||||||
|         'pycleanup':  '._cmdline.pycleanup:main', |         'pycleanup':  '._cmdline.pycleanup:main', | ||||||
|  |  | ||||||
|  | @ -151,7 +151,10 @@ else: | ||||||
|         return getattr(function, "__dict__", None) |         return getattr(function, "__dict__", None) | ||||||
| 
 | 
 | ||||||
|     def _getcode(function): |     def _getcode(function): | ||||||
|         return getattr(function, "func_code", None) |         try: | ||||||
|  |             return getattr(function, "__code__") | ||||||
|  |         except AttributeError: | ||||||
|  |             return getattr(function, "func_code", None) | ||||||
| 
 | 
 | ||||||
|     def print_(*args, **kwargs): |     def print_(*args, **kwargs): | ||||||
|         """ minimal backport of py3k print statement. """  |         """ minimal backport of py3k print statement. """  | ||||||
|  | @ -175,6 +178,7 @@ else: | ||||||
| 
 | 
 | ||||||
|     def exec_(obj, globals=None, locals=None): |     def exec_(obj, globals=None, locals=None): | ||||||
|         """ minimal backport of py3k exec statement. """  |         """ minimal backport of py3k exec statement. """  | ||||||
|  |         __tracebackhide__ = True | ||||||
|         if globals is None:  |         if globals is None:  | ||||||
|             frame = sys._getframe(1) |             frame = sys._getframe(1) | ||||||
|             globals = frame.f_globals  |             globals = frame.f_globals  | ||||||
|  | @ -187,14 +191,17 @@ else: | ||||||
| if sys.version_info >= (3,0): | if sys.version_info >= (3,0): | ||||||
|     exec (""" |     exec (""" | ||||||
| def _reraise(cls, val, tb): | def _reraise(cls, val, tb): | ||||||
|  |     __tracebackhide__ = True | ||||||
|     assert hasattr(val, '__traceback__') |     assert hasattr(val, '__traceback__') | ||||||
|     raise val |     raise val | ||||||
| """) | """) | ||||||
| else: | else: | ||||||
|     exec (""" |     exec (""" | ||||||
| def _reraise(cls, val, tb): | def _reraise(cls, val, tb): | ||||||
|  |     __tracebackhide__ = True | ||||||
|     raise cls, val, tb |     raise cls, val, tb | ||||||
| def exec2(obj, globals, locals): | def exec2(obj, globals, locals): | ||||||
|  |     __tracebackhide__ = True | ||||||
|     exec obj in globals, locals  |     exec obj in globals, locals  | ||||||
| """) | """) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| #!/usr/bin/env python  | #!/usr/bin/env python  | ||||||
| import py | import py | ||||||
| 
 | 
 | ||||||
| def main(args): | def main(args=None): | ||||||
|     py.test.cmdline.main(args)  |     raise SystemExit(py.test.cmdline.main(args)) | ||||||
|  |  | ||||||
|  | @ -23,64 +23,14 @@ class Code(object): | ||||||
|     def __ne__(self, other): |     def __ne__(self, other): | ||||||
|         return not self == other |         return not self == other | ||||||
| 
 | 
 | ||||||
|     def new(self, rec=False, **kwargs):  |  | ||||||
|         """ return new code object with modified attributes.  |  | ||||||
|             if rec-cursive is true then dive into code  |  | ||||||
|             objects contained in co_consts.  |  | ||||||
|         """  |  | ||||||
|         if sys.platform.startswith("java"): |  | ||||||
|             # XXX jython does not support the below co_filename hack |  | ||||||
|             return self.raw  |  | ||||||
|         names = [x for x in dir(self.raw) if x[:3] == 'co_'] |  | ||||||
|         for name in kwargs:  |  | ||||||
|             if name not in names:  |  | ||||||
|                 raise TypeError("unknown code attribute: %r" %(name, )) |  | ||||||
|         if rec and hasattr(self.raw, 'co_consts'):  # jython  |  | ||||||
|             newconstlist = [] |  | ||||||
|             co = self.raw |  | ||||||
|             cotype = type(co) |  | ||||||
|             for c in co.co_consts: |  | ||||||
|                 if isinstance(c, cotype): |  | ||||||
|                     c = self.__class__(c).new(rec=True, **kwargs)  |  | ||||||
|                 newconstlist.append(c) |  | ||||||
|             return self.new(rec=False, co_consts=tuple(newconstlist), **kwargs)  |  | ||||||
|         for name in names: |  | ||||||
|             if name not in kwargs: |  | ||||||
|                 kwargs[name] = getattr(self.raw, name) |  | ||||||
|         arglist = [ |  | ||||||
|                  kwargs['co_argcount'], |  | ||||||
|                  kwargs['co_nlocals'], |  | ||||||
|                  kwargs.get('co_stacksize', 0), # jython |  | ||||||
|                  kwargs.get('co_flags', 0), # jython |  | ||||||
|                  kwargs.get('co_code', ''), # jython |  | ||||||
|                  kwargs.get('co_consts', ()), # jython |  | ||||||
|                  kwargs.get('co_names', []), #  |  | ||||||
|                  kwargs['co_varnames'], |  | ||||||
|                  kwargs['co_filename'], |  | ||||||
|                  kwargs['co_name'], |  | ||||||
|                  kwargs['co_firstlineno'], |  | ||||||
|                  kwargs.get('co_lnotab', ''), #jython |  | ||||||
|                  kwargs.get('co_freevars', None), #jython |  | ||||||
|                  kwargs.get('co_cellvars', None), # jython |  | ||||||
|         ] |  | ||||||
|         if sys.version_info >= (3,0): |  | ||||||
|             arglist.insert(1, kwargs['co_kwonlyargcount']) |  | ||||||
|             return self.raw.__class__(*arglist) |  | ||||||
|         else: |  | ||||||
|             return py.std.new.code(*arglist) |  | ||||||
| 
 |  | ||||||
|     def path(self): |     def path(self): | ||||||
|         """ return a path object pointing to source code""" |         """ return a path object pointing to source code""" | ||||||
|         fn = self.raw.co_filename  |         p = py.path.local(self.raw.co_filename) | ||||||
|         try: |         if not p.check(): | ||||||
|             return fn.__path__ |             # XXX maybe try harder like the weird logic  | ||||||
|         except AttributeError: |             # in the standard lib [linecache.updatecache] does?  | ||||||
|             p = py.path.local(self.raw.co_filename) |             p = self.raw.co_filename | ||||||
|             if not p.check(): |         return p | ||||||
|                 # XXX maybe try harder like the weird logic  |  | ||||||
|                 # in the standard lib [linecache.updatecache] does?  |  | ||||||
|                 p = self.raw.co_filename |  | ||||||
|             return p |  | ||||||
|                  |                  | ||||||
|     path = property(path, None, None, "path of this code object") |     path = property(path, None, None, "path of this code object") | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -212,10 +212,10 @@ class Source(object): | ||||||
|         else: |         else: | ||||||
|             if flag & _AST_FLAG: |             if flag & _AST_FLAG: | ||||||
|                 return co |                 return co | ||||||
|             co_filename = MyStr(filename) |             from types import ModuleType | ||||||
|             co_filename.__source__ = self |             lines = [(x + "\n") for x in self.lines] | ||||||
|             return py.code.Code(co).new(rec=1, co_filename=co_filename)  |             py.std.linecache.cache[filename] = (1, None, lines, filename) | ||||||
|             #return newcode_withfilename(co, co_filename) |             return co | ||||||
| 
 | 
 | ||||||
| # | # | ||||||
| # public API shortcut functions | # public API shortcut functions | ||||||
|  | @ -224,11 +224,9 @@ class Source(object): | ||||||
| def compile_(source, filename=None, mode='exec', flags= | def compile_(source, filename=None, mode='exec', flags= | ||||||
|             generators.compiler_flag, dont_inherit=0): |             generators.compiler_flag, dont_inherit=0): | ||||||
|     """ compile the given source to a raw code object, |     """ compile the given source to a raw code object, | ||||||
|         which points back to the source code through |         and maintain an internal cache which allows later | ||||||
|         "co_filename.__source__".  All code objects |         retrieval of the source code for the code object  | ||||||
|         contained in the code object will recursively |         and any recursively created code objects.  | ||||||
|         also have this special subclass-of-string |  | ||||||
|         filename. |  | ||||||
|     """ |     """ | ||||||
|     if _ast is not None and isinstance(source, _ast.AST): |     if _ast is not None and isinstance(source, _ast.AST): | ||||||
|         # XXX should Source support having AST? |         # XXX should Source support having AST? | ||||||
|  | @ -262,44 +260,26 @@ def getfslineno(obj): | ||||||
| # | # | ||||||
| # helper functions | # helper functions | ||||||
| # | # | ||||||
| class MyStr(str): |  | ||||||
|     """ custom string which allows to add attributes. """ |  | ||||||
| 
 | 
 | ||||||
| def findsource(obj): | def findsource(obj): | ||||||
|     obj = py.code.getrawcode(obj) |  | ||||||
|     try: |     try: | ||||||
|         fullsource = obj.co_filename.__source__ |         sourcelines, lineno = py.std.inspect.findsource(obj) | ||||||
|     except AttributeError: |     except (KeyboardInterrupt, SystemExit): | ||||||
|         try: |         raise | ||||||
|             sourcelines, lineno = py.std.inspect.findsource(obj) |     except: | ||||||
|         except (KeyboardInterrupt, SystemExit): |         return None, None | ||||||
|             raise |     source = Source() | ||||||
|         except: |     source.lines = [line.rstrip() for line in sourcelines] | ||||||
|             return None, None |     return source, lineno | ||||||
|         source = Source() |  | ||||||
|         source.lines = [line.rstrip() for line in sourcelines] |  | ||||||
|         return source, lineno |  | ||||||
|     else: |  | ||||||
|         lineno = obj.co_firstlineno - 1         |  | ||||||
|         return fullsource, lineno |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| def getsource(obj, **kwargs): | def getsource(obj, **kwargs): | ||||||
|     obj = py.code.getrawcode(obj) |     obj = py.code.getrawcode(obj) | ||||||
|     try: |     try: | ||||||
|         fullsource = obj.co_filename.__source__ |         strsrc = inspect.getsource(obj) | ||||||
|     except AttributeError: |     except IndentationError: | ||||||
|         try: |         strsrc = "\"Buggy python version consider upgrading, cannot get source\"" | ||||||
|             strsrc = inspect.getsource(obj) |     assert isinstance(strsrc, str) | ||||||
|         except IndentationError: |     return Source(strsrc, **kwargs) | ||||||
|             strsrc = "\"Buggy python version consider upgrading, cannot get source\"" |  | ||||||
|         assert isinstance(strsrc, str) |  | ||||||
|         return Source(strsrc, **kwargs) |  | ||||||
|     else: |  | ||||||
|         lineno = obj.co_firstlineno - 1 |  | ||||||
|         end = fullsource.getblockend(lineno) |  | ||||||
|         return Source(fullsource[lineno:end+1], deident=True) |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| def deindent(lines, offset=None): | def deindent(lines, offset=None): | ||||||
|     if offset is None: |     if offset is None: | ||||||
|  |  | ||||||
|  | @ -16,8 +16,9 @@ def main(args=None): | ||||||
|         colitems = config.getinitialnodes() |         colitems = config.getinitialnodes() | ||||||
|         exitstatus = session.main(colitems) |         exitstatus = session.main(colitems) | ||||||
|         config.pluginmanager.do_unconfigure(config) |         config.pluginmanager.do_unconfigure(config) | ||||||
|         raise SystemExit(exitstatus) |  | ||||||
|     except config.Error: |     except config.Error: | ||||||
|         e = sys.exc_info()[1] |         e = sys.exc_info()[1] | ||||||
|         sys.stderr.write("ERROR: %s\n" %(e.args[0],)) |         sys.stderr.write("ERROR: %s\n" %(e.args[0],)) | ||||||
|         raise SystemExit(3) |         exitstatus = 3 | ||||||
|  |     py.test.config = py.test.config.__class__() | ||||||
|  |     return exitstatus | ||||||
|  |  | ||||||
|  | @ -393,5 +393,5 @@ class Function(FunctionMixin, py.test.collect.Item): | ||||||
| def hasinit(obj): | def hasinit(obj): | ||||||
|     init = getattr(obj, '__init__', None) |     init = getattr(obj, '__init__', None) | ||||||
|     if init: |     if init: | ||||||
|         if not isinstance(init, type(object.__init__)): |         if init != object.__init__: | ||||||
|             return True |             return True | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								setup.py
								
								
								
								
							
							
						
						
									
										2
									
								
								setup.py
								
								
								
								
							|  | @ -26,7 +26,7 @@ def main(): | ||||||
|         name='py', |         name='py', | ||||||
|         description='py.test and pylib: rapid testing and development utils.', |         description='py.test and pylib: rapid testing and development utils.', | ||||||
|         long_description = long_description, |         long_description = long_description, | ||||||
|         version= '1.3.0', |         version= '1.3.1a1', | ||||||
|         url='http://pylib.org', |         url='http://pylib.org', | ||||||
|         license='MIT license', |         license='MIT license', | ||||||
|         platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'], |         platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'], | ||||||
|  |  | ||||||
|  | @ -89,3 +89,19 @@ class TestGeneralUsage: | ||||||
|         assert result.ret == 0 |         assert result.ret == 0 | ||||||
|         s = result.stdout.str() |         s = result.stdout.str() | ||||||
|         assert 'MarkGenerator' in s |         assert 'MarkGenerator' in s | ||||||
|  | 
 | ||||||
|  |     def test_double_pytestcmdline(self, testdir): | ||||||
|  |         p = testdir.makepyfile(run=""" | ||||||
|  |             import py | ||||||
|  |             py.test.cmdline.main() | ||||||
|  |             py.test.cmdline.main() | ||||||
|  |         """) | ||||||
|  |         testdir.makepyfile(""" | ||||||
|  |             def test_hello(): | ||||||
|  |                 pass | ||||||
|  |         """) | ||||||
|  |         result = testdir.runpython(p) | ||||||
|  |         result.stdout.fnmatch_lines([ | ||||||
|  |             "*1 passed*", | ||||||
|  |             "*1 passed*", | ||||||
|  |         ]) | ||||||
|  |  | ||||||
|  | @ -1,87 +1,12 @@ | ||||||
| from __future__ import generators |  | ||||||
| import py | import py | ||||||
| import sys | import sys | ||||||
| 
 | 
 | ||||||
| failsonjython = py.test.mark.xfail("sys.platform.startswith('java')") |  | ||||||
| 
 |  | ||||||
| def test_newcode():  |  | ||||||
|     source = "i = 3" |  | ||||||
|     co = compile(source, '', 'exec')  |  | ||||||
|     code = py.code.Code(co)  |  | ||||||
|     newco = code.new()  |  | ||||||
|     assert co == newco  |  | ||||||
| 
 |  | ||||||
| def test_ne(): | def test_ne(): | ||||||
|     code1 = py.code.Code(compile('foo = "bar"', '', 'exec')) |     code1 = py.code.Code(compile('foo = "bar"', '', 'exec')) | ||||||
|     assert code1 == code1 |     assert code1 == code1 | ||||||
|     code2 = py.code.Code(compile('foo = "baz"', '', 'exec')) |     code2 = py.code.Code(compile('foo = "baz"', '', 'exec')) | ||||||
|     assert code2 != code1 |     assert code2 != code1 | ||||||
| 
 | 
 | ||||||
| @failsonjython |  | ||||||
| def test_newcode_unknown_args():  |  | ||||||
|     code = py.code.Code(compile("", '', 'exec')) |  | ||||||
|     py.test.raises(TypeError, 'code.new(filename="hello")') |  | ||||||
| 
 |  | ||||||
| @failsonjython |  | ||||||
| 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 |  | ||||||
| 
 |  | ||||||
| @failsonjython |  | ||||||
| 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.__source__ == filename.__source__ |  | ||||||
|     s = py.code.Source(newco)  |  | ||||||
|     assert str(s) == source  |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| @failsonjython |  | ||||||
| def test_new_code_object_carries_filename_through(): |  | ||||||
|     class mystr(str): |  | ||||||
|         pass |  | ||||||
|     filename = mystr("dummy") |  | ||||||
|     co = compile("hello\n", filename, 'exec') |  | ||||||
|     assert not isinstance(co.co_filename, mystr) |  | ||||||
|     args = [ |  | ||||||
|             co.co_argcount, co.co_nlocals, co.co_stacksize, |  | ||||||
|              co.co_flags, co.co_code, co.co_consts, |  | ||||||
|              co.co_names, co.co_varnames, |  | ||||||
|              filename, |  | ||||||
|              co.co_name, co.co_firstlineno, co.co_lnotab, |  | ||||||
|              co.co_freevars, co.co_cellvars |  | ||||||
|     ] |  | ||||||
|     if sys.version_info > (3,0): |  | ||||||
|         args.insert(1, co.co_kwonlyargcount) |  | ||||||
|     c2 = py.std.types.CodeType(*args) |  | ||||||
|     assert c2.co_filename is filename |  | ||||||
| 
 |  | ||||||
| def test_code_gives_back_name_for_not_existing_file(): | def test_code_gives_back_name_for_not_existing_file(): | ||||||
|     name = 'abc-123' |     name = 'abc-123' | ||||||
|     co_code = compile("pass\n", name, 'exec') |     co_code = compile("pass\n", name, 'exec') | ||||||
|  |  | ||||||
|  | @ -293,7 +293,6 @@ class TestFormattedExcinfo: | ||||||
|         assert lines[0] == "|   def f(x):" |         assert lines[0] == "|   def f(x):" | ||||||
|         assert lines[1] == "        pass" |         assert lines[1] == "        pass" | ||||||
| 
 | 
 | ||||||
|     @failsonjython |  | ||||||
|     def test_repr_source_excinfo(self): |     def test_repr_source_excinfo(self): | ||||||
|         """ check if indentation is right """ |         """ check if indentation is right """ | ||||||
|         pr = FormattedExcinfo() |         pr = FormattedExcinfo() | ||||||
|  |  | ||||||
|  | @ -80,11 +80,10 @@ def test_source_strip_multiline(): | ||||||
|     source2 = source.strip()  |     source2 = source.strip()  | ||||||
|     assert source2.lines == [" hello"] |     assert source2.lines == [" hello"] | ||||||
| 
 | 
 | ||||||
| @failsonjython |  | ||||||
| def test_syntaxerror_rerepresentation(): | def test_syntaxerror_rerepresentation(): | ||||||
|     ex = py.test.raises(SyntaxError, py.code.compile, 'x x') |     ex = py.test.raises(SyntaxError, py.code.compile, 'xyz xyz') | ||||||
|     assert ex.value.lineno == 1 |     assert ex.value.lineno == 1 | ||||||
|     assert ex.value.offset == 3 |     assert ex.value.offset in (4,7) # XXX pypy/jython versus cpython?  | ||||||
|     assert ex.value.text.strip(), 'x x' |     assert ex.value.text.strip(), 'x x' | ||||||
| 
 | 
 | ||||||
| def test_isparseable(): | def test_isparseable(): | ||||||
|  | @ -132,7 +131,6 @@ class TestSourceParsingAndCompiling: | ||||||
|         exec (co, d) |         exec (co, d) | ||||||
|         assert d['x'] == 3 |         assert d['x'] == 3 | ||||||
| 
 | 
 | ||||||
|     @failsonjython |  | ||||||
|     def test_compile_and_getsource_simple(self): |     def test_compile_and_getsource_simple(self): | ||||||
|         co = py.code.compile("x=3") |         co = py.code.compile("x=3") | ||||||
|         exec (co) |         exec (co) | ||||||
|  | @ -203,7 +201,6 @@ class TestSourceParsingAndCompiling: | ||||||
|         assert isinstance(mod, ast.Module) |         assert isinstance(mod, ast.Module) | ||||||
|         compile(mod, "<filename>", "exec") |         compile(mod, "<filename>", "exec") | ||||||
| 
 | 
 | ||||||
|     @failsonjython |  | ||||||
|     def test_compile_and_getsource(self): |     def test_compile_and_getsource(self): | ||||||
|         co = self.source.compile() |         co = self.source.compile() | ||||||
|         py.builtin.exec_(co, globals()) |         py.builtin.exec_(co, globals()) | ||||||
|  | @ -260,7 +257,6 @@ def test_getstartingblock_multiline(): | ||||||
|     l = [i for i in x.source.lines if i.strip()] |     l = [i for i in x.source.lines if i.strip()] | ||||||
|     assert len(l) == 4 |     assert len(l) == 4 | ||||||
| 
 | 
 | ||||||
| @failsonjython |  | ||||||
| def test_getline_finally(): | def test_getline_finally(): | ||||||
|     def c(): pass |     def c(): pass | ||||||
|     excinfo = py.test.raises(TypeError, """ |     excinfo = py.test.raises(TypeError, """ | ||||||
|  | @ -274,7 +270,6 @@ def test_getline_finally(): | ||||||
|     source = excinfo.traceback[-1].statement |     source = excinfo.traceback[-1].statement | ||||||
|     assert str(source).strip() == 'c(1)' |     assert str(source).strip() == 'c(1)' | ||||||
| 
 | 
 | ||||||
| @failsonjython |  | ||||||
| def test_getfuncsource_dynamic(): | def test_getfuncsource_dynamic(): | ||||||
|     source = """ |     source = """ | ||||||
|         def f(): |         def f(): | ||||||
|  | @ -341,7 +336,6 @@ def test_getsource_fallback(): | ||||||
|     src = getsource(x) |     src = getsource(x) | ||||||
|     assert src == expected |     assert src == expected | ||||||
| 
 | 
 | ||||||
| @failsonjython |  | ||||||
| def test_idem_compile_and_getsource(): | def test_idem_compile_and_getsource(): | ||||||
|     from py._code.source import getsource |     from py._code.source import getsource | ||||||
|     expected = "def x(): pass" |     expected = "def x(): pass" | ||||||
|  | @ -355,8 +349,7 @@ def test_findsource_fallback(): | ||||||
|     assert 'test_findsource_simple' in str(src) |     assert 'test_findsource_simple' in str(src) | ||||||
|     assert src[lineno] == '    def x():' |     assert src[lineno] == '    def x():' | ||||||
| 
 | 
 | ||||||
| @failsonjython | def test_findsource(): | ||||||
| def test_findsource___source__(): |  | ||||||
|     from py._code.source import findsource |     from py._code.source import findsource | ||||||
|     co = py.code.compile("""if 1: |     co = py.code.compile("""if 1: | ||||||
|     def x(): |     def x(): | ||||||
|  | @ -373,7 +366,6 @@ def test_findsource___source__(): | ||||||
|     assert src[lineno] == "    def x():" |     assert src[lineno] == "    def x():" | ||||||
|      |      | ||||||
| 
 | 
 | ||||||
| @failsonjython |  | ||||||
| def test_getfslineno(): | def test_getfslineno(): | ||||||
|     from py.code import getfslineno |     from py.code import getfslineno | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -316,7 +316,11 @@ def test_runtest_in_module_ordering(testdir): | ||||||
| 
 | 
 | ||||||
| class TestRaises: | class TestRaises: | ||||||
|     def test_raises(self): |     def test_raises(self): | ||||||
|         py.test.raises(ValueError, "int('qwe')") |         source = "int('qwe')" | ||||||
|  |         excinfo = py.test.raises(ValueError, source) | ||||||
|  |         code = excinfo.traceback[-1].frame.code | ||||||
|  |         s = str(code.fullsource) | ||||||
|  |         assert s == source  | ||||||
| 
 | 
 | ||||||
|     def test_raises_exec(self): |     def test_raises_exec(self): | ||||||
|         py.test.raises(ValueError, "a,x = []")  |         py.test.raises(ValueError, "a,x = []")  | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue