1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/0e4482f0ba67/ Changeset: 0e4482f0ba67 User: hpk42 Date: 2013-10-03 13:53:22 Summary: simplify the implementation of NodeKeywords getting rid of __ descriptors appearing there. Affected #: 4 files
diff -r 6ce6602773ace1949b47d09c7bcff384530dbfb5 -r 0e4482f0ba672ae3e31d21cd12d5f06b15e621d7 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,10 @@ Changes between 2.4.1 and 2.4.2 ----------------------------------- +- fix "-k" matching of tests where "repr" and "attr" and other names would + cause wrong matches because of an internal implementation quirk + (don't ask) which is now properly implemented. fixes issue345. + - avoid "IOError: Bad Filedescriptor" on pytest shutdown by not closing the internal dupped stdout (fix is slightly hand-wavy but work). diff -r 6ce6602773ace1949b47d09c7bcff384530dbfb5 -r 0e4482f0ba672ae3e31d21cd12d5f06b15e621d7 _pytest/main.py --- a/_pytest/main.py +++ b/_pytest/main.py @@ -170,30 +170,39 @@ class NodeKeywords(MappingMixin): def __init__(self, node): - parent = node.parent - bases = parent and (parent.keywords._markers,) or () - self._markers = type("dynmarker", bases, {node.name: True}) + self.node = node + self.parent = node.parent + self._markers = {node.name: True} def __getitem__(self, key): try: - return getattr(self._markers, key) - except AttributeError: - raise KeyError(key) + return self._markers[key] + except KeyError: + if self.parent is None: + raise + return self.parent.keywords[key] def __setitem__(self, key, value): - setattr(self._markers, key, value) + self._markers[key] = value def __delitem__(self, key): - delattr(self._markers, key) + raise ValueError("cannot delete key in keywords dict") def __iter__(self): - return iter(self.keys()) + seen = set(self._markers) + if self.parent is not None: + seen.update(self.parent.keywords) + return iter(seen) def __len__(self): - return len(self.keys()) + return len(self.__iter__()) def keys(self): - return dir(self._markers) + return list(self) + + def __repr__(self): + return "<NodeKeywords for node %s>" % (self.node, ) + class Node(object): """ base class for Collector and Item the test collection tree. diff -r 6ce6602773ace1949b47d09c7bcff384530dbfb5 -r 0e4482f0ba672ae3e31d21cd12d5f06b15e621d7 bench/bench.py --- a/bench/bench.py +++ b/bench/bench.py @@ -7,4 +7,4 @@ p = pstats.Stats("prof") p.strip_dirs() p.sort_stats('cumulative') - print(p.print_stats(30)) + print(p.print_stats(50)) diff -r 6ce6602773ace1949b47d09c7bcff384530dbfb5 -r 0e4482f0ba672ae3e31d21cd12d5f06b15e621d7 testing/test_collection.py --- a/testing/test_collection.py +++ b/testing/test_collection.py @@ -566,4 +566,25 @@ ]) +class TestNodekeywords: + def test_no_under(self, testdir): + modcol = testdir.getmodulecol(""" + def test_pass(): pass + def test_fail(): assert 0 + """) + l = list(modcol.keywords) + assert modcol.name in l + for x in l: + assert not x.startswith("_") + assert modcol.name in repr(modcol.keywords) + def test_issue345(self, testdir): + testdir.makepyfile(""" + def test_should_not_be_selected(): + assert False, 'I should not have been selected to run' + + def test___repr__(): + pass + """) + reprec = testdir.inline_run("-k repr") + reprec.assertoutcome(passed=1, failed=0) Repository URL: https://bitbucket.org/hpk42/pytest/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email. _______________________________________________ pytest-commit mailing list pytest-commit@python.org https://mail.python.org/mailman/listinfo/pytest-commit