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 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", "~> 3.2"
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"
@@ -1,3 +1,3 @@
1
1
  module Httpsql
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
data/lib/httpsql.rb CHANGED
@@ -16,47 +16,36 @@ module Httpsql
16
16
  # end
17
17
  # end
18
18
  def with_params(params={})
19
- fields = []
20
- conds = []
21
- joins = []
22
- groups = []
23
- orders = []
19
+ @httpsql_params = params
20
+ @httpsql_conds = []
24
21
 
25
- fields += Array(params[:field] || params['field'])
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(params).each do |k,v|
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
- if k == 'join'
32
- joins += Array(v).map!(&:to_sym)
33
- elsif k == 'order'
34
- orders += Array(v).map!{|w| httpsql_quote_value_with_args(w)}
35
- elsif k == 'group'
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
- conds << arel_table[k].eq(v)
37
+ httpsql_extract_default_predicates(k, v)
50
38
  end
39
+
51
40
  end
52
41
 
53
- conds = conds.compact.inject{|x,y| x.and(y)}
42
+ @httpsql_conds = @httpsql_conds.inject{|x,y| x.and(y)}
54
43
 
55
- ar_rel = where(conds)
56
- ar_rel = ar_rel.joins(joins) if joins.any?
57
- ar_rel = ar_rel.group(groups) if groups.any?
58
- ar_rel = ar_rel.order(orders) if orders.any?
59
- ar_rel = ar_rel.select(fields) if fields.any?
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(params)
86
- params.select{|k,v| [*column_names, 'join', 'group', 'order'].include?(k.to_s.split('.').first)}
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
- ret = FooModel.send(:httpsql_valid_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)
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 'selects reserved parameters' do
43
- ret = FooModel.send(:httpsql_valid_params, 'join'=>'foo', 'group'=>'bar', 'order'=>'baz')
44
- ret.must_equal('join'=>'foo', 'group'=>'bar', 'order'=>'baz')
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.0
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-23 00:00:00.000000000 Z
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: 1.8.23
202
+ rubygems_version: 2.0.0
224
203
  signing_key:
225
- specification_version: 3
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: