Make InvocationParams.args a tuple (#6008)
Make InvocationParams.args a tuple
This commit is contained in:
		
						commit
						b5579d2cf2
					
				|  | @ -0,0 +1,2 @@ | ||||||
|  | ``Config.InvocationParams.args`` is now always a ``tuple`` to better convey that it should be | ||||||
|  | immutable and avoid accidental modifications. | ||||||
|  | @ -169,7 +169,7 @@ def get_config(args=None, plugins=None): | ||||||
|     config = Config( |     config = Config( | ||||||
|         pluginmanager, |         pluginmanager, | ||||||
|         invocation_params=Config.InvocationParams( |         invocation_params=Config.InvocationParams( | ||||||
|             args=args, plugins=plugins, dir=Path().resolve() |             args=args or (), plugins=plugins, dir=Path().resolve() | ||||||
|         ), |         ), | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
|  | @ -654,7 +654,7 @@ class Config: | ||||||
| 
 | 
 | ||||||
|         Contains the following read-only attributes: |         Contains the following read-only attributes: | ||||||
| 
 | 
 | ||||||
|         * ``args``: list of command-line arguments as passed to ``pytest.main()``. |         * ``args``: tuple of command-line arguments as passed to ``pytest.main()``. | ||||||
|         * ``plugins``: list of extra plugins, might be None. |         * ``plugins``: list of extra plugins, might be None. | ||||||
|         * ``dir``: directory where ``pytest.main()`` was invoked from. |         * ``dir``: directory where ``pytest.main()`` was invoked from. | ||||||
|     """ |     """ | ||||||
|  | @ -667,13 +667,13 @@ class Config: | ||||||
| 
 | 
 | ||||||
|         .. note:: |         .. note:: | ||||||
| 
 | 
 | ||||||
|             Currently the environment variable PYTEST_ADDOPTS is also handled by |             Note that the environment variable ``PYTEST_ADDOPTS`` and the ``addopts`` | ||||||
|             pytest implicitly, not being part of the invocation. |             ini option are handled by pytest, not being included in the ``args`` attribute. | ||||||
| 
 | 
 | ||||||
|             Plugins accessing ``InvocationParams`` must be aware of that. |             Plugins accessing ``InvocationParams`` must be aware of that. | ||||||
|         """ |         """ | ||||||
| 
 | 
 | ||||||
|         args = attr.ib() |         args = attr.ib(converter=tuple) | ||||||
|         plugins = attr.ib() |         plugins = attr.ib() | ||||||
|         dir = attr.ib(type=Path) |         dir = attr.ib(type=Path) | ||||||
| 
 | 
 | ||||||
|  | @ -938,7 +938,6 @@ class Config: | ||||||
|         assert not hasattr( |         assert not hasattr( | ||||||
|             self, "args" |             self, "args" | ||||||
|         ), "can only parse cmdline args at most once per Config object" |         ), "can only parse cmdline args at most once per Config object" | ||||||
|         assert self.invocation_params.args == args |  | ||||||
|         self.hook.pytest_addhooks.call_historic( |         self.hook.pytest_addhooks.call_historic( | ||||||
|             kwargs=dict(pluginmanager=self.pluginmanager) |             kwargs=dict(pluginmanager=self.pluginmanager) | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|  | @ -7,6 +7,7 @@ import _pytest._code | ||||||
| import pytest | import pytest | ||||||
| from _pytest.compat import importlib_metadata | from _pytest.compat import importlib_metadata | ||||||
| from _pytest.config import _iter_rewritable_modules | from _pytest.config import _iter_rewritable_modules | ||||||
|  | from _pytest.config import Config | ||||||
| from _pytest.config.exceptions import UsageError | from _pytest.config.exceptions import UsageError | ||||||
| from _pytest.config.findpaths import determine_setup | from _pytest.config.findpaths import determine_setup | ||||||
| from _pytest.config.findpaths import get_common_ancestor | from _pytest.config.findpaths import get_common_ancestor | ||||||
|  | @ -456,7 +457,7 @@ class TestConfigFromdictargs: | ||||||
| 
 | 
 | ||||||
|         config = Config.fromdictargs(option_dict, args) |         config = Config.fromdictargs(option_dict, args) | ||||||
|         assert config.args == ["a", "b"] |         assert config.args == ["a", "b"] | ||||||
|         assert config.invocation_params.args == args |         assert config.invocation_params.args == tuple(args) | ||||||
|         assert config.option.verbose == 4 |         assert config.option.verbose == 4 | ||||||
|         assert config.option.capture == "no" |         assert config.option.capture == "no" | ||||||
| 
 | 
 | ||||||
|  | @ -1235,7 +1236,7 @@ def test_invocation_args(testdir): | ||||||
|     call = calls[0] |     call = calls[0] | ||||||
|     config = call.item.config |     config = call.item.config | ||||||
| 
 | 
 | ||||||
|     assert config.invocation_params.args == [p, "-v"] |     assert config.invocation_params.args == (p, "-v") | ||||||
|     assert config.invocation_params.dir == Path(str(testdir.tmpdir)) |     assert config.invocation_params.dir == Path(str(testdir.tmpdir)) | ||||||
| 
 | 
 | ||||||
|     plugins = config.invocation_params.plugins |     plugins = config.invocation_params.plugins | ||||||
|  | @ -1243,6 +1244,10 @@ def test_invocation_args(testdir): | ||||||
|     assert plugins[0] is plugin |     assert plugins[0] is plugin | ||||||
|     assert type(plugins[1]).__name__ == "Collect"  # installed by testdir.inline_run() |     assert type(plugins[1]).__name__ == "Collect"  # installed by testdir.inline_run() | ||||||
| 
 | 
 | ||||||
|  |     # args cannot be None | ||||||
|  |     with pytest.raises(TypeError): | ||||||
|  |         Config.InvocationParams(args=None, plugins=None, dir=Path()) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| @pytest.mark.parametrize( | @pytest.mark.parametrize( | ||||||
|     "plugin", |     "plugin", | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue