[svn r63017] rename colitem._config to colitem.config - it's an official attribute

--HG--
branch : trunk
This commit is contained in:
hpk 2009-03-18 00:48:07 +01:00
parent 9a47f06a59
commit d626a63934
19 changed files with 113 additions and 113 deletions

View File

@ -24,7 +24,7 @@ from py.__.misc.warn import APIWARN
def configproperty(name): def configproperty(name):
def fget(self): def fget(self):
#print "retrieving %r property from %s" %(name, self.fspath) #print "retrieving %r property from %s" %(name, self.fspath)
return self._config.getvalue(name, self.fspath) return self.config.getvalue(name, self.fspath)
return property(fget) return property(fget)
class ReprMetaInfo(object): class ReprMetaInfo(object):
@ -70,8 +70,8 @@ class Node(object):
self.name = name self.name = name
self.parent = parent self.parent = parent
if config is None: if config is None:
config = getattr(parent, '_config') config = parent.config
self._config = config self.config = config
self.fspath = getattr(parent, 'fspath', None) self.fspath = getattr(parent, 'fspath', None)
@ -88,7 +88,7 @@ class Node(object):
#self.__init__(name=name, parent=parent) #self.__init__(name=name, parent=parent)
def __repr__(self): def __repr__(self):
if getattr(self._config.option, 'debug', False): if getattr(self.config.option, 'debug', False):
return "<%s %r %0x>" %(self.__class__.__name__, return "<%s %r %0x>" %(self.__class__.__name__,
getattr(self, 'name', None), id(self)) getattr(self, 'name', None), id(self))
else: else:
@ -265,7 +265,7 @@ class Node(object):
starting from a different topdir). starting from a different topdir).
""" """
chain = self.listchain() chain = self.listchain()
topdir = self._config.topdir topdir = self.config.topdir
relpath = chain[0].fspath.relto(topdir) relpath = chain[0].fspath.relto(topdir)
if not relpath: if not relpath:
if chain[0].fspath == topdir: if chain[0].fspath == topdir:
@ -287,12 +287,12 @@ class Node(object):
# XXX temporary hack: getrepr() should not take a 'style' argument # XXX temporary hack: getrepr() should not take a 'style' argument
# at all; it should record all data in all cases, and the style # at all; it should record all data in all cases, and the style
# should be parametrized in toterminal(). # should be parametrized in toterminal().
if self._config.option.tbstyle == "short": if self.config.option.tbstyle == "short":
style = "short" style = "short"
else: else:
style = "long" style = "long"
repr = excinfo.getrepr(funcargs=True, repr = excinfo.getrepr(funcargs=True,
showlocals=self._config.option.showlocals, showlocals=self.config.option.showlocals,
style=style) style=style)
for secname, content in zip(["out", "err"], outerr): for secname, content in zip(["out", "err"], outerr):
if content: if content:
@ -382,7 +382,7 @@ class FSCollector(Collector):
def __getstate__(self): def __getstate__(self):
if self.parent is None: if self.parent is None:
# the root node needs to pickle more context info # the root node needs to pickle more context info
topdir = self._config.topdir topdir = self.config.topdir
relpath = self.fspath.relto(topdir) relpath = self.fspath.relto(topdir)
if not relpath: if not relpath:
if self.fspath == topdir: if self.fspath == topdir:
@ -390,7 +390,7 @@ class FSCollector(Collector):
else: else:
raise ValueError("%r not relative to topdir %s" raise ValueError("%r not relative to topdir %s"
%(self.fspath, topdir)) %(self.fspath, topdir))
return (self.name, self._config, relpath) return (self.name, self.config, relpath)
else: else:
return (self.name, self.parent) return (self.name, self.parent)
@ -444,23 +444,23 @@ class Directory(FSCollector):
return res return res
def consider_file(self, path): def consider_file(self, path):
return self._config.pytestplugins.call_each( return self.config.pytestplugins.call_each(
'pytest_collect_file', path=path, parent=self) 'pytest_collect_file', path=path, parent=self)
def consider_dir(self, path, usefilters=None): def consider_dir(self, path, usefilters=None):
if usefilters is not None: if usefilters is not None:
APIWARN("0.99", "usefilters argument not needed") APIWARN("0.99", "usefilters argument not needed")
res = self._config.pytestplugins.call_firstresult( res = self.config.pytestplugins.call_firstresult(
'pytest_collect_recurse', path=path, parent=self) 'pytest_collect_recurse', path=path, parent=self)
if res is None or res: if res is None or res:
return self._config.pytestplugins.call_each( return self.config.pytestplugins.call_each(
'pytest_collect_directory', path=path, parent=self) 'pytest_collect_directory', path=path, parent=self)
from py.__.test.runner import basic_run_report, forked_run_report from py.__.test.runner import basic_run_report, forked_run_report
class Item(Node): class Item(Node):
""" a basic test item. """ """ a basic test item. """
def _getrunner(self): def _getrunner(self):
if self._config.option.boxed: if self.config.option.boxed:
return forked_run_report return forked_run_report
return basic_run_report return basic_run_report

View File

