Class: DRG::Tasks::ActivePinner

Inherits:
Object
  • Object
show all
Includes:
Log
Defined in:
lib/drg/tasks/active_pinner.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Log

log

Constructor Details

#initialize(type = :patch) ⇒ ActivePinner



10
11
12
13
14
# File 'lib/drg/tasks/active_pinner.rb', line 10

def initialize(type = :patch)
  @type = type
  @gemfile = Gemfile.new
  @versions = {}
end

Instance Attribute Details

#gemfileObject (readonly)

Returns the value of attribute gemfile.



6
7
8
# File 'lib/drg/tasks/active_pinner.rb', line 6

def gemfile
  @gemfile
end

#typeObject (readonly)

Returns the value of attribute type.



6
7
8
# File 'lib/drg/tasks/active_pinner.rb', line 6

def type
  @type
end

#versions(name) ⇒ Array



83
84
85
86
87
88
# File 'lib/drg/tasks/active_pinner.rb', line 83

def versions(name)
  @versions[name] ||= begin
    log %Q(Searching for latest #{type} version of "#{name}" ...)
    `gem query -radn ^#{name}$`.scan(/([\d.]+),/).flatten.uniq
  end
end

Instance Method Details

#higher?(list, other_list) ⇒ Boolean



103
104
105
106
# File 'lib/drg/tasks/active_pinner.rb', line 103

def higher?(list, other_list)
  gem_version_segments = (0..2).to_a
  gem_version_segments.any? { |i| list[i].to_i > other_list[i].to_i }
end

#latest_available_version(name, current_version) ⇒ Object

Private



48
49
50
# File 'lib/drg/tasks/active_pinner.rb', line 48

def latest_available_version(name, current_version)
  new_versions(name, current_version).first
end

#latest_minor_version(name, current_version) ⇒ Object



54
55
56
57
58
59
60
61
# File 'lib/drg/tasks/active_pinner.rb', line 54

def latest_minor_version(name, current_version)
  new_versions(name, current_version).select { |version|
    segments = version.scan(/\d+/)
    major = segments[0].to_i
    minor = segments[1].to_i
    minor > current_version.segments[1] && major == current_version.segments[0]
  }.first
end

#latest_patch_version(name, current_version) ⇒ Object



65
66
67
68
69
70
71
72
73
# File 'lib/drg/tasks/active_pinner.rb', line 65

def latest_patch_version(name, current_version)
  new_versions(name, current_version).select { |version|
    segments = version.scan(/\d+/)
    major = segments[0].to_i
    minor = segments[1].to_i
    patch = segments[-1].to_i
    patch > current_version.segments[-1] && minor == current_version.segments[1] && major == current_version.segments[0]
  }.first
end

#load_gem_versions(gems) ⇒ Object



96
97
98
99
# File 'lib/drg/tasks/active_pinner.rb', line 96

def load_gem_versions(gems)
  log %Q(Searching for latest #{type} version of #{gems.join(', ')} ...)
  `gem query -ra #{gems.join(' ')}`
end

#load_versions(gems) ⇒ Object



90
91
92
93
94
# File 'lib/drg/tasks/active_pinner.rb', line 90

def load_versions(gems)
  load_gem_versions(gems).scan(/^(#{Array(gems).join('|')})\s\(([\d.\s,\w\-]+)\)$/).each do |gem_name, versions|
    @versions[gem_name] = versions.to_s.split(', ').map { |x| x[/([\d.\w\-]+)/, 1] }.compact
  end
end

#new_versions(name, current_version) ⇒ Object



77
78
79
# File 'lib/drg/tasks/active_pinner.rb', line 77

def new_versions(name, current_version)
  versions(name).select { |version| higher?(version.scan(/\d+/), current_version.segments) }
end

#perform(gem_name = nil) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/drg/tasks/active_pinner.rb', line 16

def perform(gem_name = nil)
  if gem_name
    update gem_name
  else
    Updater.new.perform do |gems|
      load_versions gems
      gems.each &method(:update)
    end
  end
  log %Q(Done)
  gemfile.write if gemfile.saved_lines.any?
end

#update(gem_name) ⇒ Object

Note:

calls #latest_minor_version and #latest_patch_version



30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/drg/tasks/active_pinner.rb', line 30

def update(gem_name)
  spec = ::Bundler.locked_gems.specs.find { |spec| spec.name == gem_name }
  gem = spec && gemfile.find_by_name(spec.name)
  if gem
    latest_version = public_send("latest_#{type}_version", spec.name, spec.version)
    if latest_version
      log %Q(Updating "#{spec.name}" from #{spec.version.to_s} to #{latest_version})
      gemfile.update gem, latest_version
    else
      log %Q(No newer #{type} versions found for "#{spec.name}")
    end
  end
end