swagger_model 0.3.6 → 0.4.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 +4 -4
- data/Gemfile.lock +1 -1
- data/lib/swagger_model/attributes.rb +127 -0
- data/lib/swagger_model/included.rb +15 -0
- data/lib/swagger_model/links.rb +38 -0
- data/lib/swagger_model/model.rb +43 -0
- data/lib/swagger_model/relation.rb +19 -0
- data/lib/swagger_model/relation_data.rb +21 -0
- data/lib/swagger_model/relation_data_array.rb +26 -0
- data/lib/swagger_model/relationships.rb +50 -0
- data/lib/swagger_model/version.rb +1 -1
- data/lib/swagger_model.rb +44 -46
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7f7c65359fa58890e69ebd599e538474dfaae1ac
|
4
|
+
data.tar.gz: 0635b5d20453ea7cb40225142af9a7bd6e611f5d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ee8642f285940a7503b119817dee9bd41f167129f9606228a17467830ab4adcd76f33995b4ea4a241abc93dc79b3a403a32c07390f98a0f4aff0f367eab824b
|
7
|
+
data.tar.gz: a94348c709d7195b3f1a253fc4135fb829faa11dec6674bc9c9a40ee178804f31ad73aede8e20d5ab3fd170b958452a7a757d6d05b11b44617a34e53dc044c76
|
data/Gemfile.lock
CHANGED
@@ -0,0 +1,127 @@
|
|
1
|
+
require_relative 'relationships'
|
2
|
+
|
3
|
+
module SwaggerModel
|
4
|
+
module SwaggerV2
|
5
|
+
class Attributes
|
6
|
+
def initialize(hash, model_name, suffix='Attributes')
|
7
|
+
@attributes = []
|
8
|
+
@suffix = suffix
|
9
|
+
@model_name = model_name
|
10
|
+
hash.keys.each do |key|
|
11
|
+
value = hash[key]
|
12
|
+
attribute = get_attribute(value, key)
|
13
|
+
attribute['key'] = key
|
14
|
+
@attributes.push(attribute)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_swagger_hash(model)
|
19
|
+
hash = {
|
20
|
+
'type' => 'object'
|
21
|
+
}
|
22
|
+
properties = {}
|
23
|
+
@attributes.each do |e|
|
24
|
+
attribute = get_attribute_swagger(e, model)
|
25
|
+
properties[e['key']] = attribute
|
26
|
+
end
|
27
|
+
hash['properties'] = properties
|
28
|
+
hash['required'] = properties.keys
|
29
|
+
name = @model_name + @suffix
|
30
|
+
model[name] = hash
|
31
|
+
{
|
32
|
+
'$ref': "#/definitions/#{name}"
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
def get_attribute_swagger(e, model)
|
38
|
+
attribute = {}
|
39
|
+
type = e['type']
|
40
|
+
key = e['key']
|
41
|
+
case e['type']
|
42
|
+
when 'object'
|
43
|
+
name = ActiveSupport::Inflector.classify(key.gsub('-', '_'))
|
44
|
+
attribute_name = @model_name + name + 'Attributes'
|
45
|
+
attribute['$ref'] = "#/definitions/#{attribute_name}"
|
46
|
+
e['attributes'].to_swagger_hash(model)
|
47
|
+
when 'array'
|
48
|
+
attribute['type'] = e['type']
|
49
|
+
attribute['items'] = get_attribute_swagger(e['item'], model)
|
50
|
+
else
|
51
|
+
attribute['type'] = e['type']
|
52
|
+
attribute['format'] = e['format'] unless e['format'].nil?
|
53
|
+
attribute['example'] = e['example'] unless e['fexample'].nil?
|
54
|
+
end
|
55
|
+
attribute
|
56
|
+
end
|
57
|
+
def date_time_valid?(str)
|
58
|
+
if (!! Date.parse(str) rescue false)
|
59
|
+
date = Date._parse(str)
|
60
|
+
!date[:zone].nil? && !date[:hour].nil? && !date[:min].nil? && !date[:sec].nil? && !date[:year].nil? && !date[:mon].nil?
|
61
|
+
else
|
62
|
+
false
|
63
|
+
end
|
64
|
+
end
|
65
|
+
def get_attribute(value, key)
|
66
|
+
attribute = {}
|
67
|
+
type = get_type(value)
|
68
|
+
case type
|
69
|
+
when 'date-time'
|
70
|
+
attribute = {
|
71
|
+
'type' => 'string',
|
72
|
+
'format' => 'date-time',
|
73
|
+
'example' => value
|
74
|
+
}
|
75
|
+
when 'float'
|
76
|
+
attribute = {
|
77
|
+
'type' => 'number',
|
78
|
+
'format' => 'float',
|
79
|
+
'example' => value
|
80
|
+
}
|
81
|
+
when nil
|
82
|
+
attribute = {}
|
83
|
+
when 'object'
|
84
|
+
name = ActiveSupport::Inflector.classify(key.gsub('-', '_'))
|
85
|
+
attribute = {
|
86
|
+
'type' => 'object',
|
87
|
+
'attributes' => Attributes.new(value, @model_name + name)
|
88
|
+
}
|
89
|
+
when 'array'
|
90
|
+
item = value.first
|
91
|
+
attribute = {
|
92
|
+
'type' => 'array',
|
93
|
+
'item' => get_attribute(item)
|
94
|
+
}
|
95
|
+
else
|
96
|
+
attribute = {
|
97
|
+
'type' => type
|
98
|
+
}
|
99
|
+
end
|
100
|
+
attribute
|
101
|
+
end
|
102
|
+
def get_type(value)
|
103
|
+
type_class = value.class.to_s
|
104
|
+
case type_class
|
105
|
+
when 'Hash'
|
106
|
+
'object'
|
107
|
+
when 'Array'
|
108
|
+
'array'
|
109
|
+
when 'String'
|
110
|
+
if date_time_valid?(value)
|
111
|
+
'date-time'
|
112
|
+
else
|
113
|
+
'string'
|
114
|
+
end
|
115
|
+
when 'Fixnum'
|
116
|
+
'integer'
|
117
|
+
when 'TrueClass', 'FalseClass'
|
118
|
+
'boolean'
|
119
|
+
when 'Float'
|
120
|
+
'float'
|
121
|
+
else
|
122
|
+
nil
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module SwaggerModel
|
2
|
+
module SwaggerV2
|
3
|
+
class Included
|
4
|
+
def initialize(array)
|
5
|
+
@models = array.map { |e| Model.new(e) }
|
6
|
+
end
|
7
|
+
|
8
|
+
def models_to_swagger_hash(model)
|
9
|
+
@models.each do |e|
|
10
|
+
e.to_swagger_hash(model)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module SwaggerModel
|
2
|
+
module SwaggerV2
|
3
|
+
class Links
|
4
|
+
def self.template
|
5
|
+
{
|
6
|
+
'type' => 'object',
|
7
|
+
'properties' => {
|
8
|
+
'self' => {
|
9
|
+
'type' => "string",
|
10
|
+
'example' => "http://example.com?page=2"
|
11
|
+
},
|
12
|
+
'first' => {
|
13
|
+
'type' => "string",
|
14
|
+
'example' => "http://example.com?page=1"
|
15
|
+
},
|
16
|
+
'prev' => {
|
17
|
+
'type' => "string",
|
18
|
+
'example' => "http://example.com?page=1"
|
19
|
+
},
|
20
|
+
'next' => {
|
21
|
+
'type' => "string",
|
22
|
+
'example' => "http://example.com?page=3"
|
23
|
+
},
|
24
|
+
'last' => {
|
25
|
+
'type' => "string",
|
26
|
+
'example' => "http://example.com?page=100"
|
27
|
+
}
|
28
|
+
},
|
29
|
+
'required' => [
|
30
|
+
'self',
|
31
|
+
'first',
|
32
|
+
'last'
|
33
|
+
]
|
34
|
+
}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require_relative 'relationships'
|
2
|
+
require_relative 'attributes'
|
3
|
+
|
4
|
+
module SwaggerModel
|
5
|
+
module SwaggerV2
|
6
|
+
class Model
|
7
|
+
def initialize(hash)
|
8
|
+
@id = hash['id']
|
9
|
+
@type = hash['type']
|
10
|
+
@model_name = ActiveSupport::Inflector.classify(@type.gsub('-', '_'))
|
11
|
+
@attributes = Attributes.new(hash['attributes'], @model_name)
|
12
|
+
if !hash['relationships'].nil?
|
13
|
+
@relationships = Relationships.new(hash['relationships'])
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_swagger_hash(model)
|
18
|
+
model[@model_name] = {}
|
19
|
+
aModel = model[@model_name]
|
20
|
+
hash = {
|
21
|
+
'type' => 'object',
|
22
|
+
'properties' => {
|
23
|
+
'id' => {
|
24
|
+
'type' => 'string',
|
25
|
+
'example' => @id
|
26
|
+
},
|
27
|
+
'type' => {
|
28
|
+
'type' => 'string',
|
29
|
+
'example' => @type
|
30
|
+
},
|
31
|
+
'attributes' => @attributes.to_swagger_hash(aModel)
|
32
|
+
}
|
33
|
+
}
|
34
|
+
hash['properties']['relationships'] = @relationships.to_swagger_hash(aModel, @model_name) unless @relationships.nil?
|
35
|
+
aModel[@model_name] = hash
|
36
|
+
|
37
|
+
{
|
38
|
+
'$ref' => "#/definitions/#{@model_name}"
|
39
|
+
}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'active_support/core_ext'
|
3
|
+
|
4
|
+
module SwaggerModel
|
5
|
+
module SwaggerV2
|
6
|
+
class Relation
|
7
|
+
def initialize(hash)
|
8
|
+
@type = hash['type']
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_swagger_hash
|
12
|
+
model_name = ActiveSupport::Inflector.classify(@type.gsub('-', '_'))
|
13
|
+
{
|
14
|
+
'$ref' => "#/definitions/#{model_name}"
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module SwaggerModel
|
2
|
+
module SwaggerV2
|
3
|
+
class RelationData
|
4
|
+
def initialize(hash)
|
5
|
+
@relation = Relation.new(hash)
|
6
|
+
end
|
7
|
+
|
8
|
+
def to_swagger_hash(key, parent_name)
|
9
|
+
name = parent_name + ActiveSupport::Inflector.classify(key.gsub('-', '_')) + 'Data'
|
10
|
+
{
|
11
|
+
name => {
|
12
|
+
'type' => 'object',
|
13
|
+
'properties' => {
|
14
|
+
'data' => @relation.to_swagger_hash
|
15
|
+
}
|
16
|
+
}
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative 'relation'
|
2
|
+
|
3
|
+
module SwaggerModel
|
4
|
+
module SwaggerV2
|
5
|
+
class RelationDataArray
|
6
|
+
def initialize(array)
|
7
|
+
@relation = Relation.new(array.first)
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_swagger_hash(key, parent_name)
|
11
|
+
name = parent_name + ActiveSupport::Inflector.classify(key.gsub('-', '_')) + 'Data'
|
12
|
+
{
|
13
|
+
name => {
|
14
|
+
'type' => 'object',
|
15
|
+
'properties' => {
|
16
|
+
'data' => {
|
17
|
+
'type' => 'array',
|
18
|
+
'items' => @relation.to_swagger_hash
|
19
|
+
}
|
20
|
+
}
|
21
|
+
}
|
22
|
+
}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require_relative 'relation_data'
|
2
|
+
require_relative 'relation_data_array'
|
3
|
+
|
4
|
+
module SwaggerModel
|
5
|
+
module SwaggerV2
|
6
|
+
class Relationships
|
7
|
+
def initialize(hash)
|
8
|
+
@relationships = []
|
9
|
+
hash.keys.each do |key|
|
10
|
+
relation_data = hash[key]['data']
|
11
|
+
data = ''
|
12
|
+
case relation_data.class.to_s
|
13
|
+
when 'Hash'
|
14
|
+
data = RelationData.new(relation_data)
|
15
|
+
when 'Array'
|
16
|
+
data = RelationDataArray.new(relation_data)
|
17
|
+
end
|
18
|
+
relationship = {
|
19
|
+
'key' => key,
|
20
|
+
'data' => data
|
21
|
+
}
|
22
|
+
@relationships.push(relationship)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
def to_swagger_hash(model, model_name)
|
26
|
+
hash = {
|
27
|
+
'type' => 'object'
|
28
|
+
}
|
29
|
+
properties = {}
|
30
|
+
@relationships.each do |r|
|
31
|
+
parent_name = model_name + 'Relationships'
|
32
|
+
swagger_hash = r['data'].to_swagger_hash(r['key'], parent_name)
|
33
|
+
name = swagger_hash.keys.first
|
34
|
+
properties[r['key']] = {
|
35
|
+
'$ref' => "#/definitions/#{name}"
|
36
|
+
}
|
37
|
+
model[name] = swagger_hash[name]
|
38
|
+
end
|
39
|
+
hash['properties'] = properties
|
40
|
+
hash['required'] = properties.keys
|
41
|
+
name = model_name + 'Relationships'
|
42
|
+
model[name] = hash
|
43
|
+
|
44
|
+
{
|
45
|
+
'$ref' => "#/definitions/#{name}"
|
46
|
+
}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/swagger_model.rb
CHANGED
@@ -7,6 +7,12 @@ require 'active_support/core_ext'
|
|
7
7
|
require 'fileutils'
|
8
8
|
require 'logger'
|
9
9
|
|
10
|
+
require_relative 'swagger_model/links'
|
11
|
+
require_relative 'swagger_model/relationships'
|
12
|
+
require_relative 'swagger_model/model'
|
13
|
+
require_relative 'swagger_model/included'
|
14
|
+
require_relative 'swagger_model/attributes'
|
15
|
+
|
10
16
|
module SwaggerModel
|
11
17
|
module OpenAPIv3
|
12
18
|
def self.date_time_valid?(str)
|
@@ -229,16 +235,8 @@ module SwaggerModel
|
|
229
235
|
end
|
230
236
|
obj['$ref'] = '#/definitions/' + model_name
|
231
237
|
elsif key == 'relationships'
|
232
|
-
|
233
|
-
|
234
|
-
model_name = root_key + 'Relationships'
|
235
|
-
model[root_key][model_name] = {}
|
236
|
-
model[root_key][model_name]['type'] = 'object'
|
237
|
-
model[root_key][model_name]['properties'] = properties
|
238
|
-
if object['required'].size > 0
|
239
|
-
model[root_key][model_name]['required'] = object['required']
|
240
|
-
end
|
241
|
-
obj['$ref'] = '#/definitions/' + model_name
|
238
|
+
relationships = Relationships.new(value)
|
239
|
+
obj = relationships.to_swagger_hash(model, root_key)
|
242
240
|
else
|
243
241
|
object = parse_object(value, model, root_key)
|
244
242
|
properties = object['properties']
|
@@ -326,54 +324,54 @@ module SwaggerModel
|
|
326
324
|
response_model = {}
|
327
325
|
response_model[response_name] = {}
|
328
326
|
response_model[response_name]['type'] = "object"
|
327
|
+
response_model[response_name]['properties'] = {}
|
329
328
|
model = {}
|
330
|
-
|
331
|
-
|
332
|
-
if
|
333
|
-
|
329
|
+
|
330
|
+
# Create response data
|
331
|
+
if response.has_key?('data')
|
332
|
+
data = response['data']
|
333
|
+
case data.class.to_s
|
334
|
+
when 'Hash'
|
335
|
+
m = Model.new(data)
|
336
|
+
response_model[response_name]['properties']['data'] = m.to_swagger_hash(model)
|
337
|
+
when 'Array'
|
338
|
+
m = Model.new(data.first)
|
339
|
+
response_model[response_name]['properties']['data'] = {
|
340
|
+
'type' => 'array',
|
341
|
+
'items' => m.to_swagger_hash(model)
|
342
|
+
}
|
343
|
+
end
|
334
344
|
end
|
335
|
-
|
345
|
+
|
346
|
+
# Create included key models but not add included key to response
|
347
|
+
if response.has_key?('included')
|
348
|
+
included = Included.new(response['included'])
|
349
|
+
included.models_to_swagger_hash(model)
|
350
|
+
end
|
351
|
+
|
352
|
+
# Create links from template
|
353
|
+
if response.has_key?('links')
|
336
354
|
links = {}
|
337
355
|
links['$ref'] = '#/definitions/Links'
|
338
|
-
properties['links'] = links
|
356
|
+
response_model[response_name]['properties']['links'] = links
|
339
357
|
if response_model['Links'].nil?
|
340
|
-
response_model['Links'] =
|
341
|
-
'self' => {
|
342
|
-
'type' => "string",
|
343
|
-
'example' => "https://contents.kurashiru.com/api/v1/videos?page%5Bnumber%5D=2&page%5Bsize%5D=20"
|
344
|
-
},
|
345
|
-
'first' => {
|
346
|
-
'type' => "string",
|
347
|
-
'example' => "https://contents.kurashiru.com/api/v1/videos?page%5Bnumber%5D=1&page%5Bsize%5D=20"
|
348
|
-
},
|
349
|
-
'prev' => {
|
350
|
-
'type' => "string",
|
351
|
-
'example' => "https://contents.kurashiru.com/api/v1/videos?page%5Bnumber%5D=1&page%5Bsize%5D=20"
|
352
|
-
},
|
353
|
-
'next' => {
|
354
|
-
'type' => "string",
|
355
|
-
'example' => "https://contents.kurashiru.com/api/v1/videos?page%5Bnumber%5D=3&page%5Bsize%5D=20"
|
356
|
-
},
|
357
|
-
'last' => {
|
358
|
-
'type' => "string",
|
359
|
-
'example' => "https://contents.kurashiru.com/api/v1/videos?page%5Bnumber%5D=100&page%5Bsize%5D=20"
|
360
|
-
}
|
361
|
-
}
|
358
|
+
response_model['Links'] = Links.template
|
362
359
|
end
|
363
360
|
end
|
364
|
-
|
361
|
+
|
362
|
+
# Create Meta
|
363
|
+
if response.has_key?('meta')
|
365
364
|
meta_name = response_name + 'Meta'
|
366
|
-
|
365
|
+
meta = Attributes.new(response['meta'], meta_name, '')
|
366
|
+
meta.to_swagger_hash(response_model)
|
367
367
|
meta = {}
|
368
368
|
meta['$ref'] = '#/definitions/' + meta_name
|
369
|
-
properties['meta'] = meta
|
370
|
-
end
|
371
|
-
response_model[response_name]['properties'] = properties
|
372
|
-
if object['required'].size > 0
|
373
|
-
object['required'].delete('included')
|
374
|
-
response_model[response_name]['required'] = object['required']
|
369
|
+
response_model[response_name]['properties']['meta'] = meta
|
375
370
|
end
|
376
371
|
|
372
|
+
# Set required
|
373
|
+
response_model[response_name]['required'] = response_model[response_name]['properties'].keys
|
374
|
+
|
377
375
|
# add example
|
378
376
|
response_model[response_name]['example'] = response
|
379
377
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: swagger_model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- marumemomo
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-07-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -83,6 +83,14 @@ files:
|
|
83
83
|
- bin/setup
|
84
84
|
- example/Example.json
|
85
85
|
- lib/swagger_model.rb
|
86
|
+
- lib/swagger_model/attributes.rb
|
87
|
+
- lib/swagger_model/included.rb
|
88
|
+
- lib/swagger_model/links.rb
|
89
|
+
- lib/swagger_model/model.rb
|
90
|
+
- lib/swagger_model/relation.rb
|
91
|
+
- lib/swagger_model/relation_data.rb
|
92
|
+
- lib/swagger_model/relation_data_array.rb
|
93
|
+
- lib/swagger_model/relationships.rb
|
86
94
|
- lib/swagger_model/version.rb
|
87
95
|
- swagger_model.gemspec
|
88
96
|
homepage: https://github.com/marumemomo/swagger_model
|