Changeset 597:db9ac6dc904f
- Timestamp:
- 18/05/12 20:56:52 (12 months ago)
- Branch:
- multisite
- Location:
- cyclope
- Files:
-
- 3 edited
-
core/multisite/threadlocals.py (modified) (2 diffs)
-
default_multisite_settings.py (modified) (1 diff)
-
tests.py (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
cyclope/core/multisite/threadlocals.py
r596 r597 23 23 # http://github.com/shestera/django-multisite 24 24 25 import inspect 25 26 from threading import local 26 27 27 28 _thread_locals = local() 28 29 30 _dont_override = set(['__repr__', '__getattribute__', '__new__', 31 '__init__', '__setitem__']) 32 33 class _None(object): 34 pass 35 29 36 class DynamicSetting(object): 30 def __init__(self, setting_name, *args): 31 # the name of the setting whose value we will hold in _thread_locals 37 def __init__(self, setting_name, value_or_type): 38 value, type_ = _None, None 39 if isinstance(value_or_type, type): 40 type_ = value_or_type 41 else: 42 type_ = type(value_or_type) 43 value = value_or_type 44 45 self.__class__ = type('DS%s' % repr(type_), (self.__class__, object), {}) 46 32 47 self.setting_name = setting_name 33 if len(args) > 1: 34 raise TypeError("DynamicSetting only supports one value") 35 elif len(args) == 1: 36 self.set(args[0]) 48 if value is not _None: 49 self.set(value) 50 51 methods = set() 52 for name, attr in type_.__dict__.iteritems(): 53 if inspect.ismethod(attr) or inspect.ismethoddescriptor(attr): 54 methods.add(name) 55 methods_to_override = methods - _dont_override 56 57 def method(self, *args, **kwargs): 58 return getattr(self.get_value(), name) 59 60 for name in methods_to_override: 61 def method(self, *args, **kwargs): 62 print name, args, kwargs 63 return type_.__dict__[name](*args, **kwargs) 64 65 def outer(name, *args, **kwargs): 66 def inner(self, *args, **kwargs): 67 return getattr(self.get_value(), name)(*args, **kwargs) 68 return inner 69 setattr(self.__class__, name, outer(name)) 37 70 38 71 def set(self, value): … … 54 87 return getattr(_thread_locals, self.setting_name, None) 55 88 56 def __getitem__(self, attr):57 return self.get_value().__getitem__(attr)58 59 def __setitem__(self, attr, value):60 raise NotImplemented61 62 def __getattribute__(self, attr):63 if attr == 'setting_name':64 return super(DynamicSetting, self).__getattribute__(attr)65 66 current = getattr(_thread_locals, self.setting_name, None)67 if hasattr(current, attr):68 return getattr(current, attr)69 else:70 return super(DynamicSetting, self).__getattribute__(attr)71 72 def __unicode__(self):73 return unicode(self.get_value())74 75 def __str__(self):76 return str(self.get_value())77 78 def __repr__(self):79 return "<DynamicSetting: %s>" % repr(self.get_value())80 81 def __float__(self):82 return float(self.get_value())83 84 89 def __nonzero__(self): 85 90 return bool(self.get_value()) 86 91 92 def __setitem__(self, attr, value): 93 raise NotImplementedError 87 94 95 def __repr__(self): 96 val = self.get_value() 97 return "<DynamicSetting: %s>" % repr(val) 88 98 89 99 class RequestHostHook(object): -
cyclope/default_multisite_settings.py
r596 r597 42 42 43 43 44 CYCLOPE_PAGINATION = DynamicSetting('CYCLOPE_PAGINATION' )44 CYCLOPE_PAGINATION = DynamicSetting('CYCLOPE_PAGINATION', dict) -
cyclope/tests.py
r596 r597 629 629 630 630 class DynamicSettingTestCase(TestCase): 631 def setUp(self):632 self.ds = DynamicSetting("SETTING")633 631 634 632 def test_api(self): 635 ds = DynamicSetting("SETTING_A")636 633 ds = DynamicSetting("SETTING_A", 1) 637 634 self.assertEqual(int(ds), 1) … … 639 636 def test_int(self): 640 637 integer = 3 641 self.ds.set(integer) 642 self.assertEqual(int(self.ds), integer) 643 self.assertEqual(str(self.ds), str(integer)) 638 ds = DynamicSetting("SETTING", integer) 639 self.assertEqual(int(ds), integer) 640 self.assertEqual(str(ds), str(integer)) 641 self.assertEqual(ds * 5, integer * 5) 642 self.assertEqual(5 * ds, integer * 5) 643 self.assertEqual(float(ds), float(integer)) 644 self.assertEqual(ds/2, integer/2) 644 645 645 646 def test_str(self): 646 self.ds.set("foo") 647 self.assertEqual(str(self.ds), "foo") 647 ds = DynamicSetting("SETTING", "foo") 648 self.assertEqual(str(ds), "foo") 649 self.assertEqual(ds + "bar", "foobar") 648 650 649 651 def test_dict(self): 650 652 d = {"foo": "bar"} 651 self.ds.set(d) 652 self.assertEqual(str(self.ds["foo"]), "bar") 653 ds = DynamicSetting("SETTING", d) 654 655 self.assertEqual(str(ds["foo"]), "bar") 653 656 654 657 # Test override the entire dict 655 local_cache = self.ds["foo"]658 local_cache = ds["foo"] 656 659 self.assertEqual(str(local_cache), "bar") 657 660 658 self.ds.set({"foo": "baz"})661 ds.set({"foo": "baz"}) 659 662 self.assertEqual(str(local_cache), "baz") 660 663 661 664 def test_tuple(self): 662 self.ds.set(("a", "b"))663 self.assertEqual(str( self.ds[0]), "a")664 self.assertEqual(str( self.ds[1]), "b")665 666 self.ds.set(("c", "d"))667 self.assertEqual(str( self.ds[0]), "c")668 self.assertEqual(str( self.ds[1]), "d")669 670 self.ds.set(("a", "b"))671 local_cache = self.ds[0]672 self.ds.set(("c", "d"))665 ds = DynamicSetting("SETTING", ("a", "b")) 666 self.assertEqual(str(ds[0]), "a") 667 self.assertEqual(str(ds[1]), "b") 668 669 ds.set(("c", "d")) 670 self.assertEqual(str(ds[0]), "c") 671 self.assertEqual(str(ds[1]), "d") 672 673 ds.set(("a", "b")) 674 local_cache = ds[0] 675 ds.set(("c", "d")) 673 676 self.assertEqual(str(local_cache), "c") 674 677 675 678 # slice 676 self.ds.set(("a", "b", "c"))677 self.assertEqual(str( self.ds[:2][0]), "a")679 ds.set(("a", "b", "c")) 680 self.assertEqual(str(ds[:2][0]), "a") 678 681 679 682 def test_recursive_tuple(self): 680 self.ds.set((("foo",), ("bar", )))681 first_elem = self.ds[0]683 ds = DynamicSetting("SETTING", (("foo",), ("bar", ))) 684 first_elem = ds[0] 682 685 self.assertEqual(str(first_elem[0]), "foo") 683 686 … … 686 689 687 690 def test_bool(self): 688 self.ds.set(True)689 self.assertTrue(bool( self.ds) is True)690 691 self.ds.set(False)692 self.assertTrue(bool( self.ds) is False)691 ds = DynamicSetting("SETTING", True) 692 self.assertTrue(bool(ds) is True) 693 694 ds.set(False) 695 self.assertTrue(bool(ds) is False) 693 696 694 697 def test_repr(self): 695 698 d = 5 696 self.ds.set(d)697 self.assertEqual(repr( self.ds), "<DynamicSetting: %s>" % repr(d))699 ds = DynamicSetting("SETTING", d) 700 self.assertEqual(repr(ds), "<DynamicSetting: %s>" % repr(d)) 698 701 699 702 def test_float(self): 700 self.ds.set(1.0)701 self.assertEqual(float( self.ds), 1.0)703 ds = DynamicSetting("SETTING", 1.0) 704 self.assertEqual(float(ds), 1.0) 702 705 703 706 def test_none(self): 704 self.ds.set(None)707 ds = DynamicSetting("SETTING", None) 705 708 self.assertTrue() 706 709
Note: See TracChangeset
for help on using the changeset viewer.

