tiny_filter 0.2.1 → 0.3.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: 5cf60cc543019e4d02a3c8ffda90cd0e27d224feefdd0517f1b359c9e598b7f2
4
- data.tar.gz: fc7bceb2b9ec9265d4535fcacbf65c207e2df6b689b3d3117a839ccffdba6524
3
+ metadata.gz: 3fcc488e4fb2f5ee807537a3189af85766f65bc5319ddf64b08103ba0d351b60
4
+ data.tar.gz: 1628d248470555d7bbeaae20fb00ee99e1fb6d26820328aeecf3aa731711f729
5
5
  SHA512:
6
- metadata.gz: f1537075c3b79a1e3ab09080f7d9e68edb43e22dd97881782000d67d677cfdd543c118e445425f0bf729d2680ec8b8d35db8fb064d911f36b6727388ebcde957
7
- data.tar.gz: 3b49cb06eca991359f8bf91500fb9f0ff20fcb36f503a25bd7011b239b9258411178844906e8ae424e4e7ab16720875c0c0f430161fb82f6640b35b4704c7146
6
+ metadata.gz: f5955a51dffd16c37f143bfc28860d5b841f99cc792ddb6c7a9d7414196a95d78fe34c71aa8196b2b8b1d258df8cc9ba551c07774fbe99b54ca3063b59540baf
7
+ data.tar.gz: 12bffd0938e8dbcce9cb3cf2f690fc48d08a85fdceb2a31615aef71b3df5249ec436945bcbb9732181ea111f549b42ff5267b50aef69f1b5807899aa8af309cd
data/CHANGELOG.md CHANGED
@@ -1,4 +1,11 @@
1
- ## [Unreleased]
1
+ ## [0.3.1] - 2023-11-14
2
+
3
+ - Removed ActiveSupport `require`
4
+
5
+ ## [0.3.0] - 2023-11-06
6
+
7
+ - No runtime dependencies!
8
+ - Sequel integration
2
9
 
3
10
  ## [0.2.1] - 2023-10-20
4
11
 
