Skip to content

jojosati/classroute

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 

Repository files navigation

classroute
    is a "route" decorator replacement for bottle,
    with ability to wrap whole class definition
    or late binding to a class instance or specfic instance method.

    can safely use @classroute as replacement of @route

classroute can use with function like original route.
classroute can use with class definition.
classroute can use with instance method (late binding).
classroute can use with class instance (late binding).
classroute use bottle's yieldroutes function to generate path,
    with special handling to skip first argument of class instance in the method.
classroute can auto bind to directory path for function/method named 'index'.
classroute support "PathItem" variable "{$root}","{$class}","{$name}",
    "PathItem" variable can use chained property like "{$root.@lower} "

---------------------
classroute example
----------------------
    from classroute import *

    debug() # enable verbose route path binding

    class A(object) :
       def __init__(self,name='World') :
            self.name = name

       def hello(self,name=None) :
           yield 'Hello '
           yield name or self.name

    # bind to "/hello","/hello/<name>"
    @classroute
    class A1(A) :
       pass

    # bind to "/a2/hello","/a2/hello/<name>"
    @classroute('{$class}',['POST','GET'])
    class A2(A) :
       pass

    # bind to "/a/hello","/a/hello/<name>","/aa/hello","/aa/<name>"
    # same as @classroute(['/aa','/a')
    @classroute('/a')
    @classroute('/aa')
    class A3(A):
      pass

    # bind different root with different instance of same class
    # bind to "/john/hello","/john/hello/<name>"
    classroute('john')(A)('john')
    # bind to "/jane/hello","/jane/hello/<name>"
    classroute('jane')(A)('jane')

    #with helper function "mroute" and "skiproute"
    #fine tune for individual method in the class is possible.
    # bind to "/B/hello","/B/hello/<name>","/B/say/hello","/B/say/hello/<name>"
    @classroute('{$class}')
    class B(A):
        @mroute('{$root}/say/hello',['GET','POST'])
        def say__hi(self,name=None) :
              redirect('{$root}/hello/{0}',name or self.name,**self.__routeitems__)

        @skiproute
        def myfunc(self,name='') :
            yield 'myfunc'
            if name :
                yield ' ('+name+')'

    # or use as route replacement, with special meaning of 'index'
    # bind to "/","/index"
    @classroute
    def index() :
        redirect('/hello')

    # create instance, to bind all route definition
    A1()
    A2()
    A3()
    b = B()

    # support for late binding to individual instance's method
    # bind to "/a-bottle"
    classroute('{$class}-bottle')(A('Bottle').hello)

    # force late binding to @skiproute method
    # bind to "/my","/my/:name"
    classroute('/my/**')(b.myfunc)

    # also support for late binding to instance
    # bind to "/bottle/..."
    classroute('/bottle')(A('Bottle'))

    #start server
    run()


----------
PathItem
-----------
    a str represent for path variable  {$root},{$class},{$name}
    with support property-like access to all method of str via
    ".@methodname" or ".@methodname(argument)" .
    example :
        >>> '{0.@title}'.format(PathItem('hello john'))
        'Helo John'
        >>> '{0.@split(" ")[-1]}'.format(PathItem('hello john'))
        'john'
    and more path related method
        .@path     - tranform to path format  "/xxxx".
        .@path(True) - path transform with normalize "__" to "/".
        .@items[n] - same as split("/") but element in items is PathItem.
        .@value - original value

    all properties are chainable
    example:
        >>> "{0.@path(True).@strip('/').@items[0].@title}".format(PathItem('//abc__def__'))
        'Abc'

About

classroute decorator, a bottle's "route" replacement.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages