summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2011-12-03 16:52:01 -0500
committerChris McDonough <chrism@plope.com>2011-12-03 16:52:01 -0500
commit735df7f3b62a831c9fb7d44872027a5c4d0eb328 (patch)
tree5d8cbd1cf7b919203c8273c54f367f0859edbfb5
parent5224059f71d0ad592a611c196a3af7cbd1dc828f (diff)
downloadpyramid-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__.py41
-rw-r--r--pyramid/tests/test_config/test_init.py12
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,),