class Dependabot::Python::FileUpdater::RequirementFileUpdater

def dependency

def dependency
  # For now, we'll only ever be updating a single dependency
  T.must(dependencies.first)
end

def fetch_updated_dependency_files

def fetch_updated_dependency_files
  reqs = dependency.requirements.zip(dependency.previous_requirements || [])
  reqs.filter_map do |(new_req, old_req)|
    next if new_req == old_req
    file = T.must(get_original_file(new_req.fetch(:file))).dup
    updated_content =
      updated_requirement_or_setup_file_content(new_req, old_req)
    next if updated_content == file.content
    file.content = updated_content
    file
  end
end

def get_original_file(filename)

def get_original_file(filename)
  dependency_files.find { |f| f.name == filename }
end

def initialize(dependencies:, dependency_files:, credentials:, index_urls: nil)

def initialize(dependencies:, dependency_files:, credentials:, index_urls: nil)
  @dependencies = T.let(dependencies, T::Array[Dependabot::Dependency])
  @dependency_files = T.let(dependency_files, T::Array[Dependabot::DependencyFile])
  @credentials = T.let(credentials, T::Array[Dependabot::Credential])
  @index_urls = T.let(index_urls, T.nilable(T::Array[T.nilable(String)]))
  @updated_dependency_files = T.let(nil, T.nilable(T::Array[Dependabot::DependencyFile]))
end

def updated_dependency_files

def updated_dependency_files
  @updated_dependency_files ||= fetch_updated_dependency_files
end

def updated_requirement_or_setup_file_content(new_req, old_req)

def updated_requirement_or_setup_file_content(new_req, old_req)
  original_file = get_original_file(new_req.fetch(:file))
  raise "Could not find a dependency file for #{new_req}" unless original_file
  RequirementReplacer.new(
    content: T.must(original_file.content),
    dependency_name: dependency.name,
    old_requirement: old_req&.fetch(:requirement),
    new_requirement: new_req.fetch(:requirement),
    new_hash_version: dependency.version,
    index_urls: @index_urls
  ).updated_content
end