]> granicus.if.org Git - python/commitdiff
Merged revisions 72319-72320,72467,72661,72675-72679,72703,72708,72710,72712,72801...
authorGeorg Brandl <georg@python.org>
Tue, 26 May 2009 09:04:23 +0000 (09:04 +0000)
committerGeorg Brandl <georg@python.org>
Tue, 26 May 2009 09:04:23 +0000 (09:04 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r72319 | georg.brandl | 2009-05-05 10:28:49 +0200 (Di, 05 Mai 2009) | 1 line

  #1309567: fix linecache behavior of stripping subdirectories from paths when looking for relative filename matches. Also add a linecache test suite.
........
  r72320 | georg.brandl | 2009-05-05 10:30:28 +0200 (Di, 05 Mai 2009) | 1 line

  Add a news entry for r72319.
........
  r72467 | georg.brandl | 2009-05-08 14:17:34 +0200 (Fr, 08 Mai 2009) | 1 line

  Fix name.
........
  r72661 | georg.brandl | 2009-05-15 10:03:03 +0200 (Fr, 15 Mai 2009) | 1 line

  Fix example output for doctest-like demos.
........
  r72675 | georg.brandl | 2009-05-16 13:13:21 +0200 (Sa, 16 Mai 2009) | 1 line

  #6034: clarify __reversed__ doc.
........
  r72676 | georg.brandl | 2009-05-16 13:14:46 +0200 (Sa, 16 Mai 2009) | 1 line

  #6025: fix signature of parse().
........
  r72677 | georg.brandl | 2009-05-16 13:18:55 +0200 (Sa, 16 Mai 2009) | 1 line

  #6009: undocument default argument of Option as deprecated.
........
  r72678 | georg.brandl | 2009-05-16 13:21:29 +0200 (Sa, 16 Mai 2009) | 1 line

  #2856: document 2.x os.listdir() behavior for undecodable filenames.
........
  r72679 | georg.brandl | 2009-05-16 13:24:41 +0200 (Sa, 16 Mai 2009) | 1 line

  Fix about and bugs pages to match real workflow.
........
  r72703 | georg.brandl | 2009-05-17 10:10:27 +0200 (So, 17 Mai 2009) | 1 line

  part of #4144: fix exception message in console session.
........
  r72708 | georg.brandl | 2009-05-17 10:24:29 +0200 (So, 17 Mai 2009) | 1 line

  #6017: better document behavior of dictiterators when the dict is changed.
........
  r72710 | georg.brandl | 2009-05-17 10:36:04 +0200 (So, 17 Mai 2009) | 1 line

  #5942: Copy over flag table from dbm.rst which is clearer.
........
  r72712 | georg.brandl | 2009-05-17 10:55:00 +0200 (So, 17 Mai 2009) | 1 line

  #5935: mention that BROWSER is looked for in PATH.
........
  r72801 | georg.brandl | 2009-05-20 20:31:14 +0200 (Mi, 20 Mai 2009) | 1 line

  #6055: refer to "sqlite3" consistently.
........
  r72802 | georg.brandl | 2009-05-20 20:35:27 +0200 (Mi, 20 Mai 2009) | 1 line

  #6051: refer to email examples for better way to construct email messages.
........
  r72820 | georg.brandl | 2009-05-22 09:23:32 +0200 (Fr, 22 Mai 2009) | 1 line

  Use raise X(y).
........
  r72822 | georg.brandl | 2009-05-22 11:33:25 +0200 (Fr, 22 Mai 2009) | 1 line

  #6084: fix example.
........
  r72824 | georg.brandl | 2009-05-22 11:43:17 +0200 (Fr, 22 Mai 2009) | 1 line

  Fix references to file-related functions and methods (os.* vs file.*).
........
  r72826 | georg.brandl | 2009-05-22 11:49:42 +0200 (Fr, 22 Mai 2009) | 1 line

  Fix confusing wording.
........
  r72827 | georg.brandl | 2009-05-22 11:50:30 +0200 (Fr, 22 Mai 2009) | 1 line

  s/use/call/
........
  r72828 | georg.brandl | 2009-05-22 11:58:48 +0200 (Fr, 22 Mai 2009) | 1 line

  Correction in softspace behavior description.
........
  r72830 | georg.brandl | 2009-05-22 12:40:00 +0200 (Fr, 22 Mai 2009) | 1 line

  #6086: fix spelling and use a better exception to catch.
........

24 files changed:
Doc/about.rst
Doc/bugs.rst
Doc/howto/doanddont.rst
Doc/howto/urllib2.rst
Doc/includes/sqlite3/text_factory.py
Doc/library/anydbm.rst
Doc/library/ctypes.rst
Doc/library/email-examples.rst
Doc/library/functions.rst
Doc/library/optparse.rst
Doc/library/os.rst
Doc/library/shelve.rst
Doc/library/smtplib.rst
Doc/library/sqlite3.rst
Doc/library/stdtypes.rst
Doc/library/webbrowser.rst
Doc/library/xml.dom.minidom.rst
Doc/reference/datamodel.rst
Doc/reference/simple_stmts.rst
Doc/tutorial/errors.rst
Doc/tutorial/introduction.rst
Lib/linecache.py
Lib/test/test_linecache.py [new file with mode: 0644]
Misc/NEWS

index a5adf07da8eb95308c2d4c7c4b40781d6efd12bf..9483ca5347c84d30444b90ea73e46384375b44c3 100644 (file)
@@ -7,8 +7,8 @@ These documents are generated from `reStructuredText
 <http://docutils.sf.net/rst.html>`_ sources by *Sphinx*, a document processor
 specifically written for the Python documentation.
 
-In the online version of these documents, you can submit comments and suggest
-changes directly on the documentation pages.
+.. In the online version of these documents, you can submit comments and suggest
+   changes directly on the documentation pages.
 
 Development of the documentation and its toolchain takes place on the
 docs@python.org mailing list.  We're always looking for volunteers wanting
@@ -24,7 +24,8 @@ Many thanks go to:
   <http://effbot.org/zone/pyref.htm>`_ project from which Sphinx got many good
   ideas.
 
-See :ref:`reporting-bugs` for information how to report bugs in Python itself.
+See :ref:`reporting-bugs` for information how to report bugs in this
+documentation, or Python itself.
 
 .. including the ACKS file here so that it can be maintained separately
 .. include:: ACKS.txt
index 9c6e5247292c3a9973002babdcb6f5ced396af24..dc7d388bcc3d74c3cb62b9bbcc2395522d0d4fd2 100644 (file)
@@ -19,6 +19,9 @@ the problem has already been fixed for the next release, or additional
 information is needed (in which case you are welcome to provide it if you can!).
 To do this, search the bug database using the search box on the top of the page.
 
+In the case of documentation bugs, look at the most recent development docs at
+http://docs.python.org/dev to see if the bug has been fixed.
+
 If the problem you're reporting is not already in the bug tracker, go back to
 the Python Bug Tracker.  If you don't already have a tracker account, select the
 "Register" link in the sidebar and undergo the registration procedure.
index a56fb8c13e87dfbf98d926b66bf87d7471065459..eee576596ffe1fd5ee41acd7e0c046071e7617c7 100644 (file)
@@ -30,7 +30,7 @@ Inside Function Definitions
 
 ``from module import *`` is *invalid* inside function definitions. While many
 versions of Python do not check for the invalidity, it does not make it more
-valid, no more then having a smart lawyer makes a man innocent. Do not use it
+valid, no more than having a smart lawyer makes a man innocent. Do not use it
 like that ever. Even in versions where it was accepted, it made the function
 execution slower, because the compiler could not be certain which names are
 local and which are global. In Python 2.1 this construct causes warnings, and
@@ -111,7 +111,7 @@ Good examples::
 from module import name1, name2
 -------------------------------
 
-This is a "don't" which is much weaker then the previous "don't"s but is still
+This is a "don't" which is much weaker than the previous "don't"s but is still
 something you should not do if you don't have good reasons to do that. The
 reason it is usually bad idea is because you suddenly have an object which lives
 in two separate namespaces. When the binding in one namespace changes, the
@@ -245,11 +245,11 @@ Using the Batteries
 Every so often, people seem to be writing stuff in the Python library again,
 usually poorly. While the occasional module has a poor interface, it is usually
 much better to use the rich standard library and data types that come with
-Python then inventing your own.
+Python than inventing your own.
 
 A useful module very few people know about is :mod:`os.path`. It  always has the
 correct path arithmetic for your operating system, and will usually be much
-better then whatever you come up with yourself.
+better than whatever you come up with yourself.
 
 Compare::
 
@@ -284,7 +284,7 @@ Using Backslash to Continue Statements
 ======================================
 
 Since Python treats a newline as a statement terminator, and since statements
-are often more then is comfortable to put in one line, many people do::
+are often more than is comfortable to put in one line, many people do::
 
    if foo.bar()['first'][0] == baz.quux(1, 2)[5:9] and \
       calculate_number(10, 20) != forbulate(500, 360):
index 96f2ce204538abfea13ae35e64707f2db07ec28d..629c38d8f6c326f3cfde453fdd1b3cbc9f9d2ae7 100644 (file)
@@ -311,7 +311,7 @@ geturl, and info, methods. ::
     >>> req = urllib2.Request('http://www.python.org/fish.html')
     >>> try:
     >>>     urllib2.urlopen(req)
-    >>> except URLError, e:
+    >>> except HTTPError, e:
     >>>     print e.code
     >>>     print e.read()
     >>>
index 3e157a8ea9f72f669ee4ad10d6e109d426a9c5eb..94a59da4b78b9d037c7cdd0df9299718a9d6d091 100644 (file)
@@ -13,7 +13,7 @@ cur.execute("select ?", (AUSTRIA,))
 row = cur.fetchone()
 assert row[0] == AUSTRIA
 
-# but we can make pysqlite always return bytestrings ...
+# but we can make sqlite3 always return bytestrings ...
 con.text_factory = str
 cur.execute("select ?", (AUSTRIA,))
 row = cur.fetchone()
@@ -26,11 +26,12 @@ assert row[0] == AUSTRIA.encode("utf-8")
 # here we implement one that will ignore Unicode characters that cannot be
 # decoded from UTF-8
 con.text_factory = lambda x: unicode(x, "utf-8", "ignore")
-cur.execute("select ?", ("this is latin1 and would normally create errors" + u"\xe4\xf6\xfc".encode("latin1"),))
+cur.execute("select ?", ("this is latin1 and would normally create errors" +
+                         u"\xe4\xf6\xfc".encode("latin1"),))
 row = cur.fetchone()
 assert type(row[0]) == unicode
 
-# pysqlite offers a builtin optimized text_factory that will return bytestring
+# sqlite3 offers a builtin optimized text_factory that will return bytestring
 # objects, if the data is in ASCII only, and otherwise return unicode objects
 con.text_factory = sqlite3.OptimizedUnicode
 cur.execute("select ?", (AUSTRIA,))
index 36f0a7e6be6612fde01a7776d2fdf40329c6947b..aad17764e34a59bde5e6633b6599c20e27e4c0d7 100644 (file)
@@ -27,19 +27,33 @@ these modules is installed, the slow-but-simple implementation in module
 
    Open the database file *filename* and return a corresponding object.
 
-   If the database file already exists, the :mod:`whichdb` module is  used to
-   determine its type and the appropriate module is used; if it does not exist, the
-   first module listed above that can be imported is used.
-
-   The optional *flag* argument can be ``'r'`` to open an existing database for
-   reading only, ``'w'`` to open an existing database for reading and writing,
-   ``'c'`` to create the database if it doesn't exist, or ``'n'``, which will
-   always create a new empty database.  If not specified, the default value is
-   ``'r'``.
+   If the database file already exists, the :mod:`whichdb` module is used to
+   determine its type and the appropriate module is used; if it does not exist,
+   the first module listed above that can be imported is used.
+
+   The optional *flag* argument must be one of these values:
+
+   +---------+-------------------------------------------+
+   | Value   | Meaning                                   |
+   +=========+===========================================+
+   | ``'r'`` | Open existing database for reading only   |
+   |         | (default)                                 |
+   +---------+-------------------------------------------+
+   | ``'w'`` | Open existing database for reading and    |
+   |         | writing                                   |
+   +---------+-------------------------------------------+
+   | ``'c'`` | Open database for reading and writing,    |
+   |         | creating it if it doesn't exist           |
+   +---------+-------------------------------------------+
+   | ``'n'`` | Always create a new, empty database, open |
+   |         | for reading and writing                   |
+   +---------+-------------------------------------------+
+
+   If not specified, the default value is ``'r'``.
 
    The optional *mode* argument is the Unix mode of the file, used only when the
-   database has to be created.  It defaults to octal ``0666`` (and will be modified
-   by the prevailing umask).
+   database has to be created.  It defaults to octal ``0666`` (and will be
+   modified by the prevailing umask).
 
 
 .. exception:: error
index c7c3b008bddd330a718e4339bb114e5bb31714d8..5da4c9d22e30569631b838bf580cfad017a6a71a 100644 (file)
@@ -341,9 +341,9 @@ within *IDLE* or *PythonWin*::
    >>> printf("Hello, %s\n", "World!")
    Hello, World!
    14
-   >>> printf("Hello, %S", u"World!")
+   >>> printf("Hello, %S\n", u"World!")
    Hello, World!
-   13
+   14
    >>> printf("%d bottles of beer\n", 42)
    42 bottles of beer
    19
@@ -358,7 +358,7 @@ unicode strings have to be wrapped in their corresponding ``ctypes`` type, so
 that they can be converted to the required C data type::
 
    >>> printf("An int %d, a double %f\n", 1234, c_double(3.14))
-   Integer 1234, double 3.1400001049
+   An int 1234, a double 3.140000
    31
    >>>
 
@@ -414,9 +414,9 @@ prototype for a C function), and tries to convert the arguments to valid types::
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    ArgumentError: argument 2: exceptions.TypeError: wrong type
-   >>> printf("%s %d %f", "X", 2, 3)
-   X 2 3.00000012
-   12
+   >>> printf("%s %d %f\n", "X", 2, 3)
+   X 2 3.000000
+   13
    >>>
 
 If you have defined your own classes which you pass to function calls, you have
