sinatra-swagger 0.1.1 → 0.2.0
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 +8 -8
- data/VERSION +1 -1
- data/lib/sinatra/swagger/param_validator.rb +55 -0
- data/lib/sinatra/swagger/spec_enforcer.rb +14 -57
- data/lib/sinatra/swagger/swagger_linked.rb +32 -0
- data/lib/swagger/base.rb +10 -2
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MjY0OWY2MzkyM2NiOWJhNWUxZjZiNjkwODhhMTgxNDkzMjBiNzI1NA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NTcwYmUxZGNhZTg5OTkwMzc1Y2YwOWYxYzBmNDQ2ZTQ4OGE2MjY3Ng==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
OTFkMjcyNGFjYjJhZDlkMWIyMTA4OGRmNjNjMzI2NWJmMGNiY2I0NTkxYTlk
|
10
|
+
MGY5NTI3ZDRiMTgwZDM0ZmUwMmVkMDdiNzZmMDAwZWQ3NzU1YjVhZTFhMGU1
|
11
|
+
ZjAzZmU2MzRiNTZkOTI2ZTE1OTY1ZTc3NTk5MWQ4YzU0ZTFjMDQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZWFkNGI4Y2EyYWEzOTU0ZjJkNjExMDEyNWNhNWNmMmE3ZGMyYWMxNDllOWE1
|
14
|
+
YjdjOGI5NjJjODVlZWJjZDQ2NmYzNjdlM2E3M2M2ZWMyM2ZhZDlkYjQ5ODQ0
|
15
|
+
ZWIxYjZhZTQ2NjQ2M2EzNzM3MmVlZDNiM2Q4ZmMzZTM5YzI0NWY=
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require "sinatra/swagger/swagger_linked"
|
2
|
+
|
3
|
+
module Sinatra
|
4
|
+
module Swagger
|
5
|
+
module ParamValidator
|
6
|
+
def self.registered(app)
|
7
|
+
app.register Swagger::SwaggerLinked
|
8
|
+
|
9
|
+
app.before do
|
10
|
+
next if swagger_spec.nil?
|
11
|
+
_, captures, spec = swagger_spec.values
|
12
|
+
|
13
|
+
invalidities = Hash[(spec['parameters'] || []).map { |details|
|
14
|
+
param_name = details['name']
|
15
|
+
|
16
|
+
parameter = case details['in']
|
17
|
+
when "query"
|
18
|
+
params[param_name]
|
19
|
+
when "path"
|
20
|
+
captures[param_name]
|
21
|
+
else
|
22
|
+
raise NotImplementedError, "Can't cope with #{details['in']} parameters right now"
|
23
|
+
end
|
24
|
+
|
25
|
+
if !parameter
|
26
|
+
next [param_name, :missing] if details['required'] && details['required'] != "false"
|
27
|
+
next unless details['default']
|
28
|
+
parameter = details['default']
|
29
|
+
end
|
30
|
+
|
31
|
+
begin
|
32
|
+
parameter = ::Swagger.cast(parameter.to_s, details['type']) if parameter
|
33
|
+
rescue ArgumentError
|
34
|
+
next [param_name, :incorrect_type]
|
35
|
+
end
|
36
|
+
|
37
|
+
if %w{integer number}.include? details['type']
|
38
|
+
too_large = details['maximum'] && parameter > details['maximum']
|
39
|
+
too_small = details['minimum'] && parameter < details['minimum']
|
40
|
+
next [param_name, :out_of_range] if too_large || too_small
|
41
|
+
end
|
42
|
+
|
43
|
+
params[param_name] = parameter
|
44
|
+
|
45
|
+
nil
|
46
|
+
}.compact]
|
47
|
+
|
48
|
+
halt 400, invalidities.to_json if invalidities.any?
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
register Swagger::ParamValidator
|
55
|
+
end
|
@@ -1,68 +1,25 @@
|
|
1
|
-
require "
|
2
|
-
require "swagger/rack"
|
1
|
+
require "sinatra/swagger/param_validator"
|
3
2
|
|
4
3
|
module Sinatra
|
5
4
|
module Swagger
|
6
5
|
module SpecEnforcer
|
7
|
-
def swagger(filepath)
|
8
|
-
set :swagger, ::Swagger::Base.new(filepath)
|
9
|
-
end
|
10
|
-
|
11
6
|
def self.registered(app)
|
12
|
-
app.
|
13
|
-
|
14
|
-
app.
|
15
|
-
|
16
|
-
unless
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
when "path"
|
26
|
-
captures[param_name]
|
27
|
-
else
|
28
|
-
raise NotImplementedError, "Can't cope with #{details['in']} parameters right now"
|
29
|
-
end
|
30
|
-
|
31
|
-
if !parameter
|
32
|
-
next [param_name, :missing] if details['required'] && details['required'] != "false"
|
33
|
-
next unless details['default']
|
34
|
-
parameter = details['default']
|
35
|
-
end
|
36
|
-
|
37
|
-
begin
|
38
|
-
parameter = ::Swagger.cast(parameter.to_s, details['type']) if parameter
|
39
|
-
rescue ArgumentError
|
40
|
-
next [param_name, :incorrect_type]
|
41
|
-
end
|
42
|
-
|
43
|
-
if %w{integer number}.include? details['type']
|
44
|
-
too_large = details['maximum'] && parameter > details['maximum']
|
45
|
-
too_small = details['minimum'] && parameter < details['minimum']
|
46
|
-
next [param_name, :out_of_range] if too_large || too_small
|
47
|
-
end
|
48
|
-
|
49
|
-
params[param_name] = parameter
|
50
|
-
|
51
|
-
nil
|
52
|
-
}.compact]
|
53
|
-
|
54
|
-
halt 400, invalidities.to_json if invalidities.any?
|
7
|
+
app.register Swagger::SwaggerLinked
|
8
|
+
|
9
|
+
app.after do
|
10
|
+
next unless response.content_type =~ %r{^application/(?:.+\+)?json$}
|
11
|
+
next unless body = JSON.parse(response.body.first) rescue nil
|
12
|
+
next if swagger_spec.nil?
|
13
|
+
schema = schema_from_spec_at("responses/#{response.status}/schema")
|
14
|
+
next if schema.nil?
|
15
|
+
begin
|
16
|
+
JSON::Validator.validate!(schema, body)
|
17
|
+
rescue JSON::Schema::ValidationError => e
|
18
|
+
e.message = "Response JSON did not match the Swagger schema: #{e.message}"
|
19
|
+
raise e
|
55
20
|
end
|
56
21
|
end
|
57
22
|
end
|
58
|
-
|
59
|
-
module Helpers
|
60
|
-
def swagger_spec
|
61
|
-
settings.swagger.request_spec(env: env)
|
62
|
-
end
|
63
|
-
end
|
64
23
|
end
|
65
24
|
end
|
66
|
-
|
67
|
-
register Swagger::SpecEnforcer
|
68
25
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "swagger/rack"
|
2
|
+
|
3
|
+
module Sinatra
|
4
|
+
module Swagger
|
5
|
+
module SwaggerLinked
|
6
|
+
def swagger(filepath)
|
7
|
+
set :swagger, ::Swagger::Base.from_file(filepath)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.registered(app)
|
11
|
+
app.helpers Helpers
|
12
|
+
end
|
13
|
+
|
14
|
+
module Helpers
|
15
|
+
def swagger_spec
|
16
|
+
raise "No swagger file loaded" unless settings.swagger
|
17
|
+
settings.swagger.request_spec(env: env)
|
18
|
+
end
|
19
|
+
|
20
|
+
def schema_from_spec_at(path)
|
21
|
+
schema = swagger_spec[:spec]
|
22
|
+
path.split("/").each do |key|
|
23
|
+
schema = schema[YAML.load(key)]
|
24
|
+
return if schema.nil?
|
25
|
+
end
|
26
|
+
schema['definitions'] = settings.swagger['definitions'] if settings.swagger['definitions']
|
27
|
+
schema
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/swagger/base.rb
CHANGED
@@ -25,9 +25,17 @@ module Swagger
|
|
25
25
|
JSON::Validator.add_schema(JSON::Schema.new(data, data['id']))
|
26
26
|
end
|
27
27
|
|
28
|
-
def initialize(
|
29
|
-
@spec =
|
28
|
+
def initialize(data)
|
29
|
+
@spec = data
|
30
30
|
JSON::Validator.validate!({ "$ref" => "http://swagger.io/v2/schema.json#" }, @spec)
|
31
31
|
end
|
32
|
+
|
33
|
+
def self.from_file(filepath)
|
34
|
+
new(YAML.load(open(filepath)))
|
35
|
+
end
|
36
|
+
|
37
|
+
def [](key)
|
38
|
+
@spec[key]
|
39
|
+
end
|
32
40
|
end
|
33
41
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sinatra-swagger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- JP Hastings-Spital
|
@@ -81,7 +81,9 @@ files:
|
|
81
81
|
- Rakefile
|
82
82
|
- VERSION
|
83
83
|
- lib/sinatra/swagger.rb
|
84
|
+
- lib/sinatra/swagger/param_validator.rb
|
84
85
|
- lib/sinatra/swagger/spec_enforcer.rb
|
86
|
+
- lib/sinatra/swagger/swagger_linked.rb
|
85
87
|
- lib/sinatra/swagger/version.rb
|
86
88
|
- lib/swagger/base.rb
|
87
89
|
- lib/swagger/rack.rb
|