supernova 0.7.3 → 0.7.4

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.3
1
+ 0.7.4
@@ -21,4 +21,14 @@ class Supernova::Collection < WillPaginate::Collection
21
21
  def original_facet_queries
22
22
  original_criteria.search_options[:facet_queries] || {}
23
23
  end
24
+
25
+ def ids
26
+ @ids ||= extract_ids_from_solr_hash(original_response)
27
+ end
28
+
29
+ def extract_ids_from_solr_hash(solr_hash)
30
+ col = self.dup
31
+ col.replace(solr_hash["response"]["docs"].map { |hash| hash["id"][/(\d+)$/, 1].to_i })
32
+ col
33
+ end
24
34
  end
@@ -6,6 +6,18 @@ class Supernova::Condition
6
6
  self.type = type
7
7
  end
8
8
 
9
+ def ==(other)
10
+ self.hash == other.hash
11
+ end
12
+
13
+ def eql?(other)
14
+ self == other
15
+ end
16
+
17
+ def hash
18
+ [type, key].hash
19
+ end
20
+
9
21
  def solr_filter_for(value)
10
22
  case type
11
23
  when :not, :ne
@@ -24,7 +36,7 @@ class Supernova::Condition
24
36
  "#{key}:[* TO #{value}]"
25
37
  when :nin
26
38
  value.is_a?(Range) ? "#{key}:{* TO #{value.first}} OR #{key}:{#{value.last} TO *}" : "!(#{or_key_and_value(value)})"
27
- when :in
39
+ when :in, :inside
28
40
  or_key_and_value(value)
29
41
  end
30
42
  end
@@ -36,6 +48,8 @@ class Supernova::Condition
36
48
  def or_key_and_value(values)
37
49
  if values.is_a?(Range)
38
50
  "#{key}:[#{values.first} TO #{values.last}]"
51
+ elsif values.respond_to?(:ne) && values.respond_to?(:sw)
52
+ "#{key}:#{type == :inside ? "{" : "["}#{values.sw.lat},#{values.sw.lng} TO #{values.ne.lat},#{values.ne.lng}#{type == :inside ? "}" : "]"}"
39
53
  else
40
54
  values.map { |v| v.nil? ? "!#{nil_filter}" : "#{key}:#{v}"}.join(" OR ")
41
55
  end
@@ -185,27 +185,51 @@ class Supernova::SolrCriteria < Supernova::Criteria
185
185
  end
186
186
  end
187
187
 
188
- def execute_raw
189
- JSON.parse(Typhoeus::Request.post(Supernova::Solr.select_url, :params => to_params.merge(:wt => "json")).body)
188
+ def typhoeus_response
189
+ request = typhoeus_request
190
+ hydra.queue(request)
191
+ hydra.run
192
+ request.response
193
+ end
194
+
195
+ def hydra
196
+ Typhoeus::Hydra.hydra
197
+ end
198
+
199
+ def typhoeus_request
200
+ Typhoeus::Request.new(Supernova::Solr.select_url, :params => to_params.merge(:wt => "json"), :method => :post)
190
201
  end
191
202
 
192
203
  def execute
193
- response = execute_raw
194
- collection = Supernova::Collection.new(current_page, per_page == 0 ? 1 : per_page, response["response"]["numFound"])
204
+ collection_from_body(typhoeus_response.body)
205
+ end
206
+
207
+ def collection_from_body(body)
208
+ collection_from_json(JSON.parse(body))
209
+ end
210
+
211
+ def collection_from_json(json)
212
+ collection = Supernova::Collection.new(current_page, per_page == 0 ? 1 : per_page, json["response"]["numFound"])
195
213
  collection.original_criteria = self.clone
196
- collection.original_response = response
197
- collection.facets = hashify_facets_from_response(response)
198
- collection.replace(build_docs(response["response"]["docs"]))
214
+ collection.original_response = json
215
+ collection.facets = hashify_facets_from_response(json)
216
+ collection.replace(build_docs(json["response"]["docs"]))
199
217
  collection
200
218
  end
201
219
 
220
+ def execute_async(&block)
221
+ request = typhoeus_request
222
+ request.on_complete do |response|
223
+ block.call(collection_from_body(response.body))
224
+ end
225
+ hydra.queue(request)
226
+ end
227
+
202
228
  def only_ids
203
229
  self_or_clone.except(:select).select("id")
204
230
  end
205
231
 
206
232
  def ids
207
- only_ids.execute.tap do |col|
208
- col.replace(col.map { |h| h["id"].split("/").last.to_i })
209
- end
233
+ only_ids.execute.ids
210
234
  end
211
235
  end
@@ -1,5 +1,5 @@
1
1
  Symbol.class_eval do
2
- [:not, :gt, :gte, :lt, :lte, :ne, :nin, :in].each do |method|
2
+ [:not, :gt, :gte, :lt, :lte, :ne, :nin, :in, :inside].each do |method|
3
3
  define_method(method) do
4
4
  Supernova::Condition.new(self, method)
5
5
  end
@@ -173,6 +173,66 @@ describe "Solr" do
173
173
  end
174
174
  end
175
175
 
176
+ describe "bounding box search" do
177
+ class Coordinate
178
+ attr_accessor :lat, :lng
179
+
180
+ def initialize(attributes = {})
181
+ attributes.each do |key, value|
182
+ self.send(:"#{key}=", value)
183
+ end
184
+ end
185
+
186
+ def to_s
187
+ "#{lat},#{lng}"
188
+ end
189
+ end
190
+
191
+ class BoundingBox
192
+ attr_accessor :ne, :sw
193
+
194
+ def initialize(attributes = {})
195
+ attributes.each do |key, value|
196
+ self.send(:"#{key}=", value)
197
+ end
198
+ end
199
+ end
200
+
201
+ let(:inside) { GeoKit::LatLng.new(9.990317, 53.556698) }
202
+ let(:outside) { GeoKit::LatLng.new(9.987238, 53.555950) }
203
+
204
+ let(:sw_lat) { 9.988139 }
205
+ let(:sw_lng) { 53.556068 }
206
+ let(:sw) { c = GeoKit::LatLng.new(sw_lat, sw_lng) }
207
+
208
+ let(:ne_lat) { 9.992849 }
209
+ let(:ne_lng) { 53.557522 }
210
+ let(:ne) { GeoKit::LatLng.new(ne_lat, ne_lng) }
211
+
212
+ let(:bounding_box) { GeoKit::Bounds.new(sw, ne) }
213
+
214
+
215
+ before(:each) do
216
+ Supernova::Solr.truncate!
217
+ Supernova::Solr.add(:id => "1", :location_p => inside.to_s, :type => "Test")
218
+ Supernova::Solr.add(:id => "2", :location_p => outside.to_s, :type => "Test")
219
+ Supernova::Solr.commit!
220
+ end
221
+
222
+ it "the correct entries" do
223
+ scope = Supernova::SolrCriteria.new.with(:location_p.in => bounding_box)
224
+ scope.ids.should == [1]
225
+ end
226
+
227
+ it "includes the egdes" do
228
+ Supernova::SolrCriteria.new.with(:location_p.in => GeoKit::Bounds.new(outside, inside)).ids.should == [1, 2]
229
+ end
230
+
231
+ it "includes the egdes", :wip => true do
232
+ Supernova::SolrCriteria.new.with(:location_p.inside => GeoKit::Bounds.new(outside, inside)).ids.should == []
233
+ end
234
+ end
235
+
176
236
  describe "range search" do
177
237
  { Range.new(2, 3) => [2], Range.new(3, 10) => [], Range.new(1, 2) => [1, 2] }.each do |range, ids|
178
238
  it "returns #{ids.inspect} for range #{range.inspect}" do
@@ -269,11 +329,25 @@ describe "Solr" do
269
329
  end
270
330
  end
271
331
 
332
+ describe "#execute_async" do
333
+ it "is working" do
334
+ Supernova::Solr.add(:id => "offers/1", :type => "Offer", :popularity_i => 1)
335
+ Supernova::Solr.add(:id => "offers/2", :type => "Offer", :popularity_i => 10)
336
+ Supernova::Solr.add(:id => "offers/3", :type => "Offer", :popularity_i => 100)
337
+ Supernova::Solr.commit!
338
+
339
+ new_criteria.select("id").execute_async do |collection|
340
+ @collection = collection
341
+ end
342
+ new_criteria.hydra.run
343
+ @collection.should be_kind_of(Supernova::Collection)
344
+ @collection.count.should == 3
345
+ @collection.should == [{ "id" => "offers/1" }, { "id" => "offers/2" }, { "id" => "offers/3" }]
346
+ end
347
+ end
348
+
272
349
  describe "#facet_queries" do
