appraiser 0.1.5 → 0.1.6

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.
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