[wwwsearch-commits] r21732 - in wwwsearch/mechanize/trunk: . mechanize

jjlee at codespeak.net jjlee at codespeak.net
Fri Jan 6 02:06:34 CET 2006


Author: jjlee
Date: Fri Jan  6 02:06:33 2006
New Revision: 21732

Modified:
   wwwsearch/mechanize/trunk/mechanize/_mechanize.py
   wwwsearch/mechanize/trunk/test.py
Log:
Pluggable History (probably will change soon); Remove idiotic test assertions that Browser should work even after .close()

Modified: wwwsearch/mechanize/trunk/mechanize/_mechanize.py
==============================================================================
--- wwwsearch/mechanize/trunk/mechanize/_mechanize.py	(original)
+++ wwwsearch/mechanize/trunk/mechanize/_mechanize.py	Fri Jan  6 02:06:33 2006
@@ -439,6 +439,28 @@
                          )
 
 
+class History:
+    def __init__(self):
+        self._history = []  # LIFO
+    def add(self, request, response):
+        self._history.append((request, response))
+    def back(self, n, _response):
+        response = _response  # XXX move Browser._response into this class?
+        while n > 0 or response is None:
+            try:
+                request, response = self._history.pop()
+            except IndexError:
+                raise BrowserStateError("already at start of history")
+            n -= 1
+        return request, response
+    def clear(self):
+        del self._history[:]
+    def close(self):
+        for request, response in self._history:
+            response.close()
+        del self._history[:]
+
+
 if sys.version_info[:2] >= (2, 4):
     from ClientCookie._Opener import OpenerMixin
 else:
@@ -464,6 +486,7 @@
 
     def __init__(self, default_encoding="latin-1",
                  factory=None,
+                 history=None,
                  request_class=None,
                  forms_factory=None,  # deprecated
                  links_factory=None,  # deprecated
@@ -491,7 +514,9 @@
 
         """
         self.default_encoding = default_encoding
-        self._history = []  # LIFO
+        if history is None:
+            history = History()
+        self._history = history
         self.request = self._response = None
         self.form = None
         self._forms = None
@@ -521,7 +546,8 @@
         if self._response is not None:
             self._response.close()    
         UserAgent.close(self)
-        del self._history[:]
+        self._history.close()
+        self._history = None
         self._forms = self._title = self._links = None
         self.request = self._response = None
 
@@ -545,7 +571,7 @@
                 url = urlparse.urljoin(self._response.geturl(), url)
 
         if self.request is not None and update_history:
-            self._history.append((self.request, self._response))
+            self._history.add(self.request, self._response)
         self._response = None
         # we want self.request to be assigned even if UserAgent.open fails
         self.request = self._request(url, data)
@@ -591,15 +617,13 @@
         """
         if self._response is not None:
             self._response.close()
-        while n > 0 or self._response is None:
-            try:
-                self.request, self._response = self._history.pop()
-            except IndexError:
-                raise BrowserStateError("already at start of history")
-            n -= 1
+        self.request, self._response = self._history.back(n, self._response)
         self._parse_html(self._response)
         return self._response
 
+    def clear_history(self):
+        self._history.clear()
+
     def links(self, **kwds):
         """Return iterable over links (mechanize.Link objects)."""
         if not self.viewing_html():

Modified: wwwsearch/mechanize/trunk/test.py
==============================================================================
--- wwwsearch/mechanize/trunk/test.py	(original)
+++ wwwsearch/mechanize/trunk/test.py	Fri Jan  6 02:06:33 2006
@@ -228,16 +228,12 @@
         r6 = b.open("spam")
         self.assertEquals(b.geturl(), "http://example.com/spam")
         r7 = b.open("/spam")
+        self.assert_(same_response(b.response(), r7))
         self.assertEquals(b.geturl(), "http://example.com/spam")
         self.assert_(same_response(b.back(2), r5))
         self.assertEquals(b.geturl(), "http://example.com/")
         self.assertRaises(mechanize.BrowserStateError, b.back, 2)
-        b.close() # history should work after close
-        r8 = b.open("http://example.com/")
-        r9 = b.open("http://example.com/foo")
-        self.assert_(same_response(b.back(), r8))
-
-        self.assert_(same_response(b.response(), r8))
+        r8 = b.open("/spam")
 
         # even if we get a URLError, history and .response() should still get updated
         error = urllib2.HTTPError("http://example.com/bad", 503, "Oops",
@@ -247,6 +243,9 @@
         self.assertEqual(b.response().geturl(), error.geturl())
         self.assert_(same_response(b.back(), r8))
 
+        b.close()
+        # XXX assert BrowserStateError
+
     def test_viewing_html(self):
         # XXX not testing multiple Content-Type headers
         import mechanize


More information about the wwwsearch-commits mailing list