diff --git a/mitmproxy/optmanager.py b/mitmproxy/optmanager.py index cbf656f57..713a0b626 100644 --- a/mitmproxy/optmanager.py +++ b/mitmproxy/optmanager.py @@ -53,6 +53,15 @@ class OptManager(metaclass=_DefaultsMeta): # ._initialized = True as the final operation. instance = super().__new__(cls) instance.__dict__["_opts"] = {} + + defaults = {} + for klass in reversed(inspect.getmro(cls)): + for p in inspect.signature(klass.__init__).parameters.values(): + if p.kind in (p.KEYWORD_ONLY, p.POSITIONAL_OR_KEYWORD): + if not p.default == p.empty: + defaults[p.name] = p.default + instance.__dict__["_defaults"] = defaults + return instance def __init__(self): @@ -123,16 +132,16 @@ class OptManager(metaclass=_DefaultsMeta): def keys(self): return set(self._opts.keys()) + @classmethod + def default(klass, opt): + return copy.deepcopy(klass._defaults[opt]) + def reset(self): """ Restore defaults for all options. """ self.update(**self._defaults) - @classmethod - def default(klass, opt): - return copy.deepcopy(klass._defaults[opt]) - def update(self, **kwargs): updated = set(kwargs.keys()) for k, v in kwargs.items(): @@ -215,7 +224,7 @@ class OptManager(metaclass=_DefaultsMeta): snip = v.problem_mark.get_snippet() raise exceptions.OptionsError( "Config error at line %s:\n%s\n%s" % - (v.problem_mark.line+1, snip, v.problem) + (v.problem_mark.line + 1, snip, v.problem) ) if isinstance(data, str): raise exceptions.OptionsError("Config error - no keys found.") diff --git a/test/mitmproxy/test_optmanager.py b/test/mitmproxy/test_optmanager.py index 0c98daea0..97124368e 100644 --- a/test/mitmproxy/test_optmanager.py +++ b/test/mitmproxy/test_optmanager.py @@ -30,11 +30,6 @@ class TD2(TD): def test_defaults(): - assert TD2.default("one") == "done" - assert TD2.default("two") == "dtwo" - assert TD2.default("three") == "dthree" - assert TD2.default("four") == "dfour" - o = TD2() assert o._defaults == { "one": "done",