mirror of
https://github.com/python/cpython.git
synced 2025-08-15 14:20:55 +00:00
Merged revisions 83561,83563,83565-83566,83569,83571,83574-83575,83580,83584,83599,83612,83659,83977,84015-84018,84020,84141 via svnmerge from
svn+ssh://svn.python.org/python/branches/py3k ........ r83561 | georg.brandl | 2010-08-02 22:17:50 +0200 (Mo, 02 Aug 2010) | 1 line #4280: remove outdated "versionchecker" tool. ........ r83563 | georg.brandl | 2010-08-02 22:21:21 +0200 (Mo, 02 Aug 2010) | 1 line #9037: add example how to raise custom exceptions from C code. ........ r83565 | georg.brandl | 2010-08-02 22:27:20 +0200 (Mo, 02 Aug 2010) | 1 line #9111: document that do_help() looks at docstrings. ........ r83566 | georg.brandl | 2010-08-02 22:30:57 +0200 (Mo, 02 Aug 2010) | 1 line #9019: remove false (in 3k) claim about Headers updates. ........ r83569 | georg.brandl | 2010-08-02 22:39:35 +0200 (Mo, 02 Aug 2010) | 1 line #7797: be explicit about bytes-oriented interface of base64 functions. ........ r83571 | georg.brandl | 2010-08-02 22:44:34 +0200 (Mo, 02 Aug 2010) | 1 line Clarify that abs() is not a namespace. ........ r83574 | georg.brandl | 2010-08-02 22:47:56 +0200 (Mo, 02 Aug 2010) | 1 line #6867: epoll.register() returns None. ........ r83575 | georg.brandl | 2010-08-02 22:52:10 +0200 (Mo, 02 Aug 2010) | 1 line #9238: zipfile does handle archive comments. ........ r83580 | georg.brandl | 2010-08-02 23:02:36 +0200 (Mo, 02 Aug 2010) | 1 line #8119: fix copy-paste error. ........ r83584 | georg.brandl | 2010-08-02 23:07:14 +0200 (Mo, 02 Aug 2010) | 1 line #9457: fix documentation links for 3.2. ........ r83599 | georg.brandl | 2010-08-02 23:51:18 +0200 (Mo, 02 Aug 2010) | 1 line #9061: warn that single quotes are never escaped. ........ r83612 | georg.brandl | 2010-08-03 00:59:44 +0200 (Di, 03 Aug 2010) | 1 line Fix unicode literal. ........ r83659 | georg.brandl | 2010-08-03 14:06:29 +0200 (Di, 03 Aug 2010) | 1 line Terminology fix: exceptions are raised, except in generator.throw(). ........ r83977 | georg.brandl | 2010-08-13 17:10:49 +0200 (Fr, 13 Aug 2010) | 1 line Fix copy-paste error. ........ r84015 | georg.brandl | 2010-08-14 17:44:34 +0200 (Sa, 14 Aug 2010) | 1 line Add some maintainers. ........ r84016 | georg.brandl | 2010-08-14 17:46:15 +0200 (Sa, 14 Aug 2010) | 1 line Wording fix. ........ r84017 | georg.brandl | 2010-08-14 17:46:59 +0200 (Sa, 14 Aug 2010) | 1 line Typo fix. ........ r84018 | georg.brandl | 2010-08-14 17:48:49 +0200 (Sa, 14 Aug 2010) | 1 line Typo fix. ........ r84020 | georg.brandl | 2010-08-14 17:57:20 +0200 (Sa, 14 Aug 2010) | 1 line Fix format. ........ r84141 | georg.brandl | 2010-08-17 16:11:59 +0200 (Di, 17 Aug 2010) | 1 line Markup nits. ........
This commit is contained in:
parent
4009c9edfc
commit
13f959b501
32 changed files with 93 additions and 282 deletions
|
@ -959,7 +959,7 @@ Python-level trace functions in previous versions.
|
||||||
.. cvar:: int PyTrace_C_EXCEPTION
|
.. cvar:: int PyTrace_C_EXCEPTION
|
||||||
|
|
||||||
The value for the *what* parameter to :ctype:`Py_tracefunc` functions when a C
|
The value for the *what* parameter to :ctype:`Py_tracefunc` functions when a C
|
||||||
function has thrown an exception.
|
function has raised an exception.
|
||||||
|
|
||||||
|
|
||||||
.. cvar:: int PyTrace_C_RETURN
|
.. cvar:: int PyTrace_C_RETURN
|
||||||
|
|
|
@ -653,7 +653,7 @@ These are the UTF-7 codec APIs:
|
||||||
*s*. Return *NULL* if an exception was raised by the codec.
|
*s*. Return *NULL* if an exception was raised by the codec.
|
||||||
|
|
||||||
|
|
||||||
.. cfunction:: PyObject* PyUnicode_DecodeUTF8Stateful(const char *s, Py_ssize_t size, const char *errors, Py_ssize_t *consumed)
|
.. cfunction:: PyObject* PyUnicode_DecodeUTF7Stateful(const char *s, Py_ssize_t size, const char *errors, Py_ssize_t *consumed)
|
||||||
|
|
||||||
If *consumed* is *NULL*, behave like :cfunc:`PyUnicode_DecodeUTF7`. If
|
If *consumed* is *NULL*, behave like :cfunc:`PyUnicode_DecodeUTF7`. If
|
||||||
*consumed* is not *NULL*, trailing incomplete UTF-7 base-64 sections will not
|
*consumed* is not *NULL*, trailing incomplete UTF-7 base-64 sections will not
|
||||||
|
|
|
@ -219,9 +219,28 @@ needed to ensure that it will not be discarded, causing :cdata:`SpamError` to
|
||||||
become a dangling pointer. Should it become a dangling pointer, C code which
|
become a dangling pointer. Should it become a dangling pointer, C code which
|
||||||
raises the exception could cause a core dump or other unintended side effects.
|
raises the exception could cause a core dump or other unintended side effects.
|
||||||
|
|
||||||
We discuss the use of PyMODINIT_FUNC as a function return type later in this
|
We discuss the use of ``PyMODINIT_FUNC`` as a function return type later in this
|
||||||
sample.
|
sample.
|
||||||
|
|
||||||
|
The :exc:`spam.error` exception can be raised in your extension module using a
|
||||||
|
call to :cfunc:`PyErr_SetString` as shown below::
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
spam_system(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
const char *command;
|
||||||
|
int sts;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "s", &command))
|
||||||
|
return NULL;
|
||||||
|
sts = system(command);
|
||||||
|
if (sts < 0) {
|
||||||
|
PyErr_SetString(SpamError, "System command failed");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return PyLong_FromLong(sts);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.. _backtoexample:
|
.. _backtoexample:
|
||||||
|
|
||||||
|
|
|
@ -674,8 +674,8 @@ Yes. Here's a simple example that uses urllib.request::
|
||||||
'/cgi-bin/some-cgi-script', data=qs)
|
'/cgi-bin/some-cgi-script', data=qs)
|
||||||
msg, hdrs = req.read(), req.info()
|
msg, hdrs = req.read(), req.info()
|
||||||
|
|
||||||
Note that in general for a percent-encoded POST operations, query strings must be
|
Note that in general for percent-encoded POST operations, query strings must be
|
||||||
quoted by using :func:`urllib.parse.urlencode`. For example to send name="Guy Steele,
|
quoted using :func:`urllib.parse.urlencode`. For example to send name="Guy Steele,
|
||||||
Jr."::
|
Jr."::
|
||||||
|
|
||||||
>>> import urllib.parse
|
>>> import urllib.parse
|
||||||
|
|
|
@ -24,7 +24,7 @@ The modern interface provides:
|
||||||
|
|
||||||
.. function:: b64encode(s, altchars=None)
|
.. function:: b64encode(s, altchars=None)
|
||||||
|
|
||||||
Encode a string use Base64.
|
Encode a byte string use Base64.
|
||||||
|
|
||||||
*s* is the string to encode. Optional *altchars* must be a string of at least
|
*s* is the string to encode. Optional *altchars* must be a string of at least
|
||||||
length 2 (additional characters are ignored) which specifies an alternative
|
length 2 (additional characters are ignored) which specifies an alternative
|
||||||
|
@ -32,54 +32,54 @@ The modern interface provides:
|
||||||
generate URL or filesystem safe Base64 strings. The default is ``None``, for
|
generate URL or filesystem safe Base64 strings. The default is ``None``, for
|
||||||
which the standard Base64 alphabet is used.
|
which the standard Base64 alphabet is used.
|
||||||
|
|
||||||
The encoded string is returned.
|
The encoded byte string is returned.
|
||||||
|
|
||||||
|
|
||||||
.. function:: b64decode(s, altchars=None)
|
.. function:: b64decode(s, altchars=None)
|
||||||
|
|
||||||
Decode a Base64 encoded string.
|
Decode a Base64 encoded byte string.
|
||||||
|
|
||||||
*s* is the string to decode. Optional *altchars* must be a string of at least
|
*s* is the string to decode. Optional *altchars* must be a string of at least
|
||||||
length 2 (additional characters are ignored) which specifies the alternative
|
length 2 (additional characters are ignored) which specifies the alternative
|
||||||
alphabet used instead of the ``+`` and ``/`` characters.
|
alphabet used instead of the ``+`` and ``/`` characters.
|
||||||
|
|
||||||
The decoded string is returned. A :exc:`TypeError` is raised if *s* were
|
The decoded byte string is returned. A :exc:`TypeError` is raised if *s* were
|
||||||
incorrectly padded or if there are non-alphabet characters present in the
|
incorrectly padded or if there are non-alphabet characters present in the
|
||||||
string.
|
string.
|
||||||
|
|
||||||
|
|
||||||
.. function:: standard_b64encode(s)
|
.. function:: standard_b64encode(s)
|
||||||
|
|
||||||
Encode string *s* using the standard Base64 alphabet.
|
Encode byte string *s* using the standard Base64 alphabet.
|
||||||
|
|
||||||
|
|
||||||
.. function:: standard_b64decode(s)
|
.. function:: standard_b64decode(s)
|
||||||
|
|
||||||
Decode string *s* using the standard Base64 alphabet.
|
Decode byte string *s* using the standard Base64 alphabet.
|
||||||
|
|
||||||
|
|
||||||
.. function:: urlsafe_b64encode(s)
|
.. function:: urlsafe_b64encode(s)
|
||||||
|
|
||||||
Encode string *s* using a URL-safe alphabet, which substitutes ``-`` instead of
|
Encode byte string *s* using a URL-safe alphabet, which substitutes ``-`` instead of
|
||||||
``+`` and ``_`` instead of ``/`` in the standard Base64 alphabet. The result
|
``+`` and ``_`` instead of ``/`` in the standard Base64 alphabet. The result
|
||||||
can still contain ``=``.
|
can still contain ``=``.
|
||||||
|
|
||||||
|
|
||||||
.. function:: urlsafe_b64decode(s)
|
.. function:: urlsafe_b64decode(s)
|
||||||
|
|
||||||
Decode string *s* using a URL-safe alphabet, which substitutes ``-`` instead of
|
Decode byte string *s* using a URL-safe alphabet, which substitutes ``-`` instead of
|
||||||
``+`` and ``_`` instead of ``/`` in the standard Base64 alphabet.
|
``+`` and ``_`` instead of ``/`` in the standard Base64 alphabet.
|
||||||
|
|
||||||
|
|
||||||
.. function:: b32encode(s)
|
.. function:: b32encode(s)
|
||||||
|
|
||||||
Encode a string using Base32. *s* is the string to encode. The encoded string
|
Encode a byte string using Base32. *s* is the string to encode. The encoded string
|
||||||
is returned.
|
is returned.
|
||||||
|
|
||||||
|
|
||||||
.. function:: b32decode(s, casefold=False, map01=None)
|
.. function:: b32decode(s, casefold=False, map01=None)
|
||||||
|
|
||||||
Decode a Base32 encoded string.
|
Decode a Base32 encoded byte string.
|
||||||
|
|
||||||
*s* is the string to decode. Optional *casefold* is a flag specifying whether a
|
*s* is the string to decode. Optional *casefold* is a flag specifying whether a
|
||||||
lowercase alphabet is acceptable as input. For security purposes, the default
|
lowercase alphabet is acceptable as input. For security purposes, the default
|
||||||
|
@ -92,27 +92,27 @@ The modern interface provides:
|
||||||
digit 0 is always mapped to the letter O). For security purposes the default is
|
digit 0 is always mapped to the letter O). For security purposes the default is
|
||||||
``None``, so that 0 and 1 are not allowed in the input.
|
``None``, so that 0 and 1 are not allowed in the input.
|
||||||
|
|
||||||
The decoded string is returned. A :exc:`TypeError` is raised if *s* were
|
The decoded byte string is returned. A :exc:`TypeError` is raised if *s* were
|
||||||
incorrectly padded or if there are non-alphabet characters present in the
|
incorrectly padded or if there are non-alphabet characters present in the
|
||||||
string.
|
string.
|
||||||
|
|
||||||
|
|
||||||
.. function:: b16encode(s)
|
.. function:: b16encode(s)
|
||||||
|
|
||||||
Encode a string using Base16.
|
Encode a byte string using Base16.
|
||||||
|
|
||||||
*s* is the string to encode. The encoded string is returned.
|
*s* is the string to encode. The encoded byte string is returned.
|
||||||
|
|
||||||
|
|
||||||
.. function:: b16decode(s, casefold=False)
|
.. function:: b16decode(s, casefold=False)
|
||||||
|
|
||||||
Decode a Base16 encoded string.
|
Decode a Base16 encoded byte string.
|
||||||
|
|
||||||
*s* is the string to decode. Optional *casefold* is a flag specifying whether a
|
*s* is the string to decode. Optional *casefold* is a flag specifying whether a
|
||||||
lowercase alphabet is acceptable as input. For security purposes, the default
|
lowercase alphabet is acceptable as input. For security purposes, the default
|
||||||
is ``False``.
|
is ``False``.
|
||||||
|
|
||||||
The decoded string is returned. A :exc:`TypeError` is raised if *s* were
|
The decoded byte string is returned. A :exc:`TypeError` is raised if *s* were
|
||||||
incorrectly padded or if there are non-alphabet characters present in the
|
incorrectly padded or if there are non-alphabet characters present in the
|
||||||
string.
|
string.
|
||||||
|
|
||||||
|
|
|
@ -108,7 +108,7 @@ The :mod:`bdb` module also defines two classes:
|
||||||
* ``"exception"``: An exception has occurred.
|
* ``"exception"``: An exception has occurred.
|
||||||
* ``"c_call"``: A C function is about to be called.
|
* ``"c_call"``: A C function is about to be called.
|
||||||
* ``"c_return"``: A C function has returned.
|
* ``"c_return"``: A C function has returned.
|
||||||
* ``"c_exception"``: A C function has thrown an exception.
|
* ``"c_exception"``: A C function has raised an exception.
|
||||||
|
|
||||||
For the Python events, specialized functions (see below) are called. For
|
For the Python events, specialized functions (see below) are called. For
|
||||||
the C events, no action is taken.
|
the C events, no action is taken.
|
||||||
|
|
|
@ -330,6 +330,10 @@ algorithms implemented in this module in other circumstances.
|
||||||
:func:`~xml.sax.saxutils.quoteattr` function in the :mod:`xml.sax.saxutils`
|
:func:`~xml.sax.saxutils.quoteattr` function in the :mod:`xml.sax.saxutils`
|
||||||
module instead.
|
module instead.
|
||||||
|
|
||||||
|
If the value to be quoted might include single- or double-quote characters,
|
||||||
|
or both, consider using the :func:`quoteattr` function in the
|
||||||
|
:mod:`xml.sax.saxutils` module instead.
|
||||||
|
|
||||||
|
|
||||||
.. _cgi-security:
|
.. _cgi-security:
|
||||||
|
|
||||||
|
|
|
@ -76,11 +76,13 @@ A :class:`Cmd` instance has the following methods:
|
||||||
are the beginning and ending indexes of the prefix text, which could be used to
|
are the beginning and ending indexes of the prefix text, which could be used to
|
||||||
provide different completion depending upon which position the argument is in.
|
provide different completion depending upon which position the argument is in.
|
||||||
|
|
||||||
All subclasses of :class:`Cmd` inherit a predefined :meth:`do_help`. This
|
All subclasses of :class:`Cmd` inherit a predefined :meth:`do_help`. This
|
||||||
method, called with an argument ``'bar'``, invokes the corresponding method
|
method, called with an argument ``'bar'``, invokes the corresponding method
|
||||||
:meth:`help_bar`. With no argument, :meth:`do_help` lists all available help
|
:meth:`help_bar`, and if that is not present, prints the docstring of
|
||||||
topics (that is, all commands with corresponding :meth:`help_\*` methods), and
|
:meth:`do_bar`, if available. With no argument, :meth:`do_help` lists all
|
||||||
also lists any undocumented commands.
|
available help topics (that is, all commands with corresponding
|
||||||
|
:meth:`help_\*` methods or commands that have docstrings), and also lists any
|
||||||
|
undocumented commands.
|
||||||
|
|
||||||
|
|
||||||
.. method:: Cmd.onecmd(str)
|
.. method:: Cmd.onecmd(str)
|
||||||
|
|
|
@ -1657,7 +1657,7 @@ There are two exceptions that may be raised by :class:`DebugRunner` instances:
|
||||||
|
|
||||||
.. exception:: DocTestFailure(test, example, got)
|
.. exception:: DocTestFailure(test, example, got)
|
||||||
|
|
||||||
An exception thrown by :class:`DocTestRunner` to signal that a doctest example's
|
An exception raised by :class:`DocTestRunner` to signal that a doctest example's
|
||||||
actual output did not match its expected output. The constructor arguments are
|
actual output did not match its expected output. The constructor arguments are
|
||||||
used to initialize the member variables of the same names.
|
used to initialize the member variables of the same names.
|
||||||
|
|
||||||
|
@ -1681,9 +1681,9 @@ There are two exceptions that may be raised by :class:`DebugRunner` instances:
|
||||||
|
|
||||||
.. exception:: UnexpectedException(test, example, exc_info)
|
.. exception:: UnexpectedException(test, example, exc_info)
|
||||||
|
|
||||||
An exception thrown by :class:`DocTestRunner` to signal that a doctest example
|
An exception raised by :class:`DocTestRunner` to signal that a doctest
|
||||||
raised an unexpected exception. The constructor arguments are used to
|
example raised an unexpected exception. The constructor arguments are used
|
||||||
initialize the member variables of the same names.
|
to initialize the member variables of the same names.
|
||||||
|
|
||||||
:exc:`UnexpectedException` defines the following member variables:
|
:exc:`UnexpectedException` defines the following member variables:
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ The following exception classes are defined in the :mod:`email.errors` module:
|
||||||
|
|
||||||
.. exception:: MessageParseError()
|
.. exception:: MessageParseError()
|
||||||
|
|
||||||
This is the base class for exceptions thrown by the :class:`~email.parser.Parser`
|
This is the base class for exceptions raised by the :class:`~email.parser.Parser`
|
||||||
class. It is derived from :exc:`MessageError`.
|
class. It is derived from :exc:`MessageError`.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -145,7 +145,7 @@ An exception is defined as well:
|
||||||
Method called when an unrecognized SGML declaration is read by the parser.
|
Method called when an unrecognized SGML declaration is read by the parser.
|
||||||
The *data* parameter will be the entire contents of the declaration inside
|
The *data* parameter will be the entire contents of the declaration inside
|
||||||
the ``<!...>`` markup. It is sometimes useful to be be overridden by a
|
the ``<!...>`` markup. It is sometimes useful to be be overridden by a
|
||||||
derived class; the base class implementation throws an :exc:`HTMLParseError`.
|
derived class; the base class implementation raises an :exc:`HTMLParseError`.
|
||||||
|
|
||||||
|
|
||||||
.. method:: HTMLParser.handle_pi(data)
|
.. method:: HTMLParser.handle_pi(data)
|
||||||
|
|
|
@ -16,7 +16,7 @@ The :mod:`linecache` module defines the following functions:
|
||||||
|
|
||||||
.. function:: getline(filename, lineno, module_globals=None)
|
.. function:: getline(filename, lineno, module_globals=None)
|
||||||
|
|
||||||
Get line *lineno* from file named *filename*. This function will never throw an
|
Get line *lineno* from file named *filename*. This function will never raise an
|
||||||
exception --- it will return ``''`` on errors (the terminating newline character
|
exception --- it will return ``''`` on errors (the terminating newline character
|
||||||
will be included for lines that are found).
|
will be included for lines that are found).
|
||||||
|
|
||||||
|
|
|
@ -165,7 +165,7 @@ To map anonymous memory, -1 should be passed as the fileno along with the length
|
||||||
|
|
||||||
Copy the *count* bytes starting at offset *src* to the destination index
|
Copy the *count* bytes starting at offset *src* to the destination index
|
||||||
*dest*. If the mmap was created with :const:`ACCESS_READ`, then calls to
|
*dest*. If the mmap was created with :const:`ACCESS_READ`, then calls to
|
||||||
move will throw a :exc:`TypeError` exception.
|
move will raise a :exc:`TypeError` exception.
|
||||||
|
|
||||||
|
|
||||||
.. method:: read(num)
|
.. method:: read(num)
|
||||||
|
@ -191,7 +191,7 @@ To map anonymous memory, -1 should be passed as the fileno along with the length
|
||||||
|
|
||||||
Resizes the map and the underlying file, if any. If the mmap was created
|
Resizes the map and the underlying file, if any. If the mmap was created
|
||||||
with :const:`ACCESS_READ` or :const:`ACCESS_COPY`, resizing the map will
|
with :const:`ACCESS_READ` or :const:`ACCESS_COPY`, resizing the map will
|
||||||
throw a :exc:`TypeError` exception.
|
raise a :exc:`TypeError` exception.
|
||||||
|
|
||||||
|
|
||||||
.. method:: rfind(sub[, start[, end]])
|
.. method:: rfind(sub[, start[, end]])
|
||||||
|
@ -226,7 +226,7 @@ To map anonymous memory, -1 should be passed as the fileno along with the length
|
||||||
Write the bytes in *bytes* into memory at the current position of the
|
Write the bytes in *bytes* into memory at the current position of the
|
||||||
file pointer; the file position is updated to point after the bytes that
|
file pointer; the file position is updated to point after the bytes that
|
||||||
were written. If the mmap was created with :const:`ACCESS_READ`, then
|
were written. If the mmap was created with :const:`ACCESS_READ`, then
|
||||||
writing to it will throw a :exc:`TypeError` exception.
|
writing to it will raise a :exc:`TypeError` exception.
|
||||||
|
|
||||||
|
|
||||||
.. method:: write_byte(byte)
|
.. method:: write_byte(byte)
|
||||||
|
@ -234,6 +234,4 @@ To map anonymous memory, -1 should be passed as the fileno along with the length
|
||||||
Write the the integer *byte* into memory at the current
|
Write the the integer *byte* into memory at the current
|
||||||
position of the file pointer; the file position is advanced by ``1``. If
|
position of the file pointer; the file position is advanced by ``1``. If
|
||||||
the mmap was created with :const:`ACCESS_READ`, then writing to it will
|
the mmap was created with :const:`ACCESS_READ`, then writing to it will
|
||||||
throw a :exc:`TypeError` exception.
|
raise a :exc:`TypeError` exception.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -115,7 +115,7 @@ and ``'exec'`` forms.
|
||||||
The :func:`expr` function parses the parameter *source* as if it were an input
|
The :func:`expr` function parses the parameter *source* as if it were an input
|
||||||
to ``compile(source, 'file.py', 'eval')``. If the parse succeeds, an ST object
|
to ``compile(source, 'file.py', 'eval')``. If the parse succeeds, an ST object
|
||||||
is created to hold the internal parse tree representation, otherwise an
|
is created to hold the internal parse tree representation, otherwise an
|
||||||
appropriate exception is thrown.
|
appropriate exception is raised.
|
||||||
|
|
||||||
|
|
||||||
.. function:: suite(source)
|
.. function:: suite(source)
|
||||||
|
@ -123,7 +123,7 @@ and ``'exec'`` forms.
|
||||||
The :func:`suite` function parses the parameter *source* as if it were an input
|
The :func:`suite` function parses the parameter *source* as if it were an input
|
||||||
to ``compile(source, 'file.py', 'exec')``. If the parse succeeds, an ST object
|
to ``compile(source, 'file.py', 'exec')``. If the parse succeeds, an ST object
|
||||||
is created to hold the internal parse tree representation, otherwise an
|
is created to hold the internal parse tree representation, otherwise an
|
||||||
appropriate exception is thrown.
|
appropriate exception is raised.
|
||||||
|
|
||||||
|
|
||||||
.. function:: sequence2st(sequence)
|
.. function:: sequence2st(sequence)
|
||||||
|
@ -133,9 +133,9 @@ and ``'exec'`` forms.
|
||||||
to the Python grammar and all nodes are valid node types in the host version of
|
to the Python grammar and all nodes are valid node types in the host version of
|
||||||
Python, an ST object is created from the internal representation and returned
|
Python, an ST object is created from the internal representation and returned
|
||||||
to the called. If there is a problem creating the internal representation, or
|
to the called. If there is a problem creating the internal representation, or
|
||||||
if the tree cannot be validated, a :exc:`ParserError` exception is thrown. An
|
if the tree cannot be validated, a :exc:`ParserError` exception is raised. An
|
||||||
ST object created this way should not be assumed to compile correctly; normal
|
ST object created this way should not be assumed to compile correctly; normal
|
||||||
exceptions thrown by compilation may still be initiated when the ST object is
|
exceptions raised by compilation may still be initiated when the ST object is
|
||||||
passed to :func:`compilest`. This may indicate problems not related to syntax
|
passed to :func:`compilest`. This may indicate problems not related to syntax
|
||||||
(such as a :exc:`MemoryError` exception), but may also be due to constructs such
|
(such as a :exc:`MemoryError` exception), but may also be due to constructs such
|
||||||
as the result of parsing ``del f(0)``, which escapes the Python parser but is
|
as the result of parsing ``del f(0)``, which escapes the Python parser but is
|
||||||
|
@ -260,8 +260,8 @@ function for information about the exceptions it can raise.
|
||||||
.. exception:: ParserError
|
.. exception:: ParserError
|
||||||
|
|
||||||
Exception raised when a failure occurs within the parser module. This is
|
Exception raised when a failure occurs within the parser module. This is
|
||||||
generally produced for validation failures rather than the built in
|
generally produced for validation failures rather than the built-in
|
||||||
:exc:`SyntaxError` thrown during normal parsing. The exception argument is
|
:exc:`SyntaxError` raised during normal parsing. The exception argument is
|
||||||
either a string describing the reason of the failure or a tuple containing a
|
either a string describing the reason of the failure or a tuple containing a
|
||||||
sequence causing the failure from a parse tree passed to :func:`sequence2st`
|
sequence causing the failure from a parse tree passed to :func:`sequence2st`
|
||||||
and an explanatory string. Calls to :func:`sequence2st` need to be able to
|
and an explanatory string. Calls to :func:`sequence2st` need to be able to
|
||||||
|
@ -269,7 +269,7 @@ function for information about the exceptions it can raise.
|
||||||
will only need to be aware of the simple string values.
|
will only need to be aware of the simple string values.
|
||||||
|
|
||||||
Note that the functions :func:`compilest`, :func:`expr`, and :func:`suite` may
|
Note that the functions :func:`compilest`, :func:`expr`, and :func:`suite` may
|
||||||
throw exceptions which are normally thrown by the parsing and compilation
|
raise exceptions which are normally thrown by the parsing and compilation
|
||||||
process. These include the built in exceptions :exc:`MemoryError`,
|
process. These include the built in exceptions :exc:`MemoryError`,
|
||||||
:exc:`OverflowError`, :exc:`SyntaxError`, and :exc:`SystemError`. In these
|
:exc:`OverflowError`, :exc:`SyntaxError`, and :exc:`SystemError`. In these
|
||||||
cases, these exceptions carry all the meaning normally associated with them.
|
cases, these exceptions carry all the meaning normally associated with them.
|
||||||
|
|
|
@ -430,7 +430,7 @@ otherwise stated.
|
||||||
Called if the XML document hasn't been declared as being a standalone document.
|
Called if the XML document hasn't been declared as being a standalone document.
|
||||||
This happens when there is an external subset or a reference to a parameter
|
This happens when there is an external subset or a reference to a parameter
|
||||||
entity, but the XML declaration does not set standalone to ``yes`` in an XML
|
entity, but the XML declaration does not set standalone to ``yes`` in an XML
|
||||||
declaration. If this handler returns ``0``, then the parser will throw an
|
declaration. If this handler returns ``0``, then the parser will raise an
|
||||||
:const:`XML_ERROR_NOT_STANDALONE` error. If this handler is not set, no
|
:const:`XML_ERROR_NOT_STANDALONE` error. If this handler is not set, no
|
||||||
exception is raised by the parser for this condition.
|
exception is raised by the parser for this condition.
|
||||||
|
|
||||||
|
@ -447,7 +447,7 @@ otherwise stated.
|
||||||
responsible for creating the sub-parser using
|
responsible for creating the sub-parser using
|
||||||
``ExternalEntityParserCreate(context)``, initializing it with the appropriate
|
``ExternalEntityParserCreate(context)``, initializing it with the appropriate
|
||||||
callbacks, and parsing the entity. This handler should return an integer; if it
|
callbacks, and parsing the entity. This handler should return an integer; if it
|
||||||
returns ``0``, the parser will throw an
|
returns ``0``, the parser will raise an
|
||||||
:const:`XML_ERROR_EXTERNAL_ENTITY_HANDLING` error, otherwise parsing will
|
:const:`XML_ERROR_EXTERNAL_ENTITY_HANDLING` error, otherwise parsing will
|
||||||
continue.
|
continue.
|
||||||
|
|
||||||
|
|
|
@ -285,9 +285,9 @@ An :class:`SMTP` instance has the following methods:
|
||||||
and ESMTP options suppressed.
|
and ESMTP options suppressed.
|
||||||
|
|
||||||
This method will return normally if the mail is accepted for at least one
|
This method will return normally if the mail is accepted for at least one
|
||||||
recipient. Otherwise it will throw an exception. That is, if this method does
|
recipient. Otherwise it will raise an exception. That is, if this method does
|
||||||
not throw an exception, then someone should get your mail. If this method does
|
not raise an exception, then someone should get your mail. If this method does
|
||||||
not throw an exception, it returns a dictionary, with one entry for each
|
not raise an exception, it returns a dictionary, with one entry for each
|
||||||
recipient that was refused. Each entry contains a tuple of the SMTP error code
|
recipient that was refused. Each entry contains a tuple of the SMTP error code
|
||||||
and the accompanying error message sent by the server.
|
and the accompanying error message sent by the server.
|
||||||
|
|
||||||
|
|
|
@ -163,7 +163,7 @@ implementation as the built-in :meth:`format` method.
|
||||||
the format string (integers for positional arguments, and strings for
|
the format string (integers for positional arguments, and strings for
|
||||||
named arguments), and a reference to the *args* and *kwargs* that was
|
named arguments), and a reference to the *args* and *kwargs* that was
|
||||||
passed to vformat. The set of unused args can be calculated from these
|
passed to vformat. The set of unused args can be calculated from these
|
||||||
parameters. :meth:`check_unused_args` is assumed to throw an exception if
|
parameters. :meth:`check_unused_args` is assumed to raise an exception if
|
||||||
the check fails.
|
the check fails.
|
||||||
|
|
||||||
.. method:: format_field(value, format_spec)
|
.. method:: format_field(value, format_spec)
|
||||||
|
|
|
@ -762,7 +762,7 @@ always available.
|
||||||
A C function has returned. *arg* is ``None``.
|
A C function has returned. *arg* is ``None``.
|
||||||
|
|
||||||
``'c_exception'``
|
``'c_exception'``
|
||||||
A C function has thrown an exception. *arg* is ``None``.
|
A C function has raised an exception. *arg* is ``None``.
|
||||||
|
|
||||||
Note that as an exception is propagated down the chain of callers, an
|
Note that as an exception is propagated down the chain of callers, an
|
||||||
``'exception'`` event is generated at each level.
|
``'exception'`` event is generated at each level.
|
||||||
|
|
|
@ -48,11 +48,11 @@ The :mod:`urllib.parse` module defines the following functions:
|
||||||
>>> o.geturl()
|
>>> o.geturl()
|
||||||
'http://www.cwi.nl:80/%7Eguido/Python.html'
|
'http://www.cwi.nl:80/%7Eguido/Python.html'
|
||||||
|
|
||||||
If the scheme value is not specified, urlparse following the syntax
|
If the scheme value is not specified, urlparse expects the netloc value to
|
||||||
specifications from RFC 1808, expects the netloc value to start with '//',
|
start with '//', following the syntax specifications from :rfc:`1808`.
|
||||||
Otherwise, it is not possible to distinguish between net_loc and path
|
Otherwise, it is not possible to distinguish between netloc and path
|
||||||
component and would classify the indistinguishable component as path as in
|
components, and would the indistinguishable component would be classified
|
||||||
a relative url.
|
as the path as in a relative URL.
|
||||||
|
|
||||||
>>> from urlparse import urlparse
|
>>> from urlparse import urlparse
|
||||||
>>> urlparse('//www.cwi.nl:80/%7Eguido/Python.html')
|
>>> urlparse('//www.cwi.nl:80/%7Eguido/Python.html')
|
||||||
|
|
|
@ -187,9 +187,7 @@ manipulation of WSGI response headers using a mapping-like interface.
|
||||||
.. class:: Headers(headers)
|
.. class:: Headers(headers)
|
||||||
|
|
||||||
Create a mapping-like object wrapping *headers*, which must be a list of header
|
Create a mapping-like object wrapping *headers*, which must be a list of header
|
||||||
name/value tuples as described in :pep:`333`. Any changes made to the new
|
name/value tuples as described in :pep:`333`.
|
||||||
:class:`Headers` object will directly update the *headers* list it was created
|
|
||||||
with.
|
|
||||||
|
|
||||||
:class:`Headers` objects support typical mapping operations including
|
:class:`Headers` objects support typical mapping operations including
|
||||||
:meth:`__getitem__`, :meth:`get`, :meth:`__setitem__`, :meth:`setdefault`,
|
:meth:`__getitem__`, :meth:`get`, :meth:`__setitem__`, :meth:`setdefault`,
|
||||||
|
|
|
@ -154,7 +154,7 @@ The :class:`XMLReader` interface supports the following methods:
|
||||||
Allow an application to set the locale for errors and warnings.
|
Allow an application to set the locale for errors and warnings.
|
||||||
|
|
||||||
SAX parsers are not required to provide localization for errors and warnings; if
|
SAX parsers are not required to provide localization for errors and warnings; if
|
||||||
they cannot support the requested locale, however, they must throw a SAX
|
they cannot support the requested locale, however, they must raise a SAX
|
||||||
exception. Applications may request a locale change in the middle of a parse.
|
exception. Applications may request a locale change in the middle of a parse.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -12,10 +12,8 @@ advanced use of this module will require an understanding of the format, as
|
||||||
defined in `PKZIP Application Note
|
defined in `PKZIP Application Note
|
||||||
<http://www.pkware.com/documents/casestudies/APPNOTE.TXT>`_.
|
<http://www.pkware.com/documents/casestudies/APPNOTE.TXT>`_.
|
||||||
|
|
||||||
This module does not currently handle multi-disk ZIP files, or ZIP files
|
This module does not currently handle multi-disk ZIP files.
|
||||||
which have appended comments (although it correctly handles comments
|
It can handle ZIP files that use the ZIP64 extensions
|
||||||
added to individual archive members---for which see the :ref:`zipinfo-objects`
|
|
||||||
documentation). It can handle ZIP files that use the ZIP64 extensions
|
|
||||||
(that is ZIP files that are more than 4 GByte in size). It supports
|
(that is ZIP files that are more than 4 GByte in size). It supports
|
||||||
decryption of encrypted files in ZIP archives, but it currently cannot
|
decryption of encrypted files in ZIP archives, but it currently cannot
|
||||||
create an encrypted file. Decryption is extremely slow as it is
|
create an encrypted file. Decryption is extremely slow as it is
|
||||||
|
@ -64,7 +62,6 @@ The module defines the following items:
|
||||||
|
|
||||||
Returns ``True`` if *filename* is a valid ZIP file based on its magic number,
|
Returns ``True`` if *filename* is a valid ZIP file based on its magic number,
|
||||||
otherwise returns ``False``. *filename* may be a file or file-like object too.
|
otherwise returns ``False``. *filename* may be a file or file-like object too.
|
||||||
This module does not currently handle ZIP files which have appended comments.
|
|
||||||
|
|
||||||
.. versionchanged:: 3.1
|
.. versionchanged:: 3.1
|
||||||
Support for file and file-like objects.
|
Support for file and file-like objects.
|
||||||
|
|
|
@ -65,7 +65,7 @@ Let's begin with some definitions.
|
||||||
A *namespace* is a mapping from names to objects. Most namespaces are currently
|
A *namespace* is a mapping from names to objects. Most namespaces are currently
|
||||||
implemented as Python dictionaries, but that's normally not noticeable in any
|
implemented as Python dictionaries, but that's normally not noticeable in any
|
||||||
way (except for performance), and it may change in the future. Examples of
|
way (except for performance), and it may change in the future. Examples of
|
||||||
namespaces are: the set of built-in names (functions such as :func:`abs`, and
|
namespaces are: the set of built-in names (containing functions such as :func:`abs`, and
|
||||||
built-in exception names); the global names in a module; and the local names in
|
built-in exception names); the global names in a module; and the local names in
|
||||||
a function invocation. In a sense the set of attributes of an object also form
|
a function invocation. In a sense the set of attributes of an object also form
|
||||||
a namespace. The important thing to know about namespaces is that there is
|
a namespace. The important thing to know about namespaces is that there is
|
||||||
|
|
|
@ -1066,7 +1066,7 @@ complete list of changes, or look through the CVS logs for all the details.
|
||||||
deprecated APIs and removes support for Python versions earlier than 2.3. The
|
deprecated APIs and removes support for Python versions earlier than 2.3. The
|
||||||
3.0 version of the package uses a new incremental parser for MIME messages,
|
3.0 version of the package uses a new incremental parser for MIME messages,
|
||||||
available in the :mod:`email.FeedParser` module. The new parser doesn't require
|
available in the :mod:`email.FeedParser` module. The new parser doesn't require
|
||||||
reading the entire message into memory, and doesn't throw exceptions if a
|
reading the entire message into memory, and doesn't raise exceptions if a
|
||||||
message is malformed; instead it records any problems in the :attr:`defect`
|
message is malformed; instead it records any problems in the :attr:`defect`
|
||||||
attribute of the message. (Developed by Anthony Baxter, Barry Warsaw, Thomas
|
attribute of the message. (Developed by Anthony Baxter, Barry Warsaw, Thomas
|
||||||
Wouters, and others.)
|
Wouters, and others.)
|
||||||
|
|
|
@ -915,10 +915,9 @@ pyepoll_register(pyEpoll_Object *self, PyObject *args, PyObject *kwds)
|
||||||
}
|
}
|
||||||
|
|
||||||
PyDoc_STRVAR(pyepoll_register_doc,
|
PyDoc_STRVAR(pyepoll_register_doc,
|
||||||
"register(fd[, eventmask]) -> bool\n\
|
"register(fd[, eventmask]) -> None\n\
|
||||||
\n\
|
\n\
|
||||||
Registers a new fd or modifies an already registered fd. register() returns\n\
|
Registers a new fd or modifies an already registered fd.\n\
|
||||||
True if a new fd was registered or False if the event mask for fd was modified.\n\
|
|
||||||
fd is the target file descriptor of the operation.\n\
|
fd is the target file descriptor of the operation.\n\
|
||||||
events is a bit set composed of the various EPOLL constants; the default\n\
|
events is a bit set composed of the various EPOLL constants; the default\n\
|
||||||
is EPOLL_IN | EPOLL_OUT | EPOLL_PRI.\n\
|
is EPOLL_IN | EPOLL_OUT | EPOLL_PRI.\n\
|
||||||
|
|
6
README
6
README
|
@ -55,7 +55,7 @@ What's New
|
||||||
We try to have a comprehensive overview of the changes in the "What's New in
|
We try to have a comprehensive overview of the changes in the "What's New in
|
||||||
Python 3.1" document, found at
|
Python 3.1" document, found at
|
||||||
|
|
||||||
http://docs.python.org/dev/3.1/whatsnew/3.1.html
|
http://docs.python.org/3.1/whatsnew/3.1.html
|
||||||
|
|
||||||
For a more detailed change log, read Misc/NEWS (though this file, too,
|
For a more detailed change log, read Misc/NEWS (though this file, too,
|
||||||
is incomplete, and also doesn't list anything merged in from the 2.7
|
is incomplete, and also doesn't list anything merged in from the 2.7
|
||||||
|
@ -70,7 +70,7 @@ Documentation
|
||||||
|
|
||||||
Documentation for Python 3.1 is online, updated twice a day:
|
Documentation for Python 3.1 is online, updated twice a day:
|
||||||
|
|
||||||
http://docs.python.org/dev/3.1/
|
http://docs.python.org/3.1/
|
||||||
|
|
||||||
All documentation is also available online at the Python web site
|
All documentation is also available online at the Python web site
|
||||||
(http://docs.python.org/, see below). It is available online for
|
(http://docs.python.org/, see below). It is available online for
|
||||||
|
@ -91,7 +91,7 @@ used, and backported versions of certain key Python 3.x features.
|
||||||
A source-to-source translation tool, "2to3", can take care of the mundane task
|
A source-to-source translation tool, "2to3", can take care of the mundane task
|
||||||
of converting large amounts of source code. It is not a complete solution but
|
of converting large amounts of source code. It is not a complete solution but
|
||||||
is complemented by the deprecation warnings in 2.6. See
|
is complemented by the deprecation warnings in 2.6. See
|
||||||
http://docs.python.org/dev/py3k/library/2to3.html for more information.
|
http://docs.python.org/py3k/library/2to3.html for more information.
|
||||||
|
|
||||||
|
|
||||||
Testing
|
Testing
|
||||||
|
|
|
@ -15,7 +15,7 @@ import winreg
|
||||||
HKCU = winreg.HKEY_CURRENT_USER
|
HKCU = winreg.HKEY_CURRENT_USER
|
||||||
ENV = "Environment"
|
ENV = "Environment"
|
||||||
PATH = "PATH"
|
PATH = "PATH"
|
||||||
DEFAULT = u"%PATH%"
|
DEFAULT = "%PATH%"
|
||||||
|
|
||||||
def modify():
|
def modify():
|
||||||
pythonpath = os.path.dirname(os.path.normpath(sys.executable))
|
pythonpath = os.path.dirname(os.path.normpath(sys.executable))
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
This is versioncheck 1.0, a first stab at automatic checking of versions of
|
|
||||||
Python extension packages installed on your system.
|
|
||||||
|
|
||||||
The basic idea is that each package contains a _checkversion.py
|
|
||||||
somewhere, probably at the root level of the package. In addition, each
|
|
||||||
package maintainer makes a file available on the net, through ftp or
|
|
||||||
http, which contains the version number of the most recent distribution
|
|
||||||
and some readable text explaining the differences with previous
|
|
||||||
versions, where to download the package, etc.
|
|
||||||
|
|
||||||
The checkversions.py script walks through the installed Python tree (or
|
|
||||||
through a tree of choice), and runs each _checkversion.py script. These
|
|
||||||
scripts retrieve the current-version file over the net, compares version
|
|
||||||
numbers and tells the user about new versions of packages available.
|
|
||||||
|
|
||||||
A boilerplate for the _checkversion.py file can be found here. Replace
|
|
||||||
package name, version and the URL of the version-check file and put it in
|
|
||||||
your distribution. In stead of a single URL you can also specify a list
|
|
||||||
of URLs. Each of these will be checked in order until one is available,
|
|
||||||
this is handy for distributions that live in multiple places. Put the
|
|
||||||
primary distribution site (the most up-to-date site) before others.
|
|
||||||
The script is read and executed with exec(), not imported, and the current
|
|
||||||
directory is the checkversion directory, so be careful with globals,
|
|
||||||
importing, etc.
|
|
||||||
|
|
||||||
The version-check file consists of an rfc822-style header followed by
|
|
||||||
plaintext. The only header field checked currently is
|
|
||||||
'Current-Version:', which should contain te current version and is
|
|
||||||
matched against the string contained in the _checkversion.py script.
|
|
||||||
The rest of the file is human-readable text and presented to the user if
|
|
||||||
there is a version mismatch. It should contain at the very least a URL
|
|
||||||
of either the current distribution or a webpage describing it.
|
|
||||||
|
|
||||||
Pycheckversion.py is the module that does the actual checking of versions.
|
|
||||||
It should be fine where it is, it is imported by checkversion before anything
|
|
||||||
else is done, but if imports fail you may want to move it to somewhere
|
|
||||||
along sys.path.
|
|
||||||
|
|
||||||
Jack Jansen, CWI, 23-Dec-97.
|
|
||||||
<jack@cwi.nl>
|
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
"""This file (which is sourced, not imported) checks the version of the
|
|
||||||
"versioncheck" package. It is also an example of how to format your own
|
|
||||||
_checkversion.py file"""
|
|
||||||
|
|
||||||
import pyversioncheck
|
|
||||||
|
|
||||||
_PACKAGE="versioncheck"
|
|
||||||
_VERSION="1.0"
|
|
||||||
_URL="http://www.cwi.nl/~jack/versioncheck/curversion.txt"
|
|
||||||
|
|
||||||
try:
|
|
||||||
_myverbose=VERBOSE
|
|
||||||
except NameError:
|
|
||||||
_myverbose=1
|
|
||||||
|
|
||||||
pyversioncheck.versioncheck(_PACKAGE, _URL, _VERSION, verbose=_myverbose)
|
|
|
@ -1,52 +0,0 @@
|
||||||
"""Checkversions - recursively search a directory (default: sys.prefix)
|
|
||||||
for _checkversion.py files, and run each of them. This will tell you of
|
|
||||||
new versions available for any packages you have installed."""
|
|
||||||
|
|
||||||
import os
|
|
||||||
import getopt
|
|
||||||
import sys
|
|
||||||
import pyversioncheck
|
|
||||||
|
|
||||||
CHECKNAME="_checkversion.py"
|
|
||||||
|
|
||||||
VERBOSE=1
|
|
||||||
|
|
||||||
USAGE="""Usage: checkversions [-v verboselevel] [dir ...]
|
|
||||||
Recursively examine a tree (default: sys.prefix) and for each package
|
|
||||||
with a _checkversion.py file compare the installed version against the current
|
|
||||||
version.
|
|
||||||
|
|
||||||
Values for verboselevel:
|
|
||||||
0 - Minimal output, one line per package
|
|
||||||
1 - Also print descriptions for outdated packages (default)
|
|
||||||
2 - Print information on each URL checked
|
|
||||||
3 - Check every URL for packages with multiple locations"""
|
|
||||||
|
|
||||||
def check1dir(dummy, dir, files):
|
|
||||||
if CHECKNAME in files:
|
|
||||||
fullname = os.path.join(dir, CHECKNAME)
|
|
||||||
try:
|
|
||||||
exec(open(fullname).read())
|
|
||||||
except:
|
|
||||||
print('** Exception in', fullname)
|
|
||||||
|
|
||||||
def walk1tree(tree):
|
|
||||||
os.walk(tree, check1dir, None)
|
|
||||||
|
|
||||||
def main():
|
|
||||||
global VERBOSE
|
|
||||||
try:
|
|
||||||
options, arguments = getopt.getopt(sys.argv[1:], 'v:')
|
|
||||||
except getopt.error:
|
|
||||||
print(USAGE)
|
|
||||||
sys.exit(1)
|
|
||||||
for o, a in options:
|
|
||||||
if o == '-v':
|
|
||||||
VERBOSE = int(a)
|
|
||||||
if not arguments:
|
|
||||||
arguments = [sys.prefix]
|
|
||||||
for dir in arguments:
|
|
||||||
walk1tree(dir)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
|
@ -1,97 +0,0 @@
|
||||||
"""pyversioncheck - Module to help with checking versions"""
|
|
||||||
import urllib.request
|
|
||||||
import email
|
|
||||||
import sys
|
|
||||||
|
|
||||||
# Verbose options
|
|
||||||
VERBOSE_SILENT=0 # Single-line reports per package
|
|
||||||
VERBOSE_NORMAL=1 # Single-line reports per package, more info if outdated
|
|
||||||
VERBOSE_EACHFILE=2 # Report on each URL checked
|
|
||||||
VERBOSE_CHECKALL=3 # Check each URL for each package
|
|
||||||
|
|
||||||
# Test directory
|
|
||||||
## urllib bug: _TESTDIR="ftp://ftp.cwi.nl/pub/jack/python/versiontestdir/"
|
|
||||||
_TESTDIR="http://www.cwi.nl/~jack/versiontestdir/"
|
|
||||||
|
|
||||||
def versioncheck(package, url, version, verbose=0):
|
|
||||||
ok, newversion, fp = checkonly(package, url, version, verbose)
|
|
||||||
if verbose > VERBOSE_NORMAL:
|
|
||||||
return ok
|
|
||||||
if ok < 0:
|
|
||||||
print('%s: No correctly formatted current version file found'%(package))
|
|
||||||
elif ok == 1:
|
|
||||||
print('%s: up-to-date (version %s)'%(package, version))
|
|
||||||
else:
|
|
||||||
print('%s: version %s installed, version %s found:' % \
|
|
||||||
(package, version, newversion))
|
|
||||||
if verbose > VERBOSE_SILENT:
|
|
||||||
while 1:
|
|
||||||
line = fp.readline()
|
|
||||||
if not line: break
|
|
||||||
sys.stdout.write('\t'+line)
|
|
||||||
return ok
|
|
||||||
|
|
||||||
def checkonly(package, url, version, verbose=0):
|
|
||||||
if verbose >= VERBOSE_EACHFILE:
|
|
||||||
print('%s:'%package)
|
|
||||||
if isinstance(url, str):
|
|
||||||
ok, newversion, fp = _check1version(package, url, version, verbose)
|
|
||||||
else:
|
|
||||||
for u in url:
|
|
||||||
ok, newversion, fp = _check1version(package, u, version, verbose)
|
|
||||||
if ok >= 0 and verbose < VERBOSE_CHECKALL:
|
|
||||||
break
|
|
||||||
return ok, newversion, fp
|
|
||||||
|
|
||||||
def _check1version(package, url, version, verbose=0):
|
|
||||||
if verbose >= VERBOSE_EACHFILE:
|
|
||||||
print(' Checking %s'%url)
|
|
||||||
try:
|
|
||||||
fp = urllib.request.urlopen(url)
|
|
||||||
except IOError as arg:
|
|
||||||
if verbose >= VERBOSE_EACHFILE:
|
|
||||||
print(' Cannot open:', arg)
|
|
||||||
return -1, None, None
|
|
||||||
msg = email.message_from_file(fp)
|
|
||||||
newversion = msg.get('current-version')
|
|
||||||
if not newversion:
|
|
||||||
if verbose >= VERBOSE_EACHFILE:
|
|
||||||
print(' No "Current-Version:" header in URL or URL not found')
|
|
||||||
return -1, None, None
|
|
||||||
version = version.lower().strip()
|
|
||||||
newversion = newversion.lower().strip()
|
|
||||||
if version == newversion:
|
|
||||||
if verbose >= VERBOSE_EACHFILE:
|
|
||||||
print(' Version identical (%s)'%newversion)
|
|
||||||
return 1, version, fp
|
|
||||||
else:
|
|
||||||
if verbose >= VERBOSE_EACHFILE:
|
|
||||||
print(' Versions different (installed: %s, new: %s)'% \
|
|
||||||
(version, newversion))
|
|
||||||
return 0, newversion, fp
|
|
||||||
|
|
||||||
|
|
||||||
def _test():
|
|
||||||
print('--- TEST VERBOSE=1')
|
|
||||||
print('--- Testing existing and identical version file')
|
|
||||||
versioncheck('VersionTestPackage', _TESTDIR+'Version10.txt', '1.0', verbose=1)
|
|
||||||
print('--- Testing existing package with new version')
|
|
||||||
versioncheck('VersionTestPackage', _TESTDIR+'Version11.txt', '1.0', verbose=1)
|
|
||||||
print('--- Testing package with non-existing version file')
|
|
||||||
versioncheck('VersionTestPackage', _TESTDIR+'nonexistent.txt', '1.0', verbose=1)
|
|
||||||
print('--- Test package with 2 locations, first non-existing second ok')
|
|
||||||
versfiles = [_TESTDIR+'nonexistent.txt', _TESTDIR+'Version10.txt']
|
|
||||||
versioncheck('VersionTestPackage', versfiles, '1.0', verbose=1)
|
|
||||||
print('--- TEST VERBOSE=2')
|
|
||||||
print('--- Testing existing and identical version file')
|
|
||||||
versioncheck('VersionTestPackage', _TESTDIR+'Version10.txt', '1.0', verbose=2)
|
|
||||||
print('--- Testing existing package with new version')
|
|
||||||
versioncheck('VersionTestPackage', _TESTDIR+'Version11.txt', '1.0', verbose=2)
|
|
||||||
print('--- Testing package with non-existing version file')
|
|
||||||
versioncheck('VersionTestPackage', _TESTDIR+'nonexistent.txt', '1.0', verbose=2)
|
|
||||||
print('--- Test package with 2 locations, first non-existing second ok')
|
|
||||||
versfiles = [_TESTDIR+'nonexistent.txt', _TESTDIR+'Version10.txt']
|
|
||||||
versioncheck('VersionTestPackage', versfiles, '1.0', verbose=2)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
_test()
|
|
|
@ -2463,7 +2463,7 @@ then
|
||||||
fi
|
fi
|
||||||
AC_MSG_RESULT($with_doc_strings)
|
AC_MSG_RESULT($with_doc_strings)
|
||||||
|
|
||||||
# Check for Python-specific malloc support
|
# Check if eval loop should use timestamp counter profiling
|
||||||
AC_MSG_CHECKING(for --with-tsc)
|
AC_MSG_CHECKING(for --with-tsc)
|
||||||
AC_ARG_WITH(tsc,
|
AC_ARG_WITH(tsc,
|
||||||
[ --with(out)-tsc enable/disable timestamp counter profile], [
|
[ --with(out)-tsc enable/disable timestamp counter profile], [
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue