market_bot 0.9.1 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +3 -3
- data/Gemfile.lock +59 -29
- data/README.markdown +9 -0
- data/VERSION +1 -1
- data/lib/market_bot/android/app.rb +74 -97
- data/lib/market_bot/android/leaderboard.rb +11 -2
- data/lib/market_bot/android/search_query.rb +1 -1
- data/market_bot.gemspec +13 -13
- data/spec/market_bot/android/app_spec.rb +66 -57
- data/spec/market_bot/android/data/app_1.txt +134 -45
- data/spec/market_bot/android/data/app_2.txt +134 -45
- data/spec/market_bot/android/data/app_3.txt +130 -44
- metadata +26 -53
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9688ff41be35247c4bb0f85621bb800232111936
|
4
|
+
data.tar.gz: 368e41730331ab5f6084ce49d6a51cbe87904d51
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 34de9be2e58bfeab53156bd5b3248fcd412918616431ab03b3521b5065f55d0b07deb913f7f08a07cf512b5151dc1c8859a5e52f70c1e1c84cd86a9129d57fd3
|
7
|
+
data.tar.gz: 96e62fed37bee0a7ee35725a45470a3f912e7651e3868ae102f6135a7d6666e39abab95a76465e5849dafd86384745984bdebfb87949d792fbd50d11a393ef6a
|
data/Gemfile
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
source 'http://rubygems.org'
|
2
2
|
|
3
|
-
gem 'typhoeus'
|
3
|
+
gem 'typhoeus', '~> 0.4.2'
|
4
4
|
gem 'nokogiri'
|
5
5
|
|
6
6
|
group :development do
|
7
7
|
gem 'rspec', '~> 2.8.0'
|
8
|
-
gem 'bundler', '~> 1.
|
9
|
-
gem 'jeweler', '~> 1.
|
8
|
+
gem 'bundler', '~> 1.3.0'
|
9
|
+
gem 'jeweler', '~> 1.8.0'
|
10
10
|
gem 'simplecov', '>= 0'
|
11
11
|
gem 'rdoc', '>= 3.9.4'
|
12
12
|
gem 'guard', '~> 1.2.3'
|
data/Gemfile.lock
CHANGED
@@ -1,42 +1,72 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
+
addressable (2.3.5)
|
5
|
+
builder (3.2.2)
|
4
6
|
columnize (0.3.6)
|
5
|
-
debugger (1.1
|
7
|
+
debugger (1.6.1)
|
6
8
|
columnize (>= 0.3.1)
|
7
|
-
debugger-linecache (~> 1.
|
8
|
-
debugger-ruby_core_source (~> 1.
|
9
|
-
debugger-linecache (1.
|
10
|
-
|
11
|
-
debugger-ruby_core_source (1.1.3)
|
9
|
+
debugger-linecache (~> 1.2.0)
|
10
|
+
debugger-ruby_core_source (~> 1.2.3)
|
11
|
+
debugger-linecache (1.2.0)
|
12
|
+
debugger-ruby_core_source (1.2.3)
|
12
13
|
diff-lcs (1.1.3)
|
13
|
-
|
14
|
+
faraday (0.8.7)
|
15
|
+
multipart-post (~> 1.1)
|
16
|
+
ffi (1.9.0)
|
14
17
|
git (1.2.5)
|
18
|
+
github_api (0.10.1)
|
19
|
+
addressable
|
20
|
+
faraday (~> 0.8.1)
|
21
|
+
hashie (>= 1.2)
|
22
|
+
multi_json (~> 1.4)
|
23
|
+
nokogiri (~> 1.5.2)
|
24
|
+
oauth2
|
15
25
|
growl (1.0.3)
|
16
26
|
guard (1.2.3)
|
17
27
|
listen (>= 0.4.2)
|
18
28
|
thor (>= 0.14.6)
|
19
29
|
guard-rspec (1.1.0)
|
20
30
|
guard (>= 1.1)
|
21
|
-
|
31
|
+
hashie (2.0.5)
|
32
|
+
highline (1.6.19)
|
33
|
+
httpauth (0.2.0)
|
34
|
+
jeweler (1.8.6)
|
35
|
+
builder
|
22
36
|
bundler (~> 1.0)
|
23
37
|
git (>= 1.2.5)
|
38
|
+
github_api (= 0.10.1)
|
39
|
+
highline (>= 1.6.15)
|
40
|
+
nokogiri (= 1.5.10)
|
24
41
|
rake
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
42
|
+
rdoc
|
43
|
+
json (1.8.0)
|
44
|
+
jwt (0.1.8)
|
45
|
+
multi_json (>= 1.5)
|
46
|
+
listen (1.2.2)
|
47
|
+
rb-fsevent (>= 0.9.3)
|
48
|
+
rb-inotify (>= 0.9)
|
49
|
+
rb-kqueue (>= 0.2)
|
50
|
+
mime-types (1.23)
|
51
|
+
multi_json (1.7.7)
|
52
|
+
multi_xml (0.5.4)
|
53
|
+
multipart-post (1.2.0)
|
54
|
+
nokogiri (1.5.10)
|
55
|
+
oauth2 (0.9.2)
|
56
|
+
faraday (~> 0.8)
|
57
|
+
httpauth (~> 0.2)
|
58
|
+
jwt (~> 0.1.4)
|
59
|
+
multi_json (~> 1.0)
|
60
|
+
multi_xml (~> 0.5)
|
61
|
+
rack (~> 1.2)
|
62
|
+
rack (1.5.2)
|
63
|
+
rake (10.1.0)
|
64
|
+
rb-fsevent (0.9.3)
|
65
|
+
rb-inotify (0.9.0)
|
66
|
+
ffi (>= 0.5.0)
|
67
|
+
rb-kqueue (0.2.0)
|
38
68
|
ffi (>= 0.5.0)
|
39
|
-
rdoc (
|
69
|
+
rdoc (4.0.1)
|
40
70
|
json (~> 1.4)
|
41
71
|
rspec (2.8.0)
|
42
72
|
rspec-core (~> 2.8.0)
|
@@ -46,11 +76,11 @@ GEM
|
|
46
76
|
rspec-expectations (2.8.0)
|
47
77
|
diff-lcs (~> 1.1.2)
|
48
78
|
rspec-mocks (2.8.0)
|
49
|
-
simplecov (0.
|
79
|
+
simplecov (0.7.1)
|
50
80
|
multi_json (~> 1.0)
|
51
|
-
simplecov-html (~> 0.
|
52
|
-
simplecov-html (0.
|
53
|
-
thor (0.
|
81
|
+
simplecov-html (~> 0.7.1)
|
82
|
+
simplecov-html (0.7.1)
|
83
|
+
thor (0.18.1)
|
54
84
|
typhoeus (0.4.2)
|
55
85
|
ffi (~> 1.0)
|
56
86
|
mime-types (~> 1.18)
|
@@ -59,14 +89,14 @@ PLATFORMS
|
|
59
89
|
ruby
|
60
90
|
|
61
91
|
DEPENDENCIES
|
62
|
-
bundler (~> 1.
|
92
|
+
bundler (~> 1.3.0)
|
63
93
|
debugger
|
64
94
|
growl
|
65
95
|
guard (~> 1.2.3)
|
66
96
|
guard-rspec (~> 1.1.0)
|
67
|
-
jeweler (~> 1.
|
97
|
+
jeweler (~> 1.8.0)
|
68
98
|
nokogiri
|
69
99
|
rdoc (>= 3.9.4)
|
70
100
|
rspec (~> 2.8.0)
|
71
101
|
simplecov
|
72
|
-
typhoeus
|
102
|
+
typhoeus (~> 0.4.2)
|
data/README.markdown
CHANGED
@@ -6,6 +6,10 @@ Books, music, movies, etc aren't currently supported.
|
|
6
6
|
It is built on top of Nokogiri and Typhoeus.
|
7
7
|
Used in production to power [www.droidmeter.com](http://www.droidmeter.com/?t=github).
|
8
8
|
|
9
|
+
**This project is currently seeking developers to help maintain it.
|
10
|
+
Please send pull requests or contact me if you are able to help out.
|
11
|
+
The app scraper is known to work, but leader board functionality is currently broken.**
|
12
|
+
|
9
13
|
## Dependencies
|
10
14
|
|
11
15
|
* Nokogiri
|
@@ -68,6 +72,11 @@ Used in production to power [www.droidmeter.com](http://www.droidmeter.com/?t=gi
|
|
68
72
|
puts "First place app (#{first_app.title}) price: #{first_app.price}" unless first_app.error
|
69
73
|
puts "Last place app (#{last_app.title}) price: #{last_app.price}" unless last_app.error
|
70
74
|
|
75
|
+
## Excessive Use
|
76
|
+
|
77
|
+
Google will block your IP address if you attempt to scrape large quantities of data.
|
78
|
+
Please contact me if you are looking for commercial data solutions.
|
79
|
+
|
71
80
|
## Contributing to Market Bot
|
72
81
|
|
73
82
|
1. Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.10.0
|
@@ -19,132 +19,109 @@ module MarketBot
|
|
19
19
|
result = {}
|
20
20
|
|
21
21
|
doc = Nokogiri::HTML(html)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
(3..(elem_count - 1)).select{ |n| n.odd? }.each do |i|
|
27
|
-
field_name = elements[i].text
|
22
|
+
meta_info = doc.css('.meta-info')
|
23
|
+
meta_info.each do |info|
|
24
|
+
field_name = info.css('.title').text.strip
|
28
25
|
|
29
26
|
case field_name
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
27
|
+
when 'Updated'
|
28
|
+
result[:updated] = info.css('.content').text.strip
|
29
|
+
when 'Installs'
|
30
|
+
result[:installs] = info.css('.content').text.strip
|
31
|
+
when 'Size'
|
32
|
+
result[:size] = info.css('.content').text.strip
|
33
|
+
when 'Current Version'
|
34
|
+
result[:current_version] = info.css('.content').text.strip
|
35
|
+
when 'Requires Android'
|
36
|
+
result[:requires_android] = info.css('.content').text.strip
|
37
|
+
when 'Content Rating'
|
38
|
+
result[:content_rating] = info.css('.content').text.strip
|
39
|
+
when 'Contact Developer'
|
40
|
+
info.css('.dev-link').each do |node|
|
41
|
+
if node.text.strip.eql? 'Email Developer'
|
42
|
+
result[:email] = node[:href].gsub(/^mailto:/,'')
|
43
|
+
else
|
44
|
+
redirect_url = node[:href]
|
45
|
+
if q_param = URI(redirect_url).query.split('&').select{ |p| p =~ /q=/ }.first
|
46
|
+
actual_url = q_param.gsub('q=', '')
|
47
|
+
end
|
48
|
+
|
49
|
+
result[:website_url] = actual_url
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
46
53
|
end
|
47
54
|
end
|
48
55
|
|
49
|
-
|
50
|
-
result[:
|
56
|
+
node = doc.xpath("//meta[@itemprop='price']").first
|
57
|
+
result[:price] = node[:content].strip rescue 'Free'
|
51
58
|
|
52
|
-
|
53
|
-
result[:
|
59
|
+
result[:category] = doc.css('.category').first.text.strip rescue ''
|
60
|
+
result[:description] = doc.xpath("//div[@itemprop='description']").first.inner_html.strip
|
61
|
+
result[:title] = doc.xpath("//div[@itemprop='name']").first.text.strip
|
54
62
|
|
55
|
-
|
56
|
-
|
63
|
+
score = doc.css('.score-container').first
|
64
|
+
unless score.nil?
|
65
|
+
node = score.css('.score').first
|
66
|
+
result[:rating] = node.text.strip
|
67
|
+
node = score.xpath("//meta[@itemprop='ratingCount']").first
|
68
|
+
result[:votes] = node[:content].strip
|
69
|
+
end
|
57
70
|
|
58
|
-
|
71
|
+
node = doc.xpath("//div[@itemprop='author']")
|
72
|
+
result[:developer] = node.css('.primary').first.text.strip
|
59
73
|
|
60
74
|
result[:more_from_developer] = []
|
61
75
|
result[:users_also_installed] = []
|
62
76
|
result[:related] = []
|
63
77
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
78
|
+
node = doc.css('.recommendation')
|
79
|
+
node.css('.rec-cluster').each do |recommended|
|
80
|
+
assoc_app_type = recommended.css('.heading').first.text.strip.eql?('Similar' ) ? :related : :more_from_developer
|
81
|
+
recommended.css('.card').each do |card|
|
82
|
+
assoc_app = {}
|
83
|
+
assoc_app[:app_id] = card['data-docid'].strip
|
69
84
|
|
70
|
-
assoc_app_type
|
71
|
-
result[assoc_app_type] ||= []
|
72
|
-
|
73
|
-
similar_elem_child.css('.app-left-column-related-snippet-container').each do |app_elem|
|
74
|
-
assoc_app = {}
|
75
|
-
|
76
|
-
assoc_app[:app_id] = app_elem.attributes['data-docid'].text
|
77
|
-
|
78
|
-
result[assoc_app_type] << assoc_app
|
79
|
-
end
|
85
|
+
result[assoc_app_type] << assoc_app
|
80
86
|
end
|
81
87
|
end
|
88
|
+
# Users also installed is no longer on the page, adding this for backwards compatibility, well, sort of....
|
89
|
+
result[:users_also_installed] = result[:related]
|
82
90
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
result[:banner_image_url] =
|
87
|
-
else
|
88
|
-
result[:banner_image_url] = nil
|
91
|
+
node = doc.css('.cover-image').first
|
92
|
+
unless node.nil?
|
93
|
+
result[:banner_icon_url] = node[:src]
|
94
|
+
result[:banner_image_url] = node[:src]
|
89
95
|
end
|
90
96
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
97
|
+
result[:youtube_video_ids] = []
|
98
|
+
doc.css('.play-click-target').each do |node|
|
99
|
+
url = node['data-video-url']
|
100
|
+
unless url.nil?
|
101
|
+
result[:youtube_video_ids] << url.split('embed/').last.split('?').first
|
96
102
|
end
|
97
|
-
|
98
|
-
result[:website_url] = actual_url
|
99
|
-
end
|
100
|
-
|
101
|
-
if email_elem = doc.css('a').select{ |l| l.text.include?("Email Developer")}.first
|
102
|
-
result[:email] = email_elem.attribute('href').value.gsub(/^mailto:/, '')
|
103
|
-
end
|
104
|
-
|
105
|
-
unless (video_section_elem = doc.css('.doc-video-section')).empty?
|
106
|
-
urls = video_section_elem.children.css('embed').map{ |e| e.attribute('src').value }
|
107
|
-
result[:youtube_video_ids] = urls.map{ |u| /youtube\.com\/v\/(.*)\?/.match(u)[1] }
|
108
|
-
else
|
109
|
-
result[:youtube_video_ids] = []
|
110
103
|
end
|
111
104
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
result[:screenshot_urls] = screenshots.map { |s| s.attributes['src'].value }
|
116
|
-
else
|
117
|
-
result[:screenshot_urls] = []
|
105
|
+
result[:screenshot_urls] = []
|
106
|
+
doc.css('.screenshot').each do |node|
|
107
|
+
result[:screenshot_urls] << node[:src]
|
118
108
|
end
|
119
109
|
|
120
|
-
|
110
|
+
node = doc.css('.whatsnew').first
|
111
|
+
result[:whats_new] = node.inner_html.strip unless node.nil?
|
121
112
|
|
113
|
+
# Stubbing out for now, can't find them in the redesigned page.
|
122
114
|
result[:permissions] = permissions = []
|
123
|
-
perm_types = ['dangerous', 'safe']
|
124
|
-
perm_types.each do |type|
|
125
|
-
doc.css("#doc-permissions-#{type} .doc-permission-group").each do |group_elem|
|
126
|
-
title = group_elem.css('.doc-permission-group-title').text
|
127
|
-
group_elem.css('.doc-permission-description').each do |desc_elem|
|
128
|
-
#permissions << { :security => type, :group => title, :description => desc_elem.text }
|
129
|
-
end
|
130
|
-
descriptions = group_elem.css('.doc-permission-description').map { |e| e.text }
|
131
|
-
descriptions_full = group_elem.css('.doc-permission-description-full').map { |e| e.text }
|
132
|
-
(0...descriptions.length).each do |i|
|
133
|
-
desc = descriptions[i]
|
134
|
-
desc_full = descriptions_full[i]
|
135
|
-
permissions << { :security => type, :group => title, :description => desc, :description_full => desc_full }
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
115
|
|
140
116
|
result[:rating_distribution] = { 5 => nil, 4 => nil, 3 => nil, 2 => nil, 1 => nil }
|
141
117
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
118
|
+
histogram = doc.css('div.rating-histogram')
|
119
|
+
cur_index = 5
|
120
|
+
%w(five four three two one).each do |slot|
|
121
|
+
node = histogram.css(".#{slot.to_s}")
|
122
|
+
result[:rating_distribution][cur_index] = node.css('.bar-number').text.to_i
|
123
|
+
cur_index -= 1
|
124
|
+
|
148
125
|
end
|
149
126
|
|
150
127
|
result[:html] = html
|
@@ -30,7 +30,11 @@ module MarketBot
|
|
30
30
|
end
|
31
31
|
|
32
32
|
result[:title] = details_node.css('.title').first.attributes['title'].to_s
|
33
|
-
|
33
|
+
|
34
|
+
if (price_elem = details_node.css('.buy-button-price').children.first)
|
35
|
+
result[:price_usd] = price_elem.text.gsub(' Buy', '')
|
36
|
+
end
|
37
|
+
|
34
38
|
result[:developer] = details_node.css('.attribution').children.first.text
|
35
39
|
result[:market_id] = details_node.css('.title').first.attributes['href'].to_s.gsub('/store/apps/details?id=', '').gsub(/&feature=.*$/, '')
|
36
40
|
result[:market_url] = "https://play.google.com/store/apps/details?id=#{result[:market_id]}&hl=en"
|
@@ -69,6 +73,7 @@ module MarketBot
|
|
69
73
|
@hydra = options[:hydra] || MarketBot.hydra
|
70
74
|
@request_opts = options[:request_opts] || {}
|
71
75
|
@parsed_results = []
|
76
|
+
@pending_pages = []
|
72
77
|
end
|
73
78
|
|
74
79
|
def market_urls(options={})
|
@@ -92,7 +97,8 @@ module MarketBot
|
|
92
97
|
results
|
93
98
|
end
|
94
99
|
|
95
|
-
def enqueue_update(options={})
|
100
|
+
def enqueue_update(options={},&block)
|
101
|
+
@callback = block
|
96
102
|
if @identifier.to_s.downcase == 'editors_choice' && category == nil
|
97
103
|
url = 'https://play.google.com/store/apps/collection/editors_choice?&hl=en'
|
98
104
|
process_page(url, 1)
|
@@ -130,6 +136,7 @@ module MarketBot
|
|
130
136
|
|
131
137
|
private
|
132
138
|
def process_page(url, page_num)
|
139
|
+
@pending_pages << page_num
|
133
140
|
request = Typhoeus::Request.new(url, @request_opts)
|
134
141
|
request.on_complete do |response|
|
135
142
|
# HACK: Typhoeus <= 0.4.2 returns a response, 0.5.0pre returns the request.
|
@@ -143,6 +150,8 @@ module MarketBot
|
|
143
150
|
|
144
151
|
def update_callback(result, page)
|
145
152
|
@parsed_results[page] = result
|
153
|
+
@pending_pages.delete(page)
|
154
|
+
@callback.call(self) if @callback and @pending_pages.empty?
|
146
155
|
end
|
147
156
|
end
|
148
157
|
|
@@ -4,7 +4,7 @@ module MarketBot
|
|
4
4
|
# Search query pages are extremely similar to leaderboard pages.
|
5
5
|
# Amazingly, this inheritence hack works!
|
6
6
|
class SearchQuery < MarketBot::Android::Leaderboard
|
7
|
-
def
|
7
|
+
def initialize(query, options={})
|
8
8
|
super(query, nil, options)
|
9
9
|
end
|
10
10
|
|
data/market_bot.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "market_bot"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.10.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Chad Remesch"]
|
12
|
-
s.date = "
|
12
|
+
s.date = "2013-07-19"
|
13
13
|
s.description = "Market Bot is a high performance Ruby scraper for Google's Android Market with a simple to use API. It is built on top of Nokogiri and Typhoeus."
|
14
14
|
s.email = "chad@remesch.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -51,18 +51,18 @@ Gem::Specification.new do |s|
|
|
51
51
|
s.homepage = "http://github.com/chadrem/market_bot"
|
52
52
|
s.licenses = ["MIT"]
|
53
53
|
s.require_paths = ["lib"]
|
54
|
-
s.rubygems_version = "
|
54
|
+
s.rubygems_version = "2.0.3"
|
55
55
|
s.summary = "Market Bot: High performance Ruby scraper for Google's Android Market"
|
56
56
|
|
57
57
|
if s.respond_to? :specification_version then
|
58
|
-
s.specification_version =
|
58
|
+
s.specification_version = 4
|
59
59
|
|
60
60
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
61
|
-
s.add_runtime_dependency(%q<typhoeus>, ["
|
61
|
+
s.add_runtime_dependency(%q<typhoeus>, ["~> 0.4.2"])
|
62
62
|
s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
|
63
63
|
s.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
|
64
|
-
s.add_development_dependency(%q<bundler>, ["~> 1.
|
65
|
-
s.add_development_dependency(%q<jeweler>, ["~> 1.
|
64
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.3.0"])
|
65
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.8.0"])
|
66
66
|
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
67
67
|
s.add_development_dependency(%q<rdoc>, [">= 3.9.4"])
|
68
68
|
s.add_development_dependency(%q<guard>, ["~> 1.2.3"])
|
@@ -70,11 +70,11 @@ Gem::Specification.new do |s|
|
|
70
70
|
s.add_development_dependency(%q<growl>, [">= 0"])
|
71
71
|
s.add_development_dependency(%q<debugger>, [">= 0"])
|
72
72
|
else
|
73
|
-
s.add_dependency(%q<typhoeus>, ["
|
73
|
+
s.add_dependency(%q<typhoeus>, ["~> 0.4.2"])
|
74
74
|
s.add_dependency(%q<nokogiri>, [">= 0"])
|
75
75
|
s.add_dependency(%q<rspec>, ["~> 2.8.0"])
|
76
|
-
s.add_dependency(%q<bundler>, ["~> 1.
|
77
|
-
s.add_dependency(%q<jeweler>, ["~> 1.
|
76
|
+
s.add_dependency(%q<bundler>, ["~> 1.3.0"])
|
77
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8.0"])
|
78
78
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
79
79
|
s.add_dependency(%q<rdoc>, [">= 3.9.4"])
|
80
80
|
s.add_dependency(%q<guard>, ["~> 1.2.3"])
|
@@ -83,11 +83,11 @@ Gem::Specification.new do |s|
|
|
83
83
|
s.add_dependency(%q<debugger>, [">= 0"])
|
84
84
|
end
|
85
85
|
else
|
86
|
-
s.add_dependency(%q<typhoeus>, ["
|
86
|
+
s.add_dependency(%q<typhoeus>, ["~> 0.4.2"])
|
87
87
|
s.add_dependency(%q<nokogiri>, [">= 0"])
|
88
88
|
s.add_dependency(%q<rspec>, ["~> 2.8.0"])
|
89
|
-
s.add_dependency(%q<bundler>, ["~> 1.
|
90
|
-
s.add_dependency(%q<jeweler>, ["~> 1.
|
89
|
+
s.add_dependency(%q<bundler>, ["~> 1.3.0"])
|
90
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8.0"])
|
91
91
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
92
92
|
s.add_dependency(%q<rdoc>, [">= 3.9.4"])
|
93
93
|
s.add_dependency(%q<guard>, ["~> 1.2.3"])
|