google_custom_search_api 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 228c6676867465f4a11356a89dd36130f926f38d
4
+ data.tar.gz: 9aca83a6a4cc013be2d2bfac1c1928add7104a88
5
+ SHA512:
6
+ metadata.gz: 76fc199878f446ef2ba231c8ca3a3a29034debe1ea9943f2a1d30e00c99984926bcddc2f230e6b088af55d38053178f2e075d77be69b5b87218f22d4ebedf56d
7
+ data.tar.gz: 825d19ec8e359ea688cc72ff321eae2c791b7f043a801e081b6867ae45df914a8655cf1b60ca6a2da3111687933da6212309ead48f8c13b3c06352f1d64e2089
@@ -1,32 +1,42 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- google_custom_search_api (0.0.4)
4
+ google_custom_search_api (2.0.0)
5
+ addressable
5
6
  httparty
6
7
 
7
8
  GEM
8
9
  remote: http://rubygems.org/
9
10
  specs:
10
- addressable (2.2.7)
11
- crack (0.3.1)
12
- diff-lcs (1.1.3)
13
- httparty (0.8.1)
14
- multi_json
15
- multi_xml
16
- json (1.6.5)
17
- multi_json (1.3.4)
18
- multi_xml (0.4.2)
19
- rspec (2.9.0)
20
- rspec-core (~> 2.9.0)
21
- rspec-expectations (~> 2.9.0)
22
- rspec-mocks (~> 2.9.0)
23
- rspec-core (2.9.0)
24
- rspec-expectations (2.9.0)
25
- diff-lcs (~> 1.1.3)
26
- rspec-mocks (2.9.0)
27
- webmock (1.8.3)
28
- addressable (>= 2.2.7)
29
- crack (>= 0.1.7)
11
+ addressable (2.3.8)
12
+ crack (0.4.3)
13
+ safe_yaml (~> 1.0.0)
14
+ diff-lcs (1.2.5)
15
+ hashdiff (0.2.3)
16
+ httparty (0.13.7)
17
+ json (~> 1.8)
18
+ multi_xml (>= 0.5.2)
19
+ json (1.8.3)
20
+ multi_xml (0.5.5)
21
+ rspec (3.4.0)
22
+ rspec-core (~> 3.4.0)
23
+ rspec-expectations (~> 3.4.0)
24
+ rspec-mocks (~> 3.4.0)
25
+ rspec-core (3.4.1)
26
+ rspec-support (~> 3.4.0)
27
+ rspec-expectations (3.4.0)
28
+ diff-lcs (>= 1.2.0, < 2.0)
29
+ rspec-support (~> 3.4.0)
30
+ rspec-mocks (3.4.0)
31
+ diff-lcs (>= 1.2.0, < 2.0)
32
+ rspec-support (~> 3.4.0)
33
+ rspec-support (3.4.1)
34
+ safe_yaml (1.0.4)
35
+ vcr (3.0.1)
36
+ webmock (1.22.5)
37
+ addressable (< 2.4.0)
38
+ crack (>= 0.3.2)
39
+ hashdiff
30
40
 
31
41
  PLATFORMS
32
42
  ruby
@@ -35,4 +45,8 @@ DEPENDENCIES
35
45
  google_custom_search_api!
36
46
  json
37
47
  rspec
48
+ vcr
38
49
  webmock
50
+
51
+ BUNDLED WITH
52
+ 1.10.6
data/README.md CHANGED
@@ -22,19 +22,30 @@ You need to configure ```GOOGLE_SEARCH_CX``` and ```GOOGLE_API_KEY``` to ```conf
22
22
  GOOGLE_API_KEY = "..."
23
23
  GOOGLE_SEARCH_CX = "..."
24
24
  ```
25
- You can get your ```GOOGLE_API_KEY``` from https://code.google.com/apis/console/b/0/?pli=1 - There are many choices - Simple API Access is probably what you want. There are more elaborate authorization schemes available for Google services but those aren't currently implemented.
26
25
 
27
- You can get your ```GOOGLE_SEARCH_CX``` from http://www.google.com/cse/ Either create a custom engine or follow ```manage your existing search engines``` and go to your cse's Control panel. ```GOOGLE_SEARCH_CX``` == ```Search engine unique ID```
26
+ Google's API management is confusing at best. At the time of this writing you codes like so:
28
27
 
29
- ### Searching the web, not just your site, with CSE
28
+ ### GOOGLE_API_KEY
30
29
 
31
- Google CSE was set up so search specific sites. To search the entire web simply go to http://www.google.com/cse/, find your CSE, go to it's control panel.
30
+ * Go to [Google Projects](https://console.developers.google.com/project)
31
+ * Create a project, open it
32
+ * Under `Explore other services` choose `Enable APIs and get credentials like keys`
33
+ * Search for `custom search` and click on it
34
+ * In the left column click on `Credentials`
35
+ * Under `API keys` grab your key. This is your `GOOGLE_API_KEY`
32
36
 
33
- * in ```Basics``` under ```Search Preferences``` choose ```Search the entire web but emphasize included sites.```
34
- * in ```Sites``` add ```www.google.com```
37
+ ### GOOGLE_SEARCH_CX
38
+
39
+ * Go to [Google CSE](https://cse.google.com/cse)
40
+ * Create a search engine and click on it
41
+ * Under `Setup > Tabs > Basic` find `Details` and click `Search engine ID`
42
+ * This is your GOOGLE_SEARCH_CX
43
+ * Make sure to add a site under `Sites to search`
35
44
 
36
45
  ## Use
37
46
 
47
+ ### Search
48
+
38
49
  To perform a search:
39
50
 
40
51
  ```
@@ -58,49 +69,189 @@ or
58
69
  end
59
70
  ```
60
71
 
61
- You can get all ten pages at once by doing:
72
+ ### Paging
73
+
74
+ Google only returns 10 results at a time and a maximum of 100 results. The easiest way to page through results if to use `:page`. Paging is 1 based (1-10). The default page is 1
62
75
 
63
76
  ```
64
- results = GoogleCustomSearchApi.search_and_return_all_results(query, opts)
65
- results.size == 10
66
- results.collect {|r| r.items.size }.sum == 100 #if there were 100 results
77
+ results = GoogleCustomerSearchApi.search("poker", page: 2)
78
+ results.pages == 10
79
+ results.current_page == 2
80
+ results.next_page == 3
81
+ results.previous_page == 1
82
+
83
+ results = GoogleCustomerSearchApi.search("poker", page: 1)
84
+ results.pages == 10
85
+ results.current_page == 1
86
+ results.next_page == 2
87
+ results.previous_page == nil
88
+
89
+ results = GoogleCustomerSearchApi.search("poker", page: 10)
90
+ results.pages == 10
91
+ results.current_page == 10
92
+ results.next_page == nil
93
+ results.previous_page == 9
67
94
  ```
68
95
 
69
- search_and_return_all_results also yields results as it goes:
96
+ You can also use `:start` - which can be any number between 1 and 99. The `:page` helpers won't be accurate with `:start`
97
+
98
+ Example: get results 13-23
70
99
 
71
100
  ```
72
- GoogleCustomSearchApi.search_and_return_all_results(query, opts) do |results|
73
- results.items.size == 10
74
- end
101
+ results = GoogleCustomerSearchApi.search('poker', start: 13)
75
102
  ```
76
103
 
77
104
  See [Custom Search](http://code.google.com/apis/customsearch/v1/using_rest.html) documentation for an explanation of all fields available.
78
105
 
79
- ### Paging
106
+ ### Search and return all results
107
+
108
+ This method isn't so useful because it's pretty slow (do to fetching up to 10 pages from Google). Helpful for testing sometimes.
109
+
110
+ ```
111
+ results = search_and_return_all_results('poker')
112
+ results.first.items.size # == 10
113
+
114
+ search_and_resturn_all_results('poker') do |results|
115
+ results.items.size # == 10 10 times
116
+ end
117
+
118
+ search_and_return_all_results(
119
+ '"California cult winery known for its Rhône"') do |results|
120
+ results.items.size # == 3 1 time
121
+ end
122
+ ```
123
+
124
+ ### Errors
125
+
126
+ Custom Search only returns a maximum of 100 results so - if you try something like
127
+
128
+ ```
129
+ results = GoogleCustomSearchApi.search('poker', start: 101)
130
+ ```
131
+ You get error and empty items.
132
+
133
+ ```
134
+ {
135
+ "error"=> {
136
+ "errors"=> [
137
+ {
138
+ "domain"=>"global",
139
+ "reason"=>"invalid",
140
+ "message"=>"Invalid Value"
141
+ }
142
+ ],
143
+ "code"=>400,
144
+ "message"=>"Invalid Value"
145
+ },
146
+ "items"=>[]
147
+ }
148
+ ```
149
+
150
+ So check for:
151
+
152
+ ```
153
+ if results.try(:error) || results.items.empty?
154
+ ```
155
+ ### Rails example
156
+
157
+ In **Gemfile**
158
+
159
+ ```
160
+ gem "google_custom_search_api"
161
+ ```
162
+
163
+ In **config/initializers/google_search.rb**
80
164
 
81
- By default CSE returns a maximum of 10 results at a time, you can't get more results without paging. BTW if you want fewer results just pass in the :num => 1-10 option when searching.
165
+ ```
166
+ GOOGLE_API_KEY = '...'
167
+ GOOGLE_SEARCH_CX = '...'
168
+ ```
82
169
 
83
- To do paging we pass in the :start option. Example:
170
+ In **config/routes.rb**
84
171
 
85
172
  ```
86
- results = GoogleCustomSearchApi.search("poker", :start => 1)
173
+ get '/search' => 'search#index'
87
174
  ```
88
175
 
89
- The maximum number of pages CSE allows is 10 - or 100 results in total. To walk through the pages you can use :start => 1, :start => 11, etc. Or you can use the results to find the next value, like so:
176
+ In **app/controllers/search_controller.rb** you'd have something like this:
90
177
 
91
178
  ```
92
- start = 1
93
- begin
94
- results = GoogleCustomSearchApi.search("poker",:start => start)
95
- if results.queries.keys.include?("nextPage")
96
- start = results.queries.nextPage.first.startIndex
97
- else
98
- start = nil
99
- end
100
- end while start.nil? == false
179
+ class SearchController < ApplicationController
180
+ def index
181
+ if params[:q]
182
+ page = params[:page] || 1
183
+ @results = GoogleCustomSearchApi.search(params[:q],
184
+ page: page)
185
+ end
186
+ end
187
+ end
101
188
  ```
102
189
 
103
- If you just want all results you can use the method ```search_and_return_all_results(query, opts = {})``` works just like the normal search but iterates through all available results and puts them in an array.
190
+ And a simple view might look like this **app/search/index.html.erb** (this is using bootstrap styling)
191
+
192
+ ```
193
+ <section class='search-section'>
194
+ <div class='text-center titles-with-yellow'>
195
+ <h1>Search/h1>
196
+ </div>
197
+ <div class='container'>
198
+ <div class='text-center search-bar'>
199
+ <%= form_tag search_path, method: :get do %>
200
+ <div class="inner-addon right-addon">
201
+ <i class="glyphicon glyphicon-search"></i>
202
+ <%= text_field_tag :q, params[:q], class: 'form-control' %>
203
+ </div>
204
+ <% end %>
205
+ </div>
206
+ </div>
207
+
208
+ <% if @results && !@results.items.empty? %>
209
+ <div class='container'>
210
+ <% @results.items.each do |item| %>
211
+ <div class='row'>
212
+ <h4><%= link_to item.htmlTitle.html_safe, item.link %></h4>
213
+ <div>
214
+ <% if item['pagemap'] &&
215
+ item['pagemap']['cse_thumbnail'] &&
216
+ img = item.pagemap.cse_thumbnail.first %>
217
+ <div class='col-sm-2'>
218
+ <%= image_tag(img.src, width: '200px') %>
219
+ </div>
220
+ <div class='col-sm-10'>
221
+ <%= item.htmlSnippet.html_safe %>
222
+ </div>
223
+ <% else %>
224
+ <%= item.htmlSnippet.html_safe %>
225
+ <% end %>
226
+ </div>
227
+ </div>
228
+ <% end %>
229
+ </div>
230
+ <div class='container search-prev-next'>
231
+ <div class='row text-center'>
232
+ <% if @results.previous_page %>
233
+ <%= link_to '<< Previous',
234
+ search_path(q: params[:q], page: @results.previous_page),
235
+ class: 'btn' %>
236
+ <% end %>
237
+ <% @results.pages.times do |i| %>
238
+ <%= link_to i + 1,
239
+ search_path(q: params[:q], page: i+1),
240
+ class: 'btn btn-page' %>
241
+ <% end %>
242
+ <% if @results.next_page %>
243
+ <%= link_to 'Next >>',
244
+ search_path(q: params[:q],
245
+ page: @results.next_page),
246
+ class: 'btn' %>
247
+ <% end %>
248
+ </div>
249
+ </div>
250
+ <% else %>
251
+ <h4>No results</h4>
252
+ <% end %>
253
+ </section>
254
+ ```
104
255
 
105
256
  ### Encoding issues
106
257
 
@@ -131,12 +282,4 @@ To run tests
131
282
  * Awesome ResponseData class from https://github.com/mikedemers/rbing
132
283
  * Work done while working on a project for the company http://reInteractive.net in sunny Sydney. A great ruby shop should you need help with something.
133
284
 
134
- ## TODO
135
- * pretty light on the tests
136
-
137
- ## Sample results
138
-
139
- See spec/fixtures/*.json for examples of data returned
140
-
141
-
142
285
  Copyright (c) 2012 Ben Wiseley, released under the MIT license
@@ -8,38 +8,83 @@ require 'addressable/uri'
8
8
 
9
9
  module GoogleCustomSearchApi
10
10
  extend self
11
-
11
+
12
12
  ##
13
13
  # Search the site.
14
14
  #
15
- # opts
16
- # see list here for valid options http://code.google.com/apis/customsearch/v1/using_rest.html#query-params
15
+ # opts
16
+ # see list here for valid options
17
+ # http://code.google.com/apis/customsearch/v1/using_rest.html#query-params
17
18
  def search(query, opts = {})
19
+ opts[:start] ||= 1
20
+
21
+ if (page = opts.delete(:page))
22
+ page = page.to_i
23
+ opts[:start] = (page - 1).abs * 10 + 1
24
+ else
25
+ page = (opts[:start].to_i / 10) + 1
26
+ end
27
+ page = 10 if page > 10
28
+
18
29
  # Get and parse results.
19
30
  url = url(query, opts)
20
- # puts url
21
31
  return nil unless results = fetch(url)
22
- results["items"] ||= []
23
-
24
- if file_path = opts[:save_json_to_file_path]
25
- opts[:start] ||= 1
26
- Dir.mkdir(file_path) unless Dir.exists?(file_path)
27
- fname = "google_#{query.gsub(/[^0-9A-Za-z]/, '_')}_#{opts[:start]}.json"
28
- file = File.join(file_path, fname)
29
- File.delete(file) if File.exist?(file)
30
- open(file,'w') do |f|; f.puts results.to_json; end
32
+
33
+ results['items'] ||= []
34
+
35
+ # paging
36
+ if results.keys.include?('queries')
37
+ data = results['queries']['request'].first
38
+ results['pages'] = data['totalResults'].to_i / 10
39
+ results['pages'] = 10 if results['pages'] > 10
40
+ results['current_page'] = page.to_i
41
+
42
+ results['next_page'] = nil
43
+ results['previous_page'] = nil
44
+
45
+ if results['queries'].include?('nextPage') && page < 10
46
+ results['next_page'] = results['current_page'] + 1
47
+ end
48
+
49
+ if page > 1
50
+ results['previous_page'] = page - 1
51
+ end
31
52
  end
32
53
 
33
54
  ResponseData.new(results)
34
55
  end
35
-
56
+
57
+ ##
58
+ # Search the site for all available results (max 100)
59
+ #
60
+ # This isn't so useful because it's quite slow
61
+ #
62
+ # Returns an array of up to 10 search(query) results
63
+ #
64
+ # examples:
65
+ #
66
+ # results = search_and_return_all_results('poker')
67
+ # results.first.items.size # == 10
68
+ #
69
+ # search_and_resturn_all_results('poker') do |results|
70
+ # results.items.size # == 10 10 times
71
+ # end
72
+ #
73
+ # search_and_return_all_results(
74
+ # '"California cult winery known for its Rhône"') do |results|
75
+ # results.items.size # == 3 1 time
76
+ # end
77
+ #
78
+ # opts
79
+ # see list here for valid options
80
+ # http://code.google.com/apis/customsearch/v1/using_rest.html#query-params
36
81
  def search_and_return_all_results(query, opts = {})
37
82
  res = []
38
83
  opts[:start] ||= 1
39
84
  begin
40
- results = GoogleCustomSearchApi.search(query,opts)
41
- # results = ResponseData.new(read_search_data("google_poker_#{opts[:start]}"))
42
- yield results
85
+ results = GoogleCustomSearchApi.search(query, opts)
86
+ return res unless results.keys.include?('queries')
87
+ yield results if block_given?
43
88
  res << results
44
89
  if results.queries.keys.include?("nextPage")
45
90
  opts[:start] = results.queries.nextPage.first.startIndex
@@ -49,11 +94,7 @@ module GoogleCustomSearchApi
49
94
  end while opts[:start].nil? == false
50
95
  return res
51
96
  end
52
-
53
- # def read_search_data(fname)
54
- # JSON.parse(File.read("/Users/wiseleyb/dev/rubyx/icm/spec/fixtures/searches/#{fname}.json"))
55
- # end
56
-
97
+
57
98
  # Convenience wrapper for the response Hash.
58
99
  # Converts keys to Strings. Crawls through all
59
100
  # member data and converts any other Hashes it
@@ -62,8 +103,11 @@ module GoogleCustomSearchApi
62
103
  # to camel case.
63
104
  #
64
105
  # Usage:
65
- #
66
- # rd = ResponseData.new("AlphaBeta" => 1, "Results" => {"Gamma" => 2, "delta" => [3, 4]})
106
+ #
107
+ # rd = ResponseData.new("AlphaBeta" => 1,
108
+ # "Results" => {
109
+ # "Gamma" => 2,
110
+ # "delta" => [3, 4]})
67
111
  # puts rd.alpha_beta
68
112
  # => 1
69
113
  # puts rd.alpha_beta.results.gamma
@@ -76,6 +120,7 @@ module GoogleCustomSearchApi
76
120
  def initialize(data={})
77
121
  data.each_pair {|k,v| self[k.to_s] = deep_parse(v) }
78
122
  end
123
+
79
124
  def deep_parse(data)
80
125
  case data
81
126
  when Hash
@@ -86,10 +131,15 @@ module GoogleCustomSearchApi
86
131
  data
87
132
  end
88
133
  end
134
+
89
135
  def method_missing(*args)
90
136
  name = args[0].to_s
91
137
  return self[name] if has_key? name
92
- camelname = name.split('_').map {|w| "#{w[0,1].upcase}#{w[1..-1]}" }.join("")
138
+
139
+ camelname = name.split('_').map do |w|
140
+ "#{w[0,1].upcase}#{w[1..-1]}"
141
+ end.join("")
142
+
93
143
  if has_key? camelname
94
144
  self[camelname]
95
145
  else
@@ -97,14 +147,15 @@ module GoogleCustomSearchApi
97
147
  end
98
148
  end
99
149
  end
100
-
101
-
102
- private # -------------------------------------------------------------------
103
-
150
+
151
+
152
+ private
153
+
104
154
  ##
105
155
  # Build search request URL.
106
156
  #
107
- # see list here for valid options http://code.google.com/apis/customsearch/v1/using_rest.html#query-params
157
+ # see list here for valid options
158
+ # http://code.google.com/apis/customsearch/v1/using_rest.html#query-params
108
159
  def url(query, opts = {})
109
160
  opts[:q] = query
110
161
  opts[:alt] ||= "json"
@@ -114,14 +165,14 @@ module GoogleCustomSearchApi
114
165
  params.merge!(GOOGLE_SEARCH_PARAMS)
115
166
  rescue NameError
116
167
  end
117
- "https://www.googleapis.com/customsearch/v1?key=#{GOOGLE_API_KEY}&cx=#{GOOGLE_SEARCH_CX}&#{uri.query}"
168
+ "https://www.googleapis.com/customsearch/v1?" \
169
+ "key=#{GOOGLE_API_KEY}&cx=#{GOOGLE_SEARCH_CX}&#{uri.query}"
118
170
  end
119
-
171
+
120
172
  ##
121
173
  # Query Google, and make sure it responds.
122
174
  #
123
175
  def fetch(url)
124
176
  return HTTParty.get(url)
125
177
  end
126
-
127
178
  end
@@ -1,3 +1,3 @@
1
1
  module GoogleCustomSearchApi
2
- VERSION = "1.0.0"
2
+ VERSION = "2.0.0"
3
3
  end
metadata CHANGED
@@ -1,143 +1,136 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: google_custom_search_api
3
- version: !ruby/object:Gem::Version
4
- hash: 23
5
- prerelease:
6
- segments:
7
- - 1
8
- - 0
9
- - 0
10
- version: 1.0.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Ben Wiseley
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2012-08-03 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
11
+ date: 2016-01-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
21
14
  name: httparty
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
26
17
  - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 3
29
- segments:
30
- - 0
31
- version: "0"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
32
20
  type: :runtime
33
- version_requirements: *id001
34
- - !ruby/object:Gem::Dependency
35
- name: addressable
36
21
  prerelease: false
37
- requirement: &id002 !ruby/object:Gem::Requirement
38
- none: false
39
- requirements:
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: addressable
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
40
31
  - - ">="
41
- - !ruby/object:Gem::Version
42
- hash: 3
43
- segments:
44
- - 0
45
- version: "0"
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
46
34
  type: :runtime
47
- version_requirements: *id002
48
- - !ruby/object:Gem::Dependency
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
49
42
  name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
50
49
  prerelease: false
51
- requirement: &id003 !ruby/object:Gem::Requirement
52
- none: false
53
- requirements:
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: vcr
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
54
59
  - - ">="
55
- - !ruby/object:Gem::Version
56
- hash: 3
57
- segments:
58
- - 0
59
- version: "0"
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
60
62
  type: :development
61
- version_requirements: *id003
62
- - !ruby/object:Gem::Dependency
63
- name: webmock
64
63
  prerelease: false
65
- requirement: &id004 !ruby/object:Gem::Requirement
66
- none: false
67
- requirements:
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
68
66
  - - ">="
69
- - !ruby/object:Gem::Version
70
- hash: 3
71
- segments:
72
- - 0
73
- version: "0"
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
74
76
  type: :development
75
- version_requirements: *id004
76
- - !ruby/object:Gem::Dependency
77
- name: json
78
77
  prerelease: false
79
- requirement: &id005 !ruby/object:Gem::Requirement
80
- none: false
81
- requirements:
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
82
80
  - - ">="
83
- - !ruby/object:Gem::Version
84
- hash: 3
85
- segments:
86
- - 0
87
- version: "0"
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: json
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
88
90
  type: :development
89
- version_requirements: *id005
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
90
97
  description: Ruby lib for Google's Custom Search Api.
91
- email:
98
+ email:
92
99
  - wiseleyb@gmail.com
93
100
  executables: []
94
-
95
101
  extensions: []
96
-
97
102
  extra_rdoc_files: []
98
-
99
- files:
103
+ files:
100
104
  - CHANGELOG.rdoc
101
105
  - Gemfile
102
106
  - Gemfile.lock
103
- - init.rb
104
107
  - LICENSE
105
- - Rakefile
106
108
  - README.md
109
+ - Rakefile
110
+ - init.rb
107
111
  - lib/google_custom_search_api.rb
108
112
  - lib/version.rb
109
113
  homepage: http://github.com/wiseleyb/google_custom_search_api
110
114
  licenses: []
111
-
115
+ metadata: {}
112
116
  post_install_message:
113
117
  rdoc_options: []
114
-
115
- require_paths:
118
+ require_paths:
116
119
  - lib
117
- required_ruby_version: !ruby/object:Gem::Requirement
118
- none: false
119
- requirements:
120
+ required_ruby_version: !ruby/object:Gem::Requirement
121
+ requirements:
120
122
  - - ">="
121
- - !ruby/object:Gem::Version
122
- hash: 3
123
- segments:
124
- - 0
125
- version: "0"
126
- required_rubygems_version: !ruby/object:Gem::Requirement
127
- none: false
128
- requirements:
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ required_rubygems_version: !ruby/object:Gem::Requirement
126
+ requirements:
129
127
  - - ">="
130
- - !ruby/object:Gem::Version
131
- hash: 3
132
- segments:
133
- - 0
134
- version: "0"
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
135
130
  requirements: []
136
-
137
131
  rubyforge_project:
138
- rubygems_version: 1.8.17
132
+ rubygems_version: 2.4.5.1
139
133
  signing_key:
140
- specification_version: 3
134
+ specification_version: 4
141
135
  summary: Ruby lib for Google's Custom Search Api.
142
136
  test_files: []
143
-