Skip to content

Instantly share code, notes, and snippets.

@eferro
Created January 28, 2013 16:50
Show Gist options
  • Save eferro/4657124 to your computer and use it in GitHub Desktop.
Save eferro/4657124 to your computer and use it in GitHub Desktop.
dynamic proxy... inject args and kwargs to all the methods of the target
# -*- coding: utf-8 -*-
import unittest
from doublex import *
class Proxy(object):
class Method(object):
def __init__(self, target, method_name, *aditional_args, **aditional_kwargs):
self.target = target
self.method_name = method_name
self.aditional_args = aditional_args
self.aditional_kwargs = aditional_kwargs
def __call__(self, *args, **kwargs):
complete_args = []
complete_args.extend(args)
complete_args.extend(self.aditional_args)
complete_kwargs = {}
complete_kwargs.update(kwargs)
complete_kwargs.update(self.aditional_kwargs)
target_symbol = getattr(self.target, self.method_name)
target_symbol(*complete_args, **complete_kwargs)
def __init__(self, target, *aditional_args, **aditional_kwargs):
self.target = target
self.aditional_args = aditional_args
self.aditional_kwargs = aditional_kwargs
def __getattr__(self, name):
return Proxy.Method(self.target, name, *self.aditional_args, **self.aditional_kwargs)
class ProxyTest(unittest.TestCase):
def test_proxy_call_method_with_aditional_args(self):
target = Spy()
proxy = Proxy(target, 3, param2='param2')
proxy.method1(1,2, param1='param1')
assert_that(target.method1, called().with_args(1, 2, 3, param1='param1', param2='param2'))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment