meta_search 0.3.0

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.
@@ -0,0 +1,47 @@
1
+ ActiveRecord::Schema.define do
2
+
3
+ create_table "companies", :force => true do |t|
4
+ t.string "name"
5
+ t.datetime "created_at"
6
+ t.datetime "updated_at"
7
+ end
8
+
9
+ create_table "developers", :force => true do |t|
10
+ t.integer "company_id"
11
+ t.string "name"
12
+ t.integer "salary"
13
+ t.boolean "slacker"
14
+ end
15
+
16
+ create_table "projects", :force => true do |t|
17
+ t.string "name"
18
+ t.float "estimated_hours"
19
+ end
20
+
21
+ create_table "developers_projects", :id => false, :force => true do |t|
22
+ t.integer "developer_id"
23
+ t.integer "project_id"
24
+ end
25
+
26
+ create_table "notes", :force => true do |t|
27
+ t.string "notable_type"
28
+ t.integer "notable_id"
29
+ t.string "note"
30
+ end
31
+
32
+ create_table "data_types", :force => true do |t|
33
+ t.integer "company_id"
34
+ t.string "str"
35
+ t.text "txt"
36
+ t.integer "int"
37
+ t.float "flt"
38
+ t.decimal "dec"
39
+ t.datetime "dtm"
40
+ t.timestamp "tms"
41
+ t.time "tim"
42
+ t.date "dat"
43
+ t.binary "bin"
44
+ t.boolean "bln"
45
+ end
46
+
47
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,37 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+ require 'active_record'
5
+ require 'active_record/fixtures'
6
+ require 'action_view'
7
+
8
+ FIXTURES_PATH = File.join(File.dirname(__FILE__), 'fixtures')
9
+
10
+ Time.zone = 'Eastern Time (US & Canada)'
11
+
12
+ ActiveRecord::Base.establish_connection(
13
+ :adapter => 'sqlite3',
14
+ :database => ':memory:'
15
+ )
16
+
17
+ dep = defined?(ActiveSupport::Dependencies) ? ActiveSupport::Dependencies : ::Dependencies
18
+ dep.load_paths.unshift FIXTURES_PATH
19
+
20
+ ActiveRecord::Base.silence do
21
+ ActiveRecord::Migration.verbose = false
22
+ load File.join(FIXTURES_PATH, 'schema.rb')
23
+ end
24
+
25
+ Fixtures.create_fixtures(FIXTURES_PATH, ActiveRecord::Base.connection.tables)
26
+
27
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
28
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
29
+ require 'meta_search'
30
+ require 'meta_search/searches/active_record'
31
+ require 'meta_search/helpers/action_view'
32
+
33
+ MetaSearch::Searches::ActiveRecord.enable!
34
+ MetaSearch::Helpers::FormBuilder.enable!
35
+
36
+ class Test::Unit::TestCase
37
+ end
@@ -0,0 +1,351 @@
1
+ require 'helper'
2
+
3
+ class TestSearch < Test::Unit::TestCase
4
+
5
+ context "A company search" do
6
+ setup do
7
+ @s = Company.search
8
+ end
9
+
10
+ should "have an association named developers" do
11
+ assert @s.association(:developers)
12
+ end
13
+
14
+ should "have a column named name" do
15
+ assert @s.column(:name)
16
+ end
17
+
18
+ should "exclude the column named updated_at" do
19
+ assert_nil @s.column(:updated_at)
20
+ end
21
+
22
+ should "raise an error if we try to search on updated_at" do
23
+ assert_raise NoMethodError do
24
+ @s.updated_at_eq = [2009, 1, 1]
25
+ end
26
+ end
27
+
28
+ should "exclude the association named notes" do
29
+ assert_nil @s.association(:notes)
30
+ end
31
+
32
+ should "raise an error if we try to search on notes" do
33
+ assert_raise NoMethodError do
34
+ @s.notes_note_eq = 'Blah'
35
+ end
36
+ end
37
+
38
+ should "honor its associations' excluded attributes" do
39
+ assert_nil @s.association_column(:data_types, :str)
40
+ end
41
+
42
+ should "raise an error if we try to search data_types.str" do
43
+ assert_raise NoMethodError do
44
+ @s.data_types_str_eq = 'Blah'
45
+ end
46
+ end
47
+
48
+ context "where name contains optical" do
49
+ setup do
50
+ @s.name_contains = 'optical'
51
+ end
52
+
53
+ should "return one result" do
54
+ assert_equal 1, @s.all.size
55
+ end
56
+
57
+ should "return a company named Advanced Optical Solutions" do
58
+ assert_contains @s.all, Company.where(:name => 'Advanced Optical Solutions').first
59
+ end
60
+
61
+ should "not return a company named Initech" do
62
+ assert_does_not_contain @s.all, Company.where(:name => "Initech").first
63
+ end
64
+ end
65
+
66
+ context "where developer name starts with Ernie" do
67
+ setup do
68
+ @s.developers_name_starts_with = 'Ernie'
69
+ end
70
+
71
+ should "return one result" do
72
+ assert_equal 1, @s.all.size
73
+ end
74
+
75
+ should "return a company named Mission Data" do
76
+ assert_contains @s.all, Company.where(:name => 'Mission Data').first
77
+ end
78
+
79
+ should "not return a company named Initech" do
80
+ assert_does_not_contain @s.all, Company.where(:name => "Initech").first
81
+ end
82
+
83
+ context "and slackers salary is greater than $70k" do
84
+ setup do
85
+ @s.slackers_salary_gt = 70000
86
+ end
87
+
88
+ should "return no results" do
89
+ assert_equal 0, @s.all.size
90
+ end
91
+
92
+ should "join developers twice" do
93
+ assert @s.to_sql.match(/join "developers".*join "developers"/i)
94
+ end
95
+
96
+ should "alias the second join of developers" do
97
+ assert @s.to_sql.match(/join "developers" "slackers_companies"/i)
98
+ end
99
+ end
100
+ end
101
+
102
+ context "where developer note indicates he will crack yo skull" do
103
+ setup do
104
+ @s.developer_notes_note_equals = "Will show you what he's doing."
105
+ end
106
+
107
+ should "return one result" do
108
+ assert_equal 1, @s.all.size
109
+ end
110
+
111
+ should "return a company named Advanced Optical Solutions" do
112
+ assert_contains @s.all, Company.where(:name => 'Advanced Optical Solutions').first
113
+ end
114
+
115
+ should "not return a company named Mission Data" do
116
+ assert_does_not_contain @s.all, Company.where(:name => "Mission Data").first
117
+ end
118
+ end
119
+ end
120
+
121
+ context "A developer search" do
122
+ setup do
123
+ @s = Developer.search
124
+ end
125
+
126
+ should "have an association named projects" do
127
+ assert @s.association(:projects)
128
+ end
129
+
130
+ context "where developer is Bob-approved" do
131
+ setup do
132
+ @s.notes_note_equals = "A straight shooter with upper management written all over him."
133
+ end
134
+
135
+ should "return Peter Gibbons" do
136
+ assert_contains @s.all, Developer.where(:name => 'Peter Gibbons').first
137
+ end
138
+ end
139
+
140
+ context "where name ends with Miller" do
141
+ setup do
142
+ @s.name_ends_with = 'Miller'
143
+ end
144
+
145
+ should "return one result" do
146
+ assert_equal 1, @s.all.size
147
+ end
148
+
149
+ should "return a developer named Ernie Miller" do
150
+ assert_contains @s.all, Developer.where(:name => 'Ernie Miller').first
151
+ end
152
+
153
+ should "not return a developer named Herb Myers" do
154
+ assert_does_not_contain @s.all, Developer.where(:name => "Herb Myers").first
155
+ end
156
+ end
157
+
158
+ context "where project estimated hours are greater than or equal to 1000" do
159
+ setup do
160
+ @s.projects_estimated_hours_gte = 1000
161
+ end
162
+
163
+ should "return three results" do
164
+ assert_equal 3, @s.all.size
165
+ end
166
+
167
+ should "return these developers" do
168
+ assert_same_elements @s.all.collect {|d| d.name},
169
+ ['Peter Gibbons', 'Michael Bolton', 'Samir Nagheenanajar']
170
+ end
171
+ end
172
+
173
+ context "where project estimated hours are greater than 1000" do
174
+ setup do
175
+ @s.projects_estimated_hours_gt = 1000
176
+ end
177
+
178
+ should "return no results" do
179
+ assert_equal 0, @s.all.size
180
+ end
181
+ end
182
+ end
183
+
184
+ context "A data type search" do
185
+ setup do
186
+ @s = DataType.search
187
+ end
188
+
189
+ should "raise an error on a contains search against a boolean column" do
190
+ assert_raise NoMethodError do
191
+ @s.bln_contains = "true"
192
+ end
193
+ end
194
+
195
+ context "where boolean column equals true" do
196
+ setup do
197
+ @s.bln_equals = true
198
+ end
199
+
200
+ should "return five results" do
201
+ assert_equal 5, @s.all.size
202
+ end
203
+
204
+ should "contain no results with a false boolean column" do
205
+ assert_does_not_contain @s.all.collect {|r| r.bln}, false
206
+ end
207
+ end
208
+
209
+ context "where date column is Christmas 2009 by array" do
210
+ setup do
211
+ @s.dat_equals = [2009, 12, 25]
212
+ end
213
+
214
+ should "return one result" do
215
+ assert_equal 1, @s.all.size
216
+ end
217
+
218
+ should "contain a result with Christmas 2009 as its date" do
219
+ assert_equal Date.parse('2009/12/25'), @s.first.dat
220
+ end
221
+ end
222
+
223
+ context "where date column is Christmas 2009 by Date object" do
224
+ setup do
225
+ @s.dat_equals = Date.new(2009, 12, 25)
226
+ end
227
+
228
+ should "return one result" do
229
+ assert_equal 1, @s.all.size
230
+ end
231
+
232
+ should "contain a result with Christmas 2009 as its date" do
233
+ assert_equal Date.parse('2009/12/25'), @s.first.dat
234
+ end
235
+ end
236
+
237
+ context "where time column is > 1:00 PM and < 3:30 PM" do
238
+ setup do
239
+ @s.tim_gt = Time.parse('2000-01-01 13:00') # Rails "dummy time" format
240
+ @s.tim_lt = Time.parse('2000-01-01 15:30') # Rails "dummy time" format
241
+ end
242
+
243
+ should "return three results" do
244
+ assert_equal 3, @s.all.size
245
+ end
246
+
247
+ should "not contain results with time column before or after constraints" do
248
+ assert_empty @s.all.select {|r|
249
+ r.tim < Time.parse('2000-01-01 13:00') || r.tim > Time.parse('2000-01-01 15:30')
250
+ }
251
+ end
252
+ end
253
+
254
+ context "where timestamp column is in the year 2010" do
255
+ setup do
256
+ @s.tms_gte = Time.utc(2010, 1, 1)
257
+ end
258
+
259
+ should "return two results" do
260
+ assert_equal 2, @s.all.size
261
+ end
262
+
263
+ should "not contain results with timestamp column before 2010" do
264
+ assert_empty @s.all.select {|r|
265
+ r.tms < Time.utc(2010, 1, 1)
266
+ }
267
+ end
268
+ end
269
+
270
+ context "where datetime column is before the year 2010" do
271
+ setup do
272
+ @s.tms_lt = Time.utc(2010, 1, 1)
273
+ end
274
+
275
+ should "return seven results" do
276
+ assert_equal 7, @s.all.size
277
+ end
278
+
279
+ should "not contain results with timestamp in 2010" do
280
+ assert_empty @s.all.select {|r|
281
+ r.tms >= Time.utc(2010, 1, 1)
282
+ }
283
+ end
284
+ end
285
+
286
+ context "where decimal column is > 5000" do
287
+ setup do
288
+ @s.dec_gt = 5000
289
+ end
290
+
291
+ should "return four results" do
292
+ assert_equal 4, @s.all.size
293
+ end
294
+
295
+ should "not contain results with decimal column <= 5000" do
296
+ assert_empty @s.all.select {|r|
297
+ r.dec <= 5000
298
+ }
299
+ end
300
+ end
301
+
302
+ context "where float column is between 2.5 and 3.5" do
303
+ setup do
304
+ @s.flt_gte = 2.5
305
+ @s.flt_lte = 3.5
306
+ end
307
+
308
+ should "return three results" do
309
+ assert_equal 3, @s.all.size
310
+ end
311
+
312
+ should "not contain results with float column outside constraints" do
313
+ assert_empty @s.all.select {|r|
314
+ r.flt < 2.5 || r.flt > 3.5
315
+ }
316
+ end
317
+ end
318
+
319
+ context "where integer column is in the set (1, 8, 729)" do
320
+ setup do
321
+ @s.int_in = [1, 8, 729]
322
+ end
323
+
324
+ should "return three results" do
325
+ assert_equal 3, @s.all.size
326
+ end
327
+
328
+ should "not contain results outside the specified set" do
329
+ assert_empty @s.all.select {|r|
330
+ ![1, 8, 729].include?(r.int)
331
+ }
332
+ end
333
+ end
334
+
335
+ context "where integer column is not in the set (1, 8, 729)" do
336
+ setup do
337
+ @s.int_not_in = [1, 8, 729]
338
+ end
339
+
340
+ should "return six results" do
341
+ assert_equal 6, @s.all.size
342
+ end
343
+
344
+ should "not contain results outside the specified set" do
345
+ assert_empty @s.all.reject {|r|
346
+ ![1, 8, 729].include?(r.int)
347
+ }
348
+ end
349
+ end
350
+ end
351
+ end
@@ -0,0 +1,149 @@
1
+ require 'helper'
2
+ require 'action_controller'
3
+ require 'action_view/test_case'
4
+
5
+ class TestViewHelpers < ActionView::TestCase
6
+ tests ActionView::Helpers::FormHelper
7
+
8
+ context "A previously-filled search form" do
9
+ setup do
10
+ @s = Company.search
11
+ @s.created_at_gte = [2001, 2, 3, 4, 5]
12
+ @s.name_contains = "bacon"
13
+ fields_for :search, @s do |f|
14
+ @f = f
15
+ end
16
+ end
17
+
18
+ should "retain previous search terms" do
19
+ html = @f.datetime_select(:created_at_gte)
20
+ ['2001', '3', '04', '05'].each do |v|
21
+ assert_match /<option selected="selected" value="#{v}">#{v}<\/option>/,
22
+ html
23
+ end
24
+ assert_match /<option selected="selected" value="2">February<\/option>/, html
25
+ assert_dom_equal '<input id="search_name_contains" name="search[name_contains]" ' +
26
+ 'size="30" type="text" value="bacon" />',
27
+ @f.text_field(:name_contains)
28
+ end
29
+ end
30
+
31
+ context "A form using mutiparameter_field with default size option" do
32
+ setup do
33
+ @s = Developer.search
34
+ fields_for :search, @s do |f|
35
+ @f = f
36
+ end
37
+ end
38
+
39
+ should "apply proper cast and default size attribute to text fields" do
40
+ html = @f.multiparameter_field :salary_in,
41
+ {:field_type => :text_field, :type_cast => 'i'},
42
+ {:field_type => :text_field, :type_cast => 'i'}, :size => 10
43
+ assert_dom_equal '<input id="search_salary_in(1i)" name="search[salary_in(1i)]" ' +
44
+ 'size="10" type="text" />' +
45
+ '<input id="search_salary_in(2i)" name="search[salary_in(2i)]" ' +
46
+ 'size="10" type="text" />',
47
+ html
48
+ end
49
+ end
50
+
51
+ context "A form using check_boxes with three choices" do
52
+ setup do
53
+ @s = Company.search
54
+ fields_for :search, @s do |f|
55
+ @f = f
56
+ end
57
+ end
58
+
59
+ should "generate the expected HTML without a block" do
60
+ assert_dom_equal '<input id="search_id_in_1" name="search[id_in][]" ' +
61
+ 'type="checkbox" value="1" /><label for="search_id_in_1">One</label>' +
62
+ '<input id="search_id_in_2" name="search[id_in][]" ' +
63
+ 'type="checkbox" value="2" /><label for="search_id_in_2">Two</label>' +
64
+ '<input id="search_id_in_3" name="search[id_in][]" ' +
65
+ 'type="checkbox" value="3" /><label for="search_id_in_3">Three</label>',
66
+ @f.check_boxes(:id_in, [['One', 1], ['Two', 2], ['Three', 3]])
67
+ end
68
+
69
+ should "generate the expected HTML with a block" do
70
+ @f.check_boxes(:id_in, [['One', 1], ['Two', 2], ['Three', 3]]) do |c|
71
+ concat render :to => :string, :inline => "<p><%= c[:label] %> <%= c[:check_box] %></p>", :locals => {:c => c}
72
+ end
73
+ assert_dom_equal output_buffer,
74
+ '<p><label for="search_id_in_1">One</label> ' +
75
+ '<input id="search_id_in_1" name="search[id_in][]" ' +
76
+ 'type="checkbox" value="1" /></p>' +
77
+ '<p><label for="search_id_in_2">Two</label> ' +
78
+ '<input id="search_id_in_2" name="search[id_in][]" ' +
79
+ 'type="checkbox" value="2" /></p>' +
80
+ '<p><label for="search_id_in_3">Three</label> ' +
81
+ '<input id="search_id_in_3" name="search[id_in][]" ' +
82
+ 'type="checkbox" value="3" /></p>'
83
+ end
84
+ end
85
+
86
+ context "A form using check_boxes with three choices and a previous selection" do
87
+ setup do
88
+ @s = Company.search
89
+ @s.id_in = [1, 3]
90
+ fields_for :search, @s do |f|
91
+ @f = f
92
+ end
93
+ end
94
+
95
+ should "generate the expected HTML without a block" do
96
+ assert_dom_equal '<input checked="checked" id="search_id_in_1" name="search[id_in][]" ' +
97
+ 'type="checkbox" value="1" /><label for="search_id_in_1">One</label>' +
98
+ '<input id="search_id_in_2" name="search[id_in][]" ' +
99
+ 'type="checkbox" value="2" /><label for="search_id_in_2">Two</label>' +
100
+ '<input checked="checked" id="search_id_in_3" name="search[id_in][]" ' +
101
+ 'type="checkbox" value="3" /><label for="search_id_in_3">Three</label>',
102
+ @f.check_boxes(:id_in, [['One', 1], ['Two', 2], ['Three', 3]])
103
+ end
104
+
105
+ should "generate the expected HTML with a block" do
106
+ @f.check_boxes(:id_in, [['One', 1], ['Two', 2], ['Three', 3]]) do |c|
107
+ concat render :to => :string, :inline => "<p><%= c[:label] %> <%= c[:check_box] %></p>", :locals => {:c => c}
108
+ end
109
+ assert_dom_equal output_buffer,
110
+ '<p><label for="search_id_in_1">One</label> <input checked="checked" id="search_id_in_1" ' +
111
+ 'name="search[id_in][]" type="checkbox" value="1" /></p><p><label for="search_id_in_2">' +
112
+ 'Two</label> <input id="search_id_in_2" name="search[id_in][]" type="checkbox" value="2" />' +
113
+ '</p><p><label for="search_id_in_3">Three</label> <input checked="checked" id="search_id_in_3" ' +
114
+ 'name="search[id_in][]" type="checkbox" value="3" /></p>'
115
+ end
116
+
117
+ context "A form using collection_check_boxes with companies" do
118
+ setup do
119
+ @s = Company.search
120
+ fields_for :search, @s do |f|
121
+ @f = f
122
+ end
123
+ end
124
+
125
+ should "generate the expected HTML without a block" do
126
+ assert_dom_equal '<input id="search_id_in_1" name="search[id_in][]" type="checkbox" ' +
127
+ 'value="1" /><label for="search_id_in_1">Initech</label>' +
128
+ '<input id="search_id_in_2" name="search[id_in][]" type="checkbox" ' +
129
+ 'value="2" /><label for="search_id_in_2">Advanced Optical Solutions</label>' +
130
+ '<input id="search_id_in_3" name="search[id_in][]" type="checkbox" ' +
131
+ 'value="3" /><label for="search_id_in_3">Mission Data</label>',
132
+ @f.collection_check_boxes(:id_in, Company.all, :id, :name)
133
+ end
134
+
135
+ should "generate the expected HTML with a block" do
136
+ @f.collection_check_boxes(:id_in, Company.all, :id, :name) do |c|
137
+ concat render :to => :string, :inline => "<p><%= c[:label] %> <%= c[:check_box] %></p>", :locals => {:c => c}
138
+ end
139
+ assert_dom_equal output_buffer,
140
+ '<p><label for="search_id_in_1">Initech</label> ' +
141
+ '<input id="search_id_in_1" name="search[id_in][]" type="checkbox" value="1" /></p>' +
142
+ '<p><label for="search_id_in_2">Advanced Optical Solutions</label> ' +
143
+ '<input id="search_id_in_2" name="search[id_in][]" type="checkbox" value="2" /></p>' +
144
+ '<p><label for="search_id_in_3">Mission Data</label> ' +
145
+ '<input id="search_id_in_3" name="search[id_in][]" type="checkbox" value="3" /></p>'
146
+ end
147
+ end
148
+ end
149
+ end
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: meta_search
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 3
8
+ - 0
9
+ version: 0.3.0
10
+ platform: ruby
11
+ authors:
12
+ - Ernie Miller
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-03-16 00:00:00 -04:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: activerecord
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 3
29
+ - 0
30
+ - 0
31
+ - beta
32
+ version: 3.0.0.beta
33
+ type: :development
34
+ version_requirements: *id001
35
+ description: Adds a search method to your ActiveRecord models which returns an object to be used in form_for while constructing a search. Works with Rails 3 only.
36
+ email: ernie@metautonomo.us
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files:
42
+ - LICENSE
43
+ - README.rdoc
44
+ files:
45
+ - .document
46
+ - .gitignore
47
+ - LICENSE
48
+ - README.rdoc
49
+ - Rakefile
50
+ - VERSION
51
+ - lib/meta_search.rb
52
+ - lib/meta_search/builder.rb
53
+ - lib/meta_search/exceptions.rb
54
+ - lib/meta_search/helpers/action_view.rb
55
+ - lib/meta_search/model_compatibility.rb
56
+ - lib/meta_search/railtie.rb
57
+ - lib/meta_search/searches/active_record.rb
58
+ - lib/meta_search/searches/base.rb
59
+ - lib/meta_search/utility.rb
60
+ - lib/meta_search/where.rb
61
+ - meta_search.gemspec
62
+ - test/fixtures/companies.yml
63
+ - test/fixtures/company.rb
64
+ - test/fixtures/data_type.rb
65
+ - test/fixtures/data_types.yml
66
+ - test/fixtures/developer.rb
67
+ - test/fixtures/developers.yml
68
+ - test/fixtures/developers_projects.yml
69
+ - test/fixtures/note.rb
70
+ - test/fixtures/notes.yml
71
+ - test/fixtures/project.rb
72
+ - test/fixtures/projects.yml
73
+ - test/fixtures/schema.rb
74
+ - test/helper.rb
75
+ - test/test_search.rb
76
+ - test/test_view_helpers.rb
77
+ has_rdoc: true
78
+ homepage: http://metautonomo.us
79
+ licenses: []
80
+
81
+ post_install_message:
82
+ rdoc_options:
83
+ - --charset=UTF-8
84
+ require_paths:
85
+ - lib
86
+ required_ruby_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ segments:
91
+ - 0
92
+ version: "0"
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ segments:
98
+ - 0
99
+ version: "0"
100
+ requirements: []
101
+
102
+ rubyforge_project:
103
+ rubygems_version: 1.3.6
104
+ signing_key:
105
+ specification_version: 3
106
+ summary: ActiveRecord 3 object-based searching.
107
+ test_files:
108
+ - test/fixtures/company.rb
109
+ - test/fixtures/data_type.rb
110
+ - test/fixtures/developer.rb
111
+ - test/fixtures/note.rb
112
+ - test/fixtures/project.rb
113
+ - test/fixtures/schema.rb
114
+ - test/helper.rb
115
+ - test/test_search.rb
116
+ - test/test_view_helpers.rb