Skip to content

Commit 3a5dd7a

Browse files
author
Buck Golemon
committed
all tests pass
1 parent 5446aff commit 3a5dd7a

File tree

2 files changed

+38
-23
lines changed

2 files changed

+38
-23
lines changed

_pytest/config.py

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -454,11 +454,11 @@ def addoption(self, *opts, **attrs):
454454
"""
455455
self._anonymous.addoption(*opts, **attrs)
456456

457-
def parse(self, args):
457+
def parse(self, args, namespace=None):
458458
from _pytest._argcomplete import try_argcomplete
459459
self.optparser = self._getparser()
460460
try_argcomplete(self.optparser)
461-
return self.optparser.parse_args([str(x) for x in args])
461+
return self.optparser.parse_args([str(x) for x in args], namespace=namespace)
462462

463463
def _getparser(self):
464464
from _pytest._argcomplete import filescompleter
@@ -476,25 +476,25 @@ def _getparser(self):
476476
optparser.add_argument(FILE_OR_DIR, nargs='*').completer=filescompleter
477477
return optparser
478478

479-
def parse_setoption(self, args, option):
480-
parsedoption = self.parse(args)
479+
def parse_setoption(self, args, option, namespace=None):
480+
parsedoption = self.parse(args, namespace=namespace)
481481
for name, value in parsedoption.__dict__.items():
482482
setattr(option, name, value)
483483
return getattr(parsedoption, FILE_OR_DIR)
484484

485-
def parse_known_args(self, args):
485+
def parse_known_args(self, args, namespace=None):
486486
"""parses and returns a namespace object with known arguments at this
487487
point.
488488
"""
489-
return self.parse_known_and_unknown_args(args)[0]
489+
return self.parse_known_and_unknown_args(args, namespace=namespace)[0]
490490

491-
def parse_known_and_unknown_args(self, args):
491+
def parse_known_and_unknown_args(self, args, namespace=None):
492492
"""parses and returns a namespace object with known arguments, and
493493
the remaining arguments unknown at this point.
494494
"""
495495
optparser = self._getparser()
496496
args = [str(x) for x in args]
497-
return optparser.parse_known_args(args)
497+
return optparser.parse_known_args(args, namespace=namespace)
498498

499499
def addini(self, name, help, type=None, default=None):
500500
""" register an ini-file option.
@@ -778,10 +778,16 @@ def _ensure_removed_sysmodule(modname):
778778

779779
class CmdOptions(object):
780780
""" holds cmdline options as attributes."""
781-
def __init__(self, **kwargs):
782-
self.__dict__.update(kwargs)
781+
def __init__(self, values=()):
782+
self.update(values)
783783
def __repr__(self):
784784
return "<CmdOptions %r>" %(self.__dict__,)
785+
def update(self, values):
786+
self.__dict__.update(values)
787+
def copy(self):
788+
copy = CmdOptions()
789+
copy.update(self.__dict__)
790+
return copy
785791

786792
class Notset:
787793
def __repr__(self):
@@ -878,8 +884,8 @@ def cwd_relative_nodeid(self, nodeid):
878884
def fromdictargs(cls, option_dict, args):
879885
""" constructor useable for subprocesses. """
880886
config = get_config()
887+
config.option.update(option_dict)
881888
config.parse(args, addopts=False)
882-
config.option.__dict__.update(option_dict)
883889
for x in config.option.plugins:
884890
config.pluginmanager.consider_pluginarg(x)
885891
return config
@@ -897,7 +903,7 @@ def pytest_load_initial_conftests(self, early_config):
897903
self.pluginmanager._set_initial_conftests(early_config.known_args_namespace)
898904

899905
def _initini(self, args):
900-
ns, unknown_args = self._parser.parse_known_and_unknown_args(args)
906+
ns, unknown_args = self._parser.parse_known_and_unknown_args(args, namespace=self.option.copy())
901907
r = determine_setup(ns.inifilename, ns.file_or_dir + unknown_args)
902908
self.rootdir, self.inifile, self.inicfg = r
903909
self._parser.extra_info['rootdir'] = self.rootdir
@@ -918,7 +924,7 @@ def _preparse(self, args, addopts=True):
918924
except ImportError as e:
919925
self.warn("I2", "could not load setuptools entry import: %s" % (e,))
920926
self.pluginmanager.consider_env()
921-
self.known_args_namespace = ns = self._parser.parse_known_args(args)
927+
self.known_args_namespace = ns = self._parser.parse_known_args(args, namespace=self.option.copy())
922928
if self.known_args_namespace.confcutdir is None and self.inifile:
923929
confcutdir = py.path.local(self.inifile).dirname
924930
self.known_args_namespace.confcutdir = confcutdir
@@ -956,7 +962,8 @@ def parse(self, args, addopts=True):
956962
self._preparse(args, addopts=addopts)
957963
# XXX deprecated hook:
958964
self.hook.pytest_cmdline_preparse(config=self, args=args)
959-
args = self._parser.parse_setoption(args, self.option)
965+
args = self._parser.parse_setoption(args, self.option, namespace=self.option)
966+
#args = self._parser.parse_known_args(args, namespace=self.option)
960967
if not args:
961968
cwd = os.getcwd()
962969
if cwd == self.rootdir:

testing/test_config.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -269,38 +269,46 @@ class TestConfigFromdictargs:
269269
def test_basic_behavior(self):
270270
from _pytest.config import Config
271271
option_dict = {
272-
'verbose': 1e100,
272+
'verbose': 444,
273273
'foo': 'bar',
274+
'capture': 'no',
274275
}
275276
args = ['a', 'b']
276277

277278
config = Config.fromdictargs(option_dict, args)
278279
with pytest.raises(AssertionError):
279-
config.parse(['should to parse again'])
280-
assert config.option.verbose == 1e100
280+
config.parse(['should refuse to parse again'])
281+
assert config.option.verbose == 444
281282
assert config.option.foo == 'bar'
282283
assert config.args == args
283284

284285
def test_origargs(self):
285286
"""Show that fromdictargs can handle args in their "orig" format"""
286287
from _pytest.config import Config
287288
option_dict = {}
288-
args = ['-vvvv', 'a', 'b']
289+
args = ['-vvvv', '-s', 'a', 'b']
289290

290291
config = Config.fromdictargs(option_dict, args)
291292
assert config.args == ['a', 'b']
292-
assert config._origargs == ['-vvvv', 'a', 'b']
293+
assert config._origargs == args
293294
assert config.option.verbose == 4
294295

295-
@pytest.mark.xfail(reason="fromdictargs currently broken #1060")
296-
def test_inifilename(self):
296+
def test_inifilename(self, tmpdir):
297+
tmpdir.join("foo/bar.ini").ensure().write(py.code.Source("""
298+
[pytest]
299+
name = value
300+
"""))
301+
297302
from _pytest.config import Config
298-
inifile = '../../foo/bar.ini',
303+
inifile = '../../foo/bar.ini'
299304
option_dict = {
300305
'inifilename': inifile,
306+
'capture': 'no',
301307
}
302308

303-
config = Config.fromdictargs(option_dict, ())
309+
with tmpdir.join('a/b').ensure(dir=True).as_cwd():
310+
config = Config.fromdictargs(option_dict, ())
311+
304312
assert config.option.inifilename == inifile
305313

306314
# this indicates this is the file used for getting configuration values

0 commit comments

Comments
 (0)