httpsql 0.2.0 → 0.2.1
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 +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:
|