merge
This commit is contained in:
commit
46f484ee4e
@ -993,7 +993,7 @@ directories.
|
||||
|
||||
Files in *src* that begin with :file:`.nfs` are skipped (more information on
|
||||
these files is available in answer D2 of the `NFS FAQ page
|
||||
<http://nfs.sourceforge.net/#section_d>`_.
|
||||
<http://nfs.sourceforge.net/#section_d>`_).
|
||||
|
||||
.. versionchanged:: 3.3.1
|
||||
NFS files are ignored.
|
||||
|
@ -95,8 +95,8 @@ To test the type of an object, first make sure it isn't *NULL*, and then use
|
||||
There is also a high-level API to Python objects which is provided by the
|
||||
so-called 'abstract' interface -- read ``Include/abstract.h`` for further
|
||||
details. It allows interfacing with any kind of Python sequence using calls
|
||||
like :c:func:`PySequence_Length`, :c:func:`PySequence_GetItem`, etc.) as well
|
||||
as many other useful protocols such as numbers (:c:func:`PyNumber_Index` et.
|
||||
like :c:func:`PySequence_Length`, :c:func:`PySequence_GetItem`, etc. as well
|
||||
as many other useful protocols such as numbers (:c:func:`PyNumber_Index` et
|
||||
al.) and mappings in the PyMapping APIs.
|
||||
|
||||
|
||||
|
@ -442,7 +442,7 @@ The complete signature is::
|
||||
|
||||
:value: What the new Enum class will record as its name.
|
||||
|
||||
:names: The Enum members. This can be a whitespace or comma seperated string
|
||||
:names: The Enum members. This can be a whitespace or comma separated string
|
||||
(values will start at 1)::
|
||||
|
||||
'red green blue' | 'red,green,blue' | 'red, green, blue'
|
||||
@ -453,7 +453,7 @@ The complete signature is::
|
||||
|
||||
or a mapping::
|
||||
|
||||
{'chartruese': 7, 'sea_green': 11, 'rosemary': 42}
|
||||
{'chartreuse': 7, 'sea_green': 11, 'rosemary': 42}
|
||||
|
||||
:module: name of module where new Enum class can be found.
|
||||
|
||||
@ -543,7 +543,7 @@ Some rules:
|
||||
add methods and don't specify another data type such as :class:`int` or
|
||||
:class:`str`.
|
||||
3. When another data type is mixed in, the :attr:`value` attribute is *not the
|
||||
same* as the enum member itself, although it is equivalant and will compare
|
||||
same* as the enum member itself, although it is equivalent and will compare
|
||||
equal.
|
||||
4. %-style formatting: `%s` and `%r` call :class:`Enum`'s :meth:`__str__` and
|
||||
:meth:`__repr__` respectively; other codes (such as `%i` or `%h` for
|
||||
|
@ -242,7 +242,7 @@ the :mod:`glob` module.)
|
||||
links encountered in the path (if they are supported by the operating system).
|
||||
|
||||
|
||||
.. function:: relpath(path, start=None)
|
||||
.. function:: relpath(path, start=os.curdir)
|
||||
|
||||
Return a relative filepath to *path* either from the current directory or
|
||||
from an optional *start* directory. This is a path computation: the
|
||||
|
@ -1607,7 +1607,7 @@ features:
|
||||
The *dir_fd* argument.
|
||||
|
||||
|
||||
.. function:: makedirs(path, mode=0o777, exist_ok=False)
|
||||
.. function:: makedirs(name, mode=0o777, exist_ok=False)
|
||||
|
||||
.. index::
|
||||
single: directory; creating
|
||||
@ -1763,7 +1763,7 @@ features:
|
||||
The *dir_fd* argument.
|
||||
|
||||
|
||||
.. function:: removedirs(path)
|
||||
.. function:: removedirs(name)
|
||||
|
||||
.. index:: single: directory; deleting
|
||||
|
||||
|
@ -274,9 +274,7 @@ class {typename}(tuple):
|
||||
return OrderedDict(zip(self._fields, self))
|
||||
|
||||
def _asdict(self):
|
||||
'''Return a new OrderedDict which maps field names to their values.
|
||||
This method is obsolete. Use vars(nt) or nt.__dict__ instead.
|
||||
'''
|
||||
'Return a new OrderedDict which maps field names to their values.'
|
||||
return self.__dict__
|
||||
|
||||
def __getnewargs__(self):
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Copyright 2001-2013 by Vinay Sajip. All Rights Reserved.
|
||||
# Copyright 2001-2014 by Vinay Sajip. All Rights Reserved.
|
||||
#
|
||||
# Permission to use, copy, modify, and distribute this software and its
|
||||
# documentation for any purpose and without fee is hereby granted,
|
||||
@ -19,13 +19,19 @@ Configuration functions for the logging package for Python. The core package
|
||||
is based on PEP 282 and comments thereto in comp.lang.python, and influenced
|
||||
by Apache's log4j system.
|
||||
|
||||
Copyright (C) 2001-2013 Vinay Sajip. All Rights Reserved.
|
||||
Copyright (C) 2001-2014 Vinay Sajip. All Rights Reserved.
|
||||
|
||||
To use, simply 'import logging' and log away!
|
||||
"""
|
||||
|
||||
import sys, logging, logging.handlers, struct, traceback, re
|
||||
import errno
|
||||
import io
|
||||
import logging
|
||||
import logging.handlers
|
||||
import re
|
||||
import struct
|
||||
import sys
|
||||
import traceback
|
||||
|
||||
try:
|
||||
import _thread as thread
|
||||
@ -38,10 +44,7 @@ from socketserver import ThreadingTCPServer, StreamRequestHandler
|
||||
|
||||
DEFAULT_LOGGING_CONFIG_PORT = 9030
|
||||
|
||||
if sys.platform == "win32":
|
||||
RESET_ERROR = 10054 #WSAECONNRESET
|
||||
else:
|
||||
RESET_ERROR = 104 #ECONNRESET
|
||||
RESET_ERROR = errno.ECONNRESET
|
||||
|
||||
#
|
||||
# The following code implements a socket listener for on-the-fly
|
||||
@ -274,6 +277,30 @@ def valid_ident(s):
|
||||
return True
|
||||
|
||||
|
||||
class ConvertingMixin(object):
|
||||
"""For ConvertingXXX's, this mixin class provides common functions"""
|
||||
|
||||
def convert_with_key(self, key, value, replace=True):
|
||||
result = self.configurator.convert(value)
|
||||
#If the converted value is different, save for next time
|
||||
if value is not result:
|
||||
if replace:
|
||||
self[key] = result
|
||||
if type(result) in (ConvertingDict, ConvertingList,
|
||||
ConvertingTuple):
|
||||
result.parent = self
|
||||
result.key = key
|
||||
return result
|
||||
|
||||
def convert(self, value):
|
||||
result = self.configurator.convert(value)
|
||||
if value is not result:
|
||||
if type(result) in (ConvertingDict, ConvertingList,
|
||||
ConvertingTuple):
|
||||
result.parent = self
|
||||
return result
|
||||
|
||||
|
||||
# The ConvertingXXX classes are wrappers around standard Python containers,
|
||||
# and they serve to convert any suitable values in the container. The
|
||||
# conversion converts base dicts, lists and tuples to their wrapped
|
||||
@ -283,77 +310,37 @@ def valid_ident(s):
|
||||
# Each wrapper should have a configurator attribute holding the actual
|
||||
# configurator to use for conversion.
|
||||
|
||||
class ConvertingDict(dict):
|
||||
class ConvertingDict(dict, ConvertingMixin):
|
||||
"""A converting dictionary wrapper."""
|
||||
|
||||
def __getitem__(self, key):
|
||||
value = dict.__getitem__(self, key)
|
||||
result = self.configurator.convert(value)
|
||||
#If the converted value is different, save for next time
|
||||
if value is not result:
|
||||
self[key] = result
|
||||
if type(result) in (ConvertingDict, ConvertingList,
|
||||
ConvertingTuple):
|
||||
result.parent = self
|
||||
result.key = key
|
||||
return result
|
||||
return self.convert_with_key(key, value)
|
||||
|
||||
def get(self, key, default=None):
|
||||
value = dict.get(self, key, default)
|
||||
result = self.configurator.convert(value)
|
||||
#If the converted value is different, save for next time
|
||||
if value is not result:
|
||||
self[key] = result
|
||||
if type(result) in (ConvertingDict, ConvertingList,
|
||||
ConvertingTuple):
|
||||
result.parent = self
|
||||
result.key = key
|
||||
return result
|
||||
return self.convert_with_key(key, value)
|
||||
|
||||
def pop(self, key, default=None):
|
||||
value = dict.pop(self, key, default)
|
||||
result = self.configurator.convert(value)
|
||||
if value is not result:
|
||||
if type(result) in (ConvertingDict, ConvertingList,
|
||||
ConvertingTuple):
|
||||
result.parent = self
|
||||
result.key = key
|
||||
return result
|
||||
return self.convert_with_key(key, value, replace=False)
|
||||
|
||||
class ConvertingList(list):
|
||||
class ConvertingList(list, ConvertingMixin):
|
||||
"""A converting list wrapper."""
|
||||
def __getitem__(self, key):
|
||||
value = list.__getitem__(self, key)
|
||||
result = self.configurator.convert(value)
|
||||
#If the converted value is different, save for next time
|
||||
if value is not result:
|
||||
self[key] = result
|
||||
if type(result) in (ConvertingDict, ConvertingList,
|
||||
ConvertingTuple):
|
||||
result.parent = self
|
||||
result.key = key
|
||||
return result
|
||||
return self.convert_with_key(key, value)
|
||||
|
||||
def pop(self, idx=-1):
|
||||
value = list.pop(self, idx)
|
||||
result = self.configurator.convert(value)
|
||||
if value is not result:
|
||||
if type(result) in (ConvertingDict, ConvertingList,
|
||||
ConvertingTuple):
|
||||
result.parent = self
|
||||
return result
|
||||
return self.convert(value)
|
||||
|
||||
class ConvertingTuple(tuple):
|
||||
class ConvertingTuple(tuple, ConvertingMixin):
|
||||
"""A converting tuple wrapper."""
|
||||
def __getitem__(self, key):
|
||||
value = tuple.__getitem__(self, key)
|
||||
result = self.configurator.convert(value)
|
||||
if value is not result:
|
||||
if type(result) in (ConvertingDict, ConvertingList,
|
||||
ConvertingTuple):
|
||||
result.parent = self
|
||||
result.key = key
|
||||
return result
|
||||
# Can't replace a tuple entry.
|
||||
return self.convert_with_key(key, value, replace=False)
|
||||
|
||||
class BaseConfigurator(object):
|
||||
"""
|
||||
@ -867,12 +854,8 @@ def listen(port=DEFAULT_LOGGING_CONFIG_PORT, verify=None):
|
||||
if self.server.ready:
|
||||
self.server.ready.set()
|
||||
except OSError as e:
|
||||
if not isinstance(e.args, tuple):
|
||||
if e.errno != RESET_ERROR:
|
||||
raise
|
||||
else:
|
||||
errcode = e.args[0]
|
||||
if errcode != RESET_ERROR:
|
||||
raise
|
||||
|
||||
class ConfigSocketReceiver(ThreadingTCPServer):
|
||||
"""
|
||||
|
@ -216,7 +216,7 @@ def _get_masked_mode(mode):
|
||||
# (Inspired by Eric Raymond; the doc strings are mostly his)
|
||||
|
||||
def makedirs(name, mode=0o777, exist_ok=False):
|
||||
"""makedirs(path [, mode=0o777][, exist_ok=False])
|
||||
"""makedirs(name [, mode=0o777][, exist_ok=False])
|
||||
|
||||
Super-mkdir; create a leaf directory and all intermediate ones.
|
||||
Works like mkdir, except that any intermediate path segment (not
|
||||
@ -260,7 +260,7 @@ def makedirs(name, mode=0o777, exist_ok=False):
|
||||
raise
|
||||
|
||||
def removedirs(name):
|
||||
"""removedirs(path)
|
||||
"""removedirs(name)
|
||||
|
||||
Super-rmdir; remove a leaf directory and all empty intermediate
|
||||
ones. Works like rmdir except that, if the leaf directory is
|
||||
|
@ -1165,7 +1165,7 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LINUX_CAN_H
|
||||
#ifdef AF_CAN
|
||||
case AF_CAN:
|
||||
{
|
||||
struct sockaddr_can *a = (struct sockaddr_can *)addr;
|
||||
@ -1589,7 +1589,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LINUX_CAN_H
|
||||
#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
|
||||
case AF_CAN:
|
||||
switch (s->sock_proto) {
|
||||
case CAN_RAW:
|
||||
@ -1796,7 +1796,7 @@ getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LINUX_CAN_H
|
||||
#ifdef AF_CAN
|
||||
case AF_CAN:
|
||||
{
|
||||
*len_ret = sizeof (struct sockaddr_can);
|
||||
|
Loading…
x
Reference in New Issue
Block a user