Class: DRG::Tasks::ActivePinner
- Inherits:
-
Object
- Object
- DRG::Tasks::ActivePinner
- Includes:
- Log
- Defined in:
- lib/drg/tasks/active_pinner.rb
Instance Attribute Summary collapse
-
#gemfile ⇒ Object
readonly
Returns the value of attribute gemfile.
-
#type ⇒ Object
readonly
Returns the value of attribute type.
-
#versions(name) ⇒ Array
A list of available versions (e.g. [‘1.2.0’, ‘1.1.0’]).
Instance Method Summary collapse
- #higher?(list, other_list) ⇒ Boolean
-
#initialize(type = :patch) ⇒ ActivePinner
constructor
A new instance of ActivePinner.
-
#latest_available_version(name, current_version) ⇒ Object
Private.
- #latest_minor_version(name, current_version) ⇒ Object
- #latest_patch_version(name, current_version) ⇒ Object
- #load_gem_versions(gems) ⇒ Object
- #load_versions(gems) ⇒ Object
- #new_versions(name, current_version) ⇒ Object
- #perform(gem_name = nil) ⇒ Object
- #update(gem_name) ⇒ Object
Methods included from 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
#gemfile ⇒ Object (readonly)
Returns the value of attribute gemfile.
6 7 8 |
# File 'lib/drg/tasks/active_pinner.rb', line 6 def gemfile @gemfile end |
#type ⇒ Object (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 |