@ -37,7 +37,7 @@ class TestDSession:
def test_add_remove_host(self, testdir): def test_add_remove_host(self, testdir):
item = testdir.getitem("def test_func(): pass") item = testdir.getitem("def test_func(): pass")
rep = run(item) rep = run(item)
session = DSession(item._config) session = DSession(item.config)
host = GatewaySpec("localhost") host = GatewaySpec("localhost")
host.node = MockNode() host.node = MockNode()
assert not session.host2pending assert not session.host2pending
@ -53,7 +53,7 @@ class TestDSession:
def test_senditems_removeitems(self, testdir): def test_senditems_removeitems(self, testdir):
item = testdir.getitem("def test_func(): pass") item = testdir.getitem("def test_func(): pass")
rep = run(item) rep = run(item)
session = DSession(item._config) session = DSession(item.config)
host = GatewaySpec("localhost") host = GatewaySpec("localhost")
host.node = MockNode() host.node = MockNode()
session.addhost(host) session.addhost(host)
@ -69,7 +69,7 @@ class TestDSession:
def test_func(): def test_func():
pass pass
""") """)
session = DSession(modcol._config) session = DSession(modcol.config)
session.triggertesting([modcol]) session.triggertesting([modcol])
name, args, kwargs = session.queue.get(block=False) name, args, kwargs = session.queue.get(block=False)
assert name == 'collectionreport' assert name == 'collectionreport'
@ -78,7 +78,7 @@ class TestDSession:
def test_triggertesting_item(self, testdir): def test_triggertesting_item(self, testdir):
item = testdir.getitem("def test_func(): pass") item = testdir.getitem("def test_func(): pass")
session = DSession(item._config) session = DSession(item.config)
host1 = GatewaySpec("localhost") host1 = GatewaySpec("localhost")
host1.node = MockNode() host1.node = MockNode()
host2 = GatewaySpec("localhost") host2 = GatewaySpec("localhost")
@ -99,7 +99,7 @@ class TestDSession:
def test_keyboardinterrupt(self, testdir): def test_keyboardinterrupt(self, testdir):
item = testdir.getitem("def test_func(): pass") item = testdir.getitem("def test_func(): pass")
session = DSession(item._config) session = DSession(item.config)
def raise_(timeout=None): raise KeyboardInterrupt() def raise_(timeout=None): raise KeyboardInterrupt()
session.queue.get = raise_ session.queue.get = raise_
exitstatus = session.loop([]) exitstatus = session.loop([])
@ -107,7 +107,7 @@ class TestDSession:
def test_internalerror(self, testdir): def test_internalerror(self, testdir):
item = testdir.getitem("def test_func(): pass") item = testdir.getitem("def test_func(): pass")
session = DSession(item._config) session = DSession(item.config)
def raise_(): raise ValueError() def raise_(): raise ValueError()
session.queue.get = raise_ session.queue.get = raise_
exitstatus = session.loop([]) exitstatus = session.loop([])
@ -115,7 +115,7 @@ class TestDSession:
def test_rescheduleevent(self, testdir): def test_rescheduleevent(self, testdir):
item = testdir.getitem("def test_func(): pass") item = testdir.getitem("def test_func(): pass")
session = DSession(item._config) session = DSession(item.config)
host1 = GatewaySpec("localhost") host1 = GatewaySpec("localhost")
host1.node = MockNode() host1.node = MockNode()
session.addhost(host1) session.addhost(host1)
@ -139,7 +139,7 @@ class TestDSession:
def test_no_hosts_remaining_for_tests(self, testdir): def test_no_hosts_remaining_for_tests(self, testdir):
item = testdir.getitem("def test_func(): pass") item = testdir.getitem("def test_func(): pass")
# setup a session with one host # setup a session with one host
session = DSession(item._config) session = DSession(item.config)
host1 = GatewaySpec("localhost") host1 = GatewaySpec("localhost")
host1.node = MockNode() host1.node = MockNode()
session.addhost(host1) session.addhost(host1)
@ -164,7 +164,7 @@ class TestDSession:
item1, item2 = modcol.collect() item1, item2 = modcol.collect()
# setup a session with two hosts # setup a session with two hosts
session = DSession(item1._config) session = DSession(item1.config)
host1 = GatewaySpec("localhost") host1 = GatewaySpec("localhost")
host1.node = MockNode() host1.node = MockNode()
session.addhost(host1) session.addhost(host1)
@ -191,7 +191,7 @@ class TestDSession:
def test_hostup_adds_to_available(self, testdir): def test_hostup_adds_to_available(self, testdir):
item = testdir.getitem("def test_func(): pass") item = testdir.getitem("def test_func(): pass")
# setup a session with two hosts # setup a session with two hosts
session = DSession(item._config) session = DSession(item.config)
host1 = GatewaySpec("localhost") host1 = GatewaySpec("localhost")
hostup = makehostup(host1) hostup = makehostup(host1)
session.queueevent("hostup", hostup) session.queueevent("hostup", hostup)
@ -203,7 +203,7 @@ class TestDSession:
def test_event_propagation(self, testdir, EventRecorder): def test_event_propagation(self, testdir, EventRecorder):
item = testdir.getitem("def test_func(): pass") item = testdir.getitem("def test_func(): pass")
session = DSession(item._config) session = DSession(item.config)
evrec = EventRecorder(session.bus) evrec = EventRecorder(session.bus)
session.queueevent("NOPevent", 42) session.queueevent("NOPevent", 42)
@ -211,7 +211,7 @@ class TestDSession:
assert evrec.getfirstnamed('NOPevent') assert evrec.getfirstnamed('NOPevent')
def runthrough(self, item): def runthrough(self, item):
session = DSession(item._config) session = DSession(item.config)
host1 = GatewaySpec("localhost") host1 = GatewaySpec("localhost")
host1.node = MockNode() host1.node = MockNode()
session.addhost(host1) session.addhost(host1)
@ -247,8 +247,8 @@ class TestDSession:
def test_pass(): def test_pass():
pass pass
""") """)
modcol._config.option.exitfirst = True modcol.config.option.exitfirst = True
session = DSession(modcol._config) session = DSession(modcol.config)
host1 = GatewaySpec("localhost") host1 = GatewaySpec("localhost")
host1.node = MockNode() host1.node = MockNode()
session.addhost(host1) session.addhost(host1)
@ -270,7 +270,7 @@ class TestDSession:
def test_shuttingdown_filters_events(self, testdir, EventRecorder): def test_shuttingdown_filters_events(self, testdir, EventRecorder):
item = testdir.getitem("def test_func(): pass") item = testdir.getitem("def test_func(): pass")
session = DSession(item._config) session = DSession(item.config)
host = GatewaySpec("localhost") host = GatewaySpec("localhost")
session.addhost(host) session.addhost(host)
loopstate = LoopState([]) loopstate = LoopState([])
@ -291,9 +291,9 @@ class TestDSession:
def test_pass(): def test_pass():
pass pass
""") """)
session = DSession(modcol._config) session = DSession(modcol.config)
modcol._config.option.keyword = "nothing" modcol.config.option.keyword = "nothing"
dsel = session.filteritems([modcol]) dsel = session.filteritems([modcol])
assert dsel == [modcol] assert dsel == [modcol]
items = modcol.collect() items = modcol.collect()
@ -305,7 +305,7 @@ class TestDSession:
assert event.name == "deselected" assert event.name == "deselected"
assert event.args[0].items == items assert event.args[0].items == items
modcol._config.option.keyword = "test_fail" modcol.config.option.keyword = "test_fail"
remaining = session.filteritems(items) remaining = session.filteritems(items)
assert remaining == [items[0]] assert remaining == [items[0]]
@ -315,7 +315,7 @@ class TestDSession:
def test_hostdown_shutdown_after_completion(self, testdir): def test_hostdown_shutdown_after_completion(self, testdir):
item = testdir.getitem("def test_func(): pass") item = testdir.getitem("def test_func(): pass")
session = DSession(item._config) session = DSession(item.config)
host = GatewaySpec("localhost") host = GatewaySpec("localhost")
host.node = MockNode() host.node = MockNode()
@ -338,7 +338,7 @@ class TestDSession:
def test_pass(): def test_pass():
pass pass
""") """)
session = DSession(modcol._config) session = DSession(modcol.config)
host = GatewaySpec("localhost") host = GatewaySpec("localhost")
host.node = MockNode() host.node = MockNode()
session.addhost(host) session.addhost(host)