index f606f9bb3b52585d54dfe7d2554cd440c33d4cd3..c1b16da39471c5b9a5389d3266946585fb2fc48a 100644 (file)
@@ -1,3 +1,5 @@
+.. _email-examples:
+
 :mod:`email`: Examples
 ----------------------
 
index b989e8ebfb9b02e90769b37b9b6de30b875e3d0c..9764eae373ac42748cc466d10270d5f1a7bb7cf2 100644 (file)
@@ -1398,7 +1398,7 @@ available.  They are listed here in alphabetical order.
       >>> zipped
       [(1, 4), (2, 5), (3, 6)]
       >>> x2, y2 = zip(*zipped)
-      >>> x == x2, y == y2
+      >>> x == list(x2) and y == list(y2)
       True
 
    .. versionadded:: 2.0
@@ -1468,7 +1468,7 @@ available.  They are listed here in alphabetical order.
    names.
 
    If you simply want to import a module (potentially within a package) by name,
-   you can get it from :data:`sys.modules`::
+   you can call :func:`__import__` and then look it up in :data:`sys.modules`::
 
       >>> import sys
       >>> name = 'foo.bar.baz'
index 4ef2ba7eb8409d962c2e57dba363c0ce6166993d..a07a7512e4f81b54f59ea6520d3ca48c27c8e991 100644 (file)
@@ -1077,10 +1077,10 @@ to a particular option, or fail to pass a required option attribute,
   tells :mod:`optparse` where to write it: :attr:`dest` names an attribute of the
   ``options`` object that :mod:`optparse` builds as it parses the command line.
 
