scoped_search 3.0.1 → 3.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 43261f39db1d9b12979b0a8ac09d325b89c31335
4
- data.tar.gz: 65f7f0cf411208478aee6aa9c7bb11d13036bd88
3
+ metadata.gz: f8f3158e1d95aa30c3129d1f93fd908c7a52c8d4
4
+ data.tar.gz: db5a65eeebd58513c499ea3b6bbfb3a8723702d8
5
5
  SHA512:
6
- metadata.gz: 96ec7c114d8d6cde7413eb1a3247540f181694acbaba09044d6d97a65405a87f44f55101b6c868108e8502254762a8a689290038f63ba743c2f67948f5a288ff
7
- data.tar.gz: 26dc0c35c2547547af5759ba31128dce71784f93f70cecdff67c1cf5c108c81504f827a382249f7e076050fc2ede54ea5330bf1b10cf2fe3993de378466f64f6
6
+ metadata.gz: 34c8500136d8d3baf89313d09a9cfeb817798790ce27d16009745ed6af40dbc9ec47f3c2532dab44945c266cb491973179506b5e0a2950d02db5f64c337716f0
7
+ data.tar.gz: bf5ea94257096ead71261964695ba7fed482cbca7c5b5acfd5afed3653884312e5fda2d9c8d11262f3c7f7b710c78ce9c75b060b3ba5391bfa182eefd738fcf4
@@ -1,30 +1,32 @@
1
-
2
1
  language: ruby
3
2
  cache: bundler
4
-
5
3
  sudo: false
6
4
 
5
+ install:
6
+ - bundle install
7
+ before_script:
8
+ - psql -c 'create database scoped_search_test;' -U postgres
9
+ - mysql -e 'create database scoped_search_test;'
10
+ script:
11
+ - bundle exec rake
12
+
7
13
  rvm:
8
- - 1.9.3
9
- - 2.0.0
10
- - 2.1.1
11
- - ruby-head
12
- - jruby-19mode
13
- - jruby-head
14
+ - "1.9"
15
+ - "2.0"
16
+ - "2.1"
17
+ - "2.2"
18
+ - ruby-head
19
+ - jruby-19mode
20
+ - jruby-head
14
21
 
15
22
  gemfile:
16
- - Gemfile.activerecord3
17
- - Gemfile.activerecord40
18
- - Gemfile.activerecord41
19
-
20
- before_script:
21
- - psql -c 'create database scoped_search_test;' -U postgres
22
- - mysql -e 'create database scoped_search_test;'
23
-
24
- script: bundle exec rake
23
+ - Gemfile.activerecord32
24
+ - Gemfile.activerecord40
25
+ - Gemfile.activerecord41
26
+ - Gemfile.activerecord42
25
27
 
26
28
  matrix:
27
- include:
28
29
  allow_failures:
29
- - rvm: ruby-head
30
- - rvm: jruby-head
30
+ - rvm: ruby-head
31
+ - rvm: jruby-head
32
+ - rvm: jruby-19mode
@@ -8,7 +8,16 @@ Please add an entry to the "Unreleased changes" section in your pull requests.
8
8
 
9
9
  *Nothing yet*
10
10
 
11
- === Version 3.0
11
+ === Version 3.1.0
12
+
13
+ - Add support for ActiveRecord 4.2.
14
+ - Bump AtiveRecord requirement to 3.2.
15
+
16
+ === Version 3.0.1
17
+
18
+ - Security fix in parsing dates.
19
+
20
+ === Version 3.0.0
12
21
 
13
22
  - Add support for ActiveRecord 4.1
14
23
  - Drop support for Ruby 1.8
@@ -6,10 +6,11 @@ Scoped search is an open source project, and hence we are open for contributions
6
6
 
7
7
  When reporting an issue, make sure to include the following information so we can pinpoint the problem faster:
8
8
 
9
- - What query did you use?
9
+ - What search query did you use?
10
10
  - What is the search definition used on your models?
11
11
  - What do the tables involved in your search definition look like? Please include the type of the fields.
12
12
  - A sample of records. Which one did you expect to be included in the result
13
+ - What was the SQL that scoped_search ended up generating?
13
14
 
14
15
  Finally, please include the following information about your environment.
15
16
 
@@ -1,7 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
  gemspec
3
3
 
4
- gem 'activerecord', '~> 3'
4
+ gem 'activerecord', '~> 3.2.0'
5
5
 
6
6
  platforms :jruby do
7
7
  gem 'activerecord-jdbcsqlite3-adapter'
@@ -0,0 +1,16 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+
4
+ gem 'activerecord', '~> 4.2.0'
5
+
6
+ platforms :jruby do
7
+ gem 'activerecord-jdbcsqlite3-adapter'
8
+ gem 'activerecord-jdbcmysql-adapter'
9
+ gem 'activerecord-jdbcpostgresql-adapter'
10
+ end
11
+
12
+ platforms :ruby do
13
+ gem 'sqlite3'
14
+ gem 'mysql2', '~> 0.3.11'
15
+ gem 'pg'
16
+ end
@@ -246,7 +246,7 @@ module ScopedSearch
246
246
 
247
247
  if field.key_klass != field.klass
248
248
  key = field.key_klass.to_s.gsub(/.*::/,'').underscore.to_sym
249
- fk = field.klass.reflections[key].association_foreign_key.to_sym
249
+ fk = definition.reflection_by_name(field.klass, key).association_foreign_key.to_sym
250
250
  query = query.where(fk => key_klass.id)
251
251
  end
252
252
 
@@ -59,9 +59,7 @@ module ScopedSearch
59
59
  # The ActiveRecord-based class that belongs to this field.
60
60
  def klass
61
61
  @klass ||= if relation
62
- related = definition.klass.reflections[relation]
63
- raise ScopedSearch::QueryNotSupported, "relation '#{relation}' not one of #{definition.klass.reflections.keys.join(', ')} " if related.nil?
64
- related.klass
62
+ definition.reflection_by_name(definition.klass, relation).klass
65
63
  else
66
64
  definition.klass
67
65
  end
@@ -70,9 +68,9 @@ module ScopedSearch
70
68
  # The ActiveRecord-based class that belongs the key field in a key-value pair.
71
69
  def key_klass
72
70
  @key_klass ||= if key_relation
73
- definition.klass.reflections[key_relation].klass
71
+ definition.reflection_by_name(definition.klass, key_relation).klass
74
72
  elsif relation
75
- definition.klass.reflections[relation].klass
73
+ definition.reflection_by_name(definition.klass, relation).klass
76
74
  else
77
75
  definition.klass
78
76
  end
@@ -87,7 +85,7 @@ module ScopedSearch
87
85
  if "#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}".to_f < 4.1
88
86
  raise ActiveRecord::UnknownAttributeError, "#{klass.inspect} doesn't have column #{field.inspect}."
89
87
  else
90
- raise ActiveRecord::UnknownAttributeError.new( klass, field )
88
+ raise ActiveRecord::UnknownAttributeError.new(klass, field)
91
89
  end
92
90
  end
93
91
  end
@@ -198,7 +196,7 @@ module ScopedSearch
198
196
  return ['= ', '> ', '< ', '<= ', '>= ','!= ', '^ ', '!^ '] if field.numerical?
199
197
  return ['= ', '!= ', '~ ', '!~ ', '^ ', '!^ '] if field.textual?
200
198
  return ['= ', '> ', '< '] if field.temporal?
201
- raise ScopedSearch::QueryNotSupported, "could not verify '#{name}' type, this can be a result of a definition error"
199
+ raise ScopedSearch::QueryNotSupported, "Unsupported type '#{field.type.inspect}')' for field '#{name}'. This can be a result of a search definition problem."
202
200
  end
203
201
 
204
202
  NUMERICAL_REGXP = /^\-?\d+(\.\d+)?$/
@@ -240,40 +238,29 @@ module ScopedSearch
240
238
  Field.new(self, options)
241
239
  end
242
240
 
241
+ # Returns a reflection for a given klass and name
242
+ def reflection_by_name(klass, name)
243
+ return if name.nil?
244
+ klass.reflections[name.to_sym] || klass.reflections[name.to_s]
245
+ end
246
+
243
247
  protected
244
248
 
245
249
  # Registers the search_for named scope within the class that is used for searching.
246
250
  def register_named_scope! # :nodoc
247
251
  definition = self
