gem_check_updates 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9bf689adadc57f789149738f7ca9a8c54d0328571627e9792898add4cfeb423f
4
- data.tar.gz: 4bee81b319cab316b655299c14b3d0609b30d65484976634b1b2f3ee1a391e2e
3
+ metadata.gz: d0c947a224aae8d3c682bb9597f6f1f47b05a160e43b416d71b2bf0adb014a21
4
+ data.tar.gz: e78aaa5f5e0772f74ce9c49f4ef0e391b1197e37245635a0fe6c096ae5cd0cef
5
5
  SHA512:
6
- metadata.gz: 24d5ff434f5861b80331bf6a9f6da14f9bf531bf3375e4e5e5b6a17d2a077280d85e346092fd691bdb6efbdde2f2427b37b4ebf4ea5d83bfc483d7ee66c3adce
7
- data.tar.gz: 963dd441c11833f2343a298fdeb9224a2bd280076c8f0600bb8494abd32f9d2102691e518faab64a4410f891feb33719571aeb9d3fdd7bb620734fe20947a6a6
6
+ metadata.gz: 1f4e6d7b361f8250c3d464b26cab0b97f22e0112158f7b8cd9b8bd5df8a68d06bc761d9bb28eea55738a8be03788b67efdc7bd3f91eb00b1e2ca6095549386e9
7
+ data.tar.gz: cf6a3236dc051a4dd051cd55c37ef22480ec3779663ee1d7c6b3b060775f9091851fc7acf1d226b0a80613b8f04122e5c8302d3104443bcced1a634a314246c2
data/.rubocop.yml CHANGED
@@ -1,3 +1,5 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.5
1
3
  ClassLength:
2
4
  Enabled: false
3
5
  LineLength:
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gem_check_updates (0.0.2)
4
+ gem_check_updates (0.1.0)
5
5
  colored (~> 1.2)
6
6
  rest-client (~> 2.0)
7
7
 
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
3
5
 
data/bin/console CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'bundler/setup'
4
5
  require 'gem_check_updates'
data/exe/gcu CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'gem_check_updates'
4
5
 
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'gem_check_updates'
4
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  lib = File.expand_path('lib', __dir__)
2
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
5
  require 'gem_check_updates/version'
@@ -8,18 +10,10 @@ Gem::Specification.new do |spec|
8
10
  spec.authors = ['Yusuke Mukai']
9
11
  spec.email = ['mukopikmin@gmail.com']
10
12
 
11
- spec.summary = 'Auto update Gemfile'
12
- spec.description = 'Automatically update gems written in Gemfile'
13
+ spec.summary = 'Automatically update Gemfile'
14
+ spec.description = 'Automatically update and overwrite version of gems in Gemfile'
13
15
  spec.homepage = 'https://github.com/mukopikmin/gem_check_updates'
14
-
15
- # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
16
- # to allow pushing to a single host or delete this section to allow pushing to any host.
17
- if spec.respond_to?(:metadata)
18
- spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
19
- else
20
- raise 'RubyGems 2.0 or newer is required to protect against ' \
21
- 'public gem pushes.'
22
- end
16
+ spec.licenses = ['MIT']
23
17
 
24
18
  # Specify which files should be added to the gem when it is released.
25
19
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
data/lib/.DS_Store CHANGED
Binary file
Binary file
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GemCheckUpdates
2
- RUBYGEMS_API = 'https://rubygems.org/api/v1/versions'.freeze
4
+ RUBYGEMS_API = 'https://rubygems.org/api/v1/versions'
3
5
 
4
6
  class Gem
5
7
  attr_reader :name,
@@ -7,27 +9,53 @@ module GemCheckUpdates
7
9
  :current_version,
8
10
  :version_range
9
11
 
10
- def initialize(name: nil, current_version: nil, version_range: nil)
12
+ def initialize(name: nil,
13
+ current_version: nil,
14
+ version_range: nil,
15
+ update_scope: GemCheckUpdates::VersionScope::MAJOR)
11
16
  @name = name
12
17
  @current_version = current_version
13
18
  @version_range = version_range
14
19
 
15
- check_update!
20
+ check_update!(update_scope)
16
21
  end
17
22
 
18
23
  def update_available?
19
- !@latest_version.nil? && @current_version != '0' && @latest_version > @current_version
24
+ !@latest_version.nil? &&
25
+ !@current_version.nil? &&
26
+ @current_version != '0' &&
27
+ @latest_version > @current_version
20
28
  end
21
29
 
22
- def check_update!
23
- response = RestClient.get("#{RUBYGEMS_API}/#{name}/latest.json")
24
- version = JSON.parse(response.body)['version']
30
+ def check_update!(update_scope)
31
+ response = RestClient.get("#{RUBYGEMS_API}/#{name}.json")
32
+ versions = JSON.parse(response.body)
33
+
34
+ @latest_version = scoped_latest_version(versions, update_scope)
25
35
 
26
- @latest_version = version
27
- rescue StandardError
36
+ self
37
+ rescue StandardError => e
28
38
  @latest_version = nil
29
39
 
30
- puts "Failed to check version \"#{@name}\".".red
40
+ GemCheckUpdates::Message.out("Failed to check version \"#{@name}\".".red)
41
+ end
42
+
43
+ def scoped_latest_version(versions, scope)
44
+ numbers = versions.map { |v| v['number'] }
45
+ current_major, current_minor = @current_version.split('.')
46
+
47
+ case scope
48
+ when GemCheckUpdates::VersionScope::MINOR
49
+ numbers.select { |n| n.split('.').first == current_major }.max
50
+ when GemCheckUpdates::VersionScope::PATCH
51
+ numbers.select do |n|
52
+ major, minor = n.split('.')
53
+ major == current_major && minor == current_minor
54
+ end.max
55
+ else
56
+ # This branch is equal to specifying major updates
57
+ numbers.max
58
+ end
31
59
  end
32
60
  end
33
61
  end
@@ -1,86 +1,65 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GemCheckUpdates
2
4
  class Gemfile
3
- attr_reader :gems
5
+ attr_reader :file, :file_backup, :gems
4
6
 
5
- def initialize(file)
7
+ def initialize(file, update_scope)
6
8
  @file = file
7
- @gems = parse
8
- end
9
-
10
- def file_backup
11
- "#{@file}.backup"
9
+ @file_backup = "#{@file}.backup"
10
+ @gems = parse(update_scope)
12
11
  end
13
12
 
14
13
  def backup
15
- FileUtils.cp(@file, file_backup)
14
+ FileUtils.cp(@file, @file_backup)
16
15
  end
17
16
 
18
17
  def restore
19
- FileUtils.mv(file_backup, @file)
20
- remove_backup
18
+ FileUtils.mv(@file_backup, @file)
21
19
  end
22
20
 
23
21
  def remove_backup
24
- FileUtils.rm(file_backup)
22
+ FileUtils.rm(@file_backup)
25
23
  end
26
24
 
27
- def parse
25
+ def parse(update_scope)
28
26
  gems = Bundler::Definition.build(@file, nil, nil).dependencies.map do |gem|
29
- print '.'
27
+ GemCheckUpdates::Message.out('.')
30
28
 
31
29
  name = gem.name
32
30
  version_range, version = gem.requirements_list.first.split(' ')
33
31
 
34
32
  Gem.new(name: name,
35
33
  current_version: version,
36
- version_range: version_range)
34
+ version_range: version_range,
35
+ update_scope: update_scope)
37
36
  end
38
37
 
39
- puts
40
- puts
38
+ GemCheckUpdates::Message.out("\n\n")
41
39
 
42
40
  gems
43
41
  end
44
42
 
45
43
  def update
