Class: Paquet::Gem

Inherits:
Object
  • Object
show all
Defined in:
lib/paquet/gem.rb

Constant Summary collapse

RUBYGEMS_URI =
"https://rubygems.org/downloads"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(target_path, cache = nil) ⇒ Gem

Returns a new instance of Gem.



12
13
14
15
16
17
# File 'lib/paquet/gem.rb', line 12

def initialize(target_path, cache = nil)
  @target_path = target_path
  @gems = []
  @ignores = []
  @cache = cache
end

Instance Attribute Details

#gemsObject (readonly)

Returns the value of attribute gems.



10
11
12
# File 'lib/paquet/gem.rb', line 10

def gems
  @gems
end

#ignoresObject (readonly)

Returns the value of attribute ignores.



10
11
12
# File 'lib/paquet/gem.rb', line 10

def ignores
  @ignores
end

Instance Method Details

#add(name) ⇒ Object



19
20
21
# File 'lib/paquet/gem.rb', line 19

def add(name)
  @gems << name
end

#collect_required_gemsObject



75
76
77
78
79
80
81
# File 'lib/paquet/gem.rb', line 75

def collect_required_gems()
  candidates = []
  @gems.each do |name|
    candidates += resolve_dependencies(name)
  end
  candidates.flatten
end

#download_gem(gem_name) ⇒ Object



101
102
103
104
105
106
107
# File 'lib/paquet/gem.rb', line 101

def download_gem(gem_name)
  source = "#{RUBYGEMS_URI}/#{gem_name}"
  destination = File.join(@target_path, gem_name)

  Paquet::ui.info("Vendoring: #{gem_name}, downloading: #{source}")
  Paquet::Utils::download_file(source, destination)
end

#find_in_cache(gem_name) ⇒ Object



62
63
64
65
# File 'lib/paquet/gem.rb', line 62

def find_in_cache(gem_name)
  filename = File.join(@cache, gem_name)
  File.exist?(filename) ? filename : nil
end

#gem_full_name(gem) ⇒ Object



97
98
99
# File 'lib/paquet/gem.rb', line 97

def gem_full_name(gem)
  gem.ruby? ? "#{gem.name}-#{gem.version}.gem" : "#{gem.name}-#{gem.version}-#{gem.platform}.gem" 
end

#ignore(name) ⇒ Object



23
24
25
# File 'lib/paquet/gem.rb', line 23

def ignore(name)
  @ignores << name
end

#ignore?(name) ⇒ Boolean

Returns:

  • (Boolean)


71
72
73
# File 'lib/paquet/gem.rb', line 71

def ignore?(name)
  ignores.include?(name)
end

#packObject



27
28
29
30
31
32
33
34
# File 'lib/paquet/gem.rb', line 27

def pack
  Paquet::ui.info("Cleaning existing target path: #{@target_path}")

  FileUtils.rm_rf(@target_path)
  FileUtils.mkdir_p(@target_path)

  package_gems(collect_required_gems)
end

#package_gems(collect_required_gems) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/paquet/gem.rb', line 36

def package_gems(collect_required_gems)
  gems_to_package = collect_required_gems
    .collect { |gem| gem_full_name(gem) }
    .uniq

  if use_cache?
    gems_to_package.each do |gem_name|
      if gem_file = find_in_cache(gem_name)
        destination = File.join(@target_path, File.basename(gem_file))
        FileUtils.cp(gem_file, destination)
        Paquet::ui.info("Vendoring: #{gem_name}, from cache: #{gem_file}")
      else
        download_gem(gem_name)
      end
    end
  else
    gems_to_package.each do |gem_name|
      download_gem(gem_name)
    end
  end
end

#resolve_dependencies(name) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/paquet/gem.rb', line 83

def resolve_dependencies(name)
  return [] if ignore?(name)

  spec = ::Gem::Specification.find_by_name(name)
  current_dependency = Dependency.new(name, spec.version, spec.platform)
  dependencies = spec.dependencies.select { |dep| dep.type == :runtime }

  if dependencies.size == 0
    [current_dependency]
  else
    [dependencies.collect { |spec| resolve_dependencies(spec.name) }, current_dependency].flatten.uniq { |s| s.name }
  end
end

#sizeObject



67
68
69
# File 'lib/paquet/gem.rb', line 67

def size
  @gems.size
end

#use_cache?Boolean

Returns:

  • (Boolean)


58
59
60
# File 'lib/paquet/gem.rb', line 58

def use_cache?
  @cache
end