gemrat 0.3.2 → 0.4.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
  SHA1:
3
- metadata.gz: 12c519e8843ff83e9c409538d14eb9b90e8c740a
4
- data.tar.gz: 28e94705f4c27d6a8a450d803c3d97bb3ec675f7
3
+ metadata.gz: e20de748b67ae7e24e0253f185ea2456905062cb
4
+ data.tar.gz: 0c08f1cce68b55d0a9eae1bd09597a3a0bc16eea
5
5
  SHA512:
6
- metadata.gz: b3436f05fca306f683cc20a301d0fa616bf78f7b1e91a3db7ee9db998eff6d0ad32f34b0795f49b5bac46ae8b082a1fc996f70e36e4fb22e2cf6bf15b6c2d17a
7
- data.tar.gz: b08811612a2fb94509b5f32e2b12244c07558ae4dbcb659b67da84725fa16a39907a101906b4b6a10c68f0998efed89caa6e99fdf90929f2cddef0546a38bf61
6
+ metadata.gz: 3fc01ff951da73ce863dd29f79a5306a062b1eef46c41e317571f1bb5e4a992d3dcdadc3502a30e031cf4e083b9c0b15bd41b59ff7b6384ca5e476413fee9f9b
7
+ data.tar.gz: 439308f085e60b6ecfbf35ad478e8879a391b7a5623c1ca0ed9a2c3b120d62517c69f28a947194fc112c33aabee7e7d6389cdb68a8edd6b0c7989917030c20d9
data/.gitignore CHANGED
@@ -5,3 +5,4 @@ design.txt
5
5
  Gemfile.lock
6
6
  .ruby-gemset
7
7
  .ruby-version
8
+ /tmp
@@ -0,0 +1,9 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'rspec' do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/gemrat_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+ end
9
+
data/README.md CHANGED
@@ -6,16 +6,12 @@ Add the latest version of a gem to your Gemfile from the command line.
6
6
  * No need to edit your Gemfile directly
7
7
  * Gemrat bundles automatically
8
8
 
9
- <br/>
10
-
11
9
  ## Usage
12
- Add the latest version of a gem to your Gemfile and bundle. Formated: (gem 'name', 'version')
10
+ Add the latest version of a gem to your Gemfile and bundle
13
11
  <pre>
14
12
  $ gemrat gem_name
15
13
  </pre>
16
14
 
17
- <br/>
18
-
19
15
  Add the latest version of sinatra to your Gemfile and bundle
20
16
  <pre>
21
17
  $ gemrat sinatra
@@ -24,7 +20,6 @@ $ gemrat sinatra
24
20
  #=> Bundling...
25
21
  </pre>
26
22
 
27
- <br/>
28
23
  Add multiple gems
29
24
  <pre>
30
25
  $ gemrat rspec capybara sidekiq
@@ -35,11 +30,7 @@ $ gemrat rspec capybara sidekiq
35
30
  #=> Bundling...
36
31
  </pre>
37
32
 
38
- <br/>
39
-
40
-
41
33
  Get help
42
-
43
34
  <pre>
44
35
  $ gemrat --help OR gemrat -h
45
36
 
@@ -58,7 +49,6 @@ Options:
58
49
 
