New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
4.1 robot #2
Merged
Merged
4.1 robot #2
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
jensens
added a commit
that referenced
this pull request
Mar 5, 2015
Branch: refs/heads/master Date: 2015-03-05T17:27:41+01:00 Author: Asko Soukka (datakurre) <asko.soukka@iki.fi> Commit: https://github.com/plone/plone.subrequest/commit/161041e7b0b5aa2403d22ea7fff63fb3fd1639a4 Fix issue where new cookies from the main request.response are not passed to subrequests. Files changed: M plone/subrequest/__init__.py M plone/subrequest/tests.py diff --git a/plone/subrequest/__init__.py b/plone/subrequest/__init__.py index c9d4453..4fe947d 100644 --- a/plone/subrequest/__init__.py +++ b/plone/subrequest/__init__.py @@ -95,6 +95,8 @@ def subrequest(url, root=None, stdout=None): if name in OTHER_IGNORE or OTHER_IGNORE_RE.match(name) or name.startswith('_'): continue request.other[name] = parent_value + for key, value in parent_request.response.cookies.items(): + request.cookies[key] = value['value'] request['PARENT_REQUEST'] = parent_request alsoProvides(request, ISubRequest) try: diff --git a/plone/subrequest/tests.py b/plone/subrequest/tests.py index a7d7c1d..c5f9d8b 100644 --- a/plone/subrequest/tests.py +++ b/plone/subrequest/tests.py @@ -152,6 +152,12 @@ def test_parameter(self): self.assertTrue('foo' in response.body) def test_cookies(self): + request = getRequest() + request.response.setCookie('cookie_name', 'cookie_value') + response = subrequest('/folder1/@@parameter') + self.assertTrue("'cookie_name'" in response.body) + + def test_subrequest_cookies(self): response = subrequest('/folder1/@@test?url=/folder1/cookie') self.assertTrue('cookie_name' in response.cookies) Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:27:41+01:00 Author: Asko Soukka (datakurre) <asko.soukka@iki.fi> Commit: https://github.com/plone/plone.subrequest/commit/9ca8b8e99cd4c52dbec8f2fd0bfa161729cdf8ef Update changelog Files changed: M CHANGES.txt diff --git a/CHANGES.txt b/CHANGES.txt index ee2204c..e45e81c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,6 +1,13 @@ Changelog ========= +1.6.9 (unreleased) +------------------ + +- Fix issue where new cookies from the main request.response are not passed to + subrequests. + [datakurre] + 1.6.8 (unreleased) ------------------ Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:27:41+01:00 Author: Asko Soukka (datakurre) <asko.soukka@iki.fi> Commit: https://github.com/plone/plone.subrequest/commit/9161b1d804a3933f0a18d38b9ebe469ec1d4a386 Update changelog Files changed: M CHANGES.txt diff --git a/CHANGES.txt b/CHANGES.txt index e45e81c..29d8f74 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -8,9 +8,6 @@ Changelog subrequests. [datakurre] -1.6.8 (unreleased) ------------------- - - Handle sub-requests which contain a doubled // in the path. [gweis] Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:27:41+01:00 Author: Asko Soukka (datakurre) <asko.soukka@iki.fi> Commit: https://github.com/plone/plone.subrequest/commit/1263a402e411789f296adbd17758af4a719f4e8a Fix the next version in changelog Files changed: M CHANGES.txt diff --git a/CHANGES.txt b/CHANGES.txt index 29d8f74..9db44b7 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,7 +1,7 @@ Changelog ========= -1.6.9 (unreleased) +1.6.8 (unreleased) ------------------ - Fix issue where new cookies from the main request.response are not passed to Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:31:13+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/9fe6bd48f1efca3bbb7d1d5610a0d3b4b0a2e422 fix version confusion Files changed: M CHANGES.txt M setup.py diff --git a/CHANGES.txt b/CHANGES.txt index 9db44b7..7f9ebcb 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,13 +1,15 @@ Changelog ========= -1.6.8 (unreleased) +1.6.9 (unreleased) ------------------ - Fix issue where new cookies from the main request.response are not passed to subrequests. [datakurre] +1.6.8 (2014-03-04) +------------------ - Handle sub-requests which contain a doubled // in the path. [gweis] diff --git a/setup.py b/setup.py index eee1369..c98e240 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ import os.path from setuptools import setup, find_packages -version = '1.6.8.dev0' +version = '1.6.9.dev0' setup( name = 'plone.subrequest', Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:32:12+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/bd485843b90f4a3a21c976691be2ea366f4f6559 housekeeping: txt->rst Files changed: A CHANGES.rst A README.rst M setup.py D CHANGES.txt D README.txt diff --git a/CHANGES.rst b/CHANGES.rst new file mode 100644 index 0000000..7f9ebcb --- /dev/null +++ b/CHANGES.rst @@ -0,0 +1,114 @@ +Changelog +========= + +1.6.9 (unreleased) +------------------ + +- Fix issue where new cookies from the main request.response are not passed to + subrequests. + [datakurre] + +1.6.8 (2014-03-04) +------------------ +- Handle sub-requests which contain a doubled // in the path. + [gweis] + +1.6.7 (2012-10-22) +------------------ + +- Ensure correct handling of bare virtual hosting urls. + [elro] + +1.6.6 (2012-06-29) +------------------ + +- Log errors that occur handling a subrequest to help debug plone.app.theming + errors including content from a different url + [anthonygerrard] + +1.6.5 (2012-04-15) +------------------ + +- Ensure parent url is a string and not unicode. + [davisagli] + +1.6.4 - 2012-03-22 +------------------ + +- Fix problems with double encoding some unicode charse by not copying too + many ``other`` variables. + [elro] + +1.6.3 - 2012-02-12 +------------------ + +- Copy ``other`` request variables such as ``LANGUAGE`` to subrequest. + [elro] + +1.6.2 - 2011-07-04 +------------------ + +- Handle spaces in default documents. http://dev.plone.org/plone/ticket/12278 + +1.6.1 - 2011-07-04 +------------------ + +- Move tests to package directory to making testing possible when installed + normally. + +1.6 - 2011-06-06 +---------------- + +- Ensure url is a string and not unicode. + [elro] + +1.6b2 - 2011-05-20 +------------------ + +- Set PARENT_REQUEST and add ISubRequest interface to subrequests. + [elro] + +1.6b1 - 2011-02-11 +------------------ + +- Handle IStreamIterator. + [elro] + +- Simplify API so ``response.getBody()`` always works. + [elro] + +1.5 - 2010-11-26 +---------------- + +- Merge cookies from subrequest response into parent response. + [awello] + +1.4 - 2010-11-10 +---------------- + +- First processInput, then traverse (fixes #11254) + [awello] + +1.3 - 2010-08-24 +---------------- + +- Fixed bug with virtual hosting and quoted paths. + [elro] + +1.2 - 2010-08-16 +---------------- + +- Restore zope.component site after subrequest. + [elro] + +1.1 - 2010-08-14 +---------------- + +- Virtual hosting, relative url and error response support. + [elro] + +1.0 - 2010-07-28 +---------------- + +- Initial release. + [elro] diff --git a/CHANGES.txt b/CHANGES.txt deleted file mode 100644 index 7f9ebcb..0000000 --- a/CHANGES.txt +++ /dev/null @@ -1,114 +0,0 @@ -Changelog -========= - -1.6.9 (unreleased) ------------------- - -- Fix issue where new cookies from the main request.response are not passed to - subrequests. - [datakurre] - -1.6.8 (2014-03-04) ------------------- -- Handle sub-requests which contain a doubled // in the path. - [gweis] - -1.6.7 (2012-10-22) ------------------- - -- Ensure correct handling of bare virtual hosting urls. - [elro] - -1.6.6 (2012-06-29) ------------------- - -- Log errors that occur handling a subrequest to help debug plone.app.theming - errors including content from a different url - [anthonygerrard] - -1.6.5 (2012-04-15) ------------------- - -- Ensure parent url is a string and not unicode. - [davisagli] - -1.6.4 - 2012-03-22 ------------------- - -- Fix problems with double encoding some unicode charse by not copying too - many ``other`` variables. - [elro] - -1.6.3 - 2012-02-12 ------------------- - -- Copy ``other`` request variables such as ``LANGUAGE`` to subrequest. - [elro] - -1.6.2 - 2011-07-04 ------------------- - -- Handle spaces in default documents. http://dev.plone.org/plone/ticket/12278 - -1.6.1 - 2011-07-04 ------------------- - -- Move tests to package directory to making testing possible when installed - normally. - -1.6 - 2011-06-06 ----------------- - -- Ensure url is a string and not unicode. - [elro] - -1.6b2 - 2011-05-20 ------------------- - -- Set PARENT_REQUEST and add ISubRequest interface to subrequests. - [elro] - -1.6b1 - 2011-02-11 ------------------- - -- Handle IStreamIterator. - [elro] - -- Simplify API so ``response.getBody()`` always works. - [elro] - -1.5 - 2010-11-26 ----------------- - -- Merge cookies from subrequest response into parent response. - [awello] - -1.4 - 2010-11-10 ----------------- - -- First processInput, then traverse (fixes #11254) - [awello] - -1.3 - 2010-08-24 ----------------- - -- Fixed bug with virtual hosting and quoted paths. - [elro] - -1.2 - 2010-08-16 ----------------- - -- Restore zope.component site after subrequest. - [elro] - -1.1 - 2010-08-14 ----------------- - -- Virtual hosting, relative url and error response support. - [elro] - -1.0 - 2010-07-28 ----------------- - -- Initial release. - [elro] diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..6441138 --- /dev/null +++ b/README.rst @@ -0,0 +1,27 @@ +Overview +======== + +plone.subrequest provides a mechanism for issuing subrequests under Zope2. + +Installation +============ + +Plone 4 +------- + +An entry point is provided so no special installation is required past adding +`plone.subrequest` to your instance's `eggs`. + +Zope 2.12 without Plone +----------------------- + +Load this package's ZCML in the usual manner. + +Zope 2.10 +--------- + +You must install ZPublisherEventsBackport_ to use this package with Zope 2.10 +and load both package's ZCML. The tests require Zope 2.12 / Python 2.6 so will +not run. + +.. _ZPublisherEventsBackport: http://pypi.python.org/pypi/ZPublisherEventsBackport diff --git a/README.txt b/README.txt deleted file mode 100644 index 6441138..0000000 --- a/README.txt +++ /dev/null @@ -1,27 +0,0 @@ -Overview -======== - -plone.subrequest provides a mechanism for issuing subrequests under Zope2. - -Installation -============ - -Plone 4 -------- - -An entry point is provided so no special installation is required past adding -`plone.subrequest` to your instance's `eggs`. - -Zope 2.12 without Plone ------------------------ - -Load this package's ZCML in the usual manner. - -Zope 2.10 ---------- - -You must install ZPublisherEventsBackport_ to use this package with Zope 2.10 -and load both package's ZCML. The tests require Zope 2.12 / Python 2.6 so will -not run. - -.. _ZPublisherEventsBackport: http://pypi.python.org/pypi/ZPublisherEventsBackport diff --git a/setup.py b/setup.py index c98e240..a0ce162 100644 --- a/setup.py +++ b/setup.py @@ -7,9 +7,9 @@ name = 'plone.subrequest', version = version, description = 'Subrequests for Zope2', - long_description=open("README.txt").read() + "\n\n" + + long_description=open("README.rst").read() + "\n\n" + open(os.path.join('plone', 'subrequest', 'usage.txt')).read() + "\n\n" + - open("CHANGES.txt").read(), + open("CHANGES.rst").read(), classifiers=[ "Environment :: Web Environment", "Framework :: Plone", Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:55:59+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/034cd27880cbd705bd54a3534e14d9d6ca26434b housekeeping Files changed: M .gitignore diff --git a/.gitignore b/.gitignore index e089dba..1545667 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,23 @@ +*.EGG +*.EGG-INFO +*.egg +*.egg-info *.py? -plone.subrequest.egg-info/ +*.tmp* +.*.cfg +.idea +/*.egg-info/ +/bin/ +/build/ +/build/ +/develop-eggs/ +/dist/ +/downloads/ +/eggs/ +/extras/ +/html/ +/include/ +/lib/ +/local/ +/parts/ +/var/ Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T18:14:49+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/8013724732e784dfa59431b1019e3698e7ce496c pep8 et al Files changed: M buildout.cfg M plone/__init__.py M plone/subrequest/__init__.py M plone/subrequest/subresponse.py M plone/subrequest/testing.py M plone/subrequest/tests.py M setup.py diff --git a/buildout.cfg b/buildout.cfg index 6f5e928..a9df8db 100644 --- a/buildout.cfg +++ b/buildout.cfg @@ -1,10 +1,10 @@ [buildout] -develop = . parts = checkdocs test versions = versions -extends = http://dist.plone.org/release/4.0-latest/versions.cfg -extensions = buildout.dumppickedversions +extends = + http://dist.plone.org/release/4.3-latest/versions.cfg +develop = . [checkdocs] recipe = zc.recipe.egg eggs = collective.checkdocs @@ -13,8 +13,10 @@ interpreter = py [test] recipe = zc.recipe.testrunner eggs = - plone.subrequest [test] + plone.subrequest[test] defaults = ['--auto-color', '--auto-progress'] [versions] -unittest2 = 0.5.1 +zc.buildout = +setuptools = +plone.subrequest = >1.6.8 diff --git a/plone/__init__.py b/plone/__init__.py index f48ad10..68c04af 100644 --- a/plone/__init__.py +++ b/plone/__init__.py @@ -1,6 +1,2 @@ -# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages -try: - __import__('pkg_resources').declare_namespace(__name__) -except ImportError: - from pkgutil import extend_path - __path__ = extend_path(__path__, __name__) +# -*- coding: utf-8 -*- +__import__('pkg_resources').declare_namespace(__name__) diff --git a/plone/subrequest/__init__.py b/plone/subrequest/__init__.py index 4fe947d..002ad91 100644 --- a/plone/subrequest/__init__.py +++ b/plone/subrequest/__init__.py @@ -1,5 +1,4 @@ -import re - +# -*- coding: utf-8 -*- from AccessControl import getSecurityManager from AccessControl.SecurityManagement import setSecurityManager from Acquisition import aq_base @@ -9,18 +8,20 @@ from ZPublisher.mapply import mapply from cStringIO import StringIO from logging import getLogger +from plone.subrequest.interfaces import ISubRequest +from plone.subrequest.subresponse import SubResponse from posixpath import normpath +from urllib import unquote # Python2.4 does not have urlparse.unquote from urlparse import urlsplit, urljoin -from urllib import unquote # Python2.4 does not have urlparse.unquote -from zope.interface import alsoProvides from zope.globalrequest import getRequest, setRequest +from zope.interface import alsoProvides +import re + try: from zope.site.hooks import getSite, setSite except ImportError: from zope.app.component.hooks import getSite, setSite -from plone.subrequest.subresponse import SubResponse -from plone.subrequest.interfaces import ISubRequest __all__ = ['subrequest', 'SubResponse'] @@ -31,7 +32,7 @@ 'HTTP_IF_MATCH', 'HTTP_IF_NONE_MATCH', 'HTTP_IF_RANGE', - 'HTTP_RANGE', # Not strictly a conditional header, but scrub it anyway + 'HTTP_RANGE', # Not strictly a conditional header, but scrub it anyway ] OTHER_IGNORE = set([ @@ -55,13 +56,15 @@ logger = getLogger("plone.subrequest") + def subrequest(url, root=None, stdout=None): assert url is not None, "You must pass a url" if isinstance(url, unicode): url = url.encode('utf-8') _, _, path, query, _ = urlsplit(url) parent_request = getRequest() - assert parent_request is not None, "Unable to get request, perhaps zope.globalrequest is not configured." + assert parent_request is not None, \ + "Unable to get request, perhaps zope.globalrequest is not configured." parent_site = getSite() security_manager = getSecurityManager() parent_app = parent_request.PARENTS[-1] @@ -71,7 +74,9 @@ def subrequest(url, root=None, stdout=None): if vurl_parts is not None: # Use the virtual host root path_past_root = unquote(vurl_parts[-1]) - root_path = normpath(parent_request['PATH_INFO']).rstrip('/')[:-len(path_past_root) or None] + root_path = normpath( + parent_request['PATH_INFO'] + ).rstrip('/')[:-len(path_past_root) or None] if root is None: path = root_path + path else: @@ -92,7 +97,9 @@ def subrequest(url, root=None, stdout=None): path = normpath(path) request = parent_request.clone() for name, parent_value in parent_request.other.items(): - if name in OTHER_IGNORE or OTHER_IGNORE_RE.match(name) or name.startswith('_'): + if name in OTHER_IGNORE \ + or OTHER_IGNORE_RE.match(name) \ + or name.startswith('_'): continue request.other[name] = parent_value for key, value in parent_request.response.cookies.items(): @@ -106,9 +113,9 @@ def subrequest(url, root=None, stdout=None): request['PARENTS'] = [app] response = request.response response.__class__ = SubResponse - response.stderr = None # only used on retry it seems + response.stderr = None # only used on retry it seems if stdout is None: - stdout = StringIO() # It might be possible to optimize this + stdout = StringIO() # It might be possible to optimize this response.stdout = stdout environ = request.environ environ['PATH_INFO'] = path @@ -140,4 +147,3 @@ def subrequest(url, root=None, stdout=None): setRequest(parent_request) setSite(parent_site) setSecurityManager(security_manager) - diff --git a/plone/subrequest/subresponse.py b/plone/subrequest/subresponse.py index 2e89a4f..d8c84a9 100644 --- a/plone/subrequest/subresponse.py +++ b/plone/subrequest/subresponse.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from ZPublisher.HTTPResponse import HTTPResponse from ZPublisher.Iterators import IStreamIterator try: @@ -6,6 +7,7 @@ class BlobStreamIterator: pass + class SubResponse(HTTPResponse): def setBody(self, body, title='', is_error=0, **kw): @@ -14,8 +16,10 @@ def setBody(self, body, title='', is_error=0, **kw): return HTTPResponse.setBody(self, body, title, is_error, **kw) assert not self._wrote if isinstance(body, BlobStreamIterator): - body = body.blob # A BlobFile - if hasattr(body, 'seek') and hasattr(body, 'read') and hasattr(body, 'close'): + body = body.blob # A BlobFile + if hasattr(body, 'seek') \ + and hasattr(body, 'read') and \ + hasattr(body, 'close'): self.stdout = body self._wrote = 1 return diff --git a/plone/subrequest/testing.py b/plone/subrequest/testing.py index 1d2ee64..6a3ba0d 100644 --- a/plone/subrequest/testing.py +++ b/plone/subrequest/testing.py @@ -1,9 +1,12 @@ -import OFS.Folder +# -*- coding: utf-8 -*- from Products.Five.browser import BrowserView from five.localsitemanager import make_site from plone.subrequest import subrequest -from plone.testing import Layer, z2, zodb, zca -from zope.globalrequest import getRequest, setRequest +from plone.testing import Layer +from plone.testing import z2 +from plone.testing import zca +from plone.testing import zodb +from zope.globalrequest import setRequest class CookieView(BrowserView): @@ -20,7 +23,6 @@ def __init__(self, context, request): self.keys = self.request.keys() def __call__(self): - response = self.request.response return str(self.keys) @@ -91,17 +93,23 @@ def __call__(self): def singleton(cls): return cls() + @singleton class PLONE_SUBREQEST_FIXTURE(Layer): defaultBases = (z2.STARTUP,) def setUp(self): # Stack a new DemoStorage on top of the one from z2.STARTUP. - self['zodbDB'] = zodb.stackDemoStorage(self.get('zodbDB'), name='PloneSubRequestFixture') + self['zodbDB'] = zodb.stackDemoStorage( + self.get('zodbDB'), + name='PloneSubRequestFixture' + ) # Create a new global registry zca.pushGlobalRegistry() - self['configurationContext'] = context = zca.stackConfigurationContext(self.get('configurationContext')) + self['configurationContext'] = context = zca.stackConfigurationContext( + self.get('configurationContext') + ) # Load out ZCML from zope.configuration import xmlconfig @@ -111,7 +119,8 @@ def setUp(self): with z2.zopeApp() as app: # Enable virtual hosting z2.installProduct(app, 'Products.SiteAccess') - from Products.SiteAccess.VirtualHostMonster import VirtualHostMonster + from Products.SiteAccess.VirtualHostMonster import \ + VirtualHostMonster vhm = VirtualHostMonster() app._setObject(vhm.getId(), vhm, suppress_events=True) # With suppress_events=False, this is called twice... @@ -149,6 +158,12 @@ def testTearDown(self): setRequest(None) -INTEGRATION_TESTING = PloneSubrequestLifecycle(bases=(PLONE_SUBREQEST_FIXTURE,), name="PloneSubrequest:Integration") -FUNCTIONAL_TESTING = z2.FunctionalTesting(bases=(PLONE_SUBREQEST_FIXTURE,), name="PloneSubrequest:Functional") +INTEGRATION_TESTING = PloneSubrequestLifecycle( + bases=(PLONE_SUBREQEST_FIXTURE,), + name="PloneSubrequest:Integration" +) +FUNCTIONAL_TESTING = z2.FunctionalTesting( + bases=(PLONE_SUBREQEST_FIXTURE,), + name="PloneSubrequest:Functional" +) diff --git a/plone/subrequest/tests.py b/plone/subrequest/tests.py index c5f9d8b..5ee13aa 100644 --- a/plone/subrequest/tests.py +++ b/plone/subrequest/tests.py @@ -1,21 +1,29 @@ +# -*- coding: utf-8 -*- +from plone.subrequest import subrequest +from plone.subrequest.testing import FUNCTIONAL_TESTING +from plone.subrequest.testing import INTEGRATION_TESTING +from plone.testing import z2 +from zope.globalrequest import getRequest +from zope.site.hooks import getSite import manuel.doctest import manuel.testcase import manuel.testing import unittest2 as unittest -from plone.subrequest import subrequest -from plone.subrequest.testing import INTEGRATION_TESTING, FUNCTIONAL_TESTING -from plone.testing import z2 -from zope.globalrequest import getRequest -from zope.site.hooks import getSite def traverse(url): request = getRequest() - traversed = request.traverse(url) + request.traverse(url) request.processInputs() request['PATH_INFO'] = url return request +VH_TPL = ( + "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot" + "/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" +) +NOHOST_VH_TPL = 'http://nohost' + VH_TPL + class FunctionalTests(unittest.TestCase): layer = FUNCTIONAL_TESTING @@ -30,7 +38,7 @@ def test_absolute(self): def test_virtual_hosting(self): parts = ('folder1', 'folder1A/@@url') expect = 'folder1A' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -38,7 +46,7 @@ def test_virtual_hosting(self): def test_virtual_hosting_relative(self): parts = ('folder1', 'folder1A?url=folder1Ai/@@url') expect = 'folder1A/folder1Ai' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -46,7 +54,7 @@ def test_virtual_hosting_relative(self): def test_virtual_hosting_absolute(self): parts = ('folder1', 'folder1A?url=/folder1B/@@url') expect = 'folder1B' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -57,35 +65,56 @@ class IntegrationTests(unittest.TestCase): def test_absolute(self): response = subrequest('/folder1/@@url') - self.assertEqual(response.body, 'http://nohost/folder1') + self.assertEqual( + response.body, + 'http://nohost/folder1' + ) def test_absolute_query(self): response = subrequest('/folder1/folder1A?url=/folder2/folder2A/@@url') - self.assertEqual(response.body, 'http://nohost/folder2/folder2A') + self.assertEqual( + response.body, + 'http://nohost/folder2/folder2A' + ) def test_relative(self): response = subrequest('/folder1?url=folder1B/@@url') # /folder1 resolves to /folder1/@@test - self.assertEqual(response.body, 'http://nohost/folder1/folder1B') + self.assertEqual( + response.body, + 'http://nohost/folder1/folder1B' + ) def test_root(self): response = subrequest('/') - self.assertEqual(response.body, 'Root: http://nohost') + self.assertEqual( + response.body, + 'Root: http://nohost' + ) def test_virtual_hosting(self): - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A/@@url') + url = VH_TPL % ('folder1', 'folder1A/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A' + ) def test_virtual_hosting_unicode(self): - url = u"/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A/@@url') + url = VH_TPL % ('folder1', 'folder1A/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A' + ) def test_virtual_hosting_relative(self): - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A?url=folder1B/@@url') + url = VH_TPL % ('folder1', 'folder1A?url=folder1B/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_not_found(self): response = subrequest('/notfound') @@ -93,53 +122,85 @@ def test_not_found(self): def test_virtual_host_root(self): parts = ('folder1', 'folder1A/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = VH_TPL % parts traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_root_with_root(self): parts = ('folder1', 'folder1A/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = VH_TPL % parts traverse(url) app = self.layer['app'] response = subrequest('/folder1Ai/@@url', root=app.folder1.folder1A) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A/folder1Ai') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A/folder1Ai' + ) def test_virtual_host_space(self): parts = ('folder2', 'folder2A/folder2Ai space/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/%s" % parts + url = ( + "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/%s" % + parts + ) traverse(url) app = self.layer['app'] response = subrequest('/folder2A/@@url', root=app.folder2) - self.assertEqual(response.body, 'http://example.org/folder2A') + self.assertEqual( + response.body, + 'http://example.org/folder2A' + ) def test_virtual_host_root_at_root(self): - url = "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz" + url = ( + "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/" + "_vh_fizz/_vh_buzz/_vh_fizzbuzz" + ) traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_root_at_root_trailing(self): - url = "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/" + url = ( + "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/" + "_vh_fizz/_vh_buzz/_vh_fizzbuzz/" + ) traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_with_root_double_slash(self): - url = "/VirtualHostBase/http/example.org:80/VirtualHostRoot/_vh_fizz/folder1/folder2//folder2A" + url = ( + "/VirtualHostBase/http/example.org:80/VirtualHostRoot/" + "_vh_fizz/folder1/folder2//folder2A" + ) traverse(url) root = self.layer['app'].folder1 response = subrequest('/folder1B/@@url', root=root) - self.assertEqual(response.body, 'http://example.org/fizz/folder1/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/folder1/folder1B' + ) def test_subrequest_root(self): app = self.layer['app'] response = subrequest('/folder1Ai/@@url', root=app.folder1.folder1A) - self.assertEqual(response.body, 'http://nohost/folder1/folder1A/folder1Ai') + self.assertEqual( + response.body, + 'http://nohost/folder1/folder1A/folder1Ai' + ) def test_site(self): - app = self.layer['app'] traverse('/folder1') site_url1 = getSite().absolute_url() response = subrequest('/folder2/@@url') @@ -204,7 +265,11 @@ def test_suite(): suite = unittest.defaultTestLoader.loadTestsFromName(__name__) m = manuel.doctest.Manuel() m += manuel.testcase.MarkerManuel() - doctests = manuel.testing.TestSuite(m, 'usage.txt', globs=dict(subrequest=subrequest, traverse=traverse)) + doctests = manuel.testing.TestSuite( + m, + 'usage.txt', + globs=dict(subrequest=subrequest, traverse=traverse) + ) # Set the layer on the manuel doctests for now for test in doctests: test.layer = INTEGRATION_TESTING diff --git a/setup.py b/setup.py index a0ce162..1a06ff4 100644 --- a/setup.py +++ b/setup.py @@ -4,9 +4,9 @@ version = '1.6.9.dev0' setup( - name = 'plone.subrequest', - version = version, - description = 'Subrequests for Zope2', + name='plone.subrequest', + version=version, + description='Subrequests for Zope2', long_description=open("README.rst").read() + "\n\n" + open(os.path.join('plone', 'subrequest', 'usage.txt')).read() + "\n\n" + open("CHANGES.rst").read(), Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T19:03:55+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/f92904947f358fd12f095b0eb0ca5d27b187afc8 Workaround for broken test because of missing dependency declaration in upstream package, see https://github.com/plone/plone.app.blob/issues/19 for details. Files changed: M CHANGES.rst M setup.py diff --git a/CHANGES.rst b/CHANGES.rst index 7f9ebcb..69fe80a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,14 @@ Changelog 1.6.9 (unreleased) ------------------ +- Workaround for broken test because of missing dependency declaration in + upstream package, see https://github.com/plone/plone.app.blob/issues/19 + for details. + [jensens] + +- Housekeeping and code cleanup (pep8, et al). + [jensens] + - Fix issue where new cookies from the main request.response are not passed to subrequests. [datakurre] diff --git a/setup.py b/setup.py index 1a06ff4..ee51e16 100644 --- a/setup.py +++ b/setup.py @@ -41,6 +41,9 @@ 'manuel', 'plone.testing [z2]', 'plone.app.blob', + + # see https://github.com/plone/plone.app.blob/issues/19 + 'Products.MimetypesRegistry', ], }, entry_points=""" Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T19:21:06+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/0f52a877f0be19fa585d65496db35d4088bbc76c Merge pull request #2 from plone/mosaicsprint Fix issue where new cookies from the main request.response are not passed to subrequests Files changed: A CHANGES.rst A README.rst M .gitignore M buildout.cfg M plone/__init__.py M plone/subrequest/__init__.py M plone/subrequest/subresponse.py M plone/subrequest/testing.py M plone/subrequest/tests.py M setup.py D CHANGES.txt D README.txt diff --git a/.gitignore b/.gitignore index e089dba..1545667 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,23 @@ +*.EGG +*.EGG-INFO +*.egg +*.egg-info *.py? -plone.subrequest.egg-info/ +*.tmp* +.*.cfg +.idea +/*.egg-info/ +/bin/ +/build/ +/build/ +/develop-eggs/ +/dist/ +/downloads/ +/eggs/ +/extras/ +/html/ +/include/ +/lib/ +/local/ +/parts/ +/var/ diff --git a/CHANGES.rst b/CHANGES.rst new file mode 100644 index 0000000..69fe80a --- /dev/null +++ b/CHANGES.rst @@ -0,0 +1,122 @@ +Changelog +========= + +1.6.9 (unreleased) +------------------ + +- Workaround for broken test because of missing dependency declaration in + upstream package, see https://github.com/plone/plone.app.blob/issues/19 + for details. + [jensens] + +- Housekeeping and code cleanup (pep8, et al). + [jensens] + +- Fix issue where new cookies from the main request.response are not passed to + subrequests. + [datakurre] + +1.6.8 (2014-03-04) +------------------ +- Handle sub-requests which contain a doubled // in the path. + [gweis] + +1.6.7 (2012-10-22) +------------------ + +- Ensure correct handling of bare virtual hosting urls. + [elro] + +1.6.6 (2012-06-29) +------------------ + +- Log errors that occur handling a subrequest to help debug plone.app.theming + errors including content from a different url + [anthonygerrard] + +1.6.5 (2012-04-15) +------------------ + +- Ensure parent url is a string and not unicode. + [davisagli] + +1.6.4 - 2012-03-22 +------------------ + +- Fix problems with double encoding some unicode charse by not copying too + many ``other`` variables. + [elro] + +1.6.3 - 2012-02-12 +------------------ + +- Copy ``other`` request variables such as ``LANGUAGE`` to subrequest. + [elro] + +1.6.2 - 2011-07-04 +------------------ + +- Handle spaces in default documents. http://dev.plone.org/plone/ticket/12278 + +1.6.1 - 2011-07-04 +------------------ + +- Move tests to package directory to making testing possible when installed + normally. + +1.6 - 2011-06-06 +---------------- + +- Ensure url is a string and not unicode. + [elro] + +1.6b2 - 2011-05-20 +------------------ + +- Set PARENT_REQUEST and add ISubRequest interface to subrequests. + [elro] + +1.6b1 - 2011-02-11 +------------------ + +- Handle IStreamIterator. + [elro] + +- Simplify API so ``response.getBody()`` always works. + [elro] + +1.5 - 2010-11-26 +---------------- + +- Merge cookies from subrequest response into parent response. + [awello] + +1.4 - 2010-11-10 +---------------- + +- First processInput, then traverse (fixes #11254) + [awello] + +1.3 - 2010-08-24 +---------------- + +- Fixed bug with virtual hosting and quoted paths. + [elro] + +1.2 - 2010-08-16 +---------------- + +- Restore zope.component site after subrequest. + [elro] + +1.1 - 2010-08-14 +---------------- + +- Virtual hosting, relative url and error response support. + [elro] + +1.0 - 2010-07-28 +---------------- + +- Initial release. + [elro] diff --git a/CHANGES.txt b/CHANGES.txt deleted file mode 100644 index ee2204c..0000000 --- a/CHANGES.txt +++ /dev/null @@ -1,108 +0,0 @@ -Changelog -========= - -1.6.8 (unreleased) ------------------- - -- Handle sub-requests which contain a doubled // in the path. - [gweis] - -1.6.7 (2012-10-22) ------------------- - -- Ensure correct handling of bare virtual hosting urls. - [elro] - -1.6.6 (2012-06-29) ------------------- - -- Log errors that occur handling a subrequest to help debug plone.app.theming - errors including content from a different url - [anthonygerrard] - -1.6.5 (2012-04-15) ------------------- - -- Ensure parent url is a string and not unicode. - [davisagli] - -1.6.4 - 2012-03-22 ------------------- - -- Fix problems with double encoding some unicode charse by not copying too - many ``other`` variables. - [elro] - -1.6.3 - 2012-02-12 ------------------- - -- Copy ``other`` request variables such as ``LANGUAGE`` to subrequest. - [elro] - -1.6.2 - 2011-07-04 ------------------- - -- Handle spaces in default documents. http://dev.plone.org/plone/ticket/12278 - -1.6.1 - 2011-07-04 ------------------- - -- Move tests to package directory to making testing possible when installed - normally. - -1.6 - 2011-06-06 ----------------- - -- Ensure url is a string and not unicode. - [elro] - -1.6b2 - 2011-05-20 ------------------- - -- Set PARENT_REQUEST and add ISubRequest interface to subrequests. - [elro] - -1.6b1 - 2011-02-11 ------------------- - -- Handle IStreamIterator. - [elro] - -- Simplify API so ``response.getBody()`` always works. - [elro] - -1.5 - 2010-11-26 ----------------- - -- Merge cookies from subrequest response into parent response. - [awello] - -1.4 - 2010-11-10 ----------------- - -- First processInput, then traverse (fixes #11254) - [awello] - -1.3 - 2010-08-24 ----------------- - -- Fixed bug with virtual hosting and quoted paths. - [elro] - -1.2 - 2010-08-16 ----------------- - -- Restore zope.component site after subrequest. - [elro] - -1.1 - 2010-08-14 ----------------- - -- Virtual hosting, relative url and error response support. - [elro] - -1.0 - 2010-07-28 ----------------- - -- Initial release. - [elro] diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..6441138 --- /dev/null +++ b/README.rst @@ -0,0 +1,27 @@ +Overview +======== + +plone.subrequest provides a mechanism for issuing subrequests under Zope2. + +Installation +============ + +Plone 4 +------- + +An entry point is provided so no special installation is required past adding +`plone.subrequest` to your instance's `eggs`. + +Zope 2.12 without Plone +----------------------- + +Load this package's ZCML in the usual manner. + +Zope 2.10 +--------- + +You must install ZPublisherEventsBackport_ to use this package with Zope 2.10 +and load both package's ZCML. The tests require Zope 2.12 / Python 2.6 so will +not run. + +.. _ZPublisherEventsBackport: http://pypi.python.org/pypi/ZPublisherEventsBackport diff --git a/README.txt b/README.txt deleted file mode 100644 index 6441138..0000000 --- a/README.txt +++ /dev/null @@ -1,27 +0,0 @@ -Overview -======== - -plone.subrequest provides a mechanism for issuing subrequests under Zope2. - -Installation -============ - -Plone 4 -------- - -An entry point is provided so no special installation is required past adding -`plone.subrequest` to your instance's `eggs`. - -Zope 2.12 without Plone ------------------------ - -Load this package's ZCML in the usual manner. - -Zope 2.10 ---------- - -You must install ZPublisherEventsBackport_ to use this package with Zope 2.10 -and load both package's ZCML. The tests require Zope 2.12 / Python 2.6 so will -not run. - -.. _ZPublisherEventsBackport: http://pypi.python.org/pypi/ZPublisherEventsBackport diff --git a/buildout.cfg b/buildout.cfg index 6f5e928..a9df8db 100644 --- a/buildout.cfg +++ b/buildout.cfg @@ -1,10 +1,10 @@ [buildout] -develop = . parts = checkdocs test versions = versions -extends = http://dist.plone.org/release/4.0-latest/versions.cfg -extensions = buildout.dumppickedversions +extends = + http://dist.plone.org/release/4.3-latest/versions.cfg +develop = . [checkdocs] recipe = zc.recipe.egg eggs = collective.checkdocs @@ -13,8 +13,10 @@ interpreter = py [test] recipe = zc.recipe.testrunner eggs = - plone.subrequest [test] + plone.subrequest[test] defaults = ['--auto-color', '--auto-progress'] [versions] -unittest2 = 0.5.1 +zc.buildout = +setuptools = +plone.subrequest = >1.6.8 diff --git a/plone/__init__.py b/plone/__init__.py index f48ad10..68c04af 100644 --- a/plone/__init__.py +++ b/plone/__init__.py @@ -1,6 +1,2 @@ -# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages -try: - __import__('pkg_resources').declare_namespace(__name__) -except ImportError: - from pkgutil import extend_path - __path__ = extend_path(__path__, __name__) +# -*- coding: utf-8 -*- +__import__('pkg_resources').declare_namespace(__name__) diff --git a/plone/subrequest/__init__.py b/plone/subrequest/__init__.py index c9d4453..002ad91 100644 --- a/plone/subrequest/__init__.py +++ b/plone/subrequest/__init__.py @@ -1,5 +1,4 @@ -import re - +# -*- coding: utf-8 -*- from AccessControl import getSecurityManager from AccessControl.SecurityManagement import setSecurityManager from Acquisition import aq_base @@ -9,18 +8,20 @@ from ZPublisher.mapply import mapply from cStringIO import StringIO from logging import getLogger +from plone.subrequest.interfaces import ISubRequest +from plone.subrequest.subresponse import SubResponse from posixpath import normpath +from urllib import unquote # Python2.4 does not have urlparse.unquote from urlparse import urlsplit, urljoin -from urllib import unquote # Python2.4 does not have urlparse.unquote -from zope.interface import alsoProvides from zope.globalrequest import getRequest, setRequest +from zope.interface import alsoProvides +import re + try: from zope.site.hooks import getSite, setSite except ImportError: from zope.app.component.hooks import getSite, setSite -from plone.subrequest.subresponse import SubResponse -from plone.subrequest.interfaces import ISubRequest __all__ = ['subrequest', 'SubResponse'] @@ -31,7 +32,7 @@ 'HTTP_IF_MATCH', 'HTTP_IF_NONE_MATCH', 'HTTP_IF_RANGE', - 'HTTP_RANGE', # Not strictly a conditional header, but scrub it anyway + 'HTTP_RANGE', # Not strictly a conditional header, but scrub it anyway ] OTHER_IGNORE = set([ @@ -55,13 +56,15 @@ logger = getLogger("plone.subrequest") + def subrequest(url, root=None, stdout=None): assert url is not None, "You must pass a url" if isinstance(url, unicode): url = url.encode('utf-8') _, _, path, query, _ = urlsplit(url) parent_request = getRequest() - assert parent_request is not None, "Unable to get request, perhaps zope.globalrequest is not configured." + assert parent_request is not None, \ + "Unable to get request, perhaps zope.globalrequest is not configured." parent_site = getSite() security_manager = getSecurityManager() parent_app = parent_request.PARENTS[-1] @@ -71,7 +74,9 @@ def subrequest(url, root=None, stdout=None): if vurl_parts is not None: # Use the virtual host root path_past_root = unquote(vurl_parts[-1]) - root_path = normpath(parent_request['PATH_INFO']).rstrip('/')[:-len(path_past_root) or None] + root_path = normpath( + parent_request['PATH_INFO'] + ).rstrip('/')[:-len(path_past_root) or None] if root is None: path = root_path + path else: @@ -92,9 +97,13 @@ def subrequest(url, root=None, stdout=None): path = normpath(path) request = parent_request.clone() for name, parent_value in parent_request.other.items(): - if name in OTHER_IGNORE or OTHER_IGNORE_RE.match(name) or name.startswith('_'): + if name in OTHER_IGNORE \ + or OTHER_IGNORE_RE.match(name) \ + or name.startswith('_'): continue request.other[name] = parent_value + for key, value in parent_request.response.cookies.items(): + request.cookies[key] = value['value'] request['PARENT_REQUEST'] = parent_request alsoProvides(request, ISubRequest) try: @@ -104,9 +113,9 @@ def subrequest(url, root=None, stdout=None): request['PARENTS'] = [app] response = request.response response.__class__ = SubResponse - response.stderr = None # only used on retry it seems + response.stderr = None # only used on retry it seems if stdout is None: - stdout = StringIO() # It might be possible to optimize this + stdout = StringIO() # It might be possible to optimize this response.stdout = stdout environ = request.environ environ['PATH_INFO'] = path @@ -138,4 +147,3 @@ def subrequest(url, root=None, stdout=None): setRequest(parent_request) setSite(parent_site) setSecurityManager(security_manager) - diff --git a/plone/subrequest/subresponse.py b/plone/subrequest/subresponse.py index 2e89a4f..d8c84a9 100644 --- a/plone/subrequest/subresponse.py +++ b/plone/subrequest/subresponse.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from ZPublisher.HTTPResponse import HTTPResponse from ZPublisher.Iterators import IStreamIterator try: @@ -6,6 +7,7 @@ class BlobStreamIterator: pass + class SubResponse(HTTPResponse): def setBody(self, body, title='', is_error=0, **kw): @@ -14,8 +16,10 @@ def setBody(self, body, title='', is_error=0, **kw): return HTTPResponse.setBody(self, body, title, is_error, **kw) assert not self._wrote if isinstance(body, BlobStreamIterator): - body = body.blob # A BlobFile - if hasattr(body, 'seek') and hasattr(body, 'read') and hasattr(body, 'close'): + body = body.blob # A BlobFile + if hasattr(body, 'seek') \ + and hasattr(body, 'read') and \ + hasattr(body, 'close'): self.stdout = body self._wrote = 1 return diff --git a/plone/subrequest/testing.py b/plone/subrequest/testing.py index 1d2ee64..6a3ba0d 100644 --- a/plone/subrequest/testing.py +++ b/plone/subrequest/testing.py @@ -1,9 +1,12 @@ -import OFS.Folder +# -*- coding: utf-8 -*- from Products.Five.browser import BrowserView from five.localsitemanager import make_site from plone.subrequest import subrequest -from plone.testing import Layer, z2, zodb, zca -from zope.globalrequest import getRequest, setRequest +from plone.testing import Layer +from plone.testing import z2 +from plone.testing import zca +from plone.testing import zodb +from zope.globalrequest import setRequest class CookieView(BrowserView): @@ -20,7 +23,6 @@ def __init__(self, context, request): self.keys = self.request.keys() def __call__(self): - response = self.request.response return str(self.keys) @@ -91,17 +93,23 @@ def __call__(self): def singleton(cls): return cls() + @singleton class PLONE_SUBREQEST_FIXTURE(Layer): defaultBases = (z2.STARTUP,) def setUp(self): # Stack a new DemoStorage on top of the one from z2.STARTUP. - self['zodbDB'] = zodb.stackDemoStorage(self.get('zodbDB'), name='PloneSubRequestFixture') + self['zodbDB'] = zodb.stackDemoStorage( + self.get('zodbDB'), + name='PloneSubRequestFixture' + ) # Create a new global registry zca.pushGlobalRegistry() - self['configurationContext'] = context = zca.stackConfigurationContext(self.get('configurationContext')) + self['configurationContext'] = context = zca.stackConfigurationContext( + self.get('configurationContext') + ) # Load out ZCML from zope.configuration import xmlconfig @@ -111,7 +119,8 @@ def setUp(self): with z2.zopeApp() as app: # Enable virtual hosting z2.installProduct(app, 'Products.SiteAccess') - from Products.SiteAccess.VirtualHostMonster import VirtualHostMonster + from Products.SiteAccess.VirtualHostMonster import \ + VirtualHostMonster vhm = VirtualHostMonster() app._setObject(vhm.getId(), vhm, suppress_events=True) # With suppress_events=False, this is called twice... @@ -149,6 +158,12 @@ def testTearDown(self): setRequest(None) -INTEGRATION_TESTING = PloneSubrequestLifecycle(bases=(PLONE_SUBREQEST_FIXTURE,), name="PloneSubrequest:Integration") -FUNCTIONAL_TESTING = z2.FunctionalTesting(bases=(PLONE_SUBREQEST_FIXTURE,), name="PloneSubrequest:Functional") +INTEGRATION_TESTING = PloneSubrequestLifecycle( + bases=(PLONE_SUBREQEST_FIXTURE,), + name="PloneSubrequest:Integration" +) +FUNCTIONAL_TESTING = z2.FunctionalTesting( + bases=(PLONE_SUBREQEST_FIXTURE,), + name="PloneSubrequest:Functional" +) diff --git a/plone/subrequest/tests.py b/plone/subrequest/tests.py index a7d7c1d..5ee13aa 100644 --- a/plone/subrequest/tests.py +++ b/plone/subrequest/tests.py @@ -1,21 +1,29 @@ +# -*- coding: utf-8 -*- +from plone.subrequest import subrequest +from plone.subrequest.testing import FUNCTIONAL_TESTING +from plone.subrequest.testing import INTEGRATION_TESTING +from plone.testing import z2 +from zope.globalrequest import getRequest +from zope.site.hooks import getSite import manuel.doctest import manuel.testcase import manuel.testing import unittest2 as unittest -from plone.subrequest import subrequest -from plone.subrequest.testing import INTEGRATION_TESTING, FUNCTIONAL_TESTING -from plone.testing import z2 -from zope.globalrequest import getRequest -from zope.site.hooks import getSite def traverse(url): request = getRequest() - traversed = request.traverse(url) + request.traverse(url) request.processInputs() request['PATH_INFO'] = url return request +VH_TPL = ( + "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot" + "/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" +) +NOHOST_VH_TPL = 'http://nohost' + VH_TPL + class FunctionalTests(unittest.TestCase): layer = FUNCTIONAL_TESTING @@ -30,7 +38,7 @@ def test_absolute(self): def test_virtual_hosting(self): parts = ('folder1', 'folder1A/@@url') expect = 'folder1A' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -38,7 +46,7 @@ def test_virtual_hosting(self): def test_virtual_hosting_relative(self): parts = ('folder1', 'folder1A?url=folder1Ai/@@url') expect = 'folder1A/folder1Ai' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -46,7 +54,7 @@ def test_virtual_hosting_relative(self): def test_virtual_hosting_absolute(self): parts = ('folder1', 'folder1A?url=/folder1B/@@url') expect = 'folder1B' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -57,35 +65,56 @@ class IntegrationTests(unittest.TestCase): def test_absolute(self): response = subrequest('/folder1/@@url') - self.assertEqual(response.body, 'http://nohost/folder1') + self.assertEqual( + response.body, + 'http://nohost/folder1' + ) def test_absolute_query(self): response = subrequest('/folder1/folder1A?url=/folder2/folder2A/@@url') - self.assertEqual(response.body, 'http://nohost/folder2/folder2A') + self.assertEqual( + response.body, + 'http://nohost/folder2/folder2A' + ) def test_relative(self): response = subrequest('/folder1?url=folder1B/@@url') # /folder1 resolves to /folder1/@@test - self.assertEqual(response.body, 'http://nohost/folder1/folder1B') + self.assertEqual( + response.body, + 'http://nohost/folder1/folder1B' + ) def test_root(self): response = subrequest('/') - self.assertEqual(response.body, 'Root: http://nohost') + self.assertEqual( + response.body, + 'Root: http://nohost' + ) def test_virtual_hosting(self): - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A/@@url') + url = VH_TPL % ('folder1', 'folder1A/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A' + ) def test_virtual_hosting_unicode(self): - url = u"/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A/@@url') + url = VH_TPL % ('folder1', 'folder1A/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A' + ) def test_virtual_hosting_relative(self): - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A?url=folder1B/@@url') + url = VH_TPL % ('folder1', 'folder1A?url=folder1B/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_not_found(self): response = subrequest('/notfound') @@ -93,53 +122,85 @@ def test_not_found(self): def test_virtual_host_root(self): parts = ('folder1', 'folder1A/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = VH_TPL % parts traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_root_with_root(self): parts = ('folder1', 'folder1A/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = VH_TPL % parts traverse(url) app = self.layer['app'] response = subrequest('/folder1Ai/@@url', root=app.folder1.folder1A) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A/folder1Ai') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A/folder1Ai' + ) def test_virtual_host_space(self): parts = ('folder2', 'folder2A/folder2Ai space/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/%s" % parts + url = ( + "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/%s" % + parts + ) traverse(url) app = self.layer['app'] response = subrequest('/folder2A/@@url', root=app.folder2) - self.assertEqual(response.body, 'http://example.org/folder2A') + self.assertEqual( + response.body, + 'http://example.org/folder2A' + ) def test_virtual_host_root_at_root(self): - url = "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz" + url = ( + "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/" + "_vh_fizz/_vh_buzz/_vh_fizzbuzz" + ) traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_root_at_root_trailing(self): - url = "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/" + url = ( + "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/" + "_vh_fizz/_vh_buzz/_vh_fizzbuzz/" + ) traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_with_root_double_slash(self): - url = "/VirtualHostBase/http/example.org:80/VirtualHostRoot/_vh_fizz/folder1/folder2//folder2A" + url = ( + "/VirtualHostBase/http/example.org:80/VirtualHostRoot/" + "_vh_fizz/folder1/folder2//folder2A" + ) traverse(url) root = self.layer['app'].folder1 response = subrequest('/folder1B/@@url', root=root) - self.assertEqual(response.body, 'http://example.org/fizz/folder1/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/folder1/folder1B' + ) def test_subrequest_root(self): app = self.layer['app'] response = subrequest('/folder1Ai/@@url', root=app.folder1.folder1A) - self.assertEqual(response.body, 'http://nohost/folder1/folder1A/folder1Ai') + self.assertEqual( + response.body, + 'http://nohost/folder1/folder1A/folder1Ai' + ) def test_site(self): - app = self.layer['app'] traverse('/folder1') site_url1 = getSite().absolute_url() response = subrequest('/folder2/@@url') @@ -152,6 +213,12 @@ def test_parameter(self): self.assertTrue('foo' in response.body) def test_cookies(self): + request = getRequest() + request.response.setCookie('cookie_name', 'cookie_value') + response = subrequest('/folder1/@@parameter') + self.assertTrue("'cookie_name'" in response.body) + + def test_subrequest_cookies(self): response = subrequest('/folder1/@@test?url=/folder1/cookie') self.assertTrue('cookie_name' in response.cookies) @@ -198,7 +265,11 @@ def test_suite(): suite = unittest.defaultTestLoader.loadTestsFromName(__name__) m = manuel.doctest.Manuel() m += manuel.testcase.MarkerManuel() - doctests = manuel.testing.TestSuite(m, 'usage.txt', globs=dict(subrequest=subrequest, traverse=traverse)) + doctests = manuel.testing.TestSuite( + m, + 'usage.txt', + globs=dict(subrequest=subrequest, traverse=traverse) + ) # Set the layer on the manuel doctests for now for test in doctests: test.layer = INTEGRATION_TESTING diff --git a/setup.py b/setup.py index eee1369..ee51e16 100644 --- a/setup.py +++ b/setup.py @@ -1,15 +1,15 @@ import os.path from setuptools import setup, find_packages -version = '1.6.8.dev0' +version = '1.6.9.dev0' setup( - name = 'plone.subrequest', - version = version, - description = 'Subrequests for Zope2', - long_description=open("README.txt").read() + "\n\n" + + name='plone.subrequest', + version=version, + description='Subrequests for Zope2', + long_description=open("README.rst").read() + "\n\n" + open(os.path.join('plone', 'subrequest', 'usage.txt')).read() + "\n\n" + - open("CHANGES.txt").read(), + open("CHANGES.rst").read(), classifiers=[ "Environment :: Web Environment", "Framework :: Plone", @@ -41,6 +41,9 @@ 'manuel', 'plone.testing [z2]', 'plone.app.blob', + + # see https://github.com/plone/plone.app.blob/issues/19 + 'Products.MimetypesRegistry', ], }, entry_points="""
jensens
added a commit
that referenced
this pull request
Mar 5, 2015
Branch: refs/heads/master Date: 2015-03-05T17:27:41+01:00 Author: Asko Soukka (datakurre) <asko.soukka@iki.fi> Commit: https://github.com/plone/plone.subrequest/commit/161041e7b0b5aa2403d22ea7fff63fb3fd1639a4 Fix issue where new cookies from the main request.response are not passed to subrequests. Files changed: M plone/subrequest/__init__.py M plone/subrequest/tests.py diff --git a/plone/subrequest/__init__.py b/plone/subrequest/__init__.py index c9d4453..4fe947d 100644 --- a/plone/subrequest/__init__.py +++ b/plone/subrequest/__init__.py @@ -95,6 +95,8 @@ def subrequest(url, root=None, stdout=None): if name in OTHER_IGNORE or OTHER_IGNORE_RE.match(name) or name.startswith('_'): continue request.other[name] = parent_value + for key, value in parent_request.response.cookies.items(): + request.cookies[key] = value['value'] request['PARENT_REQUEST'] = parent_request alsoProvides(request, ISubRequest) try: diff --git a/plone/subrequest/tests.py b/plone/subrequest/tests.py index a7d7c1d..c5f9d8b 100644 --- a/plone/subrequest/tests.py +++ b/plone/subrequest/tests.py @@ -152,6 +152,12 @@ def test_parameter(self): self.assertTrue('foo' in response.body) def test_cookies(self): + request = getRequest() + request.response.setCookie('cookie_name', 'cookie_value') + response = subrequest('/folder1/@@parameter') + self.assertTrue("'cookie_name'" in response.body) + + def test_subrequest_cookies(self): response = subrequest('/folder1/@@test?url=/folder1/cookie') self.assertTrue('cookie_name' in response.cookies) Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:27:41+01:00 Author: Asko Soukka (datakurre) <asko.soukka@iki.fi> Commit: https://github.com/plone/plone.subrequest/commit/9ca8b8e99cd4c52dbec8f2fd0bfa161729cdf8ef Update changelog Files changed: M CHANGES.txt diff --git a/CHANGES.txt b/CHANGES.txt index ee2204c..e45e81c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,6 +1,13 @@ Changelog ========= +1.6.9 (unreleased) +------------------ + +- Fix issue where new cookies from the main request.response are not passed to + subrequests. + [datakurre] + 1.6.8 (unreleased) ------------------ Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:27:41+01:00 Author: Asko Soukka (datakurre) <asko.soukka@iki.fi> Commit: https://github.com/plone/plone.subrequest/commit/9161b1d804a3933f0a18d38b9ebe469ec1d4a386 Update changelog Files changed: M CHANGES.txt diff --git a/CHANGES.txt b/CHANGES.txt index e45e81c..29d8f74 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -8,9 +8,6 @@ Changelog subrequests. [datakurre] -1.6.8 (unreleased) ------------------- - - Handle sub-requests which contain a doubled // in the path. [gweis] Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:27:41+01:00 Author: Asko Soukka (datakurre) <asko.soukka@iki.fi> Commit: https://github.com/plone/plone.subrequest/commit/1263a402e411789f296adbd17758af4a719f4e8a Fix the next version in changelog Files changed: M CHANGES.txt diff --git a/CHANGES.txt b/CHANGES.txt index 29d8f74..9db44b7 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,7 +1,7 @@ Changelog ========= -1.6.9 (unreleased) +1.6.8 (unreleased) ------------------ - Fix issue where new cookies from the main request.response are not passed to Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:31:13+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/9fe6bd48f1efca3bbb7d1d5610a0d3b4b0a2e422 fix version confusion Files changed: M CHANGES.txt M setup.py diff --git a/CHANGES.txt b/CHANGES.txt index 9db44b7..7f9ebcb 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,13 +1,15 @@ Changelog ========= -1.6.8 (unreleased) +1.6.9 (unreleased) ------------------ - Fix issue where new cookies from the main request.response are not passed to subrequests. [datakurre] +1.6.8 (2014-03-04) +------------------ - Handle sub-requests which contain a doubled // in the path. [gweis] diff --git a/setup.py b/setup.py index eee1369..c98e240 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ import os.path from setuptools import setup, find_packages -version = '1.6.8.dev0' +version = '1.6.9.dev0' setup( name = 'plone.subrequest', Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:32:12+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/bd485843b90f4a3a21c976691be2ea366f4f6559 housekeeping: txt->rst Files changed: A CHANGES.rst A README.rst M setup.py D CHANGES.txt D README.txt diff --git a/CHANGES.rst b/CHANGES.rst new file mode 100644 index 0000000..7f9ebcb --- /dev/null +++ b/CHANGES.rst @@ -0,0 +1,114 @@ +Changelog +========= + +1.6.9 (unreleased) +------------------ + +- Fix issue where new cookies from the main request.response are not passed to + subrequests. + [datakurre] + +1.6.8 (2014-03-04) +------------------ +- Handle sub-requests which contain a doubled // in the path. + [gweis] + +1.6.7 (2012-10-22) +------------------ + +- Ensure correct handling of bare virtual hosting urls. + [elro] + +1.6.6 (2012-06-29) +------------------ + +- Log errors that occur handling a subrequest to help debug plone.app.theming + errors including content from a different url + [anthonygerrard] + +1.6.5 (2012-04-15) +------------------ + +- Ensure parent url is a string and not unicode. + [davisagli] + +1.6.4 - 2012-03-22 +------------------ + +- Fix problems with double encoding some unicode charse by not copying too + many ``other`` variables. + [elro] + +1.6.3 - 2012-02-12 +------------------ + +- Copy ``other`` request variables such as ``LANGUAGE`` to subrequest. + [elro] + +1.6.2 - 2011-07-04 +------------------ + +- Handle spaces in default documents. http://dev.plone.org/plone/ticket/12278 + +1.6.1 - 2011-07-04 +------------------ + +- Move tests to package directory to making testing possible when installed + normally. + +1.6 - 2011-06-06 +---------------- + +- Ensure url is a string and not unicode. + [elro] + +1.6b2 - 2011-05-20 +------------------ + +- Set PARENT_REQUEST and add ISubRequest interface to subrequests. + [elro] + +1.6b1 - 2011-02-11 +------------------ + +- Handle IStreamIterator. + [elro] + +- Simplify API so ``response.getBody()`` always works. + [elro] + +1.5 - 2010-11-26 +---------------- + +- Merge cookies from subrequest response into parent response. + [awello] + +1.4 - 2010-11-10 +---------------- + +- First processInput, then traverse (fixes #11254) + [awello] + +1.3 - 2010-08-24 +---------------- + +- Fixed bug with virtual hosting and quoted paths. + [elro] + +1.2 - 2010-08-16 +---------------- + +- Restore zope.component site after subrequest. + [elro] + +1.1 - 2010-08-14 +---------------- + +- Virtual hosting, relative url and error response support. + [elro] + +1.0 - 2010-07-28 +---------------- + +- Initial release. + [elro] diff --git a/CHANGES.txt b/CHANGES.txt deleted file mode 100644 index 7f9ebcb..0000000 --- a/CHANGES.txt +++ /dev/null @@ -1,114 +0,0 @@ -Changelog -========= - -1.6.9 (unreleased) ------------------- - -- Fix issue where new cookies from the main request.response are not passed to - subrequests. - [datakurre] - -1.6.8 (2014-03-04) ------------------- -- Handle sub-requests which contain a doubled // in the path. - [gweis] - -1.6.7 (2012-10-22) ------------------- - -- Ensure correct handling of bare virtual hosting urls. - [elro] - -1.6.6 (2012-06-29) ------------------- - -- Log errors that occur handling a subrequest to help debug plone.app.theming - errors including content from a different url - [anthonygerrard] - -1.6.5 (2012-04-15) ------------------- - -- Ensure parent url is a string and not unicode. - [davisagli] - -1.6.4 - 2012-03-22 ------------------- - -- Fix problems with double encoding some unicode charse by not copying too - many ``other`` variables. - [elro] - -1.6.3 - 2012-02-12 ------------------- - -- Copy ``other`` request variables such as ``LANGUAGE`` to subrequest. - [elro] - -1.6.2 - 2011-07-04 ------------------- - -- Handle spaces in default documents. http://dev.plone.org/plone/ticket/12278 - -1.6.1 - 2011-07-04 ------------------- - -- Move tests to package directory to making testing possible when installed - normally. - -1.6 - 2011-06-06 ----------------- - -- Ensure url is a string and not unicode. - [elro] - -1.6b2 - 2011-05-20 ------------------- - -- Set PARENT_REQUEST and add ISubRequest interface to subrequests. - [elro] - -1.6b1 - 2011-02-11 ------------------- - -- Handle IStreamIterator. - [elro] - -- Simplify API so ``response.getBody()`` always works. - [elro] - -1.5 - 2010-11-26 ----------------- - -- Merge cookies from subrequest response into parent response. - [awello] - -1.4 - 2010-11-10 ----------------- - -- First processInput, then traverse (fixes #11254) - [awello] - -1.3 - 2010-08-24 ----------------- - -- Fixed bug with virtual hosting and quoted paths. - [elro] - -1.2 - 2010-08-16 ----------------- - -- Restore zope.component site after subrequest. - [elro] - -1.1 - 2010-08-14 ----------------- - -- Virtual hosting, relative url and error response support. - [elro] - -1.0 - 2010-07-28 ----------------- - -- Initial release. - [elro] diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..6441138 --- /dev/null +++ b/README.rst @@ -0,0 +1,27 @@ +Overview +======== + +plone.subrequest provides a mechanism for issuing subrequests under Zope2. + +Installation +============ + +Plone 4 +------- + +An entry point is provided so no special installation is required past adding +`plone.subrequest` to your instance's `eggs`. + +Zope 2.12 without Plone +----------------------- + +Load this package's ZCML in the usual manner. + +Zope 2.10 +--------- + +You must install ZPublisherEventsBackport_ to use this package with Zope 2.10 +and load both package's ZCML. The tests require Zope 2.12 / Python 2.6 so will +not run. + +.. _ZPublisherEventsBackport: http://pypi.python.org/pypi/ZPublisherEventsBackport diff --git a/README.txt b/README.txt deleted file mode 100644 index 6441138..0000000 --- a/README.txt +++ /dev/null @@ -1,27 +0,0 @@ -Overview -======== - -plone.subrequest provides a mechanism for issuing subrequests under Zope2. - -Installation -============ - -Plone 4 -------- - -An entry point is provided so no special installation is required past adding -`plone.subrequest` to your instance's `eggs`. - -Zope 2.12 without Plone ------------------------ - -Load this package's ZCML in the usual manner. - -Zope 2.10 ---------- - -You must install ZPublisherEventsBackport_ to use this package with Zope 2.10 -and load both package's ZCML. The tests require Zope 2.12 / Python 2.6 so will -not run. - -.. _ZPublisherEventsBackport: http://pypi.python.org/pypi/ZPublisherEventsBackport diff --git a/setup.py b/setup.py index c98e240..a0ce162 100644 --- a/setup.py +++ b/setup.py @@ -7,9 +7,9 @@ name = 'plone.subrequest', version = version, description = 'Subrequests for Zope2', - long_description=open("README.txt").read() + "\n\n" + + long_description=open("README.rst").read() + "\n\n" + open(os.path.join('plone', 'subrequest', 'usage.txt')).read() + "\n\n" + - open("CHANGES.txt").read(), + open("CHANGES.rst").read(), classifiers=[ "Environment :: Web Environment", "Framework :: Plone", Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T17:55:59+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/034cd27880cbd705bd54a3534e14d9d6ca26434b housekeeping Files changed: M .gitignore diff --git a/.gitignore b/.gitignore index e089dba..1545667 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,23 @@ +*.EGG +*.EGG-INFO +*.egg +*.egg-info *.py? -plone.subrequest.egg-info/ +*.tmp* +.*.cfg +.idea +/*.egg-info/ +/bin/ +/build/ +/build/ +/develop-eggs/ +/dist/ +/downloads/ +/eggs/ +/extras/ +/html/ +/include/ +/lib/ +/local/ +/parts/ +/var/ Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T18:14:49+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/8013724732e784dfa59431b1019e3698e7ce496c pep8 et al Files changed: M buildout.cfg M plone/__init__.py M plone/subrequest/__init__.py M plone/subrequest/subresponse.py M plone/subrequest/testing.py M plone/subrequest/tests.py M setup.py diff --git a/buildout.cfg b/buildout.cfg index 6f5e928..a9df8db 100644 --- a/buildout.cfg +++ b/buildout.cfg @@ -1,10 +1,10 @@ [buildout] -develop = . parts = checkdocs test versions = versions -extends = http://dist.plone.org/release/4.0-latest/versions.cfg -extensions = buildout.dumppickedversions +extends = + http://dist.plone.org/release/4.3-latest/versions.cfg +develop = . [checkdocs] recipe = zc.recipe.egg eggs = collective.checkdocs @@ -13,8 +13,10 @@ interpreter = py [test] recipe = zc.recipe.testrunner eggs = - plone.subrequest [test] + plone.subrequest[test] defaults = ['--auto-color', '--auto-progress'] [versions] -unittest2 = 0.5.1 +zc.buildout = +setuptools = +plone.subrequest = >1.6.8 diff --git a/plone/__init__.py b/plone/__init__.py index f48ad10..68c04af 100644 --- a/plone/__init__.py +++ b/plone/__init__.py @@ -1,6 +1,2 @@ -# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages -try: - __import__('pkg_resources').declare_namespace(__name__) -except ImportError: - from pkgutil import extend_path - __path__ = extend_path(__path__, __name__) +# -*- coding: utf-8 -*- +__import__('pkg_resources').declare_namespace(__name__) diff --git a/plone/subrequest/__init__.py b/plone/subrequest/__init__.py index 4fe947d..002ad91 100644 --- a/plone/subrequest/__init__.py +++ b/plone/subrequest/__init__.py @@ -1,5 +1,4 @@ -import re - +# -*- coding: utf-8 -*- from AccessControl import getSecurityManager from AccessControl.SecurityManagement import setSecurityManager from Acquisition import aq_base @@ -9,18 +8,20 @@ from ZPublisher.mapply import mapply from cStringIO import StringIO from logging import getLogger +from plone.subrequest.interfaces import ISubRequest +from plone.subrequest.subresponse import SubResponse from posixpath import normpath +from urllib import unquote # Python2.4 does not have urlparse.unquote from urlparse import urlsplit, urljoin -from urllib import unquote # Python2.4 does not have urlparse.unquote -from zope.interface import alsoProvides from zope.globalrequest import getRequest, setRequest +from zope.interface import alsoProvides +import re + try: from zope.site.hooks import getSite, setSite except ImportError: from zope.app.component.hooks import getSite, setSite -from plone.subrequest.subresponse import SubResponse -from plone.subrequest.interfaces import ISubRequest __all__ = ['subrequest', 'SubResponse'] @@ -31,7 +32,7 @@ 'HTTP_IF_MATCH', 'HTTP_IF_NONE_MATCH', 'HTTP_IF_RANGE', - 'HTTP_RANGE', # Not strictly a conditional header, but scrub it anyway + 'HTTP_RANGE', # Not strictly a conditional header, but scrub it anyway ] OTHER_IGNORE = set([ @@ -55,13 +56,15 @@ logger = getLogger("plone.subrequest") + def subrequest(url, root=None, stdout=None): assert url is not None, "You must pass a url" if isinstance(url, unicode): url = url.encode('utf-8') _, _, path, query, _ = urlsplit(url) parent_request = getRequest() - assert parent_request is not None, "Unable to get request, perhaps zope.globalrequest is not configured." + assert parent_request is not None, \ + "Unable to get request, perhaps zope.globalrequest is not configured." parent_site = getSite() security_manager = getSecurityManager() parent_app = parent_request.PARENTS[-1] @@ -71,7 +74,9 @@ def subrequest(url, root=None, stdout=None): if vurl_parts is not None: # Use the virtual host root path_past_root = unquote(vurl_parts[-1]) - root_path = normpath(parent_request['PATH_INFO']).rstrip('/')[:-len(path_past_root) or None] + root_path = normpath( + parent_request['PATH_INFO'] + ).rstrip('/')[:-len(path_past_root) or None] if root is None: path = root_path + path else: @@ -92,7 +97,9 @@ def subrequest(url, root=None, stdout=None): path = normpath(path) request = parent_request.clone() for name, parent_value in parent_request.other.items(): - if name in OTHER_IGNORE or OTHER_IGNORE_RE.match(name) or name.startswith('_'): + if name in OTHER_IGNORE \ + or OTHER_IGNORE_RE.match(name) \ + or name.startswith('_'): continue request.other[name] = parent_value for key, value in parent_request.response.cookies.items(): @@ -106,9 +113,9 @@ def subrequest(url, root=None, stdout=None): request['PARENTS'] = [app] response = request.response response.__class__ = SubResponse - response.stderr = None # only used on retry it seems + response.stderr = None # only used on retry it seems if stdout is None: - stdout = StringIO() # It might be possible to optimize this + stdout = StringIO() # It might be possible to optimize this response.stdout = stdout environ = request.environ environ['PATH_INFO'] = path @@ -140,4 +147,3 @@ def subrequest(url, root=None, stdout=None): setRequest(parent_request) setSite(parent_site) setSecurityManager(security_manager) - diff --git a/plone/subrequest/subresponse.py b/plone/subrequest/subresponse.py index 2e89a4f..d8c84a9 100644 --- a/plone/subrequest/subresponse.py +++ b/plone/subrequest/subresponse.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from ZPublisher.HTTPResponse import HTTPResponse from ZPublisher.Iterators import IStreamIterator try: @@ -6,6 +7,7 @@ class BlobStreamIterator: pass + class SubResponse(HTTPResponse): def setBody(self, body, title='', is_error=0, **kw): @@ -14,8 +16,10 @@ def setBody(self, body, title='', is_error=0, **kw): return HTTPResponse.setBody(self, body, title, is_error, **kw) assert not self._wrote if isinstance(body, BlobStreamIterator): - body = body.blob # A BlobFile - if hasattr(body, 'seek') and hasattr(body, 'read') and hasattr(body, 'close'): + body = body.blob # A BlobFile + if hasattr(body, 'seek') \ + and hasattr(body, 'read') and \ + hasattr(body, 'close'): self.stdout = body self._wrote = 1 return diff --git a/plone/subrequest/testing.py b/plone/subrequest/testing.py index 1d2ee64..6a3ba0d 100644 --- a/plone/subrequest/testing.py +++ b/plone/subrequest/testing.py @@ -1,9 +1,12 @@ -import OFS.Folder +# -*- coding: utf-8 -*- from Products.Five.browser import BrowserView from five.localsitemanager import make_site from plone.subrequest import subrequest -from plone.testing import Layer, z2, zodb, zca -from zope.globalrequest import getRequest, setRequest +from plone.testing import Layer +from plone.testing import z2 +from plone.testing import zca +from plone.testing import zodb +from zope.globalrequest import setRequest class CookieView(BrowserView): @@ -20,7 +23,6 @@ def __init__(self, context, request): self.keys = self.request.keys() def __call__(self): - response = self.request.response return str(self.keys) @@ -91,17 +93,23 @@ def __call__(self): def singleton(cls): return cls() + @singleton class PLONE_SUBREQEST_FIXTURE(Layer): defaultBases = (z2.STARTUP,) def setUp(self): # Stack a new DemoStorage on top of the one from z2.STARTUP. - self['zodbDB'] = zodb.stackDemoStorage(self.get('zodbDB'), name='PloneSubRequestFixture') + self['zodbDB'] = zodb.stackDemoStorage( + self.get('zodbDB'), + name='PloneSubRequestFixture' + ) # Create a new global registry zca.pushGlobalRegistry() - self['configurationContext'] = context = zca.stackConfigurationContext(self.get('configurationContext')) + self['configurationContext'] = context = zca.stackConfigurationContext( + self.get('configurationContext') + ) # Load out ZCML from zope.configuration import xmlconfig @@ -111,7 +119,8 @@ def setUp(self): with z2.zopeApp() as app: # Enable virtual hosting z2.installProduct(app, 'Products.SiteAccess') - from Products.SiteAccess.VirtualHostMonster import VirtualHostMonster + from Products.SiteAccess.VirtualHostMonster import \ + VirtualHostMonster vhm = VirtualHostMonster() app._setObject(vhm.getId(), vhm, suppress_events=True) # With suppress_events=False, this is called twice... @@ -149,6 +158,12 @@ def testTearDown(self): setRequest(None) -INTEGRATION_TESTING = PloneSubrequestLifecycle(bases=(PLONE_SUBREQEST_FIXTURE,), name="PloneSubrequest:Integration") -FUNCTIONAL_TESTING = z2.FunctionalTesting(bases=(PLONE_SUBREQEST_FIXTURE,), name="PloneSubrequest:Functional") +INTEGRATION_TESTING = PloneSubrequestLifecycle( + bases=(PLONE_SUBREQEST_FIXTURE,), + name="PloneSubrequest:Integration" +) +FUNCTIONAL_TESTING = z2.FunctionalTesting( + bases=(PLONE_SUBREQEST_FIXTURE,), + name="PloneSubrequest:Functional" +) diff --git a/plone/subrequest/tests.py b/plone/subrequest/tests.py index c5f9d8b..5ee13aa 100644 --- a/plone/subrequest/tests.py +++ b/plone/subrequest/tests.py @@ -1,21 +1,29 @@ +# -*- coding: utf-8 -*- +from plone.subrequest import subrequest +from plone.subrequest.testing import FUNCTIONAL_TESTING +from plone.subrequest.testing import INTEGRATION_TESTING +from plone.testing import z2 +from zope.globalrequest import getRequest +from zope.site.hooks import getSite import manuel.doctest import manuel.testcase import manuel.testing import unittest2 as unittest -from plone.subrequest import subrequest -from plone.subrequest.testing import INTEGRATION_TESTING, FUNCTIONAL_TESTING -from plone.testing import z2 -from zope.globalrequest import getRequest -from zope.site.hooks import getSite def traverse(url): request = getRequest() - traversed = request.traverse(url) + request.traverse(url) request.processInputs() request['PATH_INFO'] = url return request +VH_TPL = ( + "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot" + "/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" +) +NOHOST_VH_TPL = 'http://nohost' + VH_TPL + class FunctionalTests(unittest.TestCase): layer = FUNCTIONAL_TESTING @@ -30,7 +38,7 @@ def test_absolute(self): def test_virtual_hosting(self): parts = ('folder1', 'folder1A/@@url') expect = 'folder1A' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -38,7 +46,7 @@ def test_virtual_hosting(self): def test_virtual_hosting_relative(self): parts = ('folder1', 'folder1A?url=folder1Ai/@@url') expect = 'folder1A/folder1Ai' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -46,7 +54,7 @@ def test_virtual_hosting_relative(self): def test_virtual_hosting_absolute(self): parts = ('folder1', 'folder1A?url=/folder1B/@@url') expect = 'folder1B' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -57,35 +65,56 @@ class IntegrationTests(unittest.TestCase): def test_absolute(self): response = subrequest('/folder1/@@url') - self.assertEqual(response.body, 'http://nohost/folder1') + self.assertEqual( + response.body, + 'http://nohost/folder1' + ) def test_absolute_query(self): response = subrequest('/folder1/folder1A?url=/folder2/folder2A/@@url') - self.assertEqual(response.body, 'http://nohost/folder2/folder2A') + self.assertEqual( + response.body, + 'http://nohost/folder2/folder2A' + ) def test_relative(self): response = subrequest('/folder1?url=folder1B/@@url') # /folder1 resolves to /folder1/@@test - self.assertEqual(response.body, 'http://nohost/folder1/folder1B') + self.assertEqual( + response.body, + 'http://nohost/folder1/folder1B' + ) def test_root(self): response = subrequest('/') - self.assertEqual(response.body, 'Root: http://nohost') + self.assertEqual( + response.body, + 'Root: http://nohost' + ) def test_virtual_hosting(self): - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A/@@url') + url = VH_TPL % ('folder1', 'folder1A/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A' + ) def test_virtual_hosting_unicode(self): - url = u"/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A/@@url') + url = VH_TPL % ('folder1', 'folder1A/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A' + ) def test_virtual_hosting_relative(self): - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A?url=folder1B/@@url') + url = VH_TPL % ('folder1', 'folder1A?url=folder1B/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_not_found(self): response = subrequest('/notfound') @@ -93,53 +122,85 @@ def test_not_found(self): def test_virtual_host_root(self): parts = ('folder1', 'folder1A/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = VH_TPL % parts traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_root_with_root(self): parts = ('folder1', 'folder1A/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = VH_TPL % parts traverse(url) app = self.layer['app'] response = subrequest('/folder1Ai/@@url', root=app.folder1.folder1A) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A/folder1Ai') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A/folder1Ai' + ) def test_virtual_host_space(self): parts = ('folder2', 'folder2A/folder2Ai space/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/%s" % parts + url = ( + "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/%s" % + parts + ) traverse(url) app = self.layer['app'] response = subrequest('/folder2A/@@url', root=app.folder2) - self.assertEqual(response.body, 'http://example.org/folder2A') + self.assertEqual( + response.body, + 'http://example.org/folder2A' + ) def test_virtual_host_root_at_root(self): - url = "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz" + url = ( + "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/" + "_vh_fizz/_vh_buzz/_vh_fizzbuzz" + ) traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_root_at_root_trailing(self): - url = "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/" + url = ( + "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/" + "_vh_fizz/_vh_buzz/_vh_fizzbuzz/" + ) traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_with_root_double_slash(self): - url = "/VirtualHostBase/http/example.org:80/VirtualHostRoot/_vh_fizz/folder1/folder2//folder2A" + url = ( + "/VirtualHostBase/http/example.org:80/VirtualHostRoot/" + "_vh_fizz/folder1/folder2//folder2A" + ) traverse(url) root = self.layer['app'].folder1 response = subrequest('/folder1B/@@url', root=root) - self.assertEqual(response.body, 'http://example.org/fizz/folder1/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/folder1/folder1B' + ) def test_subrequest_root(self): app = self.layer['app'] response = subrequest('/folder1Ai/@@url', root=app.folder1.folder1A) - self.assertEqual(response.body, 'http://nohost/folder1/folder1A/folder1Ai') + self.assertEqual( + response.body, + 'http://nohost/folder1/folder1A/folder1Ai' + ) def test_site(self): - app = self.layer['app'] traverse('/folder1') site_url1 = getSite().absolute_url() response = subrequest('/folder2/@@url') @@ -204,7 +265,11 @@ def test_suite(): suite = unittest.defaultTestLoader.loadTestsFromName(__name__) m = manuel.doctest.Manuel() m += manuel.testcase.MarkerManuel() - doctests = manuel.testing.TestSuite(m, 'usage.txt', globs=dict(subrequest=subrequest, traverse=traverse)) + doctests = manuel.testing.TestSuite( + m, + 'usage.txt', + globs=dict(subrequest=subrequest, traverse=traverse) + ) # Set the layer on the manuel doctests for now for test in doctests: test.layer = INTEGRATION_TESTING diff --git a/setup.py b/setup.py index a0ce162..1a06ff4 100644 --- a/setup.py +++ b/setup.py @@ -4,9 +4,9 @@ version = '1.6.9.dev0' setup( - name = 'plone.subrequest', - version = version, - description = 'Subrequests for Zope2', + name='plone.subrequest', + version=version, + description='Subrequests for Zope2', long_description=open("README.rst").read() + "\n\n" + open(os.path.join('plone', 'subrequest', 'usage.txt')).read() + "\n\n" + open("CHANGES.rst").read(), Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T19:03:55+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/f92904947f358fd12f095b0eb0ca5d27b187afc8 Workaround for broken test because of missing dependency declaration in upstream package, see https://github.com/plone/plone.app.blob/issues/19 for details. Files changed: M CHANGES.rst M setup.py diff --git a/CHANGES.rst b/CHANGES.rst index 7f9ebcb..69fe80a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,14 @@ Changelog 1.6.9 (unreleased) ------------------ +- Workaround for broken test because of missing dependency declaration in + upstream package, see https://github.com/plone/plone.app.blob/issues/19 + for details. + [jensens] + +- Housekeeping and code cleanup (pep8, et al). + [jensens] + - Fix issue where new cookies from the main request.response are not passed to subrequests. [datakurre] diff --git a/setup.py b/setup.py index 1a06ff4..ee51e16 100644 --- a/setup.py +++ b/setup.py @@ -41,6 +41,9 @@ 'manuel', 'plone.testing [z2]', 'plone.app.blob', + + # see https://github.com/plone/plone.app.blob/issues/19 + 'Products.MimetypesRegistry', ], }, entry_points=""" Repository: plone.subrequest Branch: refs/heads/master Date: 2015-03-05T19:21:06+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: https://github.com/plone/plone.subrequest/commit/0f52a877f0be19fa585d65496db35d4088bbc76c Merge pull request #2 from plone/mosaicsprint Fix issue where new cookies from the main request.response are not passed to subrequests Files changed: A CHANGES.rst A README.rst M .gitignore M buildout.cfg M plone/__init__.py M plone/subrequest/__init__.py M plone/subrequest/subresponse.py M plone/subrequest/testing.py M plone/subrequest/tests.py M setup.py D CHANGES.txt D README.txt diff --git a/.gitignore b/.gitignore index e089dba..1545667 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,23 @@ +*.EGG +*.EGG-INFO +*.egg +*.egg-info *.py? -plone.subrequest.egg-info/ +*.tmp* +.*.cfg +.idea +/*.egg-info/ +/bin/ +/build/ +/build/ +/develop-eggs/ +/dist/ +/downloads/ +/eggs/ +/extras/ +/html/ +/include/ +/lib/ +/local/ +/parts/ +/var/ diff --git a/CHANGES.rst b/CHANGES.rst new file mode 100644 index 0000000..69fe80a --- /dev/null +++ b/CHANGES.rst @@ -0,0 +1,122 @@ +Changelog +========= + +1.6.9 (unreleased) +------------------ + +- Workaround for broken test because of missing dependency declaration in + upstream package, see https://github.com/plone/plone.app.blob/issues/19 + for details. + [jensens] + +- Housekeeping and code cleanup (pep8, et al). + [jensens] + +- Fix issue where new cookies from the main request.response are not passed to + subrequests. + [datakurre] + +1.6.8 (2014-03-04) +------------------ +- Handle sub-requests which contain a doubled // in the path. + [gweis] + +1.6.7 (2012-10-22) +------------------ + +- Ensure correct handling of bare virtual hosting urls. + [elro] + +1.6.6 (2012-06-29) +------------------ + +- Log errors that occur handling a subrequest to help debug plone.app.theming + errors including content from a different url + [anthonygerrard] + +1.6.5 (2012-04-15) +------------------ + +- Ensure parent url is a string and not unicode. + [davisagli] + +1.6.4 - 2012-03-22 +------------------ + +- Fix problems with double encoding some unicode charse by not copying too + many ``other`` variables. + [elro] + +1.6.3 - 2012-02-12 +------------------ + +- Copy ``other`` request variables such as ``LANGUAGE`` to subrequest. + [elro] + +1.6.2 - 2011-07-04 +------------------ + +- Handle spaces in default documents. http://dev.plone.org/plone/ticket/12278 + +1.6.1 - 2011-07-04 +------------------ + +- Move tests to package directory to making testing possible when installed + normally. + +1.6 - 2011-06-06 +---------------- + +- Ensure url is a string and not unicode. + [elro] + +1.6b2 - 2011-05-20 +------------------ + +- Set PARENT_REQUEST and add ISubRequest interface to subrequests. + [elro] + +1.6b1 - 2011-02-11 +------------------ + +- Handle IStreamIterator. + [elro] + +- Simplify API so ``response.getBody()`` always works. + [elro] + +1.5 - 2010-11-26 +---------------- + +- Merge cookies from subrequest response into parent response. + [awello] + +1.4 - 2010-11-10 +---------------- + +- First processInput, then traverse (fixes #11254) + [awello] + +1.3 - 2010-08-24 +---------------- + +- Fixed bug with virtual hosting and quoted paths. + [elro] + +1.2 - 2010-08-16 +---------------- + +- Restore zope.component site after subrequest. + [elro] + +1.1 - 2010-08-14 +---------------- + +- Virtual hosting, relative url and error response support. + [elro] + +1.0 - 2010-07-28 +---------------- + +- Initial release. + [elro] diff --git a/CHANGES.txt b/CHANGES.txt deleted file mode 100644 index ee2204c..0000000 --- a/CHANGES.txt +++ /dev/null @@ -1,108 +0,0 @@ -Changelog -========= - -1.6.8 (unreleased) ------------------- - -- Handle sub-requests which contain a doubled // in the path. - [gweis] - -1.6.7 (2012-10-22) ------------------- - -- Ensure correct handling of bare virtual hosting urls. - [elro] - -1.6.6 (2012-06-29) ------------------- - -- Log errors that occur handling a subrequest to help debug plone.app.theming - errors including content from a different url - [anthonygerrard] - -1.6.5 (2012-04-15) ------------------- - -- Ensure parent url is a string and not unicode. - [davisagli] - -1.6.4 - 2012-03-22 ------------------- - -- Fix problems with double encoding some unicode charse by not copying too - many ``other`` variables. - [elro] - -1.6.3 - 2012-02-12 ------------------- - -- Copy ``other`` request variables such as ``LANGUAGE`` to subrequest. - [elro] - -1.6.2 - 2011-07-04 ------------------- - -- Handle spaces in default documents. http://dev.plone.org/plone/ticket/12278 - -1.6.1 - 2011-07-04 ------------------- - -- Move tests to package directory to making testing possible when installed - normally. - -1.6 - 2011-06-06 ----------------- - -- Ensure url is a string and not unicode. - [elro] - -1.6b2 - 2011-05-20 ------------------- - -- Set PARENT_REQUEST and add ISubRequest interface to subrequests. - [elro] - -1.6b1 - 2011-02-11 ------------------- - -- Handle IStreamIterator. - [elro] - -- Simplify API so ``response.getBody()`` always works. - [elro] - -1.5 - 2010-11-26 ----------------- - -- Merge cookies from subrequest response into parent response. - [awello] - -1.4 - 2010-11-10 ----------------- - -- First processInput, then traverse (fixes #11254) - [awello] - -1.3 - 2010-08-24 ----------------- - -- Fixed bug with virtual hosting and quoted paths. - [elro] - -1.2 - 2010-08-16 ----------------- - -- Restore zope.component site after subrequest. - [elro] - -1.1 - 2010-08-14 ----------------- - -- Virtual hosting, relative url and error response support. - [elro] - -1.0 - 2010-07-28 ----------------- - -- Initial release. - [elro] diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..6441138 --- /dev/null +++ b/README.rst @@ -0,0 +1,27 @@ +Overview +======== + +plone.subrequest provides a mechanism for issuing subrequests under Zope2. + +Installation +============ + +Plone 4 +------- + +An entry point is provided so no special installation is required past adding +`plone.subrequest` to your instance's `eggs`. + +Zope 2.12 without Plone +----------------------- + +Load this package's ZCML in the usual manner. + +Zope 2.10 +--------- + +You must install ZPublisherEventsBackport_ to use this package with Zope 2.10 +and load both package's ZCML. The tests require Zope 2.12 / Python 2.6 so will +not run. + +.. _ZPublisherEventsBackport: http://pypi.python.org/pypi/ZPublisherEventsBackport diff --git a/README.txt b/README.txt deleted file mode 100644 index 6441138..0000000 --- a/README.txt +++ /dev/null @@ -1,27 +0,0 @@ -Overview -======== - -plone.subrequest provides a mechanism for issuing subrequests under Zope2. - -Installation -============ - -Plone 4 -------- - -An entry point is provided so no special installation is required past adding -`plone.subrequest` to your instance's `eggs`. - -Zope 2.12 without Plone ------------------------ - -Load this package's ZCML in the usual manner. - -Zope 2.10 ---------- - -You must install ZPublisherEventsBackport_ to use this package with Zope 2.10 -and load both package's ZCML. The tests require Zope 2.12 / Python 2.6 so will -not run. - -.. _ZPublisherEventsBackport: http://pypi.python.org/pypi/ZPublisherEventsBackport diff --git a/buildout.cfg b/buildout.cfg index 6f5e928..a9df8db 100644 --- a/buildout.cfg +++ b/buildout.cfg @@ -1,10 +1,10 @@ [buildout] -develop = . parts = checkdocs test versions = versions -extends = http://dist.plone.org/release/4.0-latest/versions.cfg -extensions = buildout.dumppickedversions +extends = + http://dist.plone.org/release/4.3-latest/versions.cfg +develop = . [checkdocs] recipe = zc.recipe.egg eggs = collective.checkdocs @@ -13,8 +13,10 @@ interpreter = py [test] recipe = zc.recipe.testrunner eggs = - plone.subrequest [test] + plone.subrequest[test] defaults = ['--auto-color', '--auto-progress'] [versions] -unittest2 = 0.5.1 +zc.buildout = +setuptools = +plone.subrequest = >1.6.8 diff --git a/plone/__init__.py b/plone/__init__.py index f48ad10..68c04af 100644 --- a/plone/__init__.py +++ b/plone/__init__.py @@ -1,6 +1,2 @@ -# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages -try: - __import__('pkg_resources').declare_namespace(__name__) -except ImportError: - from pkgutil import extend_path - __path__ = extend_path(__path__, __name__) +# -*- coding: utf-8 -*- +__import__('pkg_resources').declare_namespace(__name__) diff --git a/plone/subrequest/__init__.py b/plone/subrequest/__init__.py index c9d4453..002ad91 100644 --- a/plone/subrequest/__init__.py +++ b/plone/subrequest/__init__.py @@ -1,5 +1,4 @@ -import re - +# -*- coding: utf-8 -*- from AccessControl import getSecurityManager from AccessControl.SecurityManagement import setSecurityManager from Acquisition import aq_base @@ -9,18 +8,20 @@ from ZPublisher.mapply import mapply from cStringIO import StringIO from logging import getLogger +from plone.subrequest.interfaces import ISubRequest +from plone.subrequest.subresponse import SubResponse from posixpath import normpath +from urllib import unquote # Python2.4 does not have urlparse.unquote from urlparse import urlsplit, urljoin -from urllib import unquote # Python2.4 does not have urlparse.unquote -from zope.interface import alsoProvides from zope.globalrequest import getRequest, setRequest +from zope.interface import alsoProvides +import re + try: from zope.site.hooks import getSite, setSite except ImportError: from zope.app.component.hooks import getSite, setSite -from plone.subrequest.subresponse import SubResponse -from plone.subrequest.interfaces import ISubRequest __all__ = ['subrequest', 'SubResponse'] @@ -31,7 +32,7 @@ 'HTTP_IF_MATCH', 'HTTP_IF_NONE_MATCH', 'HTTP_IF_RANGE', - 'HTTP_RANGE', # Not strictly a conditional header, but scrub it anyway + 'HTTP_RANGE', # Not strictly a conditional header, but scrub it anyway ] OTHER_IGNORE = set([ @@ -55,13 +56,15 @@ logger = getLogger("plone.subrequest") + def subrequest(url, root=None, stdout=None): assert url is not None, "You must pass a url" if isinstance(url, unicode): url = url.encode('utf-8') _, _, path, query, _ = urlsplit(url) parent_request = getRequest() - assert parent_request is not None, "Unable to get request, perhaps zope.globalrequest is not configured." + assert parent_request is not None, \ + "Unable to get request, perhaps zope.globalrequest is not configured." parent_site = getSite() security_manager = getSecurityManager() parent_app = parent_request.PARENTS[-1] @@ -71,7 +74,9 @@ def subrequest(url, root=None, stdout=None): if vurl_parts is not None: # Use the virtual host root path_past_root = unquote(vurl_parts[-1]) - root_path = normpath(parent_request['PATH_INFO']).rstrip('/')[:-len(path_past_root) or None] + root_path = normpath( + parent_request['PATH_INFO'] + ).rstrip('/')[:-len(path_past_root) or None] if root is None: path = root_path + path else: @@ -92,9 +97,13 @@ def subrequest(url, root=None, stdout=None): path = normpath(path) request = parent_request.clone() for name, parent_value in parent_request.other.items(): - if name in OTHER_IGNORE or OTHER_IGNORE_RE.match(name) or name.startswith('_'): + if name in OTHER_IGNORE \ + or OTHER_IGNORE_RE.match(name) \ + or name.startswith('_'): continue request.other[name] = parent_value + for key, value in parent_request.response.cookies.items(): + request.cookies[key] = value['value'] request['PARENT_REQUEST'] = parent_request alsoProvides(request, ISubRequest) try: @@ -104,9 +113,9 @@ def subrequest(url, root=None, stdout=None): request['PARENTS'] = [app] response = request.response response.__class__ = SubResponse - response.stderr = None # only used on retry it seems + response.stderr = None # only used on retry it seems if stdout is None: - stdout = StringIO() # It might be possible to optimize this + stdout = StringIO() # It might be possible to optimize this response.stdout = stdout environ = request.environ environ['PATH_INFO'] = path @@ -138,4 +147,3 @@ def subrequest(url, root=None, stdout=None): setRequest(parent_request) setSite(parent_site) setSecurityManager(security_manager) - diff --git a/plone/subrequest/subresponse.py b/plone/subrequest/subresponse.py index 2e89a4f..d8c84a9 100644 --- a/plone/subrequest/subresponse.py +++ b/plone/subrequest/subresponse.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from ZPublisher.HTTPResponse import HTTPResponse from ZPublisher.Iterators import IStreamIterator try: @@ -6,6 +7,7 @@ class BlobStreamIterator: pass + class SubResponse(HTTPResponse): def setBody(self, body, title='', is_error=0, **kw): @@ -14,8 +16,10 @@ def setBody(self, body, title='', is_error=0, **kw): return HTTPResponse.setBody(self, body, title, is_error, **kw) assert not self._wrote if isinstance(body, BlobStreamIterator): - body = body.blob # A BlobFile - if hasattr(body, 'seek') and hasattr(body, 'read') and hasattr(body, 'close'): + body = body.blob # A BlobFile + if hasattr(body, 'seek') \ + and hasattr(body, 'read') and \ + hasattr(body, 'close'): self.stdout = body self._wrote = 1 return diff --git a/plone/subrequest/testing.py b/plone/subrequest/testing.py index 1d2ee64..6a3ba0d 100644 --- a/plone/subrequest/testing.py +++ b/plone/subrequest/testing.py @@ -1,9 +1,12 @@ -import OFS.Folder +# -*- coding: utf-8 -*- from Products.Five.browser import BrowserView from five.localsitemanager import make_site from plone.subrequest import subrequest -from plone.testing import Layer, z2, zodb, zca -from zope.globalrequest import getRequest, setRequest +from plone.testing import Layer +from plone.testing import z2 +from plone.testing import zca +from plone.testing import zodb +from zope.globalrequest import setRequest class CookieView(BrowserView): @@ -20,7 +23,6 @@ def __init__(self, context, request): self.keys = self.request.keys() def __call__(self): - response = self.request.response return str(self.keys) @@ -91,17 +93,23 @@ def __call__(self): def singleton(cls): return cls() + @singleton class PLONE_SUBREQEST_FIXTURE(Layer): defaultBases = (z2.STARTUP,) def setUp(self): # Stack a new DemoStorage on top of the one from z2.STARTUP. - self['zodbDB'] = zodb.stackDemoStorage(self.get('zodbDB'), name='PloneSubRequestFixture') + self['zodbDB'] = zodb.stackDemoStorage( + self.get('zodbDB'), + name='PloneSubRequestFixture' + ) # Create a new global registry zca.pushGlobalRegistry() - self['configurationContext'] = context = zca.stackConfigurationContext(self.get('configurationContext')) + self['configurationContext'] = context = zca.stackConfigurationContext( + self.get('configurationContext') + ) # Load out ZCML from zope.configuration import xmlconfig @@ -111,7 +119,8 @@ def setUp(self): with z2.zopeApp() as app: # Enable virtual hosting z2.installProduct(app, 'Products.SiteAccess') - from Products.SiteAccess.VirtualHostMonster import VirtualHostMonster + from Products.SiteAccess.VirtualHostMonster import \ + VirtualHostMonster vhm = VirtualHostMonster() app._setObject(vhm.getId(), vhm, suppress_events=True) # With suppress_events=False, this is called twice... @@ -149,6 +158,12 @@ def testTearDown(self): setRequest(None) -INTEGRATION_TESTING = PloneSubrequestLifecycle(bases=(PLONE_SUBREQEST_FIXTURE,), name="PloneSubrequest:Integration") -FUNCTIONAL_TESTING = z2.FunctionalTesting(bases=(PLONE_SUBREQEST_FIXTURE,), name="PloneSubrequest:Functional") +INTEGRATION_TESTING = PloneSubrequestLifecycle( + bases=(PLONE_SUBREQEST_FIXTURE,), + name="PloneSubrequest:Integration" +) +FUNCTIONAL_TESTING = z2.FunctionalTesting( + bases=(PLONE_SUBREQEST_FIXTURE,), + name="PloneSubrequest:Functional" +) diff --git a/plone/subrequest/tests.py b/plone/subrequest/tests.py index a7d7c1d..5ee13aa 100644 --- a/plone/subrequest/tests.py +++ b/plone/subrequest/tests.py @@ -1,21 +1,29 @@ +# -*- coding: utf-8 -*- +from plone.subrequest import subrequest +from plone.subrequest.testing import FUNCTIONAL_TESTING +from plone.subrequest.testing import INTEGRATION_TESTING +from plone.testing import z2 +from zope.globalrequest import getRequest +from zope.site.hooks import getSite import manuel.doctest import manuel.testcase import manuel.testing import unittest2 as unittest -from plone.subrequest import subrequest -from plone.subrequest.testing import INTEGRATION_TESTING, FUNCTIONAL_TESTING -from plone.testing import z2 -from zope.globalrequest import getRequest -from zope.site.hooks import getSite def traverse(url): request = getRequest() - traversed = request.traverse(url) + request.traverse(url) request.processInputs() request['PATH_INFO'] = url return request +VH_TPL = ( + "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot" + "/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" +) +NOHOST_VH_TPL = 'http://nohost' + VH_TPL + class FunctionalTests(unittest.TestCase): layer = FUNCTIONAL_TESTING @@ -30,7 +38,7 @@ def test_absolute(self): def test_virtual_hosting(self): parts = ('folder1', 'folder1A/@@url') expect = 'folder1A' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -38,7 +46,7 @@ def test_virtual_hosting(self): def test_virtual_hosting_relative(self): parts = ('folder1', 'folder1A?url=folder1Ai/@@url') expect = 'folder1A/folder1Ai' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -46,7 +54,7 @@ def test_virtual_hosting_relative(self): def test_virtual_hosting_absolute(self): parts = ('folder1', 'folder1A?url=/folder1B/@@url') expect = 'folder1B' - url = "http://nohost/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = NOHOST_VH_TPL % parts expect_url = 'http://example.org/fizz/buzz/fizzbuzz/%s' % expect self.browser.open(url) self.assertEqual(self.browser.contents, expect_url) @@ -57,35 +65,56 @@ class IntegrationTests(unittest.TestCase): def test_absolute(self): response = subrequest('/folder1/@@url') - self.assertEqual(response.body, 'http://nohost/folder1') + self.assertEqual( + response.body, + 'http://nohost/folder1' + ) def test_absolute_query(self): response = subrequest('/folder1/folder1A?url=/folder2/folder2A/@@url') - self.assertEqual(response.body, 'http://nohost/folder2/folder2A') + self.assertEqual( + response.body, + 'http://nohost/folder2/folder2A' + ) def test_relative(self): response = subrequest('/folder1?url=folder1B/@@url') # /folder1 resolves to /folder1/@@test - self.assertEqual(response.body, 'http://nohost/folder1/folder1B') + self.assertEqual( + response.body, + 'http://nohost/folder1/folder1B' + ) def test_root(self): response = subrequest('/') - self.assertEqual(response.body, 'Root: http://nohost') + self.assertEqual( + response.body, + 'Root: http://nohost' + ) def test_virtual_hosting(self): - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A/@@url') + url = VH_TPL % ('folder1', 'folder1A/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A' + ) def test_virtual_hosting_unicode(self): - url = u"/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A/@@url') + url = VH_TPL % ('folder1', 'folder1A/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A' + ) def test_virtual_hosting_relative(self): - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % ('folder1', 'folder1A?url=folder1B/@@url') + url = VH_TPL % ('folder1', 'folder1A?url=folder1B/@@url') response = subrequest(url) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_not_found(self): response = subrequest('/notfound') @@ -93,53 +122,85 @@ def test_not_found(self): def test_virtual_host_root(self): parts = ('folder1', 'folder1A/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = VH_TPL % parts traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_root_with_root(self): parts = ('folder1', 'folder1A/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/%s" % parts + url = VH_TPL % parts traverse(url) app = self.layer['app'] response = subrequest('/folder1Ai/@@url', root=app.folder1.folder1A) - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1A/folder1Ai') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1A/folder1Ai' + ) def test_virtual_host_space(self): parts = ('folder2', 'folder2A/folder2Ai space/@@url') - url = "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/%s" % parts + url = ( + "/VirtualHostBase/http/example.org:80/%s/VirtualHostRoot/%s" % + parts + ) traverse(url) app = self.layer['app'] response = subrequest('/folder2A/@@url', root=app.folder2) - self.assertEqual(response.body, 'http://example.org/folder2A') + self.assertEqual( + response.body, + 'http://example.org/folder2A' + ) def test_virtual_host_root_at_root(self): - url = "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz" + url = ( + "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/" + "_vh_fizz/_vh_buzz/_vh_fizzbuzz" + ) traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_root_at_root_trailing(self): - url = "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/_vh_fizz/_vh_buzz/_vh_fizzbuzz/" + url = ( + "/VirtualHostBase/http/example.org:80/folder1/VirtualHostRoot/" + "_vh_fizz/_vh_buzz/_vh_fizzbuzz/" + ) traverse(url) response = subrequest('/folder1B/@@url') - self.assertEqual(response.body, 'http://example.org/fizz/buzz/fizzbuzz/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/buzz/fizzbuzz/folder1B' + ) def test_virtual_host_with_root_double_slash(self): - url = "/VirtualHostBase/http/example.org:80/VirtualHostRoot/_vh_fizz/folder1/folder2//folder2A" + url = ( + "/VirtualHostBase/http/example.org:80/VirtualHostRoot/" + "_vh_fizz/folder1/folder2//folder2A" + ) traverse(url) root = self.layer['app'].folder1 response = subrequest('/folder1B/@@url', root=root) - self.assertEqual(response.body, 'http://example.org/fizz/folder1/folder1B') + self.assertEqual( + response.body, + 'http://example.org/fizz/folder1/folder1B' + ) def test_subrequest_root(self): app = self.layer['app'] response = subrequest('/folder1Ai/@@url', root=app.folder1.folder1A) - self.assertEqual(response.body, 'http://nohost/folder1/folder1A/folder1Ai') + self.assertEqual( + response.body, + 'http://nohost/folder1/folder1A/folder1Ai' + ) def test_site(self): - app = self.layer['app'] traverse('/folder1') site_url1 = getSite().absolute_url() response = subrequest('/folder2/@@url') @@ -152,6 +213,12 @@ def test_parameter(self): self.assertTrue('foo' in response.body) def test_cookies(self): + request = getRequest() + request.response.setCookie('cookie_name', 'cookie_value') + response = subrequest('/folder1/@@parameter') + self.assertTrue("'cookie_name'" in response.body) + + def test_subrequest_cookies(self): response = subrequest('/folder1/@@test?url=/folder1/cookie') self.assertTrue('cookie_name' in response.cookies) @@ -198,7 +265,11 @@ def test_suite(): suite = unittest.defaultTestLoader.loadTestsFromName(__name__) m = manuel.doctest.Manuel() m += manuel.testcase.MarkerManuel() - doctests = manuel.testing.TestSuite(m, 'usage.txt', globs=dict(subrequest=subrequest, traverse=traverse)) + doctests = manuel.testing.TestSuite( + m, + 'usage.txt', + globs=dict(subrequest=subrequest, traverse=traverse) + ) # Set the layer on the manuel doctests for now for test in doctests: test.layer = INTEGRATION_TESTING diff --git a/setup.py b/setup.py index eee1369..ee51e16 100644 --- a/setup.py +++ b/setup.py @@ -1,15 +1,15 @@ import os.path from setuptools import setup, find_packages -version = '1.6.8.dev0' +version = '1.6.9.dev0' setup( - name = 'plone.subrequest', - version = version, - description = 'Subrequests for Zope2', - long_description=open("README.txt").read() + "\n\n" + + name='plone.subrequest', + version=version, + description='Subrequests for Zope2', + long_description=open("README.rst").read() + "\n\n" + open(os.path.join('plone', 'subrequest', 'usage.txt')).read() + "\n\n" + - open("CHANGES.txt").read(), + open("CHANGES.rst").read(), classifiers=[ "Environment :: Web Environment", "Framework :: Plone", @@ -41,6 +41,9 @@ 'manuel', 'plone.testing [z2]', 'plone.app.blob', + + # see https://github.com/plone/plone.app.blob/issues/19 + 'Products.MimetypesRegistry', ], }, entry_points="""
bloodbare
added a commit
that referenced
this pull request
Mar 25, 2015
Branch: refs/heads/master Date: 2015-03-20T09:46:14+01:00 Author: Ramon Navarro Bosch (bloodbare) <ramon.nb@gmail.com> Commit: plone/plone.theme@0eb42ea test layer is testing layer Files changed: M plone/theme/tests/testBrowserLayerPrecedence.py Repository: plone.theme Branch: refs/heads/master Date: 2015-03-25T19:26:17+01:00 Author: Timo Stollenwerk (tisto) <tisto@plone.org> Commit: plone/plone.theme@275d0f9 Merge branch 'master' into plip13091 Files changed: M CHANGES.txt M setup.py Repository: plone.theme Branch: refs/heads/master Date: 2015-03-25T21:36:21+01:00 Author: Ramon Navarro Bosch (bloodbare) <ramon.nb@gmail.com> Commit: plone/plone.theme@4fd2859 Merge pull request #2 from plone/plip13091 test layer is testing layer Files changed: M plone/theme/tests/testBrowserLayerPrecedence.py
bloodbare
added a commit
that referenced
this pull request
Mar 25, 2015
Branch: refs/heads/master Date: 2015-03-20T09:46:14+01:00 Author: Ramon Navarro Bosch (bloodbare) <ramon.nb@gmail.com> Commit: plone/plone.theme@0eb42ea test layer is testing layer Files changed: M plone/theme/tests/testBrowserLayerPrecedence.py Repository: plone.theme Branch: refs/heads/master Date: 2015-03-25T19:26:17+01:00 Author: Timo Stollenwerk (tisto) <tisto@plone.org> Commit: plone/plone.theme@275d0f9 Merge branch 'master' into plip13091 Files changed: M CHANGES.txt M setup.py Repository: plone.theme Branch: refs/heads/master Date: 2015-03-25T21:36:21+01:00 Author: Ramon Navarro Bosch (bloodbare) <ramon.nb@gmail.com> Commit: plone/plone.theme@4fd2859 Merge pull request #2 from plone/plip13091 test layer is testing layer Files changed: M plone/theme/tests/testBrowserLayerPrecedence.py
jensens
added a commit
that referenced
this pull request
May 20, 2015
Branch: refs/heads/master Date: 2015-05-20T09:41:22+02:00 Author: Andrea Cecchi (cekk) <andrea.cecchi85@gmail.com> Commit: plone/Products.CMFFormController@a3dd466 additional check for entry deletion Files changed: M Products/CMFFormController/BaseControllerPageTemplate.py Repository: Products.CMFFormController Branch: refs/heads/master Date: 2015-05-20T09:41:34+02:00 Author: Andrea Cecchi (cekk) <andrea.cecchi85@gmail.com> Commit: plone/Products.CMFFormController@96e3e4f updated changes Files changed: M CHANGES.txt Repository: Products.CMFFormController Branch: refs/heads/master Date: 2015-05-20T13:23:51+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/Products.CMFFormController@12167fb Merge pull request #2 from plone/submitted_secure_deletion form.submitted secure deletion Files changed: M CHANGES.txt M Products/CMFFormController/BaseControllerPageTemplate.py
jensens
added a commit
that referenced
this pull request
May 20, 2015
Branch: refs/heads/master Date: 2015-05-20T09:41:22+02:00 Author: Andrea Cecchi (cekk) <andrea.cecchi85@gmail.com> Commit: plone/Products.CMFFormController@a3dd466 additional check for entry deletion Files changed: M Products/CMFFormController/BaseControllerPageTemplate.py Repository: Products.CMFFormController Branch: refs/heads/master Date: 2015-05-20T09:41:34+02:00 Author: Andrea Cecchi (cekk) <andrea.cecchi85@gmail.com> Commit: plone/Products.CMFFormController@96e3e4f updated changes Files changed: M CHANGES.txt Repository: Products.CMFFormController Branch: refs/heads/master Date: 2015-05-20T13:23:51+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/Products.CMFFormController@12167fb Merge pull request #2 from plone/submitted_secure_deletion form.submitted secure deletion Files changed: M CHANGES.txt M Products/CMFFormController/BaseControllerPageTemplate.py
jensens
added a commit
that referenced
this pull request
Jul 9, 2015
Branch: refs/heads/master Date: 2015-05-11T21:55:03+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.behavior@2408fbe minor housekeeping Files changed: M plone/behavior/annotation.rst M setup.py Repository: plone.behavior Branch: refs/heads/master Date: 2015-05-11T21:55:34+02:00 Author: Robert Niederreiter (rnixx) <office@squarewave.at> Commit: plone/plone.behavior@23e3233 Add name to behavior directive. This name can be used to lookup behavior registrations by new plone.behaviors.registration.lookup_behavior function. Files changed: M README.rst M docs/CHANGES.rst M plone/behavior/__init__.py M plone/behavior/directives.rst M plone/behavior/metaconfigure.py M plone/behavior/registration.py Repository: plone.behavior Branch: refs/heads/master Date: 2015-05-11T21:55:35+02:00 Author: Robert Niederreiter (rnixx) <office@squarewave.at> Commit: plone/plone.behavior@d357770 lookup_behavior_registration instead of lookup_behavior Files changed: M docs/CHANGES.rst M plone/behavior/directives.rst M plone/behavior/registration.py Repository: plone.behavior Branch: refs/heads/master Date: 2015-05-11T21:55:35+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.behavior@3b796b0 make repr more verbose in order to support external developers with better inofmration about whats going on Files changed: M plone/behavior/directives.rst M plone/behavior/registration.py Repository: plone.behavior Branch: refs/heads/master Date: 2015-05-11T22:04:08+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.behavior@9ef9099 register always identifier and if given additionally with name Files changed: M plone/behavior/metaconfigure.py Repository: plone.behavior Branch: refs/heads/master Date: 2015-05-27T12:35:03+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.behavior@76cc565 documented zcml directives name attribute in readme Files changed: M README.rst Repository: plone.behavior Branch: refs/heads/master Date: 2015-05-27T12:37:46+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.behavior@0f1f08a refine sentence Files changed: M README.rst Repository: plone.behavior Branch: refs/heads/master Date: 2015-05-27T12:59:52+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.behavior@74d60b8 typo, thx @rnixx Files changed: M README.rst Repository: plone.behavior Branch: refs/heads/master Date: 2015-07-09T10:09:53+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.behavior@e1de125 Merge pull request #2 from plone/rnixx_behavior_name_and_lookup PLIP 20239: Behavior name in ZCML directive, registration lookup utility Files changed: M README.rst M docs/CHANGES.rst M plone/behavior/__init__.py M plone/behavior/annotation.rst M plone/behavior/directives.rst M plone/behavior/metaconfigure.py M plone/behavior/registration.py M setup.py
jensens
added a commit
that referenced
this pull request
Jul 9, 2015
Branch: refs/heads/master Date: 2015-05-11T21:55:03+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.behavior@2408fbe minor housekeeping Files changed: M plone/behavior/annotation.rst M setup.py Repository: plone.behavior Branch: refs/heads/master Date: 2015-05-11T21:55:34+02:00 Author: Robert Niederreiter (rnixx) <office@squarewave.at> Commit: plone/plone.behavior@23e3233 Add name to behavior directive. This name can be used to lookup behavior registrations by new plone.behaviors.registration.lookup_behavior function. Files changed: M README.rst M docs/CHANGES.rst M plone/behavior/__init__.py M plone/behavior/directives.rst M plone/behavior/metaconfigure.py M plone/behavior/registration.py Repository: plone.behavior Branch: refs/heads/master Date: 2015-05-11T21:55:35+02:00 Author: Robert Niederreiter (rnixx) <office@squarewave.at> Commit: plone/plone.behavior@d357770 lookup_behavior_registration instead of lookup_behavior Files changed: M docs/CHANGES.rst M plone/behavior/directives.rst M plone/behavior/registration.py Repository: plone.behavior Branch: refs/heads/master Date: 2015-05-11T21:55:35+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.behavior@3b796b0 make repr more verbose in order to support external developers with better inofmration about whats going on Files changed: M plone/behavior/directives.rst M plone/behavior/registration.py Repository: plone.behavior Branch: refs/heads/master Date: 2015-05-11T22:04:08+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.behavior@9ef9099 register always identifier and if given additionally with name Files changed: M plone/behavior/metaconfigure.py Repository: plone.behavior Branch: refs/heads/master Date: 2015-05-27T12:35:03+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.behavior@76cc565 documented zcml directives name attribute in readme Files changed: M README.rst Repository: plone.behavior Branch: refs/heads/master Date: 2015-05-27T12:37:46+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.behavior@0f1f08a refine sentence Files changed: M README.rst Repository: plone.behavior Branch: refs/heads/master Date: 2015-05-27T12:59:52+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.behavior@74d60b8 typo, thx @rnixx Files changed: M README.rst Repository: plone.behavior Branch: refs/heads/master Date: 2015-07-09T10:09:53+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.behavior@e1de125 Merge pull request #2 from plone/rnixx_behavior_name_and_lookup PLIP 20239: Behavior name in ZCML directive, registration lookup utility Files changed: M README.rst M docs/CHANGES.rst M plone/behavior/__init__.py M plone/behavior/annotation.rst M plone/behavior/directives.rst M plone/behavior/metaconfigure.py M plone/behavior/registration.py M setup.py
vangheem
added a commit
that referenced
this pull request
Jul 13, 2015
Branch: refs/heads/master Date: 2015-07-12T21:45:10Z Author: Fulvio Casali (fulv) <fulviocasali@gmail.com> Commit: plone/plone.app.lockingbehavior@728ef6e Remove superfluous 'for'. Files changed: M plone/app/lockingbehavior/configure.zcml Repository: plone.app.lockingbehavior Branch: refs/heads/master Date: 2015-07-13T07:30:51+02:00 Author: Nathan Van Gheem (vangheem) <vangheem@gmail.com> Commit: plone/plone.app.lockingbehavior@8a8295b Merge pull request #2 from plone/fulv-warning-plone-behavior Fixes plone/Products.CMFPlone#669 Files changed: M plone/app/lockingbehavior/configure.zcml
jensens
added a commit
that referenced
this pull request
Jul 27, 2015
Branch: refs/heads/master Date: 2015-07-27T14:40:44+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.folder@87ad14b pep8 cleanup, less id builtin usage, depend on Products.CMFCore and remove fake cmf Files changed: M CHANGES.rst M setup.py M src/plone/__init__.py M src/plone/folder/__init__.py M src/plone/folder/default.py M src/plone/folder/interfaces.py M src/plone/folder/ordered.py M src/plone/folder/tests/__init__.py M src/plone/folder/tests/benchmarks.py M src/plone/folder/tests/layer.py M src/plone/folder/tests/test_dict_interface.py M src/plone/folder/tests/test_integration.py M src/plone/folder/tests/test_ordering_adapters.py M src/plone/folder/tests/test_ordersupport.py M src/plone/folder/tests/test_partialordering.py M src/plone/folder/tests/test_unorderedordering.py M src/plone/folder/tests/test_webdav.py M src/plone/folder/tests/utils.py M src/plone/folder/unordered.py D src/plone/folder/cmf.py Repository: plone.folder Branch: refs/heads/master Date: 2015-07-27T17:11:18+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.folder@2c7d4b4 doc style for README, add note about sources Files changed: M README.rst Repository: plone.folder Branch: refs/heads/master Date: 2015-07-27T17:20:28+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.folder@08cd5df typo Files changed: M CHANGES.rst Repository: plone.folder Branch: refs/heads/master Date: 2015-07-27T19:04:41+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.folder@b6a7aad Merge pull request #2 from plone/jensens-pep8-cleanup pep8 cleanup, less id builtin usage, depend on Products.CMFCore Files changed: M CHANGES.rst M README.rst M setup.py M src/plone/__init__.py M src/plone/folder/__init__.py M src/plone/folder/default.py M src/plone/folder/interfaces.py M src/plone/folder/ordered.py M src/plone/folder/tests/__init__.py M src/plone/folder/tests/benchmarks.py M src/plone/folder/tests/layer.py M src/plone/folder/tests/test_dict_interface.py M src/plone/folder/tests/test_integration.py M src/plone/folder/tests/test_ordering_adapters.py M src/plone/folder/tests/test_ordersupport.py M src/plone/folder/tests/test_partialordering.py M src/plone/folder/tests/test_unorderedordering.py M src/plone/folder/tests/test_webdav.py M src/plone/folder/tests/utils.py M src/plone/folder/unordered.py D src/plone/folder/cmf.py
jensens
added a commit
that referenced
this pull request
Jul 27, 2015
Branch: refs/heads/master Date: 2015-07-27T14:40:44+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.folder@87ad14b pep8 cleanup, less id builtin usage, depend on Products.CMFCore and remove fake cmf Files changed: M CHANGES.rst M setup.py M src/plone/__init__.py M src/plone/folder/__init__.py M src/plone/folder/default.py M src/plone/folder/interfaces.py M src/plone/folder/ordered.py M src/plone/folder/tests/__init__.py M src/plone/folder/tests/benchmarks.py M src/plone/folder/tests/layer.py M src/plone/folder/tests/test_dict_interface.py M src/plone/folder/tests/test_integration.py M src/plone/folder/tests/test_ordering_adapters.py M src/plone/folder/tests/test_ordersupport.py M src/plone/folder/tests/test_partialordering.py M src/plone/folder/tests/test_unorderedordering.py M src/plone/folder/tests/test_webdav.py M src/plone/folder/tests/utils.py M src/plone/folder/unordered.py D src/plone/folder/cmf.py Repository: plone.folder Branch: refs/heads/master Date: 2015-07-27T17:11:18+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.folder@2c7d4b4 doc style for README, add note about sources Files changed: M README.rst Repository: plone.folder Branch: refs/heads/master Date: 2015-07-27T17:20:28+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.folder@08cd5df typo Files changed: M CHANGES.rst Repository: plone.folder Branch: refs/heads/master Date: 2015-07-27T19:04:41+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.folder@b6a7aad Merge pull request #2 from plone/jensens-pep8-cleanup pep8 cleanup, less id builtin usage, depend on Products.CMFCore Files changed: M CHANGES.rst M README.rst M setup.py M src/plone/__init__.py M src/plone/folder/__init__.py M src/plone/folder/default.py M src/plone/folder/interfaces.py M src/plone/folder/ordered.py M src/plone/folder/tests/__init__.py M src/plone/folder/tests/benchmarks.py M src/plone/folder/tests/layer.py M src/plone/folder/tests/test_dict_interface.py M src/plone/folder/tests/test_integration.py M src/plone/folder/tests/test_ordering_adapters.py M src/plone/folder/tests/test_ordersupport.py M src/plone/folder/tests/test_partialordering.py M src/plone/folder/tests/test_unorderedordering.py M src/plone/folder/tests/test_webdav.py M src/plone/folder/tests/utils.py M src/plone/folder/unordered.py D src/plone/folder/cmf.py
datakurre
added a commit
that referenced
this pull request
Aug 16, 2015
Branch: refs/heads/master Date: 2015-08-16T21:09:13+03:00 Author: Asko Soukka (datakurre) <asko.soukka@iki.fi> Commit: plone/plone.themepreview@d2cf284 Upgrade bootstrap.py Files changed: M bootstrap.py Repository: plone.themepreview Branch: refs/heads/master Date: 2015-08-16T21:43:34+03:00 Author: Asko Soukka (datakurre) <asko.soukka@iki.fi> Commit: plone/plone.themepreview@5c932de Add Plone-version specific example buildouts Files changed: A base.cfg A plone-4.x.cfg A plone-5.x.cfg M .travis.yml M buildout.cfg D travis.cfg Repository: plone.themepreview Branch: refs/heads/master Date: 2015-08-16T21:47:10+03:00 Author: Asko Soukka (datakurre) <asko.soukka@iki.fi> Commit: plone/plone.themepreview@398aa1c Merge pull request #2 from plone/datakurre-travis-matrix Update Travis-CI -build Files changed: A base.cfg A plone-4.x.cfg A plone-5.x.cfg M .travis.yml M bootstrap.py M buildout.cfg D travis.cfg
jensens
added a commit
that referenced
this pull request
Sep 28, 2015
Branch: refs/heads/master Date: 2015-09-23T13:30:30-07:00 Author: David Glick (davisagli) <david@glicksoftware.com> Commit: plone/plone.intelligenttext@5751062 add travis configuration Files changed: A .travis.yml A tox.ini Repository: plone.intelligenttext Branch: refs/heads/master Date: 2015-09-23T13:35:06-07:00 Author: David Glick (davisagli) <david@glicksoftware.com> Commit: plone/plone.intelligenttext@285fe68 fix test command Files changed: M .gitignore M tox.ini Repository: plone.intelligenttext Branch: refs/heads/master Date: 2015-09-23T14:13:07-07:00 Author: David Glick (davisagli) <david@glicksoftware.com> Commit: plone/plone.intelligenttext@528ecf2 work toward python 3 compatibility Files changed: M CHANGES.rst M plone/intelligenttext/README.txt M plone/intelligenttext/tests.py M plone/intelligenttext/transforms.py M tox.ini Repository: plone.intelligenttext Branch: refs/heads/master Date: 2015-09-23T14:46:01-07:00 Author: David Glick (davisagli) <david@glicksoftware.com> Commit: plone/plone.intelligenttext@c3fdbc8 fix handling of entities Files changed: M plone/intelligenttext/README.txt M plone/intelligenttext/tests.py M plone/intelligenttext/transforms.py Repository: plone.intelligenttext Branch: refs/heads/master Date: 2015-09-23T14:48:17-07:00 Author: David Glick (davisagli) <david@glicksoftware.com> Commit: plone/plone.intelligenttext@b919ffc don't test python 3.2 (no u'' literals) or 3.5 (not on travis yet) Files changed: M .travis.yml M tox.ini Repository: plone.intelligenttext Branch: refs/heads/master Date: 2015-09-25T12:33:21-07:00 Author: David Glick (davisagli) <david@glicksoftware.com> Commit: plone/plone.intelligenttext@eb003a6 increment version Files changed: M CHANGES.rst M setup.py Repository: plone.intelligenttext Branch: refs/heads/master Date: 2015-09-28T13:48:51+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.intelligenttext@433e43b Merge pull request #2 from plone/travis Python 3 compatibility Files changed: A .travis.yml A tox.ini M .gitignore M CHANGES.rst M plone/intelligenttext/README.txt M plone/intelligenttext/tests.py M plone/intelligenttext/transforms.py M setup.py
jensens
added a commit
that referenced
this pull request
Sep 28, 2015
Branch: refs/heads/master Date: 2015-09-23T13:30:30-07:00 Author: David Glick (davisagli) <david@glicksoftware.com> Commit: plone/plone.intelligenttext@5751062 add travis configuration Files changed: A .travis.yml A tox.ini Repository: plone.intelligenttext Branch: refs/heads/master Date: 2015-09-23T13:35:06-07:00 Author: David Glick (davisagli) <david@glicksoftware.com> Commit: plone/plone.intelligenttext@285fe68 fix test command Files changed: M .gitignore M tox.ini Repository: plone.intelligenttext Branch: refs/heads/master Date: 2015-09-23T14:13:07-07:00 Author: David Glick (davisagli) <david@glicksoftware.com> Commit: plone/plone.intelligenttext@528ecf2 work toward python 3 compatibility Files changed: M CHANGES.rst M plone/intelligenttext/README.txt M plone/intelligenttext/tests.py M plone/intelligenttext/transforms.py M tox.ini Repository: plone.intelligenttext Branch: refs/heads/master Date: 2015-09-23T14:46:01-07:00 Author: David Glick (davisagli) <david@glicksoftware.com> Commit: plone/plone.intelligenttext@c3fdbc8 fix handling of entities Files changed: M plone/intelligenttext/README.txt M plone/intelligenttext/tests.py M plone/intelligenttext/transforms.py Repository: plone.intelligenttext Branch: refs/heads/master Date: 2015-09-23T14:48:17-07:00 Author: David Glick (davisagli) <david@glicksoftware.com> Commit: plone/plone.intelligenttext@b919ffc don't test python 3.2 (no u'' literals) or 3.5 (not on travis yet) Files changed: M .travis.yml M tox.ini Repository: plone.intelligenttext Branch: refs/heads/master Date: 2015-09-25T12:33:21-07:00 Author: David Glick (davisagli) <david@glicksoftware.com> Commit: plone/plone.intelligenttext@eb003a6 increment version Files changed: M CHANGES.rst M setup.py Repository: plone.intelligenttext Branch: refs/heads/master Date: 2015-09-28T13:48:51+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.intelligenttext@433e43b Merge pull request #2 from plone/travis Python 3 compatibility Files changed: A .travis.yml A tox.ini M .gitignore M CHANGES.rst M plone/intelligenttext/README.txt M plone/intelligenttext/tests.py M plone/intelligenttext/transforms.py M setup.py
gforcada
added a commit
that referenced
this pull request
Nov 25, 2015
Branch: refs/heads/master Date: 2015-11-20T13:06:54+01:00 Author: Stephan Klinger (staeff) <stephan.klinger@freitag.de> Commit: plone/plone.schema@f358904 Use plone i18n domain Files changed: M buildout.cfg M plone/schema/__init__.py M plone/schema/browser/configure.zcml M plone/schema/configure.zcml D rebuild_i18n.sh Repository: plone.schema Branch: refs/heads/master Date: 2015-11-20T16:12:14+01:00 Author: Stephan Klinger (staeff) <stephan.klinger@freitag.de> Commit: plone/plone.schema@46d1bff Remove i18n:registerTranslations directive Files changed: M CHANGES.rst M plone/schema/configure.zcml Repository: plone.schema Branch: refs/heads/master Date: 2015-11-20T16:20:20+01:00 Author: Stephan Klinger (staeff) <stephan.klinger@freitag.de> Commit: plone/plone.schema@60467c8 Moved translations to plone.app.locales Files changed: D plone/schema/locales/es/LC_MESSAGES/plone.schema.po D plone/schema/locales/manual.pot D plone/schema/locales/plone.pot D plone/schema/locales/plone.schema.pot Repository: plone.schema Branch: refs/heads/master Date: 2015-11-25T11:24:19+01:00 Author: Gil Forcada Codinachs (gforcada) <gil.forcada@freitag.de> Commit: plone/plone.schema@66acf6f Merge pull request #2 from plone/staeff-merge-translations Remove own i18n domain Files changed: M CHANGES.rst M buildout.cfg M plone/schema/__init__.py M plone/schema/browser/configure.zcml M plone/schema/configure.zcml D plone/schema/locales/es/LC_MESSAGES/plone.schema.po D plone/schema/locales/manual.pot D plone/schema/locales/plone.pot D plone/schema/locales/plone.schema.pot D rebuild_i18n.sh
jensens
added a commit
that referenced
this pull request
Dec 22, 2015
Branch: refs/heads/master Date: 2015-12-15T18:36:19+01:00 Author: Johannes Raggam (thet) <thetetet@gmail.com> Commit: plone/plone.memoize@4905a68 move all DocFile tests to doctests and reformat all nicely Files changed: A docs/index.rst A plone/memoize/compress.rst A plone/memoize/ram.rst A plone/memoize/request.rst A plone/memoize/volatile.rst M plone/memoize/README.rst M plone/memoize/compress.py M plone/memoize/forever.rst M plone/memoize/instance.py M plone/memoize/instance.rst M plone/memoize/ram.py M plone/memoize/request.py M plone/memoize/tests.py M plone/memoize/view.rst M plone/memoize/volatile.py M setup.py Repository: plone.memoize Branch: refs/heads/master Date: 2015-12-15T18:36:42+01:00 Author: Johannes Raggam (thet) <thetetet@gmail.com> Commit: plone/plone.memoize@e9dbcbb warning on instance memoize decorator Files changed: M plone/memoize/instance.rst Repository: plone.memoize Branch: refs/heads/master Date: 2015-12-15T18:38:05+01:00 Author: Johannes Raggam (thet) <thetetet@gmail.com> Commit: plone/plone.memoize@b89d4db headings Files changed: M docs/index.rst M plone/memoize/compress.rst M plone/memoize/forever.rst M plone/memoize/instance.rst M plone/memoize/ram.rst M plone/memoize/request.rst M plone/memoize/view.rst Repository: plone.memoize Branch: refs/heads/master Date: 2015-12-15T19:37:51+01:00 Author: Johannes Raggam (thet) <thetetet@gmail.com> Commit: plone/plone.memoize@e879ead fix tests Files changed: M plone/memoize/compress.rst M plone/memoize/ram.rst M plone/memoize/request.rst M plone/memoize/tests.py M plone/memoize/volatile.rst Repository: plone.memoize Branch: refs/heads/master Date: 2015-12-15T20:01:22+01:00 Author: Johannes Raggam (thet) <thetetet@gmail.com> Commit: plone/plone.memoize@9144cca fix paths Files changed: M docs/index.rst Repository: plone.memoize Branch: refs/heads/master Date: 2015-12-16T00:21:46+01:00 Author: Johannes Raggam (thet) <thetetet@gmail.com> Commit: plone/plone.memoize@9f809c4 headings, toctree depth, code sections Files changed: M docs/index.rst M plone/memoize/README.rst M plone/memoize/compress.rst M plone/memoize/forever.rst M plone/memoize/instance.rst M plone/memoize/ram.rst M plone/memoize/request.rst M plone/memoize/view.rst M plone/memoize/volatile.rst Repository: plone.memoize Branch: refs/heads/master Date: 2015-12-16T00:24:43+01:00 Author: Johannes Raggam (thet) <thetetet@gmail.com> Commit: plone/plone.memoize@b01cc88 changelog Files changed: M CHANGES.rst M plone/memoize/request.py Repository: plone.memoize Branch: refs/heads/master Date: 2015-12-22T15:35:47+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.memoize@cf275b0 Merge pull request #2 from plone/thet-restructure-docs Restructure docs Files changed: A docs/index.rst A plone/memoize/compress.rst A plone/memoize/ram.rst A plone/memoize/request.rst A plone/memoize/volatile.rst M CHANGES.rst M plone/memoize/README.rst M plone/memoize/compress.py M plone/memoize/forever.rst M plone/memoize/instance.py M plone/memoize/instance.rst M plone/memoize/ram.py M plone/memoize/request.py M plone/memoize/tests.py M plone/memoize/view.rst M plone/memoize/volatile.py M setup.py
jensens
added a commit
that referenced
this pull request
Dec 22, 2015
Branch: refs/heads/master Date: 2015-12-15T18:36:19+01:00 Author: Johannes Raggam (thet) <thetetet@gmail.com> Commit: plone/plone.memoize@4905a68 move all DocFile tests to doctests and reformat all nicely Files changed: A docs/index.rst A plone/memoize/compress.rst A plone/memoize/ram.rst A plone/memoize/request.rst A plone/memoize/volatile.rst M plone/memoize/README.rst M plone/memoize/compress.py M plone/memoize/forever.rst M plone/memoize/instance.py M plone/memoize/instance.rst M plone/memoize/ram.py M plone/memoize/request.py M plone/memoize/tests.py M plone/memoize/view.rst M plone/memoize/volatile.py M setup.py Repository: plone.memoize Branch: refs/heads/master Date: 2015-12-15T18:36:42+01:00 Author: Johannes Raggam (thet) <thetetet@gmail.com> Commit: plone/plone.memoize@e9dbcbb warning on instance memoize decorator Files changed: M plone/memoize/instance.rst Repository: plone.memoize Branch: refs/heads/master Date: 2015-12-15T18:38:05+01:00 Author: Johannes Raggam (thet) <thetetet@gmail.com> Commit: plone/plone.memoize@b89d4db headings Files changed: M docs/index.rst M plone/memoize/compress.rst M plone/memoize/forever.rst M plone/memoize/instance.rst M plone/memoize/ram.rst M plone/memoize/request.rst M plone/memoize/view.rst Repository: plone.memoize Branch: refs/heads/master Date: 2015-12-15T19:37:51+01:00 Author: Johannes Raggam (thet) <thetetet@gmail.com> Commit: plone/plone.memoize@e879ead fix tests Files changed: M plone/memoize/compress.rst M plone/memoize/ram.rst M plone/memoize/request.rst M plone/memoize/tests.py M plone/memoize/volatile.rst Repository: plone.memoize Branch: refs/heads/master Date: 2015-12-15T20:01:22+01:00 Author: Johannes Raggam (thet) <thetetet@gmail.com> Commit: plone/plone.memoize@9144cca fix paths Files changed: M docs/index.rst Repository: plone.memoize Branch: refs/heads/master Date: 2015-12-16T00:21:46+01:00 Author: Johannes Raggam (thet) <thetetet@gmail.com> Commit: plone/plone.memoize@9f809c4 headings, toctree depth, code sections Files changed: M docs/index.rst M plone/memoize/README.rst M plone/memoize/compress.rst M plone/memoize/forever.rst M plone/memoize/instance.rst M plone/memoize/ram.rst M plone/memoize/request.rst M plone/memoize/view.rst M plone/memoize/volatile.rst Repository: plone.memoize Branch: refs/heads/master Date: 2015-12-16T00:24:43+01:00 Author: Johannes Raggam (thet) <thetetet@gmail.com> Commit: plone/plone.memoize@b01cc88 changelog Files changed: M CHANGES.rst M plone/memoize/request.py Repository: plone.memoize Branch: refs/heads/master Date: 2015-12-22T15:35:47+01:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/plone.memoize@cf275b0 Merge pull request #2 from plone/thet-restructure-docs Restructure docs Files changed: A docs/index.rst A plone/memoize/compress.rst A plone/memoize/ram.rst A plone/memoize/request.rst A plone/memoize/volatile.rst M CHANGES.rst M plone/memoize/README.rst M plone/memoize/compress.py M plone/memoize/forever.rst M plone/memoize/instance.py M plone/memoize/instance.rst M plone/memoize/ram.py M plone/memoize/request.py M plone/memoize/tests.py M plone/memoize/view.rst M plone/memoize/volatile.py M setup.py
mister-roboto
pushed a commit
that referenced
this pull request
Jan 29, 2016
Branch: refs/heads/master Date: 2016-01-28T22:29:35+01:00 Author: Stephan Klinger (staeff) <stephan.klinger@freitag.de> Commit: plone/plone.caching@36af1e5 Use plone i18n domain Files changed: M plone/caching/configure.zcml M plone/caching/interfaces.py Repository: plone.caching Branch: refs/heads/master Date: 2016-01-29T10:14:41+01:00 Author: Vincent Fretin (vincentfretin) <vincent.fretin@gmail.com> Commit: plone/plone.caching@fb4ba03 Merge pull request #2 from plone/use-plone-i18n-domain Use plone i18n domain Files changed: M plone/caching/configure.zcml M plone/caching/interfaces.py
mister-roboto
pushed a commit
that referenced
this pull request
Jan 29, 2016
Branch: refs/heads/master Date: 2016-01-28T22:29:35+01:00 Author: Stephan Klinger (staeff) <stephan.klinger@freitag.de> Commit: plone/plone.caching@36af1e5 Use plone i18n domain Files changed: M plone/caching/configure.zcml M plone/caching/interfaces.py Repository: plone.caching Branch: refs/heads/master Date: 2016-01-29T10:14:41+01:00 Author: Vincent Fretin (vincentfretin) <vincent.fretin@gmail.com> Commit: plone/plone.caching@fb4ba03 Merge pull request #2 from plone/use-plone-i18n-domain Use plone i18n domain Files changed: M plone/caching/configure.zcml M plone/caching/interfaces.py
mister-roboto
pushed a commit
that referenced
this pull request
May 20, 2016
Branch: refs/heads/master Date: 2016-05-20T12:24:48+02:00 Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com> Commit: plone/Products.statusmessages@b142fa6 Quotes More silly changes to test mr.roboto Files changed: M setup.py Repository: Products.statusmessages Branch: refs/heads/master Date: 2016-05-20T12:25:35+02:00 Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com> Commit: plone/Products.statusmessages@9d9cf25 Merge pull request #2 from plone/gforcada-patch-1 Quotes Files changed: M setup.py
mister-roboto
pushed a commit
that referenced
this pull request
May 20, 2016
Branch: refs/heads/master Date: 2016-05-20T12:24:48+02:00 Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com> Commit: plone/Products.statusmessages@b142fa6 Quotes More silly changes to test mr.roboto Files changed: M setup.py Repository: Products.statusmessages Branch: refs/heads/master Date: 2016-05-20T12:25:35+02:00 Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com> Commit: plone/Products.statusmessages@9d9cf25 Merge pull request #2 from plone/gforcada-patch-1 Quotes Files changed: M setup.py
mister-roboto
pushed a commit
that referenced
this pull request
May 20, 2016
Branch: refs/heads/master Date: 2016-05-20T12:24:48+02:00 Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com> Commit: plone/Products.statusmessages@b142fa6 Quotes More silly changes to test mr.roboto Files changed: M setup.py Repository: Products.statusmessages Branch: refs/heads/master Date: 2016-05-20T12:25:35+02:00 Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com> Commit: plone/Products.statusmessages@9d9cf25 Merge pull request #2 from plone/gforcada-patch-1 Quotes Files changed: M setup.py
mister-roboto
pushed a commit
that referenced
this pull request
Jul 6, 2016
Branch: refs/heads/master Date: 2016-07-05T23:20:30+02:00 Author: Gil Forcada (gforcada) <gforcada@gnome.org> Commit: plone/Products.validation@38674e4 Use zope.interface decorator This not only makes code more pleasent to read, but also makes the code python 3 compatible (while maintaining python 2 compatibility). Files changed: M CHANGES.txt M Products/validation/chain.py M Products/validation/service.py M Products/validation/validators/EmptyValidator.py M Products/validation/validators/ExpressionValidator.py M Products/validation/validators/IdValidator.py M Products/validation/validators/RangeValidator.py M Products/validation/validators/RegexValidator.py M Products/validation/validators/SupplValidators.py Repository: Products.validation Branch: refs/heads/master Date: 2016-07-06T09:22:18+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/Products.validation@ba892ec Merge pull request #2 from plone/gforcada-use-zope-decorators Use zope.interface decorator Files changed: M CHANGES.txt M Products/validation/chain.py M Products/validation/service.py M Products/validation/validators/EmptyValidator.py M Products/validation/validators/ExpressionValidator.py M Products/validation/validators/IdValidator.py M Products/validation/validators/RangeValidator.py M Products/validation/validators/RegexValidator.py M Products/validation/validators/SupplValidators.py
mister-roboto
pushed a commit
that referenced
this pull request
Jul 6, 2016
Branch: refs/heads/master Date: 2016-07-05T23:20:30+02:00 Author: Gil Forcada (gforcada) <gforcada@gnome.org> Commit: plone/Products.validation@38674e4 Use zope.interface decorator This not only makes code more pleasent to read, but also makes the code python 3 compatible (while maintaining python 2 compatibility). Files changed: M CHANGES.txt M Products/validation/chain.py M Products/validation/service.py M Products/validation/validators/EmptyValidator.py M Products/validation/validators/ExpressionValidator.py M Products/validation/validators/IdValidator.py M Products/validation/validators/RangeValidator.py M Products/validation/validators/RegexValidator.py M Products/validation/validators/SupplValidators.py Repository: Products.validation Branch: refs/heads/master Date: 2016-07-06T09:22:18+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/Products.validation@ba892ec Merge pull request #2 from plone/gforcada-use-zope-decorators Use zope.interface decorator Files changed: M CHANGES.txt M Products/validation/chain.py M Products/validation/service.py M Products/validation/validators/EmptyValidator.py M Products/validation/validators/ExpressionValidator.py M Products/validation/validators/IdValidator.py M Products/validation/validators/RangeValidator.py M Products/validation/validators/RegexValidator.py M Products/validation/validators/SupplValidators.py
mister-roboto
pushed a commit
that referenced
this pull request
Jul 6, 2016
Branch: refs/heads/master Date: 2016-07-05T23:20:30+02:00 Author: Gil Forcada (gforcada) <gforcada@gnome.org> Commit: plone/Products.validation@38674e4 Use zope.interface decorator This not only makes code more pleasent to read, but also makes the code python 3 compatible (while maintaining python 2 compatibility). Files changed: M CHANGES.txt M Products/validation/chain.py M Products/validation/service.py M Products/validation/validators/EmptyValidator.py M Products/validation/validators/ExpressionValidator.py M Products/validation/validators/IdValidator.py M Products/validation/validators/RangeValidator.py M Products/validation/validators/RegexValidator.py M Products/validation/validators/SupplValidators.py Repository: Products.validation Branch: refs/heads/master Date: 2016-07-06T09:22:18+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/Products.validation@ba892ec Merge pull request #2 from plone/gforcada-use-zope-decorators Use zope.interface decorator Files changed: M CHANGES.txt M Products/validation/chain.py M Products/validation/service.py M Products/validation/validators/EmptyValidator.py M Products/validation/validators/ExpressionValidator.py M Products/validation/validators/IdValidator.py M Products/validation/validators/RangeValidator.py M Products/validation/validators/RegexValidator.py M Products/validation/validators/SupplValidators.py
mister-roboto
pushed a commit
that referenced
this pull request
Jul 6, 2016
Branch: refs/heads/master Date: 2016-07-05T23:17:14+02:00 Author: Gil Forcada (gforcada) <gforcada@gnome.org> Commit: plone/plone.portlets@728a84a Use zope.interface decorator This not only makes code more pleasent to read, but also makes the code python 3 compatible (while maintaining python 2 compatibility). Files changed: M CHANGES.rst M plone/portlets/assignable.py M plone/portlets/manager.py M plone/portlets/registration.py M plone/portlets/retriever.py M plone/portlets/settings.py M plone/portlets/storage.py Repository: plone.portlets Branch: refs/heads/master Date: 2016-07-07T00:57:32+02:00 Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com> Commit: plone/plone.portlets@f5aeadd Merge pull request #2 from plone/gforcada-use-zope-decorators Use zope.interface decorator Files changed: M CHANGES.rst M plone/portlets/assignable.py M plone/portlets/manager.py M plone/portlets/registration.py M plone/portlets/retriever.py M plone/portlets/settings.py M plone/portlets/storage.py
mister-roboto
pushed a commit
that referenced
this pull request
Jul 6, 2016
Branch: refs/heads/master Date: 2016-07-05T23:17:14+02:00 Author: Gil Forcada (gforcada) <gforcada@gnome.org> Commit: plone/plone.portlets@728a84a Use zope.interface decorator This not only makes code more pleasent to read, but also makes the code python 3 compatible (while maintaining python 2 compatibility). Files changed: M CHANGES.rst M plone/portlets/assignable.py M plone/portlets/manager.py M plone/portlets/registration.py M plone/portlets/retriever.py M plone/portlets/settings.py M plone/portlets/storage.py Repository: plone.portlets Branch: refs/heads/master Date: 2016-07-07T00:57:32+02:00 Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com> Commit: plone/plone.portlets@f5aeadd Merge pull request #2 from plone/gforcada-use-zope-decorators Use zope.interface decorator Files changed: M CHANGES.rst M plone/portlets/assignable.py M plone/portlets/manager.py M plone/portlets/registration.py M plone/portlets/retriever.py M plone/portlets/settings.py M plone/portlets/storage.py
mister-roboto
pushed a commit
that referenced
this pull request
Jul 6, 2016
Branch: refs/heads/master Date: 2016-07-05T23:17:14+02:00 Author: Gil Forcada (gforcada) <gforcada@gnome.org> Commit: plone/plone.portlets@728a84a Use zope.interface decorator This not only makes code more pleasent to read, but also makes the code python 3 compatible (while maintaining python 2 compatibility). Files changed: M CHANGES.rst M plone/portlets/assignable.py M plone/portlets/manager.py M plone/portlets/registration.py M plone/portlets/retriever.py M plone/portlets/settings.py M plone/portlets/storage.py Repository: plone.portlets Branch: refs/heads/master Date: 2016-07-07T00:57:32+02:00 Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com> Commit: plone/plone.portlets@f5aeadd Merge pull request #2 from plone/gforcada-use-zope-decorators Use zope.interface decorator Files changed: M CHANGES.rst M plone/portlets/assignable.py M plone/portlets/manager.py M plone/portlets/registration.py M plone/portlets/retriever.py M plone/portlets/settings.py M plone/portlets/storage.py
mister-roboto
pushed a commit
that referenced
this pull request
Jul 6, 2016
Branch: refs/heads/master Date: 2016-07-05T23:17:42+02:00 Author: Gil Forcada (gforcada) <gforcada@gnome.org> Commit: plone/plone.rfc822@4704a17 Use zope.interface decorator This not only makes code more pleasent to read, but also makes the code python 3 compatible (while maintaining python 2 compatibility). Files changed: M CHANGES.rst M plone/rfc822/defaultfields.py M plone/rfc822/supermodel.py Repository: plone.rfc822 Branch: refs/heads/master Date: 2016-07-07T01:00:17+02:00 Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com> Commit: plone/plone.rfc822@780179d Merge pull request #2 from plone/gforcada-use-zope-decorators Use zope.interface decorator Files changed: M CHANGES.rst M plone/rfc822/defaultfields.py M plone/rfc822/supermodel.py
mister-roboto
pushed a commit
that referenced
this pull request
Jul 6, 2016
Branch: refs/heads/master Date: 2016-07-05T23:17:42+02:00 Author: Gil Forcada (gforcada) <gforcada@gnome.org> Commit: plone/plone.rfc822@4704a17 Use zope.interface decorator This not only makes code more pleasent to read, but also makes the code python 3 compatible (while maintaining python 2 compatibility). Files changed: M CHANGES.rst M plone/rfc822/defaultfields.py M plone/rfc822/supermodel.py Repository: plone.rfc822 Branch: refs/heads/master Date: 2016-07-07T01:00:17+02:00 Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com> Commit: plone/plone.rfc822@780179d Merge pull request #2 from plone/gforcada-use-zope-decorators Use zope.interface decorator Files changed: M CHANGES.rst M plone/rfc822/defaultfields.py M plone/rfc822/supermodel.py
mister-roboto
pushed a commit
that referenced
this pull request
Jul 6, 2016
Branch: refs/heads/master Date: 2016-07-05T23:17:42+02:00 Author: Gil Forcada (gforcada) <gforcada@gnome.org> Commit: plone/plone.rfc822@4704a17 Use zope.interface decorator This not only makes code more pleasent to read, but also makes the code python 3 compatible (while maintaining python 2 compatibility). Files changed: M CHANGES.rst M plone/rfc822/defaultfields.py M plone/rfc822/supermodel.py Repository: plone.rfc822 Branch: refs/heads/master Date: 2016-07-07T01:00:17+02:00 Author: Gil Forcada Codinachs (gforcada) <gil.gnome@gmail.com> Commit: plone/plone.rfc822@780179d Merge pull request #2 from plone/gforcada-use-zope-decorators Use zope.interface decorator Files changed: M CHANGES.rst M plone/rfc822/defaultfields.py M plone/rfc822/supermodel.py
mister-roboto
pushed a commit
that referenced
this pull request
Jul 30, 2016
Branch: refs/heads/master Date: 2016-07-08T23:45:37+02:00 Author: Gil Forcada (gforcada) <gforcada@gnome.org> Commit: plone/archetypes.schemaextender@46a431c Use zope.interface decorator This not only makes code more pleasent to read, but also makes the code python 3 compatible (while maintaining python 2 compatibility). Files changed: M CHANGES.txt M archetypes/schemaextender/field.py M archetypes/schemaextender/tests/base.py M archetypes/schemaextender/tests/mocks.py M archetypes/schemaextender/tests/testAccessor.py Repository: archetypes.schemaextender Branch: refs/heads/master Date: 2016-07-31T00:54:58+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/archetypes.schemaextender@b9dddf9 Merge pull request #2 from plone/gforcada-use-zope-decorators Use zope.interface decorator Files changed: M CHANGES.txt M archetypes/schemaextender/field.py M archetypes/schemaextender/tests/base.py M archetypes/schemaextender/tests/mocks.py M archetypes/schemaextender/tests/testAccessor.py
mister-roboto
pushed a commit
that referenced
this pull request
Jul 30, 2016
Branch: refs/heads/master Date: 2016-07-08T23:45:37+02:00 Author: Gil Forcada (gforcada) <gforcada@gnome.org> Commit: plone/archetypes.schemaextender@46a431c Use zope.interface decorator This not only makes code more pleasent to read, but also makes the code python 3 compatible (while maintaining python 2 compatibility). Files changed: M CHANGES.txt M archetypes/schemaextender/field.py M archetypes/schemaextender/tests/base.py M archetypes/schemaextender/tests/mocks.py M archetypes/schemaextender/tests/testAccessor.py Repository: archetypes.schemaextender Branch: refs/heads/master Date: 2016-07-31T00:54:58+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/archetypes.schemaextender@b9dddf9 Merge pull request #2 from plone/gforcada-use-zope-decorators Use zope.interface decorator Files changed: M CHANGES.txt M archetypes/schemaextender/field.py M archetypes/schemaextender/tests/base.py M archetypes/schemaextender/tests/mocks.py M archetypes/schemaextender/tests/testAccessor.py
mister-roboto
pushed a commit
that referenced
this pull request
Jul 30, 2016
Branch: refs/heads/master Date: 2016-07-08T23:45:37+02:00 Author: Gil Forcada (gforcada) <gforcada@gnome.org> Commit: plone/archetypes.schemaextender@46a431c Use zope.interface decorator This not only makes code more pleasent to read, but also makes the code python 3 compatible (while maintaining python 2 compatibility). Files changed: M CHANGES.txt M archetypes/schemaextender/field.py M archetypes/schemaextender/tests/base.py M archetypes/schemaextender/tests/mocks.py M archetypes/schemaextender/tests/testAccessor.py Repository: archetypes.schemaextender Branch: refs/heads/master Date: 2016-07-31T00:54:58+02:00 Author: Jens W. Klein (jensens) <jk@kleinundpartner.at> Commit: plone/archetypes.schemaextender@b9dddf9 Merge pull request #2 from plone/gforcada-use-zope-decorators Use zope.interface decorator Files changed: M CHANGES.txt M archetypes/schemaextender/field.py M archetypes/schemaextender/tests/base.py M archetypes/schemaextender/tests/mocks.py M archetypes/schemaextender/tests/testAccessor.py
mister-roboto
pushed a commit
that referenced
this pull request
Aug 17, 2016
Branch: refs/heads/master Date: 2016-08-10T14:19:38+02:00 Author: Alessandro Pisa (ale-rt) <alessandro.pisa@gmail.com> Commit: plone/five.intid@513ca3c Set the key to None when a NotYet error is raised Files changed: M CHANGES.rst M five/intid/intid.py Repository: five.intid Branch: refs/heads/master Date: 2016-08-16T23:33:28-03:00 Author: Franco Pellegrini (frapell) <frapell@gmail.com> Commit: plone/five.intid@c701eda Merge pull request #2 from plone/fix-not-yet Set the key to None when a NotYet error is raised Files changed: M CHANGES.rst M five/intid/intid.py
mister-roboto
pushed a commit
that referenced
this pull request
Aug 17, 2016
Branch: refs/heads/master Date: 2016-08-10T14:19:38+02:00 Author: Alessandro Pisa (ale-rt) <alessandro.pisa@gmail.com> Commit: plone/five.intid@513ca3c Set the key to None when a NotYet error is raised Files changed: M CHANGES.rst M five/intid/intid.py Repository: five.intid Branch: refs/heads/master Date: 2016-08-16T23:33:28-03:00 Author: Franco Pellegrini (frapell) <frapell@gmail.com> Commit: plone/five.intid@c701eda Merge pull request #2 from plone/fix-not-yet Set the key to None when a NotYet error is raised Files changed: M CHANGES.rst M five/intid/intid.py
mister-roboto
pushed a commit
that referenced
this pull request
Apr 16, 2020
Branch: refs/heads/master Date: 2020-04-04T21:05:21+02:00 Author: Maurits van Rees (mauritsvanrees) <maurits@vanrees.org> Commit: plone/plone.synchronize@3309ce4 Drop Py 2.6 support, support 2.7, 3.5-3.8, PyPy2/3. Add tox. Removed the test buildout.cfg. Instead just run 'python setup.py test'. Alternatively, we could pip install py.test. Files changed: A .gitignore A news/2.feature A tox.ini M .travis.yml M setup.py D buildout.cfg Repository: plone.synchronize Branch: refs/heads/master Date: 2020-04-16T23:56:17+02:00 Author: Maurits van Rees (mauritsvanrees) <m.van.rees@zestsoftware.nl> Commit: plone/plone.synchronize@3394190 Merge pull request #2 from plone/maurits/check-python-versions Drop Py 2.6 support, support 2.7, 3.5-3.8, PyPy2/3. Add tox. Files changed: A .gitignore A news/2.feature A tox.ini M .travis.yml M setup.py D buildout.cfg
mister-roboto
pushed a commit
that referenced
this pull request
Apr 16, 2020
Branch: refs/heads/master Date: 2020-04-04T21:05:21+02:00 Author: Maurits van Rees (mauritsvanrees) <maurits@vanrees.org> Commit: plone/plone.synchronize@3309ce4 Drop Py 2.6 support, support 2.7, 3.5-3.8, PyPy2/3. Add tox. Removed the test buildout.cfg. Instead just run 'python setup.py test'. Alternatively, we could pip install py.test. Files changed: A .gitignore A news/2.feature A tox.ini M .travis.yml M setup.py D buildout.cfg Repository: plone.synchronize Branch: refs/heads/master Date: 2020-04-16T23:56:17+02:00 Author: Maurits van Rees (mauritsvanrees) <m.van.rees@zestsoftware.nl> Commit: plone/plone.synchronize@3394190 Merge pull request #2 from plone/maurits/check-python-versions Drop Py 2.6 support, support 2.7, 3.5-3.8, PyPy2/3. Add tox. Files changed: A .gitignore A news/2.feature A tox.ini M .travis.yml M setup.py D buildout.cfg
mister-roboto
pushed a commit
that referenced
this pull request
Apr 16, 2020
Branch: refs/heads/master Date: 2020-04-04T21:05:21+02:00 Author: Maurits van Rees (mauritsvanrees) <maurits@vanrees.org> Commit: plone/plone.synchronize@3309ce4 Drop Py 2.6 support, support 2.7, 3.5-3.8, PyPy2/3. Add tox. Removed the test buildout.cfg. Instead just run 'python setup.py test'. Alternatively, we could pip install py.test. Files changed: A .gitignore A news/2.feature A tox.ini M .travis.yml M setup.py D buildout.cfg Repository: plone.synchronize Branch: refs/heads/master Date: 2020-04-16T23:56:17+02:00 Author: Maurits van Rees (mauritsvanrees) <m.van.rees@zestsoftware.nl> Commit: plone/plone.synchronize@3394190 Merge pull request #2 from plone/maurits/check-python-versions Drop Py 2.6 support, support 2.7, 3.5-3.8, PyPy2/3. Add tox. Files changed: A .gitignore A news/2.feature A tox.ini M .travis.yml M setup.py D buildout.cfg
mister-roboto
pushed a commit
that referenced
this pull request
Apr 2, 2022
Branch: refs/heads/6-dev Date: 2022-04-01T08:39:53+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@1dbbd8d Integrate plone.api documentation in /backend Files changed: A submodules/plone.api M .gitignore M .gitmodules M Makefile M docs/backend/index.md M docs/conf.py M docs/contributing/index.md D docs/backend/plone-api.md Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-01T08:41:06+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@6b39cf8 Fix error on subsequent calls of 'make docs/restapi' (failing creation of symlink) Files changed: M Makefile Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-01T09:12:42+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@408e81a Update submodules/plone.api tip Files changed: M submodules/plone.api Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-01T09:30:13+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@0dcaa87 Add missing installation of plone.api[test] in 'make netlify' Files changed: M Makefile Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-01T09:47:56+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@579d754 Fix typo in Makefile 'make netlify' Files changed: M Makefile Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-01T10:09:28+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@fc9bc20 Kick preview deploy after failing 'make storybook' Files changed: M Makefile Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-01T11:09:24+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@d851c37 Hide Github admonitions Files changed: M docs/_static/custom.css Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-01T11:45:21+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@595c9c7 Typo that funnily enough had no consequence.: '.md' -> '.rst' Files changed: M docs/backend/index.md Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-01T11:46:23+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@61ff08a Makefile: Remove quotation marks. Fix description of target 'deps' Files changed: M Makefile Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-01T11:47:53+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@4c29ef8 Update submodules/plone.api tip Files changed: M submodules/plone.api Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-01T12:42:13+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@518437a Remove Sphinx extentsions from plone.api that are not used wether here in plone.documentatin nor in plone.api. Files changed: M docs/conf.py Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-01T12:50:34+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@c9e5d5c Switch Netlify Python to 3.9 Files changed: M netlify.toml Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-01T13:01:42+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@27a8a46 Netlify with venv Files changed: M Makefile Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-01T13:03:44+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@ed9cdcf Revert "Switch Netlify Python to 3.9" This reverts commit c9e5d5c3d1c50b68af5a913405066adc96713497. Files changed: M netlify.toml Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-01T13:03:48+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@c2bbfd6 Revert "Netlify with venv" This reverts commit 27a8a468995d51593cd4ab130481359989c15443. Files changed: M Makefile Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-01T15:31:36+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@e365a46 Catching the Netlify ContextualVersionConflict problem Files changed: A requirements-netlify.txt M Makefile Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-01T15:37:20+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@4821512 Catching the Netlify ContextualVersionConflict problem #2 Files changed: M requirements-netlify.txt Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-01T15:49:44+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@0c43346 Catching the Netlify ContextualVersionConflict problem plone-autoform 2.x is Plone 6 only Files changed: M requirements-netlify.txt Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-01T17:37:25+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@b2810a3 clean up netlify python requirements Files changed: M requirements-netlify.txt Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-01T17:37:48+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@31f6da0 Add search option for plone.api Files changed: M docs/_templates/search.html Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-01T17:45:34+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@4bb96e0 Fix search breadcrumbs for plone.api. Files changed: M docs/_static/searchtools.js Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-01T17:46:39+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@eda5123 Theming api and target highlighting Files changed: M docs/_static/custom.css Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-02T10:20:59+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@233cf6b Add plone.api to contributors guide Files changed: M docs/contributing/index.md Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-02T10:21:28+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@f605042 Reorder submodule deps in Makefile Files changed: M Makefile Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-02T10:21:40+02:00 Author: ksuess (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@aea8d52 Update submodule tips Files changed: M submodules/plone.api M submodules/volto Repository: documentation Branch: refs/heads/6-dev Date: 2022-04-02T11:09:58+02:00 Author: Katja Süss (ksuess) <k.suess@rohberg.ch> Commit: plone/documentation@98180d5 Merge pull request #1215 from plone/integration-of-plone.api Integration of plone.api documentation in Plone 6 documentation /backend Files changed: A requirements-netlify.txt A submodules/plone.api M .gitignore M .gitmodules M Makefile M docs/_static/custom.css M docs/_static/searchtools.js M docs/_templates/search.html M docs/backend/index.md M docs/conf.py M docs/contributing/index.md M submodules/volto D docs/backend/plone-api.md
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
No description provided.