Changeset 597:db9ac6dc904f


Ignore:
Timestamp:
18/05/12 20:56:52 (12 months ago)
Author:
Santiago Piccinini (SAn) <piccinini.santiago@…>
Branch:
multisite
Message:

DynamicSettings? now support all methods of its value

Location:
cyclope
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • cyclope/core/multisite/threadlocals.py

    r596 r597  
    2323# http://github.com/shestera/django-multisite 
    2424 
     25import inspect 
    2526from threading import local 
    2627 
    2728_thread_locals = local() 
    2829 
     30_dont_override = set(['__repr__', '__getattribute__', '__new__', 
     31                      '__init__', '__setitem__']) 
     32 
     33class _None(object): 
     34    pass 
     35 
    2936class 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 
    3247        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)) 
    3770 
    3871    def set(self, value): 
     
    5487        return getattr(_thread_locals, self.setting_name, None) 
    5588 
    56     def __getitem__(self, attr): 
    57         return self.get_value().__getitem__(attr) 
    58  
    59     def __setitem__(self, attr, value): 
    60         raise NotImplemented 
    61  
    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  
    8489    def __nonzero__(self): 
    8590        return bool(self.get_value()) 
    8691 
     92    def __setitem__(self, attr, value): 
     93        raise NotImplementedError 
    8794 
     95    def __repr__(self): 
     96        val = self.get_value() 
     97        return "<DynamicSetting: %s>" % repr(val) 
    8898 
    8999class RequestHostHook(object): 
  • cyclope/default_multisite_settings.py

    r596 r597  
    4242 
    4343 
    44 CYCLOPE_PAGINATION = DynamicSetting('CYCLOPE_PAGINATION') 
     44CYCLOPE_PAGINATION = DynamicSetting('CYCLOPE_PAGINATION', dict) 
  • cyclope/tests.py

    r596 r597  
    629629 
    630630class DynamicSettingTestCase(TestCase): 
    631     def setUp(self): 
    632         self.ds = DynamicSetting("SETTING") 
    633631 
    634632    def test_api(self): 
    635         ds = DynamicSetting("SETTING_A") 
    636633        ds = DynamicSetting("SETTING_A", 1) 
    637634        self.assertEqual(int(ds), 1) 
     
    639636    def test_int(self): 
    640637        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) 
    644645 
    645646    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") 
    648650 
    649651    def test_dict(self): 
    650652        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") 
    653656 
    654657        # Test override the entire dict 
    655         local_cache =  self.ds["foo"] 
     658        local_cache =  ds["foo"] 
    656659        self.assertEqual(str(local_cache), "bar") 
    657660 
    658         self.ds.set({"foo": "baz"}) 
     661        ds.set({"foo": "baz"}) 
    659662        self.assertEqual(str(local_cache), "baz") 
    660663 
    661664    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")) 
    673676        self.assertEqual(str(local_cache), "c") 
    674677 
    675678        # 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") 
    678681 
    679682    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] 
    682685        self.assertEqual(str(first_elem[0]), "foo") 
    683686 
     
    686689 
    687690    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) 
    693696 
    694697    def test_repr(self): 
    695698        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)) 
    698701 
    699702    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) 
    702705 
    703706    def test_none(self): 
    704         self.ds.set(None) 
     707        ds = DynamicSetting("SETTING", None) 
    705708        self.assertTrue() 
    706709 
Note: See TracChangeset for help on using the changeset viewer.