ransack 4.2.1 → 4.3.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.
- 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.
|