gem_updater 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 450b2b72c1a8ace63fda766586ee7e90d66d5c5a
4
- data.tar.gz: 83d0becf23be2779086cdae8ec475e4a8f057aca
3
+ metadata.gz: b8bef24cd913cd7aea6272eecf19cb98666fc6b4
4
+ data.tar.gz: 8470997ff32cfdc1ab6473cc18fbcdc4873a0725
5
5
  SHA512:
6
- metadata.gz: dfe5ff962dd80f9437412b012d9a1c12e0630bc376af02732d5d1e34a9095629534cef0aee91261790fb9532eba8180546cb67ded78fe448e56c23bce931e98f
7
- data.tar.gz: fffe210127cb9691c315bd9545ffc83f461382edf4b669fc82cdb86a42b5447d66674d25db14483a5f189f63a83836b92e380ec529edc50d2b852823cf474767
6
+ metadata.gz: 1a305a247455c268d03570f35616bfa0a93a9cba56ff4b8d00987e24342e1f805d0a985aeec0224ecc5927d390de3e01fa48c6527009952d0a88b86f1c4fab2b
7
+ data.tar.gz: dbb800a2a74db5493e159ef70ba2b35c52aa42f49596b1ba32003e6b197690bf9f23610b5fb66480c91daa031aee297aefdedc5e22c1ba1cbee02d1f891754b7
@@ -5,30 +5,54 @@ module GemUpdater
5
5
  # GemFile is responsible for handling `Gemfile`
6
6
  class GemFile
7
7
  attr_accessor :changes
8
+ attr_reader :old_spec_set, :new_spec_set
8
9
 
9
10
  def initialize
10
- @old_spec_set = Bundler.definition.specs
11
- @changes = {}
11
+ @changes = {}
12
12
  end
13
13
 
14
14
  # Run `bundle update` to update gems.
15
- # Then get new spec set.
16
15
  def update!
17
16
  puts "Updating gems..."
18
17
  Bundler::CLI.start( [ 'update' ] )
19
- @new_spec_set = Bundler.definition.specs
20
- compute_changes
21
18
  end
22
19
 
23
20
  # Compute the diffs between two `Gemfile.lock`.
24
21
  #
25
22
  # @return [Hash] gems for which there are differences.
26
23
  def compute_changes
27
- @old_spec_set.each do |gem_specs|
28
- unless ( old_version = gem_specs.version ) == ( new_version = @new_spec_set[ gem_specs.name ].first.version )
29
- @changes[ gem_specs.name ] = { versions: { old: old_version.to_s, new: new_version.to_s } }
24
+ get_spec_sets
25
+
26
+ old_spec_set.each do |old_gem|
27
+ if updated_gem = new_spec_set.find{ |new_gem| new_gem.name == old_gem.name }
28
+ unless old_gem.version == updated_gem.version
29
+ changes[ old_gem.name ] = { versions: { old: old_gem.version.to_s, new: updated_gem.version.to_s }, source: updated_gem.source }
30
+ end
30
31
  end
31
32
  end
32
33
  end
34
+
35
+ private
36
+
37
+ # Get the two spec sets (before and after `bundle update`)
38
+ def get_spec_sets
39
+ @old_spec_set = spec_set
40
+ reinitialize_spec_set!
41
+ @new_spec_set = spec_set
42
+ end
43
+
44
+ # Get the current spec set
45
+ #
46
+ # @return [Array] array of Bundler::LazySpecification (including gem name, version and source)
47
+ def spec_set
48
+ Bundler.locked_gems.specs
49
+ end
50
+
51
+ # Calling `Bundler.locked_gems` before or after a `bundler update`
52
+ # will return the same result.
53
+ # Use a hacky way to tell bundle we want to parse the new `Gemfile.lock`
54
+ def reinitialize_spec_set!
55
+ Bundler.remove_instance_variable( "@locked_gems" )
56
+ end
33
57
  end
34
58
  end
@@ -6,29 +6,78 @@ module GemUpdater
6
6
 
7
7
  # RubyGemsFetcher is a wrapper around rubygems API.
8
8
  class RubyGemsFetcher
9
+ attr_reader :gem_name, :source
9
10
 
10
11
  # @param gem_name [String] name of the gem
11
- def initialize( gem_name )
12
+ # @param source [Bundler::Source] source of gem
13
+ def initialize( gem_name, source )
12
14
  @gem_name = gem_name
15
+ @source = source
13
16
  end
14
17
 
15
18
  # Finds where code is hosted.
16
- # Most likely in will be in 'source_code_uri' or 'homepage_uri'
19
+ # Most likely in will be on rubygems, else look in other sources.
17
20
  #
18
- # @return [String] url of gem source code
21
+ # @return [String|nil] url of gem source code
19
22
  def source_uri
20
- information[ "source_code_uri" ] || information[ "homepage_uri" ]
23
+ uri_from_rubygems || uri_from_other_sources
21
24
  end
22
25
 
23
26
  private
24
27
 
25
- # Obtain information about a given gem
26
- # from rubygems.org.
28
+ # Ask rubygems.org for source uri of gem.
27
29
  # See API: http://guides.rubygems.org/rubygems-org-api/#gem-methods
28
30
  #
