[svn r63806] adding a MultiAPI helper for managing plugin APIs.
--HG-- branch : trunk
This commit is contained in:
parent
9aed6ddcd0
commit
50664c1e17
|
@ -25,8 +25,8 @@ version = "1.0.0b1"
|
||||||
|
|
||||||
initpkg(__name__,
|
initpkg(__name__,
|
||||||
description = "pylib and py.test: agile development and test support library",
|
description = "pylib and py.test: agile development and test support library",
|
||||||
revision = int('$LastChangedRevision: 63580 $'.split(':')[1][:-1]),
|
revision = int('$LastChangedRevision: 63806 $'.split(':')[1][:-1]),
|
||||||
lastchangedate = '$LastChangedDate: 2009-04-03 19:45:25 +0200 (Fri, 03 Apr 2009) $',
|
lastchangedate = '$LastChangedDate: 2009-04-07 22:22:52 +0200 (Tue, 07 Apr 2009) $',
|
||||||
version = version,
|
version = version,
|
||||||
url = "http://pylib.org",
|
url = "http://pylib.org",
|
||||||
download_url = "http://codespeak.net/py/%s/download.html" % version,
|
download_url = "http://codespeak.net/py/%s/download.html" % version,
|
||||||
|
@ -57,6 +57,7 @@ initpkg(__name__,
|
||||||
'_com.PyPlugins' : ('./_com.py', 'PyPlugins'),
|
'_com.PyPlugins' : ('./_com.py', 'PyPlugins'),
|
||||||
'_com.MultiCall' : ('./_com.py', 'MultiCall'),
|
'_com.MultiCall' : ('./_com.py', 'MultiCall'),
|
||||||
'_com.pyplugins' : ('./_com.py', 'pyplugins'),
|
'_com.pyplugins' : ('./_com.py', 'pyplugins'),
|
||||||
|
'_com.MultiAPI' : ('./_com.py', 'MultiAPI'),
|
||||||
|
|
||||||
# py lib cmdline tools
|
# py lib cmdline tools
|
||||||
'cmdline.pytest' : ('./cmdline/pytest.py', 'main',),
|
'cmdline.pytest' : ('./cmdline/pytest.py', 'main',),
|
||||||
|
|
22
py/_com.py
22
py/_com.py
|
@ -158,4 +158,26 @@ class PyPlugins:
|
||||||
#print "calling anonymous hooks", args, kwargs
|
#print "calling anonymous hooks", args, kwargs
|
||||||
MultiCall(self.listattr("pyevent"), eventname, args, kwargs).execute()
|
MultiCall(self.listattr("pyevent"), eventname, args, kwargs).execute()
|
||||||
|
|
||||||
|
|
||||||
|
class MultiAPI:
|
||||||
|
def __init__(self, apiclass, plugins, prefix):
|
||||||
|
for fullname in vars(apiclass):
|
||||||
|
if fullname[:2] != "__":
|
||||||
|
assert fullname.startswith(prefix)
|
||||||
|
name = fullname[len(prefix):]
|
||||||
|
mm = CallMaker(plugins, fullname)
|
||||||
|
setattr(self, name, mm)
|
||||||
|
|
||||||
|
class CallMaker:
|
||||||
|
def __init__(self, plugins, name):
|
||||||
|
self.plugins = plugins
|
||||||
|
self.name = name
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "<MulticallMaker %r %s>" %(self.name, self.plugins)
|
||||||
|
|
||||||
|
def __call__(self, *args, **kwargs):
|
||||||
|
mc = MultiCall(self.plugins.listattr(self.name), *args, **kwargs)
|
||||||
|
return mc.execute()
|
||||||
|
|
||||||
pyplugins = PyPlugins()
|
pyplugins = PyPlugins()
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
import py
|
import py
|
||||||
import os
|
import os
|
||||||
from py._com import PyPlugins, MultiCall
|
from py._com import PyPlugins, MultiCall
|
||||||
|
from py._com import MultiAPI
|
||||||
|
|
||||||
pytest_plugins = "xfail"
|
pytest_plugins = "xfail"
|
||||||
|
|
||||||
|
@ -248,3 +249,22 @@ class TestPyPluginsEvents:
|
||||||
plugins.notify("name", 13, x=15)
|
plugins.notify("name", 13, x=15)
|
||||||
assert l == [(13, ), {'x':15}]
|
assert l == [(13, ), {'x':15}]
|
||||||
|
|
||||||
|
|
||||||
|
class TestMulticallMaker:
|
||||||
|
def test_happypath(self):
|
||||||
|
plugins = PyPlugins()
|
||||||
|
class Api:
|
||||||
|
def xyz_hello(self, arg):
|
||||||
|
pass
|
||||||
|
|
||||||
|
mcm = MultiAPI(apiclass=Api, plugins=plugins, prefix="xyz_")
|
||||||
|
assert hasattr(mcm, 'hello')
|
||||||
|
assert repr(mcm.hello).find("xyz_hello") != -1
|
||||||
|
assert not hasattr(mcm, 'xyz_hello')
|
||||||
|
class Plugin:
|
||||||
|
def xyz_hello(self, arg):
|
||||||
|
return arg + 1
|
||||||
|
plugins.register(Plugin())
|
||||||
|
l = mcm.hello(3)
|
||||||
|
assert l == [4]
|
||||||
|
assert not hasattr(mcm, 'world')
|
||||||
|
|
Loading…
Reference in New Issue