-* ``default`` (deprecated)
+* ``default``
 
   The value to use for this option's destination if the option is not seen on the
-  command line.  Deprecated; use ``parser.set_defaults()`` instead.
+  command line.  See also ``parser.set_defaults()``.
 
 * ``nargs`` (default: 1)
 
index 4d8fc4c3f9cedeb28e0c1e3c9d56ef45e7e617bc..357b37eaf1bd2dafb091718c0f23ff7512f7cd1f 100644 (file)
@@ -354,7 +354,7 @@ These functions create new file objects. (See also :func:`open`.)
    is ``'r'`` (default) or ``'w'``. The *bufsize* argument has the same meaning as
    the corresponding argument to the built-in :func:`open` function.  The exit
    status of the command (encoded in the format specified for :func:`wait`) is
-   available as the return value of the :meth:`close` method of the file object,
+   available as the return value of the :meth:`~file.close` method of the file object,
    except that when the exit status is zero (termination without errors), ``None``
    is returned. Availability: Unix, Windows.
 
@@ -475,9 +475,9 @@ by file descriptors.
    .. note::
 
       This function is intended for low-level I/O and must be applied to a file
-      descriptor as returned by :func:`open` or :func:`pipe`.  To close a "file
+      descriptor as returned by :func:`os.open` or :func:`pipe`.  To close a "file
       object" returned by the built-in function :func:`open` or by :func:`popen` or
