示例#1
0
文件: hook.py 项目: Natim/redbarrel
 def _execute_resp_body(self, response, rule, request, globs):
     if rule.type == 'check_type':
         self._check_type(rule.value, response.body, rule[2])
     elif rule.type == 'alter':
         alterator = resolve_runner(rule.value)
         response.body = alterator(globs, request, response.body)
     else:
         raise NotImplementedError(str(rule))
 def _execute_resp_body(self, response, rule, request, globs):
     if rule.type == 'check_type':
         self._check_type(rule.value, response.body, rule[2])
     elif rule.type == 'alter':
         alterator = resolve_runner(rule.value)
         response.body = alterator(globs, request, response.body)
     else:
         raise NotImplementedError(str(rule))
    def _resolve_def(self, value, *args, **kw):
        if not isinstance(value, str):
            return value
        prefixed = value.split(':', 1)
        if prefixed[0] not in get_runner_names():
            return value

        res = resolve_runner(value, self.root)(*args, **kw)

        if value == res:
            raise ImportError(value)
        else:
            value = res
        return value
示例#4
0
文件: hook.py 项目: Natim/redbarrel
    def _execute_req_headers(self, request, rule, globs):
        if rule[0] == 'validates_with':
            header = rule[1]
            validator = resolve_runner(rule[2])
            code = rule[3]

            def _failed(e):
                err = HTTPError()
                err.status_int = code
                body = StringIO()
                pprint(str(e), body)
                body.seek(0)
                err.body = body.read()
                raise err

            value = request.headers.get(header)
            try:
                validator(globs, request, value)
            except Exception, e:
                _failed(e)
    def _execute_req_headers(self, request, rule, globs):
        if rule[0] == 'validates_with':
            header = rule[1]
            validator = resolve_runner(rule[2])
            code = rule[3]

            def _failed(e):
                err = HTTPError()
                err.status_int = code
                body = StringIO()
                pprint(str(e), body)
                body.seek(0)
                err.body = body.read()
                raise err

            value = request.headers.get(header)
            try:
                validator(globs, request, value)
            except Exception, e:
                _failed(e)
示例#6
0
文件: util.py 项目: Natim/redbarrel
 def _ds(func):
     doc = resolve_runner(func).__doc__
     if doc is None:
         return func
     return '%r (%s)' % (func, doc)
示例#7
0
文件: util.py 项目: Natim/redbarrel
def _run_server(args):
    logger.info("Serving on port %d..." % args.port)

    # loading the rbr to get the workers/arbiters
    from redbarrel.dsl import build_ast
    from redbarrel.dsl.runners import resolve_runner

    workers = {}
    arbiters = {}

    for path in args.path:
        with open(path) as f:
            ast = build_ast(f.read())

        for definition in ast:
            type_ = definition.type
            if type_ not in ('worker', 'arbiter'):
                continue

            name = definition[1]
            logger.info('Loading %s %r' % (type_, name))
            runner = resolve_runner(definition[2])
            if type_ == 'worker':
                workers[name] = runner
            else:
                arbiters[name] = runner

    # default arbiters and workers
    from redbarrel.server.arbiters import ARBITERS
    arbiters.update(ARBITERS)

    from redbarrel.server.workers import WORKERS
    workers.update(WORKERS)

    # now loading the workers and arbiters, given a config
    specs = []
    from pistil.arbiter import Arbiter

    conf = {"address": ("127.0.0.1", args.port),
            "debug": True,
            "memory": True,
            "num_workers": 1,  #args.workers,
            "path": args.path,
            "timeout": 9000  # XXXX
            }

    for name, num in args.workers:
        # is it an arbiter or a worker ?
        if name in arbiters:
            klass = arbiters[name]
            type_ = 'supervisor'
        elif name in workers:
            klass = workers[name]
            type_ = 'worker'
        else:
            raise ValueError(name)

        timeout = 90000  # XXX to be defined
        specs.append((klass, timeout, type_, {}, name))
        # XXX conf ?
        #

    arbiter = Arbiter(conf, specs)
    arbiter.run()
 def _ds(func):
     doc = resolve_runner(func).__doc__
     if doc is None:
         return func
     return '%r (%s)' % (func, doc)
