Skip to content

Commit

Permalink
__call__ is added to Slacker in order to support Slacker(Foo)(...) sy…
Browse files Browse the repository at this point in the history
…ntax
  • Loading branch information
kmike committed Apr 29, 2011
1 parent 06c1d57 commit 851cd1c
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 18 deletions.
3 changes: 3 additions & 0 deletions slacker/postpone.py
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -111,6 +111,9 @@ def __init__(self, obj, worker=None):
def __getattr__(self, item): def __getattr__(self, item):
return getattr(Postponed(self._obj, self._worker), item) return getattr(Postponed(self._obj, self._worker), item)


def __call__(self, *args, **kwargs):
return Postponed(self._obj, self._worker).__call__(*args, **kwargs)



def proceed_pickled(pickled_postponed_obj): def proceed_pickled(pickled_postponed_obj):
""" """
Expand Down
37 changes: 19 additions & 18 deletions slacker/tests.py
Original file line number Original file line Diff line number Diff line change
@@ -1,6 +1,7 @@
import pickle
from django.utils import unittest from django.utils import unittest


from slacker.postpone import Postponed from slacker.postpone import Postponed, Slacker


class Foo(object): class Foo(object):


Expand All @@ -23,48 +24,48 @@ def name(self):
self.name_accessed = True self.name_accessed = True
return self._name return self._name


FooSlacker = Slacker(Foo)


class PostponeTest(unittest.TestCase): class PostponeTest(unittest.TestCase):


def assertRestored(self, chain, value): def assertRestored(self, chain, value):
self.assertEqual(chain._proceed(), value) self.assertEqual(chain._proceed(), value)


def setUp(self): def setUp(self):
self.foo = Foo('foo') self.foo = FooSlacker('foo')

def _foo(self):
# PostponeProxy objects shouldn't be reused
return Postponed(self.foo)


def test_method_basic(self): def test_method_basic(self):
self.assertRestored(self._foo().get_name(), 'foo') self.assertRestored(self.foo.get_name(), 'foo')


def test_method_args(self): def test_method_args(self):
chain = self._foo().xy(1, 2) chain = self.foo.xy(1, 2)
self.assertRestored(chain, '1-2') self.assertRestored(chain, '1-2')


def test_method_kwargs(self): def test_method_kwargs(self):
self.assertRestored(self._foo().xy(y=2, x=1), '1-2') self.assertRestored(self.foo.xy(y=2, x=1), '1-2')


def test_attributes(self): def test_attributes(self):
self.assertRestored(self._foo().name, 'foo') self.assertRestored(self.foo.name, 'foo')


def test_slicing(self): def test_slicing(self):
self.assertRestored(self._foo().name[0], 'f') self.assertRestored(self.foo.name[0], 'f')


def test_chaining(self): def test_chaining(self):
chain = self._foo().create_bar().bar.create_bar().bar.name[1:-1] chain = self.foo.create_bar().bar.create_bar().bar.name[1:-1]
self.assertRestored(chain, 'oo bar ba') self.assertRestored(chain, 'oo bar ba')


def test_no_execution(self): def test_no_execution(self):
self._foo().create_bar() real_foo = Foo('foo')
self.assertFalse(hasattr(self.foo, 'bar')) foo = Postponed(real_foo)

foo.create_bar()
self.assertFalse(hasattr(real_foo, 'bar'))


self._foo().name foo.name
self.assertFalse(self.foo.name_accessed) self.assertFalse(real_foo.name_accessed)


self.foo.name real_foo.name
self.assertTrue(self.foo.name_accessed) self.assertTrue(real_foo.name_accessed)


def test_top_level_callables(self): def test_top_level_callables(self):
chain = Postponed(Foo)('bar') chain = Postponed(Foo)('bar')
Expand Down

0 comments on commit 851cd1c

Please sign in to comment.