59
50
  ![gemrat](http://i.qkme.me/3ut4r1.jpg)
60
51
 
61
- <br/>
62
52
  ## Installation
63
53
 
64
54
  Add this line to your application's Gemfile:
@@ -73,12 +63,18 @@ Or install it yourself as:
73
63
 
74
64
  $ gem install gemrat
75
65
 
76
- <br/>
77
-
78
66
  ## Development
79
67
 
80
- Run the test suite with:
68
+ Run the entire test suite with:
81
69
 
82
70
  <pre>
83
71
  $ rake
84
72
  </pre>
73
+
74
+ We encourage you to run
75
+
76
+ <pre>
77
+ $ guard
78
+ </pre>
79
+
80
+ in development, because it's awesome!
@@ -6,7 +6,7 @@ require 'gemrat/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "gemrat"
8
8
  spec.version = Gemrat::VERSION
9
- spec.authors = ["Dru Riley", "Hrvoje Simic"]
9
+ spec.authors = ["Dru Riley", "Hrvoje Simic", "Marko Ivanek"]
10
10
  spec.email = ["dru@drurly.com", "shime.ferovac@gmail.com"]
11
11
  spec.description = "Add the latest version of a gem to your Gemfile from the command line."
12
12
  spec.summary = "Add the latest version of a gem to your Gemfile from the command line."
@@ -24,4 +24,5 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency "rake"
25
25
  spec.add_development_dependency "rspec"
26
26
  spec.add_development_dependency "pry"
27
+ spec.add_development_dependency "guard-rspec"
27
28
  end
@@ -1,21 +1,19 @@
1
+ require "ostruct"
2
+ require "optparse"
3
+ require "pry"
4
+
1
5
  require "gemrat/version"
2
6
  require "gemrat/messages"
3
7
  require "gemrat/runner"
4
8
  require "gemrat/arguments"
9
+ require "gemrat/gem"
10
+ require "gemrat/gemfile"
11
+
5
12
  require "colored"
13
+ require "rbconfig"
6
14
 
7
15
  module Gemrat
8
16
  class GemNotFound < StandardError; end
9
- class Gem < Struct.new(:name, :valid)
10
- alias_method :valid?, :valid
11
-
12
- def initialize(*args)
13
- super
14
- self.valid = true
15
- end
16
17
 
17
- def invalid!
18
- self.valid = false
19
- end
20
- end
18
+ SYSTEM = RbConfig::CONFIG["host_os"]
21
19
  end
@@ -1,6 +1,8 @@
1
1
  module Gemrat
2
2
  class Arguments
3
- ATTRIBUTES = [:gem_names, :gemfile]
3
+ class PrintHelp < StandardError; end
4
+
5
+ ATTRIBUTES = [:gems, :gemfile, :options]
4
6
 
5
7
  ATTRIBUTES.each { |arg| attr_accessor arg }
6
8
 
@@ -8,34 +10,73 @@ module Gemrat
8
10
  def initialize(*args)
9
11
  self.arguments = *args
10
12
 
11
- validate
12
-
13
- extract_options
13
+ parse_options
14
14
  end
15
15
 
16
- def gem_names
17
- arguments.take_while { |arg| arg !~ /^-|^--/}
16
+
17
+ def gems
18
+ gem_names.map do |name|
19
+ gem = Gem.new
20
+ gem.name = name
21
+ gem
22
+ end
18
23
  end
19
24
 
20
25
  private
21
26
 
22
27
  attr_accessor :arguments
23
28
 
24
- def validate
25
- raise ArgumentError if invalid?
29
+ def validate(opt_parser)
30
+ if gem_names.empty? || gem_names.first.nil?
31
+ puts opt_parser.help
32
+ raise PrintHelp
33
+ end
26
34
  end
27
35
 
28
- def invalid?
29
- gem_names.empty? || gem_names.first =~ /-h|--help/ || gem_names.first.nil?
30
- end
36
+ def parse_options
37
+ self.options = OpenStruct.new
38
+
39
+ options.gemfile = "Gemfile"
40
+
41
+ opt_parser = OptionParser.new do |opts|
42
+ opts.banner = Messages::USAGE
31
43
 
32
- def extract_options
33
- options = arguments - gem_names
34
- opts = Hash[*options]
44
+ opts.on("-g", "--gemfile GEMFILE", "# Specify the Gemfile to be used, defaults to 'Gemfile'") do |gemfile|
45
+ options.gemfile = gemfile
46
+ end
47
+
48
+ opts.on("--no-install", "# Skip executing bundle after adding the gem.") do
49
+ options.no_install = true
50
+ end
51
+
52
+ opts.on("--no-version", "# Do not add a version to the gemfile.") do
53
+ options.no_version = true
54
+ end
55
+
56
+ opts.on_tail("-h", "--help", "# Print these usage instructions.") do
57
+ puts opts
58
+ raise PrintHelp
59
+ end
60
+
61
+ opts.on("-v", "--version", "# Show current gemrat version.") do
62
+ puts Gemrat::VERSION
63
+ raise PrintHelp
64
+ end
65
+ end
66
+
67
+ begin
68
+ opt_parser.parse!(arguments)
69
+ rescue OptionParser::InvalidOption
70
+ puts opt_parser
71
+ raise PrintHelp
72
+ end
73
+ validate(opt_parser)
74
+
75
+ self.gemfile = Gemfile.new(options.gemfile)
76
+ end
35
77
 
36
- self.gemfile = opts.delete("-g") || opts.delete("--gemfile") || "Gemfile"
37
- rescue ArgumentError
38
- # unable to extract options, leave them nil
78
+ def gem_names
79
+ arguments.take_while { |arg| arg !~ /^-|^--/}
39
80
  end
40
81
  end
41
82
  end
@@ -0,0 +1,121 @@
1
+ module Gemrat
2
+ class Gem
3
+ class NotFound < StandardError; end
4
+
5
+ attr_accessor :name, :valid, :action
6
+ alias_method :valid?, :valid
7
+
8
+ ACTIONS = OpenStruct.new({:add => "add", :update => "update",
9
+ :skip => "skip", :no_version => "no version"})
10
+
11
+ def initialize
12
+ self.valid = true
13
+
14
+ add!
15
+ end
16
+
17
+ def to_s
18
+ @output ||= "gem '#{name}', '#{version}'"
19
+ end
20
+
21
+ def invalid!
22
+ self.valid = false
23
+ end
24
+
25
+ def version
26
+ if platform_dependent?
27
+ platform_dependent_version
28
+ else
29
+ standard_version
30
+ end
31
+ end
32
+
33
+ def update!
34
+ self.action = ACTIONS.update
35
+ end
36
+
37
+ def update?
38
+ self.action == ACTIONS.update
39
+ end
40
+
41
+ def skip!
42
+ self.action = ACTIONS.skip
43
+ end
44
+
45
+ def skip?
46
+ self.action == ACTIONS.skip
47
+ end
48
+
49
+ def add!
50
+ self.action = ACTIONS.add
51
+ end
52
+
53
+ def add?
54
+ self.action == ACTIONS.add
55
+ end
56
+
57
+ def no_version!
58
+ self.action = ACTIONS.no_version
59
+ end
60
+
61
+ def no_version?
62
+ self.action == ACTIONS.no_version
63
+ end
64
+
65
+ private
66
+
67
+ def platform_dependent?
68
+ versions.count > 1
69
+ end
70
+
71
+ def standard_version
72
+ normalize_name.gsub(/[^\d\.]/, '')
73
+ end
74
+
75
+ def versions
76
+ platform_versions = normalize_name.gsub(/'/,"").split(",")[1..-1]
77
+
78
+ hash = {:default => platform_versions.shift}
79
+
80
+ platform_versions.inject(hash) do |hash, part|
81
+ hash[part.split(" ")[1..-1]] = part.split(" ").first
82
+ hash
83
+ end
84
+ end
85
+
86
+ def platform_dependent_version
87
+ version_for_platform = versions.select do |key, value|
88
+ key.join =~ /#{SYSTEM}/ if key.is_a? Array
89
+ end.values
90
+
91
+ if version_for_platform.empty?
92
+ versions[:default].strip
93
+ else
94
+ version_for_platform.first
95
+ end
96
+ end
97
+
98
+ def normalize_name
99
+ if no_version?
100
+ normalized = ("gem '" + name + "'")
101
+ else
102
+ normalized = ("gem " + find_exact_match).gsub(/[()]/, "'")
103
+ normalized.gsub(/#{name}/, "'#{name}',")
104
+ end
105
+ end
106
+
107
+ def find_exact_match
108
+ find_all.reject do |n|
109
+ /^#{name} / !~ n
110
+ end.first || raise(NotFound)
111
+ end
112
+
113
+ def find_all
114
+ fetch_all.split(/\n/)
115
+ end
116
+
117
+ def fetch_all
118
+ `gem search -r #{name}`
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,83 @@
1
+ module Gemrat
2
+ class Gemfile
3
+ class DuplicateGemFound < StandardError; end
4
+
5
+ attr_accessor :needs_bundle
6
+ alias_method :needs_bundle?, :needs_bundle
7
+
8
+ def initialize(path)
9
+ self.path = path
10
+ self.needs_bundle = false
11
+ end
12
+
13
+ def add(gem)
14
+ file = File.open(path, "a+")
15
+
16
+ check(gem, file)
17
+
18
+ if gem.add?
19
+ file.write "\n#{gem}"
20
+ puts "#{gem} added to your Gemfile.".green
21
+
22
+ needs_bundle!
23
+ elsif gem.update?
24
+ contents = File.read(path)
25
+ File.open(path,'w') do |f|
26
+ f.print contents.gsub(/^.*#{gem.name}.*$/, "#{gem}")
27
+
28
+ f.close
29
+ end
30
+ puts "Updated '#{gem.name}' to version '#{gem.version}'.".green
31
+ needs_bundle!
32
+ elsif gem.no_version?
33
+ file.write "\ngem '#{gem.name}'"
34
+
35
+ puts "gem '#{gem.name}' added to your Gemfile.".green
36
+
37
+ needs_bundle!
38
+ end
39
+ ensure
40
+ file.close
41
+ end
42
+
43
+ private
44
+ attr_accessor :path
45
+
46
+ def needs_bundle!
47
+ self.needs_bundle = true
48
+ end
49
+
50
+ def check(gem, file)
51
+ grep_file = file.grep(/.*#{gem.name}.*#{gem.version}.*/ )
52
+ raise DuplicateGemFound unless grep_file.empty?
53
+ current_gem_version = get_current_gem_version(gem, file)
54
+
55
+ return unless current_gem_version =~ /\S/
56
+
57
+ if current_gem_version < gem.version
58
+ prompt_gem_replacement(gem, current_gem_version)
59
+ end
60
+ end
61
+
62
+ def prompt_gem_replacement(gem, gem_version)
63
+ print (Messages::NEWER_GEM_FOUND % [gem.name, gem.version, gem_version]).chomp + " "
64
+ case input
65
+ when /n|no/
66
+ gem.skip!
67
+ else
68
+ gem.update!
69
+ end
70
+ end
71
+
72
+ def get_current_gem_version(gem, file)
73
+ file.rewind
74
+ gem_version = file.grep(/.*#{gem.name}.*/)
75
+ gem_version = gem_version.to_s.gsub(/[^\d|.]+/, '')
76
+ gem_version
77
+ end
78
+
79
+ def input
80
+ STDIN.gets
81
+ end
82
+ end
83
+ end
@@ -11,9 +11,6 @@ module Gemrat
11
11
 
12
12
  Options:
13
13
 
14
- -g [--gemfile] # Specify the Gemfile to be used. Defaults to 'Gemfile'.
15
- -h [--help] # Print these usage instructions.
16
-
17
14
  USAGE
18
15
 
19
16
  GEM_NOT_FOUND = <<-GEM_NOT_FOUND.gsub /^( +)(\w+)/, '\2'
@@ -21,5 +18,15 @@ module Gemrat
21
18
  Unable to find gem '%s' on Rubygems. Sorry about that.
22
19
  GEM_NOT_FOUND
23
20
 
21
+ DUPLICATE_GEM_FOUND = <<-DUPLICATE_GEM_FOUND.gsub /^( +)(\w+)/, '\2'
22
+
23
+ gem '%s' already exists in your Gemfile. Skipping...
24
+ DUPLICATE_GEM_FOUND
25
+
26
+ NEWER_GEM_FOUND = <<-NEWER_GEM_FOUND.gsub /^( +)(\w+)/, '\2'
27
+
28
+ Gem '%s' already exists, but there is a newer version of the gem (v %s > v %s).
29
+ Update version? (Y/n)
30
+ NEWER_GEM_FOUND
24
31
  end
25
32
  end
@@ -18,75 +18,58 @@ module Gemrat
18
18
 
19
19
  def run
20
20
  for_each_gem do
21
- with_error_handling do
22
-
23
- find_exact_match
24
- ensure_gem_exists
25
- normalize_for_gemfile
26
- add_to_gemfile
27
-
28
- end
21
+ with_error_handling { gemfile.add(gem) }
29
22
  end
30
23
 
31
- run_bundle unless gems.nil? || gems.empty? || gems.select(&:valid?).empty?
24
+ run_bundle unless skip_bundle?
32
25
  end
33
26
 
34
27
  attr_accessor :gem
35
28
 
36
29
  private
37
-
38
- attr_accessor :gems, :gemfile, :exact_match
30
+
31
+ attr_accessor :gems, :gemfile, :no_install, :no_version
39
32
 
40
33
  def parse_arguments(*args)
41
34
  Arguments.new(*args).tap do |a|
42
- self.gems = a.gem_names.map {|name| Gem.new(name) }
35
+ self.gems = a.gems
43
36
  self.gemfile = a.gemfile
37
+ self.no_install = a.options.no_install
38
+ self.no_version = a.options.no_version
44
39
  end
45
40
  end
46
41
 
47
42
  def with_error_handling
48
43
  yield
49
- rescue ArgumentError
50
- puts Messages::USAGE
51
- rescue GemNotFound
44
+ rescue Arguments::PrintHelp
45
+ rescue Gem::NotFound
52
46
  puts Messages::GEM_NOT_FOUND.red % gem.name
53
47
  gem.invalid!
48
+ rescue Gemfile::DuplicateGemFound
49
+ puts Messages::DUPLICATE_GEM_FOUND % gem.name
50
+ gem.invalid!
54
51
  end
55
52
 
56
53
  def for_each_gem
57
54
  gems && gems.each do |gem|
55
+ set_no_version(gem)
58
56
  self.gem = gem
59
57
  yield
60
58
  end
61
59
  end
62
60
 
63
- def find_exact_match
64
- self.exact_match = find_all(gem.name).reject { |n| /^#{gem.name} / !~ n }.first
65
- end
66
-
67
- def find_all(name)
68
- fetch_all(name).split(/\n/)
69
- end
70
-
71
- def fetch_all(name)
72
- `gem search -r #{name}`
73
- end
74
-
75
- def ensure_gem_exists
76
- raise GemNotFound if exact_match.nil?
77
- end
78
-
79
- def normalize_for_gemfile
80
- gem_name = exact_match.split.first
81
- normalized = ("gem " + exact_match).gsub(/[()]/, "'")
82
- self.gem.name = normalized.gsub(/#{gem_name}/, "'#{gem_name}',")
61
+ def set_no_version(gem)
62
+ if no_version
63
+ gem.no_version!
64
+ end
83
65
  end
84
66
 
85
- def add_to_gemfile
86
- new_gemfile = File.open(gemfile, 'a')
87
- new_gemfile << "\n#{gem.name}\n"
88
- new_gemfile.close
89
- puts "#{gem.name} added to your Gemfile.".green
67
+ def skip_bundle?
68
+ gems.nil? ||
69
+ gems.empty? ||
70
+ gems.select(&:valid?).empty? ||
71
+ !gemfile.needs_bundle? ||
72
+ no_install
90
73
  end
91
74
 
92
75
  def run_bundle
@@ -1,3 +1,3 @@
1
1
  module Gemrat
2
- VERSION = "0.3.2"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+ describe Gemrat::Gem do
3
+ before do
4
+ class Gemrat::Gem
5
+ def stubbed_response
6
+ File.read("./spec/resources/rubygems_response_shim_for_#{name}")
7
+ rescue Errno::ENOENT
8
+ ""
9
+ end
10
+ alias_method :fetch_all, :stubbed_response
11
+ end
12
+ end
13
+
14
+ let(:subject) { Gemrat::Gem.new }
15
+
16
+ context "when gem is platform dependent" do
17
+ before { subject.name = "thin" }
18
+
19
+ it { should be_platform_dependent }
20
+
21
+ context "for linux" do
22
+ before do
23
+ Kernel.silence_warnings { Gemrat.const_set("SYSTEM", "gnu-linux") }
24
+ end
25
+
26
+ it "returns correct version" do
27
+ subject.to_s.should == "gem 'thin', '1.5.1'"
28
+ end
29
+ end
30
+
31
+ context "for windows" do
32
+ before do
33
+ Kernel.silence_warnings { Gemrat.const_set("SYSTEM", "x86-mingw32") }
34
+ end
35
+
36
+ it "returns correct version" do
37
+ puts subject.to_s
38
+ subject.to_s.should == "gem 'thin', '1.2.11'"
39
+ end
40
+ end
41
+ end
42
+ end
@@ -6,14 +6,21 @@ describe Gemrat do
6
6
  test_gemfile.close
7
7
 
8
8
 
9
- class Gemrat::Runner
10
- def stubbed_response(*args)
11
- File.read("./spec/resources/rubygems_response_shim_for_#{gem.name}")
9
+ class Gemrat::Gem
10
+ def stubbed_response
11
+ File.read("./spec/resources/rubygems_response_shim_for_#{name}")
12
12
  rescue Errno::ENOENT
13
13
  ""
14
14
  end
15
15
  alias_method :fetch_all, :stubbed_response
16
16
  end
17
+
18
+ class Gemrat::Runner
19
+ def stub_bundle
20
+ puts "Bundling...".green
21
+ end
22
+ alias_method :run_bundle, :stub_bundle
23
+ end
17
24
  end
18
25
 
19
26
  after :each do
@@ -35,67 +42,222 @@ describe Gemrat do
35
42
  File.delete("TestGemfile")
36
43
  end
37
44
 
38
- describe Gemrat::Runner do
39
- subject { Gemrat::Runner }
40
- describe "#run" do
41
- context "when valid arguments are given" do
42
- context "for one gem" do
43
- it "adds lastest gem version to gemfile" do
44
- output = capture_stdout { subject.run("sinatra", "-g", "TestGemfile") }
45
- output.should include("'sinatra', '1.4.3' added to your Gemfile")
46
- gemfile_contents = File.open('TestGemfile', 'r').read
47
- gemfile_contents.should include("\ngem 'sinatra', '1.4.3'\n")
48
- output.should include("Bundling")
49
- end
45
+ context "when valid arguments are given" do
46
+ context "for one gem" do
47
+ let(:output) { capture_stdout { Gemrat::Runner.run("sinatra", "-g", "TestGemfile") }}
48
+
49
+ it "adds latest gem version to gemfile" do
50
+ output.should include("'sinatra', '1.4.3' added to your Gemfile")
51
+ gemfile_contents = File.open('TestGemfile', 'r').read
52
+ gemfile_contents.should include("gem 'sinatra', '1.4.3'")
53
+ end
54
+
55
+ it "runs bundle install" do
56
+ output.should include("Bundling")
57
+ end
58
+
59
+ context "when the --no-install flag is given" do
60
+ let(:output) { capture_stdout { Gemrat::Runner.run("sinatra", "-g", "TestGemfile", "--no-install") }}
61
+ it "adds latest gem version to gemfile" do
62
+ output.should include("'sinatra', '1.4.3' added to your Gemfile")
63
+ gemfile_contents = File.open('TestGemfile', 'r').read
64
+ gemfile_contents.should include("gem 'sinatra', '1.4.3'")
50
65
  end
51
66
 
52
- context "for multiple gems" do
53
- it "adds latest gem versions to gemfile" do
54
- output = capture_stdout { subject.run("sinatra", "rails", "minitest", "-g", "TestGemfile") }
55
- output.should include("'sinatra', '1.4.3' added to your Gemfile")
56
- output.should include("'minitest', '5.0.5' added to your Gemfile")
57
- output.should include("'rails', '3.2.13' added to your Gemfile")
58
- gemfile_contents = File.open('TestGemfile', 'r').read
59
- gemfile_contents.should include("\ngem 'sinatra', '1.4.3'")
60
- gemfile_contents.should include("\ngem 'minitest', '5.0.5'")
61
- gemfile_contents.should include("\ngem 'rails', '3.2.13'\n")
62
- output.should include("Bundling")
63
- end
67
+ it "does not run bundle install" do
68
+ output.should_not include("Bundling")
69
+ end
70
+ end
64
71
 
65
- context "when one of the gems is invalid" do
66
- it "adds other gems and runs bundle" do
67
- output = capture_stdout { subject.run("sinatra", "beer_maker_2000", "minitest", "-g", "TestGemfile") }
68
- output.should include("'sinatra', '1.4.3' added to your Gemfile")
69
- output.should include("'minitest', '5.0.5' added to your Gemfile")
70
- output.should include("#{Gemrat::Messages::GEM_NOT_FOUND % "beer_maker_2000"}")
71
- output.should include("Bundling")
72
- end
73
- end
72
+ context "when the --no-version flag is given" do
73
+ let(:output) { capture_stdout { Gemrat::Runner.run("sinatra", "-g", "TestGemfile", "--no-version") }}
74
+ it "adds the gem without the version" do
75
+ output.should include("'sinatra' added to your Gemfile")
76
+ gemfile_contents = File.open('TestGemfile', 'r').read
77
+ gemfile_contents.should =~ /gem 'sinatra'$/
78
+ end
79
+
80
+ it "runs bundle install" do
81
+ output.should include("Bundling")
74
82
  end
75
83
  end
76
84
 
77
- ["when gem name is left out from the arguments", "",
78
- "when -h or --help is given in the arguments", "-h"].each_slice(2) do |ctx, arg|
79
- context ctx do
80
- it "prints usage" do
81
- output = capture_stdout { subject.run(arg == "" ? nil : arg) }
82
- output.should include(Gemrat::Messages::USAGE)
83
- end
85
+ pending "when the --environment or -e flag is given" do
86
+ let(:output) { capture_stdout { Gemrat::Runner.run("sinatra", "-g", "TestGemfile", "--environment test") }}
87
+ it "adds the gem to the specifiyed environment" do
88
+ output.should include "'sinatra' added to test environment in your Gemfile"
89
+ gemfile_contents = File.open('TestGemfile', 'r').read
90
+ gemfile_contents.should include("group :test do")
91
+ gemfile_contents.should include("gem 'sinatra', '1.4.3'")
84
92
  end
85
93
  end
94
+ end
95
+
96
+ context "for multiple gems" do
97
+ let(:output) { capture_stdout { Gemrat::Runner.run("sinatra", "rails", "minitest", "-g", "TestGemfile") } }
98
+ it "adds latest gem versions to the gemfile" do
99
+ output.should include("'sinatra', '1.4.3' added to your Gemfile")
100
+ output.should include("'minitest', '5.0.5' added to your Gemfile")
101
+ output.should include("'rails', '3.2.13' added to your Gemfile")
102
+ gemfile_contents = File.open('TestGemfile', 'r').read
103
+ gemfile_contents.should include("\ngem 'sinatra', '1.4.3'")
104
+ gemfile_contents.should include("\ngem 'minitest', '5.0.5'")
105
+ gemfile_contents.should include("\ngem 'rails', '3.2.13'")
106
+ end
107
+
108
+ it "runs bundle install" do
109
+ output.should include("Bundling")
110
+ end
111
+
112
+ context "when one of the gems is invalid" do
113
+ let(:output) { capture_stdout { Gemrat::Runner.run("sinatra", "beer_maker_2000", "minitest", "-g", "TestGemfile") } }
114
+
115
+ it "adds valid gems to the gemfile" do
116
+ output.should include("'sinatra', '1.4.3' added to your Gemfile")
117
+ output.should include("'minitest', '5.0.5' added to your Gemfile")
118
+ output.should include("#{Gemrat::Messages::GEM_NOT_FOUND % "beer_maker_2000"}")
119
+ end
120
+
121
+ it "runs bundle install" do
122
+ output.should include("Bundling")
123
+ end
124
+ end
125
+ end
126
+ end
127
+
128
+ ["when gem name is left out from the arguments", "",
129
+ "when -h is given in the arguments", "-h",
130
+ "when --help is given in the arguments", "--help"].each_slice(2) do |ctx, arg|
131
+ context ctx do
132
+ it "prints usage" do
133
+ output = capture_stdout { Gemrat::Runner.run(arg == "" ? nil : arg) }
134
+ output.should include(Gemrat::Messages::USAGE)
135
+ end
136
+ end
137
+ end
138
+
139
+ ["when -v is given in the arguments", "-v",
140
+ "when --version is given in the arginemts", "--version"].each_slice(2) do |ctx, arg|
141
+ context ctx do
142
+ it "prints gemrat version" do
143
+ output = capture_stdout { Gemrat::Runner.run(arg) }
144
+ output.should include(Gemrat::VERSION)
145
+ end
146
+ end
147
+ end
148
+
149
+ context "when a non-existant flag is given in the arguments" do
150
+ it "prints out the help message" do
151
+ output = capture_stdout { Gemrat::Runner.run("--doesnt-exist") }
152
+ output.should include(Gemrat::Messages::USAGE)
153
+ end
154
+ end
155
+
156
+ context "when gem is not found" do
157
+ before do
158
+ Gemrat::Runner.stub(:gem) do
159
+ gem = Gem.new
160
+ gem.invalid!
161
+ end
162
+ @gem_name = "unexistent_gem"
163
+ end
164
+
165
+ let(:output) { capture_stdout { Gemrat::Runner.run(@gem_name) } }
166
+
167
+ it "prints a nice error message" do
168
+ output.should include("#{Gemrat::Messages::GEM_NOT_FOUND % @gem_name}")
169
+ end
170
+
171
+ it "skips bundle install" do
172
+ output.should_not include("Bundling...")
173
+ end
174
+ end
175
+
176
+ context "when gem already exists in a gemfile" do
177
+
178
+ context "and the gem is the newest version" do
179
+ before do
180
+ test_gemfile = File.open("TestGemfile", "w")
181
+ test_gemfile << %Q{https://rubygems.org'
182
+ # Specify your gem's dependencies in gemrat.gemspec
183
+ gem 'minitest', '5.0.5'}
184
+ test_gemfile.close
185
+ end
186
+
187
+ let(:output) { capture_stdout { Gemrat::Runner.run("minitest", "-g", "TestGemfile")} }
188
+
189
+ it "informs that the gem already exists" do
190
+ output.should include("gem 'minitest' already exists")
191
+ end
86
192
 
87
- context "when gem is not found" do
193
+ it "skips bundle install" do
194
+ output.should_not include("Bundling...")
195
+ end
196
+ end
197
+
198
+ context "and there is a newer version" do
199
+ before do
200
+ test_gemfile = File.open("TestGemfile", "w")
201
+ test_gemfile << %Q{https://rubygems.org'
202
+ # Specify your gem's dependencies in gemrat.gemspec
203
+ gem 'minitest', '5.0.4'}
204
+ test_gemfile.close
205
+ end
206
+
207
+ context "and the update is rejected" do
88
208
  before do
89
- subject.stub(:find_exact_match)
90
- @gem_name = "unexistent_gem"
209
+ Gemrat::Gemfile.any_instance.stub(:input) { "no\n" }
91
210
  end
92
211
 
93
- it "prints a nice error message" do
94
- output = capture_stdout { subject.run(@gem_name) }
95
- output.should include("#{Gemrat::Messages::GEM_NOT_FOUND % @gem_name}")
212
+ let(:output) { capture_stdout { Gemrat::Runner.run("minitest", "-g", "TestGemfile")} }
213
+
214
+ it "informs about the new gem version" do
215
+ output.should include("there is a newer version of the gem")
216
+ end
217
+
218
+ it "doesn't add the new gem version in the gemfile" do
219
+ File.read("TestGemfile").should_not match(/minitest.+5\.0\.5/)
220
+ end
221
+
222
+ it "leaves the old gem version in the gemfile" do
223
+ File.read("TestGemfile").should match(/minitest.+5\.0\.4/)
224
+ end
225
+
226
+ it "skips bundle install" do
96
227
  output.should_not include("Bundling...")
97
228
  end
98
229
  end
230
+
231
+ ["and the update is approved with inputing y", "y\n",
232
+ "and the update is approved by pressing enter", "\n"].each_slice(2) do |ctx, arg|
233
+ context ctx do
234
+ before do
235
+ Gemrat::Gemfile.any_instance.stub(:input) { arg }
236
+ end
237
+
238
+ let!(:output) { capture_stdout { Gemrat::Runner.run("minitest", "-g", "TestGemfile")} }
239
+
240
+ it "asks if you want to add the newer gem" do
241
+ output.should include("there is a newer version of the gem")
242
+ end
243
+
244
+ it "updates the gem version in the gemfile" do
245
+ File.read("TestGemfile").should match(/minitest.+5\.0\.5/)
246
+ end
247
+
248
+ it "informs that the gem has been updated to the newest version" do
249
+ output.should include("Updated 'minitest' to version '5.0.5'")
250
+ end
251
+
252
+ it "doesn't add gem twice in the gemfile" do
253
+ File.open("TestGemfile").grep(/minitest/).count.should eq(1)
254
+ end
255
+
256
+ it "runs bundle install" do
257
+ output.should include("Bundling...")
258
+ end
259
+ end
260
+ end
99
261
  end
100
262
  end
101
263
  end
@@ -0,0 +1,45 @@
1
+ thin (1.5.1, 1.2.11 x86-mingw32 x86-mswin32, 0.7.1 x86-mswin32-60)
2
+ thin-async-test (1.0.0)
3
+ thin-attach_socket (0.1)
4
+ thin-auth-ntlm (0.0.4)
5
+ thin-fun_embed (0.0.3)
6
+ thin-glazed (0.1.0)
7
+ thin-preforker (0.0.4)
8
+ thin-rails (1.0.1)
9
+ thin-service (0.0.1)
10
+ thin_async (0.1.1)
11
+ thin_balance (0.2.0)
12
+ thin_http (0.1.1)
13
+ thin_models (0.1.4)
14
+ thin_out_backups (0.0.1)
15
+ thin_service (0.0.5)
16
+ Thin_Upstart (1.2.1)
17
+ Thin_Upstreams (0.3.0)
18
+ thincloud-auth (0.1.2)
19
+ thincloud-authentication (0.6.5)
20
+ thincloud-deployment (1.0.1)
21
+ thincloud-postmark (0.4.0)
22
+ thincloud-resque (0.1.4)
23
+ thincloud-test (1.0.0)
24
+ thincloud-test-rails (1.0.0)
25
+ thingiverse (0.0.7)
26
+ things (0.1.0 x86-darwin-9)
27
+ things-client (0.2.4)
28
+ things-fetcher (0.1.3)
29
+ things-rb (0.4.0)
30
+ thingtank (0.3.6)
31
+ thinking-sphinx (3.0.3)
32
+ thinking-sphinx-099 (1.3.2)
33
+ thinking-sphinx-allen (1.3.18.4)
34
+ thinking-sphinx-raspell (1.1.2)
35
+ thinking-sphinx-rspec-matchers (0.0.2)
36
+ thinking-sphinx-shoulda-matchers (0.0.2)
37
+ thinkingtank (0.0.9)
38
+ thinknear (0.1.2)
39
+ thinlayer-chef-boundary-annotations-handler (0.1.2)
40
+ thinner (0.1.4)
41
+ thinning (0.1.1)
42
+ thinp_xml (0.0.4)
43
+ thinreports (0.7.6)
44
+ thinreports-handler (0.1.2)
45
+ thinreports-rails (0.1.3)
@@ -7,3 +7,13 @@ require 'pry'
7
7
  RSpec.configure do |config|
8
8
  # some (optional) config here
9
9
  end
10
+
11
+ module Kernel
12
+ def silence_warnings
13
+ original_verbosity = $VERBOSE
14
+ $VERBOSE = nil
15
+ result = yield
16
+ $VERBOSE = original_verbosity
17
+ return result
18
+ end
19
+ end
metadata CHANGED
@@ -1,15 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gemrat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dru Riley
8
8
  - Hrvoje Simic
9
+ - Marko Ivanek
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2013-06-23 00:00:00.000000000 Z
13
+ date: 2013-06-29 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: colored
@@ -81,6 +82,20 @@ dependencies:
81
82
  - - '>='
82
83
  - !ruby/object:Gem::Version
83
84
  version: '0'
85
+ - !ruby/object:Gem::Dependency
86
+ name: guard-rspec
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - '>='
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ type: :development
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
84
99
  description: Add the latest version of a gem to your Gemfile from the command line.
85
100
  email:
86
101
  - dru@drurly.com
@@ -93,6 +108,7 @@ files:
93
108
  - .gitignore
94
109
  - .rspec
95
110
  - Gemfile
111
+ - Guardfile
96
112
  - LICENSE.txt
97
113
  - README.md
98
114
  - Rakefile
@@ -100,13 +116,17 @@ files:
100
116
  - gemrat.gemspec
101
117
  - lib/gemrat.rb
102
118
  - lib/gemrat/arguments.rb
119
+ - lib/gemrat/gem.rb
120
+ - lib/gemrat/gemfile.rb
103
121
  - lib/gemrat/messages.rb
104
122
  - lib/gemrat/runner.rb
105
123
  - lib/gemrat/version.rb
124
+ - spec/gem_spec.rb
106
125
  - spec/gemrat_spec.rb
107
126
  - spec/resources/rubygems_response_shim_for_minitest
108
127
  - spec/resources/rubygems_response_shim_for_rails
109
128
  - spec/resources/rubygems_response_shim_for_sinatra
129
+ - spec/resources/rubygems_response_shim_for_thin
110
130
  - spec/spec_helper.rb
111
131
  homepage: https://github.com/DruRly/gemrat
112
132
  licenses:
@@ -133,8 +153,10 @@ signing_key:
133
153
  specification_version: 4
134
154
  summary: Add the latest version of a gem to your Gemfile from the command line.
135
155
  test_files:
156
+ - spec/gem_spec.rb
136
157
  - spec/gemrat_spec.rb
137
158
  - spec/resources/rubygems_response_shim_for_minitest
138
159
  - spec/resources/rubygems_response_shim_for_rails
139
160
  - spec/resources/rubygems_response_shim_for_sinatra
161
+ - spec/resources/rubygems_response_shim_for_thin
140
162
  - spec/spec_helper.rb