273
350
  it "returns the correct result" do
274
- defaults = {
275
-
276
- }
277
351
  Supernova::Solr.add(:id => "offers/1", :type => "Offer", :popularity_i => 1)
278
352
  Supernova::Solr.add(:id => "offers/2", :type => "Offer", :popularity_i => 10)
279
353
  Supernova::Solr.add(:id => "offers/3", :type => "Offer", :popularity_i => 100)
@@ -283,17 +357,19 @@ describe "Solr" do
283
357
  end
284
358
  end
285
359
 
286
- describe "#execute_raw" do
360
+ describe "#typhoeus_response" do
361
+ let(:response) { JSON.parse(new_criteria.typhoeus_response.body) }
362
+
287
363
  it "returns a hash" do
288
- new_criteria.execute_raw.should be_kind_of(Hash)
364
+ response.should be_kind_of(Hash)
289
365
  end
290
366
 
291
367
  it "should not be empty" do
292
- new_criteria.execute_raw.keys.should_not be_empty
368
+ response.keys.should_not be_empty
293
369
  end
294
370
 
295
371
  it "includes th ecorrect headers" do
296
- new_criteria.execute_raw.keys.sort.should == %w(responseHeader response).sort
372
+ response.keys.sort.should == %w(responseHeader response).sort
297
373
  end
298
374
  end
299
375
 
@@ -9,12 +9,9 @@ describe "Supernova::Collection" do
9
9
 
10
10
  let(:original_response_without_facets) do
11
11
  {"responseHeader"=>{"status"=>0, "QTime"=>0, "params"=>{"wt"=>"json", "fq"=>"type:Offer", "q"=>"*:*"}}, "response"=>{"numFound"=>3, "start"=>0, "docs"=>[{"id"=>"offers/1", "type"=>"Offer", "popularity_i"=>1}, {"id"=>"offers/2", "type"=>"Offer", "popularity_i"=>10}, {"id"=>"offers/3", "type"=>"Offer", "popularity_i"=>100}]}}
12
- {:one=>1, :ten=>2, :hundred=>3}
13
12
  end
14
13
 
15
14
  describe "#raw_facet_queries" do
16
-
17
-
18
15
  it "returns the correct facet queries when found" do
19
16
  col.original_response = original_response_with_facets
20
17
  col.raw_facet_queries.should == { "popularity_i:[* TO 1]"=>1, "popularity_i:[* TO 10]"=>2, "popularity_i:[* TO 100]"=>3 }
@@ -47,4 +44,35 @@ describe "Supernova::Collection" do
47
44
  col.original_facet_queries.should == {}
48
45
  end
49
46
  end
47
+
48
+ describe "#ids" do
49
+ let(:col) { Supernova::Collection.new(1, 1, 100) }
50
+
51
+ before(:each) do
52
+ col.original_response = original_response_without_facets
53
+ end
54
+
55
+ it "returns an array" do
56
+ col.ids.should be_kind_of(Supernova::Collection)
57
+ end
58
+
59
+ it "uses extract_ids_from_solr_hash with response" do
60
+ col.original_response = "some response"
61
+ col.should_receive(:extract_ids_from_solr_hash).with("some response").and_return("result")
62
+ col.ids
63
+ col.ids.should == "result"
64
+ end
65
+ end
66
+
67
+ describe "#extract_ids_from_solr_hash" do
68
+ let(:result) { col.extract_ids_from_solr_hash(original_response_without_facets) }
69
+
70
+ it "returns an array" do
71
+ result.should be_kind_of(Array)
72
+ end
73
+
74
+ it "returns the correct ids" do
75
+ result.should == [1, 2, 3]
76
+ end
77
+ end
50
78
  end
@@ -7,7 +7,67 @@ describe "Supernova::Condition" do
7
7
  cond.type.should == :not
8
8
  end
9
9
 
10
- describe "solr_filter_for" do
10
+ describe "equality" do
11
+ it "returns true when the same" do
12
+ :user_id.not.should == :user_id.not
13
+ end
14
+
15
+ it "returns false when other key" do
16
+ :user_id.not.should_not == :other_user_id.not
17
+ end
18
+
19
+ it "returns false when other method" do
20
+ :user_id.in.should_not == :user_id.not
21
+ end
22
+
23
+ it "returns true when the same" do
24
+ :user_id.not.should be_eql(:user_id.not)
25
+ end
26
+
27
+ it "returns false when other key" do
28
+ :user_id.not.should_not be_eql(:other_user_id.not)
29
+ end
30
+
31
+ it "returns false when other method" do
32
+ :user_id.in.should_not be_eql(:user_id.not)
33
+ end
34
+
35
+ it "works for hashes" do
36
+ a = { :user_id.in => 1 }
37
+ a[:user_id.in] = 2
38
+ a.keys.length.should == 1
39
+ a[:user_id.in].should == 2
40
+ a[:user_id.not] = 2
41
+ a.keys.length.should == 2
42
+ end
43
+ end
44
+
45
+ describe "#or_key_and_value", :wip => true do
46
+ it "returns the correct filter" do
47
+ ne = double("ne", :lat => 48.0, :lng => 12.0)
48
+ sw = double("sw", :lat => 47.0, :lng => 11.0)
49
+ bounding_box = double("bbox", :ne => ne, :sw => sw)
50
+ :pt.in.or_key_and_value(bounding_box).should == "pt:[47.0,11.0 TO 48.0,12.0]"
51
+ end
52
+
53
+ it "returns the correct filter" do
54
+ ne = double("ne", :lat => 48.0, :lng => 12.0)
55
+ sw = double("sw", :lat => 47.0, :lng => 11.0)
56
+ bounding_box = double("bbox", :ne => ne, :sw => sw)
57
+ :pt.inside.or_key_and_value(bounding_box).should == "pt:{47.0,11.0 TO 48.0,12.0}"
58
+ end
59
+
60
+ end
61
+
62
+ describe "solr_filter_for", :wip => true do
63
+ it "returns the correct filter" do
64
+ sw = Geokit::LatLng.new(47.1, 11.1)
65
+ ne = Geokit::LatLng.new(48.2, 12.2)
66
+ bounds = Geokit::Bounds.new(sw, ne)
67
+ :location_p.inside.solr_filter_for(bounds).should == "location_p:{47.1,11.1 TO 48.2,12.2}"
68
+ end
69
+
70
+
11
71
  it "returns the correct filter for numbers" do
12
72
  :user_id.not.solr_filter_for(7).should == "!user_id:7"
13
73
  end
@@ -164,7 +164,7 @@ describe "Supernova::SolrCriteria" do
164
164
  end
165
165
  end
166
166
 
167
- describe "with facet queries", :wip => true do
167
+ describe "with facet queries" do
168
168
  let(:params) { criteria.facet_queries(:a => "a", :b => "b").to_params }
169
169
 
170
170
  it "sets :facet to true" do
@@ -194,6 +194,15 @@ describe "Supernova::SolrCriteria" do
194
194
  criteria.attribute_mapping(:user_id => { :type => :integer }).without(:user_id => 1).to_params[:fq].should == ["!user_id_i:1"]
195
195
  end
196
196
 
197
+ describe "bounding box search" do
198
+ it "includes the correct filter" do
199
+ ne = double("ne", :lat => 48.0, :lng => 12.0)
200
+ sw = double("sw", :lat => 47.0, :lng => 11.0)
201
+ bounding_box = double("bbox", :ne => ne, :sw => sw)
202
+ criteria.where(:pt.in => bounding_box).to_params[:fq].should include("pt:[47.0,11.0 TO 48.0,12.0]")
203
+ end
204
+ end
205
+
197
206
  describe "with a nearby search" do
198
207
  let(:nearby_criteria) { Supernova::SolrCriteria.new.near(47, 11).within(10.kms) }
199
208
 
@@ -284,21 +293,27 @@ describe "Supernova::SolrCriteria" do
284
293
  end
285
294
 
286
295
  describe "#ids" do
296
+ let(:response) { Supernova::Collection.new(1, 1, 100) }
297
+
298
+ before(:each) do
299
+ response.original_response = facet_response
300
+ end
301
+
287
302
  it "sets the select fields to id only" do
288
303
  scope = double("scope")
289
304
  criteria.should_receive(:only_ids).and_return(scope)
290
- scope.should_receive(:execute).and_return([])
291
- criteria.ids.should == []
305
+ scope.should_receive(:execute).and_return(response)
306
+ criteria.ids.should == [1, 2]
292
307
  end
293
308
 
294
309
  it "calls execute" do