-      :func:`fdopen`, use its :meth:`close` method.
+      :func:`fdopen`, use its :meth:`~file.close` method.
 
 
 .. function:: closerange(fd_low, fd_high)
@@ -604,8 +604,8 @@ by file descriptors.
    .. note::
 
       This function is intended for low-level I/O.  For normal usage, use the built-in
-      function :func:`open`, which returns a "file object" with :meth:`read` and
-      :meth:`write` methods (and many more).  To wrap a file descriptor in a "file
+      function :func:`open`, which returns a "file object" with :meth:`~file.read` and
+      :meth:`~file.write` methods (and many more).  To wrap a file descriptor in a "file
       object", use :func:`fdopen`.
 
 
@@ -634,22 +634,22 @@ by file descriptors.
    .. note::
 
       This function is intended for low-level I/O and must be applied to a file
-      descriptor as returned by :func:`open` or :func:`pipe`.  To read a "file object"
+      descriptor as returned by :func:`os.open` or :func:`pipe`.  To read a "file object"
       returned by the built-in function :func:`open` or by :func:`popen` or
-      :func:`fdopen`, or :data:`sys.stdin`, use its :meth:`read` or :meth:`readline`
-      methods.
+      :func:`fdopen`, or :data:`sys.stdin`, use its :meth:`~file.read` or
+      :meth:`~file.readline` methods.
 
 
 .. function:: tcgetpgrp(fd)
 
    Return the process group associated with the terminal given by *fd* (an open
-   file descriptor as returned by :func:`open`). Availability: Unix.
+   file descriptor as returned by :func:`os.open`). Availability: Unix.
 
 
 .. function:: tcsetpgrp(fd, pg)
 
    Set the process group associated with the terminal given by *fd* (an open file
-   descriptor as returned by :func:`open`) to *pg*. Availability: Unix.
+   descriptor as returned by :func:`os.open`) to *pg*. Availability: Unix.
 
 
 .. function:: ttyname(fd)
