diff options
author | Ben Bangert <ben@groovie.org> | 2015-08-20 14:24:56 -0700 |
---|---|---|
committer | Ben Bangert <ben@groovie.org> | 2015-08-20 14:24:56 -0700 |
commit | e653221e47de58db2dadfe7e8cbcf5a33f9c5f35 (patch) | |
tree | 48ff79fad25a48314b907f46c2a00477ca99512f | |
parent | 439529937f2014e0e117e0f38394eb5061d00554 (diff) | |
parent | 4089523fce59ff8822cbe0bfee443ba6d87c7d59 (diff) | |
download | routes-e653221e47de58db2dadfe7e8cbcf5a33f9c5f35.tar.gz |
Merge pull request #28 from mikepk/concat_fix
Concat fix
-rw-r--r-- | routes/mapper.py | 48 | ||||
-rw-r--r-- | tests/test_functional/test_submapper.py | 37 |
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()
|