diff --git a/_pytest/mark/structures.py b/_pytest/mark/structures.py index 5550dc546..bfe9efc78 100644 --- a/_pytest/mark/structures.py +++ b/_pytest/mark/structures.py @@ -1,4 +1,4 @@ -from collections import namedtuple +from collections import namedtuple, MutableMapping as MappingMixin import warnings from operator import attrgetter import inspect @@ -328,3 +328,39 @@ class MarkGenerator(object): MARK_GEN = MarkGenerator() + + +class NodeKeywords(MappingMixin): + def __init__(self, node): + self.node = node + self.parent = node.parent + self._markers = {node.name: True} + + def __getitem__(self, key): + try: + return self._markers[key] + except KeyError: + if self.parent is None: + raise + return self.parent.keywords[key] + + def __setitem__(self, key, value): + self._markers[key] = value + + def __delitem__(self, key): + raise ValueError("cannot delete key in keywords dict") + + def __iter__(self): + seen = set(self._markers) + if self.parent is not None: + seen.update(self.parent.keywords) + return iter(seen) + + def __len__(self): + return len(self.__iter__()) + + def keys(self): + return list(self) + + def __repr__(self): + return "" % (self.node, ) \ No newline at end of file diff --git a/_pytest/nodes.py b/_pytest/nodes.py index e076d5747..9f51fc884 100644 --- a/_pytest/nodes.py +++ b/_pytest/nodes.py @@ -1,5 +1,4 @@ from __future__ import absolute_import, division, print_function -from collections import MutableMapping as MappingMixin import os import six @@ -7,7 +6,7 @@ import py import attr import _pytest - +from _pytest.mark.structures import NodeKeywords SEP = "/" @@ -66,42 +65,6 @@ class _CompatProperty(object): return getattr(__import__('pytest'), self.name) -class NodeKeywords(MappingMixin): - def __init__(self, node): - self.node = node - self.parent = node.parent - self._markers = {node.name: True} - - def __getitem__(self, key): - try: - return self._markers[key] - except KeyError: - if self.parent is None: - raise - return self.parent.keywords[key] - - def __setitem__(self, key, value): - self._markers[key] = value - - def __delitem__(self, key): - raise ValueError("cannot delete key in keywords dict") - - def __iter__(self): - seen = set(self._markers) - if self.parent is not None: - seen.update(self.parent.keywords) - return iter(seen) - - def __len__(self): - return len(self.__iter__()) - - def keys(self): - return list(self) - - def __repr__(self): - return "" % (self.node, ) - - class Node(object): """ base class for Collector and Item the test collection tree. Collector subclasses have children, Items are terminal nodes."""