Skip to content

Commit

Permalink
Merge pull request #2 from zopefoundation/resurrection-python3
Browse files Browse the repository at this point in the history
Resurrection python3
  • Loading branch information
janwijbrand committed Jan 10, 2018
2 parents 0cff002 + 2c0c121 commit 523e013
Show file tree
Hide file tree
Showing 17 changed files with 143 additions and 84 deletions.
9 changes: 6 additions & 3 deletions .gitignore
@@ -1,8 +1,11 @@
*.pyc
__pycache__
src/*.egg-info

.coverage
.installed.cfg
.mr.developer.cfg
.tox
*.pyc
bin
dev
develop-eggs
parts
src/*.egg-info
16 changes: 12 additions & 4 deletions .travis.yml
@@ -1,11 +1,19 @@
language: python
python:
- 2.6
- 2.7
- 3.4
- 3.5
- 3.6
- pypy
- pypy3
install:
- python bootstrap.py
- bin/buildout
- pip install -U pip setuptools
- pip install -U zope.testrunner coverage coveralls
- pip install -U -e .[test]
script:
- bin/test -v1
- coverage run -m zope.testrunner --test-path=src
after_success:
- coveralls
notifications:
email: false
cache: pip
4 changes: 1 addition & 3 deletions CHANGES.txt
Expand Up @@ -4,15 +4,13 @@ Changelog
1.6.2 (unreleased)
------------------

- Nothing changed yet.

- Python 3 compatibility.

1.6.1 (2016-02-15)
------------------

- Update tests.


1.6 (2012-05-10)
----------------

Expand Down
3 changes: 2 additions & 1 deletion buildout.cfg
@@ -1,7 +1,8 @@
[buildout]
extends =
https://raw.githubusercontent.com/zopefoundation/groktoolkit/resurrection-python3/grok.cfg
develop = .
parts = interpreter test
extends = https://raw.github.com/zopefoundation/groktoolkit/master/grok.cfg
versions = versions

[versions]
Expand Down
92 changes: 55 additions & 37 deletions setup.py
@@ -1,9 +1,15 @@
from setuptools import setup, find_packages
import os
from setuptools import setup, find_packages


readme_filename = os.path.join('src', 'grokcore', 'layout', 'README.txt')
long_description = open(readme_filename).read() + '\n\n' + \
open('CHANGES.txt').read()


long_description = (
open(readme_filename).read() +
'\n\n' +
open('CHANGES.txt').read())


test_requires = [
'zope.annotation',
Expand All @@ -16,37 +22,49 @@
'zope.traversing',
]

setup(name='grokcore.layout',
version='1.6.2.dev0',
description="A layout component package for zope3 and Grok.",
long_description = long_description,
classifiers=['Environment :: Web Environment',
'Intended Audience :: Developers',
'License :: OSI Approved :: Zope Public License',
'Programming Language :: Python',
'Framework :: Zope3',
],
keywords='grok layout zope3 pagelet theming',
author='Grok Team',
author_email='grok-dev@zope.org',
url='http://grok.zope.org',
license='ZPL',
packages=find_packages('src', exclude=['ez_setup']),
package_dir={'': 'src'},
namespace_packages=['grokcore'],
include_package_data=True,
zip_safe=False,
extras_require={'test': test_requires},
install_requires=[
'grokcore.component >= 2.5',
'grokcore.security >= 1.6',
'grokcore.view >= 2.7',
'martian >= 0.14',
'setuptools',
'zope.authentication',
'zope.component >= 3.9.1',
'zope.errorview',
'zope.interface',
'zope.publisher',
],
)

setup(
name='grokcore.layout',
version='1.6.2.dev0',
description="A layout component package for zope3 and Grok.",
long_description=long_description,
classifiers=[
'Environment :: Web Environment',
'Intended Audience :: Developers',
'License :: OSI Approved :: Zope Public License',
'Programming Language :: Python',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: Implementation',
'Programming Language :: Python :: Implementation :: CPython',
'Programming Language :: Python :: Implementation :: PyPy',
'Framework :: Zope3',
],
keywords='grok layout zope3 pagelet theming',
author='Grok Team',
author_email='grok-dev@zope.org',
url='http://grok.zope.org',
license='ZPL',
packages=find_packages('src', exclude=['ez_setup']),
package_dir={'': 'src'},
namespace_packages=['grokcore'],
include_package_data=True,
zip_safe=False,
extras_require={'test': test_requires},
install_requires=[
'grokcore.component >= 2.5',
'grokcore.security >= 1.6',
'grokcore.view >= 2.7',
'martian >= 0.14',
'setuptools',
'zope.authentication',
'zope.component >= 3.9.1',
'zope.errorview',
'zope.interface',
'zope.publisher',
],
)
16 changes: 8 additions & 8 deletions src/grokcore/layout/README.txt
Expand Up @@ -41,8 +41,8 @@ We check it has been correctly registered:
>>> layout = getMultiAdapter((TestRequest(), Interface), ILayout)
>>> isinstance(layout, MyLayout)
True
>>> layout.render()
u'a simple layout'
>>> print(layout.render())
a simple layout

Now let's see how to use this Layout in a specific context using a Page.

Expand Down Expand Up @@ -80,10 +80,10 @@ Grokking our Page will let us use it.
True
>>> wooly = Mammoth()
>>> page = getMultiAdapter((wooly, TestRequest()), name='display')
>>> page.content()
u'Looks like an elephant'
>>> page()
u'a simple layout'
>>> print(page.content())
Looks like an elephant
>>> print(page())
a simple layout

As we can see, the page is using the layout, on the __call__ to
render. Of course, this example Layout doesn't provide any interesting
Expand All @@ -98,8 +98,8 @@ with the help of the 'content' method:

>>> grok_component('MammothLayout', MammothLayout)
True
>>> page()
u'Header. Page: Looks like an elephant. Footer'
>>> print(page())
Header. Page: Looks like an elephant. Footer

Forms & Errorpages
==================
Expand Down
8 changes: 5 additions & 3 deletions src/grokcore/layout/tests/errors/norenderortemplatelayout.py
Expand Up @@ -2,9 +2,11 @@
>>> grok.testing.grok(__name__)
Traceback (most recent call last):
...
ConfigurationExecutionError: <class 'martian.error.GrokError'>: Layout <class 'grokcore.layout.tests.errors.norenderortemplatelayout.MyLayout'> has no associated template or 'render' method.
in:
<BLANKLINE>
zope.configuration.config.ConfigurationExecutionError: \
<class 'martian.error.GrokError'>: Layout \
<class 'grokcore.layout.tests.errors.norenderortemplatelayout.MyLayout'> \
has no associated template or 'render' method...
"""

import grokcore.component as grok
Expand Down
8 changes: 5 additions & 3 deletions src/grokcore/layout/tests/errors/renderandtemplate.py
Expand Up @@ -2,9 +2,11 @@
>>> grok.testing.grok(__name__)
Traceback (most recent call last):
...
ConfigurationExecutionError: <class 'martian.error.GrokError'>: Multiple possible ways to render layout <class 'grokcore.layout.tests.errors.renderandtemplate.MyLayout'>. It has both a 'render' method as well as an associated template.
in:
<BLANKLINE>
zope.configuration.config.ConfigurationExecutionError: \
<class 'martian.error.GrokError'>: Multiple possible ways to render layout \
<class 'grokcore.layout.tests.errors.renderandtemplate.MyLayout'>. It has \
both a 'render' method as well as an associated template...
"""

import grokcore.component as grok
Expand Down
8 changes: 6 additions & 2 deletions src/grokcore/layout/tests/errors/samecontext.py
Expand Up @@ -2,8 +2,12 @@
>>> grok.testing.grok(__name__)
Traceback (most recent call last):
...
ConfigurationConflictError: Conflicting configuration actions
For: ('adapter', (<InterfaceClass zope.publisher.interfaces.browser.IDefaultBrowserLayer>, <InterfaceClass zope.interface.Interface>), <InterfaceClass grokcore.layout.interfaces.ILayout>)
zope.configuration.config.ConfigurationConflictError: \
Conflicting configuration actions For: ('adapter', \
(<InterfaceClass zope.publisher.interfaces.browser.IDefaultBrowserLayer>, \
<InterfaceClass zope.interface.Interface>), \
<InterfaceClass grokcore.layout.interfaces.ILayout>)
"""

import grokcore.component as grok
Expand Down
6 changes: 3 additions & 3 deletions src/grokcore/layout/tests/layout/layoutlayers.py
Expand Up @@ -10,16 +10,16 @@
>>> directlyProvides(request, IDefaultLayer)
>>> view = getMultiAdapter((a, request), name="myview")
>>> print view()
>>> print(view())
A Layout
>>> directlyProvides(request, IAnotherLayer)
>>> view = getMultiAdapter((a, request), name="myview")
>>> print view()
>>> print(view())
A2 Layout
>>> view = getMultiAdapter((b, request), name="myview")
>>> print view()
>>> print(view())
B Layout
"""

Expand Down
4 changes: 2 additions & 2 deletions src/grokcore/layout/tests/layout/no_staticfolder.py
Expand Up @@ -5,7 +5,7 @@
>>> request = TestRequest()
>>> mongo = Dummy()
>>> mylayout = getMultiAdapter((request, mongo), ILayout)
>>> print mylayout.static
>>> print(mylayout.static)
None
"""

Expand All @@ -17,6 +17,6 @@ class Dummy(grok.Context):
pass

class MyLayout(Layout):

def render(self):
return ""
4 changes: 2 additions & 2 deletions src/grokcore/layout/tests/layout/selectlayout.py
Expand Up @@ -10,14 +10,14 @@
doesn't select any specific layout::
>>> view = getMultiAdapter((one, request), name="viewone")
>>> print view()
>>> print(view())
Layout One
We test that we can retrieve the default layout for the page that
select a specific layout::
>>> view = getMultiAdapter((one, request), name="viewtwo")
>>> print view()
>>> print(view())
Layout Two
"""
Expand Down
8 changes: 4 additions & 4 deletions src/grokcore/layout/tests/layout/specializedlayout.py
Expand Up @@ -12,22 +12,22 @@
>>> directlyProvides(request, IALayer)
>>> view = getMultiAdapter((one, request), name="myview")
>>> print view()
>>> print(view())
Layout A for context One
>>> view = getMultiAdapter((two, request), name="myview")
>>> print view()
>>> print(view())
Layout A for context Two
We switch the layer::
>>> directlyProvides(request, IBLayer)
>>> view = getMultiAdapter((one, request), name="myview")
>>> print view()
>>> print(view())
Layout B for context One
>>> view = getMultiAdapter((two, request), name="myview")
>>> print view()
>>> print(view())
Layout B for context Two
"""
Expand Down
8 changes: 4 additions & 4 deletions src/grokcore/layout/tests/models/errorviews.py
Expand Up @@ -5,9 +5,9 @@
>>> import grokcore.layout
>>> isinstance(view, grokcore.layout.ExceptionPage)
True
>>> print view.render()
>>> print(view.render())
A system error occurred.
>>> print view()
>>> print(view())
<html>
<body>
<div class="layout">A system error occurred.</div>
Expand All @@ -20,7 +20,7 @@
>>> request = TestRequest()
>>> request.setPrincipal(MockPrincipal())
>>> errorpage = getMultiAdapter((Unauthorized(), request), name='index')
>>> print errorpage()
>>> print(errorpage())
<html>
<body>
<div class="layout">Access to the requested resource is forbidden.</div>
Expand All @@ -31,7 +31,7 @@
>>> request = TestRequest()
>>> errorpage = getMultiAdapter(
... (NotFound(None, request), request), name='index')
>>> print errorpage()
>>> print(errorpage())
<html>
<body>
<div class="layout">The requested resource can not be found.</div>
Expand Down
4 changes: 2 additions & 2 deletions src/grokcore/layout/tests/models/page.py
Expand Up @@ -7,7 +7,7 @@
>>> mylayout = getMultiAdapter((request, cow), ILayout)
>>> myview = getMultiAdapter((cow, request), name='myview')
>>> print myview()
>>> print(myview())
<html>
<body>
<div class="layout"><p> My nice Content </p></div>
Expand All @@ -18,7 +18,7 @@
<grokcore.layout.tests.models.page.MyView object at ...>
>>> myview.layout
<grokcore.layout.tests.models.page.Master object at ...>
>>> print myview.content()
>>> print(myview.content())
<p> My nice Content </p>
"""
Expand Down

0 comments on commit 523e013

Please sign in to comment.