class Dependabot::Python::FileUpdater::PipfilePreparer

Attributes

lockfile[R]
pipfile_content[R]

Public Class Methods

new(pipfile_content:, lockfile: nil) click to toggle source
# File lib/dependabot/python/file_updater/pipfile_preparer.rb, line 15
def initialize(pipfile_content:, lockfile: nil)
  @pipfile_content = pipfile_content
  @lockfile = lockfile
end

Public Instance Methods

freeze_dependency(dep_name, pipfile_object, keys) click to toggle source
# File lib/dependabot/python/file_updater/pipfile_preparer.rb, line 49
def freeze_dependency(dep_name, pipfile_object, keys)
  locked_version = version_from_lockfile(
    keys[:lockfile],
    normalise(dep_name)
  )
  locked_ref = ref_from_lockfile(
    keys[:lockfile],
    normalise(dep_name)
  )

  pipfile_req = pipfile_object[keys[:pipfile]][dep_name]
  if pipfile_req.is_a?(Hash) && locked_version
    pipfile_req["version"] = "==#{locked_version}"
  elsif pipfile_req.is_a?(Hash) && locked_ref && !pipfile_req["ref"]
    pipfile_req["ref"] = locked_ref
  elsif locked_version
    pipfile_object[keys[:pipfile]][dep_name] = "==#{locked_version}"
  end
end
freeze_top_level_dependencies_except(dependencies) click to toggle source
# File lib/dependabot/python/file_updater/pipfile_preparer.rb, line 30
def freeze_top_level_dependencies_except(dependencies)
  return pipfile_content unless lockfile

  pipfile_object = TomlRB.parse(pipfile_content)
  excluded_names = dependencies.map(&:name)

  Python::FileParser::DEPENDENCY_GROUP_KEYS.each do |keys|
    next unless pipfile_object[keys[:pipfile]]

    pipfile_object.fetch(keys[:pipfile]).each do |dep_name, _|
      next if excluded_names.include?(normalise(dep_name))

      freeze_dependency(dep_name, pipfile_object, keys)
    end
  end

  TomlRB.dump(pipfile_object)
end
replace_sources(credentials) click to toggle source
# File lib/dependabot/python/file_updater/pipfile_preparer.rb, line 20
def replace_sources(credentials)
  pipfile_object = TomlRB.parse(pipfile_content)

  pipfile_object["source"] =
    pipfile_sources.reject { |h| h["url"].include?("${") } +
    config_variable_sources(credentials)

  TomlRB.dump(pipfile_object)
end
update_python_requirement(requirement) click to toggle source
# File lib/dependabot/python/file_updater/pipfile_preparer.rb, line 69
def update_python_requirement(requirement)
  pipfile_object = TomlRB.parse(pipfile_content)

  pipfile_object["requires"] ||= {}
  pipfile_object["requires"].delete("python_full_version")
  pipfile_object["requires"].delete("python_version")
  pipfile_object["requires"]["python_full_version"] = requirement

  TomlRB.dump(pipfile_object)
end

Private Instance Methods

config_variable_sources(credentials) click to toggle source
# File lib/dependabot/python/file_updater/pipfile_preparer.rb, line 115
def config_variable_sources(credentials)
  @config_variable_sources ||=
    credentials.
    select { |cred| cred["type"] == "python_index" }.
    map { |c| { "url" => AuthedUrlBuilder.authed_url(credential: c) } }
end
normalise(name) click to toggle source
# File lib/dependabot/python/file_updater/pipfile_preparer.rb, line 105
def normalise(name)
  NameNormaliser.normalise(name)
end
parsed_lockfile() click to toggle source
# File lib/dependabot/python/file_updater/pipfile_preparer.rb, line 101
def parsed_lockfile
  @parsed_lockfile ||= JSON.parse(lockfile.content)
end
pipfile_sources() click to toggle source
# File lib/dependabot/python/file_updater/pipfile_preparer.rb, line 109
def pipfile_sources
  @pipfile_sources ||=
    TomlRB.parse(pipfile_content).fetch("source", []).
    map { |h| h.dup.merge("url" => h["url"].gsub(%r{/*$}, "") + "/") }
end
ref_from_lockfile(dep_type, dep_name) click to toggle source
# File lib/dependabot/python/file_updater/pipfile_preparer.rb, line 93
def ref_from_lockfile(dep_type, dep_name)
  details = parsed_lockfile.dig(dep_type, normalise(dep_name))

  case details
  when Hash then details["ref"]
  end
end
version_from_lockfile(dep_type, dep_name) click to toggle source
# File lib/dependabot/python/file_updater/pipfile_preparer.rb, line 84
def version_from_lockfile(dep_type, dep_name)
  details = parsed_lockfile.dig(dep_type, normalise(dep_name))

  case details
  when String then details.gsub(/^==/, "")
  when Hash then details["version"]&.gsub(/^==/, "")
  end
end