Class: MilkTea::PackageSourceResolver

Inherits:
Object
  • Object
show all
Defined in:
lib/milk_tea/packages/source_resolver.rb

Defined Under Namespace

Classes: GitIdentity, PathIdentity, RegistryDependencyKey, RegistryIdentity, ResolvedPackage, Source, SourceIdentity

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(source_cache: PackageSourceCache.new, remote_resolution: :reject, source_fetcher: nil, resolved_registry_versions: nil) ⇒ PackageSourceResolver

Returns a new instance of PackageSourceResolver.



175
176
177
178
179
180
# File 'lib/milk_tea/packages/source_resolver.rb', line 175

def initialize(source_cache: PackageSourceCache.new, remote_resolution: :reject, source_fetcher: nil, resolved_registry_versions: nil)
  @source_cache = source_cache
  @remote_resolution = remote_resolution
  @source_fetcher = source_fetcher
  @resolved_registry_versions = normalize_resolved_registry_versions(resolved_registry_versions)
end

Instance Attribute Details

#resolved_registry_versionsObject (readonly)

Returns the value of attribute resolved_registry_versions.



9
10
11
# File 'lib/milk_tea/packages/source_resolver.rb', line 9

def resolved_registry_versions
  @resolved_registry_versions
end

Class Method Details

.registry_dependency_key(parent_source_key:, dependency_name:) ⇒ Object



168
169
170
171
172
173
# File 'lib/milk_tea/packages/source_resolver.rb', line 168

def self.registry_dependency_key(parent_source_key:, dependency_name:)
  RegistryDependencyKey.new(
    parent_source_key: parent_source_key.to_s,
    dependency_name: dependency_name.to_s,
  )
end

.source_key_for_identity(identity) ⇒ Object



161
162
163
164
165
166
# File 'lib/milk_tea/packages/source_resolver.rb', line 161

def self.source_key_for_identity(identity)
  return "path:#{File.expand_path(identity.path)}" if identity.is_a?(PathIdentity)
  return "#{identity.kind}:#{identity.cache_key}" if identity.cache_key

  raise PackageSourceResolverError, "unsupported source identity #{identity.class} for registry dependency key"
end

Instance Method Details

#identity_from_lock(entry, lock_path) ⇒ Object



202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
# File 'lib/milk_tea/packages/source_resolver.rb', line 202

def identity_from_lock(entry, lock_path)
  source_kind = entry["source_kind"].to_s

  case source_kind
  when "path"
    source_path = entry["source_path"].to_s
    raise PackageSourceResolverError, "package.lock missing source_path in #{lock_path}" if source_path.empty?

    PathIdentity.new(source_path)
  when "registry"
    RegistryIdentity.new(
      package_name: entry["registry_package"],
      version: entry["registry_version"],
    )
  when "git"
    GitIdentity.new(
      url: entry["git_url"],
      revision: entry["git_rev"],
      subdir: entry["git_subdir"],
    )
  else
    raise PackageSourceResolverError,
          "unsupported package source_kind #{source_kind.inspect} in #{lock_path}; supported kinds are path, registry, and git"
  end
end

#resolve(dependency, parent_manifest:, parent_source: nil) ⇒ Object



228
229
230
231
232
233
234
235
236
237
238
239
240
# File 'lib/milk_tea/packages/source_resolver.rb', line 228

def resolve(dependency, parent_manifest:, parent_source: nil)
  if dependency.path
    manifest = PackageManifest.load(dependency.path)
    validate_fixed_dependency_version_requirement!(dependency, manifest, parent_manifest:)
    return ResolvedPackage.new(manifest:, source: source_for_manifest(manifest))
  end

  return resolve_registry_dependency(dependency, parent_manifest:, parent_source:) if dependency.registry?
  return resolve_git_dependency(dependency, parent_manifest:) if dependency.git

  raise PackageSourceResolverError,
        "dependency #{dependency.name} in #{parent_manifest.manifest_path} has no supported source resolver"
end

#source_for_manifest(manifest) ⇒ Object



195
196
197
198
199
200
# File 'lib/milk_tea/packages/source_resolver.rb', line 195

def source_for_manifest(manifest)
  Source.new(
    identity: PathIdentity.new(manifest.root_dir),
    local_root: manifest.root_dir,
  )
end

#source_from_lock(entry, lock_path) ⇒ Object



242
243
244
245
246
247
# File 'lib/milk_tea/packages/source_resolver.rb', line 242

def source_from_lock(entry, lock_path)
  identity = identity_from_lock(entry, lock_path)
  source_for_identity(identity, lock_path)
rescue PackageSourceCacheError => e
  raise PackageSourceResolverError, e.message
end

#supports_dependency_solving?Boolean

Returns:

  • (Boolean)


182
183
184
# File 'lib/milk_tea/packages/source_resolver.rb', line 182

def supports_dependency_solving?
  @remote_resolution != :reject
end

#with_resolved_registry_versions(resolved_registry_versions) ⇒ Object



186
187
188
189
190
191
192
193
# File 'lib/milk_tea/packages/source_resolver.rb', line 186

def with_resolved_registry_versions(resolved_registry_versions)
  self.class.new(
    source_cache: @source_cache,
    remote_resolution: @remote_resolution,
    source_fetcher: @source_fetcher,
    resolved_registry_versions:,
  )
end