[wwwsearch-commits] r36071 - in wwwsearch/mechanize/trunk: mechanize test

jjlee at codespeak.net jjlee at codespeak.net
Sun Dec 31 02:25:03 CET 2006


Author: jjlee
Date: Sun Dec 31 02:25:01 2006
New Revision: 36071

Modified:
   wwwsearch/mechanize/trunk/mechanize/_mechanize.py
   wwwsearch/mechanize/trunk/test/test_browser.doctest
Log:
Fix .set_response() to close current response first.  Add a new method .visit_response() .

Modified: wwwsearch/mechanize/trunk/mechanize/_mechanize.py
==============================================================================
--- wwwsearch/mechanize/trunk/mechanize/_mechanize.py	(original)
+++ wwwsearch/mechanize/trunk/mechanize/_mechanize.py	Sun Dec 31 02:25:01 2006
@@ -114,7 +114,7 @@
         self.request_class = request_class
 
         self.request = None
-        self.set_response(None)
+        self._set_response(None, False)
 
         # do this last to avoid __getattr__ problems
         UserAgentBase.__init__(self)
@@ -175,14 +175,7 @@
             visit = True
 
         if visit:
-            if self._response is not None:
-                self._response.close()
-            if self.request is not None and update_history:
-                self._history.add(self.request, self._response)
-            self._response = None
-            # we want self.request to be assigned even if UserAgentBase.open
-            # fails
-            self.request = request
+            self._visit_request(request, update_history)
 
         success = True
         try:
@@ -205,7 +198,7 @@
 ##             raise
 
         if visit:
-            self.set_response(response)
+            self._set_response(response, False)
             response = copy.copy(self._response)
         elif response is not None:
             response = _upgrade.upgrade_response(response)
@@ -239,7 +232,12 @@
         """Replace current response with (a copy of) response.
 
         response may be None.
+
+        This is intended mostly for HTML-preprocessing.
         """
+        self._set_response(response, True)
+
+    def _set_response(self, response, close_current):
         # sanity check, necessary but far from sufficient
         if not (response is None or
                 (hasattr(response, "info") and hasattr(response, "geturl") and
@@ -251,9 +249,32 @@
         self.form = None
         if response is not None:
             response = _upgrade.upgrade_response(response)
+        if close_current and self._response is not None:
+            self._response.close()
         self._response = response
         self._factory.set_response(response)
 
+    def visit_response(self, response, request=None):
+        """Visit the response, as if it had been .open()ed.
+
+        Unlike .set_response(), this updates history rather than replacing the
+        current response.
+        """
+        if request is None:
+            request = _request.Request(response.geturl())
+        self._visit_request(request, True)
+        self._set_response(response, False)
+
+    def _visit_request(self, request, update_history):
+        if self._response is not None:
+            self._response.close()
+        if self.request is not None and update_history:
+            self._history.add(self.request, self._response)
+        self._response = None
+        # we want self.request to be assigned even if UserAgentBase.open
+        # fails
+        self.request = request
+
     def geturl(self):
         """Get URL of current document."""
         if self._response is None:
@@ -566,9 +587,6 @@
                 ".select_form()?)" % (self.__class__, name))
         return getattr(form, name)
 
-#---------------------------------------------------
-# Private methods.
-
     def _filter_links(self, links,
                     text=None, text_regex=None,
                     name=None, name_regex=None,

Modified: wwwsearch/mechanize/trunk/test/test_browser.doctest
==============================================================================
--- wwwsearch/mechanize/trunk/test/test_browser.doctest	(original)
+++ wwwsearch/mechanize/trunk/test/test_browser.doctest	Sun Dec 31 02:25:01 2006
@@ -7,7 +7,7 @@
 
 >>> class TestHttpHandler(mechanize.BaseHandler):
 ...     def http_open(self, request):
-...         return test_response()
+...         return test_response(url=request.get_full_url())
 >>> class TestHttpBrowser(TestBrowser2):
 ...     handler_classes = TestBrowser2.handler_classes.copy()
 ...     handler_classes["http"] = TestHttpHandler
@@ -25,6 +25,29 @@
 >>> print response_impl(r)
 eofresponse
 
+So should .set_response()
+
+>>> br.set_response(test_response())
+>>> print response_impl(r2)
+eofresponse
+
+
+.visit_response() works very similarly to .open()
+
+>>> br = TestHttpBrowser()
+>>> r = br.open("http://example.com")
+>>> r2 = test_response(url="http://example.com/2")
+>>> print response_impl(r2)
+StringI
+>>> br.visit_response(r2)
+>>> print response_impl(r)
+eofresponse
+>>> br.geturl() == br.request.get_full_url() == "http://example.com/2"
+True
+>>> junk = br.back()
+>>> br.geturl() == br.request.get_full_url() == "http://example.com"
+True
+
 
 Warn early about some mistakes setting a response object
 


More information about the wwwsearch-commits mailing list