248
- if @klass.ancestors.include?(ActiveRecord::Base)
249
- case ActiveRecord::VERSION::MAJOR
250
- when 3
251
- @klass.scope(:search_for, lambda { |*args|
252
- find_options = ScopedSearch::QueryBuilder.build_query(definition, args[0], args[1])
253
- search_scope = @klass.scoped
254
- search_scope = search_scope.where(find_options[:conditions]) if find_options[:conditions]
255
- search_scope = search_scope.includes(find_options[:include]) if find_options[:include]
256
- search_scope = search_scope.joins(find_options[:joins]) if find_options[:joins]
257
- search_scope = search_scope.reorder(find_options[:order]) if find_options[:order]
258
- search_scope
259
- })
260
- when 4
261
- @klass.scope(:search_for, lambda { |*args|
262
- find_options = ScopedSearch::QueryBuilder.build_query(definition, args[0], args[1])
263
- search_scope = @klass
264
- search_scope = search_scope.where(find_options[:conditions]) if find_options[:conditions]
265
- search_scope = search_scope.includes(find_options[:include]) if find_options[:include]
266
- search_scope = search_scope.references(find_options[:include]) if find_options[:include]
267
- search_scope = search_scope.joins(find_options[:joins]) if find_options[:joins]
268
- search_scope = search_scope.reorder(find_options[:order]) if find_options[:order]
269
- search_scope
270
- })
271
- else
272
- raise "This ActiveRecord version is currently not supported!"
273
- end
274
- else
275
- raise "Currently, only ActiveRecord 3 or newer is supported!"
276
- end
252
+ @klass.scope(:search_for, proc { |query, options|
253
+ search_scope = ActiveRecord::VERSION::MAJOR == 3 ? @klass.scoped : @klass
254
+
255
+ find_options = ScopedSearch::QueryBuilder.build_query(definition, query || '', options || {})
256
+ search_scope = search_scope.where(find_options[:conditions]) if find_options[:conditions]
257
+ search_scope = search_scope.includes(find_options[:include]) if find_options[:include]
258
+ search_scope = search_scope.joins(find_options[:joins]) if find_options[:joins]
259
+ search_scope = search_scope.reorder(find_options[:order]) if find_options[:order]
260
+ search_scope = search_scope.references(find_options[:include]) if find_options[:include] && ActiveRecord::VERSION::MAJOR >= 4
261
+
262
+ search_scope
263
+ })
277
264
  end
278
265
 
279
266
  # Registers the complete_for method within the class that is used for searching.
@@ -14,17 +14,14 @@ module ScopedSearch
14
14
  # This method will parse the query string and build an SQL query using the search
15
15
  # query. It will return an empty hash if the search query is empty, in which case
16
16
  # the scope call will simply return all records.
17
- def self.build_query(definition, *args)
18
- query = args[0] ||=''
19
- options = args[1] || {}
20
-
17
+ def self.build_query(definition, query, options = {})
21
18
  query_builder_class = self.class_for(definition)
22
19
  if query.kind_of?(ScopedSearch::QueryLanguage::AST::Node)
23
20
  return query_builder_class.new(definition, query, options[:profile]).build_find_params(options)
24
21
  elsif query.kind_of?(String)
25
22
  return query_builder_class.new(definition, ScopedSearch::QueryLanguage::Compiler.parse(query), options[:profile]).build_find_params(options)
26
23
  else
27
- raise "Unsupported query object: #{query.inspect}!"
24
+ raise ArgumentError, "Unsupported query object: #{query.inspect}!"
28
25
  end
29
26
  end
30
27
 
@@ -213,26 +210,31 @@ module ScopedSearch
213
210
  if [:like, :unlike].include?(operator)
214
211
  yield(:parameter, (value !~ /^\%|\*/ && value !~ /\%|\*$/) ? "%#{value}%" : value.tr_s('%*', '%'))
215
212
  return "#{field.to_sql(operator, &block)} #{self.sql_operator(operator, field)} ?"
213
+
216
214
  elsif [:in, :notin].include?(operator)
217
215
  value.split(',').collect { |v| yield(:parameter, field.set? ? translate_value(field, v) : v.strip) }
218
216
  value = value.split(',').collect { "?" }.join(",")
219
217
  return "#{field.to_sql(operator, &block)} #{self.sql_operator(operator, field)} (#{value})"
218
+
220
219
  elsif field.temporal?
221
220
  return datetime_test(field, operator, value, &block)
221
+
222
222
  elsif field.set?
223
223
  return set_test(field, operator, value, &block)
224
- elsif field.definition.klass.reflections[field.relation].try(:macro) == :has_many
224
+
225
+ elsif field.relation && definition.reflection_by_name(field.definition.klass, field.relation).macro == :has_many
225
226
  value = value.to_i if field.offset
226
227
  yield(:parameter, value)
227
228
  connection = field.definition.klass.connection
228
229
  primary_key = "#{connection.quote_table_name(field.definition.klass.table_name)}.#{connection.quote_column_name(field.definition.klass.primary_key)}"
229
- if field.definition.klass.reflections[field.relation].options.has_key?(:through)
230
+ if definition.reflection_by_name(field.definition.klass, field.relation).options.has_key?(:through)
230
231
  join = has_many_through_join(field)
231
232
  return "#{primary_key} IN (SELECT #{primary_key} FROM #{join} WHERE #{field.to_sql(operator, &block)} #{self.sql_operator(operator, field)} ? )"
232
233
  else
233
- foreign_key = connection.quote_column_name(field.reflection_keys(field.definition.klass.reflections[field.relation])[1])
234
+ foreign_key = connection.quote_column_name(field.reflection_keys(definition.reflection_by_name(field.definition.klass, field.relation))[1])
234
235
  return "#{primary_key} IN (SELECT #{foreign_key} FROM #{connection.quote_table_name(field.klass.table_name)} WHERE #{field.to_sql(operator, &block)} #{self.sql_operator(operator, field)} ? )"
235
236
  end
237
+
236
238
  else
237
239
  value = value.to_i if field.offset
238
240
  yield(:parameter, value)
@@ -242,21 +244,21 @@ module ScopedSearch
242
244
 
243
245
  def has_many_through_join(field)
244
246
  many_class = field.definition.klass
245
- through = many_class.reflections[field.relation].options[:through]
247
+ through = definition.reflection_by_name(many_class, field.relation).options[:through]
246
248
  connection = many_class.connection
247
249
 
248
250
  # table names
249
251
  endpoint_table_name = field.klass.table_name
250
252
  many_table_name = many_class.table_name
251
- middle_table_name = many_class.reflections[through].klass.table_name
253
+ middle_table_name = definition.reflection_by_name(many_class, through).klass.table_name
252
254
 
253
255
  # primary and foreign keys + optional condition for the many to middle join
254
- pk1, fk1 = field.reflection_keys(many_class.reflections[through])
255
- condition1 = field.reflection_conditions(field.klass.reflections[many_table_name.to_sym])
256
+ pk1, fk1 = field.reflection_keys(definition.reflection_by_name(many_class, through))
257
+ condition1 = field.reflection_conditions(definition.reflection_by_name(field.klass, many_table_name))
256
258
 
257
259
  # primary and foreign keys + optional condition for the endpoint to middle join
258
- pk2, fk2 = field.reflection_keys(field.klass.reflections[middle_table_name.to_sym])
259
- condition2 = field.reflection_conditions(many_class.reflections[field.relation])
260
+ pk2, fk2 = field.reflection_keys(definition.reflection_by_name(field.klass, middle_table_name))
261
+ condition2 = field.reflection_conditions(definition.reflection_by_name(many_class, field.relation))
260
262
 
261
263
  <<-SQL
262
264
  #{connection.quote_table_name(many_table_name)}
@@ -307,20 +309,20 @@ module ScopedSearch
307
309
  # +----------+ +---------+ +--------+
308
310
  # uniq name for the joins are needed in case that there is more than one condition
309
311
  # on different keys in the same query.
310
- def construct_join_sql(key_relation, num )
312
+ def construct_join_sql(key_relation, num)
311
313
  join_sql = ""
312
314
  connection = klass.connection
313
315
  key = key_relation.to_s.singularize.to_sym
314
316
 
315
- key_table = klass.reflections[key].table_name
317
+ key_table = definition.reflection_by_name(klass, key).table_name
316
318
  value_table = klass.table_name.to_s
317
319
 
318
- value_table_fk_key, key_table_pk = reflection_keys(klass.reflections[key])
320
+ value_table_fk_key, key_table_pk = reflection_keys(definition.reflection_by_name(klass, key))
319
321
 
320
- main_reflection = definition.klass.reflections[relation]
322
+ main_reflection = definition.reflection_by_name(definition.klass, relation)
321
323
  if main_reflection
322
324
  main_table = definition.klass.table_name
323
- main_table_pk, value_table_fk_main = reflection_keys(definition.klass.reflections[relation])
325
+ main_table_pk, value_table_fk_main = reflection_keys(definition.reflection_by_name(definition.klass, relation))
324
326
 
325
327
  join_sql = "\n INNER JOIN #{connection.quote_table_name(value_table)} #{value_table}_#{num} ON (#{main_table}.#{main_table_pk} = #{value_table}_#{num}.#{value_table_fk_main})"
326
328
  value_table = " #{value_table}_#{num}"
