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 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: