supernova 0.7.1 → 0.7.2

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.1
1
+ 0.7.2
@@ -1,5 +1,24 @@
1
1
  require "will_paginate"
2
2
 
3
3
  class Supernova::Collection < WillPaginate::Collection
4
- attr_accessor :original_response, :facets
4
+ attr_accessor :original_response, :facets, :original_criteria
5
+
6
+ def raw_facet_queries
7
+ raw_facet_counts["facet_queries"] || {}
8
+ end
9
+
10
+ def raw_facet_counts
11
+ original_response["facet_counts"] || {}
12
+ end
13
+
14
+ def facet_queries
15
+ @facet_queries ||= raw_facet_queries.inject({}) do |hash, (raw_query, count)|
16
+ hash[original_facet_queries.invert[raw_query]] = count
17
+ hash
18
+ end
19
+ end
20
+
21
+ def original_facet_queries
22
+ original_criteria.search_options[:facet_queries] || {}
23
+ end
5
24
  end
@@ -95,6 +95,10 @@ class Supernova::Criteria
95
95
  def facet_fields(*fields)
96
96
  merge_filters_array :facets, fields
97
97
  end
98
+
99
+ def facet_queries(hash)
100
+ merge_search_options :facet_queries, hash
101
+ end
98
102
 
99
103
  def conditions(filters)
100
104
  merge_filters :conditions, filters
@@ -28,11 +28,15 @@ class Supernova::SolrCriteria < Supernova::Criteria
28
28
  end
29
29
  solr_options[:fq] << "type:#{self.clazz}" if self.clazz
30
30
 
31
+ solr_options[:facet] = true if include_facets?
31
32
  if self.search_options[:facets]
32
- solr_options[:facet] = true
33
33
  solr_options["facet.field"] = self.search_options[:facets].compact.map { |field| solr_field_from_field(field) }
34
34
  end
35
35
 
36
+ if self.search_options[:facet_queries]
37
+ solr_options["facet.query"] = self.search_options[:facet_queries].values
38
+ end
39
+
36
40
  if self.search_options[:pagination] || search_options[:rows] || search_options[:start]
37
41
  solr_options[:rows] = self.search_options[:rows] || per_page
38
42
  solr_options[:start] = search_options[:start] || ((current_page - 1) * solr_options[:rows])
@@ -40,6 +44,10 @@ class Supernova::SolrCriteria < Supernova::Criteria
40
44
  solr_options
41
45
  end
42
46
 
47
+ def include_facets?
48
+ self.search_options[:facets] || self.search_options[:facet_queries]
49
+ end
50
+
43
51
  def convert_search_order(order)
44
52
  order.split(/\s*,\s*/).map do |chunk|
45
53
  if chunk.match(/(.*?) (asc|desc)/i)
@@ -184,6 +192,7 @@ class Supernova::SolrCriteria < Supernova::Criteria
184
192
  def execute
185
193
  response = execute_raw
186
194
  collection = Supernova::Collection.new(current_page, per_page == 0 ? 1 : per_page, response["response"]["numFound"])
195
+ collection.original_criteria = self.clone
187
196
  collection.original_response = response
188
197
  collection.facets = hashify_facets_from_response(response)
189
198
  collection.replace(build_docs(response["response"]["docs"]))
@@ -261,7 +261,6 @@ describe "Solr" do
261
261
 
262
262
  describe "#facets" do
263
263
  it "returns the correct facets hash" do
264
- # pending "fix me"
265
264
  Supernova::Solr.add(:id => "offers/3", :type => "Offer", :user_id_i => 3, :enabled_b => false,
266
265
  :text_t => "Hans Müller", :popularity_i => 10, :type => "Offer"
267
266
  )
@@ -270,6 +269,20 @@ describe "Solr" do
270
269
  end
271
270
  end
272
271
 
272
+ describe "#facet_queries" do
273
+ it "returns the correct result" do
274
+ defaults = {
275
+
276
+ }
277
+ Supernova::Solr.add(:id => "offers/1", :type => "Offer", :popularity_i => 1)
278
+ Supernova::Solr.add(:id => "offers/2", :type => "Offer", :popularity_i => 10)
279
+ Supernova::Solr.add(:id => "offers/3", :type => "Offer", :popularity_i => 100)
280
+ Supernova::Solr.commit!
281
+ col = new_criteria.facet_queries(:one => "popularity_i:[* TO 1]", :ten => "popularity_i:[* TO 10]", :hundred => "popularity_i:[* TO 100]").execute
282
+ col.facet_queries.should == { :one => 1, :ten => 2, :hundred => 3 }
283
+ end
284
+ end
285
+
273
286
  describe "#execute_raw" do
274
287
  it "returns a hash" do
275
288
  new_criteria.execute_raw.should be_kind_of(Hash)
@@ -305,7 +318,9 @@ describe "Solr" do
305
318
 
306
319
  describe "with mapping" do
307
320
  before(:each) do
308
- @clazz = Class.new(Supernova::SolrIndexer)
321
+ name = "Class#{Time.now.to_f.to_s.gsub(".", "")}"
322
+ eval("class #{name} < Supernova::SolrIndexer; end")
323
+ @clazz = name.constantize
309
324
  @clazz.has :location, :type => :string
310
325
  @clazz.has :city, :type => :string
311
326
  end
@@ -0,0 +1,50 @@
1
+ require "spec_helper"
2
+
3
+ describe "Supernova::Collection" do
4
+ let(:col) { Supernova::Collection.new(1, 10, 100) }
5
+
6
+ let(:original_response_with_facets) do
7
+ {"responseHeader"=>{"status"=>0, "QTime"=>2, "params"=>{"facet"=>"true", "wt"=>"json", "facet.query"=>["popularity_i:[* TO 1]", "popularity_i:[* TO 10]", "popularity_i:[* TO 100]"], "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}]}, "facet_counts"=>{"facet_queries"=>{"popularity_i:[* TO 1]"=>1, "popularity_i:[* TO 10]"=>2, "popularity_i:[* TO 100]"=>3}, "facet_fields"=>{}, "facet_dates"=>{}, "facet_ranges"=>{}}}
8
+ end
9
+
10
+ let(:original_response_without_facets) do
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
+ end
14
+
15
+ describe "#raw_facet_queries" do
16
+
17
+
18
+ it "returns the correct facet queries when found" do
19
+ col.original_response = original_response_with_facets
20
+ col.raw_facet_queries.should == { "popularity_i:[* TO 1]"=>1, "popularity_i:[* TO 10]"=>2, "popularity_i:[* TO 100]"=>3 }
21
+ end
22
+
23
+ it "returns an empty hash when facet_queries is empty" do
24
+ col.original_response = original_response_without_facets
25
+ col.raw_facet_queries.should == {}
26
+ end
27
+ end
28
+
29
+ describe "#facet_queries" do
30
+ it "returns the correct hash" do
31
+ crit = Supernova::Criteria.facet_queries(:one => "popularity_i:[* TO 1]", :ten => "popularity_i:[* TO 10]", :hundred => "popularity_i:[* TO 100]")
32
+ col.original_criteria = crit
33
+ col.original_response = original_response_with_facets
34
+ col.facet_queries.should == { :one => 1, :ten => 2, :hundred => 3 }
35
+ end
36
+ end
37
+
38
+ describe "#original_facet_queries" do
39
+ it "returns the correct hash when facet queries activated" do
40
+ queries = { :one => "popularity_i:[* TO 1]", :ten => "popularity_i:[* TO 10]", :hundred => "popularity_i:[* TO 100]" }
41
+ col.original_criteria = Supernova::Criteria.facet_queries(queries)
42
+ col.original_facet_queries.should == queries
43
+ end
44
+
45
+ it "returns an empty hash when not defined" do
46
+ col.original_criteria = Supernova::Criteria.new
47
+ col.original_facet_queries.should == {}
48
+ end
49
+ end
50
+ end
@@ -437,6 +437,23 @@ describe "Supernova::Criteria" do
437
437
  scope.start(99).search_options[:start].should == 99
438
438
  end
439
439
 
440
+ describe "#facet_queries" do
441
+ it "adds the queries to the facet_queries array" do
442
+ scope.facet_queries(:first => "1 = 1").facet_queries(:second => "2 = 2").search_options[:facet_queries].should == {
443
+ :first => "1 = 1", :second => "2 = 2"
444
+ }
445
+ end
446
+
447
+ it "allows merging of two scopes with facet queries" do
448
+ scope.immutable!
449
+ a = scope.facet_queries(:first => "1 = 1")
450
+ b = scope.facet_queries(:second => "2 = 2")
451
+ a.search_options[:facet_queries].should == { :first => "1 = 1" }
452
+ b.search_options[:facet_queries].should == { :second => "2 = 2" }
453
+ a.merge(b).search_options[:facet_queries].should == { :first => "1 = 1", :second => "2 = 2" }
454
+ end
455
+ end
456
+
440
457
  describe "#merge" do
441
458
  let(:criteria) { Supernova::Criteria.new.order("popularity asc").with(:a => 1).conditions(:b => 2).search("New Search") }
442
459
  let(:new_crit) { Supernova::Criteria.new.order("popularity desc").with(:c => 8).conditions(:e => 9).search("Search") }
@@ -152,14 +152,29 @@ describe "Supernova::SolrCriteria" do
152
152
  criteria.select(:user_id).select(:user_id).select(:enabled).to_params[:fl].should == "user_id,enabled,id"
153
153
  end
154
154
 
155
- it "sets the correct facet options when set" do
156
- params = criteria.facet_fields(:name).to_params
157
- params[:facet].should == true
155
+ describe "with facet fields" do
156
+ it "sets the correct facet options when set" do
157
+ params = criteria.facet_fields(:name).to_params
158
+ params[:facet].should == true
159
+ end
160
+
161
+ it "sets all facet fields" do
162
+ params = criteria.facet_fields(:name).facet_fields(:title).to_params
163
+ params["facet.field"].should == ["name", "title"]
164
+ end
158
165
  end
159
166
 
160
- it "sets all facet fields" do
161
- params = criteria.facet_fields(:name).facet_fields(:title).to_params
162
- params["facet.field"].should == ["name", "title"]
167
+ describe "with facet queries", :wip => true do
168
+ let(:params) { criteria.facet_queries(:a => "a", :b => "b").to_params }
169
+
170
+ it "sets :facet to true" do
171
+ params[:facet].should == true
172
+ end
173
+
174
+ it "sets the correct facet query field" do
175
+ criteria.facet_queries(:a => "a", :b => "b")
176
+ params["facet.query"].should == ["a", "b"]
177
+ end
163
178
  end
164
179
 
165
180
  it "uses mapped fields for select" do
@@ -219,7 +234,6 @@ describe "Supernova::SolrCriteria" do
219
234
  it "overwrites pagination with start" do
220
235
  criteria.paginate(:per_page => 9, :page => 1).start(100).rows(11).to_params[:start].should == 100
221
236
  end
222
-
223
237
  end
224
238
 
225
239
  describe "pagination" do
@@ -368,7 +382,7 @@ describe "Supernova::SolrCriteria" do
368
382
  end
369
383
 
370
384
  it "calls replace on collection with returned docs" do
371
- col = double("collection", :original_response= => true, :facets= => true)
385
+ col = Supernova::Collection.new(1, 1, 10)
372
386
  Supernova::Collection.stub!(:new).and_return col
373
387
  built_docs = double("built docs")
374
388
  criteria.stub!(:build_docs).and_return built_docs
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "supernova"
8
- s.version = "0.7.1"
8
+ s.version = "0.7.2"
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"]
@@ -81,6 +81,7 @@ Gem::Specification.new do |s|
81
81
  "spec/database.sql",
82
82
  "spec/integration/solr_spec.rb",
83
83
  "spec/spec_helper.rb",
84
+ "spec/supernova/collection_spec.rb",
84
85
  "spec/supernova/condition_spec.rb",
85
86
  "spec/supernova/criteria_spec.rb",
86
87
  "spec/supernova/numeric_extensions_spec.rb",
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.1
4
+ version: 0.7.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-02-14 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: will_paginate
16
- requirement: &70247180583600 !ruby/object:Gem::Requirement
16
+ requirement: &70321781020900 !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: *70247180583600
24
+ version_requirements: *70321781020900
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: json
27
- requirement: &70247180583100 !ruby/object:Gem::Requirement
27
+ requirement: &70321781018320 !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: *70247180583100
35
+ version_requirements: *70321781018320
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: activesupport
38
- requirement: &70247180582600 !ruby/object:Gem::Requirement
38
+ requirement: &70321781016320 !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: *70247180582600
46
+ version_requirements: *70321781016320
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: typhoeus
49
- requirement: &70247180582120 !ruby/object:Gem::Requirement
49
+ requirement: &70321781013260 !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: *70247180582120
57
+ version_requirements: *70321781013260
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: i18n
60
- requirement: &70247180581640 !ruby/object:Gem::Requirement
60
+ requirement: &70321781011320 !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: *70247180581640
68
+ version_requirements: *70321781011320
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: activerecord
71
- requirement: &70247180581080 !ruby/object:Gem::Requirement
71
+ requirement: &70321781008720 !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: *70247180581080
79
+ version_requirements: *70321781008720
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: ruby-debug19
82
- requirement: &70247180580560 !ruby/object:Gem::Requirement
82
+ requirement: &70321781006600 !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: *70247180580560
90
+ version_requirements: *70321781006600
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: mysql2
93
- requirement: &70247180580080 !ruby/object:Gem::Requirement
93
+ requirement: &70321781004800 !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: *70247180580080
101
+ version_requirements: *70321781004800
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: ZenTest
104
- requirement: &70247180579600 !ruby/object:Gem::Requirement
104
+ requirement: &70321781003700 !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: *70247180579600
112
+ version_requirements: *70321781003700
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: geokit
115
- requirement: &70247180579080 !ruby/object:Gem::Requirement
115
+ requirement: &70321781002640 !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: *70247180579080
123
+ version_requirements: *70321781002640
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: guard
126
- requirement: &70247180578600 !ruby/object:Gem::Requirement
126
+ requirement: &70321781001180 !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: *70247180578600
134
+ version_requirements: *70321781001180
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: rb-fsevent
137
- requirement: &70247180578120 !ruby/object:Gem::Requirement
137
+ requirement: &70321780999760 !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: *70247180578120
145
+ version_requirements: *70321780999760
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: growl
148
- requirement: &70247180577640 !ruby/object:Gem::Requirement
148
+ requirement: &70321780997780 !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: *70247180577640
156
+ version_requirements: *70321780997780
157
157
  - !ruby/object:Gem::Dependency
158
158
  name: growl_notify
159
- requirement: &70247180577140 !ruby/object:Gem::Requirement
159
+ requirement: &70321780996620 !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: *70247180577140
167
+ version_requirements: *70321780996620
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: autotest
170
- requirement: &70247180576640 !ruby/object:Gem::Requirement
170
+ requirement: &70321780995300 !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: *70247180576640
178
+ version_requirements: *70321780995300
179
179
  - !ruby/object:Gem::Dependency
180
180
  name: autotest-growl
181
- requirement: &70247180533280 !ruby/object:Gem::Requirement
181
+ requirement: &70321780993280 !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: *70247180533280
189
+ version_requirements: *70321780993280
190
190
  - !ruby/object:Gem::Dependency
191
191
  name: rspec
192
- requirement: &70247180532680 !ruby/object:Gem::Requirement
192
+ requirement: &70321780989420 !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: *70247180532680
200
+ version_requirements: *70321780989420
201
201
  - !ruby/object:Gem::Dependency
202
202
  name: bundler
203
- requirement: &70247180532080 !ruby/object:Gem::Requirement
203
+ requirement: &70321780987880 !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: *70247180532080
211
+ version_requirements: *70321780987880
212
212
  - !ruby/object:Gem::Dependency
213
213
  name: jeweler
214
- requirement: &70247180531500 !ruby/object:Gem::Requirement
214
+ requirement: &70321780986040 !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: *70247180531500
222
+ version_requirements: *70321780986040
223
223
  - !ruby/object:Gem::Dependency
224
224
  name: rcov
225
- requirement: &70247180530900 !ruby/object:Gem::Requirement
225
+ requirement: &70321780983540 !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: *70247180530900
233
+ version_requirements: *70321780983540
234
234
  description: Unified search scopes
235
235
  email: tobias.schwab@dynport.de
236
236
  executables:
@@ -303,6 +303,7 @@ files:
303
303
  - spec/database.sql
304
304
  - spec/integration/solr_spec.rb
305
305
  - spec/spec_helper.rb
306
+ - spec/supernova/collection_spec.rb
306
307
  - spec/supernova/condition_spec.rb
307
308
  - spec/supernova/criteria_spec.rb
308
309
  - spec/supernova/numeric_extensions_spec.rb
@@ -327,7 +328,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
327
328
  version: '0'
328
329
  segments:
329
330
  - 0
330
- hash: 2690249885197212135
331
+ hash: 1961663635880777214
331
332
  required_rubygems_version: !ruby/object:Gem::Requirement
332
333
  none: false
333
334
  requirements: