httpsql 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.ruby-version +1 -0
- data/httpsql.gemspec +1 -1
- data/lib/httpsql/version.rb +1 -1
- data/lib/httpsql.rb +69 -33
- data/test/httpsql_test.rb +17 -5
- metadata +24 -45
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ecd738cb6e2b72ec0c1c9c5009bc4d1f80690fa5
|
4
|
+
data.tar.gz: ebef5dd428014540bdac0bf04405b303a0a982d5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e3659684b60c1798e2bc76b7897646c5af887e7655e345a0aa2698f24b001fe6d130d6bc20f3dcd85a47566298d743fdd6112f53c5fc4e01382a7b7bffd307be
|
7
|
+
data.tar.gz: ad9ae77fc0eac32037f3925e979100e5d8802bc51fcec16a37b5246e4a7cb6784011e03b176f9e003ac2020742cead79aeb915bc5edbf1187062c4d58cd7db9e
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.0.0-p0
|
data/httpsql.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency "activerecord", "
|
21
|
+
spec.add_dependency "activerecord", ">= 3.2"
|
22
22
|
spec.add_dependency "arel", ">= 2.2"
|
23
23
|
spec.add_dependency "grape", ">= 0.5.0"
|
24
24
|
spec.add_development_dependency "bundler", "~> 1.3"
|
data/lib/httpsql/version.rb
CHANGED
data/lib/httpsql.rb
CHANGED
@@ -16,47 +16,36 @@ module Httpsql
|
|
16
16
|
# end
|
17
17
|
# end
|
18
18
|
def with_params(params={})
|
19
|
-
|
20
|
-
|
21
|
-
joins = []
|
22
|
-
groups = []
|
23
|
-
orders = []
|
19
|
+
@httpsql_params = params
|
20
|
+
@httpsql_conds = []
|
24
21
|
|
25
|
-
|
22
|
+
@httpsql_fields = httpsql_fetch_param :field
|
23
|
+
joins = httpsql_extract_joins
|
24
|
+
groups = httpsql_extract_groups
|
25
|
+
orders = httpsql_extract_orders
|
26
26
|
|
27
|
-
httpsql_valid_params
|
27
|
+
httpsql_valid_params.each do |k,v|
|
28
28
|
k, m = k.to_s.split('.')
|
29
29
|
next if k.to_s == 'access_token'
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
groups += Array(v).map!{|w| httpsql_quote_value(w)}
|
37
|
-
elsif m
|
38
|
-
if %w(sum minimum maximum).include?(m)
|
39
|
-
fields << arel_table[k].send(m).as(k)
|
40
|
-
elsif !arel_table[k].respond_to?(m)
|
41
|
-
args = v.split(',')
|
42
|
-
fields << Arel::Nodes::NamedFunction.new(m, [arel_table[k], *args], k)
|
43
|
-
else
|
44
|
-
conds << arel_table[k].send(m, v)
|
45
|
-
end
|
46
|
-
elsif v.respond_to?(:any?)
|
47
|
-
conds << arel_table[k].in(v)
|
31
|
+
# column.sum, column.function=arg1, column.predicate=x
|
32
|
+
if m
|
33
|
+
httpsql_extract_method(k, m, v)
|
34
|
+
|
35
|
+
# column[]=1&column[]=2 or column=x
|
48
36
|
else
|
49
|
-
|
37
|
+
httpsql_extract_default_predicates(k, v)
|
50
38
|
end
|
39
|
+
|
51
40
|
end
|
52
41
|
|
53
|
-
|
42
|
+
@httpsql_conds = @httpsql_conds.inject{|x,y| x.and(y)}
|
54
43
|
|
55
|
-
ar_rel = where(
|
56
|
-
ar_rel = ar_rel.
|
57
|
-
ar_rel = ar_rel.
|
58
|
-
ar_rel = ar_rel.
|
59
|
-
ar_rel = ar_rel.
|
44
|
+
ar_rel = where(@httpsql_conds)
|
45
|
+
ar_rel = ar_rel.select(@httpsql_fields) if @httpsql_fields.any?
|
46
|
+
ar_rel = ar_rel.joins(joins) if joins.any?
|
47
|
+
ar_rel = ar_rel.group(groups) if groups.any?
|
48
|
+
ar_rel = ar_rel.order(orders) if orders.any?
|
60
49
|
ar_rel
|
61
50
|
end
|
62
51
|
|
@@ -82,8 +71,8 @@ module Httpsql
|
|
82
71
|
end
|
83
72
|
|
84
73
|
private
|
85
|
-
def httpsql_valid_params
|
86
|
-
|
74
|
+
def httpsql_valid_params
|
75
|
+
@httpsql_params.select{|k,v| column_names.include?(k.to_s.split('.').first)}
|
87
76
|
end
|
88
77
|
|
89
78
|
def httpsql_quote_value(v)
|
@@ -118,6 +107,53 @@ module Httpsql
|
|
118
107
|
@join_tables ||= reflections.keys
|
119
108
|
end
|
120
109
|
|
110
|
+
def httpsql_fetch_param(key)
|
111
|
+
key_s = key.to_s
|
112
|
+
key_sym = key.to_sym
|
113
|
+
Array(@httpsql_params[key_sym] || @httpsql_params[key_s])
|
114
|
+
end
|
115
|
+
|
116
|
+
def httpsql_extract_joins
|
117
|
+
httpsql_fetch_param(:join).map!(&:to_sym)
|
118
|
+
end
|
119
|
+
|
120
|
+
def httpsql_extract_groups
|
121
|
+
httpsql_fetch_param(:group).map! do |w|
|
122
|
+
httpsql_quote_value(w)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def httpsql_extract_orders
|
127
|
+
httpsql_fetch_param(:order).map! do |w|
|
128
|
+
httpsql_quote_value_with_args(w)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def httpsql_extract_method(key, method, value)
|
133
|
+
# column.sum, column.minimum, column.maximum
|
134
|
+
if %w(sum minimum maximum).include?(method)
|
135
|
+
@httpsql_fields << arel_table[key].send(method).as(key)
|
136
|
+
# column.function=arg1,arg2
|
137
|
+
elsif !arel_table[key].respond_to?(method)
|
138
|
+
args = value.split(',')
|
139
|
+
@httpsql_fields << Arel::Nodes::NamedFunction.new(method, [arel_table[key], *args], key)
|
140
|
+
# column.arel_predicate (ie lt, gt, not_eq, etc)
|
141
|
+
else
|
142
|
+
@httpsql_conds << arel_table[key].send(method, value)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def httpsql_extract_default_predicates(key, value)
|
147
|
+
# column[]=1&column[]=2
|
148
|
+
if value.respond_to?(:any?)
|
149
|
+
@httpsql_conds << arel_table[key].in(value)
|
150
|
+
|
151
|
+
# column=1
|
152
|
+
else
|
153
|
+
@httpsql_conds << arel_table[key].eq(value)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
121
157
|
end
|
122
158
|
end
|
123
159
|
|
data/test/httpsql_test.rb
CHANGED
@@ -35,14 +35,26 @@ describe Httpsql do
|
|
35
35
|
|
36
36
|
describe "#httpsql_valid_params" do
|
37
37
|
it 'selects a model\'s columns from a given hash' do
|
38
|
-
|
38
|
+
FooModel.instance_variable_set(:@httpsql_params, id: 1, int_field: 2, string_field: "foo", access_token: "a", created_at: '2013-01-01T00:00:00', created_at: '2013-01-01T00:00:00', foo: :bar)
|
39
|
+
ret = FooModel.send(:httpsql_valid_params)
|
39
40
|
ret.must_equal(id: 1, int_field: 2, string_field: "foo", access_token: "a", created_at: '2013-01-01T00:00:00', created_at: '2013-01-01T00:00:00')
|
40
41
|
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#httpsql_fetch_param" do
|
41
45
|
|
42
|
-
it
|
43
|
-
|
44
|
-
|
46
|
+
it "fetches symbol keys and converts values to an array" do
|
47
|
+
FooModel.instance_variable_set(:@httpsql_params, "id" => 1)
|
48
|
+
result = FooModel.send(:httpsql_fetch_param, :id)
|
49
|
+
result.must_equal [1]
|
45
50
|
end
|
51
|
+
|
52
|
+
it "fetches string keys and converts values to an array" do
|
53
|
+
FooModel.instance_variable_set(:@httpsql_params, id: 1)
|
54
|
+
result = FooModel.send(:httpsql_fetch_param, "id")
|
55
|
+
result.must_equal [1]
|
56
|
+
end
|
57
|
+
|
46
58
|
end
|
47
59
|
|
48
60
|
describe '#with_params' do
|
@@ -143,7 +155,7 @@ describe Httpsql do
|
|
143
155
|
it 'groups correctly' do
|
144
156
|
models = generate_foo_models
|
145
157
|
expected = [FooModel.create({created_at: "1900-01-01"}), models.last]
|
146
|
-
FooModel.with_params("group" => "created_at").must_equal expected
|
158
|
+
FooModel.with_params("group" => "created_at").to_a.must_equal expected
|
147
159
|
end
|
148
160
|
|
149
161
|
it 'orders unqualified fields correctly' do
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: httpsql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Philip Champon
|
@@ -11,60 +10,53 @@ authors:
|
|
11
10
|
autorequire:
|
12
11
|
bindir: bin
|
13
12
|
cert_chain: []
|
14
|
-
date: 2013-07-
|
13
|
+
date: 2013-07-24 00:00:00.000000000 Z
|
15
14
|
dependencies:
|
16
15
|
- !ruby/object:Gem::Dependency
|
17
16
|
name: activerecord
|
18
17
|
requirement: !ruby/object:Gem::Requirement
|
19
|
-
none: false
|
20
18
|
requirements:
|
21
|
-
- -
|
19
|
+
- - '>='
|
22
20
|
- !ruby/object:Gem::Version
|
23
21
|
version: '3.2'
|
24
22
|
type: :runtime
|
25
23
|
prerelease: false
|
26
24
|
version_requirements: !ruby/object:Gem::Requirement
|
27
|
-
none: false
|
28
25
|
requirements:
|
29
|
-
- -
|
26
|
+
- - '>='
|
30
27
|
- !ruby/object:Gem::Version
|
31
28
|
version: '3.2'
|
32
29
|
- !ruby/object:Gem::Dependency
|
33
30
|
name: arel
|
34
31
|
requirement: !ruby/object:Gem::Requirement
|
35
|
-
none: false
|
36
32
|
requirements:
|
37
|
-
- -
|
33
|
+
- - '>='
|
38
34
|
- !ruby/object:Gem::Version
|
39
35
|
version: '2.2'
|
40
36
|
type: :runtime
|
41
37
|
prerelease: false
|
42
38
|
version_requirements: !ruby/object:Gem::Requirement
|
43
|
-
none: false
|
44
39
|
requirements:
|
45
|
-
- -
|
40
|
+
- - '>='
|
46
41
|
- !ruby/object:Gem::Version
|
47
42
|
version: '2.2'
|
48
43
|
- !ruby/object:Gem::Dependency
|
49
44
|
name: grape
|
50
45
|
requirement: !ruby/object:Gem::Requirement
|
51
|
-
none: false
|
52
46
|
requirements:
|
53
|
-
- -
|
47
|
+
- - '>='
|
54
48
|
- !ruby/object:Gem::Version
|
55
49
|
version: 0.5.0
|
56
50
|
type: :runtime
|
57
51
|
prerelease: false
|
58
52
|
version_requirements: !ruby/object:Gem::Requirement
|
59
|
-
none: false
|
60
53
|
requirements:
|
61
|
-
- -
|
54
|
+
- - '>='
|
62
55
|
- !ruby/object:Gem::Version
|
63
56
|
version: 0.5.0
|
64
57
|
- !ruby/object:Gem::Dependency
|
65
58
|
name: bundler
|
66
59
|
requirement: !ruby/object:Gem::Requirement
|
67
|
-
none: false
|
68
60
|
requirements:
|
69
61
|
- - ~>
|
70
62
|
- !ruby/object:Gem::Version
|
@@ -72,7 +64,6 @@ dependencies:
|
|
72
64
|
type: :development
|
73
65
|
prerelease: false
|
74
66
|
version_requirements: !ruby/object:Gem::Requirement
|
75
|
-
none: false
|
76
67
|
requirements:
|
77
68
|
- - ~>
|
78
69
|
- !ruby/object:Gem::Version
|
@@ -80,23 +71,20 @@ dependencies:
|
|
80
71
|
- !ruby/object:Gem::Dependency
|
81
72
|
name: coveralls
|
82
73
|
requirement: !ruby/object:Gem::Requirement
|
83
|
-
none: false
|
84
74
|
requirements:
|
85
|
-
- -
|
75
|
+
- - '>='
|
86
76
|
- !ruby/object:Gem::Version
|
87
77
|
version: 0.5.7
|
88
78
|
type: :development
|
89
79
|
prerelease: false
|
90
80
|
version_requirements: !ruby/object:Gem::Requirement
|
91
|
-
none: false
|
92
81
|
requirements:
|
93
|
-
- -
|
82
|
+
- - '>='
|
94
83
|
- !ruby/object:Gem::Version
|
95
84
|
version: 0.5.7
|
96
85
|
- !ruby/object:Gem::Dependency
|
97
86
|
name: minitest
|
98
87
|
requirement: !ruby/object:Gem::Requirement
|
99
|
-
none: false
|
100
88
|
requirements:
|
101
89
|
- - ~>
|
102
90
|
- !ruby/object:Gem::Version
|
@@ -104,7 +92,6 @@ dependencies:
|
|
104
92
|
type: :development
|
105
93
|
prerelease: false
|
106
94
|
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
none: false
|
108
95
|
requirements:
|
109
96
|
- - ~>
|
110
97
|
- !ruby/object:Gem::Version
|
@@ -112,65 +99,57 @@ dependencies:
|
|
112
99
|
- !ruby/object:Gem::Dependency
|
113
100
|
name: pry-nav
|
114
101
|
requirement: !ruby/object:Gem::Requirement
|
115
|
-
none: false
|
116
102
|
requirements:
|
117
|
-
- -
|
103
|
+
- - '>='
|
118
104
|
- !ruby/object:Gem::Version
|
119
105
|
version: '0'
|
120
106
|
type: :development
|
121
107
|
prerelease: false
|
122
108
|
version_requirements: !ruby/object:Gem::Requirement
|
123
|
-
none: false
|
124
109
|
requirements:
|
125
|
-
- -
|
110
|
+
- - '>='
|
126
111
|
- !ruby/object:Gem::Version
|
127
112
|
version: '0'
|
128
113
|
- !ruby/object:Gem::Dependency
|
129
114
|
name: rake
|
130
115
|
requirement: !ruby/object:Gem::Requirement
|
131
|
-
none: false
|
132
116
|
requirements:
|
133
|
-
- -
|
117
|
+
- - '>='
|
134
118
|
- !ruby/object:Gem::Version
|
135
119
|
version: '0'
|
136
120
|
type: :development
|
137
121
|
prerelease: false
|
138
122
|
version_requirements: !ruby/object:Gem::Requirement
|
139
|
-
none: false
|
140
123
|
requirements:
|
141
|
-
- -
|
124
|
+
- - '>='
|
142
125
|
- !ruby/object:Gem::Version
|
143
126
|
version: '0'
|
144
127
|
- !ruby/object:Gem::Dependency
|
145
128
|
name: simplecov
|
146
129
|
requirement: !ruby/object:Gem::Requirement
|
147
|
-
none: false
|
148
130
|
requirements:
|
149
|
-
- -
|
131
|
+
- - '>='
|
150
132
|
- !ruby/object:Gem::Version
|
151
133
|
version: '0.7'
|
152
134
|
type: :development
|
153
135
|
prerelease: false
|
154
136
|
version_requirements: !ruby/object:Gem::Requirement
|
155
|
-
none: false
|
156
137
|
requirements:
|
157
|
-
- -
|
138
|
+
- - '>='
|
158
139
|
- !ruby/object:Gem::Version
|
159
140
|
version: '0.7'
|
160
141
|
- !ruby/object:Gem::Dependency
|
161
142
|
name: sqlite3
|
162
143
|
requirement: !ruby/object:Gem::Requirement
|
163
|
-
none: false
|
164
144
|
requirements:
|
165
|
-
- -
|
145
|
+
- - '>='
|
166
146
|
- !ruby/object:Gem::Version
|
167
147
|
version: '0'
|
168
148
|
type: :development
|
169
149
|
prerelease: false
|
170
150
|
version_requirements: !ruby/object:Gem::Requirement
|
171
|
-
none: false
|
172
151
|
requirements:
|
173
|
-
- -
|
152
|
+
- - '>='
|
174
153
|
- !ruby/object:Gem::Version
|
175
154
|
version: '0'
|
176
155
|
description: Expose model columns and ARel methods through query parameters in grape
|
@@ -185,6 +164,7 @@ extra_rdoc_files: []
|
|
185
164
|
files:
|
186
165
|
- .coveralls.yml
|
187
166
|
- .gitignore
|
167
|
+
- .ruby-version
|
188
168
|
- .travis.yml
|
189
169
|
- Gemfile
|
190
170
|
- LICENSE.txt
|
@@ -202,27 +182,26 @@ files:
|
|
202
182
|
homepage: https://github.com/Adaptly/httpsql
|
203
183
|
licenses:
|
204
184
|
- MIT
|
185
|
+
metadata: {}
|
205
186
|
post_install_message:
|
206
187
|
rdoc_options: []
|
207
188
|
require_paths:
|
208
189
|
- lib
|
209
190
|
required_ruby_version: !ruby/object:Gem::Requirement
|
210
|
-
none: false
|
211
191
|
requirements:
|
212
|
-
- -
|
192
|
+
- - '>='
|
213
193
|
- !ruby/object:Gem::Version
|
214
194
|
version: '0'
|
215
195
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
216
|
-
none: false
|
217
196
|
requirements:
|
218
|
-
- -
|
197
|
+
- - '>='
|
219
198
|
- !ruby/object:Gem::Version
|
220
199
|
version: '0'
|
221
200
|
requirements: []
|
222
201
|
rubyforge_project:
|
223
|
-
rubygems_version:
|
202
|
+
rubygems_version: 2.0.0
|
224
203
|
signing_key:
|
225
|
-
specification_version:
|
204
|
+
specification_version: 4
|
226
205
|
summary: Select model specified fields, create arbitrary queries, all using CGI query
|
227
206
|
parameters
|
228
207
|
test_files:
|