Reorder test_databases into an order that honors the dependencies described in TEST[DEPENDENCIES].
(test_databases, dependencies)
| 283 | |
| 284 | |
| 285 | def dependency_ordered(test_databases, dependencies): |
| 286 | """ |
| 287 | Reorder test_databases into an order that honors the dependencies |
| 288 | described in TEST[DEPENDENCIES]. |
| 289 | """ |
| 290 | ordered_test_databases = [] |
| 291 | resolved_databases = set() |
| 292 | |
| 293 | # Maps db signature to dependencies of all its aliases |
| 294 | dependencies_map = {} |
| 295 | |
| 296 | # Check that no database depends on its own alias |
| 297 | for sig, (_, aliases) in test_databases: |
| 298 | all_deps = set() |
| 299 | for alias in aliases: |
| 300 | all_deps.update(dependencies.get(alias, [])) |
| 301 | if not all_deps.isdisjoint(aliases): |
| 302 | raise ImproperlyConfigured( |
| 303 | "Circular dependency: databases %r depend on each other, " |
| 304 | "but are aliases." % aliases |
| 305 | ) |
| 306 | dependencies_map[sig] = all_deps |
| 307 | |
| 308 | while test_databases: |
| 309 | changed = False |
| 310 | deferred = [] |
| 311 | |
| 312 | # Try to find a DB that has all its dependencies met |
| 313 | for signature, (db_name, aliases) in test_databases: |
| 314 | if dependencies_map[signature].issubset(resolved_databases): |
| 315 | resolved_databases.update(aliases) |
| 316 | ordered_test_databases.append((signature, (db_name, aliases))) |
| 317 | changed = True |
| 318 | else: |
| 319 | deferred.append((signature, (db_name, aliases))) |
| 320 | |
| 321 | if not changed: |
| 322 | raise ImproperlyConfigured("Circular dependency in TEST[DEPENDENCIES]") |
| 323 | test_databases = deferred |
| 324 | return ordered_test_databases |
| 325 | |
| 326 | |
| 327 | def get_unique_databases_and_mirrors(aliases=None): |