@@ -667,13 +667,13 @@ by file descriptors.
    .. note::
 
       This function is intended for low-level I/O and must be applied to a file
-      descriptor as returned by :func:`open` or :func:`pipe`.  To write a "file
+      descriptor as returned by :func:`os.open` or :func:`pipe`.  To write a "file
       object" returned by the built-in function :func:`open` or by :func:`popen` or
-      :func:`fdopen`, or :data:`sys.stdout` or :data:`sys.stderr`, use its :meth:`write`
-      method.
+      :func:`fdopen`, or :data:`sys.stdout` or :data:`sys.stderr`, use its
+      :meth:`~file.write` method.
 
 The following constants are options for the *flags* parameter to the
-:func:`open` function.  They can be combined using the bitwise OR operator
+:func:`~os.open` function.  They can be combined using the bitwise OR operator
 ``|``.  Some of them are not available on all platforms.  For descriptions of
 their availability and use, consult the :manpage:`open(2)` manual page on Unix
 or `the MSDN <http://msdn.microsoft.com/en-us/library/z0kc8e3z.aspx>` on Windows.
@@ -752,7 +752,7 @@ Files and Directories
    .. note::
 
       Using :func:`access` to check if a user is authorized to e.g. open a file before
-      actually doing so using :func:`open` creates a  security hole, because the user
+      actually doing so using :func:`open` creates a security hole, because the user
       might exploit the short time interval  between checking and opening the file to
       manipulate it.
 
@@ -929,7 +929,8 @@ Files and Directories
 
    .. versionchanged:: 2.3
       On Windows NT/2k/XP and Unix, if *path* is a Unicode object, the result will be
-      a list of Unicode objects.
+      a list of Unicode objects. Undecodable filenames will still be returned as
+      string objects.
 
 
 .. function:: lstat(path)
index 56cb40710a32b15ae1c6d2120167094c4436ce2c..4e18ab155c4909c03bf5dedbd7347dd42816474d 100644 (file)
@@ -1,4 +1,3 @@
-
 :mod:`shelve` --- Python object persistence
 ===========================================
 
@@ -40,7 +39,7 @@ lots of shared  sub-objects.  The keys are ordinary strings.
    entries are written back (there is no way to determine which accessed
    entries are mutable, nor which ones were actually mutated).
 
-Shelve objects support all methods supported by dictionaries.  This eases the
+Shelf objects support all methods supported by dictionaries.  This eases the
 transition from dictionary based scripts to those requiring persistent storage.
 
 One additional method is supported:
index 8facc9a6d81137a95258f1af361fe2b58e643758..4c1c61407777285210abe90dfda26044a9b78e54 100644 (file)
@@ -380,3 +380,8 @@ example doesn't do any processing of the :rfc:`822` headers.  In particular, the
    server.sendmail(fromaddr, toaddrs, msg)
    server.quit()
 
+.. note::
+
+   In general, you will want to use the :mod:`email` package's features to
+   construct an email message, which you can then convert to a string and send
+   via :meth:`sendmail`; see :ref:`email-examples`.
index d031c909755cf9ee09b66fcf06f280d767e145ef..392a130abf6f0ba1e87ea5802ecac24c16c9c08e 100644 (file)
@@ -15,7 +15,7 @@ SQLite for internal data storage.  It's also possible to prototype an
 application using SQLite and then port the code to a larger database such as
 PostgreSQL or Oracle.
 
-pysqlite was written by Gerhard Häring and provides a SQL interface compliant
+sqlite3 was written by Gerhard Häring and provides a SQL interface compliant
 with the DB-API 2.0 specification described by :pep:`249`.
 
 To use the module, you must first create a :class:`Connection` object that
@@ -52,8 +52,9 @@ is insecure; it makes your program vulnerable to an SQL injection attack.
 
 Instead, use the DB-API's parameter substitution.  Put ``?`` as a placeholder
 wherever you want to use a value, and then provide a tuple of values as the
