lib/dependabot/uv/update_checker/pip_version_resolver.rb



# typed: true
# frozen_string_literal: true

require "dependabot/uv/language_version_manager"
require "dependabot/uv/update_checker"
require "dependabot/uv/update_checker/latest_version_finder"
require "dependabot/uv/file_parser/python_requirement_parser"

module Dependabot
  module Uv
    class UpdateChecker
      class PipVersionResolver
        def initialize(dependency:, dependency_files:, credentials:,
                       ignored_versions:, update_cooldown: nil, raise_on_ignored: false,
                       security_advisories:)
          @dependency = dependency
          @dependency_files    = dependency_files
          @credentials         = credentials
          @ignored_versions    = ignored_versions
          @update_cooldown = update_cooldown
          @raise_on_ignored    = raise_on_ignored
          @security_advisories = security_advisories
        end

        def latest_resolvable_version
          latest_version_finder.latest_version(language_version: language_version_manager.python_version)
        end

        def latest_resolvable_version_with_no_unlock
          latest_version_finder
            .latest_version_with_no_unlock(language_version: language_version_manager.python_version)
        end

        def lowest_resolvable_security_fix_version
          latest_version_finder
            .lowest_security_fix_version(language_version: language_version_manager.python_version)
        end

        private

        attr_reader :dependency
        attr_reader :dependency_files
        attr_reader :credentials
        attr_reader :ignored_versions
        attr_reader :security_advisories

        def latest_version_finder
          @latest_version_finder ||= LatestVersionFinder.new(
            dependency: dependency,
            dependency_files: dependency_files,
            credentials: credentials,
            ignored_versions: ignored_versions,
            raise_on_ignored: @raise_on_ignored,
            cooldown_options: @update_cooldown,
            security_advisories: security_advisories
          )
        end

        def python_requirement_parser
          @python_requirement_parser ||=
            FileParser::PythonRequirementParser.new(
              dependency_files: dependency_files
            )
        end

        def language_version_manager
          @language_version_manager ||=
            LanguageVersionManager.new(
              python_requirement_parser: python_requirement_parser
            )
        end
      end
    end
  end
end