ii_finder 1.1.1 → 2.0.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 +4 -4
- data/CHANGELOG.md +16 -0
- data/README.md +63 -32
- data/ii_finder.gemspec +1 -0
- data/lib/ii_finder/base.rb +2 -0
- data/lib/ii_finder/callbacks.rb +2 -0
- data/lib/ii_finder/coactors.rb +29 -0
- data/lib/ii_finder/core.rb +8 -9
- data/lib/ii_finder/version.rb +1 -1
- data/lib/ii_finder.rb +1 -0
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0af875699d606b3d6b00fc1dba12000c1eea5767d029b5bd125b10f7ef3cdabd
|
4
|
+
data.tar.gz: e865e05b213f6e69522d3d9df5b96b2d2bffed9cfe62dd15e9e3ad0e964677bb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 89f8b24b33d997bf4f530673cf7066390864fbf3d4dbe56bd871edef522664febf803f4c06cd906a6792837dbb08336973c9f8538b2ca9c626f591d9939dee0c
|
7
|
+
data.tar.gz: 8d65c22603983ed0cbd3c7dccdcc349f8f8466be5bf76be8241e45c7181db63c6d36bed2eb5431323da5ad74a4935e12b6cceaad79f615e0660a4aab4f955d38
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,21 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 2.0.1
|
4
|
+
|
5
|
+
* Return relation after callbacks called.
|
6
|
+
|
7
|
+
## 2.0.0
|
8
|
+
|
9
|
+
* Replace chain feature with coactive.
|
10
|
+
|
11
|
+
## 1.2.0
|
12
|
+
|
13
|
+
* Add chain feature.
|
14
|
+
|
15
|
+
## 1.1.2
|
16
|
+
|
17
|
+
* Try fetch prior to calling instance method.
|
18
|
+
|
3
19
|
## 1.1.1
|
4
20
|
|
5
21
|
* Check arel_table existence for model.
|
data/README.md
CHANGED
@@ -24,14 +24,14 @@ Then execute:
|
|
24
24
|
Prepare model:
|
25
25
|
|
26
26
|
```ruby
|
27
|
-
class
|
27
|
+
class Item < ActiveRecord::Base
|
28
28
|
end
|
29
29
|
```
|
30
30
|
|
31
31
|
Prepare finder:
|
32
32
|
|
33
33
|
```ruby
|
34
|
-
class
|
34
|
+
class ItemsFinder < IIFinder::Base
|
35
35
|
parameters :name
|
36
36
|
|
37
37
|
def name(value)
|
@@ -43,15 +43,15 @@ end
|
|
43
43
|
Use finder as follows:
|
44
44
|
|
45
45
|
```ruby
|
46
|
-
|
47
|
-
#=> SELECT "
|
46
|
+
ItemsFinder.call(name: 'NAME').to_sql
|
47
|
+
#=> SELECT "items".* FROM "items" WHERE "items"."name" = 'NAME'
|
48
48
|
```
|
49
49
|
|
50
50
|
You can also specify relation as first argument:
|
51
51
|
|
52
52
|
```ruby
|
53
|
-
|
54
|
-
#=> SELECT "
|
53
|
+
ItemsFinder.call(Item.where(id: [1, 2, 3]), name: 'NAME').to_sql
|
54
|
+
#=> SELECT "items".* FROM "items" WHERE "items"."id" IN (1, 2, 3) AND "items"."name" = 'NAME'
|
55
55
|
```
|
56
56
|
|
57
57
|
### Finder
|
@@ -61,7 +61,7 @@ Finder method will not be called when the value of parameter is blank.
|
|
61
61
|
If you want to receive such value, set `allow_blank` as follows:
|
62
62
|
|
63
63
|
```ruby
|
64
|
-
class
|
64
|
+
class ItemsFinder < IIFinder::Base
|
65
65
|
parameters :name, allow_blank: true
|
66
66
|
|
67
67
|
def name(value)
|
@@ -69,14 +69,14 @@ class UsersFinder < IIFinder::Base
|
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
72
|
-
|
73
|
-
#=> SELECT "
|
72
|
+
ItemsFinder.call(name: '').to_sql
|
73
|
+
#=> SELECT "items".* FROM "items" WHERE "items"."name" = ''
|
74
74
|
```
|
75
75
|
|
76
76
|
Finder has following attributes:
|
77
77
|
|
78
78
|
```ruby
|
79
|
-
class
|
79
|
+
class ItemsFinder < IIFinder::Base
|
80
80
|
parameters :name
|
81
81
|
|
82
82
|
def name(value)
|
@@ -87,10 +87,10 @@ class UsersFinder < IIFinder::Base
|
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
|
-
|
91
|
-
#=> relation: #<
|
90
|
+
ItemsFinder.call(name: 'NAME')
|
91
|
+
#=> relation: #<Item::ActiveRecord_Relation:
|
92
92
|
# criteria: {:name=>'NAME'}
|
93
|
-
# model:
|
93
|
+
# model: Item
|
94
94
|
# table: #<Arel::Table ...>
|
95
95
|
```
|
96
96
|
|
@@ -102,7 +102,7 @@ IIFinder.configure do |config|
|
|
102
102
|
config.merge_relation = false
|
103
103
|
end
|
104
104
|
|
105
|
-
class
|
105
|
+
class ItemsFinder < IIFinder::Base
|
106
106
|
parameters :name
|
107
107
|
|
108
108
|
def name(value)
|
@@ -110,8 +110,8 @@ class UsersFinder < IIFinder::Base
|
|
110
110
|
end
|
111
111
|
end
|
112
112
|
|
113
|
-
|
114
|
-
#=> SELECT "
|
113
|
+
ItemsFinder.call(name: 'NAME').to_sql
|
114
|
+
#=> SELECT "items".* FROM "items" WHERE "items"."name" = 'NAME'
|
115
115
|
```
|
116
116
|
|
117
117
|
#### Callbacks
|
@@ -125,7 +125,7 @@ Following callbacks are available.
|
|
125
125
|
For example:
|
126
126
|
|
127
127
|
```ruby
|
128
|
-
class
|
128
|
+
class ItemsFinder < IIFinder::Base
|
129
129
|
after_call :default_order
|
130
130
|
|
131
131
|
def default_order
|
@@ -133,14 +133,45 @@ class UsersFinder < IIFinder::Base
|
|
133
133
|
end
|
134
134
|
end
|
135
135
|
|
136
|
-
|
137
|
-
#=> SELECT "
|
136
|
+
ItemsFinder.call.to_sql
|
137
|
+
#=> SELECT "items".* FROM "items" ORDER BY "items"."id" DESC
|
138
138
|
```
|
139
139
|
|
140
140
|
Note that finder does not handle the return value of callback.
|
141
141
|
When you want to update `@relation` in the callback,
|
142
142
|
reassign `@relation` or use methods like `where!` or `order!`.
|
143
143
|
|
144
|
+
#### Coactors
|
145
|
+
|
146
|
+
You can chain multiple finders by using `coact`. For example:
|
147
|
+
|
148
|
+
```ruby
|
149
|
+
class NameFinder < IIFinder::Base
|
150
|
+
parameters :name
|
151
|
+
|
152
|
+
def name(value)
|
153
|
+
@relation.where(name: value)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
class AgeFinder < IIFinder::Base
|
158
|
+
parameters :age
|
159
|
+
|
160
|
+
def age(value)
|
161
|
+
@relation.where(age: value)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
class ItemsFinder < IIFinder::Base
|
166
|
+
coact NameFinder, AgeFinder
|
167
|
+
end
|
168
|
+
|
169
|
+
ItemsFinder.call(Item.all, name: 'name', age: 10).to_sql
|
170
|
+
#=> SELECT "items".* FROM "items" WHERE "items"."name" = 'name' AND "items"."age" = 10
|
171
|
+
```
|
172
|
+
|
173
|
+
See [coactive](https://github.com/kanety/coactive) for more `coact` examples:
|
174
|
+
|
144
175
|
### Lookup for model
|
145
176
|
|
146
177
|
Finder lookups related model by its class name when the first argument of `call` is not relation.
|
@@ -148,30 +179,30 @@ So the name of finder class should be composed of the name of model class.
|
|
148
179
|
For example:
|
149
180
|
|
150
181
|
```ruby
|
151
|
-
class
|
182
|
+
class Item < ActiveRecord::Base
|
152
183
|
end
|
153
184
|
|
154
|
-
class
|
185
|
+
class ItemsFinder < IIFinder::Base
|
155
186
|
end
|
156
187
|
|
157
|
-
IIFinder::Base.lookup(
|
158
|
-
#=>
|
188
|
+
IIFinder::Base.lookup(ItemsFinder)
|
189
|
+
#=> Item
|
159
190
|
```
|
160
191
|
|
161
192
|
Note that superclass of finder is also looked up until related model is found.
|
162
193
|
|
163
194
|
```ruby
|
164
|
-
class
|
195
|
+
class Item < ActiveRecord::Base
|
165
196
|
end
|
166
197
|
|
167
|
-
class
|
198
|
+
class ItemsFinder < IIFinder::Base
|
168
199
|
end
|
169
200
|
|
170
|
-
class
|
201
|
+
class InheritedItemsFinder < ItemsFinder
|
171
202
|
end
|
172
203
|
|
173
|
-
IIFinder::Base.lookup(
|
174
|
-
#=>
|
204
|
+
IIFinder::Base.lookup(InheritedItemsFinder)
|
205
|
+
#=> Item
|
175
206
|
```
|
176
207
|
|
177
208
|
### Scope for model
|
@@ -179,12 +210,12 @@ IIFinder::Base.lookup(InheritedUsersFinder)
|
|
179
210
|
In case you want to call finder from model, include `IIFinder::Scope` into model as follows:
|
180
211
|
|
181
212
|
```ruby
|
182
|
-
class
|
213
|
+
class Item < ActiveRecord::Base
|
183
214
|
include IIFinder::Scope
|
184
215
|
end
|
185
216
|
|
186
|
-
|
187
|
-
#=> SELECT "
|
217
|
+
Item.finder_scope(name: 'NAME').to_sql
|
218
|
+
#=> SELECT "items".* FROM "items" WHERE "items"."name" = 'NAME'
|
188
219
|
```
|
189
220
|
|
190
221
|
### Logging
|
@@ -199,7 +230,7 @@ IIFinder::LogSubscriber.attach_to :ii_finder
|
|
199
230
|
This subscriber will write logs in debug mode as the following example:
|
200
231
|
|
201
232
|
```
|
202
|
-
Called
|
233
|
+
Called ItemsFinder with {:id=>1} (Duration: 9.9ms, Allocations: 915)
|
203
234
|
```
|
204
235
|
|
205
236
|
## Contributing
|
data/ii_finder.gemspec
CHANGED
data/lib/ii_finder/base.rb
CHANGED
@@ -5,6 +5,7 @@ require_relative 'parameters'
|
|
5
5
|
require_relative 'callbacks'
|
6
6
|
require_relative 'instrumentation'
|
7
7
|
require_relative 'lookup'
|
8
|
+
require_relative 'coactors'
|
8
9
|
|
9
10
|
module IIFinder
|
10
11
|
class Base
|
@@ -13,5 +14,6 @@ module IIFinder
|
|
13
14
|
include Callbacks
|
14
15
|
include Instrumentation
|
15
16
|
include Lookup
|
17
|
+
include Coactors
|
16
18
|
end
|
17
19
|
end
|
data/lib/ii_finder/callbacks.rb
CHANGED
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module IIFinder
|
4
|
+
module Coactors
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
include Coactive::Base
|
9
|
+
|
10
|
+
configure_coactive do |config|
|
11
|
+
config.load_paths = ['app/finders']
|
12
|
+
config.class_suffix = 'Finder'
|
13
|
+
config.use_cache = true
|
14
|
+
config.lookup_superclass_until = ['ActiveRecord::Base', 'ActiveModel::Base']
|
15
|
+
end
|
16
|
+
|
17
|
+
class << self
|
18
|
+
alias_method :chain, :coact
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def call
|
23
|
+
coactors.each do |finder|
|
24
|
+
merge_relation!(finder.call(*@_args))
|
25
|
+
end
|
26
|
+
super
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/ii_finder/core.rb
CHANGED
@@ -9,6 +9,7 @@ module IIFinder
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def initialize(*args)
|
12
|
+
@_args = args;
|
12
13
|
if args.size == 0 || args.size == 1
|
13
14
|
@model = self.class.lookup
|
14
15
|
raise IIFinder::Error.new("could not find model for #{self.class}") unless @model
|
@@ -26,7 +27,7 @@ module IIFinder
|
|
26
27
|
self.class._parameters.each do |param|
|
27
28
|
value = fetch_criteria(param.name)
|
28
29
|
if value.present? || param.allow_blank?
|
29
|
-
|
30
|
+
merge_relation!(send(param.name, value))
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
@@ -34,18 +35,16 @@ module IIFinder
|
|
34
35
|
end
|
35
36
|
|
36
37
|
def fetch_criteria(name)
|
37
|
-
if @criteria.respond_to?(
|
38
|
-
@criteria.send(name)
|
39
|
-
elsif @criteria.respond_to?(:fetch)
|
38
|
+
if @criteria.respond_to?(:fetch)
|
40
39
|
@criteria.fetch(name, nil)
|
40
|
+
elsif @criteria.respond_to?(name)
|
41
|
+
@criteria.send(name)
|
41
42
|
end
|
42
43
|
end
|
43
44
|
|
44
|
-
def
|
45
|
-
|
46
|
-
|
47
|
-
if result.respond_to?(:merge) && Config.merge_relation
|
48
|
-
@relation = @relation.merge(result)
|
45
|
+
def merge_relation!(relation)
|
46
|
+
if relation.respond_to?(:merge) && Config.merge_relation
|
47
|
+
@relation = @relation.merge(relation)
|
49
48
|
end
|
50
49
|
end
|
51
50
|
|
data/lib/ii_finder/version.rb
CHANGED
data/lib/ii_finder.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ii_finder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yoshikazu Kaneta
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-12-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '5.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: coactive
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.1'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.1'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rails
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -120,6 +134,7 @@ files:
|
|
120
134
|
- lib/ii_finder.rb
|
121
135
|
- lib/ii_finder/base.rb
|
122
136
|
- lib/ii_finder/callbacks.rb
|
137
|
+
- lib/ii_finder/coactors.rb
|
123
138
|
- lib/ii_finder/config.rb
|
124
139
|
- lib/ii_finder/core.rb
|
125
140
|
- lib/ii_finder/errors.rb
|
@@ -148,7 +163,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
148
163
|
- !ruby/object:Gem::Version
|
149
164
|
version: '0'
|
150
165
|
requirements: []
|
151
|
-
rubygems_version: 3.1.
|
166
|
+
rubygems_version: 3.1.6
|
152
167
|
signing_key:
|
153
168
|
specification_version: 4
|
154
169
|
summary: A base finder to support building relations from parameters
|