Class: Dependabot::Conda::CondaRegistryClient

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/dependabot/conda/conda_registry_client.rb

Constant Summary collapse

SUPPORTED_CHANNELS =

Supported public conda channels (user-facing names from environment.yml)

T.let(
  %w(anaconda conda-forge defaults bioconda main).freeze,
  T::Array[String]
)
CHANNEL_ALIASES =

Channel aliases: maps user-facing channel names to API channel names ‘defaults’ is a Conda client alias that doesn’t exist on anaconda.org API

T.let(
  { "defaults" => "anaconda" }.freeze,
  T::Hash[String, String]
)
DEFAULT_CHANNEL =

anaconda.org API configuration

T.let("anaconda", String)
API_BASE_URL =
T.let("https://api.anaconda.org", String)
CONNECTION_TIMEOUT =
T.let(5, Integer)
READ_TIMEOUT =
T.let(30, Integer)
MAX_RETRIES =
T.let(1, Integer)

Instance Method Summary collapse

Constructor Details

#initializeCondaRegistryClient

Returns a new instance of CondaRegistryClient.



36
37
38
39
# File 'lib/dependabot/conda/conda_registry_client.rb', line 36

def initialize
  @cache = T.let({}, T::Hash[String, T.untyped])
  @not_found_cache = T.let(Set.new, T::Set[String])
end

Instance Method Details

#available_versions(package_name, channel = DEFAULT_CHANNEL) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/dependabot/conda/conda_registry_client.rb', line 86

def available_versions(package_name, channel = DEFAULT_CHANNEL)
   = (package_name, channel)
  return [] unless 

  versions = ["versions"]
  return [] unless versions.is_a?(Array)

  # Parse and sort versions
  parsed_versions = versions.filter_map do |version_string|
    Dependabot::Conda::Version.new(version_string)
  rescue ArgumentError
    # Invalid version format - skip it
    Dependabot.logger.debug("Skipping invalid conda version: #{version_string}")
    nil
  end

  # Sort newest first
  parsed_versions.sort.reverse
end

#fetch_package_metadata(package_name, channel = DEFAULT_CHANNEL) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/dependabot/conda/conda_registry_client.rb', line 48

def (package_name, channel = DEFAULT_CHANNEL)
  cache_key = "#{channel}/#{package_name}"

  # Check 404 cache first
  return nil if @not_found_cache.include?(cache_key)

  # Check cache
  return @cache[cache_key] if @cache.key?(cache_key)

  # Fetch from API
  fetch_from_api(package_name, channel, cache_key)
end

#latest_version(package_name, channel = DEFAULT_CHANNEL) ⇒ Object



113
114
115
116
# File 'lib/dependabot/conda/conda_registry_client.rb', line 113

def latest_version(package_name, channel = DEFAULT_CHANNEL)
  versions = available_versions(package_name, channel)
  versions.first
end

#package_metadata(package_name, channel = DEFAULT_CHANNEL) ⇒ Object



125
126
127
128
129
130
131
132
133
134
135
# File 'lib/dependabot/conda/conda_registry_client.rb', line 125

def (package_name, channel = DEFAULT_CHANNEL)
   = (package_name, channel)
  return nil unless 

  {
    homepage: ["home"],
    source_url: ["dev_url"],
    description: ["summary"],
    license: ["license"]
  }
end

#version_exists?(package_name, version, channel = DEFAULT_CHANNEL) ⇒ Boolean

Returns:

  • (Boolean)


69
70
71
72
73
74
75
76
77
# File 'lib/dependabot/conda/conda_registry_client.rb', line 69

def version_exists?(package_name, version, channel = DEFAULT_CHANNEL)
   = (package_name, channel)
  return false unless 

  versions = ["versions"]
  return false unless versions.is_a?(Array)

  versions.include?(version)
end