-second argument to the cursor's :meth:`~Cursor.execute` method.  (Other database modules
-may use a different placeholder, such as ``%s`` or ``:1``.) For example::
+second argument to the cursor's :meth:`~Cursor.execute` method.  (Other database
+modules may use a different placeholder, such as ``%s`` or ``:1``.) For
+example::
 
    # Never do this -- insecure!
    symbol = 'IBM'
@@ -92,11 +93,12 @@ This example uses the iterator form::
 .. seealso::
 
    http://www.pysqlite.org
-      The pysqlite web page.
+      The pysqlite web page -- sqlite3 is developed externally under the name
+      "pysqlite".
 
    http://www.sqlite.org
-      The SQLite web page; the documentation describes the syntax and the available
-      data types for the supported SQL dialect.
+      The SQLite web page; the documentation describes the syntax and the
+      available data types for the supported SQL dialect.
 
    :pep:`249` - Database API Specification 2.0
       PEP written by Marc-André Lemburg.
@@ -802,10 +804,10 @@ So if you are within a transaction and issue a command like ``CREATE TABLE
 ...``, ``VACUUM``, ``PRAGMA``, the :mod:`sqlite3` module will commit implicitly
 before executing that command. There are two reasons for doing that. The first
 is that some of these commands don't work within transactions. The other reason
