summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Bangert <ben@groovie.org>2015-08-20 14:24:56 -0700
committerBen Bangert <ben@groovie.org>2015-08-20 14:24:56 -0700
commite653221e47de58db2dadfe7e8cbcf5a33f9c5f35 (patch)
tree48ff79fad25a48314b907f46c2a00477ca99512f
parent439529937f2014e0e117e0f38394eb5061d00554 (diff)
parent4089523fce59ff8822cbe0bfee443ba6d87c7d59 (diff)
downloadroutes-e653221e47de58db2dadfe7e8cbcf5a33f9c5f35.tar.gz
Merge pull request #28 from mikepk/concat_fix
Concat fix
-rw-r--r--routes/mapper.py48
-rw-r--r--tests/test_functional/test_submapper.py37
2 files changed, 74 insertions, 11 deletions
diff --git a/routes/mapper.py b/routes/mapper.py
index 583309e..7ca9ee9 100644
--- a/routes/mapper.py
+++ b/routes/mapper.py
@@ -116,7 +116,19 @@ class SubMapperParent(object):
controller = resource_name or collection_name
if path_prefix is None:
- path_prefix = '/' + collection_name
+ if collection_name is None:
+ path_prefix_str = ''
+ else:
+ path_prefix_str = '/{collection_name}'
+ else:
+ if collection_name is None:
+ path_prefix_str = "{pre}"
+ else:
+ path_prefix_str = "{pre}/{collection_name}"
+
+ # generate what will be the path prefix for the collection
+ path_prefix = path_prefix_str.format(pre=path_prefix,
+ collection_name=collection_name)
collection = SubMapper(self, collection_name=collection_name,
resource_name=resource_name,
@@ -148,30 +160,44 @@ class SubMapper(SubMapperParent):
self.formatted = getattr(obj, 'formatted', None)
if self.formatted is None:
self.formatted = True
-
- self.add_actions(actions or [])
+ self.add_actions(actions or [], **kwargs)
def connect(self, *args, **kwargs):
newkargs = {}
- newargs = args
+ # newargs = args
+ routename, path = args
for key, value in six.iteritems(self.kwargs):
if key == 'path_prefix':
if len(args) > 1:
- newargs = (args[0], self.kwargs[key] + args[1])
+ # if there's a name_prefix, add it to the route name
+ # and if there's a path_prefix
+ path = ''.join((self.kwargs[key], args[1]))
else:
- newargs = (self.kwargs[key] + args[0],)
+ path = ''.join((self.kwargs[key], args[0]))
+ elif key == 'name_prefix':
+ if len(args) > 1:
+ # if there's a name_prefix, add it to the route name
+ # and if there's a path_prefix
+ routename = ''.join((self.kwargs[key], args[0]))
+ else:
+ routename = None
elif key in kwargs:
if isinstance(value, dict):
newkargs[key] = dict(value, **kwargs[key]) # merge dicts
- elif key == 'controller':
- newkargs[key] = kwargs[key]
else:
- newkargs[key] = value + kwargs[key]
+ # Originally used this form:
+ # newkargs[key] = value + kwargs[key]
+ # New version avoids the inheritance concatenation issue
+ # with submappers. Only prefixes concatenate, everything
+ # else overrides in submappers.
+ newkargs[key] = kwargs[key]
else:
newkargs[key] = self.kwargs[key]
for key in kwargs:
if key not in self.kwargs:
newkargs[key] = kwargs[key]
+
+ newargs = (routename, path)
return self.obj.connect(*newargs, **newkargs)
def link(self, rel=None, name=None, action=None, method='GET',
@@ -263,8 +289,8 @@ class SubMapper(SubMapperParent):
"""Generates the "delete" action for a collection member submapper."""
return self.action(action='delete', method='DELETE', **kwargs)
- def add_actions(self, actions):
- [getattr(self, action)() for action in actions]
+ def add_actions(self, actions, **kwargs):
+ [getattr(self, action)(**kwargs) for action in actions]
# Provided for those who prefer using the 'with' syntax in Python 2.5+
def __enter__(self):
diff --git a/tests/test_functional/test_submapper.py b/tests/test_functional/test_submapper.py
index 3576859..1516a58 100644
--- a/tests/test_functional/test_submapper.py
+++ b/tests/test_functional/test_submapper.py
@@ -154,6 +154,43 @@ class TestSubmapper(unittest.TestCase):
match = m.match('/parents/1/children/2')
eq_('col2', match.get('controller'))
+ def test_submapper_argument_overriding(self):
+ m = Mapper()
+ first = m.submapper(path_prefix='/first_level',
+ controller='first', action='test',
+ name_prefix='first_')
+ first.connect('test', r'/test')
+ second = first.submapper(path_prefix='/second_level',
+ controller='second',
+ name_prefix='second_')
+ second.connect('test', r'/test')
+ third = second.submapper(path_prefix='/third_level',
+ controller="third", action='third_action',
+ name_prefix='third_')
+ third.connect('test', r'/test')
+
+ # test first level
+ match = m.match('/first_level/test')
+ eq_('first', match.get('controller'))
+ eq_('test', match.get('action'))
+ # test name_prefix worked
+ eq_('/first_level/test', url_for('first_test'))
+
+ # test second level controller override
+ match = m.match('/first_level/second_level/test')
+ eq_('second', match.get('controller'))
+ eq_('test', match.get('action'))
+ # test name_prefix worked
+ eq_('/first_level/second_level/test', url_for('first_second_test'))
+
+ # test third level controller and action override
+ match = m.match('/first_level/second_level/third_level/test')
+ eq_('third', match.get('controller'))
+ eq_('third_action', match.get('action'))
+ # test name_prefix worked
+ eq_('/first_level/second_level/third_level/test',
+ url_for('first_second_third_test'))
+
if __name__ == '__main__':
unittest.main()