diff options
| author | Chris McDonough <chrism@plope.com> | 2011-12-03 16:52:01 -0500 |
|---|---|---|
| committer | Chris McDonough <chrism@plope.com> | 2011-12-03 16:52:01 -0500 |
| commit | 735df7f3b62a831c9fb7d44872027a5c4d0eb328 (patch) | |
| tree | 5d8cbd1cf7b919203c8273c54f367f0859edbfb5 | |
| parent | 5224059f71d0ad592a611c196a3af7cbd1dc828f (diff) | |
| download | pyramid-735df7f3b62a831c9fb7d44872027a5c4d0eb328.tar.gz pyramid-735df7f3b62a831c9fb7d44872027a5c4d0eb328.tar.bz2 pyramid-735df7f3b62a831c9fb7d44872027a5c4d0eb328.zip | |
unify resolveConflicts implementation with the same impl on chrism-dictactions branch of zope.configuration
| -rw-r--r-- | pyramid/config/__init__.py | 41 | ||||
| -rw-r--r-- | pyramid/tests/test_config/test_init.py | 12 |
2 files changed, 26 insertions, 27 deletions
diff --git a/pyramid/config/__init__.py b/pyramid/config/__init__.py index 40f061897..f95c876e0 100644 --- a/pyramid/config/__init__.py +++ b/pyramid/config/__init__.py @@ -1033,50 +1033,49 @@ def resolveConflicts(actions): # organize actions by discriminators unique = {} output = [] - for i in range(len(actions)): - action = actions[i] + for i, action in enumerate(actions): if not isinstance(action, dict): - # old-style ZCML tuple action + # old-style tuple action action = expand_action(*action) - order = action['order'] - if not order: - action['order'] = i + order = action['order'] or i discriminator = action['discriminator'] if discriminator is None: # The discriminator is None, so this action can never # conflict. We can add it directly to the result. - output.append(action) + output.append((order, action)) continue + L = unique.setdefault(discriminator, []) - L.append(action) + L.append((order, action)) # Check for conflicts conflicts = {} for discriminator, dups in unique.items(): # We need to sort the actions by the paths so that the shortest # path with a given prefix comes first: - def bypath(action): - return (action['includepath'], action['order']) + def bypath(tup): + return tup[1]['includepath'], tup[0] dups.sort(key=bypath) - first = dups[0] - output.append(first) - basepath = first['includepath'] - baseinfo = first['info'] - discriminator = first['discriminator'] - for dup in dups[1:]: + order, first = dups[0] + output.append(dups[0]) + basepath, baseinfo, discriminator = (first['includepath'], + first['info'], + first['discriminator']) + + for order, dup in dups[1:]: includepath = dup['includepath'] # Test whether path is a prefix of opath if (includepath[:len(basepath)] != basepath # not a prefix or includepath == basepath): - infos = conflicts.setdefault(discriminator, [baseinfo]) - infos.append(dup['info']) + L = conflicts.setdefault(discriminator, [baseinfo]) + L.append(dup['info']) if conflicts: raise ConfigurationConflictError(conflicts) - output.sort(key=operator.itemgetter('order')) - return output - + output.sort(key=operator.itemgetter(0)) + return [ x[1] for x in output ] + def expand_action(discriminator, callable=None, args=(), kw=None, includepath=(), info=None, order=0, introspectables=()): if kw is None: diff --git a/pyramid/tests/test_config/test_init.py b/pyramid/tests/test_config/test_init.py index 94ff4348a..27a8c9306 100644 --- a/pyramid/tests/test_config/test_init.py +++ b/pyramid/tests/test_config/test_init.py @@ -1658,7 +1658,7 @@ class Test_resolveConflicts(unittest.TestCase): 'kw': {}, 'discriminator': 1, 'includepath': (), - 'order': 1}, + 'order': 0}, {'info': None, 'args': (3,), @@ -1667,7 +1667,7 @@ class Test_resolveConflicts(unittest.TestCase): 'kw': {}, 'discriminator': 3, 'includepath': ('y',), - 'order': 5}, + 'order': 0}, {'info': None, 'args': (5,), @@ -1676,7 +1676,7 @@ class Test_resolveConflicts(unittest.TestCase): 'kw': {}, 'discriminator': None, 'includepath': ('y',), - 'order': 6}, + 'order': 0}, {'info': 'should be last', 'args': (4,), @@ -1719,7 +1719,7 @@ class Test_resolveConflicts(unittest.TestCase): 'kw': {}, 'discriminator': 1, 'includepath': (), - 'order': 1}, + 'order': 0}, {'info': None, 'args': (3,), @@ -1728,7 +1728,7 @@ class Test_resolveConflicts(unittest.TestCase): 'kw': {}, 'discriminator': 3, 'includepath': ('y',), - 'order': 5}, + 'order': 0}, {'info': None, 'args': (5,), @@ -1737,7 +1737,7 @@ class Test_resolveConflicts(unittest.TestCase): 'kw': {}, 'discriminator': None, 'includepath': ('y',), - 'order': 6}, + 'order': 0}, {'info': 'should be last', 'args': (4,), |
