scoped_search 2.5.1 → 2.6.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.
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source :rubygems
1
+ source 'https://rubygems.org'
2
2
  gemspec
3
3
 
4
4
  gem 'activerecord'
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2008 Willem van Bergen
1
+ Copyright (c) 2008-2013 Willem van Bergen & contributors
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -18,12 +18,9 @@
18
18
  font-weight: bold;
19
19
  color: black;
20
20
  display: inline-block;
21
- width: 14px;
22
- height: 14px;
23
21
  margin-left: -6px;
24
- margin-bottom: -5px;
25
- text-shadow: 0 1px 0 rgba(255,255,255,1);
26
22
  @include opacity(20);
23
+ vertical-align: middle;
27
24
  &:hover,
28
25
  &:focus {
29
26
  text-decoration: none;
data/lib/scoped_search.rb CHANGED
@@ -90,19 +90,6 @@ require 'scoped_search/auto_complete_builder'
90
90
  ActiveRecord::Base.send(:extend, ScopedSearch::ClassMethods)
91
91
  ActiveRecord::Base.send(:extend, ScopedSearch::BackwardsCompatibility)
92
92
 
93
- if defined?(ActionController)
94
- require "scoped_search/rails_helper"
95
- ActionController::Base.helper(ScopedSearch::RailsHelper)
96
- end
97
-
98
- #asset pipeline
99
- if defined?(::Sprockets)
100
- require 'scoped_search/engine'
101
- end
102
-
103
- #Compass
104
- if defined?(::Compass)
105
- base = File.join(File.dirname(__FILE__), '..')
106
- styles = File.join(base, 'vendor', 'assets', 'stylesheets')
107
- ::Compass::Frameworks.register('scoped_search', :path => base, :stylesheets_directory => styles)
108
- end
93
+ # Rails & Compass integration
94
+ require 'scoped_search/railtie' if defined?(::Rails)
95
+ require 'scoped_search/compass' if defined?(::Compass)
@@ -0,0 +1,3 @@
1
+ base = File.join(File.dirname(__FILE__), '..')
2
+ styles = File.join(base, 'vendor', 'assets', 'stylesheets')
3
+ ::Compass::Frameworks.register('scoped_search', :path => base, :stylesheets_directory => styles)
@@ -134,8 +134,7 @@ module ScopedSearch
134
134
 
135
135
  def default_order(options)
136
136
  return nil if options[:default_order].nil?
137
- field_name = options[:on] unless options[:rename]
138
- field_name = options[:rename] if options[:rename]
137
+ field_name = options[:rename].nil? ? options[:on] : options[:rename]
139
138
  order = (options[:default_order].to_s.downcase.include?('desc')) ? "DESC" : "ASC"
140
139
  return "#{field_name} #{order}"
141
140
  end
@@ -59,9 +59,9 @@ module ScopedSearch
59
59
  case notification
60
60
  when :keycondition then keyconditions << value
61
61
  when :keyparameter then keyparameters << value
62
- when :parameter then parameters << value
63
- when :include then includes << value
64
- when :joins then joins << value
62
+ when :parameter then parameters << value
63
+ when :include then includes << value
64
+ when :joins then joins << value
65
65
  else raise ScopedSearch::QueryNotSupported, "Cannot handle #{notification.inspect}: #{value.inspect}"
66
66
  end
67
67
  end
@@ -70,7 +70,7 @@ module ScopedSearch
70
70
  case notification
71
71
  when :parameter then parameters << value
72
72
  when :include then includes << value
73
- when :joins then joins << value
73
+ when :joins then joins << value
74
74
  else raise ScopedSearch::QueryNotSupported, "Cannot handle #{notification.inspect}: #{value.inspect}"
75
75
  end
76
76
  end
@@ -78,9 +78,9 @@ module ScopedSearch
78
78
  # Build hash for ActiveRecord::Base#find for the named scope
79
79
  find_attributes = {}
80
80
  find_attributes[:conditions] = [sql] + keyparameters + parameters unless sql.blank?
81
- find_attributes[:include] = includes.uniq unless includes.empty?
82
- find_attributes[:joins] = joins.uniq unless joins.empty?
83
- find_attributes[:order] = order unless order.nil?
81
+ find_attributes[:include] = includes.uniq unless includes.empty?
82
+ find_attributes[:joins] = joins.uniq unless joins.empty?
83
+ find_attributes[:order] = order unless order.nil?
84
84
 
85
85
  # p find_attributes # Uncomment for debugging
86
86
  return find_attributes
@@ -220,6 +220,18 @@ module ScopedSearch
220
220
  return datetime_test(field, operator, value, &block)
221
221
  elsif field.set?
222
222
  return set_test(field, operator, value, &block)
223
+ elsif field.definition.klass.reflections[field.relation].try(:macro) == :has_many
224
+ if field.definition.klass.reflections[field.relation].options.has_key?(:through)
225
+ value = value.to_i if field.offset
226
+ yield(:parameter, value)
227
+ join = has_many_through_join(field)
228
+ middle_table = field.definition.klass.reflections[field.relation].options[:through]
229
+ return "#{field.definition.klass.table_name}.id IN (SELECT #{field.reflection_keys(field.definition.klass.reflections[middle_table])[1]} FROM #{join} WHERE #{field.to_sql(operator, &block)} #{self.sql_operator(operator, field)} ? )"
230
+ else
231
+ value = value.to_i if field.offset
232
+ yield(:parameter, value)
233
+ return "#{field.definition.klass.table_name}.id IN (SELECT #{field.reflection_keys(field.definition.klass.reflections[field.relation])[1]} FROM #{field.klass.table_name} WHERE #{field.to_sql(operator, &block)} #{self.sql_operator(operator, field)} ? )"
234
+ end
223
235
  else
224
236
  value = value.to_i if field.offset
225
237
  yield(:parameter, value)
@@ -227,6 +239,20 @@ module ScopedSearch
227
239
  end
228
240
  end
229
241
 
242
+ def has_many_through_join(field)
243
+ endpoint_table_name = field.klass.table_name
244
+ middle_table = field.definition.klass.reflections[field.relation].options[:through]
245
+ middle_table_name = field.definition.klass.reflections[middle_table].klass.table_name
246
+
247
+ <<-SQL
248
+ #{field.definition.klass.table_name}
249
+ INNER JOIN #{middle_table_name}
250
+ ON #{field.definition.klass.table_name}.id = #{middle_table_name}.#{field.reflection_keys(field.definition.klass.reflections[middle_table])[1]}
251
+ INNER JOIN #{endpoint_table_name}
252
+ ON #{middle_table_name}.#{field.reflection_keys(field.klass.reflections[middle_table])[1]} = #{endpoint_table_name}.id
253
+ SQL
254
+ end
255
+
230
256
  # This module gets included into the Field class to add SQL generation.
231
257
  module Field
232
258
 
@@ -1,3 +1,4 @@
1
+
1
2
  module ScopedSearch
2
3
  module RailsHelper
3
4
  # Creates a link that alternates between ascending and descending.
@@ -188,8 +189,8 @@ module ScopedSearch
188
189
  # auto_complete_method to respond the AJAX calls,
189
190
  def auto_complete_field_tag(method, val,tag_options = {}, completion_options = {})
190
191
  auto_completer_options = { :url => { :action => "auto_complete_#{method}" } }.update(completion_options)
191
-
192
- text_field_tag(method, val,tag_options.merge(:class => "auto_complete_input")) +
192
+ options = tag_options.merge(:class => "auto_complete_input " << tag_options[:class].to_s)
193
+ text_field_tag(method, val,options) +
193
194
  auto_complete_clear_value_button(method) +
194
195
  content_tag("div", "", :id => "#{method}_auto_complete", :class => "auto_complete") +
195
196
  auto_complete_field(method, auto_completer_options)
@@ -201,7 +202,7 @@ module ScopedSearch
201
202
  # auto_complete_method to respond the JQuery calls,
202
203
  def auto_complete_field_tag_jquery(method, val,tag_options = {}, completion_options = {})
203
204
  url = url_for(:action => "auto_complete_#{method}", :filter => completion_options[:filter])
204
- options = tag_options.merge(:class => "auto_complete_input")
205
+ options = tag_options.merge(:class => "auto_complete_input " << tag_options[:class].to_s)
205
206
  text_field_tag(method, val, options) + auto_complete_clear_value_button(method) +
206
207
  auto_complete_field_jquery(method, url, completion_options)
207
208
  end
@@ -0,0 +1,8 @@
1
+ if defined?(ActionController)
2
+ require "scoped_search/rails_helper"
3
+ ActionController::Base.helper(ScopedSearch::RailsHelper)
4
+ end
5
+
6
+ if defined?(::Rails::Engine)
7
+ require 'scoped_search/engine'
8
+ end
@@ -1,3 +1,3 @@
1
1
  module ScopedSearch
2
- VERSION = "2.5.1"
2
+ VERSION = "2.6.0"
3
3
  end
@@ -72,6 +72,7 @@ ScopedSearch::RSpec::Database.test_databases.each do |db|
72
72
  ActiveRecord::Migration.create_table(:goos) { |t| t.string :foo }
73
73
  class Goo < ActiveRecord::Base
74
74
  has_many :jars
75
+ scoped_search :on => :foo
75
76
  scoped_search :in => :jars, :on => :related
76
77
  end
77
78
 
@@ -104,6 +105,22 @@ ScopedSearch::RSpec::Database.test_databases.each do |db|
104
105
  it "should find all records for which none related bar records exist" do
105
106
  ::Goo.search_for('null? related').should have(1).items
106
107
  end
108
+
109
+ it "should find all records which has relation with both related values" do
110
+ ::Goo.search_for('related=bar AND related="another bar"').should have(1).items
111
+ end
112
+
113
+ it "should find all records searching with both parent and child fields" do
114
+ ::Goo.search_for('foo bar').should have(2).items
115
+ end
116
+
117
+ it "should find the only record with two Jars" do
118
+ ::Goo.search_for('foo bar "another bar"').should have(1).item
119
+ end
120
+
121
+ it "shouldn't find any records as there isn't an intersect" do
122
+ ::Goo.search_for('too another').should have(0).items
123
+ end
107
124
 
108
125
  end
109
126
 
@@ -252,6 +269,10 @@ ScopedSearch::RSpec::Database.test_databases.each do |db|
252
269
  it "should find the two records that are related to a baz record" do
253
270
  Koo.search_for('baz').should have(2).items
254
271
  end
272
+
273
+ it "should find the two records that are related to a baz record" do
274
+ Koo.search_for('related=baz AND related="baz too!"').should have(1).items
275
+ end
255
276
  end
256
277
  end
257
278
  end
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scoped_search
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.1
5
4
  prerelease:
5
+ version: 2.6.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Amos Benari
@@ -11,56 +11,56 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-04-02 00:00:00.000000000 Z
14
+ date: 2013-06-17 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
- name: activerecord
18
- requirement: !ruby/object:Gem::Requirement
19
- none: false
17
+ version_requirements: !ruby/object:Gem::Requirement
20
18
  requirements:
21
19
  - - ! '>='
22
20
  - !ruby/object:Gem::Version
23
21
  version: 2.1.0
22
+ none: false
23
+ name: activerecord
24
24
  type: :runtime
25
25
  prerelease: false
26
- version_requirements: !ruby/object:Gem::Requirement
27
- none: false
26
+ requirement: !ruby/object:Gem::Requirement
28
27
  requirements:
29
28
  - - ! '>='
30
29
  - !ruby/object:Gem::Version
31
30
  version: 2.1.0
32
- - !ruby/object:Gem::Dependency
33
- name: rspec
34
- requirement: !ruby/object:Gem::Requirement
35
31
  none: false
32
+ - !ruby/object:Gem::Dependency
33
+ version_requirements: !ruby/object:Gem::Requirement
36
34
  requirements:
37
35
  - - ~>
38
36
  - !ruby/object:Gem::Version
39
37
  version: '2.0'
38
+ none: false
39
+ name: rspec
40
40
  type: :development
41
41
  prerelease: false
42
- version_requirements: !ruby/object:Gem::Requirement
43
- none: false
42
+ requirement: !ruby/object:Gem::Requirement
44
43
  requirements:
45
44
  - - ~>
46
45
  - !ruby/object:Gem::Version
47
46
  version: '2.0'
48
- - !ruby/object:Gem::Dependency
49
- name: rake
50
- requirement: !ruby/object:Gem::Requirement
51
47
  none: false
48
+ - !ruby/object:Gem::Dependency
49
+ version_requirements: !ruby/object:Gem::Requirement
52
50
  requirements:
53
51
  - - ! '>='
54
52
  - !ruby/object:Gem::Version
55
53
  version: '0'
54
+ none: false
55
+ name: rake
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: !ruby/object:Gem::Requirement
59
- none: false
58
+ requirement: !ruby/object:Gem::Requirement
60
59
  requirements:
61
60
  - - ! '>='
62
61
  - !ruby/object:Gem::Version
63
62
  version: '0'
63
+ none: false
64
64
  description: ! " Scoped search makes it easy to search your ActiveRecord-based
65
65
  models.\n \n It will create a named scope :search_for that can be called with
66
66
  a query string. It will build an SQL query using\n the provided query string
@@ -82,7 +82,6 @@ extra_rdoc_files:
82
82
  - README.rdoc
83
83
  files:
84
84
  - .gitignore
85
- - .infinity_test
86
85
  - .travis.yml
87
86
  - Gemfile
88
87
  - Gemfile.activerecord2
@@ -97,6 +96,7 @@ files:
97
96
  - init.rb
98
97
  - lib/scoped_search.rb
99
98
  - lib/scoped_search/auto_complete_builder.rb
99
+ - lib/scoped_search/compass.rb
100
100
  - lib/scoped_search/definition.rb
101
101
  - lib/scoped_search/engine.rb
102
102
  - lib/scoped_search/query_builder.rb
@@ -105,6 +105,7 @@ files:
105
105
  - lib/scoped_search/query_language/parser.rb
106
106
  - lib/scoped_search/query_language/tokenizer.rb
107
107
  - lib/scoped_search/rails_helper.rb
108
+ - lib/scoped_search/railtie.rb
108
109
  - lib/scoped_search/version.rb
109
110
  - scoped_search.gemspec
110
111
  - spec/database.jruby.yml
@@ -140,26 +141,20 @@ rdoc_options:
140
141
  require_paths:
141
142
  - lib
142
143
  required_ruby_version: !ruby/object:Gem::Requirement
143
- none: false
144
144
  requirements:
145
145
  - - ! '>='
146
146
  - !ruby/object:Gem::Version
147
147
  version: '0'
148
- segments:
149
- - 0
150
- hash: -3142613325770757127
151
- required_rubygems_version: !ruby/object:Gem::Requirement
152
148
  none: false
149
+ required_rubygems_version: !ruby/object:Gem::Requirement
153
150
  requirements:
154
151
  - - ! '>='
155
152
  - !ruby/object:Gem::Version
156
153
  version: '0'
157
- segments:
158
- - 0
159
- hash: -3142613325770757127
154
+ none: false
160
155
  requirements: []
161
156
  rubyforge_project:
162
- rubygems_version: 1.8.25
157
+ rubygems_version: 1.8.23
163
158
  signing_key:
164
159
  specification_version: 3
165
160
  summary: Easily search you ActiveRecord models with a simple query language using
data/.infinity_test DELETED
@@ -1,8 +0,0 @@
1
- infinity_test do
2
-
3
- use :rubies => %w(1.8.7 1.9.2 ree jruby rbx), :test_framework => :rspec
4
-
5
- before(:each_ruby) do |environment|
6
- environment.system('bundle install')
7
- end
8
- end