Download Install Tutorial Docs FAQ Tools WikiLicense Team IRC Planet Involvement Shop Book

Changeset 620

Show
Ignore:
Timestamp:
09/09/05 18:24:53
Author:
fumanchu
Message:

Fix for ticket #249 (ExposeAs? recipe). The underscore hack is retained (and not reversed). %xx chars (ticket #104) were fixed in [561], so neither #104 nor #248 (firefox hack) apply anymore to #249.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/cherrypy/__init__.py

    r597 r620  
    3434 
    3535import datetime 
     36import sys 
     37import types 
    3638 
    3739from _cperror import * 
     
    6870_sessionLastCleanUpTime = datetime.datetime.now() 
    6971 
    70 # decorator function for exposing methods 
    71 def expose(func): 
    72     func.exposed = True 
    73     return func 
     72def expose(func=None, alias=None): 
     73    """Expose the function, optionally providing an alias or set of aliases.""" 
     74     
     75    def expose_(func): 
     76        func.exposed = True 
     77        if alias is not None: 
     78            if isinstance(alias, basestring): 
     79                parentDict[alias] = func 
     80            else: 
     81                for a in alias: 
     82                    parentDict[a] = func 
     83        return func 
     84     
     85    parentDict = sys._getframe(1).f_locals 
     86    if isinstance(func, (types.FunctionType, types.MethodType)): 
     87        # expose is being called directly, before the method has been bound 
     88        return expose_(func) 
     89    else: 
     90        # expose is being called as a decorator 
     91        if alias is None: 
     92            alias = func 
     93        return expose_ 
    7494 
    7595def log(msg, context='', severity=0): 
  • trunk/cherrypy/test/test_objectmapping.py

    r561 r620  
    2626OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
    2727""" 
     28 
     29import sys 
    2830 
    2931import cherrypy 
     
    5860mapped_func.exposed = True 
    5961setattr(Root, "Von B\xfclow", mapped_func) 
     62 
     63 
     64if sys.hexversion > 0x020400A2: 
     65    from cp_decorator_tests import Exposing, ExposingNewStyle 
     66else: 
     67    class Exposing: 
     68        def base(self): 
     69            return "expose works!" 
     70        cherrypy.expose(base, "1") 
     71        cherrypy.expose(base, "2") 
     72     
     73    class ExposingNewStyle(object): 
     74        def base(self): 
     75            return "expose works!" 
     76        cherrypy.expose(base, "1") 
     77        cherrypy.expose(base, "2") 
     78 
    6079 
    6180 
     
    94113 
    95114cherrypy.root = Root() 
     115cherrypy.root.exposing = Exposing() 
     116cherrypy.root.exposingnew = ExposingNewStyle() 
    96117cherrypy.root.dir1 = Dir1() 
    97118cherrypy.root.dir1.dir2 = Dir2() 
     
    147168        self.getPage("/Von%20B%fclow?ID=14") 
    148169        self.assertBody("ID is 14") 
     170     
     171    def testExpose(self): 
     172        # Test the cherrypy.expose function/decorator 
     173        self.getPage("/exposing/1") 
     174        self.assertBody("expose works!") 
     175         
     176        self.getPage("/exposing/2") 
     177        self.assertBody("expose works!") 
     178         
     179        self.getPage("/exposingnew/1") 
     180        self.assertBody("expose works!") 
     181         
     182        self.getPage("/exposingnew/2") 
     183        self.assertBody("expose works!") 
     184 
    149185 
    150186 

Hosted by WebFaction

Log in as guest/cpguest to create tickets