class Dependabot::Uv::FileUpdater::PyprojectPreparer

def freeze_top_level_dependencies_except(dependencies)

rubocop:disable Metrics/AbcSize
rubocop:disable Metrics/PerceivedComplexity
def freeze_top_level_dependencies_except(dependencies)
  return pyproject_content unless lockfile
  pyproject_object = TomlRB.parse(pyproject_content)
  poetry_object = pyproject_object["tool"]["poetry"]
  excluded_names = dependencies.map(&:name) + ["python"]
  Dependabot::Uv::FileParser::PyprojectFilesParser::POETRY_DEPENDENCY_TYPES.each do |key|
    next unless poetry_object[key]
    source_types = %w(directory file url)
    poetry_object.fetch(key).each do |dep_name, _|
      next if excluded_names.include?(normalise(dep_name))
      locked_details = locked_details(dep_name)
      next unless (locked_version = locked_details&.fetch("version"))
      next if source_types.include?(locked_details&.dig("source", "type"))
      if locked_details&.dig("source", "type") == "git"
        poetry_object[key][dep_name] = {
          "git" => locked_details&.dig("source", "url"),
          "rev" => locked_details&.dig("source", "reference")
        }
        subdirectory = locked_details&.dig("source", "subdirectory")
        poetry_object[key][dep_name]["subdirectory"] = subdirectory if subdirectory
      elsif poetry_object[key][dep_name].is_a?(Hash)
        poetry_object[key][dep_name]["version"] = locked_version
      elsif poetry_object[key][dep_name].is_a?(Array)
        # if it has multiple-constraints, locking to a single version is
        # going to result in a bad lockfile, ignore
        next
      else
        poetry_object[key][dep_name] = locked_version
      end
    end
  end
  TomlRB.dump(pyproject_object)
end