code: def merge_dependency(self, item, resolve_parent, parents):
          
          dep = []
          for parent_key in parents:
              if item == parent_key:
                  raise CircularDependency(item, True)
              if parent_key.config_type == ItemType.CONTAINER:
                  parent_dep = resolve_parent(parent_key)
                  if item in parent_dep:
                      raise CircularDependency(item)
                  merge_list(dep, parent_dep)
          merge_list(dep, parents)
          return dep
docs: Merge dependencies of current configuration with further dependencies; in this instance, it means that in case
          of container configuration first parent dependencies are checked, and then immediate dependencies of the current
          configuration should be added to the list, but without duplicating any entries.
  
          :param item: Configuration item.
          :type item: (unicode | str, unicode | str, unicode | str, unicode | str)
          :param resolve_parent: Function to resolve parent dependencies.
          :type resolve_parent: function
          :type parents: collections.Iterable[(unicode | str, unicode | str, unicode | str, unicode | str)]
          :return: List of recursively resolved dependencies of this container.
          :rtype: list[(unicode | str, unicode | str, unicode | str, unicode | str)]
          :raise CircularDependency: If the current element depends on one found deeper in the hierarchy.