PHP 8.2.31
Preview: spec_set.rb Size: 4.87 KB
/proc/thread-self/root/opt/alt/ruby31/share/gems/gems/bundler-2.3.27/lib/bundler/spec_set.rb

# frozen_string_literal: true

require_relative "vendored_tsort"

module Bundler
  class SpecSet
    include Enumerable
    include TSort

    attr_reader :incomplete_specs

    def initialize(specs, incomplete_specs = [])
      @specs = specs
      @incomplete_specs = incomplete_specs
    end

    def for(dependencies, check = false, platforms = [nil])
      handled = ["bundler"].product(platforms).map {|k| [k, true] }.to_h
      deps = dependencies.product(platforms)
      specs = []

      loop do
        break unless dep = deps.shift

        name = dep[0].name
        platform = dep[1]

        key = [name, platform]
        next if handled.key?(key)

        handled[key] = true

        specs_for_dep = specs_for_dependency(*dep)
        if specs_for_dep.any?
          specs.concat(specs_for_dep)

          specs_for_dep.first.dependencies.each do |d|
            next if d.type == :development
            deps << [d, dep[1]]
          end
        elsif check
          @incomplete_specs += lookup[name]
        end
      end

      specs
    end

    def [](key)
      key = key.name if key.respond_to?(:name)
      lookup[key].reverse
    end

    def []=(key, value)
      @specs << value
      @lookup = nil
      @sorted = nil
    end

    def delete(spec)
      @specs.delete(spec)
      @lookup = nil
      @sorted = nil
    end

    def sort!
      self
    end

    def to_a
      sorted.dup
    end

    def to_hash
      lookup.dup
    end

    def materialize(deps)
      materialized = self.for(deps, true)

      SpecSet.new(materialized, incomplete_specs)
    end

    # Materialize for all the specs in the spec set, regardless of what platform they're for
    # This is in contrast to how for does platform filtering (and specifically different from how `materialize` calls `for` only for the current platform)
    # @return [Array<Gem::Specification>]
    def materialized_for_all_platforms
      @specs.map do |s|
        next s unless s.is_a?(LazySpecification)
        s.source.remote!
        spec = s.materialize_for_installation
        raise GemNotFound, "Could not find #{s.full_name} in any of the sources" unless spec
        spec
      end
    end

    def incomplete_ruby_specs?(deps)
      self.for(deps, true, [Gem::Platform::RUBY])

      @incomplete_specs.any?
    end

    def missing_specs
      @specs.select {|s| s.is_a?(LazySpecification) }
    end

    def merge(set)
      arr = sorted.dup
      set.each do |set_spec|
        full_name = set_spec.full_name
        next if arr.any? {|spec| spec.full_name == full_name }
        arr << set_spec
      end
      SpecSet.new(arr)
    end

    def -(other)
      SpecSet.new(to_a - other.to_a)
    end

    def find_by_name_and_platform(name, platform)
      @specs.detect {|spec| spec.name == name && spec.match_platform(platform) }
    end

    def delete_by_name_and_version(name, version)
      @specs.reject! {|spec| spec.name == name && spec.version == version }
      @lookup = nil
      @sorted = nil
    end

    def what_required(spec)
      unless req = find {|s| s.dependencies.any? {|d| d.type == :runtime && d.name == spec.name } }
        return [spec]
      end
      what_required(req) << spec
    end

    def <<(spec)
      @specs << spec
    end

    def length
      @specs.length
    end

    def size
      @specs.size
    end

    def empty?
      @specs.empty?
    end

    def each(&b)
      sorted.each(&b)
    end

    private

    def sorted
      rake = @specs.find {|s| s.name == "rake" }
      begin
        @sorted ||= ([rake] + tsort).compact.uniq
      rescue TSort::Cyclic => error
        cgems = extract_circular_gems(error)
        raise CyclicDependencyError, "Your bundle requires gems that depend" \
          " on each other, creating an infinite loop. Please remove either" \
          " gem '#{cgems[1]}' or gem '#{cgems[0]}' and try again."
      end
    end

    def extract_circular_gems(error)
      error.message.scan(/@name="(.*?)"/).flatten
    end

    def lookup
      @lookup ||= begin
        lookup = Hash.new {|h, k| h[k] = [] }
        @specs.each do |s|
          lookup[s.name] << s
        end
        lookup
      end
    end

    def tsort_each_node
      # MUST sort by name for backwards compatibility
      @specs.sort_by(&:name).each {|s| yield s }
    end

    def specs_for_dependency(dep, platform)
      specs_for_name = lookup[dep.name]
      if platform.nil?
        matching_specs = specs_for_name.map {|s| s.materialize_for_installation if Gem::Platform.match_spec?(s) }.compact
        GemHelpers.sort_best_platform_match(matching_specs, Bundler.local_platform)
      else
        GemHelpers.select_best_platform_match(specs_for_name, dep.force_ruby_platform ? Gem::Platform::RUBY : platform)
      end
    end

    def tsort_each_child(s)
      s.dependencies.sort_by(&:name).each do |d|
        next if d.type == :development
        lookup[d.name].each {|s2| yield s2 }
      end
    end
  end
