philtre 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +6 -3
- data/AUTHORS +2 -0
- data/History.txt +7 -0
- data/README.md +10 -7
- data/lib/philtre/filter.rb +16 -4
- data/lib/philtre/grinder.rb +5 -1
- data/lib/philtre/predicate_splitter.rb +1 -1
- data/lib/philtre/predicates.rb +9 -4
- data/lib/philtre/sequel_extensions.rb +14 -12
- data/lib/philtre/version.rb +1 -1
- data/philtre.gemspec +0 -2
- data/spec/dataset_spec.rb +26 -21
- data/spec/filter_spec.rb +35 -10
- data/spec/grinder_spec.rb +5 -6
- data/spec/predicate_splitter_spec.rb +25 -5
- data/spec/spec_helper.rb +14 -0
- data/tasks/console.rake +1 -1
- metadata +7 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c75bbf7d7dfed6ed3cd5afb6f4477f48b613e8e2
|
4
|
+
data.tar.gz: 8d4dd4dc4075865c44baa7872a03ff6dbf21fed1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dcb1f7273340067c4d12faa431406a8b1f9f8658730d1516cdb1bf9568b95033f71e6631c497c6dcef1854193cecba2d18754a06406e5546cc0cff41cedd975d
|
7
|
+
data.tar.gz: 057199f52f8ec5b894020acb67e618ccfe952e450b374e8e29d68163e587ba8aa756376d8f5ba11e0bc3961634968a2fa273db3ac142d7df9b9dc4600f7179b1
|
data/.travis.yml
CHANGED
data/AUTHORS
ADDED
data/History.txt
ADDED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# philtre [![Gem Version](https://badge.fury.io/rb/philtre.
|
1
|
+
# philtre [![Gem Version](https://badge.fury.io/rb/philtre.svg)](http://badge.fury.io/rb/philtre) [![Build Status](https://travis-ci.org/djellemah/philtre.svg?branch=master)](https://travis-ci.org/djellemah/philtre)
|
2
2
|
|
3
3
|
It's the [Sequel](http://sequel.jeremyevans.net) equivalent for Ransack, Metasearch, Searchlogic. If
|
4
4
|
this doesn't make you fall in love, I don't know what will :-p
|
@@ -75,6 +75,8 @@ There are a range of predefined predicates, mostly borrowed from the other searc
|
|
75
75
|
not_blank
|
76
76
|
like_all
|
77
77
|
like_any
|
78
|
+
null
|
79
|
+
not_null
|
78
80
|
```
|
79
81
|
|
80
82
|
## Custom Predicates
|
@@ -104,8 +106,8 @@ Now you can pass the filter_parameter hash ```{tagged_by_id: 45}```.
|
|
104
106
|
|
105
107
|
The result of a predicate block should be a ```Sequel::SQL::Expression``` (ie
|
106
108
|
one of Sequel's hash expressions in the simplest case) which will work instead
|
107
|
-
of its named placeholder.
|
108
|
-
clause it
|
109
|
+
of its named placeholder. So for example, if the placeholder is inside a SELECT
|
110
|
+
clause it wouldn't work to give it an ORDER BY expression.
|
109
111
|
|
110
112
|
2) You could also inherit from ```Philtre::Filter``` and override
|
111
113
|
```#predicates```. And optionally override ```Philtre.new``` (which is just a
|
@@ -163,7 +165,7 @@ is canonical in that all the other possibilities use it.
|
|
163
165
|
|
164
166
|
## Highly Advanced Usage
|
165
167
|
|
166
|
-
Sometimes method chaining gets ugly. So you can say
|
168
|
+
Sometimes method chaining gets ugly. So you can install gem ripar, then you can say
|
167
169
|
|
168
170
|
``` ruby
|
169
171
|
store_id_range = 20..90
|
@@ -174,9 +176,10 @@ Sometimes method chaining gets ugly. So you can say
|
|
174
176
|
end
|
175
177
|
```
|
176
178
|
|
177
|
-
Notice that values outside the block are accessible inside, _without_
|
178
|
-
|
179
|
-
the binding lookup, so may result in errors that
|
179
|
+
Notice that values outside the block are accessible inside, _without_ the need
|
180
|
+
for a block parameter. This uses [Ripar](https://github.com/djellemah/ripar/)
|
181
|
+
under the cover and indirects the binding lookup, so may result in errors that
|
182
|
+
you won't expect.
|
180
183
|
|
181
184
|
## Specs
|
182
185
|
|
data/lib/philtre/filter.rb
CHANGED
@@ -28,11 +28,12 @@ module Philtre
|
|
28
28
|
def initialize( filter_parameters = nil, &custom_predicate_block )
|
29
29
|
# This must be a new instance of Hash, because sometimes
|
30
30
|
# HashWithIndifferentAccess is passed in, which breaks things in here.
|
31
|
+
|
31
32
|
# Don't use symbolize_keys because that creates a dependency on ActiveSupport
|
33
|
+
# have to iterate anyway to convert keys to symbols
|
32
34
|
@filter_parameters =
|
33
35
|
if filter_parameters
|
34
|
-
|
35
|
-
filter_parameters.inject({}){|ha,(k,v)| ha[k.to_sym] = v; ha}
|
36
|
+
filter_parameters.each_with_object(Hash.new){|(k,v),ha| ha[k.to_sym] = v}
|
36
37
|
else
|
37
38
|
{}
|
38
39
|
end
|
@@ -67,12 +68,22 @@ module Philtre
|
|
67
68
|
|
68
69
|
alias apply call
|
69
70
|
|
71
|
+
# called by valued_parameters to generate the set of expressions. This
|
72
|
+
# returns true for a value that show up in the set of expressions, false
|
73
|
+
# otherwise.
|
74
|
+
#
|
75
|
+
# Intended to be overridden if necessary.
|
76
|
+
def valued_parameter?( key, value )
|
77
|
+
value.is_a?(Array) || !value.blank?
|
78
|
+
end
|
79
|
+
|
70
80
|
# Values in the parameter list which are not blank, and not
|
71
81
|
# an ordering. That is, parameters which will be used to generate
|
72
82
|
# the filter expression.
|
73
83
|
def valued_parameters
|
74
|
-
filter_parameters.select do |key,value|
|
75
|
-
|
84
|
+
@valued_parameters ||= filter_parameters.select do |key,value|
|
85
|
+
# :order is special, it must always be excluded
|
86
|
+
key.to_sym != :order && valued_parameter?(key,value)
|
76
87
|
end
|
77
88
|
end
|
78
89
|
|
@@ -164,6 +175,7 @@ module Philtre
|
|
164
175
|
@order_expressions = nil
|
165
176
|
@order_hash = nil
|
166
177
|
@order_clause = nil
|
178
|
+
@valued_parameters = nil
|
167
179
|
end
|
168
180
|
|
169
181
|
def clone( extra_parameters = {} )
|
data/lib/philtre/grinder.rb
CHANGED
@@ -17,7 +17,7 @@ module Philtre
|
|
17
17
|
# split suffix from the key and store the two values as name and op
|
18
18
|
# return truthy if successful
|
19
19
|
def split_key( suffix )
|
20
|
-
rv = @key =~
|
20
|
+
rv = @key =~ /\A(?:(.*?)_)?(#{suffix})\z/
|
21
21
|
@field, @op = $1, $2
|
22
22
|
rv
|
23
23
|
end
|
data/lib/philtre/predicates.rb
CHANGED
@@ -60,12 +60,15 @@ module Philtre
|
|
60
60
|
alias [] call
|
61
61
|
|
62
62
|
def predicate_names
|
63
|
-
|
63
|
+
# ruby-2.3 no longer stores methods in order of definition. So sort by
|
64
|
+
# longest so that we don't get false positives from shorter predicates
|
65
|
+
# that are substrings of longer predicates, eg blank matching
|
66
|
+
# thing_not_blank.
|
67
|
+
DefaultPredicates.instance_methods.sort_by{|name| -name.length}
|
64
68
|
end
|
65
69
|
|
66
70
|
# Define the set of default predicates.
|
67
71
|
DefaultPredicates = PredicateDsl.new do
|
68
|
-
# longer suffixes first, so they match first in define_name_predicate
|
69
72
|
not_eq {|expr, val| ~Sequel.expr( expr => val) }
|
70
73
|
|
71
74
|
def not_like( expr, val )
|
@@ -78,13 +81,15 @@ module Philtre
|
|
78
81
|
Sequel.~(blank expr, val)
|
79
82
|
end
|
80
83
|
|
84
|
+
null {|expr,_| Sequel.expr(expr => nil)}
|
85
|
+
not_null {|expr,_| Sequel.~(Sequel.expr(expr => nil))}
|
86
|
+
|
81
87
|
def blank(expr, _)
|
82
88
|
is_nil = Sequel.expr(expr => nil)
|
83
89
|
is_empty = Sequel.expr(expr => '')
|
84
90
|
Sequel.| is_nil, is_empty
|
85
91
|
end
|
86
92
|
|
87
|
-
# and now the shorter suffixes
|
88
93
|
eq {|expr, val| Sequel.expr( expr => val) }
|
89
94
|
gt {|expr, val| expr > val }
|
90
95
|
gte( :gteq ) {|expr, val| expr >= val }
|
@@ -103,7 +108,7 @@ module Philtre
|
|
103
108
|
end
|
104
109
|
end
|
105
110
|
|
106
|
-
# make
|
111
|
+
# make them available to Predicate instances.
|
107
112
|
include DefaultPredicates
|
108
113
|
end
|
109
114
|
end
|
@@ -1,19 +1,21 @@
|
|
1
1
|
# TODO docs for this
|
2
|
-
|
3
|
-
|
2
|
+
if defined? Ripar
|
3
|
+
class Sequel::Dataset
|
4
|
+
include Ripar
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
# make the roller understand dataset method
|
7
|
+
def roller
|
8
|
+
rv = super
|
9
|
+
class << rv
|
10
|
+
def to_dataset; riven end
|
11
|
+
end
|
12
|
+
rv
|
10
13
|
end
|
11
|
-
rv
|
12
|
-
end
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
# roll the block and return the resulting dataset immediately
|
16
|
+
def rolled( &blk )
|
17
|
+
roller.rive &blk
|
18
|
+
end
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
data/lib/philtre/version.rb
CHANGED
data/philtre.gemspec
CHANGED
@@ -20,11 +20,9 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_dependency 'sequel'
|
22
22
|
spec.add_dependency 'fastandand'
|
23
|
-
spec.add_dependency 'ripar', '~> 0.0.3'
|
24
23
|
|
25
24
|
spec.add_development_dependency 'bundler', '~> 1.5'
|
26
25
|
spec.add_development_dependency 'rake'
|
27
26
|
spec.add_development_dependency 'rspec'
|
28
27
|
spec.add_development_dependency 'faker'
|
29
|
-
spec.add_development_dependency 'sqlite3'
|
30
28
|
end
|
data/spec/dataset_spec.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
|
2
|
-
require 'faker'
|
3
|
-
require 'sequel'
|
1
|
+
require_relative 'spec_helper.rb'
|
4
2
|
|
5
3
|
require_relative '../lib/philtre/grinder.rb'
|
6
4
|
require_relative '../lib/philtre/sequel_extensions.rb'
|
@@ -29,29 +27,36 @@ describe Sequel::Dataset do
|
|
29
27
|
|
30
28
|
it 'passes apply_unknown'
|
31
29
|
|
32
|
-
describe '
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
30
|
+
describe 'fancy stuff' do
|
31
|
+
|
32
|
+
describe '#roller' do
|
33
|
+
it 'result has to_dataset' do
|
34
|
+
pending "Ripar optionally not loaded" unless defined? Ripar
|
35
|
+
|
36
|
+
rlr = subject.roller do
|
37
|
+
where title: 'Exalted Fromaginess'
|
38
|
+
end
|
37
39
|
|
38
|
-
|
39
|
-
|
40
|
-
|
40
|
+
# This depends on Ripar, so it's a bit fragile
|
41
|
+
rlr.should respond_to(:__class__)
|
42
|
+
rlr.__class__.should == Ripar::Roller
|
41
43
|
|
42
|
-
|
43
|
-
|
44
|
+
rlr.should_not respond_to(:datset)
|
45
|
+
rlr.should respond_to(:to_dataset)
|
46
|
+
end
|
44
47
|
end
|
45
|
-
end
|
46
48
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
49
|
+
describe '#rolled' do
|
50
|
+
it 'gives back a rolled dataset' do
|
51
|
+
pending "Ripar optionally not loaded" unless defined? Ripar
|
52
|
+
|
53
|
+
rlr = subject.rolled do
|
54
|
+
where title: 'Exalted Fromaginess'
|
55
|
+
end
|
56
|
+
rlr.should be_a(Sequel::Dataset)
|
57
|
+
rlr.should_not respond_to(:datset)
|
58
|
+
rlr.should_not respond_to(:to_dataset)
|
51
59
|
end
|
52
|
-
rlr.should be_a(Sequel::Dataset)
|
53
|
-
rlr.should_not respond_to(:datset)
|
54
|
-
rlr.should_not respond_to(:to_dataset)
|
55
60
|
end
|
56
61
|
end
|
57
62
|
end
|
data/spec/filter_spec.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
|
2
|
-
require 'faker'
|
3
|
-
|
1
|
+
require_relative 'spec_helper.rb'
|
4
2
|
require_relative '../lib/philtre/filter.rb'
|
5
3
|
|
6
4
|
# for blank?
|
@@ -114,7 +112,7 @@ describe Philtre::Filter do
|
|
114
112
|
@dataset.order( *filter.order_clause ).sql.should =~ /order by things desc$/i
|
115
113
|
end
|
116
114
|
|
117
|
-
it '
|
115
|
+
it 'respects asc' do
|
118
116
|
filter = described_class.new one: 1, two: 2, order: 'things_desc'
|
119
117
|
@dataset.order( *filter.order_clause ).sql.should =~ /order by things desc$/i
|
120
118
|
end
|
@@ -131,7 +129,7 @@ describe Philtre::Filter do
|
|
131
129
|
end
|
132
130
|
|
133
131
|
describe '#predicates' do
|
134
|
-
EASY_PREDICATES = %i[gt gte gteq lt lte lteq eq not_eq matches like not_like]
|
132
|
+
EASY_PREDICATES = %i[gt gte gteq lt lte lteq eq not_eq matches like not_like not_null null]
|
135
133
|
TRICKY_PREDICATES = %i[like_all like_any not_blank blank]
|
136
134
|
|
137
135
|
it 'creates predicates' do
|
@@ -201,17 +199,34 @@ describe Philtre::Filter do
|
|
201
199
|
end
|
202
200
|
|
203
201
|
it 'not_blank' do
|
204
|
-
field =
|
202
|
+
field = Faker::Lorem.word
|
205
203
|
expr = described_class.predicates.call :"#{field}_not_blank", Faker::Lorem.word
|
206
204
|
|
207
205
|
expr.op.should == :AND
|
206
|
+
is_not_null, not_equals_empty = expr.args
|
208
207
|
|
209
208
|
# the not-nil part
|
210
|
-
|
209
|
+
is_not_null.op.should == :'IS NOT'
|
211
210
|
|
212
211
|
# the not empty string part
|
213
|
-
|
214
|
-
|
212
|
+
not_equals_empty.op.should == :'!='
|
213
|
+
not_equals_empty.args.last.should == ''
|
214
|
+
end
|
215
|
+
|
216
|
+
it 'blank' do
|
217
|
+
field = Faker::Lorem.word
|
218
|
+
expr = described_class.predicates.call :"#{field}_blank", Faker::Lorem.word
|
219
|
+
|
220
|
+
expr.op.should == :OR
|
221
|
+
|
222
|
+
is_null, equals_empty = expr.args
|
223
|
+
|
224
|
+
# the null part
|
225
|
+
is_null.op.should == :'IS'
|
226
|
+
|
227
|
+
# the empty string part
|
228
|
+
equals_empty.op.should == :'='
|
229
|
+
equals_empty.args.last.should == ''
|
215
230
|
end
|
216
231
|
end
|
217
232
|
|
@@ -406,11 +421,21 @@ describe Philtre::Filter do
|
|
406
421
|
sql.should =~ /select \* from planks where \(title = '\w+'\)$/i
|
407
422
|
end
|
408
423
|
|
409
|
-
it 'excludes nil values' do
|
424
|
+
it 'excludes nil values by default' do
|
410
425
|
filter.filter_parameters[:name] = nil
|
411
426
|
sql = filter.apply(@dataset).sql
|
412
427
|
sql.should =~ /select \* from planks where \(title = '\w+'\)$/i
|
413
428
|
end
|
429
|
+
|
430
|
+
it 'can customise value exclusion' do
|
431
|
+
def filter.valued_parameter?(key,value)
|
432
|
+
key != :order
|
433
|
+
end
|
434
|
+
|
435
|
+
filter.filter_parameters[:name] = nil
|
436
|
+
sql = filter.apply(@dataset).sql
|
437
|
+
sql.should =~ /SELECT \* FROM planks WHERE \(\(name IS NULL\) AND \(title = '\w+'\)\)/
|
438
|
+
end
|
414
439
|
end
|
415
440
|
|
416
441
|
describe '#empty?' do
|
data/spec/grinder_spec.rb
CHANGED
@@ -1,7 +1,4 @@
|
|
1
|
-
|
2
|
-
require 'faker'
|
3
|
-
require 'sequel'
|
4
|
-
require 'ripar'
|
1
|
+
require_relative 'spec_helper.rb'
|
5
2
|
|
6
3
|
require_relative '../lib/philtre.rb'
|
7
4
|
|
@@ -161,6 +158,8 @@ describe Philtre::Grinder do
|
|
161
158
|
end
|
162
159
|
|
163
160
|
it 'handles rollers' do
|
161
|
+
pending "Ripar optionally not loaded" unless defined? Ripar
|
162
|
+
|
164
163
|
grinder = Philtre::Grinder.new Philtre::Filter.new(person_id: 212728)
|
165
164
|
tds = ds.roller do
|
166
165
|
where linkage: other_ds.where( :person_id.lieu )
|
@@ -172,9 +171,9 @@ describe Philtre::Grinder do
|
|
172
171
|
end
|
173
172
|
|
174
173
|
it 'handles Models' do
|
175
|
-
Sequel::Model.db = Sequel.
|
174
|
+
Sequel::Model.db = Sequel.mock
|
176
175
|
class Ods < Sequel::Model(:ods); end
|
177
176
|
Philtre::Grinder.new( Philtre::Filter.new ).transform(Ods).should be_a(Sequel::Dataset)
|
178
|
-
Philtre::Grinder.new( Philtre::Filter.new ).transform(Ods).sql.should =~ /SELECT \* FROM
|
177
|
+
Philtre::Grinder.new( Philtre::Filter.new ).transform(Ods).sql.should =~ /SELECT \* FROM ods/
|
179
178
|
end
|
180
179
|
end
|
@@ -1,7 +1,6 @@
|
|
1
|
-
|
2
|
-
require 'faker'
|
3
|
-
|
1
|
+
require_relative 'spec_helper.rb'
|
4
2
|
require_relative '../lib/philtre/predicate_splitter.rb'
|
3
|
+
require_relative '../lib/philtre/predicates.rb'
|
5
4
|
|
6
5
|
# for blank?
|
7
6
|
Sequel.extension :blank
|
@@ -28,6 +27,7 @@ describe Philtre::PredicateSplitter do
|
|
28
27
|
|
29
28
|
describe 'unsuccessful' do
|
30
29
|
let(:splitter){ Philtre::PredicateSplitter.new 'birth_year', 'fifteeen' }
|
30
|
+
|
31
31
|
it 'returns false' do
|
32
32
|
splitter.split_key( :like ).should be_falsey
|
33
33
|
end
|
@@ -44,11 +44,31 @@ describe Philtre::PredicateSplitter do
|
|
44
44
|
end
|
45
45
|
|
46
46
|
describe 'custom predicate' do
|
47
|
-
|
48
|
-
|
47
|
+
it 'accepts the whole thing, undeterred by _' do
|
48
|
+
splitter = Philtre::PredicateSplitter.new 'custom_predicate', 'fifteeen'
|
49
49
|
(splitter === :custom_predicate).should === 0
|
50
50
|
end
|
51
51
|
end
|
52
|
+
|
53
|
+
describe "'ware the false matches, laddie" do
|
54
|
+
Philtre::Predicates::DefaultPredicates.instance_methods.each do |suffix|
|
55
|
+
word = Faker::Lorem.words(rand(1..3)) * '_'
|
56
|
+
|
57
|
+
let(:suffix){suffix}
|
58
|
+
let(:word){word}
|
59
|
+
|
60
|
+
it "#{word}#{suffix} unsplit" do
|
61
|
+
splitter = Philtre::PredicateSplitter.new "#{word}#{suffix}", 'blabla'
|
62
|
+
splitter.split_key(suffix).should be_falsey
|
63
|
+
end
|
64
|
+
|
65
|
+
it "#{word}_#{suffix} split" do
|
66
|
+
splitter = Philtre::PredicateSplitter.new "#{word}_#{suffix}", 'unbla'
|
67
|
+
splitter.split_key suffix
|
68
|
+
splitter.field.should == word.to_sym
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
52
72
|
end
|
53
73
|
end
|
54
74
|
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'faker'
|
3
|
+
require 'sequel'
|
4
|
+
|
5
|
+
# turn off the "old syntax" warnings
|
6
|
+
RSpec.configure do |config|
|
7
|
+
config.mock_with :rspec do |c|
|
8
|
+
c.syntax = [:should, :expect]
|
9
|
+
end
|
10
|
+
|
11
|
+
config.expect_with :rspec do |c|
|
12
|
+
c.syntax = [:should, :expect]
|
13
|
+
end
|
14
|
+
end
|
data/tasks/console.rake
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: philtre
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Anderson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-10-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sequel
|
@@ -38,20 +38,6 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: ripar
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 0.0.3
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 0.0.3
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: bundler
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,20 +94,6 @@ dependencies:
|
|
108
94
|
- - ">="
|
109
95
|
- !ruby/object:Gem::Version
|
110
96
|
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: sqlite3
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - ">="
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ">="
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0'
|
125
97
|
description: Encode various filtering operations in http parameter hashes
|
126
98
|
email:
|
127
99
|
- panic@semiosix.com
|
@@ -131,7 +103,9 @@ extra_rdoc_files: []
|
|
131
103
|
files:
|
132
104
|
- ".gitignore"
|
133
105
|
- ".travis.yml"
|
106
|
+
- AUTHORS
|
134
107
|
- Gemfile
|
108
|
+
- History.txt
|
135
109
|
- LICENSE.txt
|
136
110
|
- README.md
|
137
111
|
- Rakefile
|
@@ -152,6 +126,7 @@ files:
|
|
152
126
|
- spec/filter_spec.rb
|
153
127
|
- spec/grinder_spec.rb
|
154
128
|
- spec/predicate_splitter_spec.rb
|
129
|
+
- spec/spec_helper.rb
|
155
130
|
- tasks/console.rake
|
156
131
|
homepage: http://github.com/djellemah/philtre
|
157
132
|
licenses:
|
@@ -173,7 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
173
148
|
version: '0'
|
174
149
|
requirements: []
|
175
150
|
rubyforge_project:
|
176
|
-
rubygems_version: 2.
|
151
|
+
rubygems_version: 2.5.1
|
177
152
|
signing_key:
|
178
153
|
specification_version: 4
|
179
154
|
summary: http parameter-hash friendly filtering for Sequel
|
@@ -182,3 +157,4 @@ test_files:
|
|
182
157
|
- spec/filter_spec.rb
|
183
158
|
- spec/grinder_spec.rb
|
184
159
|
- spec/predicate_splitter_spec.rb
|
160
|
+
- spec/spec_helper.rb
|