[py-dev] RFC: draft new resource management API (v1)

holger krekel holger at merlinux.eu
Thu Jun 28 17:41:03 CEST 2012


On Thu, Jun 28, 2012 at 13:08 +0100, Floris Bruynooghe wrote:
> On 28 June 2012 09:15, holger krekel <holger at merlinux.eu> wrote:
> > /me does "import this" and sees: Although practicality beats purity ...
> >
> > I am still fine to consider e. g. the introduction of a pytest.current
> > namespace.  It could lead to make setup_X methods more powerful::
> 
> I think it would be nice to make setup_X methods more powerful by
> giving them access to resources, but it's not a deal breaker.  And I'm
> not a fan of pytest.current either for the same reasons you don't like
> it.
> 
> But you didn't explain why inspecting the arguments like is done for
> the hooks is not viable?  To me that would seem like a neat solution.
> And I'm tempted to say not to bother if the only alternative is to use
> someting pytest.current-like.  It's certainly no regression.

It is in some sense logical to extend the funcarg-idea to setup-methods.
I used to think that the scoping is a problem, but given the new
node.register_factory/getresource() API it could be done somewhat
sanely.  It will remain a bit of a heuristic approach, though, because
setup_module/class/method have traditionally not required exact names -
for example, some people wrongly use:

    def setup_class(self):
        self.xyz = ...

Of course this works.  And I guess we could start funcarg/resource-requesting
based on all previously not possible arguments.  So

    def setup_class(xyz, tmpdir):
        xyz.tmpdir = tmpdir

would work because the first argument does not take part in discovery.
The tmpdir argument would lead to a classnode.getresource("tmpdir") call.
It wouldn't matter if tmpdir is created through a pytest_funcarg__tmpdir or a
register_factory() function.  Do you like this?

> >    import pytest
> >    def setup_module():  # pytest accepts it to keep nose compat
> >        db = pytest.current.modulenode.getresource("db")
> >
> > The "current" namespace could be set by the respective node setup
> > methods.  For classes it's the same idea::
> >
> >    class TestClass:
> >        def setup_class(cls):
> >            cls.db = pytest.current.classnode.getresource("db")
> >
> > Due to the non-declarative nature of this approach, however, i don't
> > see a way to rerun the testclass with multiple "db" instances.
> 
> I don't see how all other uses don't have these issues:
> 
> def pytest_funcarg__foo(item):
>     item.getresource('db')
> 
> or
> 
> def factory_foo(name, node):
>     pass
> def facotry_bar(name, node):
>     node.getresource('foo')
> .register_resource_factory('foo', factory_foo)
> .register_resource_factory('bar', factory_bar)
> 
> Don't these suffer the same problem?  Or am I missing someting.

The latter would work::

    node.register_factory("foo", [fac1, fac2])
    
this makes it clear that there are two "foo" parameter values.

best,
holger

> Regards,
> Floris
> 
> 
> -- 
> Debian GNU/Linux -- The Power of Freedom
> www.debian.org | www.gnu.org | www.kernel.org
> 



More information about the Pytest-dev mailing list