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)

%w(anaconda conda-forge defaults bioconda main).freeze
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

"anaconda"
API_BASE_URL =
"https://api.anaconda.org"
CONNECTION_TIMEOUT =
5
READ_TIMEOUT =
30
MAX_RETRIES =
1

Instance Method Summary collapse

Constructor Details

#initializeCondaRegistryClient

Returns a new instance of CondaRegistryClient.



33
34
35
36
# File 'lib/dependabot/conda/conda_registry_client.rb', line 33

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

Instance Method Details

#available_versions(package_name, channel = DEFAULT_CHANNEL) ⇒ Object



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

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



45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/dependabot/conda/conda_registry_client.rb', line 45

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



110
111
112
113
# File 'lib/dependabot/conda/conda_registry_client.rb', line 110

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



122
123
124
125
126
127
128
129
130
131
132
# File 'lib/dependabot/conda/conda_registry_client.rb', line 122

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)


66
67
68
69
70
71
72
73
74
# File 'lib/dependabot/conda/conda_registry_client.rb', line 66

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