View File

@ -82,7 +82,7 @@ class TestMasterSlaveConnection:
import os import os
os.kill(os.getpid(), 15) os.kill(os.getpid(), 15)
""") """)
node = mysetup.makenode(item._config) node = mysetup.makenode(item.config)
node.send(item) node.send(item)
ev, = mysetup.geteventargs("hostdown") ev, = mysetup.geteventargs("hostdown")
assert ev.host == mysetup.host assert ev.host == mysetup.host
@ -100,7 +100,7 @@ class TestMasterSlaveConnection:
def test_send_on_closed_channel(self, testdir, mysetup): def test_send_on_closed_channel(self, testdir, mysetup):
item = testdir.getitem("def test_func(): pass") item = testdir.getitem("def test_func(): pass")
node = mysetup.makenode(item._config) node = mysetup.makenode(item.config)
node.channel.close() node.channel.close()
py.test.raises(IOError, "node.send(item)") py.test.raises(IOError, "node.send(item)")
#ev = self.geteventargs(event.InternalException) #ev = self.geteventargs(event.InternalException)
@ -108,7 +108,7 @@ class TestMasterSlaveConnection:
def test_send_one(self, testdir, mysetup): def test_send_one(self, testdir, mysetup):
item = testdir.getitem("def test_func(): pass") item = testdir.getitem("def test_func(): pass")
node = mysetup.makenode(item._config) node = mysetup.makenode(item.config)
node.send(item) node.send(item)
ev, = mysetup.geteventargs("itemtestreport") ev, = mysetup.geteventargs("itemtestreport")
assert ev.passed assert ev.passed
@ -126,7 +126,7 @@ class TestMasterSlaveConnection:
import py import py
py.test.skip("x") py.test.skip("x")
""") """)
node = mysetup.makenode(items[0]._config) node = mysetup.makenode(items[0].config)
for item in items: for item in items:
node.send(item) node.send(item)
for outcome in "passed failed skipped".split(): for outcome in "passed failed skipped".split():

View File

@ -4,14 +4,14 @@ from py.__.test.looponfail.remote import LooponfailingSession, LoopState, Remote
class TestRemoteControl: class TestRemoteControl:
def test_nofailures(self, testdir): def test_nofailures(self, testdir):
item = testdir.getitem("def test_func(): pass\n") item = testdir.getitem("def test_func(): pass\n")
control = RemoteControl(item._config) control = RemoteControl(item.config)
control.setup() control.setup()
failures = control.runsession() failures = control.runsession()
assert not failures assert not failures
def test_failures_somewhere(self, testdir): def test_failures_somewhere(self, testdir):
item = testdir.getitem("def test_func(): assert 0\n") item = testdir.getitem("def test_func(): assert 0\n")
control = RemoteControl(item._config) control = RemoteControl(item.config)
control.setup() control.setup()
failures = control.runsession() failures = control.runsession()
assert failures assert failures
@ -26,7 +26,7 @@ class TestRemoteControl:
def test_func(): def test_func():
assert 0 assert 0
""") """)
control = RemoteControl(modcol._config) control = RemoteControl(modcol.config)
control.setup() control.setup()
failures = control.runsession() failures = control.runsession()
assert failures assert failures
@ -54,7 +54,7 @@ class TestLooponFailing:
def test_two(): def test_two():
assert 1 assert 1
""") """)
session = LooponfailingSession(modcol._config) session = LooponfailingSession(modcol.config)
loopstate = LoopState() loopstate = LoopState()
session.remotecontrol.setup() session.remotecontrol.setup()
session.loop_once(loopstate) session.loop_once(loopstate)
@ -76,7 +76,7 @@ class TestLooponFailing:
def test_one(): def test_one():
assert 0 assert 0
""") """)
session = LooponfailingSession(modcol._config) session = LooponfailingSession(modcol.config)
loopstate = LoopState() loopstate = LoopState()
session.remotecontrol.setup() session.remotecontrol.setup()
loopstate.colitems = [] loopstate.colitems = []
@ -103,7 +103,7 @@ class TestLooponFailing:
def test_two(): def test_two():
assert 0 assert 0
""") """)
session = LooponfailingSession(modcol._config) session = LooponfailingSession(modcol.config)
loopstate = LoopState() loopstate = LoopState()
session.remotecontrol.setup() session.remotecontrol.setup()
loopstate.colitems = [] loopstate.colitems = []

View File

@ -11,14 +11,14 @@ class DefaultPlugin:
ext = path.ext ext = path.ext
pb = path.purebasename pb = path.purebasename
if pb.startswith("test_") or pb.endswith("_test") or \ if pb.startswith("test_") or pb.endswith("_test") or \
path in parent._config.args: path in parent.config.args:
if ext == ".py": if ext == ".py":
return parent.Module(path, parent=parent) return parent.Module(path, parent=parent)
def pytest_collect_directory(self, path, parent): def pytest_collect_directory(self, path, parent):
if not parent.recfilter(path): if not parent.recfilter(path):
# check if cmdline specified this dir or a subdir # check if cmdline specified this dir or a subdir
for arg in parent._config.args: for arg in parent.config.args:
if path == arg or arg.relto(path): if path == arg or arg.relto(path):
break break
else: else:
@ -26,7 +26,7 @@ class DefaultPlugin:
# not use parent.Directory here as we want # not use parent.Directory here as we want
# dir/conftest.py to be able to # dir/conftest.py to be able to
# define Directory(dir) already # define Directory(dir) already
Directory = parent._config.getvalue('Directory', path) Directory = parent.config.getvalue('Directory', path)
return Directory(path, parent=parent) return Directory(path, parent=parent)
def pytest_addoption(self, parser): def pytest_addoption(self, parser):

