[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