-is that pysqlite needs to keep track of the transaction state (if a transaction
+is that sqlite3 needs to keep track of the transaction state (if a transaction
 is active or not).
 
-You can control which kind of ``BEGIN`` statements pysqlite implicitly executes
+You can control which kind of ``BEGIN`` statements sqlite3 implicitly executes
 (or none at all) via the *isolation_level* parameter to the :func:`connect`
 call, or via the :attr:`isolation_level` property of connections.
 
@@ -817,8 +819,8 @@ statement, or set it to one of SQLite's supported isolation levels: "DEFERRED",
 
 
 
-Using pysqlite efficiently
---------------------------
+Using :mod:`sqlite3` efficiently
+--------------------------------
 
 
 Using shortcut methods
index 56b63128cd630f22179fee5bbf2a30d9ad0aac70..7013f150d58d6de426203c4944c297482b53faa4 100644 (file)
@@ -1955,7 +1955,7 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098:
       note for :meth:`dict.items`.
 
       Using :meth:`iteritems` while adding or deleting entries in the dictionary
-      will raise a :exc:`RuntimeError`.
+      may raise a :exc:`RuntimeError` or fail to iterate over all entries.
 
       .. versionadded:: 2.2
 
@@ -1965,7 +1965,7 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098:
       :meth:`dict.items`.
 
       Using :meth:`iterkeys` while adding or deleting entries in the dictionary
-      will raise a :exc:`RuntimeError`.
+      may raise a :exc:`RuntimeError` or fail to iterate over all entries.
 
       .. versionadded:: 2.2
 
@@ -1975,7 +1975,8 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098:
       :meth:`dict.items`.
 
       Using :meth:`itervalues` while adding or deleting entries in the
-      dictionary will raise a :exc:`RuntimeError`.
+      dictionary may raise a :exc:`RuntimeError` or fail to iterate over all
+      entries.
 
       .. versionadded:: 2.2
 
index 56aba5a038e588213b7c612db61a3df7cf352387..fc0a004daef2b500bce3895c6cd375023fb067de 100644 (file)
@@ -22,7 +22,7 @@ override the platform default list of browsers, as a os.pathsep-separated list
 of browsers to try in order.  When the value of a list part contains the string
 ``%s``, then it is  interpreted as a literal browser command line to be used
 with the argument URL substituted for ``%s``; if the part does not contain
-``%s``, it is simply interpreted as the name of the browser to launch.
+``%s``, it is simply interpreted as the name of the browser to launch. [1]_
 
 For non-Unix platforms, or when a remote browser is available on Unix, the
 controlling process will not wait for the user to finish with the browser, but
@@ -201,3 +201,8 @@ convenience functions:
 
    .. versionadded:: 2.5
 
+
+.. rubric:: Footnotes
+
+.. [1] Executables named here without a full path will be searched in the
+       directories given in the :envvar:`PATH` environment variable.
index b127f0468e71a224edd46bcc71fd79ee9fd05aea..cb49c023fa45f162412bd0723ae7cd621308c4e4 100644 (file)
@@ -30,7 +30,7 @@ DOM applications typically start by parsing some XML into a DOM.  With
 The :func:`parse` function can take either a filename or an open file object.
 
 
-.. function:: parse(filename_or_file, parser)
+.. function:: parse(filename_or_file[, parser[, bufsize]])
 
    Return a :class:`Document` from the given input. *filename_or_file* may be
    either a file name, or a file-like object. *parser*, if given, must be a SAX2
index 7d5b7beff842995ea9ef6a68afcf251bc75deaa8..ea0f8692130746a376c719a51da9b864bc2875ce 100644 (file)
@@ -1858,11 +1858,11 @@ sequences, it should iterate through the values.
    reverse iteration.  It should return a new iterator object that iterates
    over all the objects in the container in reverse order.
 
-   If the :meth:`__reversed__` method is not provided, the
-   :func:`reversed` builtin will fall back to using the sequence protocol
-   (:meth:`__len__` and :meth:`__getitem__`).  Objects should normally
-   only provide :meth:`__reversed__` if they do not support the sequence
-   protocol and an efficient implementation of reverse iteration is possible.
+   If the :meth:`__reversed__` method is not provided, the :func:`reversed`
+   builtin will fall back to using the sequence protocol (:meth:`__len__` and
+   :meth:`__getitem__`).  Objects that support the sequence protocol should
+   only provide :meth:`__reversed__` if they can provide an implementation
+   that is more efficient than the one provided by :func:`reversed`.
 
    .. versionadded:: 2.6
 
index beb4623bf2f69a9a5a4fd145aba32708ac121e77..020c893f021323c1fca1a88223d94f583a79cce5 100644 (file)
@@ -386,9 +386,10 @@ first converted to a string using the rules for string conversions.  The
 object is (converted and) written, unless the output system believes it is
 positioned at the beginning of a line.  This is the case (1) when no characters
 have yet been written to standard output, (2) when the last character written to
-standard output is ``'\n'``, or (3) when the last write operation on standard
-output was not a :keyword:`print` statement.  (In some cases it may be
-functional to write an empty string to standard output for this reason.)
+standard output is a whitespace character except ``' '``, or (3) when the last
+write operation on standard output was not a :keyword:`print` statement.
+(In some cases it may be functional to write an empty string to standard output
+for this reason.)
 
 .. note::
 
index e1d988ccd6f0b725bd3e40059903e35869a4e65c..ebec952648a206b1e97510e2c61407efa00e3268 100644 (file)
@@ -216,7 +216,7 @@ Raising Exceptions
 The :keyword:`raise` statement allows the programmer to force a specified
 exception to occur. For example::
 
-   >>> raise NameError, 'HiThere'
+   >>> raise NameError('HiThere')
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    NameError: HiThere
@@ -231,7 +231,7 @@ handle it, a simpler form of the :keyword:`raise` statement allows you to
 re-raise the exception::
 
    >>> try:
-   ...     raise NameError, 'HiThere'
+   ...     raise NameError('HiThere')
    ... except NameError:
    ...     print 'An exception flew by!'
    ...     raise
@@ -263,7 +263,7 @@ directly or indirectly.  For example::
    ...     print 'My exception occurred, value:', e.value
    ...
    My exception occurred, value: 4
-   >>> raise MyError, 'oops!'
+   >>> raise MyError('oops!')
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    __main__.MyError: 'oops!'
index 21d36276574741c45f78f36c1782640c5357e4b9..23ff5229e9c72fbe067264465d00604d6b5ec877 100644 (file)
@@ -285,11 +285,11 @@ position in the string results in an error::
    >>> word[0] = 'x'
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
-   TypeError: object doesn't support item assignment
+   TypeError: object does not support item assignment
    >>> word[:1] = 'Splat'
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
-   TypeError: object doesn't support slice assignment
+   TypeError: object does not support slice assignment
 
 However, creating a new string with the combined content is easy and efficient::
 
index 48f7dda6e0a518b330c2b4146da0903d48c75662..e7c33e1464fb918dd72f182eb96fb33e65affc18 100644 (file)
@@ -79,7 +79,7 @@ def updatecache(filename, module_globals=None):
     try:
         stat = os.stat(fullname)
     except os.error, msg:
-        basename = os.path.split(filename)[1]
+        basename = filename
 
         # Try for a __loader__, if available
         if module_globals and '__loader__' in module_globals:
@@ -103,7 +103,10 @@ def updatecache(filename, module_globals=None):
                     )
                     return cache[filename][2]
 
-        # Try looking through the module search path.
+        # Try looking through the module search path, which is only useful
+        # when handling a relative filename.
+        if os.path.isabs(filename):
+            return []
 
         for dirname in sys.path:
             # When using imputil, sys.path may contain things other than