View File

@ -8,7 +8,7 @@ class DoctestPlugin:
def pytest_collect_file(self, path, parent): def pytest_collect_file(self, path, parent):
if path.ext == ".py": if path.ext == ".py":
if parent._config.getvalue("doctestmodules"): if parent.config.getvalue("doctestmodules"):
return DoctestModule(path, parent) return DoctestModule(path, parent)
if path.check(fnmatch="test_*.txt"): if path.check(fnmatch="test_*.txt"):
return DoctestTextfile(path, parent) return DoctestTextfile(path, parent)

View File

@ -26,7 +26,7 @@ class Support(object):
class PluginTester(Support): class PluginTester(Support):
def testdir(self): def testdir(self):
# XXX import differently, eg. # XXX import differently, eg.
# FSTester = self.pyfuncitem._config.pytestplugins.getpluginattr("pytester", "FSTester") # FSTester = self.pyfuncitem.config.pytestplugins.getpluginattr("pytester", "FSTester")
from pytest_pytester import TmpTestdir from pytest_pytester import TmpTestdir
crunner = TmpTestdir(self.pyfuncitem) crunner = TmpTestdir(self.pyfuncitem)
# #

View File

@ -36,7 +36,7 @@ class TmpTestdir:
def __init__(self, pyfuncitem): def __init__(self, pyfuncitem):
self.pyfuncitem = pyfuncitem self.pyfuncitem = pyfuncitem
# XXX remove duplication with tmpdir plugin # XXX remove duplication with tmpdir plugin
basetmp = pyfuncitem._config.ensuretemp("testdir") basetmp = pyfuncitem.config.ensuretemp("testdir")
name = pyfuncitem.name name = pyfuncitem.name
for i in range(100): for i in range(100):
try: try:
@ -166,7 +166,7 @@ class TmpTestdir:
def getitems(self, source): def getitems(self, source):
modcol = self.getmodulecol(source) modcol = self.getmodulecol(source)
return list(modcol._config.initsession().genitems([modcol])) return list(modcol.config.initsession().genitems([modcol]))
#assert item is not None, "%r item not found in module:\n%s" %(funcname, source) #assert item is not None, "%r item not found in module:\n%s" %(funcname, source)
#return item #return item

View File

@ -127,7 +127,7 @@ class ReSTSyntaxTest(py.test.collect.Item):
return (text, apigen_relpath + 'source/%s' % (relpath,)) return (text, apigen_relpath + 'source/%s' % (relpath,))
def _checkskip(self, lpath, htmlpath=None): def _checkskip(self, lpath, htmlpath=None):
if not self._config.getvalue("forcegen"): if not self.config.getvalue("forcegen"):
lpath = py.path.local(lpath) lpath = py.path.local(lpath)
if htmlpath is not None: if htmlpath is not None:
htmlpath = py.path.local(htmlpath) htmlpath = py.path.local(htmlpath)
@ -140,7 +140,7 @@ class ReSTSyntaxTest(py.test.collect.Item):
class DoctestText(py.test.collect.Item): class DoctestText(py.test.collect.Item):
def runtest(self): def runtest(self):
content = self._normalize_linesep() content = self._normalize_linesep()
newcontent = self._config.pytestplugins.call_firstresult( newcontent = self.config.pytestplugins.call_firstresult(
'pytest_doctest_prepare_content', content=content) 'pytest_doctest_prepare_content', content=content)
if newcontent is not None: if newcontent is not None:
content = newcontent content = newcontent
@ -192,7 +192,7 @@ class LinkCheckerMaker(py.test.collect.Collector):
def genlinkchecks(self): def genlinkchecks(self):
path = self.fspath path = self.fspath
# generating functions + args as single tests # generating functions + args as single tests
timeout = self._config.getvalue("urlcheck_timeout") timeout = self.config.getvalue("urlcheck_timeout")
for lineno, line in py.builtin.enumerate(path.readlines()): for lineno, line in py.builtin.enumerate(path.readlines()):
line = line.strip() line = line.strip()
if line.startswith('.. _'): if line.startswith('.. _'):
@ -206,7 +206,7 @@ class LinkCheckerMaker(py.test.collect.Collector):
tryfn = l[1].strip() tryfn = l[1].strip()
name = "%s:%d" %(tryfn, lineno) name = "%s:%d" %(tryfn, lineno)
if tryfn.startswith('http:') or tryfn.startswith('https'): if tryfn.startswith('http:') or tryfn.startswith('https'):
if self._config.getvalue("urlcheck"): if self.config.getvalue("urlcheck"):
yield CheckLink(name, parent=self, yield CheckLink(name, parent=self,
args=(tryfn, path, lineno, timeout), callobj=urlcheck) args=(tryfn, path, lineno, timeout), callobj=urlcheck)
elif tryfn.startswith('webcal:'): elif tryfn.startswith('webcal:'):

View File

