philter 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/LICENSE +0 -0
- data/README.md +118 -81
- data/lib/philter.rb +0 -0
- data/lib/philter/array.rb +0 -0
- data/lib/philter/base.rb +0 -0
- data/lib/philter/evaluation.rb +0 -0
- data/lib/philter/search.rb +3 -3
- data/lib/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9183df24657072d824e87e57a0e1b107bdc08811
|
4
|
+
data.tar.gz: c5a611ae4aedb57e1109cee5eb1d6b50f27742af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0f0f4ef91025e5e799355c1a18191437a292920d8e19918cb95db3bf328ee8bbbc820bd3694128dbd83f51409897aab3bb6d7cb070eb74f976539b42395a0d6c
|
7
|
+
data.tar.gz: a7bbd89b07fe880eee3e47235e7a9c9dd0ae548330c24244bb95fe1375c74a7c6f013b16bdf7e620564e5ab7406f8d3c8a1a88e74d3b54d507161287e35ddfae
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
v1.2.0 [☰](https://github.com/marcomd/Philter/compare/v1.1.0...v1.2.0) March 29th, 2017
|
2
|
+
------------------------------
|
3
|
+
* Fixed the behaviour when passed a "get" argument to get an attribute which is also an item attribute. For example: with "get: :size" was returned the size of the item but if that item had an attribute "size" you want to get that attribute in the most cases so now it takes precedence.
|
4
|
+
This is not considered a bug so i released a new version.
|
5
|
+
|
1
6
|
v1.1.0 [☰](https://github.com/marcomd/Philter/compare/v1.0.0...v1.1.0) May 26th, 2016
|
2
7
|
------------------------------
|
3
8
|
* Added debug mode to unit tests
|
data/LICENSE
CHANGED
File without changes
|
data/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
![](/assets/logo.png)
|
2
|
+
|
2
3
|
## It helps your life and without weighing too much on global warming
|
3
4
|
### Sometimes it help you to filter some arrays
|
4
5
|
|
@@ -6,30 +7,35 @@
|
|
6
7
|
[![Travis CI ](http://img.shields.io/travis/marcomd/Philter/master.svg) ](https://travis-ci.org/marcomd/Philter)
|
7
8
|
[![Quality ](http://img.shields.io/codeclimate/github/marcomd/Philter.svg)](https://codeclimate.com/github/marcomd/Philter)
|
8
9
|
|
9
|
-
|
10
|
-
It's short and dynamic which helps to increase the readability.
|
11
|
-
Its trace is a usefull tool for teachers.
|
12
|
-
Performance it's not its field, see the section below.
|
10
|
+
Filter any kind of array with the power of ruby, with ease and :smile:
|
13
11
|
|
12
|
+
It's short, dynamic and readable. Its trace is a usefull tool for teachers.
|
14
13
|
|
15
|
-
|
14
|
+
The performance is inversely proportional to the comfort although efficiency is improved in the latest versions. See the section below.
|
16
15
|
|
17
16
|
```ruby
|
18
17
|
require 'philter'
|
19
18
|
|
20
|
-
#
|
19
|
+
# You can use everything to filter
|
20
|
+
# ...single value
|
21
21
|
[1,2,3].philter 1
|
22
22
|
=> [1]
|
23
23
|
|
24
|
+
# ...array of values
|
24
25
|
[1,2,3].philter [2,3]
|
25
26
|
=> [2,3]
|
26
27
|
|
28
|
+
# ...operators
|
27
29
|
[1,2,3].philter '<= 2'
|
28
30
|
=> [1,2]
|
29
31
|
|
30
32
|
[1,2,3].philter '!= 2'
|
31
33
|
=> [1,3]
|
32
34
|
|
35
|
+
# ...range
|
36
|
+
[1,2,3,4,5].philter 2..4
|
37
|
+
=> [2, 3, 4]
|
38
|
+
|
33
39
|
%w[red green blue].philter 'red'
|
34
40
|
=> ["red"]
|
35
41
|
|
@@ -37,88 +43,92 @@ require 'philter'
|
|
37
43
|
=> ["red", "blue"]
|
38
44
|
|
39
45
|
# You can pass a block
|
40
|
-
[1,2,3].philter([1,2]){|e|e*2}
|
46
|
+
[1,2,3].philter([1,2]) { |e| e*2 }
|
41
47
|
=> [2, 4]
|
48
|
+
```
|
49
|
+
|
50
|
+
Things get more interesting with array of hashes or objects :yum:
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
people = [{ id: 1, name: 'Mark', email: 'mark@gmail.com' },
|
54
|
+
{ id: 2, name: 'Larry', email: 'larry@gmail.com' },
|
55
|
+
{ id: 3, name: 'Bill', email: 'bill@live.com' }
|
56
|
+
]
|
57
|
+
|
58
|
+
people.philter id: 1
|
59
|
+
=> [{:id=>1, :name=>"Mark", :email=>"mark@gmail.com"}]
|
60
|
+
|
61
|
+
people.philter id: [1,3]
|
62
|
+
=> [{:id=>1, :name=>"Mark", :email=>"mark@gmail.com"}, {:id=>3, :name=>"Bill", :email=>"bill@live.com"}]
|
42
63
|
|
43
|
-
|
44
|
-
[
|
45
|
-
{id: 1, name: 'Mark' },
|
46
|
-
{id: 2, name: 'Larry' }
|
47
|
-
].philter id: 1
|
48
|
-
=> [{:id=>1, :name=>"Mark"}]
|
49
|
-
|
50
|
-
[
|
51
|
-
{id: 1, name: 'Mark' },
|
52
|
-
{id: 2, name: 'Larry' },
|
53
|
-
{id: 3, name: 'Bill' }
|
54
|
-
].philter id: [1,3]
|
55
|
-
=> [{:id=>1, :name=>"Mark"}, {:id=>3, :name=>"Bill"}]
|
56
|
-
|
57
|
-
[
|
58
|
-
{id: 1, name: 'Mark' },
|
59
|
-
{id: 2, name: 'Larry' },
|
60
|
-
{id: 3, name: 'Bill' }
|
61
|
-
].philter id: '>2'
|
62
|
-
=> [{:id=>3, :name=>"Bill"}]
|
64
|
+
people.philter id: '>2'
|
65
|
+
=> [{:id=>3, :name=>"Bill", :email=>"bill@live.com"}]
|
63
66
|
|
64
67
|
# Regular expression
|
65
|
-
|
66
|
-
{id
|
67
|
-
{id: 2, name: 'Larry', email: 'larry@gmail.com' },
|
68
|
-
{id: 3, name: 'Bill', email: 'bill@live.com' }
|
69
|
-
].philter email: /@gmail/
|
70
|
-
=> [{:id=>1, :name=>"Mark", :email=>"mark@gmail.com"}, {:id=>2, :name=>"Larry",:email=>"larry@gmail.com"}]
|
68
|
+
people.philter email: /@gmail/
|
69
|
+
=> [{:id=>1, :name=>"Mark", :email=>"mark@gmail.com"}, {:id=>2, :name=>"Larry", :email=>"larry@gmail.com"}]
|
71
70
|
|
72
71
|
# Select attributes
|
73
|
-
|
74
|
-
{id: 1, name: 'Mark', email: 'mark@gmail.com' },
|
75
|
-
{id: 2, name: 'Larry', email: 'larry@gmail.com' },
|
76
|
-
{id: 3, name: 'Bill', email: 'bill@live.com' }
|
77
|
-
].philter({email: /@gmail/}, get: :name)
|
72
|
+
people.philter({ email: /@gmail/ }, get: :name)
|
78
73
|
=> ["Mark", "Larry"]
|
79
74
|
|
80
75
|
# Philter with more attributes -and-
|
81
|
-
|
82
|
-
{id: 1, name: 'Mark', email: 'mark@gmail.com' },
|
83
|
-
{id: 2, name: 'Larry', email: 'larry@gmail.com' },
|
84
|
-
{id: 3, name: 'Bill', email: 'bill@live.com' }
|
85
|
-
].philter name: /M.+/, email: /@gmail/
|
76
|
+
people.philter name: /M.+/, email: /@gmail/
|
86
77
|
=> [{:id=>1, :name=>"Mark", :email=>"mark@gmail.com"}]
|
87
78
|
|
88
79
|
# Philter with more attributes -or-
|
89
|
-
|
90
|
-
{id: 1, name: 'Mark', email: 'mark@gmail.com' },
|
91
|
-
{id: 2, name: 'Larry', email: 'larry@gmail.com' },
|
92
|
-
{id: 3, name: 'Bill', email: 'bill@live.com' }
|
93
|
-
].philter({name: /M.+/, email: /@live/}, or: true)
|
80
|
+
people.philter({ name: /M.+/, email: /@live/ }, or: true)
|
94
81
|
=> [{:id=>1, :name=>"Mark", :email=>"mark@gmail.com"}, {:id=>3, :name=>"Bill", :email=>"bill@live.com"}]
|
82
|
+
```
|
83
|
+
|
84
|
+
To me the power! :godmode:
|
95
85
|
|
96
|
-
|
86
|
+
```ruby
|
97
87
|
# Select and update attributes
|
98
|
-
|
99
|
-
{
|
100
|
-
{id: 2, name: 'Larry', email: 'larry@gmail.com' },
|
101
|
-
{id: 3, name: 'Bill', email: 'bill@live.com' }
|
102
|
-
].philter({email: /@gmail/}){|e| e[:name] << ' use gmail!'}
|
88
|
+
regexp = /gmail/
|
89
|
+
people.philter(email: regexp) { |e| "#{e[:name]} use #{e[:email].match(regexp)}!"}
|
103
90
|
=> ["Mark use gmail!", "Larry use gmail!"]
|
104
91
|
|
105
92
|
# Add attributes
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
].philter({email: /@gmail/}){|e| e[:surname] = 'unknown';e }
|
93
|
+
people.philter(email: /@gmail/) do |e|
|
94
|
+
e[:filtered] = true
|
95
|
+
e
|
96
|
+
end
|
111
97
|
=> :try_yourself
|
112
98
|
```
|
113
99
|
|
100
|
+
|
101
|
+
Remember how to pass arguments:
|
102
|
+
|
103
|
+
```ruby
|
104
|
+
people.philter { ...filters... }, { ...options... }
|
105
|
+
|
106
|
+
# YES
|
107
|
+
[1,2,3].philter '<= 2', debug: true
|
108
|
+
people.philter({ id: 1 }, debug: true)
|
109
|
+
|
110
|
+
# NO (debug is not an attribute to filter but an option)
|
111
|
+
people.philter(id: 1, debug: true)
|
112
|
+
```
|
113
|
+
|
114
|
+
|
114
115
|
Get the trace with the option `debug: true`
|
115
116
|
|
116
117
|
```ruby
|
117
|
-
[
|
118
|
-
|
119
|
-
|
120
|
-
|
118
|
+
[1,2,3].philter '<= 2', debug: true
|
119
|
+
--------------- Start debugging philter 1.1.0 -------------
|
120
|
+
Search by String: <= 2 with operator
|
121
|
+
item Fixnum 1
|
122
|
+
item <= value | 1 <= 2 => x
|
123
|
+
item Fixnum 2
|
124
|
+
item <= value | 2 <= 2 => x
|
125
|
+
item Fixnum 3
|
126
|
+
item <= value | 3 <= 2
|
127
|
+
--------------- End debugging philter 1.1.0 ---------------
|
128
|
+
2 item(s) found
|
129
|
+
=> [1, 2]
|
121
130
|
|
131
|
+
people.philter({ name: 'Mark', email: /\A.+gmail/ }, debug: true)
|
122
132
|
--------------- Start debugging philter 1.1.0 ---------------
|
123
133
|
Search by Hash:
|
124
134
|
|
@@ -152,7 +162,7 @@ Get the trace with the option `debug: true`
|
|
152
162
|
|
153
163
|
### Rails
|
154
164
|
|
155
|
-
Rails return relation objects that must be turned to array
|
165
|
+
Rails return relation objects that must be turned to array
|
156
166
|
|
157
167
|
```ruby
|
158
168
|
cities = City.all.to_a
|
@@ -166,8 +176,8 @@ cities.philter code: 'PA'
|
|
166
176
|
=> [#<City id: 4, name: "Palermo", code: "PA", region: "Sicilia", created_at: "2016-05-10 09:08:13", updated_at: "2016-05-10 09:08:13">]
|
167
177
|
|
168
178
|
# Pass a block to select, update or change the result
|
169
|
-
cities.philter(region: /\Alomb/i){|city| "#{city.name}-#{city.code}"}
|
170
|
-
=> ["Milano-MI", "Lecco-LC", "Pavia-PV", "Piacenza-PC"]
|
179
|
+
cities.philter(region: /\Alomb/i) { |city| "#{city.name}-#{city.code}" }
|
180
|
+
=> ["Milano-MI", "Lecco-LC", "Pavia-PV", "Piacenza-PC", ... [cut]
|
171
181
|
|
172
182
|
```
|
173
183
|
|
@@ -180,7 +190,7 @@ Ruby 2.2.3p173 on windows 7 with i5 3570K Ivy Bridge @4200 Mhz Ram 16Gb 10-10-10
|
|
180
190
|
require 'benchmark'
|
181
191
|
require 'philter'
|
182
192
|
|
183
|
-
ar_test = 100.times.map{|n| n}
|
193
|
+
ar_test = 100.times.map { |n| n }
|
184
194
|
Benchmark.bmbm do |x|
|
185
195
|
x.report("philter: ") { 10_000.times { ar_test.philter 1 } }
|
186
196
|
x.report("grep: ") { 10_000.times { ar_test.grep 1 } }
|
@@ -220,7 +230,7 @@ grep: 0.172000 0.000000 0.172000 ( 0.182490)
|
|
220
230
|
ar_search = [1,3,5,7]
|
221
231
|
Benchmark.bmbm do |x|
|
222
232
|
x.report("philter: ") { 10_000.times { ar_test.philter ar_search } }
|
223
|
-
x.report("select: ") { 10_000.times { ar_test.select{|item| ar_search.include?
|
233
|
+
x.report("select: ") { 10_000.times { ar_test.select { |item| ar_search.include?(item) } } }
|
224
234
|
end
|
225
235
|
|
226
236
|
#version 1.0.0
|
@@ -236,8 +246,8 @@ select: 0.078000 0.000000 0.078000 ( 0.073341)
|
|
236
246
|
|
237
247
|
```ruby
|
238
248
|
Benchmark.bmbm do |x|
|
239
|
-
x.report("philter: ") { 1_000.times { ar_test.philter '< 50'
|
240
|
-
x.report("select: ") { 1_000.times { ar_test.select {|item| item < 50} } }
|
249
|
+
x.report("philter: ") { 1_000.times { ar_test.philter '< 50' } }
|
250
|
+
x.report("select: ") { 1_000.times { ar_test.select { |item| item < 50 } } }
|
241
251
|
end
|
242
252
|
|
243
253
|
#version 1.0.0
|
@@ -251,14 +261,37 @@ philter: 3.744000 0.000000 3.744000 ( 3.746851)
|
|
251
261
|
select: 0.016000 0.000000 0.016000 ( 0.004338)
|
252
262
|
```
|
253
263
|
|
264
|
+
Strings
|
265
|
+
|
254
266
|
```ruby
|
255
|
-
|
256
|
-
|
257
|
-
|
267
|
+
require 'benchmark'
|
268
|
+
require 'philter'
|
269
|
+
ar_test = %w(black white grey red green blue yellow orange pink purple violet)
|
270
|
+
ar_search = %w(red green blue)
|
271
|
+
Benchmark.bmbm do |x|
|
272
|
+
x.report("philter: ") { 10_000.times { ar_test.philter ar_search } }
|
273
|
+
x.report("select: ") { 10_000.times { ar_test.select { |item| ar_search.include? item } } }
|
274
|
+
end
|
275
|
+
|
276
|
+
#version 1.0.0
|
277
|
+
user system total real
|
278
|
+
philter: 0.063000 0.000000 0.063000 ( 0.062890)
|
279
|
+
select: 0.015000 0.000000 0.015000 ( 0.011407)
|
280
|
+
|
281
|
+
#version 0.7.0
|
282
|
+
user system total real
|
283
|
+
philter: 7.363000 0.000000 7.363000 ( 7.359162)
|
284
|
+
select: 0.000000 0.000000 0.000000 ( 0.011539)
|
285
|
+
```
|
286
|
+
|
287
|
+
```ruby
|
288
|
+
ar_test = [ { id: 1, name: 'Mark', email: 'mark@gmail.com' },
|
289
|
+
{ id: 2, name: 'Bill', email: 'bill@live.com' },
|
290
|
+
{ id: 3, name: 'Larry', email: 'larry@gmail.com' }]
|
258
291
|
regexp = /\A.+gmail/
|
259
292
|
Benchmark.bmbm do |x|
|
260
293
|
x.report("philter: ") { 10_000.times { ar_test.philter email: regexp } }
|
261
|
-
x.report("select: ") { 10_000.times { ar_test.select {|item| item[:email] =~ regexp} } }
|
294
|
+
x.report("select: ") { 10_000.times { ar_test.select { |item| item[:email] =~ regexp } } }
|
262
295
|
end
|
263
296
|
|
264
297
|
#version 1.0.0
|
@@ -272,9 +305,13 @@ philter: 0.468000 0.000000 0.468000 ( 0.473782)
|
|
272
305
|
select: 0.000000 0.000000 0.000000 ( 0.003429)
|
273
306
|
```
|
274
307
|
|
308
|
+
|
309
|
+
|
275
310
|
## Compatibility
|
276
311
|
|
277
|
-
Ruby `1
|
312
|
+
Ruby `2.1+`
|
313
|
+
|
314
|
+
Ruby `1.9+` has been tested up to `v1.2.0`
|
278
315
|
|
279
316
|
## Install
|
280
317
|
|
@@ -286,7 +323,7 @@ To use it in a bundle, add to gem file `gem 'philter'` and run `bundle install`
|
|
286
323
|
|
287
324
|
- [x] Add boolean operator to chain of conditions `v1.0.0`
|
288
325
|
- [x] Improve performance keeping the operations's trace `v1.0.0`
|
289
|
-
- [x] Add
|
326
|
+
- [x] Add blocks `v1.0.0`
|
290
327
|
- [ ] Increase performance further
|
291
328
|
|
292
329
|
## Contributing
|
@@ -299,7 +336,7 @@ To use it in a bundle, add to gem file `gem 'philter'` and run `bundle install`
|
|
299
336
|
|
300
337
|
## Testing
|
301
338
|
|
302
|
-
Wide coverage with `
|
339
|
+
Wide coverage with `39 unit tests` and `155 assertions`
|
303
340
|
|
304
341
|
To test locally install the development requirements
|
305
342
|
|
@@ -307,11 +344,11 @@ To test locally install the development requirements
|
|
307
344
|
|
308
345
|
Then execute
|
309
346
|
|
310
|
-
bundle exec ruby test
|
347
|
+
bundle exec ruby test/unit_test.rb
|
311
348
|
|
312
349
|
Performance tests are calibrated to not exceed 1.2 seconds on my pc with a tolerance become 2 seconds:
|
313
350
|
|
314
|
-
bundle exec ruby test
|
351
|
+
bundle exec ruby test/performance_test.rb
|
315
352
|
|
316
353
|
```
|
317
354
|
Loaded suite test/performance_test
|
@@ -330,7 +367,7 @@ Finished in 8.505 seconds.
|
|
330
367
|
|
331
368
|
If you have a very slow pc it could not pass. In this case you can pass a higher tolerance value as argument, for example 3 seconds:
|
332
369
|
|
333
|
-
bundle exec ruby test
|
370
|
+
bundle exec ruby test/performance_test.rb 3.0
|
334
371
|
|
335
372
|
## Found a bug?
|
336
373
|
|
data/lib/philter.rb
CHANGED
File without changes
|
data/lib/philter/array.rb
CHANGED
File without changes
|
data/lib/philter/base.rb
CHANGED
File without changes
|
data/lib/philter/evaluation.rb
CHANGED
File without changes
|
data/lib/philter/search.rb
CHANGED
@@ -92,10 +92,10 @@ module Philter
|
|
92
92
|
|
93
93
|
next unless selected
|
94
94
|
results <<
|
95
|
-
if options[:get] && item.respond_to?(
|
96
|
-
item.send options[:get]
|
97
|
-
elsif options[:get] && item.respond_to?('[]')
|
95
|
+
if options[:get] && item.respond_to?('[]')
|
98
96
|
item[options[:get]]
|
97
|
+
elsif options[:get] && item.respond_to?(options[:get])
|
98
|
+
item.send options[:get]
|
99
99
|
else
|
100
100
|
item
|
101
101
|
end
|
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: philter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marco Mastrodonato
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-03-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: test-unit
|
@@ -53,7 +53,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
53
53
|
requirements:
|
54
54
|
- - ">="
|
55
55
|
- !ruby/object:Gem::Version
|
56
|
-
version: 1
|
56
|
+
version: '2.1'
|
57
57
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
@@ -62,7 +62,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
62
62
|
requirements:
|
63
63
|
- The brave to dare
|
64
64
|
rubyforge_project:
|
65
|
-
rubygems_version: 2.
|
65
|
+
rubygems_version: 2.6.10
|
66
66
|
signing_key:
|
67
67
|
specification_version: 4
|
68
68
|
summary: Filter arrays with pleasure
|