Code Monkey home page Code Monkey logo

Comments (6)

defnull avatar defnull commented on May 11, 2024

yieldroutes() is only called when you don't specify a route path and bottle has to guess the route based on the callback signature (name, args). The slash behavior has nothing to do with that. It is a default for all route wildcards to not match or consume the slash character. To be precise, the regular expression for a wildcard defaults to [^/]+.

If the parentheses in your example are meant to be part of the URL, your example should work as expected. If not, it won't work because regular expressions outside of wildcard tokens are escaped. The parentheses are then interpreted as part of the URL. Optional keys are supported using multiple routes or more specific regular expressions. Is your :collection wildcard limited in some way? If not, how do I know where :collection ends and :key starts?

from bottle.

sgala avatar sgala commented on May 11, 2024

This patch:

diff --git a/bottle.py b/bottle.py
index 4f9bfe6..a5a3397 100755
--- a/bottle.py
+++ b/bottle.py
@@ -232,7 +232,7 @@ class Route(object):

     def flat_re(self):
         ''' Return a regexp pattern with non-grouping parentheses '''
-        return re.sub(r'\(\?P<[^>]*>|\((?!\?)', '(?:', self.group_re())
+        return re.sub(r'\(\?P<[^>]*>', '(?:', self.group_re())

     def format_str(self):
         ''' Return a format string with named fields. '''

makes bottle run here with the simple:

>>> path = '/col/:test#[^\(]+#(:name#[^,]+#,:type#[^\)]+#)'
>>> @bottle.route(path)
... def hello(test,name,type):
...     return ["/",test,"(",name,",",type,")"]
... 
>>> bottle.run()

without failing tests... now, I'm not sure what the regexp this patch kills means, or what it might be useful for... It might just be a problem of the past, or else it might be important in some edge case.

from bottle.

defnull avatar defnull commented on May 11, 2024

OK, I tested the example with bottle.Route.group_re() directly (that worked) and not with bottle.Routes().add() which invokes bottle.Route.flat_re() and indeed did not work. This is a bug.

The bottle.Route.flat_re() method should return a regular pattern that equals the one returned by bottle.Route.group_re() but with all named and numbered groups replaced by non-grouping parenthesis. The pattern used to detect the parenthesis seems to match the [^\(]+ part, which it shouldn't. A negative look-behind should fix this.

from bottle.

sgala avatar sgala commented on May 11, 2024

Are you sure the alternate part of flat_re is needed? I see anon parts already as non grouping in group_re...

from bottle.

defnull avatar defnull commented on May 11, 2024

Yes. The route /some/:key#(a|b)# for example adds a group to the regular pattern that needs to be replaced with (?:a|b) in flat_re().

from bottle.

defnull avatar defnull commented on May 11, 2024

Strange, somehow my latest comment disappeared. I found a solution for all three cases (parentheses in paths, parentheses in regexp and escaped parentheses in regexp): dd4fc5b

from bottle.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.