deprecate py.magic.autopath() and finally remove py/magic directory.
--HG-- branch : trunk
This commit is contained in:
		
							parent
							
								
									13932b7f4b
								
							
						
					
					
						commit
						681d344eac
					
				|  | @ -1,6 +1,12 @@ | |||
| Changes between 1.0.x and 'trunk' | ||||
| ===================================== | ||||
| 
 | ||||
| * deprecate py.magic.autopath, remove py/magic directory  | ||||
| 
 | ||||
| * move pytest assertion handling to py/code and a pytest_assertion | ||||
|   plugin, add "--no-assert" option, deprecate py.magic namespaces  | ||||
|   in favour of (less) py.code ones.  | ||||
| 
 | ||||
| * consolidate and cleanup py/code classes and files  | ||||
| 
 | ||||
| * cleanup py/misc, move tests to bin-for-dist  | ||||
|  |  | |||
|  | @ -113,12 +113,12 @@ initpkg(__name__, | |||
|     'path.SvnAuth'           : ('./path/svnwc.py', 'SvnAuth'), | ||||
| 
 | ||||
|     # some nice slightly magic APIs | ||||
|     'magic.__doc__'          : ('./magic/__init__.py', '__doc__'), | ||||
|     #'magic.__doc__'          : ('./magic/__init__.py', '__doc__'), | ||||
|     'magic.invoke'           : ('./code/oldmagic.py', 'invoke'), | ||||
|     'magic.revoke'           : ('./code/oldmagic.py', 'revoke'), | ||||
|     'magic.patch'            : ('./code/oldmagic.py', 'patch'), | ||||
|     'magic.revert'           : ('./code/oldmagic.py', 'revert'), | ||||
|     'magic.autopath'         : ('./magic/autopath.py', 'autopath'), | ||||
|     'magic.autopath'         : ('./path/local.py', 'autopath'), | ||||
|     'magic.AssertionError'   : ('./code/oldmagic2.py', 'AssertionError'), | ||||
| 
 | ||||
|     # python inspection/code-generation API | ||||
|  |  | |||
|  | @ -1,7 +1,92 @@ | |||
| import py | ||||
| import sys | ||||
| import sys, os | ||||
| 
 | ||||
| class TestAutoPath: | ||||
| def check_assertion(): | ||||
|     excinfo = py.test.raises(AssertionError, "assert 1 == 2") | ||||
|     s = excinfo.exconly(tryshort=True) | ||||
|     if not s == "assert 1 == 2": | ||||
|         raise ValueError("assertion not enabled: got %s" % s) | ||||
| 
 | ||||
| def test_invoke_assertion(recwarn, monkeypatch): | ||||
|     monkeypatch.setattr(py.std.__builtin__, 'AssertionError', None) | ||||
|     py.magic.invoke(assertion=True) | ||||
|     try: | ||||
|         check_assertion() | ||||
|     finally: | ||||
|         py.magic.revoke(assertion=True) | ||||
|     recwarn.pop(DeprecationWarning) | ||||
| 
 | ||||
| def test_invoke_compile(recwarn, monkeypatch): | ||||
|     monkeypatch.setattr(py.std.__builtin__, 'compile', None) | ||||
|     py.magic.invoke(compile=True) | ||||
|     try: | ||||
|         co = compile("""if 1:  | ||||
|                     def f():  | ||||
|                         return 1 | ||||
|                     \n""", '', 'exec') | ||||
|         d = {} | ||||
|         exec co in d | ||||
|         assert py.code.Source(d['f'])  | ||||
|     finally: | ||||
|         py.magic.revoke(compile=True) | ||||
|     recwarn.pop(DeprecationWarning) | ||||
| 
 | ||||
| def test_patch_revert(recwarn): | ||||
|     class a: | ||||
|         pass | ||||
|     py.test.raises(AttributeError, "py.magic.patch(a, 'i', 42)") | ||||
| 
 | ||||
|     a.i = 42 | ||||
|     py.magic.patch(a, 'i', 23) | ||||
|     assert a.i == 23 | ||||
|     recwarn.pop(DeprecationWarning) | ||||
|     py.magic.revert(a, 'i') | ||||
|     assert a.i == 42 | ||||
|     recwarn.pop(DeprecationWarning) | ||||
| 
 | ||||
| def test_double_patch(recwarn): | ||||
|     class a: | ||||
|         i = 42 | ||||
|     assert py.magic.patch(a, 'i', 2) == 42 | ||||
|     recwarn.pop(DeprecationWarning) | ||||
|     assert py.magic.patch(a, 'i', 3) == 2 | ||||
|     assert a.i == 3 | ||||
|     assert py.magic.revert(a, 'i') == 3 | ||||
|     recwarn.pop(DeprecationWarning) | ||||
|     assert a.i == 2 | ||||
|     assert py.magic.revert(a, 'i') == 2 | ||||
|     assert a.i == 42 | ||||
| 
 | ||||
| def test_valueerror(recwarn): | ||||
|     class a: | ||||
|         i = 2 | ||||
|         pass | ||||
|     py.test.raises(ValueError, "py.magic.revert(a, 'i')") | ||||
|     recwarn.pop(DeprecationWarning) | ||||
| 
 | ||||
| def test_AssertionError(testdir): | ||||
|     testdir.makepyfile(""" | ||||
|         import py | ||||
|         def test_hello(recwarn): | ||||
|             err = py.magic.AssertionError | ||||
|             recwarn.pop(DeprecationWarning) | ||||
|             assert err is py.code._AssertionError | ||||
|     """) | ||||
|     result = testdir.runpytest()  | ||||
|     assert "1 passed" in result.stdout.str() | ||||
| 
 | ||||
| def test_autopath_deprecation(testdir): | ||||
|     testdir.makepyfile(""" | ||||
|         import py | ||||
|         def test_hello(recwarn): | ||||
|             p = py.magic.autopath() | ||||
|             recwarn.pop(DeprecationWarning) | ||||
|             assert py.path.local(__file__).dirpath() == p.dirpath() | ||||
|     """) | ||||
|     result = testdir.runpytest()  | ||||
|     assert "1 passed" in result.stdout.str() | ||||
| 
 | ||||
| class Testautopath: | ||||
|     getauto = "from py.magic import autopath ; autopath = autopath()" | ||||
|     def setup_class(cls):  | ||||
|         cls.root = py.test.ensuretemp(cls.__name__)  | ||||
|  | @ -161,13 +161,3 @@ class TestView: | |||
|         assert codelines == ["4 + 5", "getitem('', 'join')",  | ||||
|             "setattr('x', 'y', 3)", "12 - 1"] | ||||
| 
 | ||||
| def test_AssertionError(testdir): | ||||
|     testdir.makepyfile(""" | ||||
|         import py | ||||
|         def test_hello(recwarn): | ||||
|             err = py.magic.AssertionError | ||||
|             recwarn.pop(DeprecationWarning) | ||||
|             assert err is py.code._AssertionError | ||||
|     """) | ||||
|     result = testdir.runpytest()  | ||||
|     assert "1 passed" in result.stdout.str() | ||||
|  |  | |||
|  | @ -1,64 +0,0 @@ | |||
| import py | ||||
| 
 | ||||
| def check_assertion(): | ||||
|     excinfo = py.test.raises(AssertionError, "assert 1 == 2") | ||||
|     s = excinfo.exconly(tryshort=True) | ||||
|     if not s == "assert 1 == 2": | ||||
|         raise ValueError("assertion not enabled: got %s" % s) | ||||
| 
 | ||||
| def test_invoke_assertion(recwarn, monkeypatch): | ||||
|     monkeypatch.setattr(py.std.__builtin__, 'AssertionError', None) | ||||
|     py.magic.invoke(assertion=True) | ||||
|     try: | ||||
|         check_assertion() | ||||
|     finally: | ||||
|         py.magic.revoke(assertion=True) | ||||
|     recwarn.pop(DeprecationWarning) | ||||
| 
 | ||||
| def test_invoke_compile(recwarn, monkeypatch): | ||||
|     monkeypatch.setattr(py.std.__builtin__, 'compile', None) | ||||
|     py.magic.invoke(compile=True) | ||||
|     try: | ||||
|         co = compile("""if 1:  | ||||
|                     def f():  | ||||
|                         return 1 | ||||
|                     \n""", '', 'exec') | ||||
|         d = {} | ||||
|         exec co in d | ||||
|         assert py.code.Source(d['f'])  | ||||
|     finally: | ||||
|         py.magic.revoke(compile=True) | ||||
|     recwarn.pop(DeprecationWarning) | ||||
| 
 | ||||
| def test_patch_revert(recwarn): | ||||
|     class a: | ||||
|         pass | ||||
|     py.test.raises(AttributeError, "py.magic.patch(a, 'i', 42)") | ||||
| 
 | ||||
|     a.i = 42 | ||||
|     py.magic.patch(a, 'i', 23) | ||||
|     assert a.i == 23 | ||||
|     recwarn.pop(DeprecationWarning) | ||||
|     py.magic.revert(a, 'i') | ||||
|     assert a.i == 42 | ||||
|     recwarn.pop(DeprecationWarning) | ||||
| 
 | ||||
| def test_double_patch(recwarn): | ||||
|     class a: | ||||
|         i = 42 | ||||
|     assert py.magic.patch(a, 'i', 2) == 42 | ||||
|     recwarn.pop(DeprecationWarning) | ||||
|     assert py.magic.patch(a, 'i', 3) == 2 | ||||
|     assert a.i == 3 | ||||
|     assert py.magic.revert(a, 'i') == 3 | ||||
|     recwarn.pop(DeprecationWarning) | ||||
|     assert a.i == 2 | ||||
|     assert py.magic.revert(a, 'i') == 2 | ||||
|     assert a.i == 42 | ||||
| 
 | ||||
| def test_valueerror(recwarn): | ||||
|     class a: | ||||
|         i = 2 | ||||
|         pass | ||||
|     py.test.raises(ValueError, "py.magic.revert(a, 'i')") | ||||
|     recwarn.pop(DeprecationWarning) | ||||
|  | @ -2,8 +2,6 @@ from __future__ import generators | |||
| import os, sys, time, signal | ||||
| import py | ||||
| from py.__.execnet import gateway | ||||
| mypath = py.magic.autopath() | ||||
| 
 | ||||
| from py.__.execnet.register import startup_modules, getsource  | ||||
| 
 | ||||
| TESTTIMEOUT = 10.0 # seconds | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| import py | ||||
| mypath = py.magic.autopath() | ||||
| mypath = py.path.local(__file__).new(ext=".py") | ||||
| 
 | ||||
| def test_forwarding_to_warnings_module(): | ||||
|     py.test.deprecated_call(py.log._apiwarn, "1.3", "..") | ||||
|  |  | |||
|  | @ -1 +0,0 @@ | |||
| """ some nice, slightly magic APIs """ | ||||
|  | @ -1,35 +0,0 @@ | |||
| import os, sys | ||||
| from py.path import local | ||||
| 
 | ||||
| def autopath(globs=None): | ||||
|     """ return the (local) path of the "current" file pointed to by globals | ||||
|         or - if it is none - alternatively the callers frame globals. | ||||
| 
 | ||||
|         the path will always point to a .py file  or to None. | ||||
|         the path will have the following payload: | ||||
|         pkgdir   is the last parent directory path containing __init__.py  | ||||
|     """ | ||||
|     if globs is None: | ||||
|         globs = sys._getframe(1).f_globals | ||||
|     try: | ||||
|         __file__ = globs['__file__'] | ||||
|     except KeyError: | ||||
|         if not sys.argv[0]: | ||||
|             raise ValueError, "cannot compute autopath in interactive mode" | ||||
|         __file__ = os.path.abspath(sys.argv[0]) | ||||
| 
 | ||||
|     ret = local(__file__) | ||||
|     if ret.ext in ('.pyc', '.pyo'): | ||||
|         ret = ret.new(ext='.py') | ||||
|     current = pkgdir = ret.dirpath() | ||||
|     while 1: | ||||
|         if current.join('__init__.py').check(): | ||||
|             pkgdir = current | ||||
|             current = current.dirpath() | ||||
|             if pkgdir != current: | ||||
|                 continue | ||||
|         elif str(current) not in sys.path: | ||||
|             sys.path.insert(0, str(current)) | ||||
|         break | ||||
|     ret.pkgdir = pkgdir | ||||
|     return ret | ||||
|  | @ -1 +0,0 @@ | |||
| # | ||||
|  | @ -744,3 +744,38 @@ def copychunked(src, dest): | |||
|             fdest.close() | ||||
|     finally: | ||||
|         fsrc.close() | ||||
| 
 | ||||
| def autopath(globs=None): | ||||
|     """ (deprecated) return the (local) path of the "current" file pointed to by globals or - if it is none - alternatively the callers frame globals. | ||||
| 
 | ||||
|         the path will always point to a .py file  or to None. | ||||
|         the path will have the following payload: | ||||
|         pkgdir   is the last parent directory path containing __init__.py  | ||||
|     """ | ||||
|     py.log._apiwarn("1.1", "py.magic.autopath deprecated, " | ||||
|         "use py.path.local(__file__) and maybe pypkgpath/pyimport().") | ||||
|     if globs is None: | ||||
|         globs = sys._getframe(1).f_globals | ||||
|     try: | ||||
|         __file__ = globs['__file__'] | ||||
|     except KeyError: | ||||
|         if not sys.argv[0]: | ||||
|             raise ValueError, "cannot compute autopath in interactive mode" | ||||
|         __file__ = os.path.abspath(sys.argv[0]) | ||||
| 
 | ||||
|     ret = py.path.local(__file__) | ||||
|     if ret.ext in ('.pyc', '.pyo'): | ||||
|         ret = ret.new(ext='.py') | ||||
|     current = pkgdir = ret.dirpath() | ||||
|     while 1: | ||||
|         if current.join('__init__.py').check(): | ||||
|             pkgdir = current | ||||
|             current = current.dirpath() | ||||
|             if pkgdir != current: | ||||
|                 continue | ||||
|         elif str(current) not in sys.path: | ||||
|             sys.path.insert(0, str(current)) | ||||
|         break | ||||
|     ret.pkgdir = pkgdir | ||||
|     return ret | ||||
| 
 | ||||
|  |  | |||
|  | @ -28,12 +28,12 @@ def setuptestfs(path): | |||
|     module_b = otherdir.ensure('b.py') | ||||
|     module_b.write('stuff="got it"\n') | ||||
|     module_c = otherdir.ensure('c.py') | ||||
|     module_c.write('''import py; py.magic.autopath() | ||||
|     module_c.write('''import py;  | ||||
| import otherdir.a | ||||
| value = otherdir.a.result | ||||
| ''') | ||||
|     module_d = otherdir.ensure('d.py') | ||||
|     module_d.write('''import py; py.magic.autopath() | ||||
|     module_d.write('''import py;  | ||||
| from otherdir import a | ||||
| value2 = a.result | ||||
| ''') | ||||
|  |  | |||
|  | @ -4,8 +4,7 @@ from py import path, test, process | |||
| from py.__.path.testing.fscommon import CommonFSTests, setuptestfs | ||||
| from py.__.path import svnwc as svncommon | ||||
| 
 | ||||
| mypath = py.magic.autopath() | ||||
| repodump = mypath.dirpath('repotest.dump') | ||||
| repodump = py.path.local(__file__).dirpath('repotest.dump') | ||||
| 
 | ||||
| def getsvnbin(): | ||||
|     svnbin = py.path.local.sysfind('svn') | ||||
|  |  | |||
|  | @ -0,0 +1,3 @@ | |||
| import py | ||||
| import sys | ||||
| 
 | ||||
|  | @ -461,8 +461,10 @@ class TestInfoSvnWCCommand: | |||
|         Properties Last Updated: 2006-05-23 11:54:59 +0200 (Tue, 23 May 2006) | ||||
|         Checksum: 357e44880e5d80157cc5fbc3ce9822e3 | ||||
|         """ | ||||
|         path = py.magic.autopath().dirpath().chdir() | ||||
|         path = py.path.local(__file__).dirpath().chdir() | ||||
|         try:     | ||||
|             info = InfoSvnWCCommand(output) | ||||
|         finally: | ||||
|             path.chdir() | ||||
|         assert info.last_author == 'jan' | ||||
|         assert info.kind == 'file' | ||||
|  | @ -489,8 +491,10 @@ class TestInfoSvnWCCommand: | |||
|         Properties Last Updated: 2006-06-02 23:45:28 +0200 (Fri, 02 Jun 2006) | ||||
|         Checksum: 357e44880e5d80157cc5fbc3ce9822e3 | ||||
|         """ | ||||
|         path = py.magic.autopath().dirpath().chdir() | ||||
|         path = py.path.local(__file__).dirpath().chdir() | ||||
|         try: | ||||
|             info = InfoSvnWCCommand(output) | ||||
|         finally: | ||||
|             path.chdir() | ||||
|         assert info.last_author == 'jan' | ||||
|         assert info.kind == 'file' | ||||
|  |  | |||
|  | @ -71,7 +71,7 @@ def create_stylesheet(options, path): | |||
|     fill_in["heading"] = options.get("heading", "") | ||||
|     template_file = path.join("rest.sty.template") | ||||
|     if not template_file.check(): | ||||
|         template_file = py.magic.autopath().dirpath().join("rest.sty.template") | ||||
|         template_file = py.path.local(__file__).dirpath("rest.sty.template") | ||||
|     return template_file.read() % fill_in | ||||
| 
 | ||||
| def process_configfile(configfile, debug=False): | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| import py | ||||
| 
 | ||||
| pydir = py.path.local(py.__file__).dirpath() | ||||
| mydatadir = py.magic.autopath().dirpath().join("data") | ||||
| mydatadir = py.path.local(__file__).dirpath('data') | ||||
| 
 | ||||
| def getdata(): | ||||
|     rel = mydatadir.relto(pydir) | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| import py | ||||
| defaultconftestpath = py.magic.autopath().dirpath('defaultconftest.py') | ||||
| defaultconftestpath = py.path.local(__file__).dirpath("defaultconftest.py") | ||||
| 
 | ||||
| class Conftest(object): | ||||
|     """ the single place for accessing values and interacting  | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue