fix #2540, introduce mark.with_args
This commit is contained in:
		
							parent
							
								
									abb5d20841
								
							
						
					
					
						commit
						65b2de13a3
					
				|  | @ -335,6 +335,17 @@ class MarkDecorator: | ||||||
|     def __repr__(self): |     def __repr__(self): | ||||||
|         return "<MarkDecorator %r>" % (self.mark,) |         return "<MarkDecorator %r>" % (self.mark,) | ||||||
| 
 | 
 | ||||||
|  |     def with_args(self, *args, **kwargs): | ||||||
|  |         """ return a MarkDecorator with extra arguments added | ||||||
|  | 
 | ||||||
|  |         unlike call this can be used even if the sole argument is a callable/class | ||||||
|  | 
 | ||||||
|  |         :return: MarkDecorator | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         mark = Mark(self.name, args, kwargs) | ||||||
|  |         return self.__class__(self.mark.combined_with(mark)) | ||||||
|  | 
 | ||||||
|     def __call__(self, *args, **kwargs): |     def __call__(self, *args, **kwargs): | ||||||
|         """ if passed a single callable argument: decorate it with mark info. |         """ if passed a single callable argument: decorate it with mark info. | ||||||
|             otherwise add *args/**kwargs in-place to mark information. """ |             otherwise add *args/**kwargs in-place to mark information. """ | ||||||
|  | @ -348,9 +359,7 @@ class MarkDecorator: | ||||||
|                     store_legacy_markinfo(func, self.mark) |                     store_legacy_markinfo(func, self.mark) | ||||||
|                     store_mark(func, self.mark) |                     store_mark(func, self.mark) | ||||||
|                 return func |                 return func | ||||||
| 
 |         return self.with_args(*args, **kwargs) | ||||||
|         mark = Mark(self.name, args, kwargs) |  | ||||||
|         return self.__class__(self.mark.combined_with(mark)) |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def get_unpacked_marks(obj): | def get_unpacked_marks(obj): | ||||||
|  |  | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | Introduce ``mark.with_args`` in order to allow passing functions/classes as sole argument to marks. | ||||||
|  | @ -22,6 +22,19 @@ class TestMark(object): | ||||||
|         mark = Mark() |         mark = Mark() | ||||||
|         pytest.raises((AttributeError, TypeError), mark) |         pytest.raises((AttributeError, TypeError), mark) | ||||||
| 
 | 
 | ||||||
|  |     def test_mark_with_param(self): | ||||||
|  |         def some_function(abc): | ||||||
|  |             pass | ||||||
|  | 
 | ||||||
|  |         class SomeClass(object): | ||||||
|  |             pass | ||||||
|  | 
 | ||||||
|  |         assert pytest.mark.fun(some_function) is some_function | ||||||
|  |         assert pytest.mark.fun.with_args(some_function) is not some_function | ||||||
|  | 
 | ||||||
|  |         assert pytest.mark.fun(SomeClass) is SomeClass | ||||||
|  |         assert pytest.mark.fun.with_args(SomeClass) is not SomeClass | ||||||
|  | 
 | ||||||
|     def test_pytest_mark_name_starts_with_underscore(self): |     def test_pytest_mark_name_starts_with_underscore(self): | ||||||
|         mark = Mark() |         mark = Mark() | ||||||
|         pytest.raises(AttributeError, getattr, mark, '_some_name') |         pytest.raises(AttributeError, getattr, mark, '_some_name') | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue