Skip to content
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

add_viewgroup now appends views if viewgroup exists #2

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGES.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
0.5 (2012-02-21)
----------------

- Fixed tests in pyramid 1.3aX.

- Calling add_viewgroup with the same ``viewgroup`` appends views to it.

0.4 (2011-07-22)
----------------

Expand Down
3 changes: 3 additions & 0 deletions CONTRIBUTORS.txt
Original file line number Diff line number Diff line change
Expand Up @@ -109,3 +109,6 @@ Contributors
- Chris McDonough, 2010/11/08

- Tres Seaver, 2010/11/09

- Josip Delic, 2012/02/21

32 changes: 28 additions & 4 deletions pyramid_viewgroup/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,31 @@
from pyramid.exceptions import Forbidden
from pyramid.view import render_view_to_iterable
from pyramid.view import render_view
from zope.interface import Interface
from pyramid.interfaces import (
IViewClassifier,
IView,
IRequest,
)

class ViewGroup(object):
def __init__(self, name, viewnames):
self.name = name
self.viewnames = viewnames
self._viewnames = []
self.add_views(viewnames)

def add_views(self, names):
for v in names:
if v in self._viewnames:
raise ValueError('View %s already in viewgroup' % v)

for v in names:
self._viewnames.append(v)

def __call__(self, context, request):
renderings = []

for viewname in self.viewnames:
for viewname in self._viewnames:
try:
iterable = render_view_to_iterable(context, request, viewname)
except Forbidden:
Expand All @@ -37,8 +52,17 @@ def __call__(self, name='', secure=True):
return render_view(self.context, self.request, name, secure)

def add_viewgroup(config, name, viewnames, context=None):
viewgroup = ViewGroup(name, viewnames)
config.add_view(viewgroup, name=name, context=context)
reg = config.registry
_context = context or Interface
wrapper = reg.adapters.lookup(
(IViewClassifier, IRequest, _context), IView, name=name)
if not wrapper:
viewgroup = ViewGroup(name, viewnames)
config.add_view(viewgroup, name=name, context=context)
return
viewgroup = wrapper.__original_view__
viewgroup.add_views(viewnames)


def includeme(config):
config.add_directive('add_viewgroup', add_viewgroup)
Expand Down
78 changes: 66 additions & 12 deletions pyramid_viewgroup/tests/test_all.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ def test_no_viewnames(self):
self.assertRaises(ConfigurationError, f, context)

def test_call(self):
#FIXME what is this test testing?
from pyramid.registry import Registry
from pyramid.interfaces import IView
from pyramid.interfaces import IRequest
Expand All @@ -35,18 +36,18 @@ def test_call(self):
context.registry.settings = {}
context.package = None
context.autocommit = False
class IFoo:
class IFoo(Interface):
pass
def view(context, request):
""" """
f(context, 'viewgroup', ['a', 'b', 'c'], IFoo)
actions = context.actions
#actions = context.actions

self.assertEqual(len(actions), 1)
#self.assertEqual(len(actions), 1)

action = actions[0]
registrar = action[1]
registrar()
#action = actions[0]
#registrar = action[1]
#registrar()
reg = self.config.registry
wrapper = reg.adapters.lookup((IRequest, Interface), IView,
name='viewgroup')
Expand Down Expand Up @@ -160,10 +161,9 @@ def test_call(self):
view2 = make_view(response2)
self._registerView(view2, 'view2')

from pyramid_viewgroup import ViewGroup
from pyramid_viewgroup import add_viewgroup

group = ViewGroup('viewgroup', ['view1', 'view2'])
self._registerView(group, 'viewgroup')
add_viewgroup(self.config, 'viewgroup', ['view1', 'view2'])

context = DummyContext()
request = DummyRequest()
Expand All @@ -173,6 +173,60 @@ def test_call(self):
self.assertEqual(provider('view2'), 'Response2')
self.assertEqual(provider('viewgroup'), 'Response1Response2')

def test_call_view_already(self):
response1 = DummyResponse()
response1.app_iter = ['Response1']
view1 = make_view(response1)
self._registerView(view1, 'view1')

response2 = DummyResponse()
response2.app_iter = ['Response2']
view2 = make_view(response2)
self._registerView(view2, 'view2')

from pyramid_viewgroup import add_viewgroup

add_viewgroup(self.config, 'viewgroup', ['view1', 'view2'])
self.assertRaises(ValueError, add_viewgroup, self.config, 'viewgroup',
['view1', 'view2'])

def test_call_viewgroup_append(self):
response1 = DummyResponse()
response1.app_iter = ['Response1']
view1 = make_view(response1)
self._registerView(view1, 'view1')

response2 = DummyResponse()
response2.app_iter = ['Response2']
view2 = make_view(response2)
self._registerView(view2, 'view2')

response3 = DummyResponse()
response3.app_iter = ['Response3']
view3 = make_view(response3)
self._registerView(view3, 'view3')

response4 = DummyResponse()
response4.app_iter = ['Response4']
view4 = make_view(response4)
self._registerView(view4, 'view4')

from pyramid_viewgroup import add_viewgroup

add_viewgroup(self.config, 'viewgroup', ['view1', 'view2'])
add_viewgroup(self.config, 'viewgroup', ['view3', 'view4'])

context = DummyContext()
request = DummyRequest()
request.registry = self.config.registry
provider = self._makeOne(context, request)
self.assertEqual(provider('view1'), 'Response1')
self.assertEqual(provider('view2'), 'Response2')
self.assertEqual(provider('view3'), 'Response3')
self.assertEqual(provider('view4'), 'Response4')
self.assertEqual(provider('viewgroup'),
'Response1Response2Response3Response4')

class Test_includeme(unittest.TestCase):
def _callFUT(self, config):
from pyramid_viewgroup import includeme
Expand Down Expand Up @@ -204,9 +258,6 @@ class DummyRequest:
from pyramid.interfaces import IRequest
implements(IRequest)

class DummyContext:
pass

class DummySecurityPolicy:
pass

Expand All @@ -217,6 +268,9 @@ class DummyContext:
package = None
def __init__(self):
self.actions = []
self.route_prefix = ""
self.basepath = 'basepath'
self.includepath = ()
self.info = None

class IDummy(Interface):
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
CHANGES = ''

setup(name='pyramid_viewgroup',
version='0.4',
version='0.5',
description='An anlologue of Zope 3 "content providers" for Pyramid',
long_description=README + '\n\n' + CHANGES,
classifiers=[
Expand Down