sinatra-schema 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/lib/sinatra/schema/dsl/definitions.rb +1 -1
- data/lib/sinatra/schema/error.rb +24 -0
- data/lib/sinatra/schema/link.rb +0 -2
- data/lib/sinatra/schema/param_parsing.rb +3 -3
- data/lib/sinatra/schema/param_validation.rb +3 -3
- data/lib/sinatra/schema/version.rb +1 -1
- data/lib/sinatra/schema.rb +10 -0
- data/spec/dsl/definitions_spec.rb +7 -0
- data/spec/integration_spec.rb +16 -3
- data/spec/param_parsing_spec.rb +8 -2
- data/spec/param_validation_spec.rb +4 -4
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OTg4NGUxMjY3YWRjOGI3ZTQ4NDI3ZGU5ZTIyNGU2ZmM1OWQ1ZWUxOQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MGVlODRhMWE1YzgxZjJhNGYyOWYzYzMyNDMwZWQxNzdiMzZlOTVmNg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MzRmMjhjOGEwODY5ZjU5YWU5OTM0MWExMTgwYzllYmVkMjAxNjMwMmI5NTlj
|
10
|
+
ZTg3YmVjOGZjNGRmZDgwMmE1NTcyMWUwMTk2YjIwNGU2ZTIxODNmYmQ0NWVm
|
11
|
+
ZGViNGRhYzgzMzVkNjhmNGMxNGY3M2JlYmE0NDMwMzNmMzk5OTY=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
Njg2Mjg4MGM5YzFiNjY5YWNhZGM4YjIxYThlYzgyNDQyYTg4NzMzZWUxMThj
|
14
|
+
MjJkMTU1MzQzNDNjZGNlN2ZiZGNjMGViZjc0NzAzYzk3NjI3M2QyMjkxYmUz
|
15
|
+
OWM3MjdjNDIyOGQ0ZWE2M2NmZTVkN2RhOTc1NzAwMDEyZDNiZjg=
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Sinatra
|
2
|
+
module Schema
|
3
|
+
class Error < StandardError
|
4
|
+
end
|
5
|
+
|
6
|
+
class BadReference < Error
|
7
|
+
def initialize(id)
|
8
|
+
super("Could not resolve property ref #{id}")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class BadRequest < Error
|
13
|
+
def initialize(msg)
|
14
|
+
super(msg)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class BadParams < Error
|
19
|
+
def initialize(msg)
|
20
|
+
super(msg)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/sinatra/schema/link.rb
CHANGED
@@ -8,7 +8,7 @@ module Sinatra
|
|
8
8
|
when "application/x-www-form-urlencoded"
|
9
9
|
cast_regular_params(properties)
|
10
10
|
else
|
11
|
-
raise "
|
11
|
+
raise BadRequest.new("Unsupported media type: #{request.media_type}")
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -21,12 +21,12 @@ module Sinatra
|
|
21
21
|
request.body.rewind # leave it ready for other calls
|
22
22
|
supplied_params = MultiJson.decode(body)
|
23
23
|
unless supplied_params.is_a?(Hash)
|
24
|
-
raise "Invalid request,
|
24
|
+
raise BadRequest.new("Invalid JSON request, please encode params as a hash")
|
25
25
|
end
|
26
26
|
|
27
27
|
indifferent_params(supplied_params)
|
28
28
|
rescue MultiJson::ParseError
|
29
|
-
raise "Invalid JSON"
|
29
|
+
raise BadRequest.new("Invalid JSON encoded in request")
|
30
30
|
end
|
31
31
|
|
32
32
|
def cast_regular_params(properties, root=params)
|
@@ -4,12 +4,12 @@ module Sinatra
|
|
4
4
|
def validate_params!(params, properties)
|
5
5
|
missing = properties.keys.map(&:to_s).sort - params.keys.map(&:to_s).sort
|
6
6
|
unless missing.empty?
|
7
|
-
raise "Missing
|
7
|
+
raise BadParams.new("Missing expected params: #{missing.join(',')}")
|
8
8
|
end
|
9
9
|
|
10
10
|
extra = params.keys.map(&:to_s).sort - properties.keys.map(&:to_s).sort
|
11
11
|
unless extra.empty?
|
12
|
-
raise "Unexpected
|
12
|
+
raise BadParams.new("Unexpected params: #{extra.join(',')}")
|
13
13
|
end
|
14
14
|
|
15
15
|
properties.each do |id, definition|
|
@@ -18,7 +18,7 @@ module Sinatra
|
|
18
18
|
validate_params!(params[id], definition)
|
19
19
|
else
|
20
20
|
unless definition.valid?(params[id])
|
21
|
-
raise "
|
21
|
+
raise BadParams.new("Incorrect format for param '#{id}'. Please encode it as #{definition.type}")
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
data/lib/sinatra/schema.rb
CHANGED
@@ -4,6 +4,7 @@ require "singleton"
|
|
4
4
|
require "multi_json"
|
5
5
|
|
6
6
|
require "sinatra/schema/definition"
|
7
|
+
require "sinatra/schema/error"
|
7
8
|
require "sinatra/schema/link"
|
8
9
|
require "sinatra/schema/param_parsing"
|
9
10
|
require "sinatra/schema/param_validation"
|
@@ -19,6 +20,15 @@ module Sinatra
|
|
19
20
|
def self.registered(app)
|
20
21
|
app.helpers ParamParsing
|
21
22
|
app.helpers ParamValidation
|
23
|
+
|
24
|
+
app.error(Sinatra::Schema::BadRequest) do |e|
|
25
|
+
halt(400, MultiJson.encode(error: e.message))
|
26
|
+
end
|
27
|
+
|
28
|
+
app.error(Sinatra::Schema::BadParams) do |e|
|
29
|
+
halt(422, MultiJson.encode(error: e.message))
|
30
|
+
end
|
31
|
+
|
22
32
|
app.get "/schema" do
|
23
33
|
content_type("application/schema+json")
|
24
34
|
response.headers["Cache-Control"] = "public, max-age=3600"
|
@@ -45,5 +45,12 @@ describe Sinatra::Schema::DSL::Definitions do
|
|
45
45
|
assert_equal 1, other.defs.size
|
46
46
|
assert_equal 1, resource.properties.size
|
47
47
|
end
|
48
|
+
|
49
|
+
it "raises when we can't resolve the ref" do
|
50
|
+
assert_raises(Sinatra::Schema::BadReference) do
|
51
|
+
dsl.ref :foobar
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
48
55
|
end
|
49
56
|
end
|
data/spec/integration_spec.rb
CHANGED
@@ -21,8 +21,21 @@ describe Sinatra::Schema do
|
|
21
21
|
MultiJson.decode(last_response.body))
|
22
22
|
end
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
describe "error handling" do
|
25
|
+
before do
|
26
|
+
header "Content-Type", "application/json"
|
27
|
+
end
|
28
|
+
|
29
|
+
it "converts BadRequest into a 400" do
|
30
|
+
post "/accounts", "{"
|
31
|
+
assert_equal 400, last_response.status
|
32
|
+
assert_equal({ "error" => "Invalid JSON encoded in request" }, last_json)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "converts BadParams into a 422" do
|
36
|
+
post "/accounts", "{}"
|
37
|
+
assert_equal 422, last_response.status
|
38
|
+
assert_equal({ "error" => "Missing expected params: email" }, last_json)
|
39
|
+
end
|
27
40
|
end
|
28
41
|
end
|
data/spec/param_parsing_spec.rb
CHANGED
@@ -16,11 +16,17 @@ describe Sinatra::Schema::ParamParsing do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
it "handles invalid json" do
|
19
|
-
assert_raises(
|
19
|
+
assert_raises(Sinatra::Schema::BadRequest) do
|
20
20
|
post "/", "{"
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
+
it "handles params not serialized as a hash" do
|
25
|
+
assert_raises(Sinatra::Schema::BadRequest) do
|
26
|
+
post "/", MultiJson.encode(["lolllll"])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
24
30
|
it "considers an empty body an empty hash" do
|
25
31
|
post "/", ""
|
26
32
|
assert_equal Hash.new, last_json
|
@@ -73,7 +79,7 @@ describe Sinatra::Schema::ParamParsing do
|
|
73
79
|
end
|
74
80
|
|
75
81
|
it "errors out on other formats" do
|
76
|
-
assert_raises(
|
82
|
+
assert_raises(Sinatra::Schema::BadRequest) do
|
77
83
|
header "Content-Type", "application/xml"
|
78
84
|
post "/", "<omg />"
|
79
85
|
end
|
@@ -14,28 +14,28 @@ describe Sinatra::Schema::ParamValidation do
|
|
14
14
|
|
15
15
|
it "errors out on unexpected params" do
|
16
16
|
$properties = {}
|
17
|
-
assert_raises(
|
17
|
+
assert_raises(Sinatra::Schema::BadParams) do
|
18
18
|
post "/", MultiJson.encode(foo: "bar")
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
22
|
it "errors out on missing params" do
|
23
23
|
$properties = { foo: Sinatra::Schema::Definition.new(type: "string") }
|
24
|
-
assert_raises(
|
24
|
+
assert_raises(Sinatra::Schema::BadParams) do
|
25
25
|
post "/", "{}"
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
29
|
it "errors out on wrong format" do
|
30
30
|
$properties = { bool: Sinatra::Schema::Definition.new(type: "boolean") }
|
31
|
-
assert_raises(
|
31
|
+
assert_raises(Sinatra::Schema::BadParams) do
|
32
32
|
post "/", MultiJson.encode(bool: "omg")
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
36
|
it "supports nested params" do
|
37
37
|
$properties = { foo: { bar: Sinatra::Schema::Definition.new(type: "boolean") }}
|
38
|
-
assert_raises(
|
38
|
+
assert_raises(Sinatra::Schema::BadParams) do
|
39
39
|
post "/", MultiJson.encode(foo: { bar: "omg" })
|
40
40
|
puts last_response.body
|
41
41
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sinatra-schema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pedro Belo
|
@@ -138,6 +138,7 @@ files:
|
|
138
138
|
- lib/sinatra/schema/dsl/definitions.rb
|
139
139
|
- lib/sinatra/schema/dsl/links.rb
|
140
140
|
- lib/sinatra/schema/dsl/resources.rb
|
141
|
+
- lib/sinatra/schema/error.rb
|
141
142
|
- lib/sinatra/schema/link.rb
|
142
143
|
- lib/sinatra/schema/param_parsing.rb
|
143
144
|
- lib/sinatra/schema/param_validation.rb
|