jquery_query_builder-rails 0.1.0 → 0.2.0
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 +4 -4
- data/README.md +70 -2
- data/lib/jquery_query_builder-rails.rb +2 -3
- data/lib/jquery_query_builder/evaluator.rb +100 -0
- data/lib/jquery_query_builder/operator.rb +48 -0
- data/lib/jquery_query_builder/operators/begins_with.rb +9 -0
- data/lib/jquery_query_builder/operators/between.rb +9 -0
- data/lib/jquery_query_builder/operators/contains.rb +9 -0
- data/lib/jquery_query_builder/operators/ends_with.rb +9 -0
- data/lib/jquery_query_builder/operators/equal.rb +9 -0
- data/lib/jquery_query_builder/operators/greater.rb +9 -0
- data/lib/jquery_query_builder/operators/greater_or_equal.rb +9 -0
- data/lib/jquery_query_builder/operators/in.rb +9 -0
- data/lib/jquery_query_builder/operators/is_empty.rb +9 -0
- data/lib/jquery_query_builder/operators/is_not_empty.rb +9 -0
- data/lib/jquery_query_builder/operators/is_not_null.rb +9 -0
- data/lib/jquery_query_builder/operators/is_null.rb +9 -0
- data/lib/jquery_query_builder/operators/less.rb +9 -0
- data/lib/jquery_query_builder/operators/less_or_equal.rb +9 -0
- data/lib/jquery_query_builder/operators/not_begins_with.rb +9 -0
- data/lib/jquery_query_builder/operators/not_between.rb +9 -0
- data/lib/jquery_query_builder/operators/not_contains.rb +9 -0
- data/lib/jquery_query_builder/operators/not_ends_with.rb +9 -0
- data/lib/jquery_query_builder/operators/not_equal.rb +9 -0
- data/lib/jquery_query_builder/operators/not_in.rb +9 -0
- data/lib/jquery_query_builder/rails/engine.rb +7 -0
- data/lib/jquery_query_builder/rails/version.rb +1 -1
- data/lib/jquery_query_builder/rule.rb +64 -0
- data/lib/jquery_query_builder/rule_group.rb +26 -0
- metadata +71 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 21eabfc82ba1b10f2f86fc1b5a373fce3b787a25
|
4
|
+
data.tar.gz: 242467b72d023ec7574792f90711cc59b695f7fe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf8fc6b0d04145a56c2c15fc0decec875f4c8b179fe1a37581b81a6d89cb56cf5326d384f19e8020acf321c2613948c3e122251ce7653eb5d182461c4207df02
|
7
|
+
data.tar.gz: 9647417717b125078c313f76bf58db43cd200c62ae78f5a78688335b26984b5ca1166f86ac39d20b0f60041219ee4ed10a837d30194db2cd889e18a09d62c67d
|
data/README.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# jQuery QueryBuilder - rails
|
2
2
|
|
3
|
+
This gem has 2 parts.
|
4
|
+
- [Assets needed for the jquery-query-builder plugin for the rails asset pipeline](#asset-pipeline-part)
|
5
|
+
- [Ruby evaluator for the json rule output from jquery-query-builder](#ruby-rule-evaluator)
|
6
|
+
|
7
|
+
# Asset Pipeline Part
|
8
|
+
|
3
9
|
jquery_query_builer-rails wraps the [query-builder.js](http://querybuilder.js.org//) library
|
4
10
|
and some of its dependencies in a rails engine for simple use with the asset pipeline provided by Rails 3.1 and higher.
|
5
11
|
|
@@ -51,6 +57,68 @@ After that you can use the QueryBuilder to any \<div\> you want.
|
|
51
57
|
Read more here:
|
52
58
|
[jQuery QueryBuilder](http://querybuilder.js.org//)
|
53
59
|
|
54
|
-
|
60
|
+
# Ruby Rule Evaluator
|
61
|
+
|
62
|
+
You can use the evaluator to check if objects match the json rules produced by the jQuery plugin.
|
63
|
+
|
64
|
+
Objects are hashes or other objects that can be accessed with hash-like bracket functionality e.g. object['test'].
|
65
|
+
|
66
|
+
## Example Usage
|
67
|
+
```ruby
|
68
|
+
rule_json = %|{
|
69
|
+
"condition": "AND",
|
70
|
+
"rules": [{
|
71
|
+
"id": "Integer_Question",
|
72
|
+
"field": "Integer_Question",
|
73
|
+
"type": "integer",
|
74
|
+
"input": "text",
|
75
|
+
"operator": "equal",
|
76
|
+
"value": "5"
|
77
|
+
}]
|
78
|
+
}|
|
79
|
+
|
80
|
+
object_1 = {'Integer_Question' => 5}
|
81
|
+
object_2 = {'Integer_Question' => 15}
|
82
|
+
objects = [object_1, object_2]
|
83
|
+
|
84
|
+
evaluator = JqueryQueryBuilder::Evaluator.new(rule_json)
|
85
|
+
evaluator.object_matches_rules?(object_1) #=> true
|
86
|
+
evaluator.object_matches_rules?(object_2) #=> false
|
87
|
+
|
88
|
+
evaluator.get_matching_objects(objects) #=> [object_1]
|
89
|
+
```
|
90
|
+
|
91
|
+
Note: For the constructor, you can pass in a JSON string or an already parsed object.
|
92
|
+
|
93
|
+
## Operators
|
94
|
+
|
95
|
+
All the default operators have been implemented.
|
96
|
+
|
97
|
+
If you need to extend the operators with custom ones you have, just create a class for the operator.
|
98
|
+
The class name should be the camelized version of the underscored operator.
|
99
|
+
|
100
|
+
e.g. For the operator "equals_five" the class name should be "EqualsFive".
|
101
|
+
|
102
|
+
The class must have an evaluate(input, value), even if a value is not required.
|
103
|
+
|
104
|
+
e.g.
|
105
|
+
```ruby
|
106
|
+
# config/intializers/jquery_query_builder_operators.rb
|
107
|
+
module JqueryQueryBuilder
|
108
|
+
module Operators
|
109
|
+
class EqualsFive
|
110
|
+
def evaluate(input, ignored_value)
|
111
|
+
input == 5
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
```
|
117
|
+
|
118
|
+
## Contributing
|
55
119
|
|
56
|
-
|
120
|
+
1. Fork it
|
121
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
122
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
123
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
124
|
+
5. Create new Pull Request
|
@@ -1,9 +1,8 @@
|
|
1
1
|
require "jquery_query_builder/rails/version"
|
2
|
+
require "jquery_query_builder/evaluator"
|
2
3
|
|
3
4
|
module JqueryQueryBuilder
|
4
5
|
module Rails
|
5
|
-
|
6
|
-
# Get rails to add app, lib, vendor to load path
|
7
|
-
end
|
6
|
+
require 'jquery_query_builder/rails/engine' if defined?(::Rails)
|
8
7
|
end
|
9
8
|
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'active_support/core_ext/hash/indifferent_access'
|
2
|
+
require 'active_support/core_ext/object/blank'
|
3
|
+
require 'active_support/core_ext/string/inflections'
|
4
|
+
require 'jquery_query_builder/operator'
|
5
|
+
require 'jquery_query_builder/rule_group'
|
6
|
+
require 'jquery_query_builder/rule'
|
7
|
+
require 'json'
|
8
|
+
|
9
|
+
module JqueryQueryBuilder
|
10
|
+
class Evaluator
|
11
|
+
attr_accessor :parsed_rule_set
|
12
|
+
def initialize(rule_set)
|
13
|
+
if rule_set.is_a? String
|
14
|
+
#assuming the json was passed in
|
15
|
+
self.parsed_rule_set = JSON.parse(rule_set)
|
16
|
+
else
|
17
|
+
self.parsed_rule_set = rule_set
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_matching_objects(objects)
|
22
|
+
objects.select{|o| object_matches_rules?(o)}
|
23
|
+
end
|
24
|
+
|
25
|
+
def object_matches_rules?(object)
|
26
|
+
RuleGroup.new(parsed_rule_set).evaluate(object)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
__END__
|
33
|
+
Example rules:
|
34
|
+
|
35
|
+
{
|
36
|
+
"condition": "AND",
|
37
|
+
"rules": [{
|
38
|
+
"id": "Decimal_Question",
|
39
|
+
"field": "Decimal_Question",
|
40
|
+
"type": "double",
|
41
|
+
"input": "text",
|
42
|
+
"operator": "equal",
|
43
|
+
"value": "1.2"
|
44
|
+
}, {
|
45
|
+
"condition": "AND",
|
46
|
+
"rules": [{
|
47
|
+
"id": "Date_Question",
|
48
|
+
"field": "Date_Question",
|
49
|
+
"type": "date",
|
50
|
+
"input": "text",
|
51
|
+
"operator": "greater",
|
52
|
+
"value": "2016-07-19"
|
53
|
+
}, {
|
54
|
+
"id": "Yes_No_Question",
|
55
|
+
"field": "Yes_No_Question",
|
56
|
+
"type": "boolean",
|
57
|
+
"input": "select",
|
58
|
+
"operator": "equal",
|
59
|
+
"value": "true"
|
60
|
+
}]
|
61
|
+
}, {
|
62
|
+
"condition": "OR",
|
63
|
+
"rules": [{
|
64
|
+
"id": "Select_Question",
|
65
|
+
"field": "Select_Question",
|
66
|
+
"type": "string",
|
67
|
+
"input": "select",
|
68
|
+
"operator": "equal",
|
69
|
+
"value": "First Option"
|
70
|
+
}, {
|
71
|
+
"id": "Password_Question",
|
72
|
+
"field": "Password_Question",
|
73
|
+
"type": "string",
|
74
|
+
"input": "text",
|
75
|
+
"operator": "equal",
|
76
|
+
"value": "asd"
|
77
|
+
}]
|
78
|
+
}, {
|
79
|
+
"id": "Subform.Free_Text_Question",
|
80
|
+
"field": "Subform.Free_Text_Question",
|
81
|
+
"type": "string",
|
82
|
+
"input": "text",
|
83
|
+
"operator": "is_not_empty",
|
84
|
+
"value": null
|
85
|
+
}]
|
86
|
+
}
|
87
|
+
|
88
|
+
------------
|
89
|
+
|
90
|
+
{
|
91
|
+
"condition": "AND",
|
92
|
+
"rules": [{
|
93
|
+
"id": "Integer_Question",
|
94
|
+
"field": "Integer_Question",
|
95
|
+
"type": "integer",
|
96
|
+
"input": "text",
|
97
|
+
"operator": "equal",
|
98
|
+
"value": "5"
|
99
|
+
}]
|
100
|
+
}
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#require all the operators
|
2
|
+
Dir[File.join(File.dirname(__FILE__) + '/operators', "**/*.rb")].each do |f|
|
3
|
+
require f
|
4
|
+
end
|
5
|
+
|
6
|
+
module JqueryQueryBuilder
|
7
|
+
class Operator
|
8
|
+
SPECIAL_CASE_MAP = {
|
9
|
+
}
|
10
|
+
|
11
|
+
def self.get_operator_class(operator)
|
12
|
+
operator_class = SPECIAL_CASE_MAP[operator] || operator.camelize
|
13
|
+
|
14
|
+
begin
|
15
|
+
operator_class = "#{operator_module}::#{operator_class}".constantize
|
16
|
+
rescue NameError
|
17
|
+
raise "Unknown operator #{operator} used."
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.operator_module
|
22
|
+
"JqueryQueryBuilder::Operators"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
__END__
|
28
|
+
|
29
|
+
equal
|
30
|
+
not_equal
|
31
|
+
in
|
32
|
+
not_in
|
33
|
+
less
|
34
|
+
less_or_equal
|
35
|
+
greater
|
36
|
+
greater_or_equal
|
37
|
+
between
|
38
|
+
not_between
|
39
|
+
begins_with
|
40
|
+
not_begins_with
|
41
|
+
contains
|
42
|
+
not_contains
|
43
|
+
ends_with
|
44
|
+
not_ends_with
|
45
|
+
is_empty
|
46
|
+
is_not_empty
|
47
|
+
is_null
|
48
|
+
is_not_null
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module JqueryQueryBuilder
|
2
|
+
class Rule
|
3
|
+
attr_accessor :id, :field, :type, :input, :operator, :value
|
4
|
+
def initialize(rule_hash)
|
5
|
+
self.id = rule_hash['id']
|
6
|
+
self.field = rule_hash['field']
|
7
|
+
self.type = rule_hash['type']
|
8
|
+
self.input = rule_hash['input']
|
9
|
+
self.operator = rule_hash['operator']
|
10
|
+
self.value = rule_hash['value']
|
11
|
+
end
|
12
|
+
|
13
|
+
def evaluate(object)
|
14
|
+
get_operator.evaluate(get_input(object), get_value)
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_operator
|
18
|
+
JqueryQueryBuilder::Operator.get_operator_class(operator).new
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_input(object)
|
22
|
+
fields = field.split('.')
|
23
|
+
result = object
|
24
|
+
fields.each do |field|
|
25
|
+
result = object[field]
|
26
|
+
break if result.nil?
|
27
|
+
end
|
28
|
+
if result.is_a? Array
|
29
|
+
result.map{|v| typecast_value(v)}
|
30
|
+
else
|
31
|
+
typecast_value(result)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def get_value
|
36
|
+
if value.is_a? Array
|
37
|
+
value.map{|v| typecast_value(v)}
|
38
|
+
else
|
39
|
+
typecast_value(value)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def typecast_value(value_to_cast)
|
44
|
+
case type
|
45
|
+
when 'string'
|
46
|
+
value_to_cast.to_s
|
47
|
+
when 'integer'
|
48
|
+
value_to_cast.to_i
|
49
|
+
when 'double'
|
50
|
+
value_to_cast.to_f
|
51
|
+
when 'date'
|
52
|
+
value_to_cast.is_a?(String) ? Date.parse(value_to_cast) : value_to_cast
|
53
|
+
when 'time'
|
54
|
+
value_to_cast.is_a?(String) ? Time.parse(value_to_cast) : value_to_cast
|
55
|
+
when 'datetime'
|
56
|
+
value_to_cast.is_a?(String) ? DateTime.parse(value_to_cast) : value_to_cast
|
57
|
+
when 'boolean'
|
58
|
+
value_to_cast == 'Yes' || value_to_cast == 'yes' || value_to_cast == 'True' || value_to_cast == 'true' || value_to_cast == true
|
59
|
+
else
|
60
|
+
value_to_cast
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module JqueryQueryBuilder
|
2
|
+
class RuleGroup
|
3
|
+
attr_accessor :condition, :rules
|
4
|
+
def initialize(rule_group_hash)
|
5
|
+
self.condition = rule_group_hash['condition']
|
6
|
+
self.rules = rule_group_hash['rules']
|
7
|
+
end
|
8
|
+
|
9
|
+
def evaluate(object)
|
10
|
+
case condition
|
11
|
+
when "AND"
|
12
|
+
rules.all?{|rule| get_rule_object(rule).evaluate(object) }
|
13
|
+
when "OR"
|
14
|
+
rules.any?{|rule| get_rule_object(rule).evaluate(object) }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_rule_object(rule)
|
19
|
+
if rule['rules'].present?
|
20
|
+
RuleGroup.new(rule)
|
21
|
+
else
|
22
|
+
Rule.new(rule)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jquery_query_builder-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew Hirst
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -24,6 +24,34 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '3.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: json
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.8.3
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.8.3
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: activesupport
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: bundler
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +108,20 @@ dependencies:
|
|
80
108
|
- - ">="
|
81
109
|
- !ruby/object:Gem::Version
|
82
110
|
version: 3.2.12
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: pry
|
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'
|
83
125
|
description:
|
84
126
|
email:
|
85
127
|
- hirst.mat@gmail.com
|
@@ -91,7 +133,32 @@ files:
|
|
91
133
|
- LICENSE.txt
|
92
134
|
- README.md
|
93
135
|
- lib/jquery_query_builder-rails.rb
|
136
|
+
- lib/jquery_query_builder/evaluator.rb
|
137
|
+
- lib/jquery_query_builder/operator.rb
|
138
|
+
- lib/jquery_query_builder/operators/begins_with.rb
|
139
|
+
- lib/jquery_query_builder/operators/between.rb
|
140
|
+
- lib/jquery_query_builder/operators/contains.rb
|
141
|
+
- lib/jquery_query_builder/operators/ends_with.rb
|
142
|
+
- lib/jquery_query_builder/operators/equal.rb
|
143
|
+
- lib/jquery_query_builder/operators/greater.rb
|
144
|
+
- lib/jquery_query_builder/operators/greater_or_equal.rb
|
145
|
+
- lib/jquery_query_builder/operators/in.rb
|
146
|
+
- lib/jquery_query_builder/operators/is_empty.rb
|
147
|
+
- lib/jquery_query_builder/operators/is_not_empty.rb
|
148
|
+
- lib/jquery_query_builder/operators/is_not_null.rb
|
149
|
+
- lib/jquery_query_builder/operators/is_null.rb
|
150
|
+
- lib/jquery_query_builder/operators/less.rb
|
151
|
+
- lib/jquery_query_builder/operators/less_or_equal.rb
|
152
|
+
- lib/jquery_query_builder/operators/not_begins_with.rb
|
153
|
+
- lib/jquery_query_builder/operators/not_between.rb
|
154
|
+
- lib/jquery_query_builder/operators/not_contains.rb
|
155
|
+
- lib/jquery_query_builder/operators/not_ends_with.rb
|
156
|
+
- lib/jquery_query_builder/operators/not_equal.rb
|
157
|
+
- lib/jquery_query_builder/operators/not_in.rb
|
158
|
+
- lib/jquery_query_builder/rails/engine.rb
|
94
159
|
- lib/jquery_query_builder/rails/version.rb
|
160
|
+
- lib/jquery_query_builder/rule.rb
|
161
|
+
- lib/jquery_query_builder/rule_group.rb
|
95
162
|
- vendor/assets/javascripts/doT.js
|
96
163
|
- vendor/assets/javascripts/jquery.extendext.js
|
97
164
|
- vendor/assets/javascripts/query-builder.js
|
@@ -120,6 +187,6 @@ rubyforge_project:
|
|
120
187
|
rubygems_version: 2.4.8
|
121
188
|
signing_key:
|
122
189
|
specification_version: 4
|
123
|
-
summary: The jQuery Query Builder JavaScript library + Dependencies
|
124
|
-
Rails Asset Pipeline.
|
190
|
+
summary: The jQuery Query Builder Rule Evaluator and JavaScript library + Dependencies
|
191
|
+
ready for the Rails Asset Pipeline.
|
125
192
|
test_files: []
|