httpsql 0.1.0 → 0.1.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.
- data/README.md +14 -1
- data/Rakefile +1 -1
- data/lib/httpsql.rb +20 -7
- data/lib/httpsql/version.rb +1 -1
- data/test/httpsql_test.rb +31 -28
- data/test/test_helper.rb +25 -0
- metadata +4 -2
data/README.md
CHANGED
@@ -36,6 +36,7 @@ Assume you have a model, widget, whose fields are id, int_field, string_field, c
|
|
36
36
|
|
37
37
|
create_table "widgets", :force => true do |t|
|
38
38
|
t.integer "int_field"
|
39
|
+
t.float "dec_field"
|
39
40
|
t.string "string_field"
|
40
41
|
t.datetime "created_at", :null => false
|
41
42
|
t.datetime "updated_at", :null => false
|
@@ -45,7 +46,7 @@ Assume you have a model, widget, whose fields are id, int_field, string_field, c
|
|
45
46
|
|
46
47
|
class Widget < ActiveRecord::Base
|
47
48
|
include Httpsql
|
48
|
-
attr_accessible :int_field, :string_field
|
49
|
+
attr_accessible :int_field, :dec_field, :string_field
|
49
50
|
end
|
50
51
|
|
51
52
|
### api.rb
|
@@ -98,6 +99,18 @@ Query your new API
|
|
98
99
|
curl 'http://localhost:3000/api/v1/widgets?id[]=1&id[]=2&created_at.gt=2013-06-01&fields[]=id&fields[]=int_field'
|
99
100
|
SELECT id, int_field FROM widgets WHERE id IN (1,2) AND created_at > '2013-06-01'
|
100
101
|
|
102
|
+
curl 'http://localhost:3000/api/v1/widgets?int_field.sum'
|
103
|
+
SELECT SUM(int_field) AS int_field FROM widgets
|
104
|
+
|
105
|
+
curl 'http://localhost:3000/api/v1/widgets?int_field.maximum'
|
106
|
+
SELECT MAX(int_field) AS int_field FROM widgets
|
107
|
+
|
108
|
+
curl 'http://localhost:3000/api/v1/widgets?int_field.minimum'
|
109
|
+
SELECT MIN(int_field) AS int_field FROM widgets
|
110
|
+
|
111
|
+
curl 'http://localhost:3000/api/v1/widgets?dec_field.round=1'
|
112
|
+
SELECT ROUND(dec_field, 1) AS dec_field FROM widgets
|
113
|
+
|
101
114
|
curl 'http://localhost:3000/api/v1/describe_api'
|
102
115
|
Returns JSON describing the API
|
103
116
|
|
data/Rakefile
CHANGED
data/lib/httpsql.rb
CHANGED
@@ -7,20 +7,32 @@ module Httpsql
|
|
7
7
|
|
8
8
|
module ClassMethods
|
9
9
|
def where_params_eq(params={})
|
10
|
-
|
10
|
+
fields = params[:field] || []
|
11
|
+
conds = []
|
12
|
+
|
13
|
+
valid_params(params).each do |k,v|
|
11
14
|
(k, m) = k.to_s.split('.')
|
12
15
|
next if k.to_s == 'access_token'
|
13
16
|
if m
|
14
|
-
|
17
|
+
if %w(sum minimum maximum).include?(m)
|
18
|
+
fields << arel_table[k].send(m).as(k)
|
19
|
+
elsif !arel_table[k].respond_to?(m)
|
20
|
+
args = v.split(',')
|
21
|
+
fields << Arel::Nodes::NamedFunction.new(m, [arel_table[k], *args], k)
|
22
|
+
else
|
23
|
+
conds << arel_table[k].send(m, v)
|
24
|
+
end
|
15
25
|
elsif v.respond_to?(:any?)
|
16
|
-
arel_table[k
|
26
|
+
conds << arel_table[k].in(v)
|
17
27
|
else
|
18
|
-
arel_table[k
|
28
|
+
conds << arel_table[k].eq(v)
|
19
29
|
end
|
20
|
-
end
|
30
|
+
end
|
31
|
+
|
32
|
+
conds = conds.compact.inject{|x,y| x.and(y)}
|
21
33
|
|
22
|
-
ar_rel = where(
|
23
|
-
ar_rel = ar_rel.select(
|
34
|
+
ar_rel = where(conds)
|
35
|
+
ar_rel = ar_rel.select(fields) if fields.any?
|
24
36
|
ar_rel
|
25
37
|
end
|
26
38
|
|
@@ -45,3 +57,4 @@ module Httpsql
|
|
45
57
|
end
|
46
58
|
end
|
47
59
|
end
|
60
|
+
|
data/lib/httpsql/version.rb
CHANGED
data/test/httpsql_test.rb
CHANGED
@@ -1,34 +1,12 @@
|
|
1
|
-
require '
|
2
|
-
require 'minitest/autorun'
|
3
|
-
require 'active_record'
|
4
|
-
require 'httpsql'
|
5
|
-
|
6
|
-
ActiveRecord::Base.configurations[:test] = {adapter: 'sqlite3', database: 'tmp/httpsql_test'}
|
7
|
-
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[:test])
|
8
|
-
ActiveRecord::Base.connection.execute %Q{ DROP TABLE IF EXISTS foo_models }
|
9
|
-
ActiveRecord::Base.connection.execute %Q{
|
10
|
-
CREATE TABLE foo_models (
|
11
|
-
id integer,
|
12
|
-
int_field integer,
|
13
|
-
string_field text,
|
14
|
-
access_token text,
|
15
|
-
created_at text default CURRENT_TIMESTAMP,
|
16
|
-
updated_at text default CURRENT_TIMESTAMP,
|
17
|
-
primary key(id)
|
18
|
-
);
|
19
|
-
}
|
20
|
-
class FooModel < ActiveRecord::Base
|
21
|
-
include Httpsql
|
22
|
-
attr_accessible :int_field, :string_field, :access_token
|
23
|
-
end
|
1
|
+
require 'test_helper'
|
24
2
|
|
25
3
|
def generate_models
|
26
4
|
FooModel.create!([
|
27
|
-
{int_field: 0, string_field: "zero", access_token: "000"},
|
28
|
-
{int_field: 1, string_field: "one", access_token: "111"},
|
29
|
-
{int_field: 2, string_field: "two", access_token: "222"},
|
30
|
-
{int_field: 3, string_field: "three", access_token: "333"},
|
31
|
-
{int_field: 4, string_field: "four", access_token: "444"},
|
5
|
+
{int_field: 0, dec_field: 0.01, string_field: "zero", access_token: "000"},
|
6
|
+
{int_field: 1, dec_field: 1.01, string_field: "one", access_token: "111"},
|
7
|
+
{int_field: 2, dec_field: 2.01, string_field: "two", access_token: "222"},
|
8
|
+
{int_field: 3, dec_field: 3.01, string_field: "three", access_token: "333"},
|
9
|
+
{int_field: 4, dec_field: 4.01, string_field: "four", access_token: "444"},
|
32
10
|
])
|
33
11
|
end
|
34
12
|
|
@@ -112,10 +90,35 @@ describe Httpsql do
|
|
112
90
|
FooModel.where_params_eq("int_field.eq" => 0, field: [:int_field, :id]).must_equal model
|
113
91
|
end
|
114
92
|
|
93
|
+
it 'sums the specified field' do
|
94
|
+
models = generate_models
|
95
|
+
expected = models.collect(&:int_field).inject(:+)
|
96
|
+
FooModel.where_params_eq("int_field.sum" => nil).first.int_field.must_equal expected
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'selects the maximum value for the specified field' do
|
100
|
+
models = generate_models
|
101
|
+
expected = models.collect(&:int_field).max
|
102
|
+
FooModel.where_params_eq("int_field.maximum" => nil).first.int_field.must_equal expected
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'selects the minimum value for the specified field' do
|
106
|
+
models = generate_models
|
107
|
+
expected = models.collect(&:int_field).min
|
108
|
+
FooModel.where_params_eq("int_field.minimum" => nil).first.int_field.must_equal expected
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'generates the specified sql for rounding' do
|
112
|
+
models = generate_models
|
113
|
+
expected = models.collect(&:dec_field).map{|v| v.round.to_f}
|
114
|
+
FooModel.where_params_eq("dec_field.round" => "1").collect(&:dec_field).map{|v| v.to_f}.must_equal expected
|
115
|
+
end
|
116
|
+
|
115
117
|
it 'generates the correct documentation' do
|
116
118
|
FooModel.route_params.must_equal({
|
117
119
|
"id" => {:type => "integer", :desc => "id", :primary => true},
|
118
120
|
"int_field" => {:type => "integer", :desc => "int_field", :primary => false},
|
121
|
+
"dec_field" => {:type => "decimal", :desc => "dec_field", :primary => false},
|
119
122
|
"string_field" => {:type => "text", :desc => "string_field", :primary => false},
|
120
123
|
"access_token" => {:type => "text", :desc => "access_token", :primary => false},
|
121
124
|
"created_at" => {:type => "text", :desc => "created_at", :primary => false},
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'minitest/spec'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'active_record'
|
4
|
+
require 'httpsql'
|
5
|
+
|
6
|
+
ActiveRecord::Base.configurations[:test] = {adapter: 'sqlite3', database: 'tmp/httpsql_test'}
|
7
|
+
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[:test])
|
8
|
+
ActiveRecord::Base.connection.execute %Q{ DROP TABLE IF EXISTS foo_models }
|
9
|
+
ActiveRecord::Base.connection.execute %Q{
|
10
|
+
CREATE TABLE foo_models (
|
11
|
+
id integer,
|
12
|
+
int_field integer,
|
13
|
+
dec_field decimal,
|
14
|
+
string_field text,
|
15
|
+
access_token text,
|
16
|
+
created_at text default CURRENT_TIMESTAMP,
|
17
|
+
updated_at text default CURRENT_TIMESTAMP,
|
18
|
+
primary key(id)
|
19
|
+
);
|
20
|
+
}
|
21
|
+
class FooModel < ActiveRecord::Base
|
22
|
+
include Httpsql
|
23
|
+
attr_accessible :int_field, :dec_field, :string_field, :access_token
|
24
|
+
end
|
25
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: httpsql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2013-07-
|
14
|
+
date: 2013-07-16 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: bundler
|
@@ -112,6 +112,7 @@ files:
|
|
112
112
|
- lib/httpsql.rb
|
113
113
|
- lib/httpsql/version.rb
|
114
114
|
- test/httpsql_test.rb
|
115
|
+
- test/test_helper.rb
|
115
116
|
homepage: https://github.com/Adaptly/httpsql
|
116
117
|
licenses:
|
117
118
|
- MIT
|
@@ -140,3 +141,4 @@ summary: Select model specified fields, create arbitrary queries, all using CGI
|
|
140
141
|
parameters
|
141
142
|
test_files:
|
142
143
|
- test/httpsql_test.rb
|
144
|
+
- test/test_helper.rb
|