Exemplo n.º 1
0
 def translate(self):
     if self.offset: raise RuntimeError('Parser is a one time instance.')
     while True:
         m = self.re_split.search(self.source[self.offset:])
         if m:
             text = self.source[self.offset:self.offset + m.start()]
             self.text_buffer.append(text)
             self.offset += m.end()
             if m.group(1):  # New escape syntax
                 line, sep, _ = self.source[self.offset:].partition('\n')
                 self.text_buffer.append(
                     m.group(2) + m.group(5) + line + sep)
                 self.offset += len(line + sep) + 1
                 continue
             elif m.group(5):  # Old escape syntax
                 depr('Escape code lines with a backslash.')  #0.12
                 line, sep, _ = self.source[self.offset:].partition('\n')
                 self.text_buffer.append(m.group(2) + line + sep)
                 self.offset += len(line + sep) + 1
                 continue
             self.flush_text()
             self.read_code(multiline=bool(m.group(4)))
         else:
             break
     self.text_buffer.append(self.source[self.offset:])
     self.flush_text()
     return ''.join(self.code_buffer)
Exemplo n.º 2
0
 def _include(self, _env, _name=None, **kwargs):
     if _name is None:
         depr('Rebase function called without arguments.'
              ' You were probably looking for {{base}}?', True)  #0.12
     env = _env.copy()
     env.update(kwargs)
     if _name not in self.cache:
         self.cache[_name] = self.__class__(name=_name, lookup=self.lookup)
     return self.cache[_name].execute(env['_stdout'], env)
Exemplo n.º 3
0
 def _context(self):
     depr('Switch to Plugin API v2 and access the Route object directly.'
          )  #0.12
     return dict(rule=self.rule,
                 method=self.method,
                 callback=self.callback,
                 name=self.name,
                 app=self.app,
                 config=self.config,
                 apply=self.plugins,
                 skip=self.skiplist)
Exemplo n.º 4
0
 def code(self):
     source = self.source
     if not source:
         with open(self.filename, 'rb') as f:
             source = f.read()
     try:
         source, encoding = touni(source), 'utf8'
     except UnicodeError:
         depr('Template encodings other than utf8 are no longer supported.'
              )  #0.11
         source, encoding = touni(source, 'latin1'), 'latin1'
     parser = StplParser(source, encoding=encoding, syntax=self.syntax)
     code = parser.translate()
     self.encoding = parser.encoding
     return code
Exemplo n.º 5
0
 def run(self, handler):
     from gevent import pywsgi, local
     if not isinstance(threading.local(), local.local):
         msg = "Bottle requires gevent.monkey.patch_all() (before import)"
         raise RuntimeError(msg)
     if self.options.pop('fast', None):
         depr(
             'The "fast" option has been deprecated and removed by Gevent.')
     if self.quiet:
         self.options['log'] = None
     address = (self.host, self.port)
     server = pywsgi.WSGIServer(address, handler, **self.options)
     if 'BOTTLE_CHILD' in os.environ:
         import signal
         signal.signal(signal.SIGINT, lambda s, f: server.stop())
     server.serve_forever()
Exemplo n.º 6
0
    def mount(self, prefix, app, **options):
        ''' Mount an application (:class:`Bottle` or plain WSGI) to a specific
            URL prefix. Example::

                root_app.mount('/admin/', admin_app)

            :param prefix: path prefix or `mount-point`. If it ends in a slash,
                that slash is mandatory.
            :param app: an instance of :class:`Bottle` or a WSGI application.

            All other parameters are passed to the underlying :meth:`route` call.
        '''
        if isinstance(app, basestring):
            depr('Parameter order of Bottle.mount() changed.', True) # 0.10

        segments = [p for p in prefix.split('/') if p]
        if not segments: raise ValueError('Empty path prefix.')
        path_depth = len(segments)

        def mountpoint_wrapper():
            try:
                request.path_shift(path_depth)
                rs = HTTPResponse([])
                def start_response(status, headerlist, exc_info=None):
                    if exc_info:
                        try:
                            _raise(*exc_info)
                        finally:
                            exc_info = None
                    rs.status = status
                    for name, value in headerlist: rs.add_header(name, value)
                    return rs.body.append
                body = app(request.environ, start_response)
                if body and rs.body: body = itertools.chain(rs.body, body)
                rs.body = body or rs.body
                return rs
            finally:
                request.path_shift(-path_depth)

        options.setdefault('skip', True)
        options.setdefault('method', 'PROXY')
        options.setdefault('mountpoint', {'prefix': prefix, 'target': app})
        options['callback'] = mountpoint_wrapper

        self.route('/%s/<:re:.*>' % '/'.join(segments), **options)
        if not prefix.endswith('/'):
            self.route('/' + '/'.join(segments), **options)
Exemplo n.º 7
0
def local_property(name=None):
    if name: depr('local_property() is deprecated and will be removed.')  #0.12
    ls = threading.local()

    def fget(self):
        try:
            return ls.var
        except AttributeError:
            raise RuntimeError("Request context not initialized.")

    def fset(self, value):
        ls.var = value

    def fdel(self):
        del ls.var

    return property(fget, fset, fdel, 'Thread-local property')
Exemplo n.º 8
0
 def fix_backward_compatibility(self, line, comment):
     parts = line.strip().split(None, 2)
     if parts and parts[0] in ('include', 'rebase'):
         depr('The include and rebase keywords are functions now.')  #0.12
         if len(parts) == 1: return "_printlist([base])", comment
         elif len(parts) == 2: return "_=%s(%r)" % tuple(parts), comment
         else: return "_=%s(%r, %s)" % tuple(parts), comment
     if self.lineno <= 2 and not line.strip() and 'coding' in comment:
         m = re.match(r"#.*coding[:=]\s*([-\w.]+)", comment)
         if m:
             depr('PEP263 encoding strings in templates are deprecated.'
                  )  #0.12
             enc = m.group(1)
             self.source = self.source.encode(self.encoding).decode(enc)
             self.encoding = enc
             return line, comment.replace('coding', 'coding*')
     return line, comment
Exemplo n.º 9
0
    def search(cls, name, lookup=[]):
        """ Search name in all directories specified in lookup.
        First without, then with common extensions. Return first hit. """
        if not lookup:
            depr('The template lookup path list should not be empty.')  #0.12
            lookup = ['.']

        if os.path.isabs(name) and os.path.isfile(name):
            depr('Absolute template path names are deprecated.')  #0.12
            return os.path.abspath(name)

        for spath in lookup:
            spath = os.path.abspath(spath) + os.sep
            fname = os.path.abspath(os.path.join(spath, name))
            if not fname.startswith(spath): continue
            if os.path.isfile(fname): return fname
            for ext in cls.extensions:
                if os.path.isfile('%s.%s' % (fname, ext)):
                    return '%s.%s' % (fname, ext)
Exemplo n.º 10
0
 def __call__(self, *a, **ka):
     depr("Some APIs changed to return Route() instances instead of"\
          " callables. Make sure to use the Route.call method and not to"\
          " call Route instances directly.") #0.12
     return self.call(*a, **ka)
Exemplo n.º 11
0
 def _rebase(self, _env, _name=None, **kwargs):
     if _name is None:
         depr('Rebase function called without arguments.'
              ' You were probably looking for {{base}}?', True)  #0.12
     _env['_rebase'] = (_name, kwargs)