gem-search 0.1.6 → 0.1.7
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/CHANGELOG.md +5 -0
- data/bin/gem-search +1 -1
- data/gem-search.gemspec +4 -4
- data/lib/gem_search.rb +2 -3
- data/lib/gem_search/command_builder.rb +1 -1
- data/lib/gem_search/commands.rb +1 -1
- data/lib/gem_search/commands/base.rb +1 -1
- data/lib/gem_search/commands/browse.rb +8 -8
- data/lib/gem_search/commands/help.rb +1 -1
- data/lib/gem_search/commands/run.rb +2 -3
- data/lib/gem_search/commands/version.rb +2 -2
- data/lib/gem_search/executor.rb +21 -33
- data/lib/gem_search/rendering.rb +12 -14
- data/lib/gem_search/utils/system_util.rb +26 -0
- data/lib/gem_search/version.rb +2 -2
- data/spec/bin/gem_search_spec.rb +1 -1
- data/spec/commands/browse_spec.rb +1 -1
- data/spec/commands/run_spec.rb +1 -1
- data/spec/executor_spec.rb +9 -9
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 231d6017b8ed3cc3a800f89f12a197dc8484ed1f
|
4
|
+
data.tar.gz: c5bef05b461fcad27de5b0c730eec8b9c49606cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 249916d10c938be1f880f3013f4a701e7eb52660d853d55d8cec2b280d1f0b6065628ab219b96a25c5e3777e6569365cfa9008a4cdd78d94aa93878ad3e3ddfa
|
7
|
+
data.tar.gz: d067723e49098a5fa604b5c12b08a4a916dd4b54451eb4cdeb7a5c19cb433df89218be795343baf318f98000a20857eb46f98b2e28f279bc55a97102d5cb2e6f
|
data/CHANGELOG.md
CHANGED
data/bin/gem-search
CHANGED
data/gem-search.gemspec
CHANGED
@@ -11,7 +11,7 @@ def or_over_mac_os_lion?
|
|
11
11
|
|
12
12
|
macos_full_version = `/usr/bin/sw_vers -productVersion`.chomp
|
13
13
|
macos_version = macos_full_version[/10\.\d+/]
|
14
|
-
macos_version >= '10.7'
|
14
|
+
macos_version >= '10.7' # 10.7 is lion
|
15
15
|
end
|
16
16
|
|
17
17
|
Gem::Specification.new do |gem|
|
@@ -21,12 +21,12 @@ Gem::Specification.new do |gem|
|
|
21
21
|
gem.summary = 'search gems with using rubygems.org API'
|
22
22
|
gem.description = gem.summary
|
23
23
|
|
24
|
-
gem.files = `git ls-files`.split(
|
25
|
-
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
24
|
+
gem.files = `git ls-files -z`.split("\x0")
|
25
|
+
gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
26
26
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
27
27
|
gem.name = 'gem-search'
|
28
28
|
gem.require_paths = ['lib']
|
29
|
-
gem.version =
|
29
|
+
gem.version = GemSearch::VERSION
|
30
30
|
|
31
31
|
gem.post_install_message = install_message
|
32
32
|
|
data/lib/gem_search.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module GemSearch
|
2
2
|
require 'mem'
|
3
3
|
require 'slop'
|
4
4
|
|
@@ -6,7 +6,6 @@ module Gem::Search
|
|
6
6
|
|
7
7
|
require 'gem_search/command_builder'
|
8
8
|
require 'gem_search/commands'
|
9
|
-
require 'gem_search/version'
|
10
|
-
require 'gem_search/rendering'
|
11
9
|
require 'gem_search/executor'
|
10
|
+
require 'gem_search/version'
|
12
11
|
end
|
data/lib/gem_search/commands.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
|
-
module
|
1
|
+
module GemSearch
|
2
2
|
module Commands
|
3
3
|
class Browse < Base
|
4
4
|
def call
|
5
5
|
executor = Executor.new
|
6
6
|
executor.browse(options[:browse])
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
rescue OpenURI::HTTPError
|
8
|
+
puts 'No such gem.'
|
9
|
+
abort
|
10
|
+
rescue => e
|
11
|
+
puts e.message
|
12
|
+
puts e.stacktrace if ENV['DEBUG']
|
13
|
+
abort
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module GemSearch
|
2
2
|
module Commands
|
3
3
|
class Run < Base
|
4
4
|
ENABLE_SORT_OPTS = {
|
@@ -12,11 +12,10 @@ module Gem::Search
|
|
12
12
|
puts options
|
13
13
|
abort
|
14
14
|
end
|
15
|
-
|
16
15
|
executor = Executor.new
|
17
16
|
gem = options.arguments[0]
|
18
17
|
executor.search(gem, setup_opts)
|
19
|
-
rescue
|
18
|
+
rescue GemSearch::LibraryNotFound => e
|
20
19
|
puts e.message
|
21
20
|
abort
|
22
21
|
rescue => e
|
data/lib/gem_search/executor.rb
CHANGED
@@ -1,30 +1,26 @@
|
|
1
1
|
require 'json'
|
2
2
|
require 'open-uri'
|
3
|
+
require 'gem_search/rendering'
|
4
|
+
require 'gem_search/utils/system_util'
|
3
5
|
|
4
|
-
module
|
6
|
+
module GemSearch
|
5
7
|
class Executor
|
6
8
|
include Rendering
|
9
|
+
include Utils::SystemUtil
|
7
10
|
BASE_URL = 'https://rubygems.org'
|
8
11
|
SEARCH_API = "#{BASE_URL}/api/v1/search.json?query=%s&page=%d"
|
9
12
|
GEM_API = "#{BASE_URL}/api/v1/gems/%s.json"
|
10
13
|
GEM_URL = "#{BASE_URL}/gems/%s"
|
11
14
|
|
12
15
|
MAX_REQUEST_COUNT = 20
|
16
|
+
MAX_GEMS_PER_PAGE = 30 # It has been determined by Github API
|
13
17
|
|
14
18
|
def search(query, opts)
|
15
19
|
return unless query
|
16
20
|
print 'Searching '
|
17
|
-
gems =
|
18
|
-
(1..MAX_REQUEST_COUNT).each do |n|
|
19
|
-
print '.'
|
20
|
-
url = SEARCH_API % [query, n]
|
21
|
-
gems_by_page = open_rubygems_api(url)
|
22
|
-
break if gems_by_page.size.zero?
|
23
|
-
gems += gems_by_page
|
24
|
-
end
|
21
|
+
gems = search_gems(query)
|
25
22
|
puts
|
26
|
-
|
27
|
-
fail Gem::Search::LibraryNotFound, 'We did not find results.' if gems.size.zero?
|
23
|
+
fail GemSearch::LibraryNotFound, 'We did not find results.' if gems.size.zero?
|
28
24
|
gems_sort!(gems, opts[:sort])
|
29
25
|
Executor.render(gems, opts[:detail])
|
30
26
|
end
|
@@ -32,7 +28,7 @@ module Gem::Search
|
|
32
28
|
def browse(gem)
|
33
29
|
return unless gem
|
34
30
|
api_url = GEM_API % gem
|
35
|
-
result =
|
31
|
+
result = request_ruby_gems_api(api_url)
|
36
32
|
url = result['homepage_uri']
|
37
33
|
if url.nil? || url.empty?
|
38
34
|
url = GEM_URL % gem
|
@@ -43,31 +39,23 @@ module Gem::Search
|
|
43
39
|
|
44
40
|
private
|
45
41
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
RbConfig::CONFIG['host_os'].to_s.include?('darwin')
|
42
|
+
def search_gems(query)
|
43
|
+
gems = []
|
44
|
+
(1..MAX_REQUEST_COUNT).each do |n|
|
45
|
+
print '.'
|
46
|
+
url = SEARCH_API % [query, n]
|
47
|
+
results = request_ruby_gems_api(url)
|
48
|
+
gems += results
|
49
|
+
break if search_ended?(results.size)
|
50
|
+
end
|
51
|
+
gems
|
57
52
|
end
|
58
53
|
|
59
|
-
def
|
60
|
-
|
61
|
-
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
62
|
-
exts.each { |ext|
|
63
|
-
exe = "#{path}/#{cmd}#{ext}"
|
64
|
-
return exe if File.executable? exe
|
65
|
-
}
|
66
|
-
end
|
67
|
-
return nil
|
54
|
+
def search_ended?(size)
|
55
|
+
size < MAX_GEMS_PER_PAGE || size.zero?
|
68
56
|
end
|
69
57
|
|
70
|
-
def
|
58
|
+
def request_ruby_gems_api(url)
|
71
59
|
option = {}
|
72
60
|
proxy = URI.parse(url).find_proxy
|
73
61
|
if proxy
|
data/lib/gem_search/rendering.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module GemSearch
|
2
2
|
module Rendering
|
3
3
|
# NAME', 'DL(ver)', 'DL(all)', 'HOMEPAGE'
|
4
4
|
DEFAULT_RULED_LINE_SIZE = [50, 8, 9, 60]
|
@@ -7,11 +7,11 @@ module Gem::Search
|
|
7
7
|
base.extend(self)
|
8
8
|
end
|
9
9
|
|
10
|
-
def render(gems,
|
11
|
-
@
|
10
|
+
def render(gems, has_detail)
|
11
|
+
@has_detail = has_detail
|
12
12
|
ruled_line_size(gems)
|
13
|
-
|
14
|
-
|
13
|
+
render_header
|
14
|
+
render_body(gems)
|
15
15
|
end
|
16
16
|
|
17
17
|
private
|
@@ -22,33 +22,31 @@ module Gem::Search
|
|
22
22
|
@ruled_line_size[0] = max_name_size if max_name_size > @ruled_line_size[0]
|
23
23
|
end
|
24
24
|
|
25
|
-
def
|
25
|
+
def render_header
|
26
26
|
f = @ruled_line_size
|
27
27
|
fmt = "%-#{f[0]}s %#{f[1]}s %#{f[2]}s"
|
28
28
|
titles = ['NAME', 'DL(ver)', 'DL(all)']
|
29
|
-
hyphens =
|
30
|
-
if @
|
29
|
+
hyphens = f[0, 3].map { |field| '-' * field }
|
30
|
+
if @has_detail
|
31
31
|
fmt << " %-#{f[3]}s"
|
32
32
|
titles << 'HOMEPAGE'
|
33
|
-
hyphens << '-'*f[3]
|
33
|
+
hyphens << '-' * f[3]
|
34
34
|
end
|
35
|
-
|
36
35
|
puts fmt % titles
|
37
36
|
puts fmt % hyphens
|
38
37
|
end
|
39
38
|
|
40
|
-
def
|
39
|
+
def render_body(gems)
|
41
40
|
f = @ruled_line_size
|
42
|
-
|
43
41
|
fmt = "%-#{f[0]}s %#{f[1]}d %#{f[2]}d"
|
44
|
-
fmt << " %-#{f[3]}s" if @
|
42
|
+
fmt << " %-#{f[3]}s" if @has_detail
|
45
43
|
gems.each do |gem|
|
46
44
|
columns = [
|
47
45
|
"#{gem['name']} (#{gem['version']})",
|
48
46
|
gem['version_downloads'],
|
49
47
|
gem['downloads']
|
50
48
|
]
|
51
|
-
columns << gem['homepage_uri'] if @
|
49
|
+
columns << gem['homepage_uri'] if @has_detail
|
52
50
|
puts fmt % columns
|
53
51
|
end
|
54
52
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module GemSearch::Utils
|
2
|
+
module SystemUtil
|
3
|
+
# https://github.com/github/hub/blob/9c589396ae38f7b9f98319065ad491149954c152/lib/hub/context.rb#L517
|
4
|
+
def browser_open(url)
|
5
|
+
cmd = osx? ? 'open' : %w[xdg-open cygstart x-www-browser firefox opera mozilla netscape].find { |comm| which comm }
|
6
|
+
system(cmd, url)
|
7
|
+
end
|
8
|
+
|
9
|
+
# refer to: https://github.com/github/hub/blob/9c589396ae38f7b9f98319065ad491149954c152/lib/hub/context.rb#L527
|
10
|
+
def osx?
|
11
|
+
require 'rbconfig'
|
12
|
+
RbConfig::CONFIG['host_os'].to_s.include?('darwin')
|
13
|
+
end
|
14
|
+
|
15
|
+
def which(cmd)
|
16
|
+
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
17
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
18
|
+
exts.each do |ext|
|
19
|
+
exe = "#{path}/#{cmd}#{ext}"
|
20
|
+
return exe if File.executable? exe
|
21
|
+
end
|
22
|
+
end
|
23
|
+
nil
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/gem_search/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
module
|
2
|
-
VERSION = '0.1.
|
1
|
+
module GemSearch
|
2
|
+
VERSION = '0.1.7'
|
3
3
|
end
|
data/spec/bin/gem_search_spec.rb
CHANGED
data/spec/commands/run_spec.rb
CHANGED
data/spec/executor_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
include
|
1
|
+
include GemSearch
|
2
2
|
|
3
3
|
RSpec.describe Executor do
|
4
4
|
let(:executor) { Executor.new }
|
@@ -29,7 +29,7 @@ RSpec.describe Executor do
|
|
29
29
|
context 'with no sort option' do
|
30
30
|
it 'display rubygems ordering by DL(all)' do
|
31
31
|
res = <<-'EOS'.unindent
|
32
|
-
|Searching
|
32
|
+
|Searching .
|
33
33
|
|NAME DL(ver) DL(all) HOMEPAGE
|
34
34
|
|-------------------------------------------------- -------- --------- ------------------------------------------------------------
|
35
35
|
|factory_girl (3.6.0) 541 2042859 https://github.com/thoughtbot/factory_girl
|
@@ -51,7 +51,7 @@ RSpec.describe Executor do
|
|
51
51
|
context 'with no sort option' do
|
52
52
|
it 'display rubygems ordering by DL(all)' do
|
53
53
|
res = <<-'EOS'.unindent
|
54
|
-
|Searching
|
54
|
+
|Searching .
|
55
55
|
|NAME DL(ver) DL(all)
|
56
56
|
|-------------------------------------------------- -------- ---------
|
57
57
|
|factory_girl (3.6.0) 541 2042859
|
@@ -65,7 +65,7 @@ RSpec.describe Executor do
|
|
65
65
|
context 'with sort option: [a]download' do
|
66
66
|
it 'display rubygems ordering by DL(all)' do
|
67
67
|
res = <<-'EOS'.unindent
|
68
|
-
|Searching
|
68
|
+
|Searching .
|
69
69
|
|NAME DL(ver) DL(all)
|
70
70
|
|-------------------------------------------------- -------- ---------
|
71
71
|
|factory_girl (3.6.0) 541 2042859
|
@@ -79,7 +79,7 @@ RSpec.describe Executor do
|
|
79
79
|
context 'with sort option: [v]version_downloads' do
|
80
80
|
it 'display rubygems ordering by DL(ver)' do
|
81
81
|
res = <<-'EOS'.unindent
|
82
|
-
|Searching
|
82
|
+
|Searching .
|
83
83
|
|NAME DL(ver) DL(all)
|
84
84
|
|-------------------------------------------------- -------- ---------
|
85
85
|
|factory_girl_rails (3.5.0) 39724 1238780
|
@@ -93,7 +93,7 @@ RSpec.describe Executor do
|
|
93
93
|
context 'with sort option: [n]ame' do
|
94
94
|
it 'display rubygems ordering by name' do
|
95
95
|
res = <<-'EOS'.unindent
|
96
|
-
|Searching
|
96
|
+
|Searching .
|
97
97
|
|NAME DL(ver) DL(all)
|
98
98
|
|-------------------------------------------------- -------- ---------
|
99
99
|
|factory_girl (3.6.0) 541 2042859
|
@@ -115,7 +115,7 @@ RSpec.describe Executor do
|
|
115
115
|
let(:query) { 'cucumber-' }
|
116
116
|
it 'display rubygems ordering by name' do
|
117
117
|
res = <<-'EOS'.unindent
|
118
|
-
|Searching
|
118
|
+
|Searching ...
|
119
119
|
|NAME DL(ver) DL(all)
|
120
120
|
|-------------------------------------------------- -------- ---------
|
121
121
|
|autotest-cucumber-notification (0.0.6) 1027 3607
|
@@ -195,7 +195,7 @@ RSpec.describe Executor do
|
|
195
195
|
let(:query) { 'size_is_42_2345678901234567890123456789012' }
|
196
196
|
it 'is 50 characters' do
|
197
197
|
res = <<-'EOS'.unindent
|
198
|
-
|Searching
|
198
|
+
|Searching .
|
199
199
|
|NAME DL(ver) DL(all)
|
200
200
|
|-------------------------------------------------- -------- ---------
|
201
201
|
|size_is_42_2345678901234567890123456789012 (0.0.1) 100 1000
|
@@ -212,7 +212,7 @@ RSpec.describe Executor do
|
|
212
212
|
let(:query) { 'size_is_43_23456789012345678901234567890123' }
|
213
213
|
it 'is 51 characters' do
|
214
214
|
res = <<-'EOS'.unindent
|
215
|
-
|Searching
|
215
|
+
|Searching .
|
216
216
|
|NAME DL(ver) DL(all)
|
217
217
|
|--------------------------------------------------- -------- ---------
|
218
218
|
|size_is_43_23456789012345678901234567890123 (0.0.2) 200 2000
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gem-search
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- rochefort
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: slop
|
@@ -122,6 +122,7 @@ files:
|
|
122
122
|
- lib/gem_search/commands/version.rb
|
123
123
|
- lib/gem_search/executor.rb
|
124
124
|
- lib/gem_search/rendering.rb
|
125
|
+
- lib/gem_search/utils/system_util.rb
|
125
126
|
- lib/gem_search/version.rb
|
126
127
|
- sideci_build.txt
|
127
128
|
- spec/bin/gem_search_spec.rb
|