From z3-checkins at codespeak.net Sun Jan 6 09:52:56 2008 From: z3-checkins at codespeak.net (z3-checkins at codespeak.net) Date: Sun, 6 Jan 2008 09:52:56 +0100 (CET) Subject: [z3-checkins] Be a Mystery Shopper - Shop for FREE!‏ Message-ID: <20080106145258.10033.qmail@static-host.144-250-30-217.kgts.ru> An HTML attachment was scrubbed... URL: http://codespeak.net/pipermail/z3-checkins/attachments/20080106/46430710/attachment.htm From rmarianski at codespeak.net Mon Jan 7 21:28:22 2008 From: rmarianski at codespeak.net (rmarianski at codespeak.net) Date: Mon, 7 Jan 2008 21:28:22 +0100 (CET) Subject: [z3-checkins] r50440 - z3/deliverance/DeliveranceVHoster/trunk Message-ID: <20080107202822.DBD13168438@codespeak.net> Author: rmarianski Date: Mon Jan 7 21:28:21 2008 New Revision: 50440 Modified: z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Log: add topp_secret_filename config Modified: z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl (original) +++ z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Mon Jan 7 21:28:21 2008 @@ -60,3 +60,5 @@ ## FIXME: this should be parameterized: default_theme_uri = http://www.openplans.org/theme.html + +topp_secret_filename = {{env.config.get('general', 'topp_secret_filename')}} From rmarianski at codespeak.net Wed Jan 9 18:29:32 2008 From: rmarianski at codespeak.net (rmarianski at codespeak.net) Date: Wed, 9 Jan 2008 18:29:32 +0100 (CET) Subject: [z3-checkins] r50460 - z3/deliverance/DeliveranceVHoster/trunk Message-ID: <20080109172932.4697F168506@codespeak.net> Author: rmarianski Date: Wed Jan 9 18:29:31 2008 New Revision: 50460 Modified: z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Log: go through a base_path variable name to minimize differences Modified: z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl (original) +++ z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Wed Jan 9 18:29:31 2008 @@ -6,6 +6,7 @@ email_to = ianb at openplans.org smtp_server = localhost error_email_from = paste@{{env.fq_hostname}} +base_path = {{env.base_path}} [server:main] use = egg:Paste#http @@ -35,11 +36,11 @@ logger = {{env.var}}/logs/deliverance/dvhoster.log -init_domain = {{env.base_path}}/deliverance/src/openplans_hooks/openplans_hooks.py -find_remote_uri = {{env.base_path}}/deliverance/src/openplans_hooks/openplans_hooks.py -should_theme_uri = {{env.base_path}}/deliverance/src/openplans_hooks/openplans_hooks.py +init_domain = %(base_path)s/deliverance/src/openplans_hooks/openplans_hooks.py +find_remote_uri = %(base_path)s/deliverance/src/openplans_hooks/openplans_hooks.py +should_theme_uri = %(base_path)s/deliverance/src/openplans_hooks/openplans_hooks.py -links_config = {{env.base_path}}/etc/build.ini +links_config = %(base_path)s/etc/build.ini ## FIXME: this should be parameterized or something: no_filter_zope = True From z3-checkins at codespeak.net Fri Jan 11 06:15:30 2008 From: z3-checkins at codespeak.net (z3-checkins at codespeak.net) Date: Fri, 11 Jan 2008 06:15:30 +0100 (CET) Subject: [z3-checkins] Online Guide For Message-ID: <20080110011731.57142.qmail@nv-71-55-99-107.dhcp.embarqhsd.net> An HTML attachment was scrubbed... URL: http://codespeak.net/pipermail/z3-checkins/attachments/20080111/abca38b7/attachment.htm From novalis at codespeak.net Tue Jan 15 20:36:47 2008 From: novalis at codespeak.net (novalis at codespeak.net) Date: Tue, 15 Jan 2008 20:36:47 +0100 (CET) Subject: [z3-checkins] r50651 - z3/deliverance/DeliveranceVHoster/trunk Message-ID: <20080115193647.A94B916850F@codespeak.net> Author: novalis Date: Tue Jan 15 20:36:46 2008 New Revision: 50651 Modified: z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Log: 127.0.0.1 is localhost Modified: z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl (original) +++ z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Tue Jan 15 20:36:46 2008 @@ -56,7 +56,7 @@ # none - no hosts are ok # localhost - only localhsost # - only hosts matching the regex given -transcluder_ok_hosts = openplans.org|(.*)\.openplans.org|(.*)\.localhost.openplans\.org|localhost +transcluder_ok_hosts = openplans.org|(.*)\.openplans.org|(.*)\.localhost.openplans\.org|localhost|127.0.0.1 transcluder_pool_size = 0 ## FIXME: this should be parameterized: From ianb at codespeak.net Wed Jan 16 00:05:12 2008 From: ianb at codespeak.net (ianb at codespeak.net) Date: Wed, 16 Jan 2008 00:05:12 +0100 (CET) Subject: [z3-checkins] r50656 - in z3/deliverance/DeliveranceVHoster/trunk: . docs dvhoster Message-ID: <20080115230512.EDE88168407@codespeak.net> Author: ianb Date: Wed Jan 16 00:05:10 2008 New Revision: 50656 Modified: z3/deliverance/DeliveranceVHoster/trunk/docs/configuration.txt z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Log: Added support for file: urls (from find_remote_uri, not remote_uri.txt). Added some support for debugging routing Modified: z3/deliverance/DeliveranceVHoster/trunk/docs/configuration.txt ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/docs/configuration.txt (original) +++ z3/deliverance/DeliveranceVHoster/trunk/docs/configuration.txt Wed Jan 16 00:05:10 2008 @@ -42,6 +42,8 @@ ``debug_bodies`` is also on then outgoing bodies will also be printed. This is noisy, so should only be on for testing. +``debug_routing`` shows routing information (how external URLs are mapped to +internal resources). Hooks ----- Modified: z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py (original) +++ z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py Wed Jan 16 00:05:10 2008 @@ -55,6 +55,7 @@ self.app_conf = app_conf self.provider = DomainInfoSet(data_dir) self.rewrite_links = asbool(app_conf.get('rewrite_links', False)) + self.debug_routing = asbool(app_conf.get('debug_routing', False)) logger = make_logger(app_conf.get('logger'), 'dvhoster') self.logger = logger @@ -129,6 +130,8 @@ self.set_additional_headers(domain_info, environ) remote_uri = self.match_remote_uri(path_info, domain_info, environ) + if self.debug_routing: + print 'Routed path %s to %s' % (path_info, remote_uri) if not remote_uri: exc = httpexceptions.HTTPNotFound( "No URL is mapped to %r (somewhat oddly); only %s prefixes " @@ -148,7 +151,10 @@ 'script_name': environ['SCRIPT_NAME'], 'path_info': environ['PATH_INFO'], } + old_remote_uri = remote_uri remote_uri = uritemplate.sub_vars(remote_uri, vars) + if self.debug_routing and remote_uri != old_remote_uri: + print 'Resolved URI %s to %s' % (old_remote_uri, remote_uri) environ['dvhoster.remote_uri'] = remote_uri if environ['SCRIPT_NAME']: @@ -158,9 +164,15 @@ if self.should_theme_uri: should_theme_uri = self.should_theme_uri( remote_uri, environ, self.app_conf) - app = proxyapp.ForcedProxy( - remote=remote_uri, - force_host=True) + if self.debug_routing: + print 'Not theming %s' % remote_uri + if remote_uri.startswith('file:'): + filename = '/' + remote_uri[len('file:'):].lstrip('/') + app = StaticURLParser(filename) + else: + app = proxyapp.ForcedProxy( + remote=remote_uri, + force_host=True) if self.transcluder_enabled: app = TranscluderMiddleware(app, @@ -307,12 +319,20 @@ if not path.endswith('/'): path += '/' if path_info + '/' == path: + if self.debug_routing: + print 'Path %s matches %r, but needs a trailing slash' % (path_info, path) exc = httpexceptions.HTTPMovedPermanently( headers=[('location', construct_url(environ, path_info=path_info+'/'))]) raise exc if path_info.startswith(path): # Found a match + if self.debug_routing: + print 'Found match for path %s against info %r' % (path_info, remote_uri_info) remote_uri = remote_uri_info.get('remote_uri') + if remote_uri and remote_uri.lower().startswith('file:'): + # This isn't allowed in remote_uri_info + raise httpexceptions.HTTPForbidden("configured remote_uri values cannot be file: urls (%r)" + % remote_uri) environ['SCRIPT_NAME'] += path[:-1] environ['PATH_INFO'] = path_info[len(path)-1:] if remote_uri_info.get('headers'): @@ -322,9 +342,15 @@ header_name = 'HTTP_' + header_name environ[str(header_name)] = str(header_value) if self.find_remote_uri: + old_remote_uri = remote_uri remote_uri = self.find_remote_uri(remote_uri, remote_uri_info, domain_info, environ, self.app_conf) + if self.debug_routing and old_remote_uri != remote_uri: + print 'find_remote_uri resolved path %s to %s' % (environ['PATH_INFO'], remote_uri) return remote_uri if self.find_remote_uri: # Last change for find_remote_uri to do something + old_remote_uri = remote_uri remote_uri = self.find_remote_uri(remote_uri, None, domain_info, environ, self.app_conf) + if self.debug_routing and old_remote_uri != remote_uri: + print 'find_remote_uri resolved path %s to %s' % (environ['PATH_INFO'], remote_uri) return remote_uri Modified: z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl (original) +++ z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Wed Jan 16 00:05:10 2008 @@ -19,6 +19,8 @@ #debug_headers = true # To view bodies: #debug_bodies = true +# To show how routing is calculated: +#debug_routing = true # To disable the rewriting of links: #rewrite_links = false # Use this to remove certain headers from any request: From z3-checkins at codespeak.net Tue Jan 29 09:02:59 2008 From: z3-checkins at codespeak.net (z3-checkins at codespeak.net) Date: Tue, 29 Jan 2008 09:02:59 +0100 (CET) Subject: [z3-checkins] Best sale of the year Message-ID: <20080129120234.7241.qmail@NK219-91-11-190.adsl.dynamic.apol.com.tw> An HTML attachment was scrubbed... URL: http://codespeak.net/pipermail/z3-checkins/attachments/20080129/9f6ecf23/attachment.htm From ejucovy at codespeak.net Tue Jan 29 18:28:14 2008 From: ejucovy at codespeak.net (ejucovy at codespeak.net) Date: Tue, 29 Jan 2008 18:28:14 +0100 (CET) Subject: [z3-checkins] r51115 - z3/deliverance/DeliveranceVHoster/trunk/dvhoster Message-ID: <20080129172814.CFEB016842C@codespeak.net> Author: ejucovy Date: Tue Jan 29 18:28:04 2008 New Revision: 51115 Added: z3/deliverance/DeliveranceVHoster/trunk/dvhoster/socket_error.py Modified: z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py Log: convert socket errors to http server errors Modified: z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py (original) +++ z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py Tue Jan 29 18:28:04 2008 @@ -9,6 +9,7 @@ from wsgifilter import proxyapp from wsgifilter import relocateresponse from deliverance.wsgimiddleware import DeliveranceMiddleware +from dvhoster.socket_error import SocketErrorToHTTPServerException from dvhoster.model import DomainInfoSet, DomainInfoApp from dvhoster import current_environ from dvhoster.debuginterp import Renderer @@ -180,7 +181,8 @@ tasklist=self.transcluder_pool, include_predicate=self.transcluder_ok_hosts, recursion_predicate=self.transcluder_ok_hosts) - + app = SocketErrorToHTTPServerException(app) + if should_theme_uri: if self.rewrite_links: app = relocateresponse.RelocateMiddleware( @@ -215,7 +217,7 @@ renderer=Renderer, is_internal_uri=is_internal_uri) return app(environ, start_response) - + def find_static_file(self, domain_info, path_info): """ If the request matches a static file, returns a WSGI Added: z3/deliverance/DeliveranceVHoster/trunk/dvhoster/socket_error.py ============================================================================== --- (empty file) +++ z3/deliverance/DeliveranceVHoster/trunk/dvhoster/socket_error.py Tue Jan 29 18:28:04 2008 @@ -0,0 +1,12 @@ +import socket +from paste.httpexceptions import HTTPGatewayTimeout + +class SocketErrorToHTTPServerException(object): + def __init__(self, app): + self.app = app + + def __call__(self, environ, start_response): + try: + return self.app(environ, start_response) + except socket.error: + raise HTTPGatewayTimeout From ejucovy at codespeak.net Tue Jan 29 20:48:35 2008 From: ejucovy at codespeak.net (ejucovy at codespeak.net) Date: Tue, 29 Jan 2008 20:48:35 +0100 (CET) Subject: [z3-checkins] r51116 - z3/deliverance/DeliveranceVHoster/trunk/dvhoster Message-ID: <20080129194835.C851B16844A@codespeak.net> Author: ejucovy Date: Tue Jan 29 20:48:33 2008 New Revision: 51116 Modified: z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py z3/deliverance/DeliveranceVHoster/trunk/dvhoster/socket_error.py Log: retry after one second on socket error before giving up and throwing http gateway timeout Modified: z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py (original) +++ z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py Tue Jan 29 20:48:33 2008 @@ -10,6 +10,7 @@ from wsgifilter import relocateresponse from deliverance.wsgimiddleware import DeliveranceMiddleware from dvhoster.socket_error import SocketErrorToHTTPServerException +from dvhoster.socket_error import RetryOnceOnSocketError from dvhoster.model import DomainInfoSet, DomainInfoApp from dvhoster import current_environ from dvhoster.debuginterp import Renderer @@ -181,6 +182,7 @@ tasklist=self.transcluder_pool, include_predicate=self.transcluder_ok_hosts, recursion_predicate=self.transcluder_ok_hosts) + app = RetryOnceOnSocketError(app) app = SocketErrorToHTTPServerException(app) if should_theme_uri: Modified: z3/deliverance/DeliveranceVHoster/trunk/dvhoster/socket_error.py ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/dvhoster/socket_error.py (original) +++ z3/deliverance/DeliveranceVHoster/trunk/dvhoster/socket_error.py Tue Jan 29 20:48:33 2008 @@ -1,4 +1,5 @@ import socket +import time from paste.httpexceptions import HTTPGatewayTimeout class SocketErrorToHTTPServerException(object): @@ -8,5 +9,17 @@ def __call__(self, environ, start_response): try: return self.app(environ, start_response) + except socket.error, e: + raise HTTPGatewayTimeout("Socket error %d - %r" % e.args) + +class RetryOnceOnSocketError(object): + def __init__(self, app): + self.app = app + + def __call__(self, environ, start_response): + try: + return self.app(environ, start_response) except socket.error: - raise HTTPGatewayTimeout + # Give the remote service a second to restart, etc. + time.sleep(1) + return self.app(environ, start_response) From z3-checkins at codespeak.net Thu Jan 31 12:30:21 2008 From: z3-checkins at codespeak.net (z3-checkins at codespeak.net) Date: Thu, 31 Jan 2008 12:30:21 +0100 (CET) Subject: [z3-checkins] January 74% OFF Message-ID: <20080131033005.31652.qmail@dsl88-246-5859.ttnet.net.tr> An HTML attachment was scrubbed... URL: http://codespeak.net/pipermail/z3-checkins/attachments/20080131/7c34cd56/attachment.htm From z3-checkins at codespeak.net Fri Feb 1 07:33:57 2008 From: z3-checkins at codespeak.net (z3-checkins at codespeak.net) Date: Fri, 1 Feb 2008 07:33:57 +0100 (CET) Subject: [z3-checkins] January 74% OFF Message-ID: <20080201083346.123818.qmail@i07m-89-86-168-106.d4.club-internet.fr> An HTML attachment was scrubbed... URL: http://codespeak.net/pipermail/z3-checkins/attachments/20080201/4642ccd2/attachment-0001.htm From ejucovy at codespeak.net Mon Feb 11 17:44:39 2008 From: ejucovy at codespeak.net (ejucovy at codespeak.net) Date: Mon, 11 Feb 2008 17:44:39 +0100 (CET) Subject: [z3-checkins] r51391 - z3/deliverance/DeliveranceVHoster/trunk/utils Message-ID: <20080211164439.08626168403@codespeak.net> Author: ejucovy Date: Mon Feb 11 17:44:37 2008 New Revision: 51391 Modified: z3/deliverance/DeliveranceVHoster/trunk/utils/embed_url.py Log: Add support for IE conditional comments... Modified: z3/deliverance/DeliveranceVHoster/trunk/utils/embed_url.py ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/utils/embed_url.py (original) +++ z3/deliverance/DeliveranceVHoster/trunk/utils/embed_url.py Mon Feb 11 17:44:37 2008 @@ -31,6 +31,11 @@ Save the downloaded file(s) to a file based on the file name from the URL. + -c + --comment-hack + Hack IE conditional comments so that their internal resources will be + embedded as well. + -i --image-strip Strip any img tags from the document, since the are links to external @@ -95,10 +100,10 @@ from sys import argv, exit, stderr try: - options, arguments = getopt(argv[1:], "hso:fdip", ["help", "save", + options, arguments = getopt(argv[1:], "hso:fdipc", ["help", "save", "output=", "force", "disable", "image-strip", - "percent-escape"]) + "percent-escape", "comment-hack"]) except GetoptError: __usage() exit(2) @@ -106,6 +111,7 @@ output = None image_strip = False percent_escape = False + comment_hack = False save = False force = False disable = False @@ -118,6 +124,8 @@ save = True elif option in ("-o", "--output"): output = value + elif option in ("-c", "--comment-hack"): + comment_hack = True elif option in ("-i", "--image-strip"): image_strip = True elif option in ("-p", "--percent-escape"): @@ -149,7 +157,7 @@ exit(2) for url in arguments: - embed_url(url, output, mode, image_strip, percent_escape) + embed_url(url, output, mode, image_strip, percent_escape, comment_hack) def __usage(): @@ -382,7 +390,7 @@ self.parsed += "" % data -def embed_url(url, output_file=None, mode='Auto', image_strip=False, percent_escape=False): +def embed_url(url, output_file=None, mode='Auto', image_strip=False, percent_escape=False, comment_hack=False): """ Download a file from the internet, and process the links if it is HTML. @@ -434,8 +442,16 @@ # without changing links. embed_parser = EmbedParser(base_url, image_strip) + source = remote_file.read() + if comment_hack: + from re import sub + source = sub(r'(', source) + source = sub(r'()', + r'', + r'\1', output) + output = sub(r')', + r'\1', output) else: output = remote_file.read() From ejucovy at codespeak.net Mon Feb 11 17:53:48 2008 From: ejucovy at codespeak.net (ejucovy at codespeak.net) Date: Mon, 11 Feb 2008 17:53:48 +0100 (CET) Subject: [z3-checkins] r51392 - z3/deliverance/DeliveranceVHoster/trunk/errors/www.openplans.org Message-ID: <20080211165348.F1596168405@codespeak.net> Author: ejucovy Date: Mon Feb 11 17:53:48 2008 New Revision: 51392 Modified: z3/deliverance/DeliveranceVHoster/trunk/errors/www.openplans.org/error.html Log: Update error page to handle IE conditional resources... Modified: z3/deliverance/DeliveranceVHoster/trunk/errors/www.openplans.org/error.html ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/errors/www.openplans.org/error.html (original) +++ z3/deliverance/DeliveranceVHoster/trunk/errors/www.openplans.org/error.html Mon Feb 11 17:53:48 2008 @@ -1743,10 +1743,102 @@ } @@ -7248,8 +7340,8 @@ From ejucovy at codespeak.net Mon Feb 11 18:04:48 2008 From: ejucovy at codespeak.net (ejucovy at codespeak.net) Date: Mon, 11 Feb 2008 18:04:48 +0100 (CET) Subject: [z3-checkins] r51393 - z3/deliverance/DeliveranceVHoster/trunk/utils Message-ID: <20080211170448.923961683F5@codespeak.net> Author: ejucovy Date: Mon Feb 11 18:04:47 2008 New Revision: 51393 Modified: z3/deliverance/DeliveranceVHoster/trunk/utils/embed_url.py Log: Change defaults to automatically perform the extra processing and add a TODO comment to refelct the unfinished handling of @import statements Modified: z3/deliverance/DeliveranceVHoster/trunk/utils/embed_url.py ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/utils/embed_url.py (original) +++ z3/deliverance/DeliveranceVHoster/trunk/utils/embed_url.py Mon Feb 11 18:04:47 2008 @@ -32,19 +32,19 @@ URL. -c - --comment-hack - Hack IE conditional comments so that their internal resources will be - embedded as well. + --comment-hack-disable + Disable the hack for IE conditional comments so that their internal + resources will be embedded as well. -i - --image-strip - Strip any img tags from the document, since the are links to external - resources, and can not be embedded. + --image-strip-disable + Disable stripping of any img tags from the document, since they are + links to external resources, and can not be embedded. -p - --percent-escape - Escape any percent signs found in the text, turning % into %% so that it - will safely pass through the templating engine. + --percent-escape-disable + Disable the escaping of any percent signs found in the text, turning % + into %% so that it will safely pass through the templating engine. -o file --output file @@ -102,16 +102,16 @@ try: options, arguments = getopt(argv[1:], "hso:fdipc", ["help", "save", "output=", "force", - "disable", "image-strip", - "percent-escape", "comment-hack"]) + "disable", "image-strip-disable", + "percent-escape-disable", "comment-hack-disable"]) except GetoptError: __usage() exit(2) output = None - image_strip = False - percent_escape = False - comment_hack = False + image_strip = True + percent_escape = True + comment_hack = True save = False force = False disable = False @@ -124,12 +124,12 @@ save = True elif option in ("-o", "--output"): output = value - elif option in ("-c", "--comment-hack"): - comment_hack = True - elif option in ("-i", "--image-strip"): - image_strip = True - elif option in ("-p", "--percent-escape"): - percent_escape = True + elif option in ("-c", "--comment-hack-disable"): + comment_hack = False + elif option in ("-i", "--image-strip-disable"): + image_strip = False + elif option in ("-p", "--percent-escape-disable"): + percent_escape = False elif option in ("-f", "--force"): force = True elif option in ("-d", "--disable"): @@ -343,6 +343,7 @@ """If this data is for a style tag, we process @import statements.""" from re import sub if self.tag_stack and self.tag_stack[-1][0] == "style": + # TODO make this actually work for an embed # Style tags have a special kind of "link" contained in the # internal text. "@import" statements can be written in a couple of # different ways, and so we use a regex to find and replace them. @@ -355,8 +356,8 @@ # @import "./style.css" # @import url("/style.css") # @import url(/style.css) - data = sub(r'(@import\s+(url\("?|"))\.?/', "\\1%s/" % - self.url_base, data) + #data = sub(r'(@import\s+(url\("?|"))\.?/', "\\1%s/" % + # self.url_base, data) self.parsed += data # The rest of the overridden methods that follow don't do any parsing. We From z3-checkins at codespeak.net Tue Feb 12 12:06:53 2008 From: z3-checkins at codespeak.net (z3-checkins at codespeak.net) Date: Tue, 12 Feb 2008 12:06:53 +0100 (CET) Subject: [z3-checkins] February 72% OFF Message-ID: <20080212130627.3763.qmail@co126978-b.almel1.ov.home.nl> An HTML attachment was scrubbed... URL: http://codespeak.net/pipermail/z3-checkins/attachments/20080212/9570ff41/attachment.htm From ianb at codespeak.net Sun Feb 17 23:49:15 2008 From: ianb at codespeak.net (ianb at codespeak.net) Date: Sun, 17 Feb 2008 23:49:15 +0100 (CET) Subject: [z3-checkins] r51569 - z3/deliverance/trunk/deliverance Message-ID: <20080217224915.C8C0A168461@codespeak.net> Author: ianb Date: Sun Feb 17 23:49:14 2008 New Revision: 51569 Modified: z3/deliverance/trunk/deliverance/wsgimiddleware.py Log: typo in setting Cache-Control header Modified: z3/deliverance/trunk/deliverance/wsgimiddleware.py ============================================================================== --- z3/deliverance/trunk/deliverance/wsgimiddleware.py (original) +++ z3/deliverance/trunk/deliverance/wsgimiddleware.py Sun Feb 17 23:49:14 2008 @@ -356,7 +356,7 @@ del fetcher.environ['HTTP_IF_MODIFIED_SINCE'] if 'HTTP_IF_NONE_MATCH' in fetcher.environ: del fetcher.environ['HTTP_IF_NONE_MATCH'] - fetcher.environ['CACHE-CONTROL'] = 'no-cache' + fetcher.environ['HTTP_CACHE_CONTROL'] = 'no-cache' status, headers, body = fetcher.wsgi_get() From ianb at codespeak.net Sun Feb 17 23:50:16 2008 From: ianb at codespeak.net (ianb at codespeak.net) Date: Sun, 17 Feb 2008 23:50:16 +0100 (CET) Subject: [z3-checkins] r51570 - z3/deliverance/branches/nextgen Message-ID: <20080217225016.6B12A168461@codespeak.net> Author: ianb Date: Sun Feb 17 23:50:16 2008 New Revision: 51570 Added: z3/deliverance/branches/nextgen/ - copied from r51569, z3/deliverance/trunk/ Log: branching for WebOb and lxml 2 translation From z3-checkins at codespeak.net Mon Feb 18 03:21:56 2008 From: z3-checkins at codespeak.net (z3-checkins at codespeak.net) Date: Mon, 18 Feb 2008 03:21:56 +0100 (CET) Subject: [z3-checkins] February 76% OFF Message-ID: <20080217042004.3747.qmail@client-190.40.56.157.speedy.net.pe> An HTML attachment was scrubbed... URL: http://codespeak.net/pipermail/z3-checkins/attachments/20080218/efefbde5/attachment-0001.htm From ianb at codespeak.net Tue Feb 19 23:19:27 2008 From: ianb at codespeak.net (ianb at codespeak.net) Date: Tue, 19 Feb 2008 23:19:27 +0100 (CET) Subject: [z3-checkins] r51656 - z3/deliverance/trunk Message-ID: <20080219221927.337B31683F6@codespeak.net> Author: ianb Date: Tue Feb 19 23:19:26 2008 New Revision: 51656 Modified: z3/deliverance/trunk/setup.py Log: Added nose test runner, so you can do python setup.py test Modified: z3/deliverance/trunk/setup.py ============================================================================== --- z3/deliverance/trunk/setup.py (original) +++ z3/deliverance/trunk/setup.py Tue Feb 19 23:19:26 2008 @@ -77,6 +77,10 @@ deliverance-handtransform = deliverance.handtransform:main deliverance-static = deliverance.staticcommand:main """, + tests_require=[ + 'nose', + ], + test_suite='nose.collector', ) From ianb at codespeak.net Tue Feb 19 23:19:59 2008 From: ianb at codespeak.net (ianb at codespeak.net) Date: Tue, 19 Feb 2008 23:19:59 +0100 (CET) Subject: [z3-checkins] r51657 - z3/deliverance/trunk/deliverance Message-ID: <20080219221959.4483A1683F6@codespeak.net> Author: ianb Date: Tue Feb 19 23:19:58 2008 New Revision: 51657 Modified: z3/deliverance/trunk/deliverance/interpreter.py z3/deliverance/trunk/deliverance/utils.py z3/deliverance/trunk/deliverance/xslt.py Log: Keep xmlns out of places where rules are printed for debugging (error reports, comments). Not sure when the xmlns snuck in Modified: z3/deliverance/trunk/deliverance/interpreter.py ============================================================================== --- z3/deliverance/trunk/deliverance/interpreter.py (original) +++ z3/deliverance/trunk/deliverance/interpreter.py Tue Feb 19 23:19:58 2008 @@ -4,6 +4,7 @@ from deliverance import utils from deliverance.utils import RuleSyntaxError from deliverance.utils import RendererBase +from deliverance.utils import rule_tostring class Renderer(RendererBase): """ @@ -119,7 +120,7 @@ else: raise RuleSyntaxError( "Rule %s (%s) not understood" % ( - rule.tag, etree.tostring(rule))) + rule.tag, rule_tostring(rule))) # process possible "move" attribute self.check_move(rule, theme, content) @@ -487,6 +488,6 @@ returns a pair of comments for insertion before and after work done by the rule given during debugging. """ - comment_before = etree.Comment("Deliverance: applying rule %s" % etree.tostring(rule)) - comment_after = etree.Comment("Deliverance: done applying rule %s" % etree.tostring(rule)) + comment_before = etree.Comment("Deliverance: applying rule %s" % rule_tostring(rule)) + comment_after = etree.Comment("Deliverance: done applying rule %s" % rule_tostring(rule)) return comment_before, comment_after Modified: z3/deliverance/trunk/deliverance/utils.py ============================================================================== --- z3/deliverance/trunk/deliverance/utils.py (original) +++ z3/deliverance/trunk/deliverance/utils.py Tue Feb 19 23:19:58 2008 @@ -128,7 +128,7 @@ d.attrib['class'] = 'deliverance-error' d.text = 'Deliverance error: %s' % message br = etree.Element('br') - br.tail = 'rule: %s' % etree.tostring(rule) + br.tail = 'rule: %s' % rule_tostring(rule) d.append(br) if elts: d.append(etree.Element('br')) @@ -525,4 +525,13 @@ return new_xpath - +def rule_tostring(rule, include_xmlns=False): + """ + Convert a rule back to a string + """ + if include_xmlns: + return etree.tostring(rule) + else: + text = etree.tostring(rule) + text = text.replace(' xmlns="http://www.plone.org/deliverance"', '') + return text Modified: z3/deliverance/trunk/deliverance/xslt.py ============================================================================== --- z3/deliverance/trunk/deliverance/xslt.py (original) +++ z3/deliverance/trunk/deliverance/xslt.py Tue Feb 19 23:19:58 2008 @@ -5,6 +5,7 @@ from deliverance import utils from deliverance.utils import RuleSyntaxError from deliverance.utils import RendererBase +from deliverance.utils import rule_tostring xslt_wrapper_skel = """ @@ -425,9 +426,9 @@ for wrapping inserted content nodes during debugging """ comment_before = etree.Element("{%s}comment" % nsmap["xsl"]) - comment_before.text = "Deliverance: applying rule %s" % etree.tostring(rule) + comment_before.text = "Deliverance: applying rule %s" % rule_tostring(rule) comment_after = etree.Element("{%s}comment" % nsmap["xsl"]) - comment_after.text = "Deliverance: done applying rule %s" % etree.tostring(rule) + comment_after.text = "Deliverance: done applying rule %s" % rule_tostring(rule) return comment_before, comment_after From ianb at codespeak.net Tue Feb 19 23:26:16 2008 From: ianb at codespeak.net (ianb at codespeak.net) Date: Tue, 19 Feb 2008 23:26:16 +0100 (CET) Subject: [z3-checkins] r51659 - z3/deliverance/trunk/deliverance Message-ID: <20080219222616.72FCD1683F6@codespeak.net> Author: ianb Date: Tue Feb 19 23:26:15 2008 New Revision: 51659 Modified: z3/deliverance/trunk/deliverance/test_wsgi.py Log: comment out some tests that are based on missing files Modified: z3/deliverance/trunk/deliverance/test_wsgi.py ============================================================================== --- z3/deliverance/trunk/deliverance/test_wsgi.py (original) +++ z3/deliverance/trunk/deliverance/test_wsgi.py Tue Feb 19 23:26:15 2008 @@ -166,7 +166,9 @@ res2 = app.get('/expected.html?notheme') html_string_compare(res.body, res2.body) -def do_ignore(renderer_type, name): +def do_ignore(renderer_type, name): + ## FIXME: there are no files in test-data/ignore/, where this comes from. + return wsgi_app = DeliveranceMiddleware(ignore_app, 'theme.html', 'rules.xml', renderer_type) @@ -181,6 +183,8 @@ def do_ignore_header(renderer_type, name): + ## FIXME: there are no files in test-data/ignore/, where this comes from. + return class NoThemeHeaderApp: def __init__(self, app): self.app = app From tseaver at codespeak.net Wed Feb 20 00:59:17 2008 From: tseaver at codespeak.net (tseaver at codespeak.net) Date: Wed, 20 Feb 2008 00:59:17 +0100 (CET) Subject: [z3-checkins] r51662 - z3/deliverance/branches/urienv Message-ID: <20080219235917.9F9FE168401@codespeak.net> Author: tseaver Date: Wed Feb 20 00:59:16 2008 New Revision: 51662 Added: z3/deliverance/branches/urienv/ - copied from r51661, z3/deliverance/trunk/ Log: Branch for making theme / rule URIs configurable via WSGI environment. From tseaver at codespeak.net Wed Feb 20 01:02:15 2008 From: tseaver at codespeak.net (tseaver at codespeak.net) Date: Wed, 20 Feb 2008 01:02:15 +0100 (CET) Subject: [z3-checkins] r51663 - in z3/deliverance/branches/urienv/deliverance: . test-data/urienv Message-ID: <20080220000215.DC12D16840B@codespeak.net> Author: tseaver Date: Wed Feb 20 01:02:13 2008 New Revision: 51663 Added: z3/deliverance/branches/urienv/deliverance/test-data/urienv/ z3/deliverance/branches/urienv/deliverance/test-data/urienv/example.html z3/deliverance/branches/urienv/deliverance/test-data/urienv/example_expected_rule_uri_environ.html z3/deliverance/branches/urienv/deliverance/test-data/urienv/example_expected_theme_uri_environ.html z3/deliverance/branches/urienv/deliverance/test-data/urienv/example_expected_uppercase.html z3/deliverance/branches/urienv/deliverance/test-data/urienv/rules.xml z3/deliverance/branches/urienv/deliverance/test-data/urienv/rules2.xml z3/deliverance/branches/urienv/deliverance/test-data/urienv/theme.html z3/deliverance/branches/urienv/deliverance/test-data/urienv/theme2.html Modified: z3/deliverance/branches/urienv/deliverance/test_wsgi.py z3/deliverance/branches/urienv/deliverance/utils.py z3/deliverance/branches/urienv/deliverance/wsgimiddleware.py Log: Snapshot work for tweaking Deliverance URIs / serializer via WSGI environ. Added: z3/deliverance/branches/urienv/deliverance/test-data/urienv/example.html ============================================================================== --- (empty file) +++ z3/deliverance/branches/urienv/deliverance/test-data/urienv/example.html Wed Feb 20 01:02:13 2008 @@ -0,0 +1,10 @@ + + + I am a title + + + Early text

Paragraph one

+

Paragraph two

+ extra + + Added: z3/deliverance/branches/urienv/deliverance/test-data/urienv/example_expected_rule_uri_environ.html ============================================================================== --- (empty file) +++ z3/deliverance/branches/urienv/deliverance/test-data/urienv/example_expected_rule_uri_environ.html Wed Feb 20 01:02:13 2008 @@ -0,0 +1,13 @@ + + + + I am a title + + + + Some text +
+

Paragraph one

+
+ + Added: z3/deliverance/branches/urienv/deliverance/test-data/urienv/example_expected_theme_uri_environ.html ============================================================================== --- (empty file) +++ z3/deliverance/branches/urienv/deliverance/test-data/urienv/example_expected_theme_uri_environ.html Wed Feb 20 01:02:13 2008 @@ -0,0 +1,14 @@ + + + + I am a title + + + + Theme 2 text +
+

Paragraph one

+

Paragraph two

+
+ + Added: z3/deliverance/branches/urienv/deliverance/test-data/urienv/example_expected_uppercase.html ============================================================================== --- (empty file) +++ z3/deliverance/branches/urienv/deliverance/test-data/urienv/example_expected_uppercase.html Wed Feb 20 01:02:13 2008 @@ -0,0 +1,15 @@ + + + + +I AM A TITLE + + + + SOME TEXT +
+

PARAGRAPH ONE

+

PARAGRAPH TWO

+
+ + Added: z3/deliverance/branches/urienv/deliverance/test-data/urienv/rules.xml ============================================================================== --- (empty file) +++ z3/deliverance/branches/urienv/deliverance/test-data/urienv/rules.xml Wed Feb 20 01:02:13 2008 @@ -0,0 +1,9 @@ + + + + + + + + + Added: z3/deliverance/branches/urienv/deliverance/test-data/urienv/rules2.xml ============================================================================== --- (empty file) +++ z3/deliverance/branches/urienv/deliverance/test-data/urienv/rules2.xml Wed Feb 20 01:02:13 2008 @@ -0,0 +1,9 @@ + + + + + + + + + Added: z3/deliverance/branches/urienv/deliverance/test-data/urienv/theme.html ============================================================================== --- (empty file) +++ z3/deliverance/branches/urienv/deliverance/test-data/urienv/theme.html Wed Feb 20 01:02:13 2008 @@ -0,0 +1,9 @@ + + + Example + + + Some text +
replace this
+ + Added: z3/deliverance/branches/urienv/deliverance/test-data/urienv/theme2.html ============================================================================== --- (empty file) +++ z3/deliverance/branches/urienv/deliverance/test-data/urienv/theme2.html Wed Feb 20 01:02:13 2008 @@ -0,0 +1,9 @@ + + + Example + + + Theme 2 text +
replace this
+ + Modified: z3/deliverance/branches/urienv/deliverance/test_wsgi.py ============================================================================== --- z3/deliverance/branches/urienv/deliverance/test_wsgi.py (original) +++ z3/deliverance/branches/urienv/deliverance/test_wsgi.py Wed Feb 20 01:02:13 2008 @@ -23,6 +23,7 @@ aggregate_data = os.path.join(os.path.dirname(__file__), 'test-data', 'aggregate') aggregate2_data = os.path.join(os.path.dirname(__file__), 'test-data', 'aggregate2') ignore_data = os.path.join(os.path.dirname(__file__), 'test-data', 'ignore') +urienv_data = os.path.join(os.path.dirname(__file__), 'test-data', 'urienv') static_app = StaticURLParser(static_data) tasktracker_app = StaticURLParser(tasktracker_data) @@ -34,6 +35,7 @@ aggregate_app = StaticURLParser(aggregate_data) aggregate2_app = StaticURLParser(aggregate2_data) ignore_app = StaticURLParser(ignore_data) +urienv_app = StaticURLParser(urienv_data) def html_string_compare(astr, bstr): """ @@ -313,11 +315,51 @@ headers={'If-Modified-Since': formatdate(then-15)}) status = res.status assert(status == 200) + +def do_rule_uri_environ(renderer_type, name): + from deliverance.utils import setRuleURI + wsgi_app = DeliveranceMiddleware(urienv_app, 'theme.html', 'rules.xml', + renderer_type) + environ = {} + setRuleURI(environ, 'rules2.xml') + app = TestApp(wsgi_app, extra_environ=environ) + res = app.get('/example.html') + res2 = app.get('/example_expected_rule_uri_environ.html?notheme') + html_string_compare(res.body, res2.body) + +def do_theme_uri_environ(renderer_type, name): + from deliverance.utils import setThemeURI + wsgi_app = DeliveranceMiddleware(urienv_app, 'theme.html', 'rules.xml', + renderer_type) + environ = {} + setThemeURI(environ, 'theme2.html') + app = TestApp(wsgi_app, extra_environ=environ) + res = app.get('/example.html') + res2 = app.get('/example_expected_theme_uri_environ.html?notheme') + html_string_compare(res.body, res2.body) +def do_serializer_environ(renderer_type, name): + from deliverance.utils import setSerializer + wsgi_app = DeliveranceMiddleware(urienv_app, 'theme.html', 'rules.xml', + renderer_type) + environ = {} + setSerializer(environ, 'deliverance.test_wsgi:_uppercaseTextNodes') + app = TestApp(wsgi_app, extra_environ=environ) + res = app.get('/example.html') + res2 = app.get('/example_expected_uppercase.html?notheme') + html_string_compare(res.body, res2.body) + +def _uppercaseTextNodes(content): + from htmlserialize import tostring + return tostring(content, + doctype_pair=("-//W3C//DTD HTML 4.01 Transitional//EN", + "http://www.w3.org/TR/html4/loose.dtd") + ).upper() RENDERER_TYPES = ['py', 'xslt'] -TEST_FUNCS = [ do_url, do_basic, do_text, do_tasktracker, do_xinclude, do_with_spaces, do_nycsr, do_necoro, do_guidesearch, do_ajax, do_aggregate, do_aggregate2, do_cache, do_ignore, do_ignore_header ] +TEST_FUNCS = [ do_url, do_basic, do_text, do_tasktracker, do_xinclude, do_with_spaces, do_nycsr, do_necoro, do_guidesearch, do_ajax, do_aggregate, do_aggregate2, do_cache, do_ignore, do_ignore_header, do_rule_uri_environ, do_theme_uri_environ, do_serializer_environ ] + def test_all(): for renderer_type in RENDERER_TYPES: for test_func in TEST_FUNCS: Modified: z3/deliverance/branches/urienv/deliverance/utils.py ============================================================================== --- z3/deliverance/branches/urienv/deliverance/utils.py (original) +++ z3/deliverance/branches/urienv/deliverance/utils.py Wed Feb 20 01:02:13 2008 @@ -535,3 +535,37 @@ text = etree.tostring(rule) text = text.replace(' xmlns="http://www.plone.org/deliverance"', '') return text + +# API for sharing overridden theme / rule URIs with other middleware layers. + +_THEME_URI_KEY = 'deliverance.theme_uri' + +def setThemeURI(environ, uri): + environ[_THEME_URI_KEY] = uri + +def getThemeURI(environ, default=None): + return environ.get(_THEME_URI_KEY, default) + +_RULE_URI_KEY = 'deliverance.rule_uri' + +def setRuleURI(environ, uri): + environ[_RULE_URI_KEY] = uri + +def getRuleURI(environ, default=None): + return environ.get(_RULE_URI_KEY, default) + +_SERIALIZER_KEY = 'deliverance.serializer' + +def setSerializer(environ, dotted_or_egg): + environ[_SERIALIZER_KEY] = dotted_or_egg + +def getSerializer(environ, default=None): + dotted_or_egg = environ.get(_SERIALIZER_KEY, default) + if isinstance(dotted_or_egg, basestring): + return _resolveDottedOrEgg(dotted_or_egg) + return dotted_or_egg + +def _resolveDottedOrEgg(dotted_or_egg): + from pkg_resources import EntryPoint + return EntryPoint.parse('x=%s' % dotted_or_egg).load(False) + Modified: z3/deliverance/branches/urienv/deliverance/wsgimiddleware.py ============================================================================== --- z3/deliverance/branches/urienv/deliverance/wsgimiddleware.py (original) +++ z3/deliverance/branches/urienv/deliverance/wsgimiddleware.py Wed Feb 20 01:02:13 2008 @@ -15,6 +15,9 @@ from htmlserialize import tostring from deliverance.utils import DeliveranceError from deliverance.utils import DELIVERANCE_ERROR_PAGE +from deliverance.utils import getThemeURI +from deliverance.utils import getRuleURI +from deliverance.utils import getSerializer from deliverance.resource_fetcher import InternalResourceFetcher, FileResourceFetcher, ExternalResourceFetcher from deliverance import cache_utils import sys @@ -33,6 +36,11 @@ IGNORE_URL_PATTERN = re.compile("^.*\.(%s)$" % '|'.join(IGNORE_EXTENSIONS)) +def _toHTML(content): + return tostring(content, + doctype_pair=("-//W3C//DTD HTML 4.01 Transitional//EN", + "http://www.w3.org/TR/html4/loose.dtd")) + class DeliveranceMiddleware(object): """ a DeliveranceMiddleware object exposes a single deliverance @@ -41,7 +49,7 @@ def __init__(self, app, theme_uri, rule_uri, renderer='py', merge_cache_control=False, - is_internal_uri=None): + is_internal_uri=None, serializer=None): """ initializer @@ -60,6 +68,9 @@ should be considered 'internal'(passed to the subapplication) and false if the requestshould be send over the network. + serializer: dotted name or entry point indicdating a callable used + to post-process rendered output. Defaults to the '_toHTML' function + above. """ self.app = app self.theme_uri = theme_uri @@ -78,6 +89,9 @@ self._rendererType = renderer self._is_internal_uri = is_internal_uri + if serializer is None: + serializer = _toHTML + self.serializer = serializer def get_renderer(self, environ): return self.create_renderer(environ) @@ -88,11 +102,11 @@ information passed to the initializer. A new copy of the theme and rules is retrieved. """ - theme = self.theme(environ) - rule = self.rule(environ) + theme, theme_uri = self.theme(environ) + rule, rule_uri = self.rule(environ) full_theme_uri = urlparse.urljoin( construct_url(environ, with_path_info=False), - self.theme_uri) + theme_uri) def reference_resolver(href, parse, encoding=None): text = self.get_resource(environ, href) @@ -109,7 +123,7 @@ try: parsedTheme = parseHTML(theme) except Exception, message: - newmessage = "Unable to parse theme page (" + self.theme_uri + ")" + newmessage = "Unable to parse theme page (" + theme_uri + ")" if message: newmessage += ":" + str(message) raise DeliveranceError(newmessage) @@ -124,33 +138,40 @@ theme=parsedTheme, theme_uri=full_theme_uri, rule=parsedRule, - rule_uri=self.rule_uri, + rule_uri=rule_uri, reference_resolver=reference_resolver) - def rule(self, environ): - """ + def rule(self, environ=None): + """ environ -> (rule, rule_uri) retrieves the data referred to by the rule_uri passed to the initializer. """ + if environ is None: + environ = {} + rule_uri = getRuleURI(environ, self.rule_uri) try: - return self.get_resource(environ, self.rule_uri) + return (self.get_resource(environ, rule_uri), rule_uri) except Exception, message: - newmessage = "Unable to retrieve rules from " + self.rule_uri + newmessage = "Unable to retrieve rules from " + rule_uri if message: newmessage += ": " + str(message) raise DeliveranceError(newmessage) - def theme(self, environ): - """ + def theme(self, environ=None): + """ environ -> (theme, theme_uri) + retrieves the data referred to by the theme_uri passed to the initializer. """ + if environ is None: + environ = {} + theme_uri = getThemeURI(environ, self.theme_uri) try: - return self.get_resource(environ, self.theme_uri) + return (self.get_resource(environ, theme_uri), theme_uri) except Exception, message: message.public_html = 'Unable to retrieve theme page from %s: %s' % ( - self.theme_uri, message) + theme_uri, message) raise def __call__(self, environ, start_response): @@ -232,12 +253,12 @@ def filter_body(self, environ, body): """ returns the result of the deliverance transformation on the string 'body' - in the context of environ. The result is a string containing HTML. + in the context of environ. The result is a string containing HTML, + or whatever the configured serializer makes it. """ content = self.get_renderer(environ).render(parseHTML(body)) - - return tostring(content, doctype_pair=("-//W3C//DTD HTML 4.01 Transitional//EN", - "http://www.w3.org/TR/html4/loose.dtd")) + serializer = getSerializer(environ, self.serializer) + return serializer(content) def rebuild_check(self, environ, start_response): @@ -284,8 +305,8 @@ return (status, headers, body) # got 304 Not Modified for content, check other resources - rules = etree.XML(self.rule(environ)) - resources = self.get_resource_uris(rules) + rules = etree.XML(self.rule(environ)[0]) + resources = self.get_resource_uris(rules, environ) if self.any_modified(environ, resources, etag_map): # something changed, # get the content explicitly and give it back @@ -425,14 +446,18 @@ return cleaned - def get_resource_uris(self, rules): + def get_resource_uris(self, rules, environ=None): """ retrieves a list of uris pointing to the resources that are components of rendering (excluding content) """ + if environ is None: + environ = {} resources = Set() - resources.add(self.rule_uri) - resources.add(self.theme_uri) + rule_uri = getRuleURI(environ, self.rule_uri) + resources.add(rule_uri) + theme_uri = getThemeURI(environ, self.theme_uri) + resources.add(theme_uri) for rule in rules: href = rule.get("href",None) From tseaver at codespeak.net Fri Feb 22 17:06:03 2008 From: tseaver at codespeak.net (tseaver at codespeak.net) Date: Fri, 22 Feb 2008 17:06:03 +0100 (CET) Subject: [z3-checkins] r51804 - z3/deliverance/branches/urienv/deliverance Message-ID: <20080222160603.67A21168400@codespeak.net> Author: tseaver Date: Fri Feb 22 17:06:02 2008 New Revision: 51804 Modified: z3/deliverance/branches/urienv/deliverance/wsgimiddleware.py Log: Fix m/w factory to include serializer from Paste config. Modified: z3/deliverance/branches/urienv/deliverance/wsgimiddleware.py ============================================================================== --- z3/deliverance/branches/urienv/deliverance/wsgimiddleware.py (original) +++ z3/deliverance/branches/urienv/deliverance/wsgimiddleware.py Fri Feb 22 17:06:02 2008 @@ -523,12 +523,12 @@ def make_filter(app, global_conf, theme_uri=None, rule_uri=None, - renderer='py'): + renderer='py', serializer=None): assert theme_uri is not None, ( "You must give a theme_uri") assert rule_uri is not None, ( "You must give a rule_uri") return DeliveranceMiddleware( app, theme_uri, rule_uri, - renderer=renderer) + renderer=renderer, serializer=serializer) From tseaver at codespeak.net Fri Feb 22 20:04:44 2008 From: tseaver at codespeak.net (tseaver at codespeak.net) Date: Fri, 22 Feb 2008 20:04:44 +0100 (CET) Subject: [z3-checkins] r51808 - z3/deliverance/branches/urienv/deliverance Message-ID: <20080222190444.57FD8168529@codespeak.net> Author: tseaver Date: Fri Feb 22 20:04:40 2008 New Revision: 51808 Modified: z3/deliverance/branches/urienv/deliverance/test_wsgi.py z3/deliverance/branches/urienv/deliverance/utils.py z3/deliverance/branches/urienv/deliverance/wsgimiddleware.py Log: Avoid camelCased API names. Modified: z3/deliverance/branches/urienv/deliverance/test_wsgi.py ============================================================================== --- z3/deliverance/branches/urienv/deliverance/test_wsgi.py (original) +++ z3/deliverance/branches/urienv/deliverance/test_wsgi.py Fri Feb 22 20:04:40 2008 @@ -317,33 +317,33 @@ assert(status == 200) def do_rule_uri_environ(renderer_type, name): - from deliverance.utils import setRuleURI + from deliverance.utils import set_rule_uri wsgi_app = DeliveranceMiddleware(urienv_app, 'theme.html', 'rules.xml', renderer_type) environ = {} - setRuleURI(environ, 'rules2.xml') + set_rule_uri(environ, 'rules2.xml') app = TestApp(wsgi_app, extra_environ=environ) res = app.get('/example.html') res2 = app.get('/example_expected_rule_uri_environ.html?notheme') html_string_compare(res.body, res2.body) def do_theme_uri_environ(renderer_type, name): - from deliverance.utils import setThemeURI + from deliverance.utils import set_theme_uri wsgi_app = DeliveranceMiddleware(urienv_app, 'theme.html', 'rules.xml', renderer_type) environ = {} - setThemeURI(environ, 'theme2.html') + set_theme_uri(environ, 'theme2.html') app = TestApp(wsgi_app, extra_environ=environ) res = app.get('/example.html') res2 = app.get('/example_expected_theme_uri_environ.html?notheme') html_string_compare(res.body, res2.body) def do_serializer_environ(renderer_type, name): - from deliverance.utils import setSerializer + from deliverance.utils import set_serializer wsgi_app = DeliveranceMiddleware(urienv_app, 'theme.html', 'rules.xml', renderer_type) environ = {} - setSerializer(environ, 'deliverance.test_wsgi:_uppercaseTextNodes') + set_serializer(environ, 'deliverance.test_wsgi:_uppercaseTextNodes') app = TestApp(wsgi_app, extra_environ=environ) res = app.get('/example.html') res2 = app.get('/example_expected_uppercase.html?notheme') Modified: z3/deliverance/branches/urienv/deliverance/utils.py ============================================================================== --- z3/deliverance/branches/urienv/deliverance/utils.py (original) +++ z3/deliverance/branches/urienv/deliverance/utils.py Fri Feb 22 20:04:40 2008 @@ -540,26 +540,26 @@ _THEME_URI_KEY = 'deliverance.theme_uri' -def setThemeURI(environ, uri): +def set_theme_uri(environ, uri): environ[_THEME_URI_KEY] = uri -def getThemeURI(environ, default=None): +def get_theme_uri(environ, default=None): return environ.get(_THEME_URI_KEY, default) _RULE_URI_KEY = 'deliverance.rule_uri' -def setRuleURI(environ, uri): +def set_rule_uri(environ, uri): environ[_RULE_URI_KEY] = uri -def getRuleURI(environ, default=None): +def get_rule_uri(environ, default=None): return environ.get(_RULE_URI_KEY, default) _SERIALIZER_KEY = 'deliverance.serializer' -def setSerializer(environ, dotted_or_egg): +def set_serializer(environ, dotted_or_egg): environ[_SERIALIZER_KEY] = dotted_or_egg -def getSerializer(environ, default=None): +def get_serializer(environ, default=None): dotted_or_egg = environ.get(_SERIALIZER_KEY, default) if isinstance(dotted_or_egg, basestring): return _resolveDottedOrEgg(dotted_or_egg) Modified: z3/deliverance/branches/urienv/deliverance/wsgimiddleware.py ============================================================================== --- z3/deliverance/branches/urienv/deliverance/wsgimiddleware.py (original) +++ z3/deliverance/branches/urienv/deliverance/wsgimiddleware.py Fri Feb 22 20:04:40 2008 @@ -15,9 +15,9 @@ from htmlserialize import tostring from deliverance.utils import DeliveranceError from deliverance.utils import DELIVERANCE_ERROR_PAGE -from deliverance.utils import getThemeURI -from deliverance.utils import getRuleURI -from deliverance.utils import getSerializer +from deliverance.utils import get_theme_uri +from deliverance.utils import get_rule_uri +from deliverance.utils import get_serializer from deliverance.resource_fetcher import InternalResourceFetcher, FileResourceFetcher, ExternalResourceFetcher from deliverance import cache_utils import sys @@ -148,7 +148,7 @@ """ if environ is None: environ = {} - rule_uri = getRuleURI(environ, self.rule_uri) + rule_uri = get_rule_uri(environ, self.rule_uri) try: return (self.get_resource(environ, rule_uri), rule_uri) except Exception, message: @@ -166,7 +166,7 @@ """ if environ is None: environ = {} - theme_uri = getThemeURI(environ, self.theme_uri) + theme_uri = get_theme_uri(environ, self.theme_uri) try: return (self.get_resource(environ, theme_uri), theme_uri) except Exception, message: @@ -257,7 +257,7 @@ or whatever the configured serializer makes it. """ content = self.get_renderer(environ).render(parseHTML(body)) - serializer = getSerializer(environ, self.serializer) + serializer = get_serializer(environ, self.serializer) return serializer(content) @@ -454,9 +454,9 @@ if environ is None: environ = {} resources = Set() - rule_uri = getRuleURI(environ, self.rule_uri) + rule_uri = get_rule_uri(environ, self.rule_uri) resources.add(rule_uri) - theme_uri = getThemeURI(environ, self.theme_uri) + theme_uri = get_theme_uri(environ, self.theme_uri) resources.add(theme_uri) for rule in rules: From tseaver at codespeak.net Fri Feb 22 20:10:49 2008 From: tseaver at codespeak.net (tseaver at codespeak.net) Date: Fri, 22 Feb 2008 20:10:49 +0100 (CET) Subject: [z3-checkins] r51809 - z3/deliverance/branches/urienv Message-ID: <20080222191049.DC4711683FE@codespeak.net> Author: tseaver Date: Fri Feb 22 20:10:49 2008 New Revision: 51809 Modified: z3/deliverance/branches/urienv/setup.py Log: Relax unneeded restriction on lxml versions. Modified: z3/deliverance/branches/urienv/setup.py ============================================================================== --- z3/deliverance/branches/urienv/setup.py (original) +++ z3/deliverance/branches/urienv/setup.py Fri Feb 22 20:10:49 2008 @@ -54,7 +54,7 @@ packages=find_packages(exclude=[]), zip_safe=False, install_requires=[ - 'lxml>=1.2,<2.0dev', + 'lxml>=1.2', 'Paste', 'FormEncode', 'elementtree', From magicbronson at codespeak.net Fri Feb 22 20:42:49 2008 From: magicbronson at codespeak.net (magicbronson at codespeak.net) Date: Fri, 22 Feb 2008 20:42:49 +0100 (CET) Subject: [z3-checkins] r51810 - z3/deliverance/tags/0.1.2 Message-ID: <20080222194249.EF06516843E@codespeak.net> Author: magicbronson Date: Fri Feb 22 20:42:49 2008 New Revision: 51810 Added: z3/deliverance/tags/0.1.2/ - copied from r51809, z3/deliverance/trunk/ Log: cutting 0.1.2 tag from trunk From magicbronson at codespeak.net Fri Feb 22 20:52:20 2008 From: magicbronson at codespeak.net (magicbronson at codespeak.net) Date: Fri, 22 Feb 2008 20:52:20 +0100 (CET) Subject: [z3-checkins] r51811 - z3/deliverance/DeliveranceVHoster/tags/0.1.1 Message-ID: <20080222195220.83BAF16851F@codespeak.net> Author: magicbronson Date: Fri Feb 22 20:52:19 2008 New Revision: 51811 Added: z3/deliverance/DeliveranceVHoster/tags/0.1.1/ - copied from r51810, z3/deliverance/DeliveranceVHoster/trunk/ Log: cutting tag 0.1.1 for release from trunk From ianb at codespeak.net Tue Feb 26 18:59:43 2008 From: ianb at codespeak.net (ianb at codespeak.net) Date: Tue, 26 Feb 2008 18:59:43 +0100 (CET) Subject: [z3-checkins] r51875 - z3/deliverance/DeliveranceVHoster/trunk/dvhoster Message-ID: <20080226175943.075381683E1@codespeak.net> Author: ianb Date: Tue Feb 26 18:59:41 2008 New Revision: 51875 Modified: z3/deliverance/DeliveranceVHoster/trunk/dvhoster/util.py Log: Use execfile instead of exec Modified: z3/deliverance/DeliveranceVHoster/trunk/dvhoster/util.py ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/dvhoster/util.py (original) +++ z3/deliverance/DeliveranceVHoster/trunk/dvhoster/util.py Tue Feb 26 18:59:41 2008 @@ -15,12 +15,9 @@ if not os.path.exists(description): raise OSError( "No file exists by the name %r" % description) - f = open(description, 'r') - c = f.read() - f.close() - ns = {'__file__': os.path.abspath(description)} - exec c in ns - if default_name not in ns: + ns = {'__file__': description} + execfile(description, ns) + if not default_name in ns: raise NameError( "The file %r must provide a function by the name %s" % (description, default_name)) From ianb at codespeak.net Thu Feb 28 22:35:40 2008 From: ianb at codespeak.net (ianb at codespeak.net) Date: Thu, 28 Feb 2008 22:35:40 +0100 (CET) Subject: [z3-checkins] r51928 - z3/deliverance/DeliveranceVHoster/trunk/dvhoster Message-ID: <20080228213540.9BAAB1684E3@codespeak.net> Author: ianb Date: Thu Feb 28 22:35:38 2008 New Revision: 51928 Modified: z3/deliverance/DeliveranceVHoster/trunk/dvhoster/scrubber.py Log: Add a fixup for the incoming request, that translates X-Forwarded-Scheme to wsgi.url_scheme, and translates X-Forwarded-Port to SERVER_PORT and the port portion of HTTP_HOST Modified: z3/deliverance/DeliveranceVHoster/trunk/dvhoster/scrubber.py ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/dvhoster/scrubber.py (original) +++ z3/deliverance/DeliveranceVHoster/trunk/dvhoster/scrubber.py Thu Feb 28 22:35:38 2008 @@ -26,8 +26,17 @@ def __call__(self, environ, start_response): self.clean_environ_headers(environ) + self.fixup_forwarded_headers(environ) return self.app(environ, start_response) + def fixup_forwarded_headers(self, environ): + if 'HTTP_X_FORWARDED_SCHEME' in environ: + environ['wsgi.url_scheme'] = environ.pop('HTTP_X_FORWARDED_SCHEME') + if 'HTTP_X_FORWARDED_PORT' in environ: + port = environ.pop('HTTP_X_FORWARDED_PORT') + environ['SERVER_PORT'] = port + http_host = environ['HTTP_HOST'].split(':', 1)[0] + environ['HTTP_HOST'] = '%s:%s' % (http_host, port) def clean_environ_headers(self, environ): """ From rafrombrc at codespeak.net Sat Mar 1 01:26:18 2008 From: rafrombrc at codespeak.net (rafrombrc at codespeak.net) Date: Sat, 1 Mar 2008 01:26:18 +0100 (CET) Subject: [z3-checkins] r51969 - z3/deliverance/DeliveranceVHoster/trunk Message-ID: <20080301002618.9A0711684FE@codespeak.net> Author: rafrombrc Date: Sat Mar 1 01:26:17 2008 New Revision: 51969 Modified: z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Log: add commented out force_ssl setting Modified: z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl (original) +++ z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Sat Mar 1 01:26:17 2008 @@ -37,6 +37,9 @@ # WARNING: *THE LINE BELOW MUST BE FALSE ON A PRODUCTION ENVIRONMENT* set debug = false +# Force certain URLs to use SSL, others to not +#force_ssl = True + logger = {{env.var}}/logs/deliverance/dvhoster.log init_domain = %(base_path)s/deliverance/src/openplans_hooks/openplans_hooks.py From ianb at codespeak.net Mon Mar 3 22:01:57 2008 From: ianb at codespeak.net (ianb at codespeak.net) Date: Mon, 3 Mar 2008 22:01:57 +0100 (CET) Subject: [z3-checkins] r52124 - in z3/deliverance/trunk/deliverance: . test-data/aggregate2 Message-ID: <20080303210157.B1617169F00@codespeak.net> Author: ianb Date: Mon Mar 3 22:01:56 2008 New Revision: 52124 Modified: z3/deliverance/trunk/deliverance/test-data/aggregate2/expected.html z3/deliverance/trunk/deliverance/wsgimiddleware.py Log: Add a to pages that don't already have it Modified: z3/deliverance/trunk/deliverance/test-data/aggregate2/expected.html ============================================================================== --- z3/deliverance/trunk/deliverance/test-data/aggregate2/expected.html (original) +++ z3/deliverance/trunk/deliverance/test-data/aggregate2/expected.html Mon Mar 3 22:01:56 2008 @@ -1,6 +1,7 @@ +
- \ No newline at end of file + Modified: z3/deliverance/trunk/deliverance/wsgimiddleware.py ============================================================================== --- z3/deliverance/trunk/deliverance/wsgimiddleware.py (original) +++ z3/deliverance/trunk/deliverance/wsgimiddleware.py Mon Mar 3 22:01:56 2008 @@ -359,7 +359,7 @@ fetcher.environ['HTTP_CACHE_CONTROL'] = 'no-cache' - status, headers, body = fetcher.wsgi_get() + status, headers, body = fetcher.wsgi_get() if not status.startswith('200'): path_info = uri @@ -373,6 +373,8 @@ % (construct_url(environ), path_info, status, loc)) + body = fixup_meta_content_type(headers, body) + environ[DELIVERANCE_CACHE][uri] = (status, headers, body) return body @@ -507,3 +509,27 @@ app, theme_uri, rule_uri, renderer=renderer) +_http_equiv_re = re.compile(r']*http-equiv="?content-type"?[^>]*>', re.I|re.S) +_head_re = re.compile(r']*>', re.I|re.S) +_html_re = re.compile(r']*>', re.I|re.S) + +def fixup_meta_content_type(headers, body): + """ + This, in a somewhat hacky fashion, adds to pages that do not already have it. + """ + ## FIXME: the existance of this function is a total hack + content_type = header_value(headers, 'content-type') + if not content_type or not content_type.startswith('text/html'): + return body + if _http_equiv_re.search(body): + # Already has the tag + return body + http_equiv = '\n' % content_type + match = _head_re.search(body) + if not match: + match = _html_re.search(body) + if not match: + # Doesn't look like html + return body + return body[:match.end()] + http_equiv + body[match.end():] From rafrombrc at codespeak.net Tue Mar 4 00:42:43 2008 From: rafrombrc at codespeak.net (rafrombrc at codespeak.net) Date: Tue, 4 Mar 2008 00:42:43 +0100 (CET) Subject: [z3-checkins] r52130 - z3/deliverance/DeliveranceVHoster/trunk Message-ID: <20080303234243.7993C169F36@codespeak.net> Author: rafrombrc Date: Tue Mar 4 00:42:42 2008 New Revision: 52130 Modified: z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Log: better comment Modified: z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl (original) +++ z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Tue Mar 4 00:42:42 2008 @@ -37,7 +37,7 @@ # WARNING: *THE LINE BELOW MUST BE FALSE ON A PRODUCTION ENVIRONMENT* set debug = false -# Force certain URLs to use SSL, others to not +# Force certain URLs to use SSL, or not (via build.ini's sslonly setting) #force_ssl = True logger = {{env.var}}/logs/deliverance/dvhoster.log From tseaver at codespeak.net Tue Mar 4 16:54:10 2008 From: tseaver at codespeak.net (tseaver at codespeak.net) Date: Tue, 4 Mar 2008 16:54:10 +0100 (CET) Subject: [z3-checkins] r52148 - z3/deliverance/branches/urienv/deliverance Message-ID: <20080304155410.EF555169FA7@codespeak.net> Author: tseaver Date: Tue Mar 4 16:54:09 2008 New Revision: 52148 Modified: z3/deliverance/branches/urienv/deliverance/utils.py Log: - Break out 'resolve_callable' as a separate utility. - Make 'resolve_dotted_or_egg' public, non-camelCased. - Add 'bool_from_string' utility for parsing config values. Modified: z3/deliverance/branches/urienv/deliverance/utils.py ============================================================================== --- z3/deliverance/branches/urienv/deliverance/utils.py (original) +++ z3/deliverance/branches/urienv/deliverance/utils.py Tue Mar 4 16:54:09 2008 @@ -560,12 +560,19 @@ environ[_SERIALIZER_KEY] = dotted_or_egg def get_serializer(environ, default=None): - dotted_or_egg = environ.get(_SERIALIZER_KEY, default) + return resolve_callable(environ.get(_SERIALIZER_KEY, default)) + +def resolve_callable(dotted_or_egg): if isinstance(dotted_or_egg, basestring): - return _resolveDottedOrEgg(dotted_or_egg) + return resolve_dotted_or_egg(dotted_or_egg) return dotted_or_egg -def _resolveDottedOrEgg(dotted_or_egg): +def resolve_dotted_or_egg(dotted_or_egg): from pkg_resources import EntryPoint return EntryPoint.parse('x=%s' % dotted_or_egg).load(False) +def bool_from_string(value): + if isinstance(value, basestring): + if value.lower() in ('false', 'no'): + return False + return bool(value) From tseaver at codespeak.net Tue Mar 4 16:56:24 2008 From: tseaver at codespeak.net (tseaver at codespeak.net) Date: Tue, 4 Mar 2008 16:56:24 +0100 (CET) Subject: [z3-checkins] r52149 - z3/deliverance/branches/urienv/deliverance Message-ID: <20080304155624.053A3169FA9@codespeak.net> Author: tseaver Date: Tue Mar 4 16:56:24 2008 New Revision: 52149 Modified: z3/deliverance/branches/urienv/deliverance/wsgimiddleware.py Log: Expose all DelieranceMiddleware ctor args to Paste config. - Incorporates Reinout van Rees' 'always_external' feature, with a slightly more general spelling. Modified: z3/deliverance/branches/urienv/deliverance/wsgimiddleware.py ============================================================================== --- z3/deliverance/branches/urienv/deliverance/wsgimiddleware.py (original) +++ z3/deliverance/branches/urienv/deliverance/wsgimiddleware.py Tue Mar 4 16:56:24 2008 @@ -13,11 +13,13 @@ from paste.request import construct_url from paste.response import header_value, replace_header from htmlserialize import tostring +from deliverance.utils import bool_from_string from deliverance.utils import DeliveranceError from deliverance.utils import DELIVERANCE_ERROR_PAGE from deliverance.utils import get_theme_uri from deliverance.utils import get_rule_uri from deliverance.utils import get_serializer +from deliverance.utils import resolve_callable from deliverance.resource_fetcher import InternalResourceFetcher, FileResourceFetcher, ExternalResourceFetcher from deliverance import cache_utils import sys @@ -75,7 +77,7 @@ self.app = app self.theme_uri = theme_uri self.rule_uri = rule_uri - self.merge_cache_control = merge_cache_control + self.merge_cache_control = bool_from_string(merge_cache_control) if renderer == 'py': import interpreter @@ -88,7 +90,7 @@ else: self._rendererType = renderer - self._is_internal_uri = is_internal_uri + self._is_internal_uri = resolve_callable(is_internal_uri) if serializer is None: serializer = _toHTML self.serializer = serializer @@ -521,14 +523,37 @@ # blacklisting can happen here as well return re.match(IGNORE_URL_PATTERN, url) is not None + +def always_external(uri, environ): + """Always return False so the external loader is used. + + o Configure in paste config using the following: + + is_internal_uri = deliverance.wsgimiddleware:always_external + """ + return False + + def make_filter(app, global_conf, - theme_uri=None, rule_uri=None, - renderer='py', serializer=None): + theme_uri=None, + rule_uri=None, + renderer='py', + merge_cache_control=False, + is_internal_uri=None, + serializer=None, + ): + """ Configure DeliveranceError via Paste config. + """ assert theme_uri is not None, ( "You must give a theme_uri") assert rule_uri is not None, ( "You must give a rule_uri") - return DeliveranceMiddleware( - app, theme_uri, rule_uri, - renderer=renderer, serializer=serializer) + return DeliveranceMiddleware(app=app, + theme_uri=theme_uri, + rule_uri=rule_uri, + renderer=renderer, + merge_cache_control=merge_cache_control, + is_internal_uri=is_internal_uri, + serializer=serializer, + ) From tseaver at codespeak.net Tue Mar 4 17:01:55 2008 From: tseaver at codespeak.net (tseaver at codespeak.net) Date: Tue, 4 Mar 2008 17:01:55 +0100 (CET) Subject: [z3-checkins] r52150 - z3/deliverance/branches/urienv/deliverance Message-ID: <20080304160155.28F66169F72@codespeak.net> Author: tseaver Date: Tue Mar 4 17:01:54 2008 New Revision: 52150 Modified: z3/deliverance/branches/urienv/deliverance/wsgimiddleware.py Log: PEP 8: linwidth <= 79. Modified: z3/deliverance/branches/urienv/deliverance/wsgimiddleware.py ============================================================================== --- z3/deliverance/branches/urienv/deliverance/wsgimiddleware.py (original) +++ z3/deliverance/branches/urienv/deliverance/wsgimiddleware.py Tue Mar 4 17:01:54 2008 @@ -20,7 +20,9 @@ from deliverance.utils import get_rule_uri from deliverance.utils import get_serializer from deliverance.utils import resolve_callable -from deliverance.resource_fetcher import InternalResourceFetcher, FileResourceFetcher, ExternalResourceFetcher +from deliverance.resource_fetcher import InternalResourceFetcher +from deliverance.resource_fetcher import FileResourceFetcher +from deliverance.resource_fetcher import ExternalResourceFetcher from deliverance import cache_utils import sys import datetime @@ -32,9 +34,11 @@ DELIVERANCE_BASE_URL = 'deliverance.base-url' DELIVERANCE_CACHE = 'deliverance.cache' -IGNORE_EXTENSIONS = ['js','css','gif','jpg','jpeg','pdf','ps','doc','png','ico','mov','mpg','mpeg', 'mp3','m4a', - 'txt','rtf', 'swf', 'wav', 'zip', 'wmv', 'ppt', 'gz', 'tgz', 'jar', 'xls', 'bmp', 'tif', 'tga', - 'hqx', 'avi'] +IGNORE_EXTENSIONS = ['js', 'css', 'gif', 'jpg', 'jpeg', 'pdf', 'ps', 'doc', + 'png', 'ico', 'mov', 'mpg', 'mpeg', 'mp3', 'm4a', 'txt', + 'rtf', 'swf', 'wav', 'zip', 'wmv', 'ppt', 'gz', 'tgz', + 'jar', 'xls', 'bmp', 'tif', 'tga', 'hqx', 'avi', + ] IGNORE_URL_PATTERN = re.compile("^.*\.(%s)$" % '|'.join(IGNORE_EXTENSIONS)) @@ -86,7 +90,8 @@ import xslt self._rendererType = xslt.Renderer elif renderer is None or isinstance(renderer, basestring): - raise ValueError("Unknown Renderer: %s - Expecting 'py' or 'xslt'" % renderer) + raise ValueError("Unknown Renderer: %s - Expecting 'py' or 'xslt'" + % renderer) else: self._rendererType = renderer @@ -172,8 +177,8 @@ try: return (self.get_resource(environ, theme_uri), theme_uri) except Exception, message: - message.public_html = 'Unable to retrieve theme page from %s: %s' % ( - theme_uri, message) + message.public_html = ('Unable to retrieve theme page from %s: %s' + % (theme_uri, message)) raise def __call__(self, environ, start_response): @@ -185,13 +190,16 @@ initializer. """ qs = environ.get('QUERY_STRING', '') - environ[DELIVERANCE_BASE_URL] = construct_url(environ, with_path_info=False, with_query_string=False) + environ[DELIVERANCE_BASE_URL] = construct_url(environ, + with_path_info=False, + with_query_string=False) environ[DELIVERANCE_CACHE] = {} notheme = 'notheme' in qs if environ.get('HTTP_X_REQUESTED_WITH', '') == 'XMLHttpRequest': notheme = True if notheme: - # eliminate the deliverance notheme query argument for the subrequest + # eliminate the deliverance notheme query argument for + # the subrequest if qs == 'notheme': environ['QUERY_STRING'] = '' elif qs.endswith('¬heme'): @@ -250,11 +258,12 @@ type = header_value(headers, 'content-type') if type is None: return True # yerg, 304s can have no content-type - return type.startswith('text/html') or type.startswith('application/xhtml+xml') + return (type.startswith('text/html') or + type.startswith('application/xhtml+xml')) def filter_body(self, environ, body): """ - returns the result of the deliverance transformation on the string 'body' + returns the result of the deliverance transform on the string 'body' in the context of environ. The result is a string containing HTML, or whatever the configured serializer makes it. """ @@ -270,7 +279,8 @@ etag_map = {} if 'HTTP_IF_NONE_MATCH' in environ: - etag_map = cache_utils.parse_merged_etag(environ['HTTP_IF_NONE_MATCH']) + etag_map = cache_utils.parse_merged_etag( + environ['HTTP_IF_NONE_MATCH']) tag = etag_map.get(content_url, None) environ['HTTP_IF_NONE_MATCH'] = tag if tag: @@ -392,7 +402,8 @@ else: loc = '' raise DeliveranceError( - "Request for internal resource at %s (%r) failed with status code %r%s" + "Request for internal resource at %s (%r) failed " + "with status code %r%s" % (construct_url(environ), path_info, status, loc)) @@ -469,16 +480,16 @@ return list(resources) - def check_modification(self, environ, uri, httpdate_since=None, etag=None): + def check_modification(self, environ, uri, httpdate_since=None, etag=None): """ - if httpdate_since is set to an httpdate the If-Modified-Since HTTP header - is used to check for modification + if httpdate_since is set to an httpdate the If-Modified-Since HTTP + header is used to check for modification - if etag is set to an etag for the resource, the If-None-Match HTTP header - is used to check for modification + if etag is set to an etag for the resource, the If-None-Match HTTP + header is used to check for modification - the resulting (status, headers, body) tuple for the request is stored in - environ[DELIVERANCE_CACHE][uri]. + the resulting (status, headers, body) tuple for the request is stored + in environ[DELIVERANCE_CACHE][uri]. """ From tseaver at codespeak.net Tue Mar 4 17:42:41 2008 From: tseaver at codespeak.net (tseaver at codespeak.net) Date: Tue, 4 Mar 2008 17:42:41 +0100 (CET) Subject: [z3-checkins] r52152 - z3/deliverance/trunk Message-ID: <20080304164241.3A907169F6B@codespeak.net> Author: tseaver Date: Tue Mar 4 17:42:40 2008 New Revision: 52152 Modified: z3/deliverance/trunk/setup.py Log: Signal next release; relax restriction on lxml 2.x Modified: z3/deliverance/trunk/setup.py ============================================================================== --- z3/deliverance/trunk/setup.py (original) +++ z3/deliverance/trunk/setup.py Tue Mar 4 17:42:40 2008 @@ -1,4 +1,4 @@ -__version__ = '0.1.2' +__version__ = '0.2dev' from setuptools import setup, find_packages @@ -54,7 +54,7 @@ packages=find_packages(exclude=[]), zip_safe=False, install_requires=[ - 'lxml>=1.2,<2.0dev', + 'lxml>=1.2', 'Paste', 'FormEncode', 'elementtree', From tseaver at codespeak.net Tue Mar 4 17:54:11 2008 From: tseaver at codespeak.net (tseaver at codespeak.net) Date: Tue, 4 Mar 2008 17:54:11 +0100 (CET) Subject: [z3-checkins] r52153 - in z3/deliverance/trunk/deliverance: . test-data/urienv Message-ID: <20080304165411.36759169F61@codespeak.net> Author: tseaver Date: Tue Mar 4 17:54:10 2008 New Revision: 52153 Added: z3/deliverance/trunk/deliverance/test-data/urienv/ - copied from r52150, z3/deliverance/branches/urienv/deliverance/test-data/urienv/ Modified: z3/deliverance/trunk/deliverance/test_wsgi.py z3/deliverance/trunk/deliverance/utils.py z3/deliverance/trunk/deliverance/wsgimiddleware.py Log: Merge urienv branch: - (wsgimiddleware): Wrap long lines per PEP 8. - (wsgimiddleware) Expose all middleware constructor arguments via Paste config. - (wsgimiddleware) Check for environmental overrides of theme URI, rule URI, serializer, and apply. - (utils) Added APIs for parsing non-string config values ('resolve_callable', 'resolve_dotted_or_egg', 'bool_from_string'). - (utils) Added APIs for getting / setting environmental overrides of theme URI, rule URI, serializer. Modified: z3/deliverance/trunk/deliverance/test_wsgi.py ============================================================================== --- z3/deliverance/trunk/deliverance/test_wsgi.py (original) +++ z3/deliverance/trunk/deliverance/test_wsgi.py Tue Mar 4 17:54:10 2008 @@ -23,6 +23,7 @@ aggregate_data = os.path.join(os.path.dirname(__file__), 'test-data', 'aggregate') aggregate2_data = os.path.join(os.path.dirname(__file__), 'test-data', 'aggregate2') ignore_data = os.path.join(os.path.dirname(__file__), 'test-data', 'ignore') +urienv_data = os.path.join(os.path.dirname(__file__), 'test-data', 'urienv') static_app = StaticURLParser(static_data) tasktracker_app = StaticURLParser(tasktracker_data) @@ -34,6 +35,7 @@ aggregate_app = StaticURLParser(aggregate_data) aggregate2_app = StaticURLParser(aggregate2_data) ignore_app = StaticURLParser(ignore_data) +urienv_app = StaticURLParser(urienv_data) def html_string_compare(astr, bstr): """ @@ -313,11 +315,51 @@ headers={'If-Modified-Since': formatdate(then-15)}) status = res.status assert(status == 200) + +def do_rule_uri_environ(renderer_type, name): + from deliverance.utils import set_rule_uri + wsgi_app = DeliveranceMiddleware(urienv_app, 'theme.html', 'rules.xml', + renderer_type) + environ = {} + set_rule_uri(environ, 'rules2.xml') + app = TestApp(wsgi_app, extra_environ=environ) + res = app.get('/example.html') + res2 = app.get('/example_expected_rule_uri_environ.html?notheme') + html_string_compare(res.body, res2.body) + +def do_theme_uri_environ(renderer_type, name): + from deliverance.utils import set_theme_uri + wsgi_app = DeliveranceMiddleware(urienv_app, 'theme.html', 'rules.xml', + renderer_type) + environ = {} + set_theme_uri(environ, 'theme2.html') + app = TestApp(wsgi_app, extra_environ=environ) + res = app.get('/example.html') + res2 = app.get('/example_expected_theme_uri_environ.html?notheme') + html_string_compare(res.body, res2.body) +def do_serializer_environ(renderer_type, name): + from deliverance.utils import set_serializer + wsgi_app = DeliveranceMiddleware(urienv_app, 'theme.html', 'rules.xml', + renderer_type) + environ = {} + set_serializer(environ, 'deliverance.test_wsgi:_uppercaseTextNodes') + app = TestApp(wsgi_app, extra_environ=environ) + res = app.get('/example.html') + res2 = app.get('/example_expected_uppercase.html?notheme') + html_string_compare(res.body, res2.body) + +def _uppercaseTextNodes(content): + from htmlserialize import tostring + return tostring(content, + doctype_pair=("-//W3C//DTD HTML 4.01 Transitional//EN", + "http://www.w3.org/TR/html4/loose.dtd") + ).upper() RENDERER_TYPES = ['py', 'xslt'] -TEST_FUNCS = [ do_url, do_basic, do_text, do_tasktracker, do_xinclude, do_with_spaces, do_nycsr, do_necoro, do_guidesearch, do_ajax, do_aggregate, do_aggregate2, do_cache, do_ignore, do_ignore_header ] +TEST_FUNCS = [ do_url, do_basic, do_text, do_tasktracker, do_xinclude, do_with_spaces, do_nycsr, do_necoro, do_guidesearch, do_ajax, do_aggregate, do_aggregate2, do_cache, do_ignore, do_ignore_header, do_rule_uri_environ, do_theme_uri_environ, do_serializer_environ ] + def test_all(): for renderer_type in RENDERER_TYPES: for test_func in TEST_FUNCS: Modified: z3/deliverance/trunk/deliverance/utils.py ============================================================================== --- z3/deliverance/trunk/deliverance/utils.py (original) +++ z3/deliverance/trunk/deliverance/utils.py Tue Mar 4 17:54:10 2008 @@ -535,3 +535,44 @@ text = etree.tostring(rule) text = text.replace(' xmlns="http://www.plone.org/deliverance"', '') return text + +# API for sharing overridden theme / rule URIs with other middleware layers. + +_THEME_URI_KEY = 'deliverance.theme_uri' + +def set_theme_uri(environ, uri): + environ[_THEME_URI_KEY] = uri + +def get_theme_uri(environ, default=None): + return environ.get(_THEME_URI_KEY, default) + +_RULE_URI_KEY = 'deliverance.rule_uri' + +def set_rule_uri(environ, uri): + environ[_RULE_URI_KEY] = uri + +def get_rule_uri(environ, default=None): + return environ.get(_RULE_URI_KEY, default) + +_SERIALIZER_KEY = 'deliverance.serializer' + +def set_serializer(environ, dotted_or_egg): + environ[_SERIALIZER_KEY] = dotted_or_egg + +def get_serializer(environ, default=None): + return resolve_callable(environ.get(_SERIALIZER_KEY, default)) + +def resolve_callable(dotted_or_egg): + if isinstance(dotted_or_egg, basestring): + return resolve_dotted_or_egg(dotted_or_egg) + return dotted_or_egg + +def resolve_dotted_or_egg(dotted_or_egg): + from pkg_resources import EntryPoint + return EntryPoint.parse('x=%s' % dotted_or_egg).load(False) + +def bool_from_string(value): + if isinstance(value, basestring): + if value.lower() in ('false', 'no'): + return False + return bool(value) Modified: z3/deliverance/trunk/deliverance/wsgimiddleware.py ============================================================================== --- z3/deliverance/trunk/deliverance/wsgimiddleware.py (original) +++ z3/deliverance/trunk/deliverance/wsgimiddleware.py Tue Mar 4 17:54:10 2008 @@ -13,9 +13,16 @@ from paste.request import construct_url from paste.response import header_value, replace_header from htmlserialize import tostring +from deliverance.utils import bool_from_string from deliverance.utils import DeliveranceError from deliverance.utils import DELIVERANCE_ERROR_PAGE -from deliverance.resource_fetcher import InternalResourceFetcher, FileResourceFetcher, ExternalResourceFetcher +from deliverance.utils import get_theme_uri +from deliverance.utils import get_rule_uri +from deliverance.utils import get_serializer +from deliverance.utils import resolve_callable +from deliverance.resource_fetcher import InternalResourceFetcher +from deliverance.resource_fetcher import FileResourceFetcher +from deliverance.resource_fetcher import ExternalResourceFetcher from deliverance import cache_utils import sys import datetime @@ -27,12 +34,19 @@ DELIVERANCE_BASE_URL = 'deliverance.base-url' DELIVERANCE_CACHE = 'deliverance.cache' -IGNORE_EXTENSIONS = ['js','css','gif','jpg','jpeg','pdf','ps','doc','png','ico','mov','mpg','mpeg', 'mp3','m4a', - 'txt','rtf', 'swf', 'wav', 'zip', 'wmv', 'ppt', 'gz', 'tgz', 'jar', 'xls', 'bmp', 'tif', 'tga', - 'hqx', 'avi'] +IGNORE_EXTENSIONS = ['js', 'css', 'gif', 'jpg', 'jpeg', 'pdf', 'ps', 'doc', + 'png', 'ico', 'mov', 'mpg', 'mpeg', 'mp3', 'm4a', 'txt', + 'rtf', 'swf', 'wav', 'zip', 'wmv', 'ppt', 'gz', 'tgz', + 'jar', 'xls', 'bmp', 'tif', 'tga', 'hqx', 'avi', + ] IGNORE_URL_PATTERN = re.compile("^.*\.(%s)$" % '|'.join(IGNORE_EXTENSIONS)) +def _toHTML(content): + return tostring(content, + doctype_pair=("-//W3C//DTD HTML 4.01 Transitional//EN", + "http://www.w3.org/TR/html4/loose.dtd")) + class DeliveranceMiddleware(object): """ a DeliveranceMiddleware object exposes a single deliverance @@ -41,7 +55,7 @@ def __init__(self, app, theme_uri, rule_uri, renderer='py', merge_cache_control=False, - is_internal_uri=None): + is_internal_uri=None, serializer=None): """ initializer @@ -60,11 +74,14 @@ should be considered 'internal'(passed to the subapplication) and false if the requestshould be send over the network. + serializer: dotted name or entry point indicdating a callable used + to post-process rendered output. Defaults to the '_toHTML' function + above. """ self.app = app self.theme_uri = theme_uri self.rule_uri = rule_uri - self.merge_cache_control = merge_cache_control + self.merge_cache_control = bool_from_string(merge_cache_control) if renderer == 'py': import interpreter @@ -73,11 +90,15 @@ import xslt self._rendererType = xslt.Renderer elif renderer is None or isinstance(renderer, basestring): - raise ValueError("Unknown Renderer: %s - Expecting 'py' or 'xslt'" % renderer) + raise ValueError("Unknown Renderer: %s - Expecting 'py' or 'xslt'" + % renderer) else: self._rendererType = renderer - self._is_internal_uri = is_internal_uri + self._is_internal_uri = resolve_callable(is_internal_uri) + if serializer is None: + serializer = _toHTML + self.serializer = serializer def get_renderer(self, environ): return self.create_renderer(environ) @@ -88,11 +109,11 @@ information passed to the initializer. A new copy of the theme and rules is retrieved. """ - theme = self.theme(environ) - rule = self.rule(environ) + theme, theme_uri = self.theme(environ) + rule, rule_uri = self.rule(environ) full_theme_uri = urlparse.urljoin( construct_url(environ, with_path_info=False), - self.theme_uri) + theme_uri) def reference_resolver(href, parse, encoding=None): text = self.get_resource(environ, href) @@ -109,7 +130,7 @@ try: parsedTheme = parseHTML(theme) except Exception, message: - newmessage = "Unable to parse theme page (" + self.theme_uri + ")" + newmessage = "Unable to parse theme page (" + theme_uri + ")" if message: newmessage += ":" + str(message) raise DeliveranceError(newmessage) @@ -124,33 +145,40 @@ theme=parsedTheme, theme_uri=full_theme_uri, rule=parsedRule, - rule_uri=self.rule_uri, + rule_uri=rule_uri, reference_resolver=reference_resolver) - def rule(self, environ): - """ + def rule(self, environ=None): + """ environ -> (rule, rule_uri) retrieves the data referred to by the rule_uri passed to the initializer. """ + if environ is None: + environ = {} + rule_uri = get_rule_uri(environ, self.rule_uri) try: - return self.get_resource(environ, self.rule_uri) + return (self.get_resource(environ, rule_uri), rule_uri) except Exception, message: - newmessage = "Unable to retrieve rules from " + self.rule_uri + newmessage = "Unable to retrieve rules from " + rule_uri if message: newmessage += ": " + str(message) raise DeliveranceError(newmessage) - def theme(self, environ): - """ + def theme(self, environ=None): + """ environ -> (theme, theme_uri) + retrieves the data referred to by the theme_uri passed to the initializer. """ + if environ is None: + environ = {} + theme_uri = get_theme_uri(environ, self.theme_uri) try: - return self.get_resource(environ, self.theme_uri) + return (self.get_resource(environ, theme_uri), theme_uri) except Exception, message: - message.public_html = 'Unable to retrieve theme page from %s: %s' % ( - self.theme_uri, message) + message.public_html = ('Unable to retrieve theme page from %s: %s' + % (theme_uri, message)) raise def __call__(self, environ, start_response): @@ -162,13 +190,16 @@ initializer. """ qs = environ.get('QUERY_STRING', '') - environ[DELIVERANCE_BASE_URL] = construct_url(environ, with_path_info=False, with_query_string=False) + environ[DELIVERANCE_BASE_URL] = construct_url(environ, + with_path_info=False, + with_query_string=False) environ[DELIVERANCE_CACHE] = {} notheme = 'notheme' in qs if environ.get('HTTP_X_REQUESTED_WITH', '') == 'XMLHttpRequest': notheme = True if notheme: - # eliminate the deliverance notheme query argument for the subrequest + # eliminate the deliverance notheme query argument for + # the subrequest if qs == 'notheme': environ['QUERY_STRING'] = '' elif qs.endswith('¬heme'): @@ -227,17 +258,18 @@ type = header_value(headers, 'content-type') if type is None: return True # yerg, 304s can have no content-type - return type.startswith('text/html') or type.startswith('application/xhtml+xml') + return (type.startswith('text/html') or + type.startswith('application/xhtml+xml')) def filter_body(self, environ, body): """ - returns the result of the deliverance transformation on the string 'body' - in the context of environ. The result is a string containing HTML. + returns the result of the deliverance transform on the string 'body' + in the context of environ. The result is a string containing HTML, + or whatever the configured serializer makes it. """ content = self.get_renderer(environ).render(parseHTML(body)) - - return tostring(content, doctype_pair=("-//W3C//DTD HTML 4.01 Transitional//EN", - "http://www.w3.org/TR/html4/loose.dtd")) + serializer = get_serializer(environ, self.serializer) + return serializer(content) def rebuild_check(self, environ, start_response): @@ -247,7 +279,8 @@ etag_map = {} if 'HTTP_IF_NONE_MATCH' in environ: - etag_map = cache_utils.parse_merged_etag(environ['HTTP_IF_NONE_MATCH']) + etag_map = cache_utils.parse_merged_etag( + environ['HTTP_IF_NONE_MATCH']) tag = etag_map.get(content_url, None) environ['HTTP_IF_NONE_MATCH'] = tag if tag: @@ -284,8 +317,8 @@ return (status, headers, body) # got 304 Not Modified for content, check other resources - rules = etree.XML(self.rule(environ)) - resources = self.get_resource_uris(rules) + rules = etree.XML(self.rule(environ)[0]) + resources = self.get_resource_uris(rules, environ) if self.any_modified(environ, resources, etag_map): # something changed, # get the content explicitly and give it back @@ -369,7 +402,8 @@ else: loc = '' raise DeliveranceError( - "Request for internal resource at %s (%r) failed with status code %r%s" + "Request for internal resource at %s (%r) failed " + "with status code %r%s" % (construct_url(environ), path_info, status, loc)) @@ -427,14 +461,18 @@ return cleaned - def get_resource_uris(self, rules): + def get_resource_uris(self, rules, environ=None): """ retrieves a list of uris pointing to the resources that are components of rendering (excluding content) """ + if environ is None: + environ = {} resources = Set() - resources.add(self.rule_uri) - resources.add(self.theme_uri) + rule_uri = get_rule_uri(environ, self.rule_uri) + resources.add(rule_uri) + theme_uri = get_theme_uri(environ, self.theme_uri) + resources.add(theme_uri) for rule in rules: href = rule.get("href",None) @@ -444,16 +482,16 @@ return list(resources) - def check_modification(self, environ, uri, httpdate_since=None, etag=None): + def check_modification(self, environ, uri, httpdate_since=None, etag=None): """ - if httpdate_since is set to an httpdate the If-Modified-Since HTTP header - is used to check for modification + if httpdate_since is set to an httpdate the If-Modified-Since HTTP + header is used to check for modification - if etag is set to an etag for the resource, the If-None-Match HTTP header - is used to check for modification + if etag is set to an etag for the resource, the If-None-Match HTTP + header is used to check for modification - the resulting (status, headers, body) tuple for the request is stored in - environ[DELIVERANCE_CACHE][uri]. + the resulting (status, headers, body) tuple for the request is stored + in environ[DELIVERANCE_CACHE][uri]. """ @@ -498,16 +536,39 @@ # blacklisting can happen here as well return re.match(IGNORE_URL_PATTERN, url) is not None + +def always_external(uri, environ): + """Always return False so the external loader is used. + + o Configure in paste config using the following: + + is_internal_uri = deliverance.wsgimiddleware:always_external + """ + return False + + def make_filter(app, global_conf, - theme_uri=None, rule_uri=None, - renderer='py'): + theme_uri=None, + rule_uri=None, + renderer='py', + merge_cache_control=False, + is_internal_uri=None, + serializer=None, + ): + """ Configure DeliveranceError via Paste config. + """ assert theme_uri is not None, ( "You must give a theme_uri") assert rule_uri is not None, ( "You must give a rule_uri") - return DeliveranceMiddleware( - app, theme_uri, rule_uri, - renderer=renderer) + return DeliveranceMiddleware(app=app, + theme_uri=theme_uri, + rule_uri=rule_uri, + renderer=renderer, + merge_cache_control=merge_cache_control, + is_internal_uri=is_internal_uri, + serializer=serializer, + ) _http_equiv_re = re.compile(r']*http-equiv="?content-type"?[^>]*>', re.I|re.S) _head_re = re.compile(r']*>', re.I|re.S) From tseaver at codespeak.net Tue Mar 4 17:55:00 2008 From: tseaver at codespeak.net (tseaver at codespeak.net) Date: Tue, 4 Mar 2008 17:55:00 +0100 (CET) Subject: [z3-checkins] r52154 - z3/deliverance/trunk Message-ID: <20080304165500.E169E169F61@codespeak.net> Author: tseaver Date: Tue Mar 4 17:55:00 2008 New Revision: 52154 Added: z3/deliverance/trunk/CHANGES.txt Log: Add changelog. Added: z3/deliverance/trunk/CHANGES.txt ============================================================================== --- (empty file) +++ z3/deliverance/trunk/CHANGES.txt Tue Mar 4 17:55:00 2008 @@ -0,0 +1,51 @@ +Deliverance Changelog +===================== + +After 0.1.2 +----------- + +- (wsgimiddleware) Expose all middleware constructor arguments via + Paste config. + +- (wsgimiddleware) Check for environmental overrides of theme URI, rule + URI, serializer, and apply. + +- (utils) Added APIs for parsing non-string config values + ('resolve_callable', 'resolve_dotted_or_egg', 'bool_from_string'). + +- (utils) Added APIs for getting / setting environmental overrides of + theme URI, rule URI, serializer. + +- (wsgimiddleware) Add a to pages that + don't already have it. + +- (setup) Relax restriction on lxml 2.x (which should work fine). + +0.1.2 (2008-02-19) +------------------ + +- (setup) Added nose test runner, so you can do 'python setup.py test'. + +- (wsgimiddleware) Fix typo in setting Cache-Control header. + +- (xslt, utils) Keep xmlns out of places where rules are printed for + debugging (error reports, comment). + +0.1.1 (2007-10-15) +------------------ + +- (wsgimiddleware) Added a renderer configuration parameter to the middleware + paste deploy configurator: enables selection of 'py' (default) or 'xslt' + renderers. + +- (utils, xslt) Replace some truth tests of elements, which actually were + testing if there were no subelements when they meant to be testing + for None. + +- (interpreter, xslt) Do not apply theme if x-deliverance-no-theme response + header or meta http-equiv tag is present. + +0.1 (2007-09-12) +---------------- + +- Initial public release. From rafrombrc at codespeak.net Tue Mar 4 22:14:31 2008 From: rafrombrc at codespeak.net (rafrombrc at codespeak.net) Date: Tue, 4 Mar 2008 22:14:31 +0100 (CET) Subject: [z3-checkins] r52173 - z3/deliverance/DeliveranceVHoster/trunk Message-ID: <20080304211431.056D7169FA5@codespeak.net> Author: rafrombrc Date: Tue Mar 4 22:14:30 2008 New Revision: 52173 Modified: z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Log: add SSL configuration warning to the force_ssl comment Modified: z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl (original) +++ z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Tue Mar 4 22:14:30 2008 @@ -38,6 +38,9 @@ set debug = false # Force certain URLs to use SSL, or not (via build.ini's sslonly setting) +# WARNING: If this is set to true, you MUST have SSL correctly configured +# for this host, and all SSL requests MUST set X-Forwarded-Scheme header +# to 'https' and X-Forwarded-Port header to '443'. #force_ssl = True logger = {{env.var}}/logs/deliverance/dvhoster.log From magicbronson at codespeak.net Thu Mar 6 22:59:01 2008 From: magicbronson at codespeak.net (magicbronson at codespeak.net) Date: Thu, 6 Mar 2008 22:59:01 +0100 (CET) Subject: [z3-checkins] r52232 - z3/deliverance/DeliveranceVHoster/trunk Message-ID: <20080306215901.5D893169EA4@codespeak.net> Author: magicbronson Date: Thu Mar 6 22:58:59 2008 New Revision: 52232 Modified: z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Log: parameterize default_theme_uri Modified: z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl (original) +++ z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Thu Mar 6 22:58:59 2008 @@ -68,7 +68,6 @@ transcluder_ok_hosts = openplans.org|(.*)\.openplans.org|(.*)\.localhost.openplans\.org|localhost|127.0.0.1 transcluder_pool_size = 0 -## FIXME: this should be parameterized: -default_theme_uri = http://www.openplans.org/theme.html +default_theme_uri = {{env.req_settings.get('default_theme_uri', 'http://www.openplans.org/theme.html')}} topp_secret_filename = {{env.config.get('general', 'topp_secret_filename')}} From rafrombrc at codespeak.net Fri Mar 7 02:40:29 2008 From: rafrombrc at codespeak.net (rafrombrc at codespeak.net) Date: Fri, 7 Mar 2008 02:40:29 +0100 (CET) Subject: [z3-checkins] r52234 - z3/deliverance/DeliveranceVHoster/trunk Message-ID: <20080307014029.26EA1169FBA@codespeak.net> Author: rafrombrc Date: Fri Mar 7 02:40:28 2008 New Revision: 52234 Modified: z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Log: revert 52232 for now b/c it breaks fassembler builds Modified: z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl (original) +++ z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Fri Mar 7 02:40:28 2008 @@ -68,6 +68,7 @@ transcluder_ok_hosts = openplans.org|(.*)\.openplans.org|(.*)\.localhost.openplans\.org|localhost|127.0.0.1 transcluder_pool_size = 0 -default_theme_uri = {{env.req_settings.get('default_theme_uri', 'http://www.openplans.org/theme.html')}} +## FIXME: this should be parameterized: +default_theme_uri = http://www.openplans.org/theme.html topp_secret_filename = {{env.config.get('general', 'topp_secret_filename')}} From z3-checkins at codespeak.net Fri Mar 7 12:08:04 2008 From: z3-checkins at codespeak.net (z3-checkins at codespeak.net) Date: Fri, 7 Mar 2008 12:08:04 +0100 (CET) Subject: [z3-checkins] Great New Deals For Message-ID: <20080307130730.3761.qmail@catv-50631b81.catv.broadband.hu> An HTML attachment was scrubbed... URL: http://codespeak.net/pipermail/z3-checkins/attachments/20080307/9e80f588/attachment.htm From magicbronson at codespeak.net Fri Mar 7 21:58:51 2008 From: magicbronson at codespeak.net (magicbronson at codespeak.net) Date: Fri, 7 Mar 2008 21:58:51 +0100 (CET) Subject: [z3-checkins] r52277 - z3/deliverance/DeliveranceVHoster/trunk Message-ID: <20080307205851.EE64A168575@codespeak.net> Author: magicbronson Date: Fri Mar 7 21:58:50 2008 New Revision: 52277 Modified: z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Log: retry r52232 "parameterize default_theme_uri". req_settings is an attribute of the project, not the environment. "project" should be bound within this namespace. Modified: z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl (original) +++ z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Fri Mar 7 21:58:50 2008 @@ -68,7 +68,6 @@ transcluder_ok_hosts = openplans.org|(.*)\.openplans.org|(.*)\.localhost.openplans\.org|localhost|127.0.0.1 transcluder_pool_size = 0 -## FIXME: this should be parameterized: -default_theme_uri = http://www.openplans.org/theme.html +default_theme_uri = {{project.req_settings.get('default_theme_uri', 'http://www.openplans.org/theme.html')}} topp_secret_filename = {{env.config.get('general', 'topp_secret_filename')}} From ianb at codespeak.net Mon Mar 10 22:09:05 2008 From: ianb at codespeak.net (ianb at codespeak.net) Date: Mon, 10 Mar 2008 22:09:05 +0100 (CET) Subject: [z3-checkins] r52365 - z3/deliverance/DeliveranceVHoster/trunk/dvhoster Message-ID: <20080310210905.3779816840D@codespeak.net> Author: ianb Date: Mon Mar 10 22:09:04 2008 New Revision: 52365 Modified: z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py Log: Disable CACHE_SIZE for static files served by dvhoster Modified: z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py (original) +++ z3/deliverance/DeliveranceVHoster/trunk/dvhoster/dispatcher.py Mon Mar 10 22:09:04 2008 @@ -22,6 +22,11 @@ import transcluder from transcluder.middleware import TranscluderMiddleware +from paste import fileapp +# I hate this in-memory cache of files, so I'm globally disabling it +# here at least: +fileapp.CACHE_SIZE = 0 + def norm_path(urlpath): if not urlpath: urlpath = '/' From z3-checkins at codespeak.net Tue Mar 11 01:20:35 2008 From: z3-checkins at codespeak.net (z3-checkins at codespeak.net) Date: Tue, 11 Mar 2008 01:20:35 +0100 (CET) Subject: [z3-checkins] Newsletter - March 4th Message-ID: <20080311022548.20891.qmail@dslb-084-056-063-031.pools.arcor-ip.net> An HTML attachment was scrubbed... URL: http://codespeak.net/pipermail/z3-checkins/attachments/20080311/ebadf3b7/attachment.htm From rafrombrc at codespeak.net Tue Mar 11 17:11:28 2008 From: rafrombrc at codespeak.net (rafrombrc at codespeak.net) Date: Tue, 11 Mar 2008 17:11:28 +0100 (CET) Subject: [z3-checkins] r52379 - z3/deliverance/tags/0.1.3 Message-ID: <20080311161128.ABB61168525@codespeak.net> Author: rafrombrc Date: Tue Mar 11 17:11:27 2008 New Revision: 52379 Added: z3/deliverance/tags/0.1.3/ - copied from r52378, z3/deliverance/trunk/ Log: cut new tag that includes the force_ssl support From rafrombrc at codespeak.net Tue Mar 11 17:13:13 2008 From: rafrombrc at codespeak.net (rafrombrc at codespeak.net) Date: Tue, 11 Mar 2008 17:13:13 +0100 (CET) Subject: [z3-checkins] r52380 - z3/deliverance/tags/0.1.3 Message-ID: <20080311161313.0C16E168538@codespeak.net> Author: rafrombrc Date: Tue Mar 11 17:13:12 2008 New Revision: 52380 Removed: z3/deliverance/tags/0.1.3/ Log: whoops, meant to cut a tag of dvhoster, not deliverance... nothing to see here From rafrombrc at codespeak.net Tue Mar 11 17:14:38 2008 From: rafrombrc at codespeak.net (rafrombrc at codespeak.net) Date: Tue, 11 Mar 2008 17:14:38 +0100 (CET) Subject: [z3-checkins] r52381 - z3/deliverance/DeliveranceVHoster/tags/0.1.2 Message-ID: <20080311161438.1B00F16853A@codespeak.net> Author: rafrombrc Date: Tue Mar 11 17:14:37 2008 New Revision: 52381 Added: z3/deliverance/DeliveranceVHoster/tags/0.1.2/ - copied from r52380, z3/deliverance/DeliveranceVHoster/trunk/ Log: new tag that includes the force_ssl support From magicbronson at codespeak.net Wed Mar 12 00:00:45 2008 From: magicbronson at codespeak.net (magicbronson at codespeak.net) Date: Wed, 12 Mar 2008 00:00:45 +0100 (CET) Subject: [z3-checkins] r52404 - z3/deliverance/DeliveranceVHoster/trunk Message-ID: <20080311230045.A23D5169E43@codespeak.net> Author: magicbronson Date: Wed Mar 12 00:00:43 2008 New Revision: 52404 Modified: z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Log: use new force_ssl setting Modified: z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl ============================================================================== --- z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl (original) +++ z3/deliverance/DeliveranceVHoster/trunk/fassembler_config.ini_tmpl Wed Mar 12 00:00:43 2008 @@ -41,7 +41,7 @@ # WARNING: If this is set to true, you MUST have SSL correctly configured # for this host, and all SSL requests MUST set X-Forwarded-Scheme header # to 'https' and X-Forwarded-Port header to '443'. -#force_ssl = True +force_ssl = {{config.force_ssl}} logger = {{env.var}}/logs/deliverance/dvhoster.log From magicbronson at codespeak.net Wed Mar 12 19:14:44 2008 From: magicbronson at codespeak.net (magicbronson at codespeak.net) Date: Wed, 12 Mar 2008 19:14:44 +0100 (CET) Subject: [z3-checkins] r52429 - z3/deliverance/DeliveranceVHoster/tags/0.1.2 Message-ID: <20080312181444.41A7A169F3F@codespeak.net> Author: magicbronson Date: Wed Mar 12 19:14:42 2008 New Revision: 52429 Modified: z3/deliverance/DeliveranceVHoster/tags/0.1.2/fassembler_config.ini_tmpl Log: merge parameterization of force_ssl to this release branch. svn merge -r52276:52277 http://codespeak.net/svn/z3/deliverance/DeliveranceVHoster/trunk . Modified: z3/deliverance/DeliveranceVHoster/tags/0.1.2/fassembler_config.ini_tmpl ============================================================================== --- z3/deliverance/DeliveranceVHoster/tags/0.1.2/fassembler_config.ini_tmpl (original) +++ z3/deliverance/DeliveranceVHoster/tags/0.1.2/fassembler_config.ini_tmpl Wed Mar 12 19:14:42 2008 @@ -41,7 +41,7 @@ # WARNING: If this is set to true, you MUST have SSL correctly configured # for this host, and all SSL requests MUST set X-Forwarded-Scheme header # to 'https' and X-Forwarded-Port header to '443'. -#force_ssl = True +force_ssl = {{config.force_ssl}} logger = {{env.var}}/logs/deliverance/dvhoster.log From rocky at codespeak.net Sun Mar 16 20:06:57 2008 From: rocky at codespeak.net (rocky at codespeak.net) Date: Sun, 16 Mar 2008 20:06:57 +0100 (CET) Subject: [z3-checkins] r52620 - z3/deliverance/trunk/deliverance Message-ID: <20080316190657.DB01F169FD4@codespeak.net> Author: rocky Date: Sun Mar 16 20:06:56 2008 New Revision: 52620 Modified: z3/deliverance/trunk/deliverance/resource_fetcher.py Log: - deactivated AuthKit for now - split up apps and themes - configured a default theme Modified: z3/deliverance/trunk/deliverance/resource_fetcher.py ============================================================================== --- z3/deliverance/trunk/deliverance/resource_fetcher.py (original) +++ z3/deliverance/trunk/deliverance/resource_fetcher.py Sun Mar 16 20:06:56 2008 @@ -135,7 +135,6 @@ class ExternalResourceFetcher(object): def __init__(self, in_environ, uri, headers_only=False): self.uri = uri - loc = urlparse.urlsplit(uri) self.environ = in_environ.copy() @@ -148,9 +147,10 @@ self.environ['CONTENT_LENGTH'] = '0' self.environ['wsgi.input'] = StringIO('') - self.environ['wsgi.url_scheme'] = loc[0] + self.environ['wsgi.url_scheme'] = loc[0] or \ + self.environ['wsgi.url_scheme'] self.environ['wsgi.version'] = (1, 0) - self.environ['HTTP_HOST'] = loc[1] + self.environ['HTTP_HOST'] = loc[1] or self.environ['HTTP_HOST'] self.environ['PATH_INFO'] = urllib.unquote(loc[2]) self.environ['QUERY_STRING'] = loc[3] From rocky at codespeak.net Sun Mar 16 21:49:08 2008 From: rocky at codespeak.net (rocky at codespeak.net) Date: Sun, 16 Mar 2008 21:49:08 +0100 (CET) Subject: [z3-checkins] r52624 - z3/deliverance/branches/rocky-delivers Message-ID: <20080316204908.A1234169F6E@codespeak.net> Author: rocky Date: Sun Mar 16 21:49:07 2008 New Revision: 52624 Added: z3/deliverance/branches/rocky-delivers/ - copied from r52623, z3/deliverance/trunk/ Log: New branch for experimental changes. From rocky at codespeak.net Mon Mar 17 00:11:49 2008 From: rocky at codespeak.net (rocky at codespeak.net) Date: Mon, 17 Mar 2008 00:11:49 +0100 (CET) Subject: [z3-checkins] r52627 - z3/deliverance/branches/rocky-delivers/deliverance Message-ID: <20080316231149.11E9716A069@codespeak.net> Author: rocky Date: Mon Mar 17 00:11:48 2008 New Revision: 52627 Modified: z3/deliverance/branches/rocky-delivers/deliverance/wsgimiddleware.py Log: Don't exclude a response just because it has 401 status. Modified: z3/deliverance/branches/rocky-delivers/deliverance/wsgimiddleware.py ============================================================================== --- z3/deliverance/branches/rocky-delivers/deliverance/wsgimiddleware.py (original) +++ z3/deliverance/branches/rocky-delivers/deliverance/wsgimiddleware.py Mon Mar 17 00:11:48 2008 @@ -222,8 +222,8 @@ theme = True status_code = status.split()[0] if (status_code.startswith('3') - or status_code == '204' - or status_code == '401'): + or status_code == '204'): + #or status_code == '401'): # Redirects, not-modified, etc don't get themed (3xx) # No Content doesn't get themed (204) # Unauthorized isn't themed (401) From rocky at codespeak.net Mon Mar 24 14:55:07 2008 From: rocky at codespeak.net (rocky at codespeak.net) Date: Mon, 24 Mar 2008 14:55:07 +0100 (CET) Subject: [z3-checkins] r52885 - in z3/deliverance/branches/rocky-delivers: . deliverance Message-ID: <20080324135507.B5AF01683EF@codespeak.net> Author: rocky Date: Mon Mar 24 14:55:05 2008 New Revision: 52885 Modified: z3/deliverance/branches/rocky-delivers/CHANGES.txt z3/deliverance/branches/rocky-delivers/deliverance/wsgimiddleware.py Log: - (wsgimiddleware) Now accepts url_black_list for determining when to not filter things. - (wsgimiddleware) Puts in some checks to make sure content is not getting double-themed. Modified: z3/deliverance/branches/rocky-delivers/CHANGES.txt ============================================================================== --- z3/deliverance/branches/rocky-delivers/CHANGES.txt (original) +++ z3/deliverance/branches/rocky-delivers/CHANGES.txt Mon Mar 24 14:55:05 2008 @@ -21,6 +21,12 @@ - (setup) Relax restriction on lxml 2.x (which should work fine). +- (wsgimiddleware) Now accepts url_black_list for determining when to + not filter things. + +- (wsgimiddleware) Puts in some checks to make sure content is not getting + double-themed. + 0.1.2 (2008-02-19) ------------------ Modified: z3/deliverance/branches/rocky-delivers/deliverance/wsgimiddleware.py ============================================================================== --- z3/deliverance/branches/rocky-delivers/deliverance/wsgimiddleware.py (original) +++ z3/deliverance/branches/rocky-delivers/deliverance/wsgimiddleware.py Mon Mar 24 14:55:05 2008 @@ -55,7 +55,8 @@ def __init__(self, app, theme_uri, rule_uri, renderer='py', merge_cache_control=False, - is_internal_uri=None, serializer=None): + is_internal_uri=None, serializer=None, + url_black_list=[]): """ initializer @@ -77,11 +78,15 @@ serializer: dotted name or entry point indicdating a callable used to post-process rendered output. Defaults to the '_toHTML' function above. + url_black_list: if url matches anything inside this list, the item + will not be filtered. The items can either be strings or regular + expression objects. """ self.app = app self.theme_uri = theme_uri self.rule_uri = rule_uri self.merge_cache_control = bool_from_string(merge_cache_control) + self.url_black_list = url_black_list if renderer == 'py': import interpreter @@ -230,6 +235,11 @@ start_response(status, headers) return body + if environ.get('deliverance.filtered', False) or \ + ('deliverance-filtered', '1') in headers: + start_response(status, headers) + return body + # perform actual themeing body = self.filter_body(environ, body) @@ -241,6 +251,8 @@ headers, self.merge_cache_control) + environ['deliverance.filtered'] = True + headers.append(('deliverance-filtered', '1')) start_response(status, headers) return [body] @@ -533,9 +545,18 @@ def should_ignore_url(self, url): - # blacklisting can happen here as well - return re.match(IGNORE_URL_PATTERN, url) is not None + if re.match(IGNORE_URL_PATTERN, url) is not None: + return True + + for x in self.url_black_list: + if isinstance(x, basestring): + if url.find(x) > -1: + return True + elif hasattr(x, 'match') and callable(x.match): + if x.match(url) is not None: + return True + return False def always_external(uri, environ): """Always return False so the external loader is used. @@ -550,6 +571,7 @@ def make_filter(app, global_conf, theme_uri=None, rule_uri=None, + url_black_list=[], renderer='py', merge_cache_control=False, is_internal_uri=None, @@ -568,6 +590,7 @@ merge_cache_control=merge_cache_control, is_internal_uri=is_internal_uri, serializer=serializer, + url_black_list=url_black_list, ) _http_equiv_re = re.compile(r']*http-equiv="?content-type"?[^>]*>', re.I|re.S) From ianb at codespeak.net Tue Mar 25 01:21:49 2008 From: ianb at codespeak.net (ianb at codespeak.net) Date: Tue, 25 Mar 2008 01:21:49 +0100 (CET) Subject: [z3-checkins] r52891 - z3/deliverance/trunk/deliverance Message-ID: <20080325002149.4B3271683D7@codespeak.net> Author: ianb Date: Tue Mar 25 01:21:47 2008 New Revision: 52891 Modified: z3/deliverance/trunk/deliverance/interpreter.py Log: Make xpath errors include the xpath expression that caused the error Modified: z3/deliverance/trunk/deliverance/interpreter.py ============================================================================== --- z3/deliverance/trunk/deliverance/interpreter.py (original) +++ z3/deliverance/trunk/deliverance/interpreter.py Tue Mar 25 01:21:47 2008 @@ -153,8 +153,11 @@ if theme_el is None: return - content_els = copy.deepcopy( - content.xpath(self.get_content_xpath(rule))) + try: + xpath = content.xpath(self.get_content_xpath(rule)) + except etree.XPathEvalError, e: + raise etree.XPathEvalError("Error %s in xpath expression %r" % (e, self.get_content_xpath(rule)))