@@ -339,12 +341,12 @@ module ScopedSearch
339
341
  # +----------+ +---------+
340
342
  # uniq name for the joins are needed in case that there is more than one condition
341
343
  # on different keys in the same query.
342
- def construct_simple_join_sql( num )
344
+ def construct_simple_join_sql(num)
343
345
  connection = klass.connection
344
346
  key_value_table = klass.table_name
345
347
 
346
348
  main_table = definition.klass.table_name
347
- main_table_pk, value_table_fk_main = reflection_keys(definition.klass.reflections[relation])
349
+ main_table_pk, value_table_fk_main = reflection_keys(definition.reflection_by_name(definition.klass, relation))
348
350
 
349
351
  join_sql = "\n INNER JOIN #{connection.quote_table_name(key_value_table)} #{key_value_table}_#{num} ON (#{connection.quote_table_name(main_table)}.#{connection.quote_column_name(main_table_pk)} = #{key_value_table}_#{num}.#{connection.quote_column_name(value_table_fk_main)})"
350
352
  return join_sql
@@ -1,3 +1,3 @@
1
1
  module ScopedSearch
2
- VERSION = "3.0.1"
2
+ VERSION = "3.1.0"
3
3
  end
@@ -29,7 +29,7 @@ Gem::Specification.new do |gem|
29
29
  gem.require_paths = ["lib"]
30
30
 
31
31
  gem.required_ruby_version = '>= 1.9.3'
32
- gem.add_runtime_dependency('activerecord', '>= 3.0.0')
32
+ gem.add_runtime_dependency('activerecord', '>= 3.2.0')
33
33
  gem.add_development_dependency('rspec', '~> 3.0')
34
34
  gem.add_development_dependency('rake')
35
35
 
@@ -44,15 +44,8 @@ describe ScopedSearch, "API" do
44
44
  @class.should respond_to(:search_for)
45
45
  end
46
46
 
47
- if ActiveRecord::VERSION::MAJOR == 3
48
- it "should return a ActiveRecord::Relation instance" do
49
- @class.search_for('query').class.should eql(ActiveRecord::Relation)
50
- end
51
-
52
- elsif ActiveRecord::VERSION::MAJOR == 4
53
- it "should return a ActiveRecord::Relation instance" do
54
- @class.search_for('query').class.superclass.should eql(ActiveRecord::Relation)
55
- end
47
+ it "should return a ActiveRecord::Relation instance" do
48
+ @class.search_for('query').should be_a(ActiveRecord::Relation)
56
49
  end
57
50
  end
58
51
  end
@@ -96,13 +96,8 @@ require "spec_helper"
96
96
  end
97
97
 
98
98
  it "should find all bars with a fact name color and fact value gold of descendant class" do
99
- if ActiveRecord::VERSION::MAJOR == 3
100
- MyItem.search_for('facts.color = gold').first.name.should eql('barbary')
101
- end
99
+ MyItem.search_for('facts.color = gold').first.name.should eql('barbary')
102
100
  end
103
-
104
101
  end
105
-
106
102
  end
107
103
  end
108
-
@@ -222,9 +222,9 @@ ScopedSearch::RSpec::Database.test_databases.each do |db|
222
222
  end
223
223
 
224
224
  after do
225
- ActiveRecord::Migration.drop_table(:dars_joos)
226
- ActiveRecord::Migration.drop_table(:dars)
227
- ActiveRecord::Migration.drop_table(:joos)
225
+ ScopedSearch::RSpec::Database.drop_model(Joo)
226
+ ScopedSearch::RSpec::Database.drop_model(Dar)
227
+ ActiveRecord::Migration.drop_table(:dars_joos) if ActiveRecord::Migration.table_exists?(:dars_joos)
228
228
  end
229
229
 
230
230
  it "should find all records with at least one associated bar record containing 'bar'" do
@@ -336,15 +336,12 @@ ScopedSearch::RSpec::Database.test_databases.each do |db|
336
336
  ActiveRecord::Migration.drop_table(:zoos)
337
337
  end
338
338
 
339
- # This table schema is not supported in activerecord 2, skip the tests
340
- if ActiveRecord::VERSION::MAJOR > 2
341
- it "should find the three records that are related to a baz record" do
342
- Zoo.search_for('baz').length.should == 3
343
- end
339
+ it "should find the three records that are related to a baz record" do
340
+ Zoo.search_for('baz').length.should == 3
341
+ end
344
342
 
