diff options
author | Aldo Cortesi <aldo@nullcube.com> | 2016-12-03 12:16:50 +1300 |
---|---|---|
committer | Aldo Cortesi <aldo@nullcube.com> | 2016-12-08 10:21:06 +1300 |
commit | c94cd512d108fd9a12c87015791ce977b895fa2d (patch) | |
tree | 608fbf951613b6920974431692a574b3bd1cf995 | |
parent | 3594faf5c42bfe4d422b16e4ceedb482802c95ce (diff) | |
download | mitmproxy-c94cd512d108fd9a12c87015791ce977b895fa2d.tar.gz mitmproxy-c94cd512d108fd9a12c87015791ce977b895fa2d.tar.bz2 mitmproxy-c94cd512d108fd9a12c87015791ce977b895fa2d.zip |
options: defaults are a class attribute
-rw-r--r-- | mitmproxy/optmanager.py | 28 | ||||
-rw-r--r-- | test/mitmproxy/test_optmanager.py | 5 |
2 files changed, 23 insertions, 10 deletions
diff --git a/mitmproxy/optmanager.py b/mitmproxy/optmanager.py index 3ce76a45..304f5129 100644 --- a/mitmproxy/optmanager.py +++ b/mitmproxy/optmanager.py @@ -14,7 +14,20 @@ from mitmproxy.utils import typecheck """ -class OptManager: +class _DefaultsMeta(type): + def __new__(cls, name, bases, namespace, **kwds): + ret = type.__new__(cls, name, bases, dict(namespace)) + defaults = {} + for klass in reversed(inspect.getmro(ret)): + 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 + ret._defaults = defaults + return ret + + +class OptManager(metaclass=_DefaultsMeta): """ OptManager is the base class from which Options objects are derived. Note that the __init__ method of all child classes must force all @@ -37,15 +50,6 @@ class OptManager: # ._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): @@ -122,6 +126,10 @@ class OptManager: """ 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(): diff --git a/test/mitmproxy/test_optmanager.py b/test/mitmproxy/test_optmanager.py index c7808391..385cf621 100644 --- a/test/mitmproxy/test_optmanager.py +++ b/test/mitmproxy/test_optmanager.py @@ -28,6 +28,11 @@ 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", |