apify 0.4.5 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +3 -0
- data/VERSION +1 -1
- data/apify.gemspec +3 -2
- data/lib/apify.rb +1 -0
- data/lib/apify/patterns.rb +10 -0
- data/lib/apify/schema_helper.rb +8 -3
- data/spec/app_root/app/models/api.rb +24 -0
- data/spec/controllers/api_controller_spec.rb +77 -8
- metadata +5 -4
data/README.md
CHANGED
@@ -136,12 +136,15 @@ Here is another example for a more complex schema:
|
|
136
136
|
'phone' => integer,
|
137
137
|
'phone_type' => enum(string, 'home', 'office'),
|
138
138
|
'email' => optional(email),
|
139
|
+
'website' => optional(url),
|
139
140
|
'favorite' => boolean
|
140
141
|
)
|
141
142
|
)
|
142
143
|
end
|
143
144
|
end
|
144
145
|
|
146
|
+
Note that the schema considers an key/value pair to be "present" when the key is present, even if the value is `nil`. That means if an object entry is optional and you want to omit that entry, you need to leave out the entire key/value pair.
|
147
|
+
|
145
148
|
|
146
149
|
Auto-generated API documentation
|
147
150
|
--------------------------------
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.0
|
data/apify.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{apify}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.5.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Henning Koch"]
|
12
|
-
s.date = %q{2010-10-
|
12
|
+
s.date = %q{2010-10-29}
|
13
13
|
s.description = %q{Compact definition of JSON APIs for Rails applications. }
|
14
14
|
s.email = %q{github@makandra.de}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -79,6 +79,7 @@ Gem::Specification.new do |s|
|
|
79
79
|
"lib/apify/client.rb",
|
80
80
|
"lib/apify/errors.rb",
|
81
81
|
"lib/apify/exchange.rb",
|
82
|
+
"lib/apify/patterns.rb",
|
82
83
|
"lib/apify/schema_helper.rb",
|
83
84
|
"spec/apify/action_spec.rb",
|
84
85
|
"spec/apify/client_spec.rb",
|
data/lib/apify.rb
CHANGED
@@ -0,0 +1,10 @@
|
|
1
|
+
module Apify
|
2
|
+
class Patterns
|
3
|
+
|
4
|
+
EMAIL = /\A[a-z0-9\+\-_\.]+@[a-z0-9]+[a-z0-9\-\.]*[a-z0-9]+\z/i
|
5
|
+
URL = /(http|https):\/\/[\w\-_]+(\.[\w\-_]+)*([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?/
|
6
|
+
SQL_DATE = /\A\d{4}-\d{2}-\d{2}\z/
|
7
|
+
SQL_DATETIME = /\A\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\z/
|
8
|
+
|
9
|
+
end
|
10
|
+
end
|
data/lib/apify/schema_helper.rb
CHANGED
@@ -39,17 +39,22 @@ module Apify
|
|
39
39
|
|
40
40
|
def sql_date
|
41
41
|
{ 'type' => 'string',
|
42
|
-
'pattern' => Patterns::SQL_DATE.source }
|
42
|
+
'pattern' => Apify::Patterns::SQL_DATE.source }
|
43
43
|
end
|
44
44
|
|
45
45
|
def sql_datetime
|
46
46
|
{ 'type' => 'string',
|
47
|
-
'pattern' => Patterns::SQL_DATETIME.source }
|
47
|
+
'pattern' => Apify::Patterns::SQL_DATETIME.source }
|
48
48
|
end
|
49
49
|
|
50
50
|
def email
|
51
51
|
{ 'type' => 'string',
|
52
|
-
'pattern' => Patterns::EMAIL.source }
|
52
|
+
'pattern' => Apify::Patterns::EMAIL.source }
|
53
|
+
end
|
54
|
+
|
55
|
+
def url
|
56
|
+
{ 'type' => 'string',
|
57
|
+
'pattern' => Apify::Patterns::URL.source }
|
53
58
|
end
|
54
59
|
|
55
60
|
end
|
@@ -45,4 +45,28 @@ class Api < Apify::Api
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
+
get :schema_with_sql_date do
|
49
|
+
schema :args do
|
50
|
+
object('date' => sql_date)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
get :schema_with_sql_datetime do
|
55
|
+
schema :args do
|
56
|
+
object('datetime' => sql_datetime)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
get :schema_with_email do
|
61
|
+
schema :args do
|
62
|
+
object('email' => email)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
get :schema_with_url do
|
67
|
+
schema :args do
|
68
|
+
object('url' => url)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
48
72
|
end
|
@@ -64,8 +64,11 @@ describe ApiController do
|
|
64
64
|
|
65
65
|
describe 'argument schemas' do
|
66
66
|
|
67
|
-
|
67
|
+
before :each do
|
68
68
|
instance_exec(&authenticate)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should validate the presence of a property" do
|
69
72
|
post :with_args_schema, :args => {}.to_json
|
70
73
|
response.code.should == '500'
|
71
74
|
response.body.should include('Invalid request args')
|
@@ -73,7 +76,6 @@ describe ApiController do
|
|
73
76
|
end
|
74
77
|
|
75
78
|
it "should validate value types" do
|
76
|
-
instance_exec(&authenticate)
|
77
79
|
post :with_args_schema, :args => {'string_arg' => 123}.to_json
|
78
80
|
response.code.should == '500'
|
79
81
|
response.body.should include('Invalid request args')
|
@@ -81,13 +83,11 @@ describe ApiController do
|
|
81
83
|
end
|
82
84
|
|
83
85
|
it "should allow requests that fit the schema" do
|
84
|
-
instance_exec(&authenticate)
|
85
86
|
post :with_args_schema, :args => {'string_arg' => 'a string'}.to_json
|
86
87
|
response.code.should == '200'
|
87
88
|
end
|
88
89
|
|
89
90
|
it "should render the schema if requested" do
|
90
|
-
instance_exec(&authenticate)
|
91
91
|
post :with_args_schema, :schema => 'args'
|
92
92
|
response.code.should == '200'
|
93
93
|
JSON.parse(response.body).should == {
|
@@ -101,8 +101,11 @@ describe ApiController do
|
|
101
101
|
|
102
102
|
describe 'value schemas' do
|
103
103
|
|
104
|
-
|
104
|
+
before :each do
|
105
105
|
instance_exec(&authenticate)
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should validate the presence of a property" do
|
106
109
|
post :with_value_schema, :args => {}.to_json
|
107
110
|
response.code.should == '500'
|
108
111
|
response.body.should include('Invalid response value')
|
@@ -110,7 +113,6 @@ describe ApiController do
|
|
110
113
|
end
|
111
114
|
|
112
115
|
it "should validate value types" do
|
113
|
-
instance_exec(&authenticate)
|
114
116
|
post :with_value_schema, :args => {'string_value' => 123}.to_json
|
115
117
|
response.code.should == '500'
|
116
118
|
response.body.should include('Invalid response value')
|
@@ -118,14 +120,12 @@ describe ApiController do
|
|
118
120
|
end
|
119
121
|
|
120
122
|
it "should return responses that fit the schema" do
|
121
|
-
instance_exec(&authenticate)
|
122
123
|
post :with_value_schema, :args => {'string_value' => 'a string'}.to_json
|
123
124
|
response.code.should == '200'
|
124
125
|
JSON.parse(response.body).should == {'string_value' => 'a string'}
|
125
126
|
end
|
126
127
|
|
127
128
|
it "should render the schema if requested" do
|
128
|
-
instance_exec(&authenticate)
|
129
129
|
post :with_value_schema, :schema => 'value'
|
130
130
|
response.code.should == '200'
|
131
131
|
JSON.parse(response.body).should == {
|
@@ -137,6 +137,75 @@ describe ApiController do
|
|
137
137
|
|
138
138
|
end
|
139
139
|
|
140
|
+
describe 'schema helpers' do
|
141
|
+
|
142
|
+
before :each do
|
143
|
+
instance_exec(&authenticate)
|
144
|
+
end
|
145
|
+
|
146
|
+
describe '#sql_date helper' do
|
147
|
+
|
148
|
+
it 'should match a date as seen in SQL' do
|
149
|
+
get :schema_with_sql_date, :args => {'date' => '2011-05-01'}.to_json
|
150
|
+
response.code.should == '200'
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'should not match an invalid string' do
|
154
|
+
get :schema_with_sql_date, :args => {'date' => '01.05.2011'}.to_json
|
155
|
+
response.code.should == '500'
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
describe '#sql_datetime helper' do
|
161
|
+
|
162
|
+
it 'should match a timestamp as seen in SQL' do
|
163
|
+
get :schema_with_sql_datetime, :args => {'datetime' => '2011-05-01 12:10:59'}.to_json
|
164
|
+
response.code.should == '200'
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'should not match an invalid string' do
|
168
|
+
get :schema_with_sql_datetime, :args => {'datetime' => '2011-05-01'}.to_json
|
169
|
+
response.code.should == '500'
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
173
|
+
|
174
|
+
describe '#email helper' do
|
175
|
+
|
176
|
+
it 'should match an email address' do
|
177
|
+
get :schema_with_email, :args => {'email' => 'some.guy@some.domain.tld'}.to_json
|
178
|
+
response.code.should == '200'
|
179
|
+
end
|
180
|
+
|
181
|
+
it 'should not match an invalid string' do
|
182
|
+
get :schema_with_email, :args => {'email' => 'some.guy'}.to_json
|
183
|
+
response.code.should == '500'
|
184
|
+
end
|
185
|
+
|
186
|
+
end
|
187
|
+
|
188
|
+
describe '#url_helper' do
|
189
|
+
|
190
|
+
it 'should match a http address' do
|
191
|
+
get :schema_with_url, :args => {'url' => 'http://some.domain.tld/path/to?query=value'}.to_json
|
192
|
+
response.code.should == '200'
|
193
|
+
end
|
194
|
+
|
195
|
+
it 'should match a https address' do
|
196
|
+
get :schema_with_url, :args => {'url' => 'https://some.domain.tld/path/to?query=value'}.to_json
|
197
|
+
response.code.should == '200'
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'should not match an invalid string' do
|
201
|
+
get :schema_with_url, :args => {'url' => 'foo:bar:bam'}.to_json
|
202
|
+
response.code.should == '500'
|
203
|
+
end
|
204
|
+
|
205
|
+
end
|
206
|
+
|
207
|
+
end
|
208
|
+
|
140
209
|
describe 'auto-generated documentation' do
|
141
210
|
integrate_views
|
142
211
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 11
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
- 4
|
9
8
|
- 5
|
10
|
-
|
9
|
+
- 0
|
10
|
+
version: 0.5.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Henning Koch
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-10-
|
18
|
+
date: 2010-10-29 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -132,6 +132,7 @@ files:
|
|
132
132
|
- lib/apify/client.rb
|
133
133
|
- lib/apify/errors.rb
|
134
134
|
- lib/apify/exchange.rb
|
135
|
+
- lib/apify/patterns.rb
|
135
136
|
- lib/apify/schema_helper.rb
|
136
137
|
- spec/apify/action_spec.rb
|
137
138
|
- spec/apify/client_spec.rb
|