From 45bc12e26814c822e98a87c6e8621f22948dff6f Mon Sep 17 00:00:00 2001 From: Pablo Hoffman Date: Wed, 2 Sep 2009 12:09:36 -0300 Subject: [PATCH] added scrapy.utils.pdb module with set_trace() function --- scrapy/log.py | 20 +++++++++++--------- scrapy/shell.py | 9 +++++---- scrapy/utils/pdb.py | 20 ++++++++++++++++++++ 3 files changed, 36 insertions(+), 13 deletions(-) create mode 100644 scrapy/utils/pdb.py diff --git a/scrapy/log.py b/scrapy/log.py index f2d9c16e6..b086318e4 100644 --- a/scrapy/log.py +++ b/scrapy/log.py @@ -5,6 +5,7 @@ See documentation in docs/topics/logging.rst """ import sys from traceback import format_exc +from contextlib import contextmanager from twisted.python import log from scrapy.xlib.pydispatch import dispatcher @@ -34,8 +35,6 @@ log_level = DEBUG started = False -_prev_descriptors = (sys.stdout, sys.stderr) - def start(logfile=None, loglevel=None, logstdout=None): """Initialize and start logging facility""" global log_level, started @@ -56,13 +55,6 @@ def start(logfile=None, loglevel=None, logstdout=None): file = open(logfile, 'a') if logfile else sys.stderr log.startLogging(file, setStdout=logstdout) -def _switch_descriptors(): - global _prev_descriptors - - cur = (sys.stdout, sys.stderr) - sys.stdout, sys.stderr = _prev_descriptors - _prev_descriptors = cur - def msg(message, level=INFO, component=BOT_NAME, domain=None): """Log message according to the level""" dispatcher.send(signal=logmessage_received, message=message, level=level, \ @@ -81,3 +73,13 @@ def err(*args, **kwargs): component = kwargs.pop('component', BOT_NAME) kwargs['system'] = domain if domain else component log.err(*args, **kwargs) + +_std_descriptors_backup = (sys.stdout, sys.stderr) + +@contextmanager +def _std_descriptors(): + cur = (sys.stdout, sys.stderr) + sys.stdout, sys.stderr = _std_descriptors_backup + yield + sys.stdout, sys.stderr = cur + diff --git a/scrapy/shell.py b/scrapy/shell.py index a137557cb..5f87747f9 100644 --- a/scrapy/shell.py +++ b/scrapy/shell.py @@ -4,6 +4,8 @@ Scrapy Shell See documentation in docs/topics/shell.rst """ +from __future__ import with_statement + import os import urllib import urlparse @@ -149,7 +151,6 @@ class Shell(object): def inspect_response(response): """Open a shell to inspect the given response""" - shell = Shell(nofetch=True) - log._switch_descriptors() - shell.inspect_response(response) - log._switch_descriptors() + with log._std_descriptors(): + shell = Shell(nofetch=True) + shell.inspect_response(response) diff --git a/scrapy/utils/pdb.py b/scrapy/utils/pdb.py new file mode 100644 index 000000000..db924a2fb --- /dev/null +++ b/scrapy/utils/pdb.py @@ -0,0 +1,20 @@ +""" +Function for invoking the Python Debugger from Scrapy +""" + +from __future__ import absolute_import, with_statement + +from pdb import Pdb + +from scrapy import log + +class ScrapyPdb(Pdb): + + def setup(self, f, t): + Pdb.setup(self, f, t) + self.curindex -= 2 + +def set_trace(): + """Like pdb.set_trace() but works nice with the Scrapy log""" + with log._std_descriptors(): + ScrapyPdb().set_trace()