Class: GemUpdater
Instance Attribute Summary collapse
-
#app ⇒ Object
Returns the value of attribute app.
-
#gem ⇒ Object
Returns the value of attribute gem.
-
#settings ⇒ Object
Returns the value of attribute settings.
Class Method Summary collapse
- .fetch_remote_gems ⇒ Object
- .flush_cache(changed_gems) ⇒ Object
- .pick_best_versions(versions) ⇒ Object
- .update_remote_gems(display: false) ⇒ Object
Instance Method Summary collapse
-
#flush_cache ⇒ Object
TODO: improve this cache invalidation to be version specific.
-
#initialize(app, name, version, platform = 'ruby') ⇒ GemUpdater
constructor
A new instance of GemUpdater.
- #register ⇒ Object
Constructor Details
#initialize(app, name, version, platform = 'ruby') ⇒ GemUpdater
Returns a new instance of GemUpdater.
112 113 114 115 116 |
# File 'lib/gem_updater.rb', line 112 def initialize(app, name, version, platform='ruby') self.settings = app.settings self.app = app self.gem = GemVersion.new(name, version, platform) end |
Instance Attribute Details
#app ⇒ Object
Returns the value of attribute app.
22 23 24 |
# File 'lib/gem_updater.rb', line 22 def app @app end |
#gem ⇒ Object
Returns the value of attribute gem.
22 23 24 |
# File 'lib/gem_updater.rb', line 22 def gem @gem end |
#settings ⇒ Object
Returns the value of attribute settings.
22 23 24 |
# File 'lib/gem_updater.rb', line 22 def settings @settings end |
Class Method Details
.fetch_remote_gems ⇒ Object
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/gem_updater.rb', line 25 def fetch_remote_gems spec_fetcher = if $CONFIG.gem_source Gem::SpecFetcher.new(Gem::SourceList.from([Gem::Source.new($CONFIG.gem_source)])) else Gem::SpecFetcher.fetcher end libs = {} if Gem::VERSION < '2.0' spec_fetcher.list(true).values.flatten(1).each do |info| (libs[info[0]] ||= []) << GemVersion.new(*info) end else # RubyGems 2.x API spec_fetcher.available_specs(:released).first.values.flatten(1).each do |tuple| (libs[tuple.name] ||= []) << GemVersion.new(tuple.name, tuple.version, tuple.platform) end end libs end |
.flush_cache(changed_gems) ⇒ Object
99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/gem_updater.rb', line 99 def flush_cache(changed_gems) index_map = {} changed_gems.keys.each do |gem_name| index_map[gem_name[0, 1]] = true end Cache.invalidate("/gems", *index_map.keys.map {|k| "/gems/~#{k}" }) changed_gems.keys.each_slice(50) do |list| Cache.invalidate(*list.map {|k| "/gems/#{k}" }) end end |
.pick_best_versions(versions) ⇒ Object
89 90 91 92 93 94 95 96 97 |
# File 'lib/gem_updater.rb', line 89 def pick_best_versions(versions) seen = {} uniqversions = [] versions.each do |ver| uniqversions |= [ver.version] (seen[ver.version] ||= []).send(ver.platform == "ruby" ? :unshift : :push, ver) end uniqversions.map {|v| seen[v].first.to_s } end |
.update_remote_gems(display: false) ⇒ Object
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
# File 'lib/gem_updater.rb', line 46 def update_remote_gems(display: false) puts ">> Updating remote RubyGems..." if display libs = fetch_remote_gems store = GemStore.new changed_gems = {} removed_gems = [] RemoteGem.all.each do |row| changed_gems[row.name] = row.versions.split(' ') end RemoteGem.db.transaction do libs.each do |name, versions| versions = pick_best_versions(versions) if changed_gems[name] && changed_gems[name].size == versions.size changed_gems.delete(name) elsif changed_gems[name] store[name] = versions else RemoteGem.create(name: name, versions: VersionSorter.sort(versions).join(" ")) end end end flush_cache(changed_gems) result = [changed_gems, removed_gems] if display if changed_gems.size > 0 puts ">> Updated #{changed_gems.size} gems:" puts changed_gems.keys.join(', ') end if removed_gems.size > 0 puts ">> Removed #{removed_gems.size} gems:" puts removed_gems.join(', ') end end result end |
Instance Method Details
#flush_cache ⇒ Object
TODO: improve this cache invalidation to be version specific
126 127 128 |
# File 'lib/gem_updater.rb', line 126 def flush_cache self.class.flush_cache(gem.name) end |
#register ⇒ Object
118 119 120 121 122 123 |
# File 'lib/gem_updater.rb', line 118 def register puts "Registering gem #{gem.name}-#{gem.version}" store = GemStore.new libs = (store[gem.name] || []).map {|v| v.version } store[gem.name] = libs | [gem.version] end |