search_cop 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,6 +1,21 @@
1
1
 
2
2
  # Changelog
3
3
 
4
+ Version 1.0.4:
5
+
6
+ * Fix for Rails 4.2 regression regarding reflection access
7
+
8
+ Version 1.0.3:
9
+
10
+ * Supporting Rails 4.2
11
+ * Dropped Arel dependencies
12
+
13
+ Version 1.0.2:
14
+
15
+ * Avoid eager loading when no associations referenced
16
+ * Prefer objects over class names
17
+ * Readme extended
18
+
4
19
  Version 1.0.1:
5
20
 
6
21
  * Inheritance fix
data/README.md CHANGED
@@ -393,7 +393,7 @@ class Book < ActiveRecord::Base
393
393
  belongs_to :user
394
394
 
395
395
  search_scope :search do
396
- attributes :user => ["users.username", "users_books.username"]
396
+ attributes :user => ["user.username", "users_books.username"]
397
397
  end
398
398
 
399
399
  # ...
@@ -412,14 +412,17 @@ class Book < ActiveRecord::Base
412
412
  search_scope :search do
413
413
  # ...
414
414
 
415
- aliases :users_books => User
415
+ aliases :users_books => :users
416
416
  end
417
417
 
418
418
  # ...
419
419
  end
420
420
  ```
421
421
 
422
- to tell SearchCop about the custom SQL alias and mapping.
422
+ to tell SearchCop about the custom SQL alias and mapping. In addition, you can
423
+ always do the joins yourself via a `scope {}` block plus `aliases` and use your
424
+ own custom sql aliases to become independent of names auto-assigned by
425
+ ActiveRecord.
423
426
 
424
427
  ## Supported operators
425
428
 
@@ -19,7 +19,16 @@ module SearchCop
19
19
  private
20
20
 
21
21
  def all_associations
22
- scope.reflection.attributes.values.flatten.uniq.collect { |column| column.split(".").first }.collect { |column| scope.reflection.aliases[column] || column.to_sym }
22
+ scope.reflection.attributes.values.flatten.collect { |column| association_for column.split(".").first }.uniq
23
+ end
24
+
25
+ def association_for(column)
26
+ alias_value = scope.reflection.aliases[column]
27
+
28
+ association = alias_value.respond_to?(:table_name) ? alias_value.table_name : alias_value
29
+ association ||= column
30
+
31
+ association.to_sym
23
32
  end
24
33
  end
25
34
  end
@@ -38,7 +38,7 @@ module SearchCop
38
38
 
39
39
  def aliases(hash)
40
40
  hash.each do |key, value|
41
- reflection.aliases[key.to_s] = value.respond_to?(:table_name) ? value.table_name : value.to_s
41
+ reflection.aliases[key.to_s] = value.is_a?(Class) ? value : value.to_s
42
42
  end
43
43
  end
44
44
 
@@ -1,3 +1,3 @@
1
1
  module SearchCop
2
- VERSION = "1.0.3"
2
+ VERSION = "1.0.4"
3
3
  end
@@ -58,16 +58,20 @@ module SearchCopGrammar
58
58
  def klass_for_association(name)
59
59
  reflections = query_info.model.reflections
60
60
 
61
+ return reflections[name].klass if reflections[name]
61
62
  return reflections[name.to_sym].klass if reflections[name.to_sym]
62
63
 
63
64
  nil
64
65
  end
65
66
 
66
67
  def klass_for(name)
67
- mapped_name = query_info.scope.reflection.aliases[name]
68
- mapped_name ||= name
68
+ alias_value = query_info.scope.reflection.aliases[name]
69
69
 
70
- klass_for_association(mapped_name) || mapped_name.classify.constantize
70
+ return alias_value if alias_value.is_a?(Class)
71
+
72
+ value = alias_value || name
73
+
74
+ klass_for_association(value) || value.classify.constantize
71
75
  end
72
76
 
73
77
  def alias_for(name)
data/test/scope_test.rb CHANGED
@@ -2,7 +2,7 @@
2
2
  require File.expand_path("../test_helper", __FILE__)
3
3
 
4
4
  class ScopeTest < SearchCop::TestCase
5
- def test_user_search
5
+ def test_scope_name
6
6
  expected = create(:product, :title => "Expected")
7
7
  rejected = create(:product, :notice => "Expected")
8
8
 
@@ -22,14 +22,34 @@ class ScopeTest < SearchCop::TestCase
22
22
  refute_includes results, rejected
23
23
  end
24
24
 
25
- def test_aliases
26
- expected = create(:product, :comments => [create(:comment, :user => create(:user, :username => "Expected"))])
27
- rejected = create(:product, :comments => [create(:comment, :user => create(:user, :username => "Rejected"))])
25
+ def test_custom_scope
26
+ expected = create(:product, :user => create(:user, :username => "Expected"))
27
+ rejected = create(:product, :user => create(:user, :username => "Rejected"))
28
+
29
+ results = Product.user_search("user: Expected")
30
+
31
+ assert_includes results, expected
32
+ refute_includes results, rejected
33
+ end
34
+
35
+ def test_aliases_with_association
36
+ expected = create(:product, :user => create(:user, :username => "Expected"))
37
+ rejected = create(:product, :user => create(:user, :username => "Rejected"))
28
38
 
29
39
  results = Product.search("user: Expected")
30
40
 
31
41
  assert_includes results, expected
32
42
  refute_includes results, rejected
33
43
  end
44
+
45
+ def test_aliases_with_model
46
+ expected = create(:product, :user => create(:user, :username => "Expected"))
47
+ rejected = create(:product, :user => create(:user, :username => "Rejected"))
48
+
49
+ results = Product.user_search("user: Expected")
50
+
51
+ assert_includes results, expected
52
+ refute_includes results, rejected
53
+ end
34
54
  end
35
55
 
data/test/test_helper.rb CHANGED
@@ -55,11 +55,13 @@ class Product < ActiveRecord::Base
55
55
  end
56
56
 
57
57
  search_scope :user_search do
58
+ scope { joins "LEFT OUTER JOIN users users_products ON users_products.id = products.user_id" }
59
+
58
60
  attributes :title, :description
59
61
  attributes :user => "users_products.username"
60
62
 
61
63
  options :title, :default => true
62
- aliases :users_products => :user
64
+ aliases :users_products => User
63
65
  end
64
66
 
65
67
  has_many :comments
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: search_cop
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-12-18 00:00:00.000000000 Z
12
+ date: 2014-12-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: treetop