@@ -455,11 +455,11 @@ def addoption(self, *opts, **attrs):
455
455
"""
456
456
self ._anonymous .addoption (* opts , ** attrs )
457
457
458
- def parse (self , args ):
458
+ def parse (self , args , namespace = None ):
459
459
from _pytest ._argcomplete import try_argcomplete
460
460
self .optparser = self ._getparser ()
461
461
try_argcomplete (self .optparser )
462
- return self .optparser .parse_args ([str (x ) for x in args ])
462
+ return self .optparser .parse_args ([str (x ) for x in args ], namespace = namespace )
463
463
464
464
def _getparser (self ):
465
465
from _pytest ._argcomplete import filescompleter
@@ -477,25 +477,25 @@ def _getparser(self):
477
477
optparser .add_argument (FILE_OR_DIR , nargs = '*' ).completer = filescompleter
478
478
return optparser
479
479
480
- def parse_setoption (self , args , option ):
481
- parsedoption = self .parse (args )
480
+ def parse_setoption (self , args , option , namespace = None ):
481
+ parsedoption = self .parse (args , namespace = namespace )
482
482
for name , value in parsedoption .__dict__ .items ():
483
483
setattr (option , name , value )
484
484
return getattr (parsedoption , FILE_OR_DIR )
485
485
486
- def parse_known_args (self , args ):
486
+ def parse_known_args (self , args , namespace = None ):
487
487
"""parses and returns a namespace object with known arguments at this
488
488
point.
489
489
"""
490
- return self .parse_known_and_unknown_args (args )[0 ]
490
+ return self .parse_known_and_unknown_args (args , namespace = namespace )[0 ]
491
491
492
- def parse_known_and_unknown_args (self , args ):
492
+ def parse_known_and_unknown_args (self , args , namespace = None ):
493
493
"""parses and returns a namespace object with known arguments, and
494
494
the remaining arguments unknown at this point.
495
495
"""
496
496
optparser = self ._getparser ()
497
497
args = [str (x ) for x in args ]
498
- return optparser .parse_known_args (args )
498
+ return optparser .parse_known_args (args , namespace = namespace )
499
499
500
500
def addini (self , name , help , type = None , default = None ):
501
501
""" register an ini-file option.
@@ -779,10 +779,12 @@ def _ensure_removed_sysmodule(modname):
779
779
780
780
class CmdOptions (object ):
781
781
""" holds cmdline options as attributes."""
782
- def __init__ (self , ** kwargs ):
783
- self .__dict__ .update (kwargs )
782
+ def __init__ (self , values = () ):
783
+ self .__dict__ .update (values )
784
784
def __repr__ (self ):
785
785
return "<CmdOptions %r>" % (self .__dict__ ,)
786
+ def copy (self ):
787
+ return CmdOptions (self .__dict__ )
786
788
787
789
class Notset :
788
790
def __repr__ (self ):
@@ -879,8 +881,8 @@ def cwd_relative_nodeid(self, nodeid):
879
881
def fromdictargs (cls , option_dict , args ):
880
882
""" constructor useable for subprocesses. """
881
883
config = get_config ()
882
- config .parse (args , addopts = False )
883
884
config .option .__dict__ .update (option_dict )
885
+ config .parse (args , addopts = False )
884
886
for x in config .option .plugins :
885
887
config .pluginmanager .consider_pluginarg (x )
886
888
return config
@@ -898,7 +900,7 @@ def pytest_load_initial_conftests(self, early_config):
898
900
self .pluginmanager ._set_initial_conftests (early_config .known_args_namespace )
899
901
900
902
def _initini (self , args ):
901
- ns , unknown_args = self ._parser .parse_known_and_unknown_args (args )
903
+ ns , unknown_args = self ._parser .parse_known_and_unknown_args (args , namespace = self . option . copy () )
902
904
r = determine_setup (ns .inifilename , ns .file_or_dir + unknown_args )
903
905
self .rootdir , self .inifile , self .inicfg = r
904
906
self ._parser .extra_info ['rootdir' ] = self .rootdir
@@ -919,7 +921,7 @@ def _preparse(self, args, addopts=True):
919
921
except ImportError as e :
920
922
self .warn ("I2" , "could not load setuptools entry import: %s" % (e ,))
921
923
self .pluginmanager .consider_env ()
922
- self .known_args_namespace = ns = self ._parser .parse_known_args (args )
924
+ self .known_args_namespace = ns = self ._parser .parse_known_args (args , namespace = self . option . copy () )
923
925
if self .known_args_namespace .confcutdir is None and self .inifile :
924
926
confcutdir = py .path .local (self .inifile ).dirname
925
927
self .known_args_namespace .confcutdir = confcutdir
@@ -957,7 +959,7 @@ def parse(self, args, addopts=True):
957
959
self ._preparse (args , addopts = addopts )
958
960
# XXX deprecated hook:
959
961
self .hook .pytest_cmdline_preparse (config = self , args = args )
960
- args = self ._parser .parse_setoption (args , self .option )
962
+ args = self ._parser .parse_setoption (args , self .option , namespace = self . option )
961
963
if not args :
962
964
cwd = os .getcwd ()
963
965
if cwd == self .rootdir :
0 commit comments