diff --git a/Lib/test/test_linecache.py b/Lib/test/test_linecache.py
new file mode 100644 (file)
index 0000000..2894bb4
--- /dev/null
@@ -0,0 +1,129 @@
+""" Tests for the linecache module """
+
+import linecache
+import unittest
+import os.path
+from test import test_support as support
+
+
+FILENAME = linecache.__file__
+INVALID_NAME = '!@$)(!@#_1'
+EMPTY = ''
+TESTS = 'cjkencodings_test inspect_fodder inspect_fodder2 mapping_tests'
+TESTS = TESTS.split()
+TEST_PATH = os.path.dirname(support.__file__)
+MODULES = "linecache unittest".split()
+MODULE_PATH = os.path.dirname(FILENAME)
+
+SOURCE_1 = '''
+" Docstring "
+
+def function():
+    return result
+
+'''
+
+SOURCE_2 = '''
+def f():
+    return 1 + 1
+
+a = f()
+
+'''
+
+class LineCacheTests(unittest.TestCase):
+
+    def test_getline(self):
+        getline = linecache.getline
+
+        # Bad values for line number should return an empty string
+        self.assertEquals(getline(FILENAME, 2**15), EMPTY)
+        self.assertEquals(getline(FILENAME, -1), EMPTY)
+
+        # Float values currently raise TypeError, should it?
+        self.assertRaises(TypeError, getline, FILENAME, 1.1)
+
+        # Bad filenames should return an empty string
+        self.assertEquals(getline(EMPTY, 1), EMPTY)
+        self.assertEquals(getline(INVALID_NAME, 1), EMPTY)
+
+        # Check whether lines correspond to those from file iteration
+        for entry in TESTS:
+            filename = os.path.join(TEST_PATH, entry) + '.py'
+            for index, line in enumerate(open(filename)):
+                self.assertEquals(line, getline(filename, index + 1))
+
+        # Check module loading
+        for entry in MODULES:
+            filename = os.path.join(MODULE_PATH, entry) + '.py'
+            for index, line in enumerate(open(filename)):
+                self.assertEquals(line, getline(filename, index + 1))
+
+        # Check that bogus data isn't returned (issue #1309567)
+        empty = linecache.getlines('a/b/c/__init__.py')
+        self.assertEquals(empty, [])
+
+    def test_clearcache(self):
+        cached = []
+        for entry in TESTS:
+            filename = os.path.join(TEST_PATH, entry) + '.py'
+            cached.append(filename)
+            linecache.getline(filename, 1)
+
+        # Are all files cached?
+        cached_empty = [fn for fn in cached if fn not in linecache.cache]
+        self.assertEquals(cached_empty, [])
+
+        # Can we clear the cache?
+        linecache.clearcache()
+        cached_empty = [fn for fn in cached if fn in linecache.cache]
+        self.assertEquals(cached_empty, [])
+
+    def test_checkcache(self):
+        getline = linecache.getline
+        try:
+            # Create a source file and cache its contents
+            source_name = os.path.join(TEST_PATH, 'linecache_test.py')
+            source = open(source_name, 'w')
+            source.write(SOURCE_1)
+            source.close()
+            getline(source_name, 1)
+
+            # Keep a copy of the old contents
+            source_list = []
+            source = open(source_name)
+            for index, line in enumerate(source):
+                self.assertEquals(line, getline(source_name, index + 1))
+                source_list.append(line)
+            source.close()
+
+            source = open(source_name, 'w')
+            source.write(SOURCE_2)
+            source.close()
+
+            # Try to update a bogus cache entry
+            linecache.checkcache('dummy')
+
+            # Check that the cache matches the old contents
+            for index, line in enumerate(source_list):
+                self.assertEquals(line, getline(source_name, index + 1))
+
+            # Update the cache and check whether it matches the new source file
+            linecache.checkcache(source_name)
+            source = open(source_name)
+            for index, line in enumerate(source):
+                self.assertEquals(line, getline(source_name, index + 1))
+                source_list.append(line)
+            source.close()
+
+        finally:
+            try:
+                source.close()
+            finally:
+                support.unlink(source_name)
+
+def test_main():
+    support.run_unittest(LineCacheTests)
+
+if __name__ == "__main__":
+    test_main()
index 1c03d701dfec0cffad8d0a8462397eac2b57c7b7..6efa49d6bdb4fe442837290c629f2ac64c076e14 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -220,6 +220,9 @@ Library
 - Issue #6062: In distutils, fixed the package option of build_ext. Feedback 
   and tests on pywin32 by Tim Golden.
 
+- Issue #1309567: Fix linecache behavior of stripping subdirectories when
+  looking for files given by a relative filename.
+
 - Issue #6046: Fixed the library extension when distutils build_ext is used
   inplace. Initial patch by Roumen Petrov.