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 +4 -4
- data/lib/gem_updater/gem_file.rb +32 -8
- data/lib/gem_updater/ruby_gems_fetcher.rb +58 -9
- data/lib/gem_updater.rb +27 -6
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b8bef24cd913cd7aea6272eecf19cb98666fc6b4
|
4
|
+
data.tar.gz: 8470997ff32cfdc1ab6473cc18fbcdc4873a0725
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1a305a247455c268d03570f35616bfa0a93a9cba56ff4b8d00987e24342e1f805d0a985aeec0224ecc5927d390de3e01fa48c6527009952d0a88b86f1c4fab2b
|
7
|
+
data.tar.gz: dbb800a2a74db5493e159ef70ba2b35c52aa42f49596b1ba32003e6b197690bf9f23610b5fb66480c91daa031aee297aefdedc5e22c1ba1cbee02d1f891754b7
|
data/lib/gem_updater/gem_file.rb
CHANGED
@@ -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
|
-
@
|
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
|
-
|
28
|
-
|
29
|
-
|
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
|
-
|
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
|
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
|
-
|
23
|
+
uri_from_rubygems || uri_from_other_sources
|
21
24
|
end
|
22
25
|
|
23
26
|
private
|
24
27
|
|
25
|
-
#
|
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 [
|
30
|
-
def
|
31
|
-
|
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
|
-
|
21
|
+
gemfile.update!
|
22
|
+
gemfile.compute_changes
|
23
|
+
|
18
24
|
|
19
|
-
|
20
|
-
source_uri
|
21
|
-
|
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
|
-
|
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
|
-
|
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.
|
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-
|
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:
|
70
|
-
|
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
|