ransack_query 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 77ba48428f3a018d79c6ea475d82d3f8b31201c7
4
+ data.tar.gz: d372b67bebccd07ff7823d376ffb6d4c3dfb611b
5
+ SHA512:
6
+ metadata.gz: 1c9ec53846f5b04e2db3640932d9d853a19565ccab19be3bd68930e8194d46ac8c0454e3e923a51b974c7ab2fab0b22bdb818dc215d34878c42c1a9ebde08c94
7
+ data.tar.gz: 9761dfeb707d6d5930e84ffeaefe5c49bf9a5cf1db6c47fb2b5e08b43250f5fe25e4e8703366c2781d569acea41957bf119d3c8f3fab71e0e1ca1d5a1e4ffd6f
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in ransack_query.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,11 @@
1
+ guard 'rspec' do
2
+ # watch /lib/ files
3
+ watch(%r{^lib/(.+).rb$}) do |m|
4
+ "spec/#{m[1]}_spec.rb"
5
+ end
6
+
7
+ # watch /spec/ files
8
+ watch(%r{^spec/(.+).rb$}) do |m|
9
+ "spec/#{m[1]}.rb"
10
+ end
11
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Frank West
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,236 @@
1
+ # RansackQuery
2
+
3
+ This gem provides a semantic way of building advanced ransack queries outside of using the form.
4
+
5
+ This was built because we needed a quick way to build queries to pass to ransack using the console.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 'ransack_query'
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install ransack_query
20
+
21
+ ## Usage
22
+
23
+ Simple Usage:
24
+
25
+ RansackQuery.build do |grouping|
26
+ grouping.add_condition(Condition.new(attribute: 'first_name', value: 'Bob'))
27
+ grouping.add_condition(Condition.new(attribute: 'last_name', value: 'Smith', predicate: :not_eq))
28
+ end
29
+ and
30
+
31
+ RansackQuery.build do |grouping|
32
+ grouping.add_condition(Condition.new(attribute: 'first_name', value: 'Bob')).
33
+ add_condition(Condition.new(attribute: 'last_name', value: 'Smith', predicate: :not_eq))
34
+ end
35
+ and
36
+
37
+ RansackQuery.build do |grouping|
38
+ conditions = []
39
+ conditions << Condition.new(attribute: 'first_name', value: 'Bob')
40
+ conditions << Condition.new do |condition|
41
+ condition.attribute = 'last_name'
42
+ condition.value = 'Smith'
43
+ condition.predicate = :not_eq
44
+ end
45
+ grouping.add_conditions(conditions)
46
+ end
47
+ and
48
+
49
+ RansackQuery.build(prefix: 'q') do |grouping|
50
+ grouping.add_condition do |condition|
51
+ condition.attribute = 'first_name'
52
+ condition.value = 'Bob'
53
+ condition.predicate = :eq
54
+ end
55
+ grouping.add_condition do |condition|
56
+ condition.attribute = 'last_name'
57
+ condition.value = 'Smith'
58
+ condition.predicate = :not_eq
59
+ end
60
+ end
61
+
62
+
63
+ All Produce the following output (with different ids):
64
+
65
+ {
66
+ "g" => {
67
+ "90eb39b79709822408ca45f551532893" => {
68
+ "m" => "and",
69
+ "c" => {
70
+ "2bd58799fb5e609164d9a9fa674075e9" => {
71
+ "a" => {
72
+ "0" => {
73
+ "name" => "first_name"
74
+ }
75
+ },
76
+ "p" => "eq",
77
+ "v" => {
78
+ "0" => {
79
+ "value" => "Bob"
80
+ }
81
+ }
82
+ },
83
+ "7a6d5f805afbfeccf51be1f6eaaadecb" => {
84
+ "a" => {
85
+ "0" => {
86
+ "name" => "last_name"
87
+ }
88
+ },
89
+ "p" => "not_eq",
90
+ "v" => {
91
+ "0" => {
92
+ "value" => "Smith"
93
+ }
94
+ }
95
+ }
96
+ }
97
+ }
98
+ }
99
+ }
100
+
101
+
102
+ and passing the following options hash to build
103
+
104
+ RansackQuery.build(format: :json, prefix: 'q')
105
+
106
+ will produce the following in json
107
+
108
+ {
109
+ "q" => {
110
+ "g" => {
111
+ "8b489d7ae7573fca7bb7ee9762dfb254" => {
112
+ "m" => "and",
113
+ "c" => {
114
+ "9a8c44777d17ba6bea0f9257415fb1aa" => {
115
+ "a" => {
116
+ "0" => {
117
+ "name" => "first_name"
118
+ }
119
+ },
120
+ "p" => "eq",
121
+ "v" => {
122
+ "0" => {
123
+ "value" => "Bob"
124
+ }
125
+ }
126
+ },
127
+ "7d0cee690a16e90db20318070f0841f6" => {
128
+ "a" => {
129
+ "0" => {
130
+ "name" => "last_name"
131
+ }
132
+ },
133
+ "p" => "not_eq",
134
+ "v" => {
135
+ "0" => {
136
+ "value" => "Smith"
137
+ }
138
+ }
139
+ }
140
+ }
141
+ }
142
+ }
143
+ }
144
+ }
145
+
146
+ A more complex example with arrays and subgroups
147
+
148
+ RansackQuery.build do |grouping|
149
+ grouping.combinator = :or
150
+ grouping.add_condition do |condition|
151
+ condition.attribute = 'first_name'
152
+ condition.value = 'Bob'
153
+ end
154
+
155
+ grouping.add_grouping do |new_grouping|
156
+ new_grouping.add_condition do |condition|
157
+ condition.attribute = 'last_name'
158
+ condition.value = 'Smith'
159
+ end
160
+ new_grouping.add_condition do |condition|
161
+ condition.attribute = 'state'
162
+ condition.value = %w(CA TX NY)
163
+ end
164
+ end
165
+ end
166
+ Will produce:
167
+
168
+ {
169
+ "g" => {
170
+ "05fdf6e8a730331872050faf8856501e" => {
171
+ "m" => "or",
172
+ "c" => {
173
+ "bbd1916d8afe8c6def686041ad5ab167" => {
174
+ "a" => {
175
+ "0" => {
176
+ "name" => "first_name"
177
+ }
178
+ },
179
+ "p" => "eq",
180
+ "v" => {
181
+ "0" => {
182
+ "value" => "Bob"
183
+ }
184
+ }
185
+ }
186
+ },
187
+ "g" => {
188
+ "4e3e3095f1caf8f3479b49f394fe42d6" => {
189
+ "m" => "and",
190
+ "c" => {
191
+ "023e5b5ff8384f474372c3f3ee8e666d" => {
192
+ "a" => {
193
+ "0" => {
194
+ "name" => "last_name"
195
+ }
196
+ },
197
+ "p" => "eq",
198
+ "v" => {
199
+ "0" => {
200
+ "value" => "Smith"
201
+ }
202
+ }
203
+ },
204
+ "df4731b72af62b2788c4428a59aef4d3" => {
205
+ "a" => {
206
+ "0" => {
207
+ "name" => "state"
208
+ }
209
+ },
210
+ "p" => "eq",
211
+ "v" => {
212
+ "0" => {
213
+ "value" => "CA"
214
+ },
215
+ "1" => {
216
+ "value" => "TX"
217
+ },
218
+ "2" => {
219
+ "value" => "NY"
220
+ }
221
+ }
222
+ }
223
+ }
224
+ }
225
+ }
226
+ }
227
+ }
228
+ }
229
+
230
+ ## Contributing
231
+
232
+ 1. Fork it ( https://github.com/[my-github-username]/ransack_query/fork )
233
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
234
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
235
+ 4. Push to the branch (`git push origin my-new-feature`)
236
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'rspec/core/rake_task'
2
+ require 'bundler/gem_tasks'
3
+
4
+ # Default directory to look in is `/specs`
5
+ # Run with `rake spec`
6
+ RSpec::Core::RakeTask.new(:spec) do |task|
7
+ task.rspec_opts = %w{--color --format d}
8
+ end
9
+
10
+ task default: :spec
data/lib/condition.rb ADDED
@@ -0,0 +1,35 @@
1
+ class Condition
2
+ attr_accessor :id, :predicate, :attribute, :value
3
+
4
+ def initialize(attributes={})
5
+ @id = RansackQuery.generate_id
6
+ @predicate = attributes[:predicate] || :eq
7
+ @attribute = attributes[:attribute]
8
+ @value = attributes[:value]
9
+ yield self if block_given?
10
+ end
11
+
12
+ def ransackify
13
+ {
14
+ @id => {
15
+ 'a' => build_ransack_array(@attribute, 'name'),
16
+ 'p' => @predicate.to_s,
17
+ 'v' => build_ransack_array(@value, 'value')
18
+ }
19
+ }
20
+ end
21
+
22
+ private
23
+ def build_ransack_array(array, hash_key)
24
+ counter = -1
25
+ [array].flatten.reduce({}) do |result, attribute|
26
+ counter += 1
27
+ result.merge({
28
+ counter.to_s => {
29
+ hash_key => attribute
30
+ }
31
+ })
32
+ end
33
+ end
34
+
35
+ end
data/lib/grouping.rb ADDED
@@ -0,0 +1,68 @@
1
+ class Grouping
2
+ attr_accessor :id, :combinator
3
+ attr_reader :conditions, :groupings
4
+
5
+ def initialize
6
+ @id = RansackQuery.generate_id
7
+ @combinator = :and
8
+ @conditions = []
9
+ @groupings = []
10
+ yield self if block_given?
11
+ end
12
+
13
+ def add_condition(condition=nil)
14
+ if block_given?
15
+ condition = Condition.new do |new_condition|
16
+ yield new_condition
17
+ end
18
+ end
19
+ conditions << condition
20
+ self
21
+ end
22
+
23
+ def add_grouping(grouping=nil)
24
+ if block_given?
25
+ grouping = Grouping.new do |new_grouping|
26
+ yield new_grouping
27
+ end
28
+ end
29
+ groupings << grouping
30
+ self
31
+ end
32
+
33
+ def add_conditions(conditions)
34
+ @conditions += conditions
35
+ self
36
+ end
37
+
38
+ def add_groupings(groupings)
39
+ @groupings += groupings
40
+ self
41
+ end
42
+
43
+ def ransackify
44
+ ransack_hash = {
45
+ 'g' => {
46
+ @id => {
47
+ 'm' => @combinator.to_s
48
+ }
49
+ }
50
+ }
51
+ ransackify_conditions(ransack_hash)
52
+ ransackify_groupings(ransack_hash)
53
+ ransack_hash
54
+ end
55
+
56
+ private
57
+
58
+ def ransackify_conditions(ransack_hash)
59
+ return if conditions.empty?
60
+ ransack_hash['g'][@id].merge!({'c' => conditions.reduce({}) {|result, condition| result.merge! condition.ransackify}})
61
+ end
62
+
63
+ def ransackify_groupings(ransack_hash)
64
+ return if groupings.empty?
65
+ groupings.each {|grouping| ransack_hash['g'][@id].merge!(grouping.ransackify)}
66
+ end
67
+
68
+ end
@@ -0,0 +1,3 @@
1
+ module RansackQuery
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,23 @@
1
+ require 'ransack_query/version'
2
+ require 'grouping'
3
+ require 'condition'
4
+ require 'json'
5
+ require 'securerandom'
6
+
7
+ module RansackQuery
8
+
9
+ def self.build(options = {})
10
+ grouping = Grouping.new do |new_grouping|
11
+ yield new_grouping
12
+ end
13
+ ransack_hash = grouping.ransackify
14
+ ransack_hash = {options[:prefix] => ransack_hash} if options[:prefix]
15
+ ransack_hash = ransack_hash.to_json if options[:format] == :json
16
+ ransack_hash
17
+ end
18
+
19
+ def self.generate_id
20
+ SecureRandom.hex
21
+ end
22
+
23
+ end
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'ransack_query/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'ransack_query'
8
+ spec.version = RansackQuery::VERSION
9
+ spec.authors = ['Frank West']
10
+ spec.email = ['fwest@heiskell.com']
11
+ spec.summary = %q{Provides a way to build advanced ransack queries.}
12
+ spec.description = %q{Provides a way to build ransack queries without building a form and usable to generate testing queries. }
13
+ spec.homepage = 'https://github.com/frank-west-iii/ransack_query'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_development_dependency 'bundler', '~> 1.6'
22
+ spec.add_development_dependency 'rake'
23
+ spec.add_development_dependency 'rspec'
24
+ spec.add_development_dependency 'rspec-nc'
25
+ spec.add_development_dependency 'guard'
26
+ spec.add_development_dependency 'guard-rspec'
27
+ spec.add_development_dependency 'pry'
28
+ spec.add_development_dependency 'pry-remote'
29
+ spec.add_development_dependency 'pry-nav'
30
+ spec.add_development_dependency 'factory_girl', '~> 4.4.0'
31
+ end
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+ FactoryGirl.define do
3
+
4
+ factory :condition do
5
+ id 1
6
+ attribute 'attribute'
7
+ value 'value'
8
+
9
+ trait :first_name do
10
+ id 2
11
+ attribute 'first_name'
12
+ value 'Bob'
13
+ end
14
+
15
+ trait :last_name do
16
+ id 3
17
+ attribute 'last_name'
18
+ value 'Smith'
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+ FactoryGirl.define do
3
+
4
+ factory :grouping do
5
+ id 1
6
+
7
+ trait :complex do
8
+ combinator :or
9
+ after(:build) do |obj|
10
+ obj.add_grouping(FactoryGirl.build(:grouping, :with_conditions))
11
+ end
12
+ end
13
+
14
+ trait :with_conditions do
15
+ id 2
16
+ after(:build) do |obj|
17
+ obj.add_condition FactoryGirl.build(:condition, :first_name)
18
+ obj.add_condition FactoryGirl.build(:condition, :last_name)
19
+ end
20
+ end
21
+
22
+ end
23
+
24
+ end
@@ -0,0 +1,70 @@
1
+ # encoding: utf-8
2
+
3
+ FactoryGirl.define do
4
+
5
+ factory :condition_hash, class: Hash do
6
+ skip_create
7
+ initialize_with {
8
+ {
9
+ 1 => {
10
+ 'a' => {
11
+ '0' => {
12
+ 'name' => 'attribute'
13
+ }
14
+ },
15
+ 'p' => 'eq',
16
+ 'v' => {
17
+ '0' => {
18
+ 'value' => 'value'
19
+ }
20
+ }
21
+ }
22
+ } }
23
+ end
24
+
25
+ factory :grouping_hash, class: Hash do
26
+ skip_create
27
+ initialize_with {
28
+ {
29
+ 'g' => {
30
+ 1 => {
31
+ 'm' => 'or',
32
+ 'g' => {
33
+ 2 => {
34
+ 'm' => 'and',
35
+ 'c' => {
36
+ 2 => {
37
+ 'a' => {
38
+ '0' => {
39
+ 'name' => 'first_name'
40
+ }
41
+ },
42
+ 'p' => 'eq',
43
+ 'v' => {
44
+ '0' => {
45
+ 'value' => 'Bob'
46
+ }
47
+ }
48
+ },
49
+ 3 => {
50
+ 'a' => {
51
+ '0' => {
52
+ 'name' => 'last_name'
53
+ }
54
+ },
55
+ 'p' => 'eq',
56
+ 'v' => {
57
+ '0' => {
58
+ 'value' => 'Smith'
59
+ }
60
+ }
61
+ }
62
+ }
63
+ }
64
+ }
65
+ }
66
+ }
67
+ } }
68
+ end
69
+
70
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ describe Condition do
4
+ let(:condition) { FactoryGirl.build(:condition) }
5
+ let(:condition_hash) { FactoryGirl.build(:condition_hash) }
6
+
7
+ it 'should have an id' do
8
+ subject.id.should_not be nil
9
+ end
10
+
11
+ it 'should have a default predicate of eq' do
12
+ subject.predicate.should eq :eq
13
+ end
14
+
15
+ it 'should accept a predicate' do
16
+ lambda { subject.predicate = :eq }.should_not raise_error
17
+ end
18
+
19
+ it 'should accept an attribute' do
20
+ lambda { subject.attribute = 'attribute' }.should_not raise_error
21
+ end
22
+
23
+ it 'should accept a value' do
24
+ lambda { subject.value = 'value' }.should_not raise_error
25
+ end
26
+
27
+ it 'should accept setting the attribute via the initializer' do
28
+ Condition.new(attribute: 'new_attribute').attribute.should eq 'new_attribute'
29
+ end
30
+
31
+ it 'should accept setting the value via the initializer' do
32
+ Condition.new(value: 'new_value').value.should eq 'new_value'
33
+ end
34
+
35
+ it 'should accept setting the predicate via the initializer' do
36
+ Condition.new(predicate: 'new_predicate').predicate.should eq 'new_predicate'
37
+ end
38
+
39
+ it 'should allow initializing via a block' do
40
+ id = nil
41
+ new_condition = Condition.new do |condition|
42
+ id = condition.id
43
+ end
44
+ id.should eq new_condition.id
45
+ end
46
+
47
+ it 'should build a ransack hash' do
48
+ condition.ransackify.should eq condition_hash
49
+ end
50
+
51
+ end
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+
3
+ describe Grouping do
4
+ subject { FactoryGirl.build(:grouping) }
5
+ let(:complex) { FactoryGirl.build(:grouping, :complex) }
6
+ let(:with_conditions) { FactoryGirl.build(:grouping, :with_conditions) }
7
+
8
+ it 'should have an id' do
9
+ subject.id.should_not be nil
10
+ end
11
+
12
+ it 'should have a default combinator of and' do
13
+ subject.combinator.should eq :and
14
+ end
15
+
16
+ it 'should return a accept setting combinator' do
17
+ lambda { subject.combinator = :and }.should_not raise_error
18
+ end
19
+
20
+ it 'should allow you to add a condition' do
21
+ subject.add_condition({attribute: 'location_code', value: '001', predicate: 'eq'})
22
+ subject.conditions.size.should eq 1
23
+ end
24
+
25
+ it 'should allow adding conditions through chaining' do
26
+ subject.add_condition(Condition.new(attribute: 'location_code', value: '001', predicate: 'eq')).
27
+ add_condition(Condition.new(attribute: 'location_code', value: '002', predicate: 'eq'))
28
+ subject.conditions.size.should eq 2
29
+ end
30
+
31
+ it 'should allow adding groupings' do
32
+ subject.add_grouping(Grouping.new)
33
+ subject.groupings.size.should eq 1
34
+ end
35
+
36
+ it 'should allow adding groupings through chaining' do
37
+ subject.add_grouping(Grouping.new).
38
+ add_grouping(Grouping.new)
39
+ subject.groupings.size.should eq 2
40
+ end
41
+
42
+ it 'should allow adding conditions en masse' do
43
+ subject.add_conditions(
44
+ [Condition.new(attribute: 'location_code', value: '001', predicate: 'eq'),
45
+ Condition.new(attribute: 'location_code', value: '001', predicate: 'eq')])
46
+ subject.conditions.size.should eq 2
47
+ end
48
+
49
+ it 'should allow adding groupings en masse' do
50
+ subject.add_groupings([Grouping.new, Grouping.new])
51
+ subject.groupings.size.should eq 2
52
+ end
53
+
54
+ it 'should allow adding a condition via a block' do
55
+ klass = nil
56
+ subject.add_condition do |condition|
57
+ klass = condition.class
58
+ end
59
+ klass.should eq Condition
60
+ end
61
+
62
+ it 'should allow adding a group via a block' do
63
+ klass = nil
64
+ subject.add_grouping do |grouping|
65
+ klass = grouping.class
66
+ end
67
+ klass.should eq Grouping
68
+ end
69
+
70
+ it 'should allow initializing via a block' do
71
+ id = nil
72
+ grouping = Grouping.new do |grouping|
73
+ id = grouping.id
74
+ end
75
+ id.should eq grouping.id
76
+ end
77
+
78
+ it 'should build a ransack hash' do
79
+ complex.ransackify.should eq FactoryGirl.build(:grouping_hash)
80
+ end
81
+
82
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ describe RansackQuery do
4
+ it 'should not build without a block' do
5
+ lambda { RansackQuery.build }.should raise_error
6
+ end
7
+
8
+ it 'should return a grouping to build off' do
9
+ klass = nil
10
+ RansackQuery.build do |grouping|
11
+ klass = grouping.class
12
+ end
13
+ klass.should equal Grouping
14
+ end
15
+
16
+ it 'should return a hash' do
17
+ RansackQuery.build do |grouping|
18
+ grouping.id = 'id1'
19
+ grouping.add_condition do |condition|
20
+ condition.id = 'id2'
21
+ condition.attribute = 'attribute'
22
+ condition.value = 'value'
23
+ end
24
+ end.should eq({'g' => {'id1' => {'m' => 'and', 'c' => {'id2' => {'a' => {'0' => {'name' => 'attribute'}}, 'p' => 'eq', 'v' => {'0' => {'value' => 'value'}}}}}}})
25
+ end
26
+
27
+ it 'should return a json string if specified' do
28
+ RansackQuery.build(format: :json) do |grouping|
29
+ grouping.id = 'id1'
30
+ grouping.add_condition do |condition|
31
+ condition.id = 'id2'
32
+ condition.attribute = 'attribute'
33
+ condition.value = 'value'
34
+ end
35
+ end.should eq "{\"g\":{\"id1\":{\"m\":\"and\",\"c\":{\"id2\":{\"a\":{\"0\":{\"name\":\"attribute\"}},\"p\":\"eq\",\"v\":{\"0\":{\"value\":\"value\"}}}}}}}"
36
+ end
37
+
38
+ it 'should allow a prefix to be passed in' do
39
+ RansackQuery.build(prefix: 'q') do |grouping|
40
+ grouping.id = 'id1'
41
+ grouping.add_condition do |condition|
42
+ condition.id = 'id2'
43
+ condition.attribute = 'attribute'
44
+ condition.value = 'value'
45
+ end
46
+ end.should eq({'q' => {'g' => {'id1' => {'m' => 'and', 'c' => {'id2' => {'a' => {'0' => {'name' => 'attribute'}}, 'p' => 'eq', 'v' => {'0' => {'value' => 'value'}}}}}}}})
47
+ end
48
+
49
+ end
@@ -0,0 +1,9 @@
1
+ require 'pry'
2
+ require 'ransack_query'
3
+ require 'factory_girl'
4
+
5
+ Dir[('./spec/factories/**/*.rb')].each { |factory| require factory }
6
+
7
+ RSpec.configure do |config|
8
+ config.include FactoryGirl::Syntax::Methods
9
+ end
metadata ADDED
@@ -0,0 +1,211 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ransack_query
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Frank West
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec-nc
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: guard
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: guard-rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry-remote
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
+ - !ruby/object:Gem::Dependency
126
+ name: pry-nav
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: factory_girl
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 4.4.0
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 4.4.0
153
+ description: 'Provides a way to build ransack queries without building a form and
154
+ usable to generate testing queries. '
155
+ email:
156
+ - fwest@heiskell.com
157
+ executables: []
158
+ extensions: []
159
+ extra_rdoc_files: []
160
+ files:
161
+ - ".gitignore"
162
+ - ".rspec"
163
+ - Gemfile
164
+ - Guardfile
165
+ - LICENSE.txt
166
+ - README.md
167
+ - Rakefile
168
+ - lib/condition.rb
169
+ - lib/grouping.rb
170
+ - lib/ransack_query.rb
171
+ - lib/ransack_query/version.rb
172
+ - ransack_query.gemspec
173
+ - spec/factories/condition.rb
174
+ - spec/factories/grouping.rb
175
+ - spec/factories/hash.rb
176
+ - spec/models/condition_spec.rb
177
+ - spec/models/grouping_spec.rb
178
+ - spec/models/ransack_query_spec.rb
179
+ - spec/spec_helper.rb
180
+ homepage: https://github.com/frank-west-iii/ransack_query
181
+ licenses:
182
+ - MIT
183
+ metadata: {}
184
+ post_install_message:
185
+ rdoc_options: []
186
+ require_paths:
187
+ - lib
188
+ required_ruby_version: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ version: '0'
193
+ required_rubygems_version: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - ">="
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
198
+ requirements: []
199
+ rubyforge_project:
200
+ rubygems_version: 2.2.2
201
+ signing_key:
202
+ specification_version: 4
203
+ summary: Provides a way to build advanced ransack queries.
204
+ test_files:
205
+ - spec/factories/condition.rb
206
+ - spec/factories/grouping.rb
207
+ - spec/factories/hash.rb
208
+ - spec/models/condition_spec.rb
209
+ - spec/models/grouping_spec.rb
210
+ - spec/models/ransack_query_spec.rb
211
+ - spec/spec_helper.rb