filter_factory 0.0.1 → 0.0.2
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.
- data/README.md +15 -0
- data/lib/filter_factory/field.rb +4 -2
- data/lib/filter_factory/filter.rb +5 -5
- data/lib/filter_factory/mongoid/filter.rb +3 -3
- data/lib/filter_factory/version.rb +1 -1
- data/spec/filter_factory/active_record/model_spec.rb +2 -2
- data/spec/filter_factory/filter_spec.rb +13 -5
- data/spec/filter_factory/mongoid/model_spec.rb +2 -2
- metadata +3 -3
data/README.md
CHANGED
@@ -25,6 +25,11 @@ Describe your filter:
|
|
25
25
|
field :title, :regex
|
26
26
|
field :author, :eq
|
27
27
|
field :views, :gte
|
28
|
+
|
29
|
+
# add aliases for the same field with different conditions
|
30
|
+
field :created_at, :gte, alias: :created_at_gte
|
31
|
+
field :created_at, :lte, alias: :created_at_lte
|
32
|
+
|
28
33
|
# ...
|
29
34
|
end
|
30
35
|
|
@@ -46,6 +51,16 @@ Render form as you want in your view:
|
|
46
51
|
<br/>
|
47
52
|
<%= f.number_field :views %>
|
48
53
|
</div>
|
54
|
+
<div>
|
55
|
+
<%= f.label :created_at_gte %>
|
56
|
+
<br/>
|
57
|
+
<%= f.date_select :created_at_gte %>
|
58
|
+
</div>
|
59
|
+
<div>
|
60
|
+
<%= f.label :created_at_lte %>
|
61
|
+
<br/>
|
62
|
+
<%= f.date_select :created_at_lte %>
|
63
|
+
</div>
|
49
64
|
<div class="actions">
|
50
65
|
<%= f.submit "Filter" %>
|
51
66
|
</div>
|
data/lib/filter_factory/field.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
module FilterFactory
|
2
2
|
class Field
|
3
|
-
attr_reader :name, :condition, :options
|
3
|
+
attr_reader :name, :condition, :alias, :options
|
4
4
|
attr_accessor :value
|
5
5
|
|
6
6
|
def initialize(name, condition, options = {})
|
7
|
-
|
7
|
+
valid_options = [:alias]
|
8
|
+
@name, @condition, @options = name, condition, options.reject{|k,v| !valid_options.include?(k)}
|
9
|
+
@alias = @options[:alias] || @name
|
8
10
|
end
|
9
11
|
end
|
10
12
|
end
|
@@ -13,7 +13,7 @@ module FilterFactory
|
|
13
13
|
|
14
14
|
def attributes
|
15
15
|
@fields.inject(HashWithIndifferentAccess.new) do |acc,field|
|
16
|
-
acc[field.
|
16
|
+
acc[field.alias] = field.value
|
17
17
|
acc
|
18
18
|
end
|
19
19
|
end
|
@@ -34,10 +34,10 @@ module FilterFactory
|
|
34
34
|
end
|
35
35
|
|
36
36
|
private
|
37
|
-
def field(name, condition)
|
38
|
-
Field.new(name, condition).tap do |field|
|
39
|
-
define_singleton_method(
|
40
|
-
define_singleton_method("#{
|
37
|
+
def field(name, condition, options={})
|
38
|
+
Field.new(name, condition, options).tap do |field|
|
39
|
+
define_singleton_method(field.alias){ field.value }
|
40
|
+
define_singleton_method("#{field.alias}="){|val| field.value = val }
|
41
41
|
|
42
42
|
@fields << field
|
43
43
|
end
|
@@ -6,9 +6,9 @@ module FilterFactory
|
|
6
6
|
FilterFactory::Mongoid::Condition.new(field.name, field.value).method(field.condition)
|
7
7
|
end
|
8
8
|
|
9
|
-
conditions.inject(
|
10
|
-
res
|
11
|
-
end
|
9
|
+
conditions.inject(self) do |res,condition|
|
10
|
+
res = res.instance_eval(&condition)
|
11
|
+
end
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
@@ -12,14 +12,14 @@ describe ARPost do
|
|
12
12
|
it "should execute filter methods chain" do
|
13
13
|
filter = FilterFactory.create do
|
14
14
|
field :title, :eq
|
15
|
-
field :author, :eq
|
15
|
+
field :author, :eq, alias: :user
|
16
16
|
field :views, :gte
|
17
17
|
end
|
18
18
|
|
19
19
|
sample = @posts.sample
|
20
20
|
|
21
21
|
filter.title = sample.title
|
22
|
-
filter.
|
22
|
+
filter.user = sample.author
|
23
23
|
|
24
24
|
described_class.filter(filter).to_a.should == [sample]
|
25
25
|
end
|
@@ -15,7 +15,7 @@ describe FilterFactory::Filter do
|
|
15
15
|
filter.fields.map{|f| [f.name, f.condition]}.should == test_fields
|
16
16
|
end
|
17
17
|
|
18
|
-
it "should define singleton method for defined field" do
|
18
|
+
it "should define singleton method for defined field by its name if no alias option specified" do
|
19
19
|
filter = described_class.create do
|
20
20
|
field :name, :eq
|
21
21
|
end
|
@@ -23,6 +23,14 @@ describe FilterFactory::Filter do
|
|
23
23
|
filter.should respond_to(:name, :'name=')
|
24
24
|
end
|
25
25
|
|
26
|
+
it "should define singleton method for defined field by its alias if alias option specified" do
|
27
|
+
filter = described_class.create do
|
28
|
+
field :name, :eq, alias: :my_name
|
29
|
+
end
|
30
|
+
|
31
|
+
filter.should respond_to(:my_name, :'my_name=')
|
32
|
+
end
|
33
|
+
|
26
34
|
it "should get field value" do
|
27
35
|
filter = described_class.create do
|
28
36
|
field :name, :eq
|
@@ -52,20 +60,20 @@ describe FilterFactory::Filter do
|
|
52
60
|
it "should return valid attributes" do
|
53
61
|
filter = described_class.create do
|
54
62
|
field :name, :eq
|
55
|
-
field :surname, :regex
|
63
|
+
field :surname, :regex, alias: :last_name
|
56
64
|
end
|
57
65
|
filter.name = "test name"
|
58
66
|
|
59
|
-
filter.attributes.should == HashWithIndifferentAccess.new({name: "test name",
|
67
|
+
filter.attributes.should == HashWithIndifferentAccess.new({name: "test name", last_name: nil})
|
60
68
|
end
|
61
69
|
|
62
70
|
it "should fill filter values from hash" do
|
63
71
|
filter = described_class.create do
|
64
72
|
field :name, :eq
|
65
|
-
field :surname, :regex
|
73
|
+
field :surname, :regex, alias: :last_name
|
66
74
|
end
|
67
75
|
|
68
|
-
attributes = {name: "my test name",
|
76
|
+
attributes = {name: "my test name", last_name: "surname here"}
|
69
77
|
filter.attributes = attributes
|
70
78
|
filter.attributes.should == HashWithIndifferentAccess.new(attributes)
|
71
79
|
end
|
@@ -14,12 +14,12 @@ describe MPost do
|
|
14
14
|
|
15
15
|
filter = FilterFactory.create do
|
16
16
|
field :title, :eq
|
17
|
-
field :author, :eq
|
17
|
+
field :author, :eq, alias: :user
|
18
18
|
field :views, :gte
|
19
19
|
end
|
20
20
|
|
21
21
|
filter.title = sample.title
|
22
|
-
filter.
|
22
|
+
filter.user = sample.author
|
23
23
|
|
24
24
|
described_class.filter(filter).to_a.should == [sample]
|
25
25
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: filter_factory
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-02-
|
12
|
+
date: 2013-02-07 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Gem for easy ActiveRecord/Mongoid models filtering
|
15
15
|
email:
|
@@ -59,7 +59,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
59
59
|
version: '0'
|
60
60
|
requirements: []
|
61
61
|
rubyforge_project:
|
62
|
-
rubygems_version: 1.8.
|
62
|
+
rubygems_version: 1.8.25
|
63
63
|
signing_key:
|
64
64
|
specification_version: 3
|
65
65
|
summary: FilterFactory allows you to easily fetch ActiveRecord/Mongoid models that
|