From 088c170c114f2ada971d4db3f0e9c39d298b81b9 Mon Sep 17 00:00:00 2001 From: tobes Date: Wed, 1 Aug 2012 22:58:49 +0100 Subject: [PATCH 1/8] Quick fix for deprecated --- ckan/lib/maintain.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ckan/lib/maintain.py b/ckan/lib/maintain.py index 0ded0e72edf..77aa3b8f66b 100644 --- a/ckan/lib/maintain.py +++ b/ckan/lib/maintain.py @@ -64,7 +64,9 @@ def deprecate_context_item(item_name, message=''): def get_item(self): log.warning('c.%s has been deprecated. %s', item_name, message) - return getattr(c._current_obj(), item_name) + return getattr(c.__ckan_deprecated__, item_name) - setattr(c.__class__, item_name, property(get_item)) + c.__ckan_deprecated__ = c.__ckan_deprecated__ or {} + c.__ckan_deprecated__[item_name] = getattr(c, item_name) + setattr(c, item_name, property(get_item)) From fa0601bbf67f9571a4cc18622dd2251f203682a8 Mon Sep 17 00:00:00 2001 From: tobes Date: Wed, 1 Aug 2012 23:59:07 +0100 Subject: [PATCH 2/8] Proper fix of deprecated_context_item --- ckan/lib/maintain.py | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/ckan/lib/maintain.py b/ckan/lib/maintain.py index 77aa3b8f66b..7c54f32fcf8 100644 --- a/ckan/lib/maintain.py +++ b/ckan/lib/maintain.py @@ -62,11 +62,28 @@ def deprecate_context_item(item_name, message=''): # prevent a circular import from ckan.lib.base import c - def get_item(self): - log.warning('c.%s has been deprecated. %s', item_name, message) - return getattr(c.__ckan_deprecated__, item_name) - - c.__ckan_deprecated__ = c.__ckan_deprecated__ or {} - c.__ckan_deprecated__[item_name] = getattr(c, item_name) - setattr(c, item_name, property(get_item)) + class Fake(object): + def __init__(self, obj): + self._obj = obj + def __getattribute__(self,name): + obj = object.__getattribute__(self, '_obj') + if name == '_obj': + return obj + return getattr(obj, name) + + + # store the value in a fake object + setattr(c, item_name, Fake(getattr(c, item_name))) + + # we need to store the origional __getattr__ and replace with our own one + if not hasattr(c.__class__, '__old_getattr__'): + def fake_attr(self, name): + obj = self.__class__.__dict__['__old_getattr__'](self, name) + if isinstance(obj, Fake): + return obj._obj + else: + return obj + get_attr = getattr(c.__class__, '__getattr__') + setattr(c.__class__, '__old_getattr__', get_attr) + setattr(c.__class__, '__getattr__', fake_attr) From 489717f0d20d22455d9fb6d701f8b1280bf614d2 Mon Sep 17 00:00:00 2001 From: tobes Date: Thu, 2 Aug 2012 00:03:19 +0100 Subject: [PATCH 3/8] some documentation --- ckan/lib/maintain.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ckan/lib/maintain.py b/ckan/lib/maintain.py index 7c54f32fcf8..082b6a267b6 100644 --- a/ckan/lib/maintain.py +++ b/ckan/lib/maintain.py @@ -63,10 +63,13 @@ def deprecate_context_item(item_name, message=''): from ckan.lib.base import c class Fake(object): + ''' This is a fake object that calls the methods of the object + contained. ''' def __init__(self, obj): self._obj = obj def __getattribute__(self,name): obj = object.__getattribute__(self, '_obj') + # hack to get the actual object when needed if name == '_obj': return obj return getattr(obj, name) From b28adbfcae582fcc1687c1421cd1ebe77c622202 Mon Sep 17 00:00:00 2001 From: tobes Date: Thu, 2 Aug 2012 00:21:36 +0100 Subject: [PATCH 4/8] Add the warning again --- ckan/lib/maintain.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ckan/lib/maintain.py b/ckan/lib/maintain.py index 082b6a267b6..9101e637b18 100644 --- a/ckan/lib/maintain.py +++ b/ckan/lib/maintain.py @@ -68,6 +68,7 @@ class Fake(object): def __init__(self, obj): self._obj = obj def __getattribute__(self,name): + log.warning('c.%s has been deprecated. %s', item_name, message) obj = object.__getattribute__(self, '_obj') # hack to get the actual object when needed if name == '_obj': From f908c6b8643b4e3ad14cd8e04084737fec0db014 Mon Sep 17 00:00:00 2001 From: tobes Date: Thu, 2 Aug 2012 08:51:22 +0100 Subject: [PATCH 5/8] Store the message plus better names --- ckan/lib/maintain.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/ckan/lib/maintain.py b/ckan/lib/maintain.py index 9101e637b18..efaafe45018 100644 --- a/ckan/lib/maintain.py +++ b/ckan/lib/maintain.py @@ -62,29 +62,31 @@ def deprecate_context_item(item_name, message=''): # prevent a circular import from ckan.lib.base import c - class Fake(object): + class WrappedContextItem(object): ''' This is a fake object that calls the methods of the object contained. ''' - def __init__(self, obj): - self._obj = obj - def __getattribute__(self,name): + def __init__(self, obj, message): + self._ckan_obj = obj + self._ckan_message = message + def __getattribute__(self, name): + message = object.__getattribute__(self, '_ckan_message') log.warning('c.%s has been deprecated. %s', item_name, message) - obj = object.__getattribute__(self, '_obj') + obj = object.__getattribute__(self, '_ckan_obj') # hack to get the actual object when needed - if name == '_obj': + if name == '_ckan_obj': return obj return getattr(obj, name) # store the value in a fake object - setattr(c, item_name, Fake(getattr(c, item_name))) + setattr(c, item_name, WrappedContextItem(getattr(c, item_name), message)) # we need to store the origional __getattr__ and replace with our own one if not hasattr(c.__class__, '__old_getattr__'): def fake_attr(self, name): obj = self.__class__.__dict__['__old_getattr__'](self, name) - if isinstance(obj, Fake): - return obj._obj + if isinstance(obj, WrappedContextItem): + return obj._ckan_obj else: return obj get_attr = getattr(c.__class__, '__getattr__') From 6fe8c57ffc24504d453a2f90f15ce59074426ce6 Mon Sep 17 00:00:00 2001 From: Ian Murray Date: Thu, 2 Aug 2012 12:13:41 +0100 Subject: [PATCH 6/8] Fix the original deprecate_context_item function. --- ckan/lib/maintain.py | 34 +++++----------------------------- 1 file changed, 5 insertions(+), 29 deletions(-) diff --git a/ckan/lib/maintain.py b/ckan/lib/maintain.py index efaafe45018..6920720bf5e 100644 --- a/ckan/lib/maintain.py +++ b/ckan/lib/maintain.py @@ -62,34 +62,10 @@ def deprecate_context_item(item_name, message=''): # prevent a circular import from ckan.lib.base import c - class WrappedContextItem(object): - ''' This is a fake object that calls the methods of the object - contained. ''' - def __init__(self, obj, message): - self._ckan_obj = obj - self._ckan_message = message - def __getattribute__(self, name): - message = object.__getattribute__(self, '_ckan_message') + def get_item(self): + if self == c: log.warning('c.%s has been deprecated. %s', item_name, message) - obj = object.__getattribute__(self, '_ckan_obj') - # hack to get the actual object when needed - if name == '_ckan_obj': - return obj - return getattr(obj, name) - - - # store the value in a fake object - setattr(c, item_name, WrappedContextItem(getattr(c, item_name), message)) - - # we need to store the origional __getattr__ and replace with our own one - if not hasattr(c.__class__, '__old_getattr__'): - def fake_attr(self, name): - obj = self.__class__.__dict__['__old_getattr__'](self, name) - if isinstance(obj, WrappedContextItem): - return obj._ckan_obj - else: - return obj - get_attr = getattr(c.__class__, '__getattr__') - setattr(c.__class__, '__old_getattr__', get_attr) - setattr(c.__class__, '__getattr__', fake_attr) + return getattr(self._current_obj(), item_name) + + setattr(c.__class__, item_name, property(get_item)) From 46ea2590653e0a9d4cc714ecd429532e4753360e Mon Sep 17 00:00:00 2001 From: tobes Date: Tue, 7 Aug 2012 11:48:26 +0100 Subject: [PATCH 7/8] Revert "Fix the original deprecate_context_item function." This reverts commit 3ae477bfa84e62a6bdb5fa4f99e9800c007fb681. thread unsafe --- ckan/lib/maintain.py | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/ckan/lib/maintain.py b/ckan/lib/maintain.py index 6920720bf5e..efaafe45018 100644 --- a/ckan/lib/maintain.py +++ b/ckan/lib/maintain.py @@ -62,10 +62,34 @@ def deprecate_context_item(item_name, message=''): # prevent a circular import from ckan.lib.base import c - def get_item(self): - if self == c: + class WrappedContextItem(object): + ''' This is a fake object that calls the methods of the object + contained. ''' + def __init__(self, obj, message): + self._ckan_obj = obj + self._ckan_message = message + def __getattribute__(self, name): + message = object.__getattribute__(self, '_ckan_message') log.warning('c.%s has been deprecated. %s', item_name, message) - return getattr(self._current_obj(), item_name) - - setattr(c.__class__, item_name, property(get_item)) + obj = object.__getattribute__(self, '_ckan_obj') + # hack to get the actual object when needed + if name == '_ckan_obj': + return obj + return getattr(obj, name) + + + # store the value in a fake object + setattr(c, item_name, WrappedContextItem(getattr(c, item_name), message)) + + # we need to store the origional __getattr__ and replace with our own one + if not hasattr(c.__class__, '__old_getattr__'): + def fake_attr(self, name): + obj = self.__class__.__dict__['__old_getattr__'](self, name) + if isinstance(obj, WrappedContextItem): + return obj._ckan_obj + else: + return obj + get_attr = getattr(c.__class__, '__getattr__') + setattr(c.__class__, '__old_getattr__', get_attr) + setattr(c.__class__, '__getattr__', fake_attr) From 35168a5a3bcb710cb633c7fb1f3f7003312839b0 Mon Sep 17 00:00:00 2001 From: tobes Date: Tue, 7 Aug 2012 12:21:07 +0100 Subject: [PATCH 8/8] Fix up as suggested by kindly --- ckan/lib/maintain.py | 51 ++++++++++++++++++++------------------------ 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/ckan/lib/maintain.py b/ckan/lib/maintain.py index efaafe45018..14c3566b3c2 100644 --- a/ckan/lib/maintain.py +++ b/ckan/lib/maintain.py @@ -62,34 +62,29 @@ def deprecate_context_item(item_name, message=''): # prevent a circular import from ckan.lib.base import c - class WrappedContextItem(object): - ''' This is a fake object that calls the methods of the object - contained. ''' - def __init__(self, obj, message): - self._ckan_obj = obj - self._ckan_message = message - def __getattribute__(self, name): - message = object.__getattribute__(self, '_ckan_message') - log.warning('c.%s has been deprecated. %s', item_name, message) - obj = object.__getattribute__(self, '_ckan_obj') - # hack to get the actual object when needed - if name == '_ckan_obj': - return obj - return getattr(obj, name) - - - # store the value in a fake object - setattr(c, item_name, WrappedContextItem(getattr(c, item_name), message)) # we need to store the origional __getattr__ and replace with our own one if not hasattr(c.__class__, '__old_getattr__'): - def fake_attr(self, name): - obj = self.__class__.__dict__['__old_getattr__'](self, name) - if isinstance(obj, WrappedContextItem): - return obj._ckan_obj - else: - return obj - get_attr = getattr(c.__class__, '__getattr__') - setattr(c.__class__, '__old_getattr__', get_attr) - setattr(c.__class__, '__getattr__', fake_attr) - + def custom__getattr__(self, name): + # get the origional __getattr__ so we can access things + __old_getattr__ = self.__class__.__dict__['__old_getattr__'] + # see if we have a __depricated_properties__ for this name and + # if so log a warning + try: + depricated = __old_getattr__(self, '__depricated_properties__') + if name in depricated: + log.warn(depricated[name]) + except AttributeError: + pass + # return the requested value + return __old_getattr__(self, name) + + # get store the old __getattr__ method and then replace it + __old_getattr__ = getattr(c.__class__, '__getattr__') + setattr(c.__class__, '__old_getattr__', __old_getattr__) + setattr(c.__class__, '__getattr__', custom__getattr__) + + # if c.__depricated_properties__ is not set it returns '' + if not c.__depricated_properties__: + c.__depricated_properties__ = {} + c.__depricated_properties__[item_name] = message