mirror of
				https://github.com/django/django.git
				synced 2025-10-29 08:36:09 +00:00 
			
		
		
		
	| @@ -20,12 +20,15 @@ | ||||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| # SOFTWARE. | ||||
|  | ||||
| from __future__ import absolute_import | ||||
|  | ||||
| import functools | ||||
| import operator | ||||
| import sys | ||||
| import types | ||||
|  | ||||
| __author__ = "Benjamin Peterson <benjamin@python.org>" | ||||
| __version__ = "1.6.1" | ||||
| __version__ = "1.8.0" | ||||
|  | ||||
|  | ||||
| # Useful for very coarse version differentiation. | ||||
| @@ -83,11 +86,7 @@ class _LazyDescr(object): | ||||
|         self.name = name | ||||
|  | ||||
|     def __get__(self, obj, tp): | ||||
|         try: | ||||
|             result = self._resolve() | ||||
|         except ImportError: | ||||
|             # See the nice big comment in MovedModule.__getattr__. | ||||
|             raise AttributeError("%s could not be imported " % self.name) | ||||
|         result = self._resolve() | ||||
|         setattr(obj, self.name, result) # Invokes __set__. | ||||
|         # This is a bit ugly, but it avoids running this again. | ||||
|         delattr(obj.__class__, self.name) | ||||
| @@ -109,22 +108,7 @@ class MovedModule(_LazyDescr): | ||||
|         return _import_module(self.mod) | ||||
|  | ||||
|     def __getattr__(self, attr): | ||||
|         # It turns out many Python frameworks like to traverse sys.modules and | ||||
|         # try to load various attributes. This causes problems if this is a | ||||
|         # platform-specific module on the wrong platform, like _winreg on | ||||
|         # Unixes. Therefore, we silently pretend unimportable modules do not | ||||
|         # have any attributes. See issues #51, #53, #56, and #63 for the full | ||||
|         # tales of woe. | ||||
|         # | ||||
|         # First, if possible, avoid loading the module just to look at __file__, | ||||
|         # __name__, or __path__. | ||||
|         if (attr in ("__file__", "__name__", "__path__") and | ||||
|             self.mod not in sys.modules): | ||||
|             raise AttributeError(attr) | ||||
|         try: | ||||
|             _module = self._resolve() | ||||
|         except ImportError: | ||||
|             raise AttributeError(attr) | ||||
|         _module = self._resolve() | ||||
|         value = getattr(_module, attr) | ||||
|         setattr(self, attr, value) | ||||
|         return value | ||||
| @@ -170,9 +154,72 @@ class MovedAttribute(_LazyDescr): | ||||
|         return getattr(module, self.attr) | ||||
|  | ||||
|  | ||||
| class _SixMetaPathImporter(object): | ||||
|     """ | ||||
|     A meta path importer to import six.moves and its submodules. | ||||
|  | ||||
|     This class implements a PEP302 finder and loader. It should be compatible | ||||
|     with Python 2.5 and all existing versions of Python3 | ||||
|     """ | ||||
|     def __init__(self, six_module_name): | ||||
|         self.name = six_module_name | ||||
|         self.known_modules = {} | ||||
|  | ||||
|     def _add_module(self, mod, *fullnames): | ||||
|         for fullname in fullnames: | ||||
|             self.known_modules[self.name + "." + fullname] = mod | ||||
|  | ||||
|     def _get_module(self, fullname): | ||||
|         return self.known_modules[self.name + "." + fullname] | ||||
|  | ||||
|     def find_module(self, fullname, path=None): | ||||
|         if fullname in self.known_modules: | ||||
|             return self | ||||
|         return None | ||||
|  | ||||
|     def __get_module(self, fullname): | ||||
|         try: | ||||
|             return self.known_modules[fullname] | ||||
|         except KeyError: | ||||
|             raise ImportError("This loader does not know module " + fullname) | ||||
|  | ||||
|     def load_module(self, fullname): | ||||
|         try: | ||||
|             # in case of a reload | ||||
|             return sys.modules[fullname] | ||||
|         except KeyError: | ||||
|             pass | ||||
|         mod = self.__get_module(fullname) | ||||
|         if isinstance(mod, MovedModule): | ||||
|             mod = mod._resolve() | ||||
|         else: | ||||
|             mod.__loader__ = self | ||||
|         sys.modules[fullname] = mod | ||||
|         return mod | ||||
|  | ||||
|     def is_package(self, fullname): | ||||
|         """ | ||||
|         Return true, if the named module is a package. | ||||
|  | ||||
|         We need this method to get correct spec objects with | ||||
|         Python 3.4 (see PEP451) | ||||
|         """ | ||||
|         return hasattr(self.__get_module(fullname), "__path__") | ||||
|  | ||||
|     def get_code(self, fullname): | ||||
|         """Return None | ||||
|  | ||||
|         Required, if is_package is implemented""" | ||||
|         self.__get_module(fullname)  # eventually raises ImportError | ||||
|         return None | ||||
|     get_source = get_code  # same as get_code | ||||
|  | ||||
| _importer = _SixMetaPathImporter(__name__) | ||||
|  | ||||
|  | ||||
| class _MovedItems(_LazyModule): | ||||
|     """Lazy loading of moved objects""" | ||||
|     __path__ = []  # mark as package | ||||
|  | ||||
|  | ||||
| _moved_attributes = [ | ||||
| @@ -180,11 +227,15 @@ _moved_attributes = [ | ||||
|     MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), | ||||
|     MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), | ||||
|     MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), | ||||
|     MovedAttribute("intern", "__builtin__", "sys"), | ||||
|     MovedAttribute("map", "itertools", "builtins", "imap", "map"), | ||||
|     MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), | ||||
|     MovedAttribute("reload_module", "__builtin__", "imp", "reload"), | ||||
|     MovedAttribute("reduce", "__builtin__", "functools"), | ||||
|     MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), | ||||
|     MovedAttribute("StringIO", "StringIO", "io"), | ||||
|     MovedAttribute("UserDict", "UserDict", "collections"), | ||||
|     MovedAttribute("UserList", "UserList", "collections"), | ||||
|     MovedAttribute("UserString", "UserString", "collections"), | ||||
|     MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), | ||||
|     MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), | ||||
| @@ -194,12 +245,14 @@ _moved_attributes = [ | ||||
|     MovedModule("configparser", "ConfigParser"), | ||||
|     MovedModule("copyreg", "copy_reg"), | ||||
|     MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), | ||||
|     MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), | ||||
|     MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), | ||||
|     MovedModule("http_cookies", "Cookie", "http.cookies"), | ||||
|     MovedModule("html_entities", "htmlentitydefs", "html.entities"), | ||||
|     MovedModule("html_parser", "HTMLParser", "html.parser"), | ||||
|     MovedModule("http_client", "httplib", "http.client"), | ||||
|     MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), | ||||
|     MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), | ||||
|     MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), | ||||
|     MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), | ||||
|     MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), | ||||
| @@ -233,18 +286,19 @@ _moved_attributes = [ | ||||
|     MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), | ||||
|     MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), | ||||
|     MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), | ||||
|     MovedModule("xmlrpc_server", "xmlrpclib", "xmlrpc.server"), | ||||
|     MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), | ||||
|     MovedModule("winreg", "_winreg"), | ||||
| ] | ||||
| for attr in _moved_attributes: | ||||
|     setattr(_MovedItems, attr.name, attr) | ||||
|     if isinstance(attr, MovedModule): | ||||
|         sys.modules[__name__ + ".moves." + attr.name] = attr | ||||
|         _importer._add_module(attr, "moves." + attr.name) | ||||
| del attr | ||||
|  | ||||
| _MovedItems._moved_attributes = _moved_attributes | ||||
|  | ||||
| moves = sys.modules[__name__ + ".moves"] = _MovedItems(__name__ + ".moves") | ||||
| moves = _MovedItems(__name__ + ".moves") | ||||
| _importer._add_module(moves, "moves") | ||||
|  | ||||
|  | ||||
| class Module_six_moves_urllib_parse(_LazyModule): | ||||
| @@ -268,6 +322,13 @@ _urllib_parse_moved_attributes = [ | ||||
|     MovedAttribute("unquote_plus", "urllib", "urllib.parse"), | ||||
|     MovedAttribute("urlencode", "urllib", "urllib.parse"), | ||||
|     MovedAttribute("splitquery", "urllib", "urllib.parse"), | ||||
|     MovedAttribute("splittag", "urllib", "urllib.parse"), | ||||
|     MovedAttribute("splituser", "urllib", "urllib.parse"), | ||||
|     MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), | ||||
|     MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), | ||||
|     MovedAttribute("uses_params", "urlparse", "urllib.parse"), | ||||
|     MovedAttribute("uses_query", "urlparse", "urllib.parse"), | ||||
|     MovedAttribute("uses_relative", "urlparse", "urllib.parse"), | ||||
| ] | ||||
| for attr in _urllib_parse_moved_attributes: | ||||
|     setattr(Module_six_moves_urllib_parse, attr.name, attr) | ||||
| @@ -275,7 +336,8 @@ del attr | ||||
|  | ||||
| Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes | ||||
|  | ||||
| sys.modules[__name__ + ".moves.urllib_parse"] = sys.modules[__name__ + ".moves.urllib.parse"] = Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse") | ||||
| _importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), | ||||
|                       "moves.urllib_parse", "moves.urllib.parse") | ||||
|  | ||||
|  | ||||
| class Module_six_moves_urllib_error(_LazyModule): | ||||
| @@ -293,7 +355,8 @@ del attr | ||||
|  | ||||
| Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes | ||||
|  | ||||
| sys.modules[__name__ + ".moves.urllib_error"] = sys.modules[__name__ + ".moves.urllib.error"] = Module_six_moves_urllib_error(__name__ + ".moves.urllib.error") | ||||
| _importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), | ||||
|                       "moves.urllib_error", "moves.urllib.error") | ||||
|  | ||||
|  | ||||
| class Module_six_moves_urllib_request(_LazyModule): | ||||
| @@ -341,7 +404,8 @@ del attr | ||||
|  | ||||
| Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes | ||||
|  | ||||
| sys.modules[__name__ + ".moves.urllib_request"] = sys.modules[__name__ + ".moves.urllib.request"] = Module_six_moves_urllib_request(__name__ + ".moves.urllib.request") | ||||
| _importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), | ||||
|                       "moves.urllib_request", "moves.urllib.request") | ||||
|  | ||||
|  | ||||
| class Module_six_moves_urllib_response(_LazyModule): | ||||
| @@ -360,7 +424,8 @@ del attr | ||||
|  | ||||
| Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes | ||||
|  | ||||
| sys.modules[__name__ + ".moves.urllib_response"] = sys.modules[__name__ + ".moves.urllib.response"] = Module_six_moves_urllib_response(__name__ + ".moves.urllib.response") | ||||
| _importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), | ||||
|                       "moves.urllib_response", "moves.urllib.response") | ||||
|  | ||||
|  | ||||
| class Module_six_moves_urllib_robotparser(_LazyModule): | ||||
| @@ -376,22 +441,24 @@ del attr | ||||
|  | ||||
| Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes | ||||
|  | ||||
| sys.modules[__name__ + ".moves.urllib_robotparser"] = sys.modules[__name__ + ".moves.urllib.robotparser"] = Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser") | ||||
| _importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), | ||||
|                       "moves.urllib_robotparser", "moves.urllib.robotparser") | ||||
|  | ||||
|  | ||||
| class Module_six_moves_urllib(types.ModuleType): | ||||
|     """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" | ||||
|     parse = sys.modules[__name__ + ".moves.urllib_parse"] | ||||
|     error = sys.modules[__name__ + ".moves.urllib_error"] | ||||
|     request = sys.modules[__name__ + ".moves.urllib_request"] | ||||
|     response = sys.modules[__name__ + ".moves.urllib_response"] | ||||
|     robotparser = sys.modules[__name__ + ".moves.urllib_robotparser"] | ||||
|     __path__ = []  # mark as package | ||||
|     parse = _importer._get_module("moves.urllib_parse") | ||||
|     error = _importer._get_module("moves.urllib_error") | ||||
|     request = _importer._get_module("moves.urllib_request") | ||||
|     response = _importer._get_module("moves.urllib_response") | ||||
|     robotparser = _importer._get_module("moves.urllib_robotparser") | ||||
|  | ||||
|     def __dir__(self): | ||||
|         return ['parse', 'error', 'request', 'response', 'robotparser'] | ||||
|  | ||||
|  | ||||
| sys.modules[__name__ + ".moves.urllib"] = Module_six_moves_urllib(__name__ + ".moves.urllib") | ||||
| _importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), | ||||
|                       "moves.urllib") | ||||
|  | ||||
|  | ||||
| def add_move(move): | ||||
| @@ -418,11 +485,6 @@ if PY3: | ||||
|     _func_code = "__code__" | ||||
|     _func_defaults = "__defaults__" | ||||
|     _func_globals = "__globals__" | ||||
|  | ||||
|     _iterkeys = "keys" | ||||
|     _itervalues = "values" | ||||
|     _iteritems = "items" | ||||
|     _iterlists = "lists" | ||||
| else: | ||||
|     _meth_func = "im_func" | ||||
|     _meth_self = "im_self" | ||||
| @@ -432,11 +494,6 @@ else: | ||||
|     _func_defaults = "func_defaults" | ||||
|     _func_globals = "func_globals" | ||||
|  | ||||
|     _iterkeys = "iterkeys" | ||||
|     _itervalues = "itervalues" | ||||
|     _iteritems = "iteritems" | ||||
|     _iterlists = "iterlists" | ||||
|  | ||||
|  | ||||
| try: | ||||
|     advance_iterator = next | ||||
| @@ -485,21 +542,37 @@ get_function_defaults = operator.attrgetter(_func_defaults) | ||||
| get_function_globals = operator.attrgetter(_func_globals) | ||||
|  | ||||
|  | ||||
| def iterkeys(d, **kw): | ||||
|     """Return an iterator over the keys of a dictionary.""" | ||||
|     return iter(getattr(d, _iterkeys)(**kw)) | ||||
| if PY3: | ||||
|     def iterkeys(d, **kw): | ||||
|         return iter(d.keys(**kw)) | ||||
|  | ||||
| def itervalues(d, **kw): | ||||
|     """Return an iterator over the values of a dictionary.""" | ||||
|     return iter(getattr(d, _itervalues)(**kw)) | ||||
|     def itervalues(d, **kw): | ||||
|         return iter(d.values(**kw)) | ||||
|  | ||||
| def iteritems(d, **kw): | ||||
|     """Return an iterator over the (key, value) pairs of a dictionary.""" | ||||
|     return iter(getattr(d, _iteritems)(**kw)) | ||||
|     def iteritems(d, **kw): | ||||
|         return iter(d.items(**kw)) | ||||
|  | ||||
| def iterlists(d, **kw): | ||||
|     """Return an iterator over the (key, [values]) pairs of a dictionary.""" | ||||
|     return iter(getattr(d, _iterlists)(**kw)) | ||||
|     def iterlists(d, **kw): | ||||
|         return iter(d.lists(**kw)) | ||||
| else: | ||||
|     def iterkeys(d, **kw): | ||||
|         return iter(d.iterkeys(**kw)) | ||||
|  | ||||
|     def itervalues(d, **kw): | ||||
|         return iter(d.itervalues(**kw)) | ||||
|  | ||||
|     def iteritems(d, **kw): | ||||
|         return iter(d.iteritems(**kw)) | ||||
|  | ||||
|     def iterlists(d, **kw): | ||||
|         return iter(d.iterlists(**kw)) | ||||
|  | ||||
| _add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") | ||||
| _add_doc(itervalues, "Return an iterator over the values of a dictionary.") | ||||
| _add_doc(iteritems, | ||||
|          "Return an iterator over the (key, value) pairs of a dictionary.") | ||||
| _add_doc(iterlists, | ||||
|          "Return an iterator over the (key, [values]) pairs of a dictionary.") | ||||
|  | ||||
|  | ||||
| if PY3: | ||||
| @@ -545,6 +618,8 @@ if PY3: | ||||
|  | ||||
|  | ||||
|     def reraise(tp, value, tb=None): | ||||
|         if value is None: | ||||
|             value = tp() | ||||
|         if value.__traceback__ is not tb: | ||||
|             raise value.with_traceback(tb) | ||||
|         raise value | ||||
| @@ -625,26 +700,67 @@ if print_ is None: | ||||
|  | ||||
| _add_doc(reraise, """Reraise an exception.""") | ||||
|  | ||||
| if sys.version_info[0:2] < (3, 4): | ||||
|     def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, | ||||
|               updated=functools.WRAPPER_UPDATES): | ||||
|         def wrapper(f): | ||||
|             f = functools.wraps(wrapped)(f) | ||||
|             f.__wrapped__ = wrapped | ||||
|             return f | ||||
|         return wrapper | ||||
| else: | ||||
|     wraps = functools.wraps | ||||
|  | ||||
| def with_metaclass(meta, *bases): | ||||
|     """Create a base class with a metaclass.""" | ||||
|     return meta("NewBase", bases, {}) | ||||
|     # This requires a bit of explanation: the basic idea is to make a dummy | ||||
|     # metaclass for one level of class instantiation that replaces itself with | ||||
|     # the actual metaclass. | ||||
|     class metaclass(meta): | ||||
|         def __new__(cls, name, this_bases, d): | ||||
|             return meta(name, bases, d) | ||||
|     return type.__new__(metaclass, 'temporary_class', (), {}) | ||||
|  | ||||
|  | ||||
| def add_metaclass(metaclass): | ||||
|     """Class decorator for creating a class with a metaclass.""" | ||||
|     def wrapper(cls): | ||||
|         orig_vars = cls.__dict__.copy() | ||||
|         orig_vars.pop('__dict__', None) | ||||
|         orig_vars.pop('__weakref__', None) | ||||
|         slots = orig_vars.get('__slots__') | ||||
|         if slots is not None: | ||||
|             if isinstance(slots, str): | ||||
|                 slots = [slots] | ||||
|             for slots_var in slots: | ||||
|                 orig_vars.pop(slots_var) | ||||
|         orig_vars.pop('__dict__', None) | ||||
|         orig_vars.pop('__weakref__', None) | ||||
|         return metaclass(cls.__name__, cls.__bases__, orig_vars) | ||||
|     return wrapper | ||||
|  | ||||
| # Complete the moves implementation. | ||||
| # This code is at the end of this module to speed up module loading. | ||||
| # Turn this module into a package. | ||||
| __path__ = []  # required for PEP 302 and PEP 451 | ||||
| __package__ = __name__  # see PEP 366 @ReservedAssignment | ||||
| if globals().get("__spec__") is not None: | ||||
|     __spec__.submodule_search_locations = []  # PEP 451 @UndefinedVariable | ||||
| # Remove other six meta path importers, since they cause problems. This can | ||||
| # happen if six is removed from sys.modules and then reloaded. (Setuptools does | ||||
| # this for some reason.) | ||||
| if sys.meta_path: | ||||
|     for i, importer in enumerate(sys.meta_path): | ||||
|         # Here's some real nastiness: Another "instance" of the six module might | ||||
|         # be floating around. Therefore, we can't use isinstance() to check for | ||||
|         # the six meta path importer, since the other six instance will have | ||||
|         # inserted an importer with different class. | ||||
|         if (type(importer).__name__ == "_SixMetaPathImporter" and | ||||
|             importer.name == __name__): | ||||
|             del sys.meta_path[i] | ||||
|             break | ||||
|     del i, importer | ||||
| # Finally, add the importer to the meta path import hook. | ||||
| sys.meta_path.append(_importer) | ||||
|  | ||||
|  | ||||
| ### Additional customizations for Django ### | ||||
|  | ||||
|   | ||||
							
								
								
									
										10
									
								
								docs/releases/1.4.17.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								docs/releases/1.4.17.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| =========================== | ||||
| Django 1.4.17 release notes | ||||
| =========================== | ||||
|  | ||||
| *Under development* | ||||
|  | ||||
| Django 1.4.17 ... | ||||
|  | ||||
| Additionally, Django's vendored version of six, :mod:`django.utils.six`, has | ||||
| been upgraded to the latest release (1.8.0). | ||||
							
								
								
									
										10
									
								
								docs/releases/1.6.9.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								docs/releases/1.6.9.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| ========================== | ||||
| Django 1.6.9 release notes | ||||
| ========================== | ||||
|  | ||||
| *Under development* | ||||
|  | ||||
| Django 1.6.9 ... | ||||
|  | ||||
| Additionally, Django's vendored version of six, :mod:`django.utils.six`, has | ||||
| been upgraded to the latest release (1.8.0). | ||||
| @@ -25,6 +25,7 @@ versions of the documentation contain the release notes for any later releases. | ||||
| .. toctree:: | ||||
|    :maxdepth: 1 | ||||
|  | ||||
|    1.6.9 | ||||
|    1.6.8 | ||||
|    1.6.7 | ||||
|    1.6.6 | ||||
| @@ -58,6 +59,7 @@ versions of the documentation contain the release notes for any later releases. | ||||
| .. toctree:: | ||||
|    :maxdepth: 1 | ||||
|  | ||||
|    1.4.17 | ||||
|    1.4.16 | ||||
|    1.4.15 | ||||
|    1.4.14 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user