end

Directory Contents

Dirs: 12 × Files: 70

Name Size Perms Modified Actions
cli DIR
- drwxr-xr-x 2025-05-13 07:35:07
Edit Download
- drwxr-xr-x 2025-05-13 07:35:07
Edit Download
fetcher DIR
- drwxr-xr-x 2025-05-13 07:35:07
Edit Download
installer DIR
- drwxr-xr-x 2025-05-13 07:35:07
Edit Download
man DIR
- drwxr-xr-x 2025-05-13 07:35:07
Edit Download
plugin DIR
- drwxr-xr-x 2025-05-13 07:35:07
Edit Download
resolver DIR
- drwxr-xr-x 2025-05-13 07:35:07
Edit Download
settings DIR
- drwxr-xr-x 2025-05-13 07:35:07
Edit Download
source DIR
- drwxr-xr-x 2025-05-13 07:35:07
Edit Download
templates DIR
- drwxr-xr-x 2025-05-13 07:35:07
Edit Download
ui DIR
- drwxr-xr-x 2025-05-13 07:35:07
Edit Download
vendor DIR
- drwxr-xr-x 2025-04-28 17:36:04
Edit Download
1.20 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
883 B lrw-r--r-- 2025-04-28 17:36:06
Edit Download
38.91 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
3.36 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
212 B lrw-r--r-- 2025-04-28 17:36:06
Edit Download
2.41 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
29.86 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
3.09 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
3.19 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
876 B lrw-r--r-- 2025-04-28 17:36:06
Edit Download
2.17 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
19.97 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
3.73 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
5.02 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
1.94 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
5.36 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
1.86 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
11.05 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
3.99 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
6.93 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
4.08 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
138 B lrw-r--r-- 2025-04-28 17:36:06
Edit Download
6.00 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
4.99 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
4.51 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
10.08 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
2.55 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
10.65 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
5.30 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
2.17 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
7.02 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
290 B lrw-r--r-- 2025-04-28 17:36:06
Edit Download
583 B lrw-r--r-- 2025-04-28 17:36:06
Edit Download
863 B lrw-r--r-- 2025-04-28 17:36:06
Edit Download
5.82 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
11.25 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
686 B lrw-r--r-- 2025-04-28 17:36:06
Edit Download
3.83 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
13.33 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
1.61 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
10.46 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
5.21 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
15.94 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
760 B lrw-r--r-- 2025-04-28 17:36:06
Edit Download
4.20 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
10.30 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
4.76 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
13.41 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
776 B lrw-r--r-- 2025-04-28 17:36:06
Edit Download
10.69 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
1.84 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
3.04 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
6.04 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
2.17 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
4.87 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
2.79 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
255 B lrw-r--r-- 2025-04-28 17:36:06
Edit Download
1.28 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
101 B lrw-r--r-- 2025-04-28 17:36:06
Edit Download
101 B lrw-r--r-- 2025-04-28 17:36:06
Edit Download
1.44 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
180 B lrw-r--r-- 2025-04-28 17:36:06
Edit Download
95 B lrw-r--r-- 2025-04-28 17:36:06
Edit Download
93 B lrw-r--r-- 2025-04-28 17:36:06
Edit Download
89 B lrw-r--r-- 2025-04-28 17:36:06
Edit Download
180 B lrw-r--r-- 2025-04-28 17:36:06
Edit Download
3.80 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
468 B lrw-r--r-- 2025-04-28 17:36:06
Edit Download
2.89 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download
2.36 KB lrw-r--r-- 2025-04-28 17:36:06
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).