code: def patch_nodes(self, patches):
          
          # because we don't have any mapping from node _names_ to nodes, and we
          # only have the node name in the patch, we have to iterate over all the
          # nodes looking for matching names. We could use _find_by_name if we
          # were ok with doing an O(n*m) search (one nodes scan per patch)
          for node in self.nodes.values():
              if node.resource_type != NodeType.Model:
                  continue
              patch = patches.pop(node.name, None)
              if not patch:
                  continue
              node.patch(patch)
  
          # log debug-level warning about nodes we couldn't find
          if patches:
              for patch in patches.values():
                  # since patches aren't nodes, we can't use the existing
                  # target_not_found warning
                  logger.debug((
                      'WARNING: Found documentation for model "{}" which was '
                      'not found or is disabled').format(patch.name)
                  )
docs: Patch nodes with the given dict of patches. Note that this consumes
          the input!