aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2016-12-03 12:16:50 +1300
committerAldo Cortesi <aldo@nullcube.com>2016-12-08 10:21:06 +1300
commitc94cd512d108fd9a12c87015791ce977b895fa2d (patch)
tree608fbf951613b6920974431692a574b3bd1cf995
parent3594faf5c42bfe4d422b16e4ceedb482802c95ce (diff)
downloadmitmproxy-c94cd512d108fd9a12c87015791ce977b895fa2d.tar.gz
mitmproxy-c94cd512d108fd9a12c87015791ce977b895fa2d.tar.bz2
mitmproxy-c94cd512d108fd9a12c87015791ce977b895fa2d.zip
options: defaults are a class attribute
-rw-r--r--mitmproxy/optmanager.py28
-rw-r--r--test/mitmproxy/test_optmanager.py5
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",