Changeset - 9452b5a8e06f
[Not reviewed]
default
0 1 0
Mads Kiilerich - 9 years ago 2016-09-06 00:51:18
madski@unity3d.com
celery: refactor config loader

* implement __contains__ - is needed by Celery 3
* less exception juggling - follow the flow and let __getitem__ be simple and low level

TODO: Drop the name mangling and just use the real names for the settings.
1 file changed with 26 insertions and 19 deletions:
0 comments (0 inline, 0 general)
kallithea/lib/celerypylons/loader.py
Show inline comments
 
# -*- coding: utf-8 -*-
 

	
 
from celery.loaders.base import BaseLoader
 
from pylons import config
 

	
 
# TODO: drop this mangling and just use a separate celery config section
 
to_pylons = lambda x: x.replace('_', '.').lower()
 
to_celery = lambda x: x.replace('.', '_').upper()
 

	
 
LIST_PARAMS = """CELERY_IMPORTS ADMINS ROUTES""".split()
 

	
 

	
 
class PylonsSettingsProxy(object):
 
    """Pylons Settings Proxy
 

	
 
    Proxies settings from pylons.config
 
    Make settings from pylons.config appear the way Celery expects them.
 
    """
 

	
 
    def __getattr__(self, key):
 
        try:
 
            return self[key]
 
        except KeyError:
 
            raise AttributeError(key)
 

	
 
    """
 
    def __getattr__(self, key):
 
    def get(self, key, default=None):
 
        try:
 
            return self[key]
 
        except KeyError:
 
            return default
 

	
 
    def __getitem__(self, key):
 
        pylons_key = to_pylons(key)
 
        value = config[pylons_key]
 
        if key in LIST_PARAMS:
 
            return value.split()
 
        return self.type_converter(value)
 

	
 
    def __contains__(self, key):
 
        pylons_key = to_pylons(key)
 
        try:
 
            value = config[pylons_key]
 
            if key in LIST_PARAMS:return value.split()
 
            return self.type_converter(value)
 
            config[pylons_key]
 
        except KeyError:
 
            raise AttributeError(pylons_key)
 

	
 
    def get(self, key):
 
        try:
 
            return self.__getattr__(key)
 
        except AttributeError:
 
            return None
 

	
 
    def __getitem__(self, key):
 
        try:
 
            return self.__getattr__(key)
 
        except AttributeError:
 
            raise KeyError()
 
            return False
 
        return True
 

	
 
    def __setattr__(self, key, value):
 
        pylons_key = to_pylons(key)
 
        config[pylons_key] = value
 

	
 
    def __setitem__(self, key, value):
 
        self.__setattr__(key, value)
 

	
 
    def type_converter(self, value):
 
        #cast to int
 
        if value.isdigit():
 
            return int(value)
 

	
 
        #cast to bool
 
        if value.lower() in ['true', 'false']:
 
            return value.lower() == 'true'
 
        return value
 

	
 
class PylonsLoader(BaseLoader):
 
    """Pylons celery loader
 

	
 
    Maps the celery config onto pylons.config
 

	
 
    """
 
    def read_configuration(self):
 
        self.configured = True
 
        return PylonsSettingsProxy()
 

	
 
    def on_worker_init(self):
 
        """
 
        Import task modules.
 
        """
 
        self.import_default_modules()
0 comments (0 inline, 0 general)