searchable-by 0.6.0 → 0.6.1

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
  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