data/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  [![Github Actions CI](https://github.com/lassoid/tiny_filter/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/lassoid/tiny_filter/actions/workflows/ci.yml)
6
6
 
7
7
  TinyFilter is created to provide a simple object-oriented abstraction layer for filtering collections.
8
- It is mainly purposed for ActiveRecord collections, but you can also use it with any enumerable.
8
+ It is mainly purposed for ActiveRecord/Sequel models, but you can also use it with any enumerable.
9
9
 
10
10
  ```ruby
11
11
  Post.where(title: "Wow!").filter_by(from: 2.days.ago, to: 1.day.ago).order(:created_at)
@@ -83,11 +83,12 @@ Thus if the initial scope for filtering is an ActiveRecord collection,
83
83
  it is a bad practice for filter to return not an ActiveRecord collection.
84
84
  Otherwise you can face errors depending on the provided options order.
85
85
 
86
- ## ActiveRecord integration
86
+ ## ORM integration
87
87
 
88
- ### Helper
88
+ ### ActiveRecord
89
89
 
90
- TinyFilter provides a simple concern, that adds just one method `filter_by`, that can be used in ActiveRecord method chaining.
90
+ TinyFilter provides a simple concern, that adds just one method `filter_by`,
91
+ that can be used in ActiveRecord method chaining.
91
92
 
92
93
  Just include `TinyFilter::Concern` in your model and that's all!
93
94
 
@@ -104,12 +105,30 @@ Post.where(title: "something interesting").filter_by(from: 2.days.ago, to: 1.day
104
105
  Post.filter_by(from: 1.year.ago)
105
106
  ```
106
107
 
108
+ ### Sequel
109
+
110
+ The previously mentioned filter concern can also be used in Sequel models.
111
+
112
+ ```ruby
113
+ class Artist < Sequel::Model
114
+ include TinyFilter::Concern
115
+ end
116
+ ```
117
+
118
+ Querying examples:
119
+
120
+ ```ruby
121
+ Artist.where(name: "Kirill").filter_by(from: 2.days.ago, to: 1.day.ago).order(:name).all
122
+ Artist.filter_by(from: 1.year.ago).all
123
+ ```
124
+
107
125
  ### Naming convention
108
126
 
109
127
  By default a filter class and a model are mapped by a _model name_ with a _suffix_ `Filter`.
110
128
  For example, the model `My::Class` by default will use the `My::ClassFilter` as a filter class.
111
129
 
112
- You can customize this behavior by implementing a `filter_class` class method with an appropriate class as a return value.
130
+ You can customize this behavior by implementing a `filter_class` class method
131
+ with an appropriate class as a return value.
113
132
 
114
133
  ```ruby
115
134
  class My::Class < ApplicationRecord
@@ -123,7 +142,7 @@ end
123
142
 
124
143
  ## Using with Plain objects
125
144
 
126
- You can use filters with non-ActiveRecord collections like so:
145
+ You can use filters with Plain Old Ruby collections like so:
127
146
 
128
147
  ```ruby
129
148
  options # filter options, for example: `{ from: 2.days.ago, to: 1.day.ago }`
@@ -2,13 +2,20 @@
2
2
 
3
3
  module TinyFilter
4
4
  module Concern
5
- extend ActiveSupport::Concern
6
-
7
- included do
8
- if defined?(ActiveRecord::Base) && self <= ActiveRecord::Base
9
- scope :filter_by, ->(args = {}) { TinyFilter::FilterFinder.find(self).filter(self, args) }
10
- else
11
- raise Error, "unable to include TinyFilter::Concern in #{self} that is not an ActiveRecord::Base descendant"
5
+ class << self
6
+ def included(other)
7
+ if defined?(ActiveRecord::Base) && other <= ActiveRecord::Base
8
+ other.scope :filter_by, ->(args = {}) { TinyFilter::FilterFinder.find(self).filter(self, args) }
9
+ elsif defined?(Sequel::Model) && other <= Sequel::Model
10
+ other.dataset_module do
11
+ def filter_by(args = {})
12
+ TinyFilter::FilterFinder.find(self).filter(self, args)
13
+ end
14
+ end
15
+ else
16
+ raise Error, "unable to include TinyFilter::Concern in #{other} " \
17
+ "that is not an ActiveRecord::Base or Sequel::Model descendant"
18
+ end
12
19
  end
13
20
  end
14
21
  end
@@ -15,10 +15,18 @@ module TinyFilter
15
15
  if object.respond_to?(:filter_class)
16
16
  object.filter_class
17
17
  elsif object.respond_to?(:model_name)
18
- "#{object.model_name}#{SUFFIX}".constantize
18
+ Object.const_get("#{object.model_name}#{SUFFIX}")
19
+ elsif object.respond_to?(:model)
20
+ if object.model.respond_to?(:filter_class)
21
+ object.model.filter_class
22
+ else
23
+ Object.const_get("#{object.model}#{SUFFIX}")
24
+ end
19
25
  else
20
- raise Error, "unable to find appropriate filter class for #{object}"
26
+ Object.const_get("#{object}#{SUFFIX}")
21
27
  end
28
+ rescue NameError
29
+ raise Error, "unable to find appropriate filter class for #{object}"
22
30
  end
23
31
  end
24
32
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TinyFilter
4
- VERSION = "0.2.1"
4
+ VERSION = "0.3.1"
5
5
  end
data/lib/tiny_filter.rb CHANGED
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "active_support/concern"
4
- require "active_support/core_ext/string/inflections"
5
-
6
3
  require "tiny_filter/version"
7
4
  require "tiny_filter/base"
8
5
  require "tiny_filter/filter_finder"
data/tiny_filter.gemspec CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ["Kirill Usanov", "LassoID"]
9
9
  spec.email = "kirill@lassoid.ru"
10
10
 
11
- spec.summary = "Tiny filtering for Rails."
12
- spec.description = "Simple filtering for ActiveRecord and enumerables."
11
+ spec.summary = "Tiny filtering for ActiveRecord, Sequel and enumerables."
12
+ spec.description = "Simple filtering for ActiveRecord, Sequel 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"
@@ -30,7 +30,6 @@ Gem::Specification.new do |spec|
30
30
  spec.require_paths = ["lib"]
31
31
 
32
32
  # Dependencies
33
- spec.add_dependency "activesupport", ">= 6.0"
34
33
  spec.add_development_dependency "activerecord", ">= 6.0"
35
34
  spec.add_development_dependency "railties", ">= 6.0"
36
35
  spec.add_development_dependency "rake"
@@ -41,5 +40,6 @@ Gem::Specification.new do |spec|
41
40
  spec.add_development_dependency "rubocop-rake"
42
41
  spec.add_development_dependency "rubocop-rspec"
43
42
  spec.add_development_dependency "rubocop-shopify"
43
+ spec.add_development_dependency "sequel"
44
44
  spec.add_development_dependency "sqlite3"
45
45
  end
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.2.1
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kirill Usanov
@@ -9,22 +9,8 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2023-10-20 00:00:00.000000000 Z
12
+ date: 2023-11-14 00:00:00.000000000 Z
13
13
  dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: activesupport
16
- requirement: !ruby/object:Gem::Requirement
17
- requirements:
18
- - - ">="
19
- - !ruby/object:Gem::Version
20
- version: '6.0'
21
- type: :runtime
22
- prerelease: false
23
- version_requirements: !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- version: '6.0'
28
14
  - !ruby/object:Gem::Dependency
29
15
  name: activerecord
30
16
  requirement: !ruby/object:Gem::Requirement
@@ -165,6 +151,20 @@ dependencies:
165
151
  - - ">="
166
152
  - !ruby/object:Gem::Version
167
153
  version: '0'
154
+ - !ruby/object:Gem::Dependency
155
+ name: sequel
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: sqlite3
170
170
  requirement: !ruby/object:Gem::Requirement
@@ -179,7 +179,7 @@ dependencies:
179
179
  - - ">="
180
180
  - !ruby/object:Gem::Version
181
181
  version: '0'
182
- description: Simple filtering for ActiveRecord and enumerables.
182
+ description: Simple filtering for ActiveRecord, Sequel and enumerables.
183
183
  email: kirill@lassoid.ru
184
184
  executables: []
185
185
  extensions: []
@@ -231,5 +231,5 @@ requirements: []
231
231
  rubygems_version: 3.4.17
232
232
  signing_key:
233
233
  specification_version: 4
234
- summary: Tiny filtering for Rails.
234
+ summary: Tiny filtering for ActiveRecord, Sequel and enumerables.
235
235
  test_files: []