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'
|
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
|
* consolidate and cleanup py/code classes and files
|
||||||
|
|
||||||
* cleanup py/misc, move tests to bin-for-dist
|
* cleanup py/misc, move tests to bin-for-dist
|
||||||
|
|
|
@ -113,12 +113,12 @@ initpkg(__name__,
|
||||||
'path.SvnAuth' : ('./path/svnwc.py', 'SvnAuth'),
|
'path.SvnAuth' : ('./path/svnwc.py', 'SvnAuth'),
|
||||||
|
|
||||||
# some nice slightly magic APIs
|
# some nice slightly magic APIs
|
||||||
'magic.__doc__' : ('./magic/__init__.py', '__doc__'),
|
#'magic.__doc__' : ('./magic/__init__.py', '__doc__'),
|
||||||
'magic.invoke' : ('./code/oldmagic.py', 'invoke'),
|
'magic.invoke' : ('./code/oldmagic.py', 'invoke'),
|
||||||
'magic.revoke' : ('./code/oldmagic.py', 'revoke'),
|
'magic.revoke' : ('./code/oldmagic.py', 'revoke'),
|
||||||
'magic.patch' : ('./code/oldmagic.py', 'patch'),
|
'magic.patch' : ('./code/oldmagic.py', 'patch'),
|
||||||
'magic.revert' : ('./code/oldmagic.py', 'revert'),
|
'magic.revert' : ('./code/oldmagic.py', 'revert'),
|
||||||
'magic.autopath' : ('./magic/autopath.py', 'autopath'),
|
'magic.autopath' : ('./path/local.py', 'autopath'),
|
||||||
'magic.AssertionError' : ('./code/oldmagic2.py', 'AssertionError'),
|
'magic.AssertionError' : ('./code/oldmagic2.py', 'AssertionError'),
|
||||||
|
|
||||||
# python inspection/code-generation API
|
# python inspection/code-generation API
|
||||||
|
|
|
@ -1,7 +1,92 @@
|
||||||
import py
|
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()"
|
getauto = "from py.magic import autopath ; autopath = autopath()"
|
||||||
def setup_class(cls):
|
def setup_class(cls):
|
||||||
cls.root = py.test.ensuretemp(cls.__name__)
|
cls.root = py.test.ensuretemp(cls.__name__)
|
|
@ -161,13 +161,3 @@ class TestView:
|
||||||
assert codelines == ["4 + 5", "getitem('', 'join')",
|
assert codelines == ["4 + 5", "getitem('', 'join')",
|
||||||
"setattr('x', 'y', 3)", "12 - 1"]
|
"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 os, sys, time, signal
|
||||||
import py
|
import py
|
||||||
from py.__.execnet import gateway
|
from py.__.execnet import gateway
|
||||||
mypath = py.magic.autopath()
|
|
||||||
|
|
||||||
from py.__.execnet.register import startup_modules, getsource
|
from py.__.execnet.register import startup_modules, getsource
|
||||||
|
|
||||||
TESTTIMEOUT = 10.0 # seconds
|
TESTTIMEOUT = 10.0 # seconds
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import py
|
import py
|
||||||
mypath = py.magic.autopath()
|
mypath = py.path.local(__file__).new(ext=".py")
|
||||||
|
|
||||||
def test_forwarding_to_warnings_module():
|
def test_forwarding_to_warnings_module():
|
||||||
py.test.deprecated_call(py.log._apiwarn, "1.3", "..")
|
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()
|
fdest.close()
|
||||||
finally:
|
finally:
|
||||||
fsrc.close()
|
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 = otherdir.ensure('b.py')
|
||||||
module_b.write('stuff="got it"\n')
|
module_b.write('stuff="got it"\n')
|
||||||
module_c = otherdir.ensure('c.py')
|
module_c = otherdir.ensure('c.py')
|
||||||
module_c.write('''import py; py.magic.autopath()
|
module_c.write('''import py;
|
||||||
import otherdir.a
|
import otherdir.a
|
||||||
value = otherdir.a.result
|
value = otherdir.a.result
|
||||||
''')
|
''')
|
||||||
module_d = otherdir.ensure('d.py')
|
module_d = otherdir.ensure('d.py')
|
||||||
module_d.write('''import py; py.magic.autopath()
|
module_d.write('''import py;
|
||||||
from otherdir import a
|
from otherdir import a
|
||||||
value2 = a.result
|
value2 = a.result
|
||||||
''')
|
''')
|
||||||
|
|
|
@ -4,8 +4,7 @@ from py import path, test, process
|
||||||
from py.__.path.testing.fscommon import CommonFSTests, setuptestfs
|
from py.__.path.testing.fscommon import CommonFSTests, setuptestfs
|
||||||
from py.__.path import svnwc as svncommon
|
from py.__.path import svnwc as svncommon
|
||||||
|
|
||||||
mypath = py.magic.autopath()
|
repodump = py.path.local(__file__).dirpath('repotest.dump')
|
||||||
repodump = mypath.dirpath('repotest.dump')
|
|
||||||
|
|
||||||
def getsvnbin():
|
def getsvnbin():
|
||||||
svnbin = py.path.local.sysfind('svn')
|
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)
|
Properties Last Updated: 2006-05-23 11:54:59 +0200 (Tue, 23 May 2006)
|
||||||
Checksum: 357e44880e5d80157cc5fbc3ce9822e3
|
Checksum: 357e44880e5d80157cc5fbc3ce9822e3
|
||||||
"""
|
"""
|
||||||
path = py.magic.autopath().dirpath().chdir()
|
path = py.path.local(__file__).dirpath().chdir()
|
||||||
|
try:
|
||||||
info = InfoSvnWCCommand(output)
|
info = InfoSvnWCCommand(output)
|
||||||
|
finally:
|
||||||
path.chdir()
|
path.chdir()
|
||||||
assert info.last_author == 'jan'
|
assert info.last_author == 'jan'
|
||||||
assert info.kind == 'file'
|
assert info.kind == 'file'
|
||||||
|
@ -489,8 +491,10 @@ class TestInfoSvnWCCommand:
|
||||||
Properties Last Updated: 2006-06-02 23:45:28 +0200 (Fri, 02 Jun 2006)
|
Properties Last Updated: 2006-06-02 23:45:28 +0200 (Fri, 02 Jun 2006)
|
||||||
Checksum: 357e44880e5d80157cc5fbc3ce9822e3
|
Checksum: 357e44880e5d80157cc5fbc3ce9822e3
|
||||||
"""
|
"""
|
||||||
path = py.magic.autopath().dirpath().chdir()
|
path = py.path.local(__file__).dirpath().chdir()
|
||||||
|
try:
|
||||||
info = InfoSvnWCCommand(output)
|
info = InfoSvnWCCommand(output)
|
||||||
|
finally:
|
||||||
path.chdir()
|
path.chdir()
|
||||||
assert info.last_author == 'jan'
|
assert info.last_author == 'jan'
|
||||||
assert info.kind == 'file'
|
assert info.kind == 'file'
|
||||||
|
|
|
@ -71,7 +71,7 @@ def create_stylesheet(options, path):
|
||||||
fill_in["heading"] = options.get("heading", "")
|
fill_in["heading"] = options.get("heading", "")
|
||||||
template_file = path.join("rest.sty.template")
|
template_file = path.join("rest.sty.template")
|
||||||
if not template_file.check():
|
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
|
return template_file.read() % fill_in
|
||||||
|
|
||||||
def process_configfile(configfile, debug=False):
|
def process_configfile(configfile, debug=False):
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import py
|
import py
|
||||||
|
|
||||||
pydir = py.path.local(py.__file__).dirpath()
|
pydir = py.path.local(py.__file__).dirpath()
|
||||||
mydatadir = py.magic.autopath().dirpath().join("data")
|
mydatadir = py.path.local(__file__).dirpath('data')
|
||||||
|
|
||||||
def getdata():
|
def getdata():
|
||||||
rel = mydatadir.relto(pydir)
|
rel = mydatadir.relto(pydir)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import py
|
import py
|
||||||
defaultconftestpath = py.magic.autopath().dirpath('defaultconftest.py')
|
defaultconftestpath = py.path.local(__file__).dirpath("defaultconftest.py")
|
||||||
|
|
||||||
class Conftest(object):
|
class Conftest(object):
|
||||||
""" the single place for accessing values and interacting
|
""" the single place for accessing values and interacting
|
||||||
|
|
Loading…
Reference in New Issue