tiny_filter 0.1.0 → 0.2.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/.rubocop.yml +0 -3
- data/CHANGELOG.md +8 -0
- data/README.md +10 -6
- data/lib/{tiny_filter/generators → generators}/tiny_filter/filter/USAGE +0 -0
- data/lib/{tiny_filter/generators → generators}/tiny_filter/filter/filter_generator.rb +1 -2
- data/lib/{tiny_filter/generators/tiny_filter/filter/templates/filter.rb.erb → generators/tiny_filter/filter/templates/filter.rb.tt} +0 -0
- data/lib/{tiny_filter/generators → generators}/tiny_filter/install/USAGE +0 -0
- data/lib/{tiny_filter/generators → generators}/tiny_filter/install/install_generator.rb +1 -2
- data/lib/{tiny_filter/generators/tiny_filter/install/templates/application_filter.rb → generators/tiny_filter/install/templates/application_filter.rb.tt} +0 -0
- data/lib/tiny_filter/base.rb +9 -7
- data/lib/tiny_filter/filter_finder.rb +0 -3
- data/lib/tiny_filter/version.rb +1 -1
- data/lib/tiny_filter.rb +0 -1
- data/tiny_filter.gemspec +1 -1
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b25430ea35a61c7a2ce2bc81b38596990385179c11b4b2797c441df5e1813725
|
4
|
+
data.tar.gz: ec073eef8a8faf00b171e9ba92fa356a76fa3947b76f314cab3e6997855a618c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0905513bd90fe26f0bc2ead908f73688e3dbe69da16d4864f5e7d64a3be6b0aa1e3f159b270498bb7e8f3c1faced5ac9707a318034c433e3bdc2746e7d9742ba'
|
7
|
+
data.tar.gz: 98498c4a965f6b7262418e7a952a6b164ef6baa08c869503b971a3461486cb0c6580cf62be73aaff98282d0c4ad3a087203751554fcd92b668ca2f63d2d64e11
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# TinyFilter
|
2
2
|
|
3
|
+
[](https://rubygems.org/gems/tiny_filter)
|
4
|
+
[](https://rubygems.org/gems/tiny_filter)
|
5
|
+
[](https://github.com/lassoid/tiny_filter/actions/workflows/ci.yml)
|
6
|
+
|
3
7
|
TinyFilter is created to provide a simple object-oriented abstraction layer for filtering collections.
|
4
8
|
It is mainly purposed for ActiveRecord collections, but you can also use it with any enumerable.
|
5
9
|
|
@@ -40,11 +44,11 @@ Each filter is defined by calling `filters` method inside class body.
|
|
40
44
|
|
41
45
|
`filters` accepts two arguments:
|
42
46
|
- `key` - a filter name, used as identifier;
|
43
|
-
- `block` - a block
|
47
|
+
- `block` - a block with filter logic, that returns filtered collection and itself accepts two arguments:
|
44
48
|
- `scope` - a collection that should be filtered;
|
45
49
|
- `value` - a value for filtering.
|
46
50
|
|
47
|
-
When you perform filtering, provided
|
51
|
+
When you perform filtering, provided key indicate filter `key` and provided value is passed to `value` param in corresponding filter `block`.
|
48
52
|
`scope`s receive collections in a pipeline manner:
|
49
53
|
_first_ executed filter receives _original collection_,
|
50
54
|
_second and further_ receive the _return collection_ of the previous filter.
|
@@ -58,7 +62,7 @@ class UserFilter < ApplicationFilter
|
|
58
62
|
end
|
59
63
|
|
60
64
|
UserFilter.filter(User, name: "John", surname: "Doe")
|
61
|
-
#
|
65
|
+
# Which is equivalent to:
|
62
66
|
# User.where(first_name: "John").where(last_name: "Doe")
|
63
67
|
```
|
64
68
|
|
@@ -68,14 +72,14 @@ It guarantees that scope behaves the same way as in other filters in this class.
|
|
68
72
|
```ruby
|
69
73
|
filters(:title) { |scope, value| scope.where("title ILIKE ?", value) }
|
70
74
|
|
71
|
-
# bad - scope is
|
75
|
+
# bad - scope is an ActiveRecord collection, but the return value is an array.
|
72
76
|
filters(:from) { |scope, value| scope.select { |e| e.created_at >= value } }
|
73
77
|
|
74
78
|
# good - scope and return value are both ActiveRecord collections.
|
75
79
|
filters(:from) { |scope, value| scope.where("created_at >= ?", value) }
|
76
80
|
```
|
77
81
|
|
78
|
-
|
82
|
+
Thus if the initial scope for filtering is an ActiveRecord collection,
|
79
83
|
it is a bad practice for filter to return not an ActiveRecord collection.
|
80
84
|
Otherwise you can face errors depending on the provided options order.
|
81
85
|
|
@@ -117,7 +121,7 @@ class My::Class < ApplicationRecord
|
|
117
121
|
end
|
118
122
|
```
|
119
123
|
|
120
|
-
|
124
|
+
## Using with Plain objects
|
121
125
|
|
122
126
|
You can use filters with non-ActiveRecord collections like so:
|
123
127
|
|
File without changes
|
@@ -11,7 +11,7 @@ module TinyFilter
|
|
11
11
|
|
12
12
|
def create_filter
|
13
13
|
template_file = File.join("app/filters", class_path, filter_file_name)
|
14
|
-
template "filter.rb.
|
14
|
+
template "filter.rb.tt", template_file
|
15
15
|
end
|
16
16
|
|
17
17
|
private
|
@@ -19,7 +19,6 @@ module TinyFilter
|
|
19
19
|
def filter_file_name
|
20
20
|
"#{file_name}_filter.rb"
|
21
21
|
end
|
22
|
-
|
23
22
|
end
|
24
23
|
end
|
25
24
|
end
|
File without changes
|
File without changes
|
@@ -8,9 +8,8 @@ module TinyFilter
|
|
8
8
|
desc "This generator creates an application filter"
|
9
9
|
|
10
10
|
def copy_application_filter
|
11
|
-
template "application_filter.rb", "app/filters/application_filter.rb"
|
11
|
+
template "application_filter.rb.tt", "app/filters/application_filter.rb"
|
12
12
|
end
|
13
|
-
|
14
13
|
end
|
15
14
|
end
|
16
15
|
end
|
File without changes
|
data/lib/tiny_filter/base.rb
CHANGED
@@ -3,12 +3,14 @@
|
|
3
3
|
module TinyFilter
|
4
4
|
class Base
|
5
5
|
class << self
|
6
|
+
def inherited(subclass)
|
7
|
+
super
|
8
|
+
dup_filters = __filters__.dup
|
9
|
+
subclass.__filters__ = dup_filters.each { |key, value| dup_filters[key] = value.dup }
|
10
|
+
end
|
6
11
|
|
7
12
|
def filters(key, &block)
|
8
|
-
key =
|
9
|
-
raise AlreadyDefinedError, "filter :#{key} defined more than once in #{self}" if __filters__.key?(key)
|
10
|
-
|
11
|
-
__filters__[key] = block
|
13
|
+
__filters__[key.to_sym] = block
|
12
14
|
end
|
13
15
|
|
14
16
|
def filter(base_scope, args = {})
|
@@ -20,13 +22,13 @@ module TinyFilter
|
|
20
22
|
end
|
21
23
|
end
|
22
24
|
|
23
|
-
|
25
|
+
protected
|
26
|
+
|
27
|
+
attr_writer :__filters__
|
24
28
|
|
25
29
|
def __filters__
|
26
30
|
@__filters__ ||= {}
|
27
31
|
end
|
28
|
-
|
29
32
|
end
|
30
|
-
|
31
33
|
end
|
32
34
|
end
|
@@ -5,7 +5,6 @@ module TinyFilter
|
|
5
5
|
SUFFIX = "Filter"
|
6
6
|
|
7
7
|
class << self
|
8
|
-
|
9
8
|
def find(object)
|
10
9
|
filter_class(object)
|
11
10
|
end
|
@@ -21,8 +20,6 @@ module TinyFilter
|
|
21
20
|
raise Error, "unable to find appropriate filter class for #{object}"
|
22
21
|
end
|
23
22
|
end
|
24
|
-
|
25
23
|
end
|
26
|
-
|
27
24
|
end
|
28
25
|
end
|
data/lib/tiny_filter/version.rb
CHANGED
data/lib/tiny_filter.rb
CHANGED
data/tiny_filter.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.email = ["kirill.usanov.dev@gmail.com"]
|
10
10
|
|
11
11
|
spec.summary = "Tiny filtering for Rails."
|
12
|
-
spec.description = "Simple filtering for
|
12
|
+
spec.description = "Simple filtering for ActiveRecord and enumerables."
|
13
13
|
spec.homepage = "https://github.com/lassoid/tiny_filter"
|
14
14
|
spec.license = "MIT"
|
15
15
|
spec.required_ruby_version = ">= 2.6.0"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tiny_filter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kirill Usanov
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2022-12-
|
12
|
+
date: 2022-12-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -197,7 +197,7 @@ dependencies:
|
|
197
197
|
- - ">="
|
198
198
|
- !ruby/object:Gem::Version
|
199
199
|
version: '0'
|
200
|
-
description: Simple filtering for
|
200
|
+
description: Simple filtering for ActiveRecord and enumerables.
|
201
201
|
email:
|
202
202
|
- kirill.usanov.dev@gmail.com
|
203
203
|
executables: []
|
@@ -212,16 +212,16 @@ files:
|
|
212
212
|
- LICENSE
|
213
213
|
- README.md
|
214
214
|
- Rakefile
|
215
|
+
- lib/generators/tiny_filter/filter/USAGE
|
216
|
+
- lib/generators/tiny_filter/filter/filter_generator.rb
|
217
|
+
- lib/generators/tiny_filter/filter/templates/filter.rb.tt
|
218
|
+
- lib/generators/tiny_filter/install/USAGE
|
219
|
+
- lib/generators/tiny_filter/install/install_generator.rb
|
220
|
+
- lib/generators/tiny_filter/install/templates/application_filter.rb.tt
|
215
221
|
- lib/tiny_filter.rb
|
216
222
|
- lib/tiny_filter/base.rb
|
217
223
|
- lib/tiny_filter/concern.rb
|
218
224
|
- lib/tiny_filter/filter_finder.rb
|
219
|
-
- lib/tiny_filter/generators/tiny_filter/filter/USAGE
|
220
|
-
- lib/tiny_filter/generators/tiny_filter/filter/filter_generator.rb
|
221
|
-
- lib/tiny_filter/generators/tiny_filter/filter/templates/filter.rb.erb
|
222
|
-
- lib/tiny_filter/generators/tiny_filter/install/USAGE
|
223
|
-
- lib/tiny_filter/generators/tiny_filter/install/install_generator.rb
|
224
|
-
- lib/tiny_filter/generators/tiny_filter/install/templates/application_filter.rb
|
225
225
|
- lib/tiny_filter/version.rb
|
226
226
|
- sig/tiny_filter.rbs
|
227
227
|
- tiny_filter.gemspec
|
@@ -247,7 +247,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
247
247
|
- !ruby/object:Gem::Version
|
248
248
|
version: '0'
|
249
249
|
requirements: []
|
250
|
-
rubygems_version: 3.3.
|
250
|
+
rubygems_version: 3.3.26
|
251
251
|
signing_key:
|
252
252
|
specification_version: 4
|
253
253
|
summary: Tiny filtering for Rails.
|