@ -322,7 +322,7 @@ class TestTerminal:
def test_hostup(self, testdir, linecomp): def test_hostup(self, testdir, linecomp):
from py.__.execnet.gwmanage import GatewaySpec from py.__.execnet.gwmanage import GatewaySpec
item = testdir.getitem("def test_func(): pass") item = testdir.getitem("def test_func(): pass")
rep = TerminalReporter(item._config, linecomp.stringio) rep = TerminalReporter(item.config, linecomp.stringio)
rep.pyevent_hostup(makehostup()) rep.pyevent_hostup(makehostup())
linecomp.assert_contains_lines([ linecomp.assert_contains_lines([
"*localhost %s %s - Python %s" %(sys.platform, "*localhost %s %s - Python %s" %(sys.platform,
@ -339,7 +339,7 @@ class TestTerminal:
def test_func(): def test_func():
assert 0 assert 0
""") """)
rep = TerminalReporter(modcol._config, file=linecomp.stringio) rep = TerminalReporter(modcol.config, file=linecomp.stringio)
rep.config.bus.register(rep) rep.config.bus.register(rep)
rep.config.bus.notify("testrunstart", event.TestrunStart()) rep.config.bus.notify("testrunstart", event.TestrunStart())
@ -366,7 +366,7 @@ class TestTerminal:
def test_func(): def test_func():
assert 0 assert 0
""", configargs=("-v",)) """, configargs=("-v",))
rep = TerminalReporter(modcol._config, file=linecomp.stringio) rep = TerminalReporter(modcol.config, file=linecomp.stringio)
rep.config.bus.register(rep) rep.config.bus.register(rep)
rep.config.bus.notify("testrunstart", event.TestrunStart()) rep.config.bus.notify("testrunstart", event.TestrunStart())
items = modcol.collect() items = modcol.collect()
@ -390,7 +390,7 @@ class TestTerminal:
def test_collect_fail(self, testdir, linecomp): def test_collect_fail(self, testdir, linecomp):
modcol = testdir.getmodulecol("import xyz") modcol = testdir.getmodulecol("import xyz")
rep = TerminalReporter(modcol._config, file=linecomp.stringio) rep = TerminalReporter(modcol.config, file=linecomp.stringio)
rep.config.bus.register(rep) rep.config.bus.register(rep)
rep.config.bus.notify("testrunstart", event.TestrunStart()) rep.config.bus.notify("testrunstart", event.TestrunStart())
l = list(testdir.genitems([modcol])) l = list(testdir.genitems([modcol]))
@ -406,7 +406,7 @@ class TestTerminal:
def test_internalerror(self, testdir, linecomp): def test_internalerror(self, testdir, linecomp):
modcol = testdir.getmodulecol("def test_one(): pass") modcol = testdir.getmodulecol("def test_one(): pass")
rep = TerminalReporter(modcol._config, file=linecomp.stringio) rep = TerminalReporter(modcol.config, file=linecomp.stringio)
excinfo = py.test.raises(ValueError, "raise ValueError('hello')") excinfo = py.test.raises(ValueError, "raise ValueError('hello')")
rep.pyevent_internalerror(event.InternalException(excinfo)) rep.pyevent_internalerror(event.InternalException(excinfo))
linecomp.assert_contains_lines([ linecomp.assert_contains_lines([
@ -420,7 +420,7 @@ class TestTerminal:
pass pass
""", configargs=("-v",)) """, configargs=("-v",))
host1 = GatewaySpec("localhost") host1 = GatewaySpec("localhost")
rep = TerminalReporter(modcol._config, file=linecomp.stringio) rep = TerminalReporter(modcol.config, file=linecomp.stringio)
rep.pyevent_hostgatewayready(event.HostGatewayReady(host1, None)) rep.pyevent_hostgatewayready(event.HostGatewayReady(host1, None))
linecomp.assert_contains_lines([ linecomp.assert_contains_lines([
"*HostGatewayReady*" "*HostGatewayReady*"
@ -433,7 +433,7 @@ class TestTerminal:
def test_writeline(self, testdir, linecomp): def test_writeline(self, testdir, linecomp):
modcol = testdir.getmodulecol("def test_one(): pass") modcol = testdir.getmodulecol("def test_one(): pass")
stringio = py.std.cStringIO.StringIO() stringio = py.std.cStringIO.StringIO()
rep = TerminalReporter(modcol._config, file=linecomp.stringio) rep = TerminalReporter(modcol.config, file=linecomp.stringio)
rep.write_fspath_result(py.path.local("xy.py"), '.') rep.write_fspath_result(py.path.local("xy.py"), '.')
rep.write_line("hello world") rep.write_line("hello world")
lines = linecomp.stringio.getvalue().split('\n') lines = linecomp.stringio.getvalue().split('\n')
@ -448,14 +448,14 @@ class TestTerminal:
def test_fail2(): def test_fail2():
raise ValueError() raise ValueError()
""") """)
rep = TerminalReporter(modcol._config, file=linecomp.stringio) rep = TerminalReporter(modcol.config, file=linecomp.stringio)
reports = [basic_run_report(x) for x in modcol.collect()] reports = [basic_run_report(x) for x in modcol.collect()]
rep.pyevent_looponfailinginfo(event.LooponfailingInfo(reports, [modcol._config.topdir])) rep.pyevent_looponfailinginfo(event.LooponfailingInfo(reports, [modcol.config.topdir]))
linecomp.assert_contains_lines([ linecomp.assert_contains_lines([
"*test_looponfailingreport.py:2: assert 0", "*test_looponfailingreport.py:2: assert 0",
"*test_looponfailingreport.py:4: ValueError*", "*test_looponfailingreport.py:4: ValueError*",
"*waiting*", "*waiting*",
"*%s*" % (modcol._config.topdir), "*%s*" % (modcol.config.topdir),
]) ])
def test_tb_option(self, testdir, linecomp): def test_tb_option(self, testdir, linecomp):
@ -470,7 +470,7 @@ class TestTerminal:
print 6*7 print 6*7
g() # --calling-- g() # --calling--
""", configargs=("--tb=%s" % tbopt,)) """, configargs=("--tb=%s" % tbopt,))
rep = TerminalReporter(modcol._config, file=linecomp.stringio) rep = TerminalReporter(modcol.config, file=linecomp.stringio)
rep.config.bus.register(rep) rep.config.bus.register(rep)
rep.config.bus.notify("testrunstart", event.TestrunStart()) rep.config.bus.notify("testrunstart", event.TestrunStart())
rep.config.bus.notify("testrunstart", event.TestrunStart()) rep.config.bus.notify("testrunstart", event.TestrunStart())
@ -497,8 +497,8 @@ class TestTerminal:
def test_foobar(): def test_foobar():
pass pass
""") """)
rep = TerminalReporter(modcol._config, file=linecomp.stringio) rep = TerminalReporter(modcol.config, file=linecomp.stringio)
modcol._config.bus.register(rep) modcol.config.bus.register(rep)
l = list(testdir.genitems([modcol])) l = list(testdir.genitems([modcol]))
assert len(l) == 1 assert len(l) == 1
rep.config.bus.notify("itemstart", event.ItemStart(l[0])) rep.config.bus.notify("itemstart", event.ItemStart(l[0]))
@ -515,9 +515,9 @@ class TestTerminal:
def test_interrupt_me(): def test_interrupt_me():
raise KeyboardInterrupt # simulating the user raise KeyboardInterrupt # simulating the user
""", configargs=("--showskipsummary",) + ("-v",)*verbose) """, configargs=("--showskipsummary",) + ("-v",)*verbose)
rep = TerminalReporter(modcol._config, file=linecomp.stringio) rep = TerminalReporter(modcol.config, file=linecomp.stringio)
modcol._config.bus.register(rep) modcol.config.bus.register(rep)
bus = modcol._config.bus bus = modcol.config.bus
bus.notify("testrunstart", event.TestrunStart()) bus.notify("testrunstart", event.TestrunStart())
try: try:
for item in testdir.genitems([modcol]): for item in testdir.genitems([modcol]):
@ -576,8 +576,8 @@ class TestCollectonly:
def test_func(): def test_func():
pass pass
""") """)
rep = CollectonlyReporter(modcol._config, out=linecomp.stringio) rep = CollectonlyReporter(modcol.config, out=linecomp.stringio)
modcol._config.bus.register(rep) modcol.config.bus.register(rep)
indent = rep.indent indent = rep.indent
rep.config.bus.notify("collectionstart", event.CollectionStart(modcol)) rep.config.bus.notify("collectionstart", event.CollectionStart(modcol))
linecomp.assert_contains_lines([ linecomp.assert_contains_lines([
@ -597,8 +597,8 @@ class TestCollectonly:
import py import py
py.test.skip("nomod") py.test.skip("nomod")
""") """)
rep = CollectonlyReporter(modcol._config, out=linecomp.stringio) rep = CollectonlyReporter(modcol.config, out=linecomp.stringio)
modcol._config.bus.register(rep) modcol.config.bus.register(rep)
cols = list(testdir.genitems([modcol])) cols = list(testdir.genitems([modcol]))
assert len(cols) == 0 assert len(cols) == 0
linecomp.assert_contains_lines(""" linecomp.assert_contains_lines("""
@ -610,8 +610,8 @@ class TestCollectonly:
modcol = testdir.getmodulecol(configargs=['--collectonly'], source=""" modcol = testdir.getmodulecol(configargs=['--collectonly'], source="""
raise ValueError(0) raise ValueError(0)
""") """)
rep = CollectonlyReporter(modcol._config, out=linecomp.stringio) rep = CollectonlyReporter(modcol.config, out=linecomp.stringio)
modcol._config.bus.register(rep) modcol.config.bus.register(rep)
cols = list(testdir.genitems([modcol])) cols = list(testdir.genitems([modcol]))
assert len(cols) == 0 assert len(cols) == 0
linecomp.assert_contains_lines(""" linecomp.assert_contains_lines("""

View File

@ -15,7 +15,7 @@ class TmpdirPlugin:
def pytest_pyfuncarg_tmpdir(self, pyfuncitem): def pytest_pyfuncarg_tmpdir(self, pyfuncitem):
name = pyfuncitem.name name = pyfuncitem.name
return pyfuncitem._config.mktemp(name, numbered=True) return pyfuncitem.config.mktemp(name, numbered=True)
# =============================================================================== # ===============================================================================
# #

View File

@ -140,7 +140,7 @@ class PyCollectorMixin(PyobjMixin, py.test.collect.Collector):
return self.join(name) return self.join(name)
def makeitem(self, name, obj): def makeitem(self, name, obj):
res = self._config.pytestplugins.call_firstresult( res = self.config.pytestplugins.call_firstresult(
"pytest_pymodule_makeitem", modcol=self, name=name, obj=obj) "pytest_pymodule_makeitem", modcol=self, name=name, obj=obj)
if res: if res:
return res return res
@ -172,25 +172,25 @@ class Module(py.test.collect.File, PyCollectorMixin):
# we assume we are only called once per module # we assume we are only called once per module
mod = self.fspath.pyimport() mod = self.fspath.pyimport()
#print "imported test module", mod #print "imported test module", mod
self._config.pytestplugins.consider_module(mod) self.config.pytestplugins.consider_module(mod)
return mod return mod
def setup(self): def setup(self):
if not self._config.option.nomagic: if not self.config.option.nomagic:
#print "*" * 20, "INVOKE assertion", self #print "*" * 20, "INVOKE assertion", self
py.magic.invoke(assertion=1) py.magic.invoke(assertion=1)
mod = self.obj mod = self.obj
self._config.pytestplugins.register(mod) self.config.pytestplugins.register(mod)
if hasattr(mod, 'setup_module'): if hasattr(mod, 'setup_module'):
self.obj.setup_module(mod) self.obj.setup_module(mod)
def teardown(self): def teardown(self):
if hasattr(self.obj, 'teardown_module'): if hasattr(self.obj, 'teardown_module'):
self.obj.teardown_module(self.obj) self.obj.teardown_module(self.obj)
if not self._config.option.nomagic: if not self.config.option.nomagic:
#print "*" * 20, "revoke assertion", self #print "*" * 20, "revoke assertion", self
py.magic.revoke(assertion=1) py.magic.revoke(assertion=1)
self._config.pytestplugins.unregister(self.obj) self.config.pytestplugins.unregister(self.obj)
class Class(PyCollectorMixin, py.test.collect.Collector): class Class(PyCollectorMixin, py.test.collect.Collector):
@ -268,7 +268,7 @@ class FunctionMixin(PyobjMixin):
teardown_func_or_meth(self.obj) teardown_func_or_meth(self.obj)
def _prunetraceback(self, traceback): def _prunetraceback(self, traceback):
if not self._config.option.fulltrace: if not self.config.option.fulltrace:
code = py.code.Code(self.obj) code = py.code.Code(self.obj)
path, firstlineno = code.path, code.firstlineno path, firstlineno = code.path, code.firstlineno
ntraceback = traceback.cut(path=path, firstlineno=firstlineno) ntraceback = traceback.cut(path=path, firstlineno=firstlineno)
@ -289,7 +289,7 @@ class Generator(FunctionMixin, PyCollectorMixin, py.test.collect.Collector):
# test generators are collectors yet participate in # test generators are collectors yet participate in
# the test-item setup and teardown protocol. # the test-item setup and teardown protocol.
# otherwise we could avoid global setupstate # otherwise we could avoid global setupstate
self._config._setupstate.prepare(self) self.config._setupstate.prepare(self)
l = [] l = []
for i, x in py.builtin.enumerate(self.obj()): for i, x in py.builtin.enumerate(self.obj()):
name, call, args = self.getcallargs(x) name, call, args = self.getcallargs(x)
@ -348,7 +348,7 @@ class Function(FunctionMixin, py.test.collect.Item):
""" execute the given test function. """ """ execute the given test function. """
if not self._deprecated_testexecution(): if not self._deprecated_testexecution():
kw = self.lookup_allargs() kw = self.lookup_allargs()
ret = self._config.pytestplugins.call_firstresult( ret = self.config.pytestplugins.call_firstresult(
"pytest_pyfunc_call", pyfuncitem=self, args=self._args, kwargs=kw) "pytest_pyfunc_call", pyfuncitem=self, args=self._args, kwargs=kw)
def lookup_allargs(self): def lookup_allargs(self):
@ -374,13 +374,13 @@ class Function(FunctionMixin, py.test.collect.Item):
return kwargs return kwargs
def lookup_onearg(self, argname): def lookup_onearg(self, argname):
value = self._config.pytestplugins.call_firstresult( value = self.config.pytestplugins.call_firstresult(
"pytest_pyfuncarg_" + argname, pyfuncitem=self) "pytest_pyfuncarg_" + argname, pyfuncitem=self)
if value is not None: if value is not None:
return value return value
else: else:
metainfo = self.repr_metainfo() metainfo = self.repr_metainfo()
#self._config.bus.notify("pyfuncarg_lookuperror", argname) #self.config.bus.notify("pyfuncarg_lookuperror", argname)
raise LookupError("funcargument %r not found for: %s" %(argname,metainfo.verboseline())) raise LookupError("funcargument %r not found for: %s" %(argname,metainfo.verboseline()))
def __eq__(self, other): def __eq__(self, other):

View File

@ -19,7 +19,7 @@ class RobustRun(object):
""" """
def __init__(self, colitem, pdb=None): def __init__(self, colitem, pdb=None):
self.colitem = colitem self.colitem = colitem
self.getcapture = colitem._config._getcapture self.getcapture = colitem.config._getcapture
self.pdb = pdb self.pdb = pdb
def __repr__(self): def __repr__(self):
@ -50,16 +50,16 @@ class RobustRun(object):
class ItemRunner(RobustRun): class ItemRunner(RobustRun):
def setup(self): def setup(self):
self.colitem._config._setupstate.prepare(self.colitem) self.colitem.config._setupstate.prepare(self.colitem)
def teardown(self): def teardown(self):
self.colitem._config._setupstate.teardown_exact(self.colitem) self.colitem.config._setupstate.teardown_exact(self.colitem)
def execute(self): def execute(self):
#self.colitem.config.pytestplugins.pre_execute(self.colitem) #self.colitem.config.pytestplugins.pre_execute(self.colitem)
self.colitem.runtest() self.colitem.runtest()
#self.colitem.config.pytestplugins.post_execute(self.colitem) #self.colitem.config.pytestplugins.post_execute(self.colitem)
def makereport(self, res, when, excinfo, outerr): def makereport(self, res, when, excinfo, outerr):
testrep = self.colitem._config.pytestplugins.call_firstresult( testrep = self.colitem.config.pytestplugins.call_firstresult(
"pytest_item_makereport", item=self.colitem, "pytest_item_makereport", item=self.colitem,
excinfo=excinfo, when=when, outerr=outerr) excinfo=excinfo, when=when, outerr=outerr)
if self.pdb and testrep.failed: if self.pdb and testrep.failed:
@ -96,7 +96,7 @@ def forked_run_report(item, pdb=None):
EXITSTATUS_TESTEXIT = 4 EXITSTATUS_TESTEXIT = 4
ipickle = ImmutablePickler(uneven=0) ipickle = ImmutablePickler(uneven=0)
ipickle.selfmemoize(item._config) ipickle.selfmemoize(item.config)
def runforked(): def runforked():
try: try:
testrep = basic_run_report(item) testrep = basic_run_report(item)

View File

@ -46,7 +46,7 @@ class Session(object):
if isinstance(next, (tuple, list)): if isinstance(next, (tuple, list)):
colitems[:] = list(next) + colitems colitems[:] = list(next) + colitems
continue continue
assert self.bus is next._config.bus assert self.bus is next.config.bus
notify = self.bus.notify notify = self.bus.notify
if isinstance(next, Item): if isinstance(next, Item):
remaining = self.filteritems([next]) remaining = self.filteritems([next])

View File

@ -67,10 +67,10 @@ class TestCollector:
def test_listnames_and__getitembynames(self, testdir): def test_listnames_and__getitembynames(self, testdir):
modcol = testdir.getmodulecol("pass", withinit=True) modcol = testdir.getmodulecol("pass", withinit=True)
print modcol._config.pytestplugins.getplugins() print modcol.config.pytestplugins.getplugins()
names = modcol.listnames() names = modcol.listnames()
print names print names
dircol = modcol._config.getfsnode(modcol._config.topdir) dircol = modcol.config.getfsnode(modcol.config.topdir)
x = dircol._getitembynames(names) x = dircol._getitembynames(names)
assert modcol.name == x.name assert modcol.name == x.name
@ -203,7 +203,7 @@ class TestCustomConftests:
def pytest_addoption(self, parser): def pytest_addoption(self, parser):
parser.addoption("--XX", action="store_true", default=False) parser.addoption("--XX", action="store_true", default=False)
def pytest_collect_recurse(self, path, parent): def pytest_collect_recurse(self, path, parent):
return parent._config.getvalue("XX") return parent.config.getvalue("XX")
""") """)
testdir.mkdir("hello") testdir.mkdir("hello")
evrec = testdir.inline_run(testdir.tmpdir) evrec = testdir.inline_run(testdir.tmpdir)

View File

@ -180,7 +180,7 @@ class TestConfigApi_getcolitems:
col = colitems[0] col = colitems[0]
assert isinstance(col, py.test.collect.Directory) assert isinstance(col, py.test.collect.Directory)
for col in col.listchain(): for col in col.listchain():
assert col._config is config assert col.config is config
def test_getcolitems_twodirs(self, tmpdir): def test_getcolitems_twodirs(self, tmpdir):
config = py.test.config._reparse([tmpdir, tmpdir]) config = py.test.config._reparse([tmpdir, tmpdir])
@ -200,7 +200,7 @@ class TestConfigApi_getcolitems:
assert col2.name == 'a' assert col2.name == 'a'
for col in colitems: for col in colitems:
for subcol in col.listchain(): for subcol in col.listchain():
assert col._config is config assert col.config is config
def test__getcol_global_file(self, tmpdir): def test__getcol_global_file(self, tmpdir):
x = tmpdir.ensure("x.py") x = tmpdir.ensure("x.py")
@ -211,7 +211,7 @@ class TestConfigApi_getcolitems:
assert col.parent.name == tmpdir.basename assert col.parent.name == tmpdir.basename
assert col.parent.parent is None assert col.parent.parent is None
for col in col.listchain(): for col in col.listchain():
assert col._config is config assert col.config is config
def test__getcol_global_dir(self, tmpdir): def test__getcol_global_dir(self, tmpdir):
x = tmpdir.ensure("a", dir=1) x = tmpdir.ensure("a", dir=1)
@ -221,7 +221,7 @@ class TestConfigApi_getcolitems:
print col.listchain() print col.listchain()
assert col.name == 'a' assert col.name == 'a'
assert col.parent is None assert col.parent is None
assert col._config is config assert col.config is config
def test__getcol_pkgfile(self, tmpdir): def test__getcol_pkgfile(self, tmpdir):
x = tmpdir.ensure("x.py") x = tmpdir.ensure("x.py")
@ -233,7 +233,7 @@ class TestConfigApi_getcolitems:
assert col.parent.name == x.dirpath().basename assert col.parent.name == x.dirpath().basename
assert col.parent.parent is None assert col.parent.parent is None
for col in col.listchain(): for col in col.listchain():
assert col._config is config assert col.config is config

View File

@ -158,9 +158,9 @@ class TestConfigPickling:
newcol = unpickler.load() newcol = unpickler.load()
newcol2 = unpickler.load() newcol2 = unpickler.load()
newcol3 = unpickler.load() newcol3 = unpickler.load()
assert newcol2._config is newcol._config assert newcol2.config is newcol.config
assert newcol2.parent == newcol assert newcol2.parent == newcol
assert newcol2._config.topdir == topdir assert newcol2.config.topdir == topdir
assert newcol.fspath == topdir assert newcol.fspath == topdir
assert newcol2.fspath.basename == dir1.basename assert newcol2.fspath.basename == dir1.basename
assert newcol2.fspath.relto(topdir) assert newcol2.fspath.relto(topdir)

View File

@ -50,9 +50,9 @@ class TestModule:
def test_module_participates_as_plugin(self, testdir): def test_module_participates_as_plugin(self, testdir):
modcol = testdir.getmodulecol("") modcol = testdir.getmodulecol("")
modcol.setup() modcol.setup()
assert modcol._config.pytestplugins.isregistered(modcol.obj) assert modcol.config.pytestplugins.isregistered(modcol.obj)
modcol.teardown() modcol.teardown()
assert not modcol._config.pytestplugins.isregistered(modcol.obj) assert not modcol.config.pytestplugins.isregistered(modcol.obj)
def test_module_considers_pytestplugins_at_import(self, testdir): def test_module_considers_pytestplugins_at_import(self, testdir):
modcol = testdir.getmodulecol("pytest_plugins='xasdlkj',") modcol = testdir.getmodulecol("pytest_plugins='xasdlkj',")
@ -237,7 +237,7 @@ class TestFunction:
class Provider: class Provider:
def pytest_pyfuncarg_some(self, pyfuncitem): def pytest_pyfuncarg_some(self, pyfuncitem):
return pyfuncitem.name return pyfuncitem.name
item._config.pytestplugins.register(Provider()) item.config.pytestplugins.register(Provider())
kw = item.lookup_allargs() kw = item.lookup_allargs()
assert len(kw) == 1 assert len(kw) == 1
@ -246,7 +246,7 @@ class TestFunction:
class Provider: class Provider:
def pytest_pyfuncarg_other(self, pyfuncitem): def pytest_pyfuncarg_other(self, pyfuncitem):
return pyfuncitem.name return pyfuncitem.name
item._config.pytestplugins.register(Provider()) item.config.pytestplugins.register(Provider())
kw = item.lookup_allargs() kw = item.lookup_allargs()
assert len(kw) == 1 assert len(kw) == 1
name, value = kw.popitem() name, value = kw.popitem()
@ -260,7 +260,7 @@ class TestFunction:
return pyfuncitem.name return pyfuncitem.name
def pytest_pyfuncarg_other(self, pyfuncitem): def pytest_pyfuncarg_other(self, pyfuncitem):
return 42 return 42
item._config.pytestplugins.register(Provider()) item.config.pytestplugins.register(Provider())
kw = item.lookup_allargs() kw = item.lookup_allargs()
assert len(kw) == 2 assert len(kw) == 2
assert kw['some'] == "test_func" assert kw['some'] == "test_func"
@ -273,7 +273,7 @@ class TestFunction:
def pytest_pyfuncarg_some(self, pyfuncitem): def pytest_pyfuncarg_some(self, pyfuncitem):
pyfuncitem.addfinalizer(lambda: l.append(42)) pyfuncitem.addfinalizer(lambda: l.append(42))
return 3 return 3
item._config.pytestplugins.register(Provider()) item.config.pytestplugins.register(Provider())
kw = item.lookup_allargs() kw = item.lookup_allargs()
assert len(kw) == 1 assert len(kw) == 1
assert kw['some'] == 3 assert kw['some'] == 3
@ -295,13 +295,13 @@ class TestFunction:
""") """)
item1, item2 = testdir.genitems([modcol]) item1, item2 = testdir.genitems([modcol])
modcol.setup() modcol.setup()
assert modcol._config.pytestplugins.isregistered(modcol.obj) assert modcol.config.pytestplugins.isregistered(modcol.obj)
kwargs = item1.lookup_allargs() kwargs = item1.lookup_allargs()
assert kwargs['something'] == "test_method" assert kwargs['something'] == "test_method"
kwargs = item2.lookup_allargs() kwargs = item2.lookup_allargs()
assert kwargs['something'] == "test_func" assert kwargs['something'] == "test_func"
modcol.teardown() modcol.teardown()
assert not modcol._config.pytestplugins.isregistered(modcol.obj) assert not modcol.config.pytestplugins.isregistered(modcol.obj)
class TestSorting: class TestSorting:
def test_check_equality_and_cmp_basic(self, testdir): def test_check_equality_and_cmp_basic(self, testdir):

View File

@ -267,7 +267,7 @@ class TestPytestPluginInteractions:
return x+0 return x+0
""") """)
l = [] l = []
call = modcol._config.pytestplugins.setupcall(modcol, "pytest_method", 1) call = modcol.config.pytestplugins.setupcall(modcol, "pytest_method", 1)
assert len(call.methods) == 3 assert len(call.methods) == 3
results = call.execute() results = call.execute()
assert results == [1,2,2] assert results == [1,2,2]