ransack 4.2.1 → 4.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/cronjob.yml +42 -0
- data/.github/workflows/test.yml +63 -11
- data/CHANGELOG.md +7 -0
- data/Gemfile +6 -1
- data/README.md +1 -1
- data/docs/docs/getting-started/simple-mode.md +2 -1
- data/docs/docs/going-further/other-notes.md +16 -19
- data/lib/polyamorous/polyamorous.rb +1 -1
- data/lib/ransack/constants.rb +1 -1
- data/lib/ransack/invalid_search_error.rb +3 -0
- data/lib/ransack/locale/ko.yml +70 -0
- data/lib/ransack/nodes/condition.rb +3 -1
- data/lib/ransack/search.rb +3 -2
- data/lib/ransack/version.rb +1 -1
- data/spec/ransack/adapters/active_record/base_spec.rb +5 -1
- data/spec/ransack/nodes/condition_spec.rb +1 -0
- data/spec/ransack/predicate_spec.rb +16 -8
- data/spec/ransack/search_spec.rb +14 -0
- data/spec/support/schema.rb +12 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ea2c1ef5d55f6a67d7d182146f2274d9b4343285920ae69bec3a5902fa4bf14
|
4
|
+
data.tar.gz: db7e3f5f6ae62d9bebc8ac65bc9a50bc451585abd69e88aca20012c6777fbae6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8c89ea0cb39b675a116b8c9698acbe106a24415e107435b4035c837e921dc359c77f7806415f9008e76dcaf658b888a02c8df137fd6295b71c1d445feb1846fc
|
7
|
+
data.tar.gz: 197c2f53ab0e98d7a24203fafb81187a44235c2536734ee0976bb78d2e9a552f3cf309d5a06ef5704bd8f4ece49931ad7517defa603067d1a113b230f5554681
|
@@ -56,6 +56,48 @@ jobs:
|
|
56
56
|
- name: Run tests
|
57
57
|
run: bundle exec rspec
|
58
58
|
|
59
|
+
postgis:
|
60
|
+
runs-on: ubuntu-22.04
|
61
|
+
strategy:
|
62
|
+
fail-fast: false
|
63
|
+
matrix:
|
64
|
+
ruby:
|
65
|
+
- 3.2.2
|
66
|
+
env:
|
67
|
+
DB: postgis
|
68
|
+
RAILS: main
|
69
|
+
DATABASE_USERNAME: postgres
|
70
|
+
DATABASE_PASSWORD: postgres
|
71
|
+
DATABASE_HOST: 127.0.0.1
|
72
|
+
services:
|
73
|
+
postgres:
|
74
|
+
image: postgres
|
75
|
+
ports:
|
76
|
+
- 5432:5432
|
77
|
+
env:
|
78
|
+
POSTGRES_PASSWORD: postgres
|
79
|
+
POSTGRES_HOST_AUTH_METHOD: trust
|
80
|
+
# Set health checks to wait until postgres has started
|
81
|
+
options: >-
|
82
|
+
--health-cmd pg_isready
|
83
|
+
--health-interval 10s
|
84
|
+
--health-timeout 5s
|
85
|
+
--health-retries 5
|
86
|
+
|
87
|
+
steps:
|
88
|
+
- uses: actions/checkout@v2
|
89
|
+
- name: Set up Ruby
|
90
|
+
uses: ruby/setup-ruby@v1
|
91
|
+
with:
|
92
|
+
ruby-version: ${{ matrix.ruby }}
|
93
|
+
- name: Setup databases
|
94
|
+
run: |
|
95
|
+
psql -h localhost -p 5432 -W postgres -c 'create database ransack;' -U postgres;
|
96
|
+
- name: Install dependencies
|
97
|
+
run: bundle install
|
98
|
+
- name: Run tests
|
99
|
+
run: bundle exec rspec
|
100
|
+
|
59
101
|
postgres:
|
60
102
|
runs-on: ubuntu-22.04
|
61
103
|
strategy:
|
data/.github/workflows/test.yml
CHANGED
@@ -8,18 +8,20 @@ on:
|
|
8
8
|
|
9
9
|
jobs:
|
10
10
|
sqlite3:
|
11
|
-
runs-on: ubuntu-
|
11
|
+
runs-on: ubuntu-latest
|
12
12
|
strategy:
|
13
13
|
fail-fast: false
|
14
14
|
matrix:
|
15
15
|
rails:
|
16
|
-
-
|
16
|
+
- 8-0-stable
|
17
|
+
- v7.2.2
|
17
18
|
- v7.1.0
|
18
|
-
- v7.0.3
|
19
|
-
- v6.1.6
|
20
19
|
ruby:
|
21
20
|
- 3.2.2
|
22
21
|
- 3.1.4
|
22
|
+
exclude:
|
23
|
+
- rails: 8-0-stable
|
24
|
+
ruby: 3.1.4
|
23
25
|
env:
|
24
26
|
DB: sqlite3
|
25
27
|
RAILS: ${{ matrix.rails }}
|
@@ -34,18 +36,21 @@ jobs:
|
|
34
36
|
run: bundle exec rspec
|
35
37
|
|
36
38
|
mysql:
|
37
|
-
runs-on: ubuntu-
|
39
|
+
runs-on: ubuntu-latest
|
38
40
|
strategy:
|
39
41
|
fail-fast: false
|
40
42
|
matrix:
|
41
43
|
rails:
|
44
|
+
- 8-0-stable
|
42
45
|
- 7-2-stable
|
43
46
|
- v7.1.0
|
44
|
-
- v7.0.3
|
45
|
-
- v6.1.6
|
46
47
|
ruby:
|
47
48
|
- 3.2.2
|
48
49
|
- 3.1.4
|
50
|
+
exclude:
|
51
|
+
- rails: 8-0-stable
|
52
|
+
ruby: 3.1.4
|
53
|
+
|
49
54
|
env:
|
50
55
|
DB: mysql
|
51
56
|
RAILS: ${{ matrix.rails }}
|
@@ -68,7 +73,7 @@ jobs:
|
|
68
73
|
- name: Run tests
|
69
74
|
run: bundle exec rspec
|
70
75
|
|
71
|
-
|
76
|
+
postgis:
|
72
77
|
runs-on: ubuntu-22.04
|
73
78
|
strategy:
|
74
79
|
fail-fast: false
|
@@ -76,11 +81,58 @@ jobs:
|
|
76
81
|
rails:
|
77
82
|
- 7-2-stable
|
78
83
|
- v7.1.0
|
79
|
-
- v7.0.3
|
80
|
-
- v6.1.6
|
81
84
|
ruby:
|
82
85
|
- 3.2.2
|
83
86
|
- 3.1.4
|
87
|
+
env:
|
88
|
+
DB: postgis
|
89
|
+
RAILS: ${{ matrix.rails }}
|
90
|
+
DATABASE_USERNAME: postgres
|
91
|
+
DATABASE_PASSWORD: postgres
|
92
|
+
DATABASE_HOST: 127.0.0.1
|
93
|
+
services:
|
94
|
+
postgres:
|
95
|
+
image: postgres
|
96
|
+
ports:
|
97
|
+
- 5432:5432
|
98
|
+
env:
|
99
|
+
POSTGRES_PASSWORD: postgres
|
100
|
+
POSTGRES_HOST_AUTH_METHOD: trust
|
101
|
+
# Set health checks to wait until postgres has started
|
102
|
+
options: >-
|
103
|
+
--health-cmd pg_isready
|
104
|
+
--health-interval 10s
|
105
|
+
--health-timeout 5s
|
106
|
+
--health-retries 5
|
107
|
+
|
108
|
+
steps:
|
109
|
+
- uses: actions/checkout@v2
|
110
|
+
- name: Set up Ruby
|
111
|
+
uses: ruby/setup-ruby@v1
|
112
|
+
with:
|
113
|
+
ruby-version: ${{ matrix.ruby }}
|
114
|
+
bundler-cache: true
|
115
|
+
- name: Setup databases
|
116
|
+
run: |
|
117
|
+
psql -h localhost -p 5432 -W postgres -c 'create database ransack;' -U postgres;
|
118
|
+
- name: Run tests
|
119
|
+
run: bundle exec rspec
|
120
|
+
|
121
|
+
postgres:
|
122
|
+
runs-on: ubuntu-latest
|
123
|
+
strategy:
|
124
|
+
fail-fast: false
|
125
|
+
matrix:
|
126
|
+
rails:
|
127
|
+
- 8-0-stable
|
128
|
+
- 7-2-stable
|
129
|
+
- v7.1.0
|
130
|
+
ruby:
|
131
|
+
- 3.2.2
|
132
|
+
- 3.1.4
|
133
|
+
exclude:
|
134
|
+
- rails: 8-0-stable
|
135
|
+
ruby: 3.1.4
|
84
136
|
env:
|
85
137
|
DB: postgres
|
86
138
|
RAILS: ${{ matrix.rails }}
|
@@ -116,7 +168,7 @@ jobs:
|
|
116
168
|
run: bundle exec rspec
|
117
169
|
|
118
170
|
bug-report-templates:
|
119
|
-
runs-on: ubuntu-
|
171
|
+
runs-on: ubuntu-latest
|
120
172
|
steps:
|
121
173
|
- uses: actions/checkout@v2
|
122
174
|
- name: Set up Ruby
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,13 @@
|
|
2
2
|
|
3
3
|
## Unreleased
|
4
4
|
|
5
|
+
## 4.3.0 - 2025-2-7
|
6
|
+
|
7
|
+
* Fix wildcard escaping with PostGIS adapter.
|
8
|
+
* Rails 8 compatibility
|
9
|
+
* Drop Rails 6 and 7.0 compatibility
|
10
|
+
* Raise Ransack::InvalidSearchError instead of ArgumentError on unknown conditions
|
11
|
+
|
5
12
|
## 4.2.1 - 2024-8-11
|
6
13
|
|
7
14
|
* Fix Rails 7.1.x compatibility
|
data/Gemfile
CHANGED
@@ -15,8 +15,13 @@ rails_version = case rails
|
|
15
15
|
end
|
16
16
|
|
17
17
|
gem 'faker'
|
18
|
-
|
18
|
+
if ::Gem::Version.new(rails_version) > ::Gem::Version.new('7.3')
|
19
|
+
gem 'sqlite3', '>= 2.1'
|
20
|
+
else
|
21
|
+
gem 'sqlite3', '~> 1.4'
|
22
|
+
end
|
19
23
|
gem 'pg'
|
24
|
+
gem 'activerecord-postgis-adapter'
|
20
25
|
gem 'pry'
|
21
26
|
gem 'byebug'
|
22
27
|
|
data/README.md
CHANGED
@@ -13,7 +13,7 @@ There are advanced searching solutions around, like ElasticSearch or Algolia. **
|
|
13
13
|
|
14
14
|
Ready to move beyond the basics? Use **advanced features** like i18n and extensive configuration options.
|
15
15
|
|
16
|
-
Ransack is supported for Rails
|
16
|
+
Ransack is supported for Rails 8.0, 7.2, 7.1 on Ruby 3.1 and later.
|
17
17
|
|
18
18
|
## Installation
|
19
19
|
|
@@ -28,7 +28,8 @@ end
|
|
28
28
|
```
|
29
29
|
|
30
30
|
:::caution
|
31
|
-
|
31
|
+
As of v4.0, searching and sorting are not authorized on _any_ column of your model by default. See [Authorization (allowlisting/denylisting)](/going-further/other-notes.md#authorization-allowlistingdenylisting) on how to define searchable attributes.
|
32
|
+
Prior to v4.0, searching and sorting were authorized on any column of your model by default.
|
32
33
|
:::
|
33
34
|
|
34
35
|
### Default search options
|
@@ -126,8 +126,8 @@ to `jsonb`, as [recommended by the PostgreSQL documentation](https://www.postgre
|
|
126
126
|
|
127
127
|
### Authorization (allowlisting/denylisting)
|
128
128
|
|
129
|
-
By default, searching and sorting are authorized on any column of your model
|
130
|
-
and no class methods/scopes are
|
129
|
+
By default, searching and sorting are not authorized on any column of your model
|
130
|
+
and no class methods/scopes are allowlisted.
|
131
131
|
|
132
132
|
Ransack adds four methods to `ActiveRecord::Base` that you can redefine as
|
133
133
|
class methods in your models to apply selective authorization:
|
@@ -137,28 +137,25 @@ class methods in your models to apply selective authorization:
|
|
137
137
|
- `ransackable_scopes`
|
138
138
|
- `ransortable_attributes`
|
139
139
|
|
140
|
-
Here is how these four methods
|
140
|
+
Here is how these four methods could be implemented in your application:
|
141
141
|
|
142
142
|
```ruby
|
143
|
-
# `ransackable_attributes`
|
143
|
+
# `ransackable_attributes` returns searchable column names
|
144
144
|
# and any defined ransackers as an array of strings.
|
145
|
-
# For overriding with a whitelist array of strings.
|
146
145
|
#
|
147
146
|
def ransackable_attributes(auth_object = nil)
|
148
|
-
|
147
|
+
%w(title body) + _ransackers.keys
|
149
148
|
end
|
150
149
|
|
151
|
-
# `ransackable_associations`
|
152
|
-
# of
|
153
|
-
# For overriding with a whitelist array of strings.
|
150
|
+
# `ransackable_associations` returns the names
|
151
|
+
# of searchable associations as an array of strings.
|
154
152
|
#
|
155
153
|
def ransackable_associations(auth_object = nil)
|
156
|
-
|
154
|
+
%w[author]
|
157
155
|
end
|
158
156
|
|
159
157
|
# `ransortable_attributes` by default returns the names
|
160
158
|
# of all attributes available for sorting as an array of strings.
|
161
|
-
# For overriding with a whitelist array of strings.
|
162
159
|
#
|
163
160
|
def ransortable_attributes(auth_object = nil)
|
164
161
|
ransackable_attributes(auth_object)
|
@@ -166,7 +163,7 @@ Here is how these four methods are implemented in Ransack:
|
|
166
163
|
|
167
164
|
# `ransackable_scopes` by default returns an empty array
|
168
165
|
# i.e. no class methods/scopes are authorized.
|
169
|
-
# For overriding with
|
166
|
+
# For overriding with an allowlist, return an array of *symbols*.
|
170
167
|
#
|
171
168
|
def ransackable_scopes(auth_object = nil)
|
172
169
|
[]
|
@@ -190,11 +187,11 @@ In an `Article` model, add the following `ransackable_attributes` class method
|
|
190
187
|
class Article < ActiveRecord::Base
|
191
188
|
def self.ransackable_attributes(auth_object = nil)
|
192
189
|
if auth_object == :admin
|
193
|
-
#
|
194
|
-
|
190
|
+
# allow all attributes for admin
|
191
|
+
column_names + _ransackers.keys
|
195
192
|
else
|
196
|
-
#
|
197
|
-
|
193
|
+
# allow only the title and body attributes for other users
|
194
|
+
%w(title body)
|
198
195
|
end
|
199
196
|
end
|
200
197
|
|
@@ -241,7 +238,7 @@ Trying it out in `rails console`:
|
|
241
238
|
=> SELECT "articles".* FROM "articles" WHERE "articles"."id" = 1
|
242
239
|
```
|
243
240
|
|
244
|
-
That's it! Now you know how to
|
241
|
+
That's it! Now you know how to allow/block various elements in Ransack.
|
245
242
|
|
246
243
|
### Handling unknown predicates or attributes
|
247
244
|
|
@@ -266,7 +263,7 @@ end
|
|
266
263
|
|
267
264
|
```ruby
|
268
265
|
Article.ransack(unknown_attr_eq: 'Ernie')
|
269
|
-
#
|
266
|
+
# Ransack::InvalidSearchError (Invalid search term unknown_attr_eq)
|
270
267
|
```
|
271
268
|
|
272
269
|
As an alternative to setting a global configuration option, the `.ransack!`
|
@@ -274,7 +271,7 @@ class method also raises an error if passed an unknown condition:
|
|
274
271
|
|
275
272
|
```ruby
|
276
273
|
Article.ransack!(unknown_attr_eq: 'Ernie')
|
277
|
-
#
|
274
|
+
# Ransack::InvalidSearchError: Invalid search term unknown_attr_eq
|
278
275
|
```
|
279
276
|
|
280
277
|
This is equivalent to the `ignore_unknown_conditions` configuration option,
|
@@ -15,7 +15,7 @@ if defined?(::ActiveRecord)
|
|
15
15
|
require 'polyamorous/activerecord/join_dependency'
|
16
16
|
require 'polyamorous/activerecord/reflection'
|
17
17
|
|
18
|
-
if ::ActiveRecord.version >= ::Gem::Version.new("7.2")
|
18
|
+
if ::ActiveRecord.version >= ::Gem::Version.new("7.2") && ::ActiveRecord.version < ::Gem::Version.new("7.2.2.1")
|
19
19
|
require "polyamorous/activerecord/join_association_7_2"
|
20
20
|
end
|
21
21
|
|
data/lib/ransack/constants.rb
CHANGED
@@ -165,7 +165,7 @@ module Ransack
|
|
165
165
|
when "Mysql2".freeze
|
166
166
|
# Necessary for MySQL
|
167
167
|
unescaped.to_s.gsub(/([\\%_])/, '\\\\\\1')
|
168
|
-
when "PostgreSQL".freeze
|
168
|
+
when "PostGIS".freeze, "PostgreSQL".freeze
|
169
169
|
# Necessary for PostgreSQL
|
170
170
|
unescaped.to_s.gsub(/([\\%_.])/, '\\\\\\1')
|
171
171
|
else
|
@@ -0,0 +1,70 @@
|
|
1
|
+
ko:
|
2
|
+
ransack:
|
3
|
+
search: "검색"
|
4
|
+
predicate: "조건"
|
5
|
+
and: "그리고"
|
6
|
+
or: "또는"
|
7
|
+
any: "어떤 것이든"
|
8
|
+
all: "모두"
|
9
|
+
combinator: "조합기"
|
10
|
+
attribute: "속성"
|
11
|
+
value: "값"
|
12
|
+
condition: "조건"
|
13
|
+
sort: "정렬"
|
14
|
+
asc: "오름차순"
|
15
|
+
desc: "내림차순"
|
16
|
+
predicates:
|
17
|
+
eq: "같음"
|
18
|
+
eq_any: "어떤 것이든 같음"
|
19
|
+
eq_all: "모두 같음"
|
20
|
+
not_eq: "같지 않음"
|
21
|
+
not_eq_any: "어떤 것이든 같지 않음"
|
22
|
+
not_eq_all: "모두 같지 않음"
|
23
|
+
matches: "일치함"
|
24
|
+
matches_any: "어떤 것이든 일치함"
|
25
|
+
matches_all: "모두 일치함"
|
26
|
+
does_not_match: "일치하지 않음"
|
27
|
+
does_not_match_any: "어떤 것이든 일치하지 않음"
|
28
|
+
does_not_match_all: "모두 일치하지 않음"
|
29
|
+
lt: "보다 작음"
|
30
|
+
lt_any: "어떤 것이든 보다 작음"
|
31
|
+
lt_all: "모두 보다 작음"
|
32
|
+
lteq: "보다 작거나 같음"
|
33
|
+
lteq_any: "어떤 것이든 보다 작거나 같음"
|
34
|
+
lteq_all: "모두 보다 작거나 같음"
|
35
|
+
gt: "보다 큼"
|
36
|
+
gt_any: "어떤 것이든 보다 큼"
|
37
|
+
gt_all: "모두 보다 큼"
|
38
|
+
gteq: "보다 크거나 같음"
|
39
|
+
gteq_any: "어떤 것이든 보다 크거나 같음"
|
40
|
+
gteq_all: "모두 보다 크거나 같음"
|
41
|
+
in: "포함됨"
|
42
|
+
in_any: "어떤 것이든 포함됨"
|
43
|
+
in_all: "모두 포함됨"
|
44
|
+
not_in: "포함되지 않음"
|
45
|
+
not_in_any: "어떤 것이든 포함되지 않음"
|
46
|
+
not_in_all: "모두 포함되지 않음"
|
47
|
+
cont: "포함함"
|
48
|
+
cont_any: "어떤 것이든 포함함"
|
49
|
+
cont_all: "모두 포함함"
|
50
|
+
not_cont: "포함하지 않음"
|
51
|
+
not_cont_any: "어떤 것이든 포함하지 않음"
|
52
|
+
not_cont_all: "모두 포함하지 않음"
|
53
|
+
start: "시작함"
|
54
|
+
start_any: "어떤 것이든 시작함"
|
55
|
+
start_all: "모두 시작함"
|
56
|
+
not_start: "시작하지 않음"
|
57
|
+
not_start_any: "어떤 것이든 시작하지 않음"
|
58
|
+
not_start_all: "모두 시작하지 않음"
|
59
|
+
end: "끝남"
|
60
|
+
end_any: "어떤 것이든 끝남"
|
61
|
+
end_all: "모두 끝남"
|
62
|
+
not_end: "끝나지 않음"
|
63
|
+
not_end_any: "어떤 것이든 끝나지 않음"
|
64
|
+
not_end_all: "모두 끝나지 않음"
|
65
|
+
'true': "is true"
|
66
|
+
'false': "is false"
|
67
|
+
present: "is present"
|
68
|
+
blank: "is blank"
|
69
|
+
'null': "is null"
|
70
|
+
not_null: "is not null"
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'ransack/invalid_search_error'
|
2
|
+
|
1
3
|
module Ransack
|
2
4
|
module Nodes
|
3
5
|
class Condition < Node
|
@@ -38,7 +40,7 @@ module Ransack
|
|
38
40
|
predicate = Predicate.named(name)
|
39
41
|
|
40
42
|
unless predicate || Ransack.options[:ignore_unknown_conditions]
|
41
|
-
raise
|
43
|
+
raise InvalidSearchError, "No valid predicate for #{key}"
|
42
44
|
end
|
43
45
|
|
44
46
|
if context.present?
|
data/lib/ransack/search.rb
CHANGED
@@ -7,6 +7,7 @@ require 'ransack/nodes/sort'
|
|
7
7
|
require 'ransack/nodes/grouping'
|
8
8
|
require 'ransack/context'
|
9
9
|
require 'ransack/naming'
|
10
|
+
require 'ransack/invalid_search_error'
|
10
11
|
|
11
12
|
module Ransack
|
12
13
|
class Search
|
@@ -53,7 +54,7 @@ module Ransack
|
|
53
54
|
elsif base.attribute_method?(key)
|
54
55
|
base.send("#{key}=", value)
|
55
56
|
elsif !Ransack.options[:ignore_unknown_conditions] || !@ignore_unknown_conditions
|
56
|
-
raise
|
57
|
+
raise InvalidSearchError, "Invalid search term #{key}"
|
57
58
|
end
|
58
59
|
end
|
59
60
|
self
|
@@ -78,7 +79,7 @@ module Ransack
|
|
78
79
|
when String
|
79
80
|
self.sorts = [args]
|
80
81
|
else
|
81
|
-
raise
|
82
|
+
raise InvalidSearchError,
|
82
83
|
"Invalid argument (#{args.class}) supplied to sorts="
|
83
84
|
end
|
84
85
|
end
|
data/lib/ransack/version.rb
CHANGED
@@ -131,10 +131,14 @@ module Ransack
|
|
131
131
|
expect { Person.ransack('') }.to_not raise_error
|
132
132
|
end
|
133
133
|
|
134
|
-
it 'raises exception if ransack! called with unknown condition' do
|
134
|
+
it 'raises ArgumentError exception if ransack! called with unknown condition' do
|
135
135
|
expect { Person.ransack!(unknown_attr_eq: 'Ernie') }.to raise_error(ArgumentError)
|
136
136
|
end
|
137
137
|
|
138
|
+
it 'raises InvalidSearchError exception if ransack! called with unknown condition' do
|
139
|
+
expect { Person.ransack!(unknown_attr_eq: 'Ernie') }.to raise_error(InvalidSearchError)
|
140
|
+
end
|
141
|
+
|
138
142
|
it 'does not modify the parameters' do
|
139
143
|
params = { name_eq: '' }
|
140
144
|
expect { Person.ransack(params) }.not_to change { params }
|
@@ -158,9 +158,10 @@ module Ransack
|
|
158
158
|
|
159
159
|
describe 'cont' do
|
160
160
|
it_has_behavior 'wildcard escaping', :name_cont,
|
161
|
-
(
|
161
|
+
(case ActiveRecord::Base.connection.adapter_name
|
162
|
+
when "PostGIS", "PostgreSQL"
|
162
163
|
/"people"."name" ILIKE '%\\%\\.\\_\\\\%'/
|
163
|
-
|
164
|
+
when "Mysql2"
|
164
165
|
/`people`.`name` LIKE '%\\\\%.\\\\_\\\\\\\\%'/
|
165
166
|
else
|
166
167
|
/"people"."name" LIKE '%%._\\%'/
|
@@ -177,9 +178,10 @@ module Ransack
|
|
177
178
|
|
178
179
|
describe 'not_cont' do
|
179
180
|
it_has_behavior 'wildcard escaping', :name_not_cont,
|
180
|
-
(
|
181
|
+
(case ActiveRecord::Base.connection.adapter_name
|
182
|
+
when "PostGIS", "PostgreSQL"
|
181
183
|
/"people"."name" NOT ILIKE '%\\%\\.\\_\\\\%'/
|
182
|
-
|
184
|
+
when "Mysql2"
|
183
185
|
/`people`.`name` NOT LIKE '%\\\\%.\\\\_\\\\\\\\%'/
|
184
186
|
else
|
185
187
|
/"people"."name" NOT LIKE '%%._\\%'/
|
@@ -196,9 +198,12 @@ module Ransack
|
|
196
198
|
|
197
199
|
describe 'i_cont' do
|
198
200
|
it_has_behavior 'wildcard escaping', :name_i_cont,
|
199
|
-
(
|
201
|
+
(case ActiveRecord::Base.connection.adapter_name
|
202
|
+
when "PostGIS"
|
203
|
+
/LOWER\("people"."name"\) ILIKE '%\\%\\.\\_\\\\%'/
|
204
|
+
when "PostgreSQL"
|
200
205
|
/"people"."name" ILIKE '%\\%\\.\\_\\\\%'/
|
201
|
-
|
206
|
+
when "Mysql2"
|
202
207
|
/LOWER\(`people`.`name`\) LIKE '%\\\\%.\\\\_\\\\\\\\%'/
|
203
208
|
else
|
204
209
|
/LOWER\("people"."name"\) LIKE '%%._\\%'/
|
@@ -215,9 +220,12 @@ module Ransack
|
|
215
220
|
|
216
221
|
describe 'not_i_cont' do
|
217
222
|
it_has_behavior 'wildcard escaping', :name_not_i_cont,
|
218
|
-
(
|
223
|
+
(case ActiveRecord::Base.connection.adapter_name
|
224
|
+
when "PostGIS"
|
225
|
+
/LOWER\("people"."name"\) NOT ILIKE '%\\%\\.\\_\\\\%'/
|
226
|
+
when "PostgreSQL"
|
219
227
|
/"people"."name" NOT ILIKE '%\\%\\.\\_\\\\%'/
|
220
|
-
|
228
|
+
when "Mysql2"
|
221
229
|
/LOWER\(`people`.`name`\) NOT LIKE '%\\\\%.\\\\_\\\\\\\\%'/
|
222
230
|
else
|
223
231
|
/LOWER\("people"."name"\) NOT LIKE '%%._\\%'/
|
data/spec/ransack/search_spec.rb
CHANGED
@@ -270,6 +270,7 @@ module Ransack
|
|
270
270
|
end
|
271
271
|
|
272
272
|
specify { expect { subject }.to raise_error ArgumentError }
|
273
|
+
specify { expect { subject }.to raise_error InvalidSearchError }
|
273
274
|
end
|
274
275
|
|
275
276
|
context 'when ignore_unknown_conditions configuration option is true' do
|
@@ -300,6 +301,7 @@ module Ransack
|
|
300
301
|
|
301
302
|
context 'when ignore_unknown_conditions search parameter is false' do
|
302
303
|
specify { expect { with_ignore_unknown_conditions_false }.to raise_error ArgumentError }
|
304
|
+
specify { expect { with_ignore_unknown_conditions_false }.to raise_error InvalidSearchError }
|
303
305
|
end
|
304
306
|
|
305
307
|
context 'when ignore_unknown_conditions search parameter is true' do
|
@@ -614,6 +616,18 @@ module Ransack
|
|
614
616
|
expect(@s.result.first.id).to eq 1
|
615
617
|
end
|
616
618
|
|
619
|
+
it 'raises ArgumentError when an invalid argument is sent' do
|
620
|
+
expect do
|
621
|
+
@s.sorts = 1234
|
622
|
+
end.to raise_error(ArgumentError, "Invalid argument (Integer) supplied to sorts=")
|
623
|
+
end
|
624
|
+
|
625
|
+
it 'raises InvalidSearchError when an invalid argument is sent' do
|
626
|
+
expect do
|
627
|
+
@s.sorts = 1234
|
628
|
+
end.to raise_error(Ransack::InvalidSearchError, "Invalid argument (Integer) supplied to sorts=")
|
629
|
+
end
|
630
|
+
|
617
631
|
it "PG's sort option", if: ::ActiveRecord::Base.connection.adapter_name == "PostgreSQL" do
|
618
632
|
default = Ransack.options.clone
|
619
633
|
|
data/spec/support/schema.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'active_record'
|
2
|
+
require 'activerecord-postgis-adapter'
|
2
3
|
|
3
4
|
case ENV['DB'].try(:downcase)
|
4
5
|
when 'mysql', 'mysql2'
|
@@ -20,6 +21,17 @@ when 'pg', 'postgres', 'postgresql'
|
|
20
21
|
host: ENV.fetch("DATABASE_HOST") { "localhost" },
|
21
22
|
min_messages: 'warning'
|
22
23
|
)
|
24
|
+
when 'postgis'
|
25
|
+
# To test with PostGIS: `DB=postgis bundle exec rake spec`
|
26
|
+
ActiveRecord::Base.establish_connection(
|
27
|
+
adapter: 'postgis',
|
28
|
+
postgis_extension: 'postgis',
|
29
|
+
database: 'ransack',
|
30
|
+
username: ENV.fetch("DATABASE_USERNAME") { "postgres" },
|
31
|
+
password: ENV.fetch("DATABASE_PASSWORD") { "" },
|
32
|
+
host: ENV.fetch("DATABASE_HOST") { "localhost" },
|
33
|
+
min_messages: 'warning'
|
34
|
+
)
|
23
35
|
else
|
24
36
|
# Otherwise, assume SQLite3: `bundle exec rake spec`
|
25
37
|
ActiveRecord::Base.establish_connection(
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ransack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ernie Miller
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date:
|
15
|
+
date: 2025-02-07 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: activerecord
|
@@ -158,6 +158,7 @@ files:
|
|
158
158
|
- lib/ransack/helpers.rb
|
159
159
|
- lib/ransack/helpers/form_builder.rb
|
160
160
|
- lib/ransack/helpers/form_helper.rb
|
161
|
+
- lib/ransack/invalid_search_error.rb
|
161
162
|
- lib/ransack/locale/ar.yml
|
162
163
|
- lib/ransack/locale/az.yml
|
163
164
|
- lib/ransack/locale/bg.yml
|
@@ -175,6 +176,7 @@ files:
|
|
175
176
|
- lib/ransack/locale/id.yml
|
176
177
|
- lib/ransack/locale/it.yml
|
177
178
|
- lib/ransack/locale/ja.yml
|
179
|
+
- lib/ransack/locale/ko.yml
|
178
180
|
- lib/ransack/locale/nl.yml
|
179
181
|
- lib/ransack/locale/pt-BR.yml
|
180
182
|
- lib/ransack/locale/ro.yml
|
@@ -244,7 +246,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
244
246
|
- !ruby/object:Gem::Version
|
245
247
|
version: '0'
|
246
248
|
requirements: []
|
247
|
-
rubygems_version: 3.
|
249
|
+
rubygems_version: 3.4.10
|
248
250
|
signing_key:
|
249
251
|
specification_version: 4
|
250
252
|
summary: Object-based searching for Active Record.
|