29
- # @return [Hash] parse of json information
30
- def information
31
- @information ||= JSON.parse( open( "https://rubygems.org/api/v1/gems/#{@gem_name}.json" ).read )
31
+ # @return [String|nil] uri of source code
32
+ def uri_from_rubygems
33
+ return unless source.remotes.map( &:host ).include?( 'rubygems.org' )
34
+
35
+ response = begin
36
+ JSON.parse( open( "https://rubygems.org/api/v1/gems/#{gem_name}.json" ).read )
37
+ rescue OpenURI::HTTPError
38
+ end
39
+
40
+ if response
41
+ response[ "source_code_uri" ] || response[ "homepage_uri" ]
42
+ end
43
+ end
44
+
45
+ # Look if gem can be found in another remote
46
+ #
47
+ # @return [String|nil] uri of source code
48
+ def uri_from_other_sources
49
+ uri = nil
50
+ source.remotes.each do |remote|
51
+ break if uri
52
+
53
+ uri = case remote.host
54
+ when 'rubygems.org' then next # already checked
55
+ when 'rails-assets.org'
56
+ uri_from_railsassets
57
+ else
58
+ puts "Source #{remote} is not supported, feel free to open a PR or an issue on https://github.com/MaximeD/gem_updater"
59
+ end
60
+ end
61
+
62
+ uri
63
+ end
64
+
65
+ # Ask rails-assets.org for source uri of gem.
66
+ # API is at : https://rails-assets.org/packages/package_name
67
+ #
68
+ # @return [String|nil] uri of source code
69
+ def uri_from_railsassets
70
+ begin
71
+ response = JSON.parse( open( "https://rails-assets.org/packages/#{gem_name.gsub( /rails-assets-/, '' )}" ).read )
72
+ rescue JSON::ParserError
73
+ # if gem is not found, rails-assets returns a 200
74
+ # with html (instead of json) containing a 500...
75
+ rescue OpenURI::HTTPError
76
+ end
77
+
78
+ if response
79
+ response[ "url" ].gsub( /^git/, 'http' )
80
+ end
32
81
  end
33
82
  end
34
83
  end
data/lib/gem_updater.rb CHANGED
@@ -3,7 +3,11 @@ require 'gem_updater/ruby_gems_fetcher'
3
3
  require 'gem_updater/source_page_parser'
4
4
 
5
5
  module GemUpdater
6
+
7
+ # Updater's main responsability is to fill changes happened before and after update
8
+ # of `Gemfile`, and then format them.
6
9
  class Updater
10
+ attr_accessor :gemfile
7
11
 
8
12
  def initialize
9
13
  @gemfile = GemUpdater::GemFile.new
@@ -14,26 +18,43 @@ module GemUpdater
14
18
  # 1. update gemfile
15
19
  # 2. find changelogs for updated gems
16
20
  def update!
17
- @gemfile.update!
21
+ gemfile.update!
22
+ gemfile.compute_changes
23
+
18
24
 
19
- @gemfile.changes.each do |gem_name, details|
20
- source_uri = GemUpdater::RubyGemsFetcher.new( gem_name ).source_uri
21
- source_page = GemUpdater::SourcePageParser.new( url: source_uri, version: details[ :versions ][ :new ] )
25
+ gemfile.changes.each do |gem_name, details|
26
+ if source_uri = find_source( gem_name, details[ :source ] )
27
+ source_page = GemUpdater::SourcePageParser.new( url: source_uri, version: details[ :versions ][ :new ] )
22
28
 
23
- @gemfile.changes[ gem_name ][ :changelog ] = source_page.changelog if source_page.changelog
29
+ gemfile.changes[ gem_name ][ :changelog ] = source_page.changelog if source_page.changelog
30
+ end
24
31
  end
25
32
  end
26
33
 
27
34
  # Format the diff to get human readable information
28
35
  # on the gems that were updated.
29
36
  def format_diff
30
- @gemfile.changes.each do |gem, details|
37
+ gemfile.changes.each do |gem, details|
31
38
  puts ERB.new( template, nil, '<>' ).result( binding )
32
39
  end
33
40
  end
34
41
 
35
42
  private
36
43
 
44
+ # Find where is hosted the source of a gem
45
+ #
46
+ # @param gem [String] the name of the gem
47
+ # @param source [Bundler::Source] gem's source
48
+ # @return [String] url where gem is hosted
49
+ def find_source( gem, source )
50
+ case source
51
+ when Bundler::Source::Rubygems
52
+ GemUpdater::RubyGemsFetcher.new( gem, source ).source_uri
53
+ when Bundler::Source::Git
54
+ source.uri.gsub( /^git/, 'http' ).chomp( '.git' )
55
+ end
56
+ end
57
+
37
58
  # Get the template for gem's diff.
38
59
  # It can use a custom template.
39
60
  #
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gem_updater
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maxime Demolin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-31 00:00:00.000000000 Z
11
+ date: 2015-04-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,8 +66,8 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '3.0'
69
- description: It updates the gems of your Gemfile and fetches the links pointing to
70
- where their changelogs are
69
+ description: Updates the gems of your Gemfile and fetches the links pointing to where
70
+ their changelogs are
71
71
  email: akbarova.armia@gmail.com
72
72
  executables:
73
73
  - gem_update