[Python-checkins] cpython (merge default -> default): Merge

antoine.pitrou python-checkins at python.org
Sat Mar 30 16:34:38 CET 2013


http://hg.python.org/cpython/rev/096a97f3ffc9
changeset:   83022:096a97f3ffc9
parent:      83021:02f9335b7efb
parent:      83014:efb44458afcd
user:        Antoine Pitrou <solipsis at pitrou.net>
date:        Sat Mar 30 16:29:54 2013 +0100
summary:
  Merge

files:
  Doc/howto/logging-cookbook.rst         |  34 ++++++++++++++
  Doc/library/unittest.mock-examples.rst |   6 +-
  Lib/inspect.py                         |   2 +-
  Lib/test/test_inspect.py               |   6 ++
  Misc/NEWS                              |   3 +
  5 files changed, 47 insertions(+), 4 deletions(-)


diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst
--- a/Doc/howto/logging-cookbook.rst
+++ b/Doc/howto/logging-cookbook.rst
@@ -1094,6 +1094,40 @@
 string. That's because the __ notation is just syntax sugar for a constructor
 call to one of the XXXMessage classes.
 
+If you prefer, you can use a :class:`LoggerAdapter` to achieve a similar effect
+to the above, as in the following example::
+
+    import logging
+
+    class Message(object):
+        def __init__(self, fmt, args):
+            self.fmt = fmt
+            self.args = args
+
+        def __str__(self):
+            return self.fmt.format(*self.args)
+
+    class StyleAdapter(logging.LoggerAdapter):
+        def __init__(self, logger, extra=None):
+            super(StyleAdapter, self).__init__(logger, extra or {})
+
+        def log(self, level, msg, *args, **kwargs):
+            if self.isEnabledFor(level):
+                msg, kwargs = self.process(msg, kwargs)
+                self.logger._log(level, Message(msg, args), (), **kwargs)
+
+    logger = StyleAdapter(logging.getLogger(__name__))
+
+    def main():
+        logger.debug('Hello, {}', 'world!')
+
+    if __name__ == '__main__':
+        logging.basicConfig(level=logging.DEBUG)
+        main()
+
+The above script should log the message ``Hello, world!`` when run with
+Python 3.2 or later.
+
 
 .. currentmodule:: logging
 
diff --git a/Doc/library/unittest.mock-examples.rst b/Doc/library/unittest.mock-examples.rst
--- a/Doc/library/unittest.mock-examples.rst
+++ b/Doc/library/unittest.mock-examples.rst
@@ -338,11 +338,11 @@
     ...
     >>> test()
 
-If you are patching a module (including `__builtin__`) then use `patch`
+If you are patching a module (including :mod:`builtins`) then use `patch`
 instead of `patch.object`:
 
-    >>> mock = MagicMock(return_value = sentinel.file_handle)
-    >>> with patch('__builtin__.open', mock):
+    >>> mock = MagicMock(return_value=sentinel.file_handle)
+    >>> with patch('builtins.open', mock):
     ...     handle = open('filename', 'r')
     ...
     >>> mock.assert_called_with('filename', 'r')
diff --git a/Lib/inspect.py b/Lib/inspect.py
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -550,7 +550,7 @@
 
     file = getfile(object)
     sourcefile = getsourcefile(object)
-    if not sourcefile and file[0] + file[-1] != '<>':
+    if not sourcefile and file[:1] + file[-1:] != '<>':
         raise OSError('source code not available')
     file = sourcefile if sourcefile else file
 
diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
--- a/Lib/test/test_inspect.py
+++ b/Lib/test/test_inspect.py
@@ -416,6 +416,12 @@
         finally:
             del linecache.cache[co.co_filename]
 
+    def test_findsource_without_filename(self):
+        for fname in ['', '<string>']:
+            co = compile('x=1', fname, "exec")
+            self.assertRaises(IOError, inspect.findsource, co)
+            self.assertRaises(IOError, inspect.getsource, co)
+
 class TestNoEOL(GetSourceBase):
     def __init__(self, *args, **kwargs):
         self.tempdir = TESTFN + '_dir'
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -297,6 +297,9 @@
 Library
 -------
 
+- Issue #17526: fix an IndexError raised while passing code without filename to
+  inspect.findsource().  Initial patch by Tyler Doyle.
+
 - Issue #17540: Added style to formatter configuration by dict.
 
 - Issue #16692: The ssl module now supports TLS 1.1 and TLS 1.2.  Initial

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list