skeleton 0.3.3 → 0.4.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 +4 -4
- data/.gitignore +1 -0
- data/README.md +140 -65
- data/Rakefile +10 -3
- data/lib/skeleton.rb +6 -10
- data/lib/skeleton/contact.rb +1 -13
- data/lib/skeleton/error.rb +4 -0
- data/lib/skeleton/graph.rb +56 -0
- data/lib/skeleton/header.rb +2 -63
- data/lib/skeleton/items.rb +34 -0
- data/lib/skeleton/license.rb +1 -12
- data/lib/skeleton/model.rb +13 -17
- data/lib/skeleton/operation.rb +50 -121
- data/lib/skeleton/parameter.rb +31 -88
- data/lib/skeleton/parameters.rb +40 -0
- data/lib/skeleton/path.rb +42 -80
- data/lib/skeleton/presenter.rb +19 -0
- data/lib/skeleton/property.rb +6 -0
- data/lib/skeleton/response.rb +24 -45
- data/lib/skeleton/schema.rb +80 -63
- data/lib/skeleton/scope.rb +18 -0
- data/lib/skeleton/security_scheme.rb +19 -37
- data/lib/skeleton/serializers/options.rb +215 -0
- data/lib/skeleton/serializers/swagger.rb +197 -0
- data/lib/skeleton/structure.rb +92 -138
- data/lib/skeleton/swagger.rb +9 -0
- data/lib/skeleton/tag.rb +11 -16
- data/lib/skeleton/version.rb +1 -1
- data/skeleton.gemspec +2 -0
- data/test/fixtures/json-schema-draft-04.json +150 -0
- data/test/fixtures/schema.json +1482 -0
- data/test/integrations/validate_complex_schema_spec.rb +42 -0
- data/test/skeleton/graph_test.rb +22 -0
- data/test/skeleton/mapper_test.rb +84 -0
- data/test/skeleton/operation_test.rb +11 -0
- data/test/skeleton/parameter_test.rb +34 -0
- data/test/skeleton/parameters_test.rb +9 -0
- data/test/skeleton/path_test.rb +46 -0
- data/test/skeleton/property_test.rb +8 -0
- data/test/skeleton/serializers/options_test.rb +68 -0
- data/test/skeleton/serializers/swagger_test.rb +30 -0
- data/test/support/factories/structure_factory.rb +86 -0
- data/test/support/fixtures.rb +6 -0
- data/test/support/kissmetrics/core_api.rb +542 -0
- data/{spec/spec_helper.rb → test/test_helper.rb} +7 -1
- metadata +73 -25
- data/lib/skeleton/config.rb +0 -37
- data/lib/skeleton/documentation.rb +0 -17
- data/lib/skeleton/example.rb +0 -31
- data/lib/skeleton/headers.rb +0 -50
- data/lib/skeleton/helpers/controller_helpers.rb +0 -25
- data/lib/skeleton/info.rb +0 -40
- data/lib/skeleton/item.rb +0 -99
- data/lib/skeleton/responses.rb +0 -59
- data/lib/skeleton/scopes.rb +0 -24
- data/lib/skeleton/security_definitions.rb +0 -46
- data/lib/skeleton/security_requirement.rb +0 -29
- data/spec/integrations/use_case_spec.rb +0 -131
- data/spec/skeleton/operation_spec.rb +0 -113
- data/spec/skeleton/serializers/contact_spec.rb +0 -30
- data/spec/skeleton/serializers/documentation_spec.rb +0 -23
- data/spec/skeleton/serializers/header_spec.rb +0 -57
data/lib/skeleton/responses.rb
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
require 'skeleton/model'
|
2
|
-
require 'skeleton/response'
|
3
|
-
|
4
|
-
module Skeleton
|
5
|
-
class Responses < Model
|
6
|
-
attr_accessor :default
|
7
|
-
attr_presence :default
|
8
|
-
|
9
|
-
def initialize(args={})
|
10
|
-
@responses = {}
|
11
|
-
args.each { |k, v| set(k, v) }
|
12
|
-
end
|
13
|
-
|
14
|
-
def get(code)
|
15
|
-
@responses[code]
|
16
|
-
end
|
17
|
-
alias_method :[], :get
|
18
|
-
|
19
|
-
def set(code, value)
|
20
|
-
case value
|
21
|
-
when Hash
|
22
|
-
@responses[code] = Skeleton::Response.new(value)
|
23
|
-
else
|
24
|
-
@responses[code] = value
|
25
|
-
end
|
26
|
-
end
|
27
|
-
alias_method :[]=, :set
|
28
|
-
|
29
|
-
def empty?
|
30
|
-
@responses.empty?
|
31
|
-
end
|
32
|
-
|
33
|
-
def to_h
|
34
|
-
hash = {}
|
35
|
-
hash[:default] = default.to_h if default?
|
36
|
-
@responses.each do |code, response|
|
37
|
-
if response.respond_to?(:to_h)
|
38
|
-
hash[code] = response.to_h
|
39
|
-
else
|
40
|
-
hash[code] = response
|
41
|
-
end
|
42
|
-
end
|
43
|
-
hash
|
44
|
-
end
|
45
|
-
|
46
|
-
def to_swagger_hash
|
47
|
-
hash = {}
|
48
|
-
hash[:default] = default.to_h if default?
|
49
|
-
@responses.each do |code, response|
|
50
|
-
if response.respond_to?(:to_swagger_hash)
|
51
|
-
hash[code] = response.to_swagger_hash
|
52
|
-
else
|
53
|
-
hash[code] = response
|
54
|
-
end
|
55
|
-
end
|
56
|
-
hash
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
data/lib/skeleton/scopes.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'skeleton/model'
|
2
|
-
|
3
|
-
module Skeleton
|
4
|
-
class Scopes < Model
|
5
|
-
attr_reader :scopes
|
6
|
-
|
7
|
-
def initialize
|
8
|
-
@scopes = {}
|
9
|
-
end
|
10
|
-
|
11
|
-
def [](name)
|
12
|
-
@scopes[name]
|
13
|
-
end
|
14
|
-
|
15
|
-
def []=(name, description)
|
16
|
-
@scopes[name] = description
|
17
|
-
end
|
18
|
-
|
19
|
-
def to_h
|
20
|
-
@scopes
|
21
|
-
end
|
22
|
-
alias_method :to_swagger_hash, :to_h
|
23
|
-
end
|
24
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'skeleton/model'
|
2
|
-
require 'skeleton/security_scheme'
|
3
|
-
|
4
|
-
module Skeleton
|
5
|
-
class SecurityDefinitions < Model
|
6
|
-
def initialize(args={})
|
7
|
-
@schemes = {}
|
8
|
-
args.each { |k, v| set(k, v) }
|
9
|
-
end
|
10
|
-
|
11
|
-
def get(name)
|
12
|
-
@schemes[name]
|
13
|
-
end
|
14
|
-
alias_method :[], :get
|
15
|
-
|
16
|
-
def set(name, value)
|
17
|
-
case value
|
18
|
-
when Hash
|
19
|
-
@schemes[name] = Skeleton::SecurityScheme.new(value)
|
20
|
-
else
|
21
|
-
@schemes[name] = value
|
22
|
-
end
|
23
|
-
end
|
24
|
-
alias_method :[]=, :set
|
25
|
-
|
26
|
-
def empty?
|
27
|
-
!@schemes.empty?
|
28
|
-
end
|
29
|
-
|
30
|
-
def to_h
|
31
|
-
hash = {}
|
32
|
-
@schemes.each do |name, scheme|
|
33
|
-
hash[name] = scheme.to_h
|
34
|
-
end
|
35
|
-
hash
|
36
|
-
end
|
37
|
-
|
38
|
-
def to_swagger_hash
|
39
|
-
hash = {}
|
40
|
-
@schemes.each do |name, scheme|
|
41
|
-
hash[name] = scheme.to_swagger_hash
|
42
|
-
end
|
43
|
-
hash
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
require 'skeleton/model'
|
2
|
-
|
3
|
-
module Skeleton
|
4
|
-
class SecurityRequirement < Model
|
5
|
-
def initialize(args={})
|
6
|
-
@requirements = []
|
7
|
-
args.each { |name, value| set(name, value) }
|
8
|
-
end
|
9
|
-
|
10
|
-
def get(name)
|
11
|
-
@requirements[name]
|
12
|
-
end
|
13
|
-
alias_method :[], :get
|
14
|
-
|
15
|
-
def set(name, value)
|
16
|
-
@requirements[name] = Array(value)
|
17
|
-
end
|
18
|
-
alias_method :[]=, :set
|
19
|
-
|
20
|
-
def to_h
|
21
|
-
hash = {}
|
22
|
-
@requirements.each do |name, definition|
|
23
|
-
hash[name] = definition
|
24
|
-
end
|
25
|
-
hash
|
26
|
-
end
|
27
|
-
alias_method :to_swagger_hash, :to_h
|
28
|
-
end
|
29
|
-
end
|
@@ -1,131 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
require 'skeleton'
|
4
|
-
|
5
|
-
describe 'A simple use case' do
|
6
|
-
describe 'validating the first case' do
|
7
|
-
it 'works' do
|
8
|
-
@structure = Skeleton.build do |s|
|
9
|
-
s.host = 'api.example.com'
|
10
|
-
s.info.version = '1.0'
|
11
|
-
s.info.title = 'Waffles Emporium API'
|
12
|
-
s.info.description = 'A test integration'
|
13
|
-
|
14
|
-
s.info.contact.name = 'WarmWaffles'
|
15
|
-
s.info.contact.email = 'warmwaffles@gmail.com'
|
16
|
-
s.info.contact.url = 'https://github.com/warmwaffles/skeleton'
|
17
|
-
|
18
|
-
s.info.license.name = 'MIT'
|
19
|
-
|
20
|
-
s.schemes = %w(https)
|
21
|
-
s.consumes = %(application/json)
|
22
|
-
s.produces = %(application/json)
|
23
|
-
|
24
|
-
s.path('/users') do |path|
|
25
|
-
path.get do |o|
|
26
|
-
o.tag('users')
|
27
|
-
o.parameter(:query, 'limit') do |p|
|
28
|
-
p.description = 'maximum number of results to return'
|
29
|
-
p.type = 'integer'
|
30
|
-
p.format = 'int32'
|
31
|
-
p.required = false
|
32
|
-
end
|
33
|
-
o.parameter(:query, 'offset') do |p|
|
34
|
-
p.description = 'offset within the results returned'
|
35
|
-
p.type = 'integer'
|
36
|
-
p.format = 'int32'
|
37
|
-
p.required = false
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
path.post do |o|
|
42
|
-
o.tag('user')
|
43
|
-
o.parameter(:body, 'user[email]') do |p|
|
44
|
-
p.description = 'the user email'
|
45
|
-
p.type = 'string'
|
46
|
-
p.required = true
|
47
|
-
end
|
48
|
-
o.parameter(:body, 'user[name]') do |p|
|
49
|
-
p.description = 'the user name'
|
50
|
-
p.type = 'string'
|
51
|
-
p.required = true
|
52
|
-
end
|
53
|
-
o.parameter(:body, 'user[password]') do |p|
|
54
|
-
p.description = 'the user password'
|
55
|
-
p.type = 'string'
|
56
|
-
p.required = true
|
57
|
-
end
|
58
|
-
o.parameter(:body, 'user[password_confirmation]') do |p|
|
59
|
-
p.description = 'the user password confirmation'
|
60
|
-
p.type = 'string'
|
61
|
-
p.required = true
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
s.path('/users/{user_id}') do |path|
|
67
|
-
path.get do |o|
|
68
|
-
o.tag('user')
|
69
|
-
o.parameter(:query, 'user_id') do |p|
|
70
|
-
p.description = 'the user id'
|
71
|
-
p.type = 'string'
|
72
|
-
p.format = 'uuid'
|
73
|
-
p.required = true
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
path.put do |o|
|
78
|
-
o.tag('user')
|
79
|
-
o.parameter(:body, 'user[email]') do |p|
|
80
|
-
p.description = 'the user email'
|
81
|
-
p.type = 'string'
|
82
|
-
p.required = false
|
83
|
-
end
|
84
|
-
o.parameter(:body, 'user[name]') do |p|
|
85
|
-
p.description = 'the user name'
|
86
|
-
p.type = 'string'
|
87
|
-
p.required = false
|
88
|
-
end
|
89
|
-
o.parameter(:body, 'user[password]') do |p|
|
90
|
-
p.description = 'the user password'
|
91
|
-
p.type = 'string'
|
92
|
-
p.required = false
|
93
|
-
end
|
94
|
-
o.parameter(:body, 'user[password_confirmation]') do |p|
|
95
|
-
p.description = 'the user password confirmation'
|
96
|
-
p.type = 'string'
|
97
|
-
p.required = false
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
path.patch do |o|
|
102
|
-
o.tag('user')
|
103
|
-
o.parameter(:body, 'user[email]') do |p|
|
104
|
-
p.description = 'the user email'
|
105
|
-
p.type = 'string'
|
106
|
-
p.required = false
|
107
|
-
end
|
108
|
-
o.parameter(:body, 'user[name]') do |p|
|
109
|
-
p.description = 'the user name'
|
110
|
-
p.type = 'string'
|
111
|
-
p.required = false
|
112
|
-
end
|
113
|
-
o.parameter(:body, 'user[password]') do |p|
|
114
|
-
p.description = 'the user password'
|
115
|
-
p.type = 'string'
|
116
|
-
p.required = false
|
117
|
-
end
|
118
|
-
o.parameter(:body, 'user[password_confirmation]') do |p|
|
119
|
-
p.description = 'the user password confirmation'
|
120
|
-
p.type = 'string'
|
121
|
-
p.required = false
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
@structure.to_json
|
127
|
-
@structure.to_swagger_json
|
128
|
-
end
|
129
|
-
|
130
|
-
end
|
131
|
-
end
|
@@ -1,113 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
require 'skeleton/operation'
|
4
|
-
|
5
|
-
describe Skeleton::Operation do
|
6
|
-
describe '#summary=' do
|
7
|
-
it 'sets the summary' do
|
8
|
-
operation = Skeleton::Operation.new
|
9
|
-
operation.summary = 'foo bar'
|
10
|
-
assert_equal('foo bar', operation.summary)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
describe '#summary?' do
|
15
|
-
context 'when not set' do
|
16
|
-
it 'returns false' do
|
17
|
-
operation = Skeleton::Operation.new
|
18
|
-
refute(operation.summary?)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
context 'when set' do
|
23
|
-
it 'returns true' do
|
24
|
-
operation = Skeleton::Operation.new(summary: 'foo bar')
|
25
|
-
assert(operation.summary?)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe '#consumes' do
|
31
|
-
context 'when not set' do
|
32
|
-
it 'returns an empty array' do
|
33
|
-
operation = Skeleton::Operation.new
|
34
|
-
assert_empty(operation.consumes)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
context 'when set' do
|
39
|
-
it 'returns strings' do
|
40
|
-
operation = Skeleton::Operation.new({consumes: ['application/json', 'application/xml']})
|
41
|
-
assert_includes(operation.consumes, 'application/json')
|
42
|
-
assert_includes(operation.consumes, 'application/xml')
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
describe '#consumes?' do
|
48
|
-
context 'when not set' do
|
49
|
-
it 'returns an empty array' do
|
50
|
-
operation = Skeleton::Operation.new
|
51
|
-
refute(operation.consumes?)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
context 'when set' do
|
56
|
-
it 'returns strings' do
|
57
|
-
operation = Skeleton::Operation.new({consumes: ['application/json', 'application/xml']})
|
58
|
-
assert(operation.consumes?)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
describe '#produces' do
|
64
|
-
context 'when not set' do
|
65
|
-
it 'returns an empty array' do
|
66
|
-
operation = Skeleton::Operation.new
|
67
|
-
assert_empty(operation.produces)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
context 'when set' do
|
72
|
-
it 'returns strings' do
|
73
|
-
operation = Skeleton::Operation.new({produces: ['application/json', 'application/xml']})
|
74
|
-
assert_includes(operation.produces, 'application/json')
|
75
|
-
assert_includes(operation.produces, 'application/xml')
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
describe '#produces?' do
|
81
|
-
context 'when not set' do
|
82
|
-
it 'returns an empty array' do
|
83
|
-
operation = Skeleton::Operation.new
|
84
|
-
refute(operation.produces?)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
context 'when set' do
|
89
|
-
it 'returns strings' do
|
90
|
-
operation = Skeleton::Operation.new({produces: ['application/json', 'application/xml']})
|
91
|
-
assert(operation.produces?)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
describe '#to_h' do
|
97
|
-
context 'when nothing is set' do
|
98
|
-
it 'returns an empty hash' do
|
99
|
-
operation = Skeleton::Operation.new
|
100
|
-
assert_empty(operation.to_h)
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
context 'when consumes is set' do
|
105
|
-
it 'returns a hash with the consumes field' do
|
106
|
-
operation = Skeleton::Operation.new({consumes: ['application/json', 'application/xml']})
|
107
|
-
hash = operation.to_h
|
108
|
-
refute_empty(hash, 'expected the hash to contain data')
|
109
|
-
assert(hash.key?(:consumes), 'expected the hash to contain :consumes')
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
require 'skeleton/contact'
|
4
|
-
|
5
|
-
describe Skeleton::Contact do
|
6
|
-
before do
|
7
|
-
@contact = Skeleton::Contact.new
|
8
|
-
end
|
9
|
-
|
10
|
-
describe '#name=' do
|
11
|
-
it 'sets the name' do
|
12
|
-
@contact.name = 'foo'
|
13
|
-
assert_equal('foo', @contact.name)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
describe '#email=' do
|
18
|
-
it 'sets the email' do
|
19
|
-
@contact.email = 'foo'
|
20
|
-
assert_equal('foo', @contact.email)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
describe '#url=' do
|
25
|
-
it 'sets the url' do
|
26
|
-
@contact.url = 'foo'
|
27
|
-
assert_equal('foo', @contact.url)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
require 'skeleton/documentation'
|
4
|
-
|
5
|
-
describe Skeleton::Documentation do
|
6
|
-
before do
|
7
|
-
@documentation = Skeleton::Documentation.new
|
8
|
-
end
|
9
|
-
|
10
|
-
describe '#description=' do
|
11
|
-
it 'sets the description' do
|
12
|
-
@documentation.description = 'foo'
|
13
|
-
assert_equal('foo', @documentation.description)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
describe '#url=' do
|
18
|
-
it 'sets the url' do
|
19
|
-
@documentation.url = 'foo'
|
20
|
-
assert_equal('foo', @documentation.url)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|