searchable-by 0.6.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 615602791390c9de0ab159cbbd0c81c52c0441f61ad559082dad189787c7606f
4
- data.tar.gz: ad765f8a22cd76196f7a04b7a7e16f38b3bbccacda0f1c7bda659e3ab2783f4f
3
+ metadata.gz: 472133b9b419e573a1c87b721a5c368b3915ef28cb94e897424f55f7191f723f
4
+ data.tar.gz: d3c31e307f54b0545171e7e12b86d75d32f5874676af467399fdb2e533927c16
5
5
  SHA512:
6
- metadata.gz: ae524aa23d507f4339592c4c6a2955d3d0664e7f9829be7071ed1d28a065e1ad77ff9a810a800769cf417db4d315344a487b058530e168325403cb26a1832e12
7
- data.tar.gz: 71a1349d3738997571306d5326cf81bef66b101bbd03b9451d3b3d9b5851c35f1d732486d96b29d73e1efce792a0c5c840c42442a2f83bd5be171a47be28a17c
6
+ metadata.gz: 1bd8dc39da51b94327d7912661cda9e2d38cdbf7d6e62eea1930e5d39a85c3bfd81c468477e8cfac48451b7dde055b9075a03686787c481c1cf2fcc5fa9d9c5f
7
+ data.tar.gz: e9881b0f0022a0f884d6780afb3f24daf53872a473e22571f1eed730c8c76083148dbec4e99825875a68bb425568776c04fb7ac5d7ad26b1aa9202be3160d357
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- searchable-by (0.6.0)
4
+ searchable-by (0.6.1)
5
5
  activerecord
6
6
 
7
7
  GEM
@@ -51,16 +51,22 @@ module SearchableBy
51
51
  when :exact
52
52
  term.downcase!
53
53
  scope.and(node.lower.eq(term))
54
+ when :full
55
+ escape_term!(term)
56
+ scope.and(node.matches(term))
54
57
  when :prefix
55
- term.gsub!('%', '\%')
56
- term.gsub!('_', '\_')
58
+ escape_term!(term)
57
59
  scope.and(node.matches("#{term}%"))
58
- else
59
- term.gsub!('%', '\%')
60
- term.gsub!('_', '\_')
61
- term.gsub!(wildcard, '%') if wildcard
60
+ else # :all (wraps term in wildcards)
61
+ escape_term!(term)
62
62
  scope.and(node.matches("%#{term}%"))
63
63
  end
64
64
  end
65
+
66
+ def escape_term!(term)
67
+ term.gsub!('%', '\%')
68
+ term.gsub!('_', '\_')
69
+ term.gsub!(wildcard, '%') if wildcard
70
+ end
65
71
  end
66
72
  end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'searchable-by'
3
- s.version = '0.6.0'
3
+ s.version = '0.6.1'
4
4
  s.authors = ['Dimitrij Denissenko']
5
5
  s.email = ['dimitrij@blacksquaremedia.com']
6
6
  s.summary = 'Generate search scopes'
@@ -8,7 +8,7 @@ describe SearchableBy do
8
8
 
9
9
  it 'configures correctly' do
10
10
  expect(AbstractModel._searchable_by_config.columns.size).to eq(1)
11
- expect(Post._searchable_by_config.columns.size).to eq(5)
11
+ expect(Post._searchable_by_config.columns.size).to eq(6)
12
12
  end
13
13
 
14
14
  it 'generates SQL' do
@@ -24,10 +24,12 @@ describe SearchableBy do
24
24
  expect(sql).to include(%("posts"."body" LIKE '%foo\\%bar%'))
25
25
 
26
26
  sql = User.search_by('uni*dom').to_sql
27
- expect(sql).to include(%("users"."country" LIKE '%uni%dom%'))
27
+ expect(sql).to include(%("users"."country" LIKE 'uni%dom'))
28
+ expect(sql).to include(%("users"."bio" LIKE '%uni*dom%'))
28
29
 
29
30
  sql = User.search_by('"uni * dom"').to_sql
30
- expect(sql).to include(%("users"."country" LIKE '%uni % dom%'))
31
+ expect(sql).to include(%("users"."country" LIKE 'uni % dom'))
32
+ expect(sql).to include(%("users"."bio" LIKE '%uni * dom%'))
31
33
  end
32
34
 
33
35
  it 'searches' do
@@ -63,6 +65,9 @@ describe SearchableBy do
63
65
  expect(Post.search_by('"ab"').pluck(:title)).to be_empty
64
66
  expect(Post.search_by('"ab1"').pluck(:title)).to match_array(%w[ab1])
65
67
 
68
+ # country uses match: :full in combination with wildcard: '*'
69
+ expect(Post.search_by('*kingdom').pluck(:title)).to match_array(%w[ax1 ax2 ab1])
70
+
66
71
  # body uses match: :all (default)
67
72
  expect(Post.search_by('recip').pluck(:title)).to match_array(%w[ax1 ax2 bx1 bx2 ab1])
68
73
  end
@@ -89,8 +94,8 @@ describe SearchableBy do
89
94
  end
90
95
 
91
96
  it 'supports wildcard searching' do
92
- expect(User.search_by('uni*dom')).to match_array(USERS.values_at(:a))
93
- expect(User.search_by('uni*o')).to match_array(USERS.values_at(:a, :b))
94
- expect(User.search_by('uni*of*dom')).to be_empty
97
+ expect(User.search_by('*uni*dom')).to match_array(USERS.values_at(:a))
98
+ expect(User.search_by('*uni*o*')).to match_array(USERS.values_at(:a, :b))
99
+ expect(User.search_by('*uni*of*dom')).to be_empty
95
100
  end
96
101
  end
data/spec/spec_helper.rb CHANGED
@@ -32,7 +32,7 @@ class User < AbstractModel
32
32
 
33
33
  searchable_by min_length: 3 do
34
34
  column :bio
35
- column :country, wildcard: '*'
35
+ column :country, wildcard: '*', match: :full
36
36
  end
37
37
  end
38
38
 
@@ -44,6 +44,7 @@ class Post < AbstractModel
44
44
  column :title, match: :prefix, match_phrase: :exact
45
45
  column :body
46
46
  column proc { User.arel_table[:name] }, match: :exact
47
+ column proc { User.arel_table[:country] }, wildcard: '*', match: :full
47
48
  column { User.arel_table.alias('reviewers_posts')[:name] }
48
49
 
49
50
  scope do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: searchable-by
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dimitrij Denissenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-12 00:00:00.000000000 Z
11
+ date: 2021-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord