Django

Code

Show
Ignore:
Timestamp:
03/13/08 01:14:26 (10 months ago)
Author:
jkocherhans
Message:

newforms-admin: Merged from trunk up to [7232]

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/newforms-admin

    • Property svnmerge-integrated changed from /django/trunk:1-4345,4350-4357,4359-4365,4371-4372,4374-4377,4380-4386,4388,4390-4391,4400-4402,4404-4408,4410,4412-4419,4426-4427,4430-4432,4434,4441,4443-4444,4446-4447,4450,4452-4453,4455-4458,4476,4503,4546,4564-4569,4580-4586,4617,4630,4641-6390,6392-7120 to /django/trunk:1-4345,4350-4357,4359-4365,4371-4372,4374-4377,4380-4386,4388,4390-4391,4400-4402,4404-4408,4410,4412-4419,4426-4427,4430-4432,4434,4441,4443-4444,4446-4447,4450,4452-4453,4455-4458,4476,4503,4546,4564-4569,4580-4586,4617,4630,4641-6390,6392-7232
  • django/branches/newforms-admin/django/utils/functional.py

    r6613 r7233  
     1# License for code in this file that was taken from Python 2.5. 
     2 
     3# PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 
     4# -------------------------------------------- 
     5# 
     6# 1. This LICENSE AGREEMENT is between the Python Software Foundation 
     7# ("PSF"), and the Individual or Organization ("Licensee") accessing and 
     8# otherwise using this software ("Python") in source or binary form and 
     9# its associated documentation. 
     10# 
     11# 2. Subject to the terms and conditions of this License Agreement, PSF 
     12# hereby grants Licensee a nonexclusive, royalty-free, world-wide 
     13# license to reproduce, analyze, test, perform and/or display publicly, 
     14# prepare derivative works, distribute, and otherwise use Python 
     15# alone or in any derivative version, provided, however, that PSF's 
     16# License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 
     17# 2001, 2002, 2003, 2004, 2005, 2006, 2007 Python Software Foundation; 
     18# All Rights Reserved" are retained in Python alone or in any derivative 
     19# version prepared by Licensee. 
     20# 
     21# 3. In the event Licensee prepares a derivative work that is based on 
     22# or incorporates Python or any part thereof, and wants to make 
     23# the derivative work available to others as provided herein, then 
     24# Licensee hereby agrees to include in any such work a brief summary of 
     25# the changes made to Python. 
     26# 
     27# 4. PSF is making Python available to Licensee on an "AS IS" 
     28# basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR 
     29# IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND 
     30# DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS 
     31# FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT 
     32# INFRINGE ANY THIRD PARTY RIGHTS. 
     33# 
     34# 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 
     35# FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS 
     36# A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, 
     37# OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. 
     38# 
     39# 6. This License Agreement will automatically terminate upon a material 
     40# breach of its terms and conditions. 
     41# 
     42# 7. Nothing in this License Agreement shall be deemed to create any 
     43# relationship of agency, partnership, or joint venture between PSF and 
     44# Licensee.  This License Agreement does not grant permission to use PSF 
     45# trademarks or trade name in a trademark sense to endorse or promote 
     46# products or services of Licensee, or any third party. 
     47# 
     48# 8. By copying, installing or otherwise using Python, Licensee 
     49# agrees to be bound by the terms and conditions of this License 
     50# Agreement. 
     51 
     52 
    153def curry(_curried_func, *args, **kwargs): 
    254    def _curried(*moreargs, **morekwargs): 
    355        return _curried_func(*(args+moreargs), **dict(kwargs, **morekwargs)) 
    456    return _curried 
     57 
     58### Begin from Python 2.5 functools.py ######################################## 
     59 
     60# Summary of changes made to the Python 2.5 code below: 
     61#   * swapped ``partial`` for ``curry`` to maintain backwards-compatibility 
     62#     in Django. 
     63#   * Wrapped the ``setattr`` call in ``update_wrapper`` with a try-except 
     64#     block to make it compatible with Python 2.3, which doesn't allow 
     65#     assigning to ``__name__``. 
     66 
     67# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007 Python Software Foundation. 
     68# All Rights Reserved. 
     69 
     70############################################################################### 
     71 
     72# update_wrapper() and wraps() are tools to help write 
     73# wrapper functions that can handle naive introspection 
     74 
     75WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__doc__') 
     76WRAPPER_UPDATES = ('__dict__',) 
     77def update_wrapper(wrapper, 
     78                   wrapped, 
     79                   assigned = WRAPPER_ASSIGNMENTS, 
     80                   updated = WRAPPER_UPDATES): 
     81    """Update a wrapper function to look like the wrapped function 
     82 
     83       wrapper is the function to be updated 
     84       wrapped is the original function 
     85       assigned is a tuple naming the attributes assigned directly 
     86       from the wrapped function to the wrapper function (defaults to 
     87       functools.WRAPPER_ASSIGNMENTS) 
     88       updated is a tuple naming the attributes off the wrapper that 
     89       are updated with the corresponding attribute from the wrapped 
     90       function (defaults to functools.WRAPPER_UPDATES) 
     91    """ 
     92    for attr in assigned: 
     93        try: 
     94            setattr(wrapper, attr, getattr(wrapped, attr)) 
     95        except TypeError: # Python 2.3 doesn't allow assigning to __name__. 
     96            pass 
     97    for attr in updated: 
     98        getattr(wrapper, attr).update(getattr(wrapped, attr)) 
     99    # Return the wrapper so this can be used as a decorator via curry() 
     100    return wrapper 
     101 
     102def wraps(wrapped, 
     103          assigned = WRAPPER_ASSIGNMENTS, 
     104          updated = WRAPPER_UPDATES): 
     105    """Decorator factory to apply update_wrapper() to a wrapper function 
     106 
     107       Returns a decorator that invokes update_wrapper() with the decorated 
     108       function as the wrapper argument and the arguments to wraps() as the 
     109       remaining arguments. Default arguments are as for update_wrapper(). 
     110       This is a convenience function to simplify applying curry() to 
     111       update_wrapper(). 
     112    """ 
     113    return curry(update_wrapper, wrapped=wrapped, 
     114                 assigned=assigned, updated=updated) 
     115 
     116### End from Python 2.5 functools.py ########################################## 
    5117 
    6118def memoize(func, cache, num_args): 
     
    19131        cache[mem_args] = result 
    20132        return result 
    21     return wrapper 
     133    return wraps(func)(wrapper) 
    22134 
    23135class Promise(object): 
     
    111223        return __proxy__(args, kw) 
    112224 
    113     return __wrapper__ 
     225    return wraps(func)(__wrapper__) 
    114226 
    115227def allow_lazy(func, *resultclasses): 
     
    127239            return func(*args, **kwargs) 
    128240        return lazy(func, *resultclasses)(*args, **kwargs) 
    129     return wrapper 
     241    return wraps(func)(wrapper)