345
- it "should find no records that are related to a baz record" do
346
- Zoo.search_for('related=baz AND related="baz too!"').length.should == 0
347
- end
343
+ it "should find no records that are related to a baz record" do
344
+ Zoo.search_for('related=baz AND related="baz too!"').length.should == 0
348
345
  end
349
346
  end
350
347
 
@@ -20,7 +20,7 @@ module ScopedSearch::RSpec::Database
20
20
 
21
21
  @database_connections ||= YAML.load(File.read(file))
22
22
  end
23
-
23
+
24
24
  def self.test_databases
25
25
  database_names = test_databases_configuration.keys.sort
26
26
  if ENV['EXCLUDE_DATABASE'].present?
@@ -59,6 +59,10 @@ module ScopedSearch::RSpec::Database
59
59
  end
60
60
 
61
61
  def self.drop_model(klass)
62
+ klass.constants.grep(/\AHABTM_/).each do |habtm_class|
63
+ ActiveRecord::Migration.drop_table(klass.const_get(habtm_class).table_name)
64
+ klass.send(:remove_const, habtm_class)
65
+ end
62
66
  ActiveRecord::Migration.drop_table(klass.table_name)
63
67
  end
64
- end
68
+ end
@@ -25,33 +25,15 @@ describe ScopedSearch::Definition do
25
25
  end
26
26
 
27
27
  describe '#initialize' do
28
+ it "should create the named scope when" do
29
+ @klass.should_receive(:scope).with(:search_for, instance_of(Proc))
30
+ ScopedSearch::Definition.new(@klass)
31
+ end
28
32
 
29
- if ActiveRecord::VERSION::MAJOR == 2
30
-
31
- it "should create the named scope when" do
32
- @klass.should_receive(:named_scope).with(:search_for, instance_of(Proc))
33
- ScopedSearch::Definition.new(@klass)
34
- end
35
-
36
- it "should not create the named scope if it already exists" do
37
- @klass.stub(:search_for)
38
- @klass.should_not_receive(:named_scope)
39
- ScopedSearch::Definition.new(@klass)
40
- end
41
-
42
- elsif ActiveRecord::VERSION::MAJOR == 3
43
-
44
- it "should create the named scope when" do
45
- @klass.should_receive(:scope).with(:search_for, instance_of(Proc))
46
- ScopedSearch::Definition.new(@klass)
47
- end
48
-
49
- it "should not create the named scope if it already exists" do
50
- @klass.stub(:search_for)
51
- @klass.should_not_receive(:scope)
52
- ScopedSearch::Definition.new(@klass)
53
- end
54
-
33
+ it "should not create the named scope if it already exists" do
34
+ @klass.stub(:search_for)
35
+ @klass.should_not_receive(:scope)
36
+ ScopedSearch::Definition.new(@klass)
55
37
  end
56
38
  end
57
39
  end
@@ -10,8 +10,8 @@ describe ScopedSearch::QueryBuilder do
10
10
  @definition.stub(:profile=).and_return(true)
11
11
  end
12
12
 
13
- it "should return empty conditions if the search query is nil" do
14
- ScopedSearch::QueryBuilder.build_query(@definition, nil).should == { }
13
+ it "should raise an ArgumentError if the query is not set" do
14
+ lambda { ScopedSearch::QueryBuilder.build_query(@definition, nil) }.should raise_error(ArgumentError)
15
15
  end
16
16
 
17
17
  it "should return empty conditions if the query is blank" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scoped_search
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.1
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Amos Benari
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-12-24 00:00:00.000000000 Z
13
+ date: 2015-01-15 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
@@ -18,14 +18,14 @@ dependencies:
18
18
  requirements:
19
19
  - - '>='
20
20
  - !ruby/object:Gem::Version
21
- version: 3.0.0
21
+ version: 3.2.0
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - '>='
27
27
  - !ruby/object:Gem::Version
28
- version: 3.0.0
28
+ version: 3.2.0
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: rspec
31
31
  requirement: !ruby/object:Gem::Requirement
@@ -82,9 +82,10 @@ files:
82
82
  - CHANGELOG.rdoc
83
83
  - CONTRIBUTING.rdoc
84
84
  - Gemfile
85
- - Gemfile.activerecord3
85
+ - Gemfile.activerecord32
86
86
  - Gemfile.activerecord40
87
87
  - Gemfile.activerecord41
88
+ - Gemfile.activerecord42
88
89
  - LICENSE
89
90
  - README.rdoc
90
91
  - Rakefile