[Checkins] SVN: lovely.responsecache/trunk/ This is a major version update to signal that the new version is no longer

Juergen Kartnaller juergen at kartnaller.at
Mon Jun 16 12:47:52 EDT 2008


Log message for revision 87426:
  This is a major version update to signal that the new version is no longer
  automatically using pyCurl but using a fallback to httplib if pycurl is not
  present. Using httplib is a huge performance problem, so whenever possible
  pycurl should be used.
  
  - removed pycurl as install requirement.
    The application which want's to use pycurl must add it to it's setup.
  - Added a WARNING to the log at startup alerting about performance because of
    using httplib instead of pycurl.
  - added support for httplib if pyCurl is not available
  
  

Changed:
  U   lovely.responsecache/trunk/CHANGES.txt
  U   lovely.responsecache/trunk/buildout.cfg
  U   lovely.responsecache/trunk/setup.py
  U   lovely.responsecache/trunk/src/lovely/responsecache/PURGE.txt
  U   lovely.responsecache/trunk/src/lovely/responsecache/purge.py
  U   lovely.responsecache/trunk/src/lovely/responsecache/tests.py

-=-
Modified: lovely.responsecache/trunk/CHANGES.txt
===================================================================
--- lovely.responsecache/trunk/CHANGES.txt	2008-06-16 16:09:16 UTC (rev 87425)
+++ lovely.responsecache/trunk/CHANGES.txt	2008-06-16 16:47:52 UTC (rev 87426)
@@ -2,6 +2,20 @@
 Changes for lovely.responsecache
 ================================
 
+2008/06/16 1.0.0a1
+==================
+
+This is a major version update to signal that the new version is no longer
+automatically using pyCurl but using a fallback to httplib if pycurl is not
+present. Using httplib is a huge performance problem, so whenever possible
+pycurl should be used.
+
+- removed pycurl as install requirement.
+  The application which want's to use pycurl must add it to it's setup.
+- Added a WARNING to the log at startup alerting about performance because of
+  using httplib instead of pycurl.
+- added support for httplib if pyCurl is not available
+
 2008/02/16 0.4.3a2
 ==================
 

Modified: lovely.responsecache/trunk/buildout.cfg
===================================================================
--- lovely.responsecache/trunk/buildout.cfg	2008-06-16 16:09:16 UTC (rev 87425)
+++ lovely.responsecache/trunk/buildout.cfg	2008-06-16 16:47:52 UTC (rev 87426)
@@ -5,6 +5,6 @@
 
 [test]
 recipe = zc.recipe.testrunner
-eggs = lovely.responsecache [test]
+eggs = lovely.responsecache [test, pycurl]
 
 

Modified: lovely.responsecache/trunk/setup.py
===================================================================
--- lovely.responsecache/trunk/setup.py	2008-06-16 16:09:16 UTC (rev 87425)
+++ lovely.responsecache/trunk/setup.py	2008-06-16 16:47:52 UTC (rev 87426)
@@ -23,7 +23,7 @@
 
 setup(
     name = 'lovely.responsecache',
-    version = '0.4.3a2',
+    version = '1.0.0a1',
     author = "Lovely Systems",
     author_email = "office at lovelysystems.com",
     description = "Cache results of ContentProviders",
@@ -36,7 +36,6 @@
     package_dir = {'':'src'},
     namespace_packages = ['lovely',],
     install_requires = ['setuptools',
-                        'pycurl',
                         'lovely.memcached',
                         'zope.app.publication',
                         'zope.app.security',
@@ -47,13 +46,14 @@
                         'zope.security',
                         'zope.traversing'],
     extras_require = dict(
-        test = ['z3c.configurator',
-                'z3c.testing',
-                'zope.testbrowser',
-                'zope.viewlet',
-                'zope.pagetemplate',
-                'zope.app.securitypolicy',
-                'zope.app.zcmlfiles',
-                'zope.app.testing',
-                'zope.testing',]),
+    pycurl = ['pycurl',],
+    test = ['z3c.configurator',
+            'z3c.testing',
+            'zope.testbrowser',
+            'zope.viewlet',
+            'zope.pagetemplate',
+            'zope.app.securitypolicy',
+            'zope.app.zcmlfiles',
+            'zope.app.testing',
+            'zope.testing',]),
     )

Modified: lovely.responsecache/trunk/src/lovely/responsecache/PURGE.txt
===================================================================
--- lovely.responsecache/trunk/src/lovely/responsecache/PURGE.txt	2008-06-16 16:09:16 UTC (rev 87425)
+++ lovely.responsecache/trunk/src/lovely/responsecache/PURGE.txt	2008-06-16 16:47:52 UTC (rev 87426)
@@ -39,7 +39,7 @@
 
     >>> print log_info
     lovely.responsecache.purge ERROR
-      unable to purge 'http://localhost:33334/purge_expression1', reason: (7, "couldn't connect to host")
+      unable to purge 'http://localhost:33334/purge_expression1', reason: (...)
 
 As we can see we could not reach any server. So let's set up a http server::
 
@@ -159,7 +159,7 @@
 
     >>> print log_info
     lovely.responsecache.purge ERROR
-      unable to purge 'http://localhost:33334/purge_expression1', reason: (7, "couldn't connect to host")
+      unable to purge 'http://localhost:33334/purge_expression1', reason: (...)
     lovely.responsecache.purge INFO
       purged 'http://localhost:33335/purge_expression1'
 

Modified: lovely.responsecache/trunk/src/lovely/responsecache/purge.py
===================================================================
--- lovely.responsecache/trunk/src/lovely/responsecache/purge.py	2008-06-16 16:09:16 UTC (rev 87425)
+++ lovely.responsecache/trunk/src/lovely/responsecache/purge.py	2008-06-16 16:47:52 UTC (rev 87426)
@@ -20,6 +20,7 @@
 import logging
 import threading
 import urlparse
+import httplib
 import transaction
 
 from time import time
@@ -94,28 +95,58 @@
         return parts
 
     def _purgeURLs(self, urls):
-        import pycurl
-        result = True
-        url = 'no URL'
-        c = pycurl.Curl()
-        try:
-            c.setopt(c.WRITEFUNCTION, self.ignoreWrite)
-            c.setopt(c.CUSTOMREQUEST,'PURGE')
-            c.setopt(c.TIMEOUT, self.timeout)
-            for url in urls:
-                c.setopt(c.URL, url)
-                c.perform()
-                log.info('purged %r' % url)
-        except Exception, e:
-            log.error('unable to purge %r, reason: %s' % (url, e))
-            result = False
-        c.close()
-        return result
+        # this method is set below depending on the availability of pyCurl
+        pass
 
     def ignoreWrite(self, data):
         pass
 
 
+def _purgePyCurl(self, urls):
+    result = True
+    url = 'no URL'
+    c = pycurl.Curl()
+    try:
+        c.setopt(c.WRITEFUNCTION, self.ignoreWrite)
+        c.setopt(c.CUSTOMREQUEST,'PURGE')
+        c.setopt(c.TIMEOUT, self.timeout)
+        for url in urls:
+            c.setopt(c.URL, url)
+            c.perform()
+            log.info('purged %r' % url)
+    except Exception, e:
+        log.error('unable to purge %r, reason: %s' % (url, e))
+        result = False
+    c.close()
+    return result
+
+def _purgeHTTPLIB(self, urls):
+    result = True
+    try:
+        for url in urls:
+            parsed = urlparse.urlparse(url)
+            host = parsed[1]
+            path = parsed[2]
+            h = httplib.HTTP(host)
+            h.putrequest('PURGE', path)
+            h.endheaders()
+            errcode, errmsg, headers = h.getreply()
+            h.getfile().read()
+            h.close()
+            log.info('purged %r' % url)
+    except Exception, e:
+        log.error('unable to purge %r, reason: %s' % (url, e))
+        result = False
+    return result
+
+try:
+    import pycurl
+    PurgeUtil._purgeURLs = _purgePyCurl
+except ImportError:
+    log.warning('Performance alert: pyCurl not found, using httplib!')
+    PurgeUtil._purgeURLs = _purgeHTTPLIB
+
+
 class PurgeDataManager(object):
     """An IDataManager implementation to do purges."""
 

Modified: lovely.responsecache/trunk/src/lovely/responsecache/tests.py
===================================================================
--- lovely.responsecache/trunk/src/lovely/responsecache/tests.py	2008-06-16 16:09:16 UTC (rev 87425)
+++ lovely.responsecache/trunk/src/lovely/responsecache/tests.py	2008-06-16 16:47:52 UTC (rev 87426)
@@ -61,6 +61,14 @@
     test.globs['log_info'] = log_info
 
 
+def setUpHTTPLib(test):
+    # setup the PurgeUtil to use httplib instead of pyCurl
+    setUp(test)
+    from purge import PurgeUtil, _purgeHTTPLIB
+    import httplib
+    PurgeUtil._purgeURLs = _purgeHTTPLIB
+
+
 def tearDown(test):
     setup.placefulTearDown()
 
@@ -82,6 +90,10 @@
             'PURGE.txt', setUp=setUp, tearDown=tearDown,
             optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
             ),
+        DocFileSuite(
+            'PURGE.txt', setUp=setUpHTTPLib, tearDown=tearDown,
+            optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
+            ),
         fsuite,
         )
 



More information about the Checkins mailing list