295
- criteria.should_receive(:execute).and_return([])
310
+ criteria.should_receive(:execute).and_return(response)
296
311
  criteria.ids
297
312
  end
298
313
 
299
314
  it "maps the id hashes to ids" do
300
- criteria.stub(:execute).and_return([ { "id" => "offer/1" }, { "id" => "offer/3" } ])
301
- criteria.ids.should == [1, 3]
315
+ criteria.stub(:execute).and_return(response)
316
+ criteria.ids.should == [1, 2]
302
317
  end
303
318
  end
304
319
 
@@ -325,17 +340,14 @@ describe "Supernova::SolrCriteria" do
325
340
  a = criteria.select("name_s").only_ids
326
341
  a.to_params[:fl].should == "id"
327
342
  end
328
-
329
- # it "does something" do
330
- #
331
- # end
332
343
  end
333
344
 
334
345
  describe "#execute" do
335
346
  let(:params) { {} }
347
+ let(:response) { double("response", :body => solr_response.to_json) }
336
348
 
337
349
  before(:each) do
338
- criteria.stub(:execute_raw).and_return(solr_response)
350
+ criteria.stub(:typhoeus_response).and_return(response)
339
351
  criteria.stub(:to_params).and_return params
340
352
  end
341
353
 
@@ -344,7 +356,7 @@ describe "Supernova::SolrCriteria" do
344
356
  end
345
357
 
346
358
  it "calls to_params" do
347
- criteria.should_receive(:execute_raw).and_return solr_response
359
+ criteria.should_receive(:typhoeus_response).and_return response
348
360
  criteria.execute
349
361
  end
350
362
 
@@ -391,12 +403,75 @@ describe "Supernova::SolrCriteria" do
391
403
  end
392
404
 
393
405
  it "sets the correct facets" do
394
- criteria.stub!(:execute_raw).and_return(facet_response)
406
+ response.stub!(:body).and_return(facet_response.to_json)
395
407
  criteria.should_receive(:hashify_facets_from_response).with(facet_response).and_return({ :a => 1 })
396
408
  criteria.execute.facets.should == {:a => 1}
397
409
  end
398
410
  end
399
411
 