def _run_server(args):
    logger.info("Serving on port %d..." % args.port)

    # loading the rbr to get the workers/arbiters
    from redbarrel.dsl import build_ast
    from redbarrel.dsl.runners import resolve_runner

    workers = {}
    arbiters = {}

    for path in args.path:
        with open(path) as f:
            ast = build_ast(f.read())

        for definition in ast:
            type_ = definition.type
            if type_ not in ('worker', 'arbiter'):
                continue

            name = definition[1]
            logger.info('Loading %s %r' % (type_, name))
            runner = resolve_runner(definition[2])
            if type_ == 'worker':
                workers[name] = runner
            else:
                arbiters[name] = runner

    # default arbiters and workers
    from redbarrel.server.arbiters import ARBITERS
    arbiters.update(ARBITERS)

    from redbarrel.server.workers import WORKERS
    workers.update(WORKERS)

    # now loading the workers and arbiters, given a config
    specs = []
    from pistil.arbiter import Arbiter

    conf = {
        "address": ("127.0.0.1", args.port),
        "debug": True,
        "memory": True,
        "num_workers": 1,  #args.workers,
        "path": args.path,
        "timeout": 9000  # XXXX
    }

    for name, num in args.workers:
        # is it an arbiter or a worker ?
        if name in arbiters:
            klass = arbiters[name]
            type_ = 'supervisor'
        elif name in workers:
            klass = workers[name]
            type_ = 'worker'
        else:
            raise ValueError(name)

        timeout = 90000  # XXX to be defined
        specs.append((klass, timeout, type_, {}, name))
        # XXX conf ?
        #

    arbiter = Arbiter(conf, specs)
    arbiter.run()
示例#10
0
文件: mapper.py 项目: Natim/redbarrel
    def add(self, name, args):
        if name in self._hooks:
            raise NameError("%r already defined." % name)

        params = {}
        for arg in args:
            if arg.type == "assign":
                left = arg.left
                right = arg.right
                if isinstance(left, basestring):  # XXX meh
                    params[left] = right
                else:
                    name_ = left.value
                    if isinstance(right, list):
                        params[name_] = arg.right
                    else:
                        params[name_] = arg.right.value
            else:
                raise NotImplementedError(arg)

        use = params.get("use", "redbarrel.util.dummy")

        if "url" in params:
            url = params.get("url", "/")
            if self.root_path:
                if url != "/":
                    url = self.root_path + url
                else:
                    url = self.root_path

            try:
                function = resolve_runner(use, self.root, url)
            except ImportError:
                # let's try in the context
                # # XXX ugly, need isolation
                function = None

                for lib in self.context.libraries:
                    for callable in lib.dir():
                        name_ = "%s.%s" % (lib.name, callable)
                        if name_ == use:
                            function = lib.namespace[callable]
                            break

                if function is None:
                    logger.info(" => Error on %r" % name)
                    raise

            params["func"] = function

            conditions = {}
            oldname = name
            params["name"] = name

            if "method" in params:
                conditions["method"] = [str(method) for method in params["method"]]
                self.mapper.connect(None, url, action=name, conditions=conditions)

            self._hooks[name] = WebHook(params, self.types)
            logger.info(" => %r hooked for %r" % (oldname, url))

        else:
            logger.info(" => %r incomplete, ignoring" % name)
    def add(self, name, args):
        if name in self._hooks:
            raise NameError('%r already defined.' % name)

        params = {}
        for arg in args:
            if arg.type == 'assign':
                left = arg.left
                right = arg.right
                if isinstance(left, basestring):    # XXX meh
                    params[left] = right
                else:
                    name_ = left.value
                    if isinstance(right, list):
                        params[name_] = arg.right
                    else:
                        params[name_] = arg.right.value
            else:
                raise NotImplementedError(arg)

        use = params.get('use', 'redbarrel.util.dummy')

        if 'url' in params:
            url = params.get('url', '/')
            if self.root_path:
                if url != '/':
                    url = self.root_path + url
                else:
                    url = self.root_path

            try:
                function = resolve_runner(use, self.root, url)
            except ImportError:
                # let's try in the context
                # # XXX ugly, need isolation
                function = None

                for lib in self.context.libraries:
                    for callable in lib.dir():
                        name_ = '%s.%s' % (lib.name, callable)
                        if name_ == use:
                            function = lib.namespace[callable]
                            break

                if function is None:
                    logger.info(" => Error on %r" % name)
                    raise

            params['func'] = function

            conditions = {}
            oldname = name
            params['name'] = name


            if 'method' in params:
                conditions['method'] = [str(method)
                            for method in params['method']]
                self.mapper.connect(None, url, action=name,
                                    conditions=conditions)

            self._hooks[name] = WebHook(params, self.types)
            logger.info(" => %r hooked for %r" % (oldname, url))

        else:
            logger.info(" => %r incomplete, ignoring" % name)