Skip to content
This repository was archived by the owner on Dec 11, 2024. It is now read-only.

Commit 8ff51ed

Browse files
committed
added suppor to Callable value
1 parent 760bab6 commit 8ff51ed

File tree

5 files changed

+101
-1
lines changed

5 files changed

+101
-1
lines changed

README.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,49 @@ collection = Recollect::Array.filter(data, filters)
247247
# [{ schedules: [{ opened: true, all_day: true }, { opened: false, all_day: true }] }]
248248
```
249249

250+
Amazing, you can pass a Callable value as value, like this.
251+
252+
```ruby
253+
filters = {
254+
'schedules.[0].opened': {
255+
eq: -> { true }
256+
}
257+
}
258+
259+
# OR a Module
260+
261+
module ActiveTruthy
262+
def self.call = true
263+
end
264+
265+
module NumbersAvailable
266+
def self.call = %w[1 2]
267+
end
268+
269+
filters = {
270+
'schedules.[0].opened': {
271+
eq: ActiveTruthy
272+
},
273+
numbers: {
274+
in: NumbersAvailable
275+
}
276+
}
277+
278+
# OR a Class
279+
280+
class ActiveFalsey
281+
def self.call = false
282+
end
283+
284+
filters = {
285+
'schedules.[0].opened': {
286+
eq: ActiveFalsey
287+
}
288+
}
289+
290+
collection = Recollect::Array.filter(data, filters)
291+
```
292+
250293
**Combine conditions**
251294

252295
Yes, you can combine one or multiple predicates to filter you array.

lib/recollect/filterable.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,12 @@ def __apply_filter_callback
3333
klass = Predicate.call(predicate)
3434

3535
@result.filter! do |item|
36-
klass.check!(item, key, item_value)
36+
case item_value
37+
when Proc, Module
38+
klass.check!(item, key, item_value.call)
39+
else
40+
klass.check!(item, key, item_value)
41+
end
3742
end
3843
end
3944
else

spec/lib/recollect/filterable_spec.rb

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,43 @@
7171
end
7272

7373
context 'when value is Hash contains predicates' do
74+
context 'and hash value is Callable' do
75+
it 'returns only filters items' do
76+
filters = {
77+
active: {
78+
eq: -> { true }
79+
}
80+
}
81+
82+
collection = Recollect::Filterable.call(data, filters)
83+
84+
expect(collection.result.size).to eq(2)
85+
end
86+
87+
it 'returns only filters items' do
88+
filters = {
89+
active: { eq: ActiveTruthy },
90+
numbers: { in: NumbersAvailable }
91+
}
92+
93+
collection = Recollect::Filterable.call(data, filters)
94+
95+
expect(collection.result.size).to eq(1)
96+
end
97+
98+
it 'returns only filters items' do
99+
filters = {
100+
active: {
101+
eq: ActiveFalsey
102+
}
103+
}
104+
105+
collection = Recollect::Filterable.call(data, filters)
106+
107+
expect(collection.result.size).to eq(1)
108+
end
109+
end
110+
74111
it 'returns only filters items' do
75112
filters = { active: { eq: true } }
76113

spec/spec_helper.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
require 'bundler/setup'
55
require 'recollect'
66

7+
Dir["#{File.expand_path(__dir__)}/support/**/*.rb"].each { |f| require f }
8+
79
RSpec.configure do |config|
810
# Enable flags like --only-failures and --next-failure
911
config.example_status_persistence_file_path = '.rspec_status'

spec/support/callable/filters.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# frozen_string_literal: true
2+
3+
module ActiveTruthy
4+
def self.call = true
5+
end
6+
7+
module ActiveFalsey
8+
def self.call = false
9+
end
10+
11+
module NumbersAvailable
12+
def self.call = %w[1 2]
13+
end

0 commit comments

Comments
 (0)