appraiser 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,8 @@
1
+ == 0.1.6
2
+
3
+ * add specs for Gem::Commands::AppraiserCommand
4
+ * testing on travis-ci.org
5
+
1
6
  == 0.1.5
2
7
 
3
8
  * gem commandify [amatsuda]
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  Appraiser = a simple rubygems subcommand for Gemfile
2
2
  ====================================================
3
3
 
4
+ [![Build Status](http://travis-ci.org/juno/appraiser.png)](http://travis-ci.org/juno/appraiser)
5
+
4
6
  `appraiser` displays gem information from `./Gemfile`.
5
7
 
6
8
  Like this:
data/Rakefile CHANGED
@@ -1,2 +1,10 @@
1
1
  require 'bundler'
2
2
  Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core/rake_task'
5
+
6
+ RSpec::Core::RakeTask.new do |t|
7
+ t.pattern = 'spec/**/*_spec.rb'
8
+ end
9
+
10
+ task :default => :spec
data/appraiser.gemspec CHANGED
@@ -36,5 +36,7 @@ appraiser installed as a rubygems subcommand.
36
36
  s.add_dependency('colored', ['~> 1.2'])
37
37
  s.add_dependency('json')
38
38
 
39
+ s.add_development_dependency('rake', ['~> 0.9'])
39
40
  s.add_development_dependency('rspec', ['~> 2.3'])
41
+ s.add_development_dependency('webmock', ['~> 1.7'])
40
42
  end
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  module Appraiser
4
- VERSION = "0.1.5"
4
+ VERSION = "0.1.6"
5
5
  end
6
6
 
7
7
 
@@ -6,13 +6,17 @@ require 'bundler'
6
6
  require 'colored'
7
7
  require 'json'
8
8
  require 'open-uri'
9
+ require 'stringio'
9
10
 
10
11
  require 'appraiser/version'
11
12
 
12
13
  class Gem::Commands::AppraiserCommand < Gem::Command
14
+
13
15
  RUBY_GEMS_URL = 'http://rubygems.org/api/v1/gems/%s.json'
16
+
14
17
  LINE = '-' * 60
15
18
 
19
+
16
20
  def initialize
17
21
  super 'appraiser', 'Display gem information in ./Gemfile'
18
22
 
@@ -26,14 +30,22 @@ class Gem::Commands::AppraiserCommand < Gem::Command
26
30
  end
27
31
 
28
32
  def execute
33
+ process($stdout)
34
+ end
35
+
36
+
37
+ private
38
+
39
+ # @param [IO] output
40
+ def process(output)
29
41
  group = (options[:group] || :default).to_sym
30
42
 
31
43
  dependencies_for(group).each do |dependency|
32
44
  json = load_json(dependency.name)
33
45
 
34
46
  if json.empty?
35
- puts dependency.name.green
36
- puts "Source : #{dependency.source.to_s.cyan.underline}"
47
+ output.puts dependency.name.green
48
+ output.puts "Source : #{dependency.source.to_s.cyan.underline}"
37
49
  else
38
50
  name = json['name']
39
51
  authors = json['authors']
@@ -43,20 +55,18 @@ class Gem::Commands::AppraiserCommand < Gem::Command
43
55
  src_uri = json['source_code_uri']
44
56
  info = json['info'].split("\n").first.strip
45
57
 
46
- puts "#{name.green} (by #{authors})"
47
- puts "Downloads: #{downloads.blue}"
48
- puts "Project : #{project_uri.cyan.underline}" if project_uri
49
- puts "Document : #{doc_uri.cyan.underline}" if doc_uri
50
- puts "Source : #{src_uri.cyan.underline}" if src_uri
51
- puts info
58
+ output.puts "#{name.green} (by #{authors})"
59
+ output.puts "Downloads: #{downloads.blue}"
60
+ output.puts "Project : #{project_uri.cyan.underline}" if project_uri
61
+ output.puts "Document : #{doc_uri.cyan.underline}" if doc_uri
62
+ output.puts "Source : #{src_uri.cyan.underline}" if src_uri
63
+ output.puts info
52
64
  end
53
65
 
54
- puts LINE
66
+ output.puts LINE
55
67
  end
56
68
  end
57
69
 
58
- private
59
-
60
70
  # @param [String] gem_name
61
71
  # @return [Hash]
62
72
  def load_json(gem_name)
@@ -68,7 +78,7 @@ class Gem::Commands::AppraiserCommand < Gem::Command
68
78
  # @param [Symbol] group
69
79
  # @return [Array<Bundler::Dependency>]
70
80
  def dependencies_for(group)
71
- Bundler.definition.dependencies.select{ |i| i.groups.include? group }
81
+ Bundler.definition.dependencies.select { |i| i.groups.include? group }
72
82
  end
73
83
 
74
84
  # @param [Integer] number
@@ -82,4 +92,5 @@ class Gem::Commands::AppraiserCommand < Gem::Command
82
92
  rescue
83
93
  number.to_s
84
94
  end
95
+
85
96
  end
data/spec/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ rvm:
2
+ - 1.8.7
3
+ - 1.9.2
4
+ - jruby
@@ -2,6 +2,224 @@
2
2
 
3
3
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
4
4
 
5
- describe "Gem::Commands::AppraiserCommand" do
6
- it "um..."
5
+ describe Gem::Commands::AppraiserCommand do
6
+
7
+ before do
8
+ @rails_json = <<-EOD
9
+ {"dependencies":{"runtime":[{"name":"actionmailer","requirements":"= 3.0.9"},{"name":"actionpack","requirements":"= 3.0.9"},{"name":"activerecord","requirements":"= 3.0.9"},{"name":"activeresource","requirements":"= 3.0.9"},{"name":"activesupport","requirements":"= 3.0.9"},{"name":"bundler","requirements":"~> 1.0"},{"name":"railties","requirements":"= 3.0.9"}],"development":[]},"name":"rails","downloads":4977205,"info":"Ruby on Rails is a full-stack web framework optimized for programmer happiness and sustainable productivity. It encourages beautiful code by favoring convention over configuration.","version_downloads":306973,"version":"3.0.9","homepage_uri":"http://www.rubyonrails.org","bug_tracker_uri":"http://rails.lighthouseapp.com/projects/8994-ruby-on-rails","source_code_uri":"http://github.com/rails/rails","gem_uri":"http://rubygems.org/gems/rails-3.0.9.gem","project_uri":"http://rubygems.org/gems/rails","authors":"David Heinemeier Hansson","mailing_list_uri":"http://groups.google.com/group/rubyonrails-talk","documentation_uri":"http://api.rubyonrails.org","wiki_uri":"http://wiki.rubyonrails.org"}
10
+ EOD
11
+
12
+ @empty_json = '{}'
13
+ end
14
+
15
+ describe "Constants" do
16
+ describe "RUBY_GEMS_URL" do
17
+ subject { Gem::Commands::AppraiserCommand::RUBY_GEMS_URL }
18
+ it { should eq('http://rubygems.org/api/v1/gems/%s.json') }
19
+ end
20
+
21
+ describe "LINE" do
22
+ subject { Gem::Commands::AppraiserCommand::LINE }
23
+ it { should eq('-' * 60) }
24
+ end
25
+ end
26
+
27
+
28
+ # Instance methods
29
+
30
+ describe "#usage" do
31
+ let(:command) { Gem::Commands::AppraiserCommand.new }
32
+ subject { command.usage }
33
+ it { should eq('gem appraiser [-g group]') }
34
+ end
35
+
36
+ describe "#execute" do
37
+ let(:command) { Gem::Commands::AppraiserCommand.new }
38
+
39
+ it "call #process with STDOUT as output" do
40
+ command.should_receive(:process).with($stdout)
41
+ command.execute
42
+ end
43
+ end
44
+
45
+
46
+ # private methods
47
+
48
+ describe "#process(output)" do
49
+ let(:command) { Gem::Commands::AppraiserCommand.new }
50
+ let(:output) { stub(IO).as_null_object }
51
+
52
+ context "response body is not empty json" do
53
+ before do
54
+ dependencies = []
55
+ dependencies << stub(Bundler::Dependency, :groups => [:default], :name => 'rails')
56
+ dependencies << stub(Bundler::Dependency, :groups => [:test], :name => 'rspec')
57
+ Bundler.stub_chain(:definition, :dependencies) { dependencies }
58
+ end
59
+
60
+ it "retrieves :default group dependency json from RubyGems API" do
61
+ stub_request(:get, 'http://rubygems.org/api/v1/gems/rails.json').
62
+ to_return(:status => 200, :body => @rails_json)
63
+ command.send(:process, output)
64
+ a_request(:get, 'http://rubygems.org/api/v1/gems/rails.json').should have_been_made.once
65
+ end
66
+
67
+ it "not retrieves :test group dependency json from RubyGems API" do
68
+ stub_request(:get, 'http://rubygems.org/api/v1/gems/rails.json').
69
+ to_return(:status => 200, :body => @rails_json)
70
+ command.send(:process, output)
71
+ a_request(:get, 'http://rubygems.org/api/v1/gems/rspec.json').should_not have_been_made
72
+ end
73
+ end
74
+
75
+ context "response body is empty json" do
76
+ before do
77
+ @dependency = stub(Bundler::Dependency,
78
+ :groups => [:default],
79
+ :name => 'rails',
80
+ :source => 'git://github.com/tenderlove/nokogiri.git')
81
+ Bundler.stub_chain(:definition, :dependencies) { [@dependency] }
82
+
83
+ stub_request(:get, 'http://rubygems.org/api/v1/gems/rails.json').
84
+ to_return(:status => 200, :body => @empty_json)
85
+ end
86
+
87
+ it "not raises exception" do
88
+ expect {
89
+ command.send(:process, output)
90
+ }.should_not raise_error
91
+ end
92
+
93
+ it "puts dependency source" do
94
+ @dependency.should_receive(:source) { 'git://github.com/tenderlove/nokogiri.git' }
95
+ command.send(:process, output)
96
+ end
97
+ end
98
+ end
99
+
100
+ describe "#load_json(gem_name)" do
101
+ let(:command) { Gem::Commands::AppraiserCommand.new }
102
+ let(:gem_name) { 'rails' }
103
+
104
+ context "open() raises OpenURI::HTTPError exception" do
105
+ before do
106
+ stub_request(:get, 'http://rubygems.org/api/v1/gems/rails.json').
107
+ to_raise(OpenURI::HTTPError.new('error', stub(StringIO)))
108
+ end
109
+
110
+ subject { command.send(:load_json, gem_name) }
111
+ it { should be_kind_of(Hash) }
112
+ it { should be_empty }
113
+ end
114
+
115
+ context "open() returns JSON response" do
116
+ before do
117
+ stub_request(:get, 'http://rubygems.org/api/v1/gems/rails.json').
118
+ to_return(:status => 200, :body => @rails_json)
119
+
120
+ @result = command.send(:load_json, gem_name)
121
+ end
122
+
123
+ it "have key 'name'" do
124
+ @result.should have_key('name')
125
+ @result['name'].should eq('rails')
126
+ end
127
+
128
+ it "have key 'authors'" do
129
+ @result.should have_key('authors')
130
+ @result['authors'].should eq('David Heinemeier Hansson')
131
+ end
132
+
133
+ it "have key 'downloads'" do
134
+ @result.should have_key('downloads')
135
+ @result['downloads'].should eq(4977205)
136
+ end
137
+
138
+ it "have key 'project_uri'" do
139
+ @result.should have_key('project_uri')
140
+ @result['project_uri'].should eq('http://rubygems.org/gems/rails')
141
+ end
142
+
143
+ it "have key 'documentation_uri'" do
144
+ @result.should have_key('documentation_uri')
145
+ @result['documentation_uri'].should eq('http://api.rubyonrails.org')
146
+ end
147
+
148
+ it "have key 'source_code_uri'" do
149
+ @result.should have_key('source_code_uri')
150
+ @result['source_code_uri'].should eq('http://github.com/rails/rails')
151
+ end
152
+
153
+ it "have key 'info'" do
154
+ @result.should have_key('info')
155
+ @result['info'].should eq("Ruby on Rails is a full-stack web framework optimized for programmer happiness and sustainable productivity. It encourages beautiful code by favoring convention over configuration.")
156
+ end
157
+ end
158
+ end
159
+
160
+ describe "#dependencies_for(group)" do
161
+ let(:command) { Gem::Commands::AppraiserCommand.new }
162
+ let(:group) { :development }
163
+
164
+ it "should call Bundler.definition.dependencies.select" do
165
+ dependencies = []
166
+ dependencies << stub(Bundler::Dependency, :groups => [:default])
167
+ dependencies << stub(Bundler::Dependency, :groups => [:development])
168
+ dependencies << stub(Bundler::Dependency, :groups => [:development, :test])
169
+ Bundler.stub_chain(:definition, :dependencies) { dependencies }
170
+
171
+ result = command.send(:dependencies_for, group)
172
+ result.should have(2).dependencies
173
+ end
174
+ end
175
+
176
+ describe "#number_with_delimiter(number, delimiter = ',', separator = '.')" do
177
+ let(:command) { Gem::Commands::AppraiserCommand.new }
178
+
179
+ context "number is 0" do
180
+ let(:number) { 0 }
181
+ subject { command.send(:number_with_delimiter, number) }
182
+ it { should eq('0') }
183
+ end
184
+
185
+ context "number is 100" do
186
+ let(:number) { 100 }
187
+ subject { command.send(:number_with_delimiter, number) }
188
+ it { should eq('100') }
189
+ end
190
+
191
+ context "number is 1000" do
192
+ let(:number) { 1000 }
193
+ subject { command.send(:number_with_delimiter, number) }
194
+ it { should eq('1,000') }
195
+ end
196
+
197
+ context "number is 10000.99" do
198
+ let(:number) { 10000.99 }
199
+ subject { command.send(:number_with_delimiter, number) }
200
+ it { should eq('10,000.99') }
201
+ end
202
+
203
+ context "number is 1000000" do
204
+ let(:number) { 1000000 }
205
+ subject { command.send(:number_with_delimiter, number) }
206
+ it { should eq('1,000,000') }
207
+ end
208
+
209
+ context "number is 1000000, delimiter is '_'" do
210
+ let(:number) { 1000000 }
211
+ let(:delimiter) { '_' }
212
+ subject { command.send(:number_with_delimiter, number, delimiter) }
213
+ it { should eq('1_000_000') }
214
+ end
215
+
216
+ context "number is '1000000 00', delimiter is '_', separator is ' '" do
217
+ let(:number) { 1000000 }
218
+ let(:delimiter) { '_' }
219
+ let(:separator) { ' ' }
220
+ subject { command.send(:number_with_delimiter, number, delimiter, separator) }
221
+ it { should eq('1_000_000') }
222
+ end
223
+ end
224
+
7
225
  end
data/spec/spec_helper.rb CHANGED
@@ -4,6 +4,7 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
4
4
  $LOAD_PATH.unshift(File.dirname(__FILE__))
5
5
 
6
6
  require 'rspec'
7
+ require 'webmock/rspec'
7
8
  require 'rubygems/commands/appraiser_command'
8
9
 
9
10
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
metadata CHANGED
@@ -1,72 +1,90 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: appraiser
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.6
4
5
  prerelease:
5
- version: 0.1.5
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Junya Ogura
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-04-25 00:00:00 +09:00
14
- default_executable:
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
12
+ date: 2011-08-16 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
17
15
  name: bundler
18
- prerelease: false
19
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &70340450938180 !ruby/object:Gem::Requirement
20
17
  none: false
21
- requirements:
18
+ requirements:
22
19
  - - ~>
23
- - !ruby/object:Gem::Version
24
- version: "1.0"
20
+ - !ruby/object:Gem::Version
21
+ version: '1.0'
25
22
  type: :runtime
26
- version_requirements: *id001
27
- - !ruby/object:Gem::Dependency
28
- name: colored
29
23
  prerelease: false
30
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *70340450938180
25
+ - !ruby/object:Gem::Dependency
26
+ name: colored
27
+ requirement: &70340450937280 !ruby/object:Gem::Requirement
31
28
  none: false
32
- requirements:
29
+ requirements:
33
30
  - - ~>
34
- - !ruby/object:Gem::Version
35
- version: "1.2"
31
+ - !ruby/object:Gem::Version
32
+ version: '1.2'
36
33
  type: :runtime
37
- version_requirements: *id002
38
- - !ruby/object:Gem::Dependency
39
- name: json
40
34
  prerelease: false
41
- requirement: &id003 !ruby/object:Gem::Requirement
35
+ version_requirements: *70340450937280
36
+ - !ruby/object:Gem::Dependency
37
+ name: json
38
+ requirement: &70340450936480 !ruby/object:Gem::Requirement
42
39
  none: false
43
- requirements:
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- version: "0"
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
47
44
  type: :runtime
48
- version_requirements: *id003
49
- - !ruby/object:Gem::Dependency
45
+ prerelease: false
46
+ version_requirements: *70340450936480
47
+ - !ruby/object:Gem::Dependency
48
+ name: rake
49
+ requirement: &70340450935120 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '0.9'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70340450935120
58
+ - !ruby/object:Gem::Dependency
50
59
  name: rspec
60
+ requirement: &70340450934240 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: '2.3'
66
+ type: :development
51
67
  prerelease: false
52
- requirement: &id004 !ruby/object:Gem::Requirement
68
+ version_requirements: *70340450934240
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: &70340450933340 !ruby/object:Gem::Requirement
53
72
  none: false
54
- requirements:
73
+ requirements:
55
74
  - - ~>
56
- - !ruby/object:Gem::Version
57
- version: "2.3"
75
+ - !ruby/object:Gem::Version
76
+ version: '1.7'
58
77
  type: :development
59
- version_requirements: *id004
60
- description: `appraiser` is a rubygems subcommand which displays gem information in `./Gemfile`.
61
- email:
78
+ prerelease: false
79
+ version_requirements: *70340450933340
80
+ description: ! '`appraiser` is a rubygems subcommand which displays gem information
81
+ in `./Gemfile`.'
82
+ email:
62
83
  - junyaogura@gmail.com
63
84
  executables: []
64
-
65
85
  extensions: []
66
-
67
86
  extra_rdoc_files: []
68
-
69
- files:
87
+ files:
70
88
  - .gitignore
71
89
  - .rspec
72
90
  - CHANGELOG
@@ -78,37 +96,42 @@ files:
78
96
  - lib/appraiser/version.rb
79
97
  - lib/rubygems/commands/appraiser_command.rb
80
98
  - lib/rubygems_plugin.rb
99
+ - spec/.travis.yml
81
100
  - spec/appraiser_spec.rb
82
101
  - spec/spec_helper.rb
83
- has_rdoc: true
84
102
  homepage: https://github.com/juno/appraiser
85
- licenses:
103
+ licenses:
86
104
  - MIT
87
- post_install_message: "\n\
88
- appraiser installed as a rubygems subcommand.\n\n (basic)\n $ gem appraiser\n\n (shorthand)\n $ gem a\n\n (\"group\" option)\n $ gem a -g test\n\n"
105
+ post_install_message: ! "\nappraiser installed as a rubygems subcommand.\n\n (basic)\n
106
+ \ $ gem appraiser\n\n (shorthand)\n $ gem a\n\n (\"group\" option)\n $ gem a
107
+ -g test\n\n"
89
108
  rdoc_options: []
90
-
91
- require_paths:
109
+ require_paths:
92
110
  - lib
93
- required_ruby_version: !ruby/object:Gem::Requirement
111
+ required_ruby_version: !ruby/object:Gem::Requirement
94
112
  none: false
95
- requirements:
96
- - - ">="
97
- - !ruby/object:Gem::Version
98
- version: "0"
99
- required_rubygems_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ! '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ segments:
118
+ - 0
119
+ hash: 2701355711312284477
120
+ required_rubygems_version: !ruby/object:Gem::Requirement
100
121
  none: false
101
- requirements:
102
- - - ">="
103
- - !ruby/object:Gem::Version
104
- version: "0"
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ segments:
127
+ - 0
128
+ hash: 2701355711312284477
105
129
  requirements: []
106
-
107
130
  rubyforge_project:
108
- rubygems_version: 1.6.2
131
+ rubygems_version: 1.8.6
109
132
  signing_key:
110
133
  specification_version: 3
111
- summary: `appraiser` is a simple rubygems subcommand for Gemfile.
112
- test_files:
134
+ summary: ! '`appraiser` is a simple rubygems subcommand for Gemfile.'
135
+ test_files:
113
136
  - spec/appraiser_spec.rb
114
137
  - spec/spec_helper.rb