The inverse operation to `remove_replaced_nodes`. Almost. Remove the replacement node `replacement` and remap its child nodes to `replaced` - the list of nodes it would have replaced. Don't remap its parent nodes as they are expected to be correct already.
(self, replacement, replaced)
| 159 | parent.add_child(replacement_node) |
| 160 | |
| 161 | def remove_replacement_node(self, replacement, replaced): |
| 162 | """ |
| 163 | The inverse operation to `remove_replaced_nodes`. Almost. Remove the |
| 164 | replacement node `replacement` and remap its child nodes to `replaced` |
| 165 | - the list of nodes it would have replaced. Don't remap its parent |
| 166 | nodes as they are expected to be correct already. |
| 167 | """ |
| 168 | self.nodes.pop(replacement, None) |
| 169 | try: |
| 170 | replacement_node = self.node_map.pop(replacement) |
| 171 | except KeyError as err: |
| 172 | raise NodeNotFoundError( |
| 173 | "Unable to remove replacement node %r. It was either never added" |
| 174 | " to the migration graph, or has been removed already." |
| 175 | % (replacement,), |
| 176 | replacement, |
| 177 | ) from err |
| 178 | replaced_nodes = set() |
| 179 | replaced_nodes_parents = set() |
| 180 | for key in replaced: |
| 181 | replaced_node = self.node_map.get(key) |
| 182 | if replaced_node: |
| 183 | replaced_nodes.add(replaced_node) |
| 184 | replaced_nodes_parents |= replaced_node.parents |
| 185 | # We're only interested in the latest replaced node, so filter out |
| 186 | # replaced nodes that are parents of other replaced nodes. |
| 187 | replaced_nodes -= replaced_nodes_parents |
| 188 | for child in replacement_node.children: |
| 189 | child.parents.remove(replacement_node) |
| 190 | for replaced_node in replaced_nodes: |
| 191 | replaced_node.add_child(child) |
| 192 | child.add_parent(replaced_node) |
| 193 | for parent in replacement_node.parents: |
| 194 | parent.children.remove(replacement_node) |
| 195 | # NOTE: There is no need to remap parent dependencies as we can |
| 196 | # assume the replaced nodes already have the correct ancestry. |
| 197 | |
| 198 | def validate_consistency(self): |
| 199 | """Ensure there are no dummy nodes remaining in the graph.""" |