46
- backup
47
-
48
- File.open(file_backup) do |current|
49
- File.open(@file, 'w') do |updated|
50
- current.each_line do |line|
51
- if matcher = line.match(/gem ['"](.+?)['"]\s*,\s*['"][>=|~>]*\s+(.+?)['"]/)
52
- _, name, old_version = *matcher
53
- target = @gems.find { |gem| gem.name == name }
54
-
55
- line.gsub!(old_version, target.latest_version) unless target.nil?
56
- end
57
-
58
- updated.puts(line)
59
- end
44
+ gemfile_lines = []
45
+ File.open(@file) do |current|
46
+ current.each_line do |line|
47
+ gemfile_lines << line
60
48
  end
61
49
  end
62
50
 
63
- show_version_diff
64
- remove_backup
65
- rescue StandardError => e
66
- restore
67
- puts e.message.red
68
- end
51
+ File.open(@file, 'w') do |updated|
52
+ gemfile_lines.each do |line|
53
+ if matcher = line.match(/gem ['"](.+?)['"]\s*,\s*['"][>=|~>]*\s+(.+?)['"]/)
54
+ _, name, old_version = *matcher
55
+ target = @gems.find { |gem| gem.name == name }
69
56
 
70
- def show_version_diff
71
- puts 'Following gems can be updated.'
72
- puts 'If you want to apply these updates, run command with option \'-a\'.'
73
- puts ' (Caution: This option will overwrite your Gemfile)'.red
74
- puts
57
+ line.gsub!(old_version, target.latest_version) unless target.nil?
58
+ end
75
59
 
76
- @gems.each do |gem|
77
- if gem.update_available?
78
- puts " #{gem.name} \"#{gem.version_range} #{gem.current_version}\" → \"#{gem.version_range} #{gem.latest_version.green}\""
60
+ updated.puts(line)
79
61
  end
80
62
  end
81
-
82
- puts
83
- puts
84
63
  end
85
64
  end
86
65
  end
@@ -1,9 +1,43 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GemCheckUpdates
2
- module Message
3
- USAGE = <<-USAGE.freeze
4
- Gem Check Updates
4
+ class Message
5
+ def self.out(str)
6
+ return if ENV['RACK_ENV'] == 'test'
7
+
8
+ print str
9
+ end
10
+
11
+ def self.updatable_gems(gemfile, scope)
12
+ out <<~VERSIONS
13
+ Checking #{scope.green} updates are completed.
14
+
15
+ You can update following newer gems.
16
+ If you want to apply these updates, run command with option \'-a\'.
17
+ #{'(Caution: This option will overwrite your Gemfile)'.red}
18
+
19
+ #{gems_version_diff(gemfile)}
20
+
21
+
22
+ VERSIONS
23
+ end
24
+
25
+ def self.update_completed(gemfile, scope)
26
+ out <<~VERSIONS
27
+ Checking #{scope.green} updates are completed.
28
+
29
+ Following gems have been updated!
30
+
31
+ #{gems_version_diff(gemfile)}
32
+
33
+
34
+ VERSIONS
35
+ end
5
36
 
6
- Usage: gem-check-updates [path/to/Gemfile]
7
- USAGE
37
+ def self.gems_version_diff(gemfile)
38
+ gemfile.gems
39
+ .select(&:update_available?)
40
+ .map { |gem| " #{gem.name} \"#{gem.version_range} #{gem.current_version}\" → \"#{gem.version_range} #{gem.latest_version.green}\"" }.join("\n")
41
+ end
8
42
  end
9
43
  end
@@ -1,13 +1,26 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GemCheckUpdates
2
4
  class Runner
3
5
  def self.run(argv)
4
6
  options = parse_options(argv)
5
- gemfile = Gemfile.new(options[:file])
7
+ scope = update_scope(options)
8
+ gemfile = Gemfile.new(options[:file], scope)
6
9
 
7
10
  if options[:apply]
8
- gemfile.update
11
+ begin
12
+ gemfile.backup
13
+ gemfile.update
14
+ gemfile.remove_backup
15
+
16
+ GemCheckUpdates::Message.update_completed(gemfile, scope)
17
+ rescue StandardError => e
18
+ gemfile.restore
19
+
20
+ print e.message.red
21
+ end
9
22
  else
10
- gemfile.show_version_diff
23
+ GemCheckUpdates::Message.updatable_gems(gemfile, scope)
11
24
  end
12
25
  end
13
26
 
@@ -15,9 +28,11 @@ module GemCheckUpdates
15
28
  options = {
16
29
  file: './Gemfile',
17
30
  apply: false,
18
- # major: false,
19
- # minor: false,
20
- # patch: false
31
+ major: true,
32
+ minor: true,
33
+ patch: true
34
+ # keep_backup: false,
35
+ # verbose: false
21
36
  }
22
37
 
23
38
  OptionParser.new do |opt|
@@ -25,11 +40,36 @@ module GemCheckUpdates
25
40
 
26
41
  opt.on('-f Gemfile', '--file', "Path to Gemfile (default: #{options[:file]})") { |v| options[:file] = v }
27
42
  opt.on('-a', '--apply', "Apply updates (default: #{options[:apply]})") { |v| options[:apply] = v }
43
+ opt.on('--major', "Update major version (default: #{options[:major]})") do |v|
44
+ options[:major] = v
45
+ options[:minor] = !v
46
+ options[:patch] = !v
47
+ end
48
+ opt.on('--minor', "Update minor version (default: #{options[:minor]})") do |v|
49
+ options[:major] = !v
50
+ options[:minor] = v
51
+ options[:patch] = !v
52
+ end
53
+ opt.on('--patch', "Update patch version (default: #{options[:patch]})") do |v|
54
+ options[:major] = !v
55
+ options[:minor] = !v
56
+ options[:patch] = v
57
+ end
28
58
 
29
59
  opt.parse!(argv)
30
60
  end
31
61
 
32
62
  options
33
63
  end
64
+
65
+ def self.update_scope(options)
66
+ if !options[:major] && options[:minor]
67
+ GemCheckUpdates::VersionScope::MINOR
68
+ elsif !options[:major] && !options[:minor] && options[:patch]
69
+ GemCheckUpdates::VersionScope::PATCH
70
+ else
71
+ GemCheckUpdates::VersionScope::MAJOR
72
+ end
73
+ end
34
74
  end
35
75
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GemCheckUpdates
2
- VERSION = '0.0.2'.freeze
4
+ VERSION = '0.1.0'
3
5
  end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GemCheckUpdates
4
+ module VersionScope
5
+ MAJOR = 'major'
6
+ MINOR = 'minor'
7
+ PATCH = 'patch'
8
+ end
9
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler'
2
4
  require 'fileutils'
3
5
  require 'optparse'
@@ -6,6 +8,7 @@ require 'colored'
6
8
  require 'json'
7
9
 
8
10
  require 'gem_check_updates/version'
11
+ require 'gem_check_updates/version_scope'
9
12
  require 'gem_check_updates/message'
10
13
  require 'gem_check_updates/gemfile'
11
14
  require 'gem_check_updates/gem'
data/run.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require './lib/gem_check_updates'
2
4
 
3
5
  GemCheckUpdates::Runner.run(ARGV)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gem_check_updates
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yusuke Mukai
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-09-12 00:00:00.000000000 Z
11
+ date: 2018-09-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -108,7 +108,7 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '2.0'
111
- description: Automatically update gems written in Gemfile
111
+ description: Automatically update and overwrite version of gems in Gemfile
112
112
  email:
113
113
  - mukopikmin@gmail.com
114
114
  executables:
@@ -132,16 +132,18 @@ files:
132
132
  - gem_check_updates.gemspec
133
133
  - lib/.DS_Store
134
134
  - lib/gem_check_updates.rb
135
+ - lib/gem_check_updates/.DS_Store
135
136
  - lib/gem_check_updates/gem.rb
136
137
  - lib/gem_check_updates/gemfile.rb
137
138
  - lib/gem_check_updates/message.rb
138
139
  - lib/gem_check_updates/runner.rb
139
140
  - lib/gem_check_updates/version.rb
141
+ - lib/gem_check_updates/version_scope.rb
140
142
  - run.rb
141
143
  homepage: https://github.com/mukopikmin/gem_check_updates
142
- licenses: []
143
- metadata:
144
- allowed_push_host: 'TODO: Set to ''http://mygemserver.com'''
144
+ licenses:
145
+ - MIT
146
+ metadata: {}
145
147
  post_install_message:
146
148
  rdoc_options: []
147
149
  require_paths:
@@ -161,5 +163,5 @@ rubyforge_project:
161
163
  rubygems_version: 2.7.7
162
164
  signing_key:
163
165
  specification_version: 4
164
- summary: Auto update Gemfile
166
+ summary: Automatically update Gemfile
165
167
  test_files: []