412
+ describe "#typhoeus_response" do
413
+ it "returns the response" do
414
+ response = double("response")
415
+ request = double("request", :response => response)
416
+ Typhoeus::Hydra.hydra.should_receive(:queue).with(request)
417
+ Typhoeus::Hydra.hydra.should_receive(:run)
418
+ criteria.stub!(:typhoeus_request).and_return(request)
419
+ criteria.typhoeus_response.should == response
420
+ end
421
+ end
422
+
423
+ describe "#execute_async" do
424
+ let(:request) { double("request") }
425
+ let(:response) { double("response", :body => solr_response.to_json) }
426
+ let(:hydra) { double("hydra", :queue => nil) }
427
+
428
+ before(:each) do
429
+ request.should_receive(:on_complete).and_yield(response)
430
+ criteria.stub!(:typhoeus_request).and_return(request)
431
+ criteria.stub!(:hydra).and_return(hydra)
432
+ end
433
+
434
+ it "yields the parsed collection" do
435
+ criteria.execute_async do |collection|
436
+ @collection = collection
437
+ end
438
+ @collection.should be_kind_of(Supernova::Collection)
439
+ end
440
+
441
+ it "adds the request to hydra" do
442
+ hydra.should_receive(:queue).with(request)
443
+ criteria.execute_async do |collection|
444
+ collection
445
+ end
446
+ end
447
+ end
448
+
449
+ it "returns the parsed response body" do
450
+ response = double("response", :body => facet_response.to_json)
451
+ criteria.stub!(:typhoeus_response).and_return(response)
452
+ criteria.execute.original_response.should == facet_response
453
+ end
454
+
455
+ describe "#typhoeus_request" do
456
+ it "returns a Typhoeus::Request" do
457
+ criteria.typhoeus_request.should be_kind_of(Typhoeus::Request)
458
+ end
459
+
460
+ it "sets the correct url" do
461
+ Supernova::Solr.stub(:select_url).and_return("my_select_url")
462
+ criteria.typhoeus_request.url.should == "my_select_url"
463
+ end
464
+
465
+ it "returns the correct params" do
466
+ criteria.stub(:to_params).and_return(:a => 1)
467
+ criteria.typhoeus_request.params.should == { :a => 1, :wt => "json"}
468
+ end
469
+
470
+ it "returns the correct request methods" do
471
+ criteria.typhoeus_request.method.should == :post
472
+ end
473
+ end
474
+
400
475
  let(:facet_response) {
401
476
  {
402
477
  "response"=>{"start"=>0, "docs"=>[{"popularity_i"=>10, "enabled_b"=>false, "id"=>"offers/1", "user_id_i"=>1, "text_t"=>"Hans Meyer", "type"=>"Offer", "location_p"=>"47,11"}, {"popularity_i"=>1, "enabled_b"=>true, "id"=>"offers/2", "user_id_i"=>2, "text_t"=>"Marek Mintal", "type"=>"Offer", "location_p"=>"46.9981112912042,11.6587158814378"}], "numFound"=>2}, "facet_counts"=>{"facet_fields"=>{"text_t"=>["han", 1, "marek", 1, "meyer", 1, "mintal", 1]}, "facet_ranges"=>{}, "facet_dates"=>{}, "facet_queries"=>{}}, "responseHeader"=>{"QTime"=>4, "params"=>{"fq"=>"type:Offer", "facet.field"=>"text_t", "facet"=>"true", "q"=>"*:*", "wt"=>"ruby"}, "status"=>0}
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "supernova"
8
- s.version = "0.7.3"
8
+ s.version = "0.7.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Tobias Schwab"]
12
- s.date = "2012-02-15"
12
+ s.date = "2012-02-21"
13
13
  s.description = "Unified search scopes"
14
14
  s.email = "tobias.schwab@dynport.de"
15
15
  s.executables = ["start_solr"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: supernova
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.3
4
+ version: 0.7.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-15 00:00:00.000000000Z
12
+ date: 2012-02-21 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: will_paginate
16
- requirement: &70130995568240 !ruby/object:Gem::Requirement
16
+ requirement: &70265084366020 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70130995568240
24
+ version_requirements: *70265084366020
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: json
27
- requirement: &70130995564120 !ruby/object:Gem::Requirement
27
+ requirement: &70265084365280 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70130995564120
35
+ version_requirements: *70265084365280
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: activesupport
38
- requirement: &70130995563020 !ruby/object:Gem::Requirement
38
+ requirement: &70265084364800 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70130995563020
46
+ version_requirements: *70265084364800
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: typhoeus
49
- requirement: &70130995561780 !ruby/object:Gem::Requirement
49
+ requirement: &70265084364320 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - =
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 0.3.3
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70130995561780
57
+ version_requirements: *70265084364320
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: i18n
60
- requirement: &70130995558020 !ruby/object:Gem::Requirement
60
+ requirement: &70265084363760 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70130995558020
68
+ version_requirements: *70265084363760
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: activerecord
71
- requirement: &70130995551440 !ruby/object:Gem::Requirement
71
+ requirement: &70265084363280 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 3.0.7
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70130995551440
79
+ version_requirements: *70265084363280
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: ruby-debug19
82
- requirement: &70130995550480 !ruby/object:Gem::Requirement
82
+ requirement: &70265084362580 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70130995550480
90
+ version_requirements: *70265084362580
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: mysql2
93
- requirement: &70130995549660 !ruby/object:Gem::Requirement
93
+ requirement: &70265084362080 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: 0.2.18
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *70130995549660
101
+ version_requirements: *70265084362080
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: ZenTest
104
- requirement: &70130995548680 !ruby/object:Gem::Requirement
104
+ requirement: &70265084361600 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - =
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: 4.5.0
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *70130995548680
112
+ version_requirements: *70265084361600
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: geokit
115
- requirement: &70130995547760 !ruby/object:Gem::Requirement
115
+ requirement: &70265084361120 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: '0'
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *70130995547760
123
+ version_requirements: *70265084361120
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: guard
126
- requirement: &70130995546860 !ruby/object:Gem::Requirement
126
+ requirement: &70265084360640 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
- version_requirements: *70130995546860
134
+ version_requirements: *70265084360640
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: rb-fsevent
137
- requirement: &70130995546120 !ruby/object:Gem::Requirement
137
+ requirement: &70265084360140 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ! '>='
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: '0'
143
143
  type: :development
144
144
  prerelease: false
145
- version_requirements: *70130995546120
145
+ version_requirements: *70265084360140
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: growl
148
- requirement: &70130995545140 !ruby/object:Gem::Requirement
148
+ requirement: &70265084359620 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ! '>='
@@ -153,10 +153,10 @@ dependencies:
153
153
  version: '0'
154
154
  type: :development
155
155
  prerelease: false
156
- version_requirements: *70130995545140
156
+ version_requirements: *70265084359620
157
157
  - !ruby/object:Gem::Dependency
158
158
  name: growl_notify
159
- requirement: &70130995544120 !ruby/object:Gem::Requirement
159
+ requirement: &70265084359100 !ruby/object:Gem::Requirement
160
160
  none: false
161
161
  requirements:
162
162
  - - ! '>='
@@ -164,10 +164,10 @@ dependencies:
164
164
  version: '0'
165
165
  type: :development
166
166
  prerelease: false
167
- version_requirements: *70130995544120
167
+ version_requirements: *70265084359100
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: autotest
170
- requirement: &70130995525180 !ruby/object:Gem::Requirement
170
+ requirement: &70265084358580 !ruby/object:Gem::Requirement
171
171
  none: false
172
172
  requirements:
173
173
  - - ! '>='
@@ -175,10 +175,10 @@ dependencies:
175
175
  version: '0'
176
176
  type: :development
177
177
  prerelease: false
178
- version_requirements: *70130995525180
178
+ version_requirements: *70265084358580
179
179
  - !ruby/object:Gem::Dependency
180
180
  name: autotest-growl
181
- requirement: &70130995524140 !ruby/object:Gem::Requirement
181
+ requirement: &70265084357980 !ruby/object:Gem::Requirement
182
182
  none: false
183
183
  requirements:
184
184
  - - ! '>='
@@ -186,10 +186,10 @@ dependencies:
186
186
  version: '0'
187
187
  type: :development
188
188
  prerelease: false
189
- version_requirements: *70130995524140
189
+ version_requirements: *70265084357980
190
190
  - !ruby/object:Gem::Dependency
191
191
  name: rspec
192
- requirement: &70130995523340 !ruby/object:Gem::Requirement
192
+ requirement: &70265084316160 !ruby/object:Gem::Requirement
193
193
  none: false
194
194
  requirements:
195
195
  - - ~>
@@ -197,10 +197,10 @@ dependencies:
197
197
  version: 2.8.0
198
198
  type: :development
199
199
  prerelease: false
200
- version_requirements: *70130995523340
200
+ version_requirements: *70265084316160
201
201
  - !ruby/object:Gem::Dependency
202
202
  name: bundler
203
- requirement: &70130995521360 !ruby/object:Gem::Requirement
203
+ requirement: &70265084315580 !ruby/object:Gem::Requirement
204
204
  none: false
205
205
  requirements:
206
206
  - - ~>
@@ -208,10 +208,10 @@ dependencies:
208
208
  version: 1.0.0
209
209
  type: :development
210
210
  prerelease: false
211
- version_requirements: *70130995521360
211
+ version_requirements: *70265084315580
212
212
  - !ruby/object:Gem::Dependency
213
213
  name: jeweler
214
- requirement: &70130995519920 !ruby/object:Gem::Requirement
214
+ requirement: &70265084315000 !ruby/object:Gem::Requirement
215
215
  none: false
216
216
  requirements:
217
217
  - - ~>
@@ -219,10 +219,10 @@ dependencies:
219
219
  version: 1.6.0
220
220
  type: :development
221
221
  prerelease: false
222
- version_requirements: *70130995519920
222
+ version_requirements: *70265084315000
223
223
  - !ruby/object:Gem::Dependency
224
224
  name: rcov
225
- requirement: &70130995518680 !ruby/object:Gem::Requirement
225
+ requirement: &70265084314420 !ruby/object:Gem::Requirement
226
226
  none: false
227
227
  requirements:
228
228
  - - ! '>='
@@ -230,7 +230,7 @@ dependencies:
230
230
  version: '0'
231
231
  type: :development
232
232
  prerelease: false
233
- version_requirements: *70130995518680
233
+ version_requirements: *70265084314420
234
234
  description: Unified search scopes
235
235
  email: tobias.schwab@dynport.de
236
236
  executables:
@@ -328,7 +328,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
328
328
  version: '0'
329
329
  segments:
330
330
  - 0
331
- hash: -4580768274000181540
331
+ hash: -1087199573520631399
332
332
  required_rubygems_version: !ruby/object:Gem::Requirement
333
333
  none: false
334
334
  requirements: