class Dependabot::Python::FileUpdater::PipfilePreparer
def config_variable_sources(credentials)
def config_variable_sources(credentials) @config_variable_sources = T.let([], T.nilable(T::Array[T::Hash[String, String]])) @config_variable_sources = credentials.select { |cred| cred["type"] == "python_index" }.map.with_index do |c, i| { "name" => "dependabot-inserted-index-#{i}", "url" => AuthedUrlBuilder.authed_url(credential: c) } end end
def initialize(pipfile_content:)
def initialize(pipfile_content:) @pipfile_content = pipfile_content end
def pipfile_sources
def pipfile_sources @pipfile_sources ||= T.let(TomlRB.parse(pipfile_content).fetch("source", []), T.nilable(T::Array[T::Hash[String, String]])) end
def replace_sources(credentials)
def replace_sources(credentials) pipfile_object = TomlRB.parse(pipfile_content) pipfile_object["source"] = pipfile_sources.filter_map { |h| sub_auth_url(h, credentials) } + config_variable_sources(credentials) TomlRB.dump(pipfile_object) end
def sub_auth_url(source, credentials)
def sub_auth_url(source, credentials) if source["url"]&.include?("${") base_url = source["url"]&.sub(/\${.*}@/, "") source_cred = credentials .select { |cred| cred["type"] == "python_index" && cred["index-url"] } .find { |c| T.must(c["index-url"]).sub(/\${.*}@/, "") == base_url } return nil if source_cred.nil? source["url"] = AuthedUrlBuilder.authed_url(credential: source_cred) end source end
def update_python_requirement(requirement)
def update_python_requirement(requirement) pipfile_object = TomlRB.parse(pipfile_content) pipfile_object["requires"] ||= {} if pipfile_object.dig("requires", "python_full_version") && pipfile_object.dig("requires", "python_version") pipfile_object["requires"].delete("python_full_version") elsif pipfile_object.dig("requires", "python_full_version") pipfile_object["requires"].delete("python_full_version") pipfile_object["requires"]["python_version"] = requirement end TomlRB.dump(pipfile_object) end
def update_ssl_requirement(parsed_file)
def update_ssl_requirement(parsed_file) pipfile_object = TomlRB.parse(pipfile_content) parsed_object = TomlRB.parse(parsed_file) raise DependencyFileNotResolvable, "Unable to resolve pipfile." unless parsed_object["source"] # we parse the verify_ssl value from manifest if it exists verify_ssl = parsed_object["source"].map { |x| x["verify_ssl"] }.first # provide a default "true" value to file generator in case no value is provided in manifest file pipfile_object["source"].each do |key| key["verify_ssl"] = verify_ssl.nil? ? true : verify_ssl end TomlRB.dump(pipfile_object) end