swagger_model 0.3.6 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4703ab809c83f9384d2d89a6cdc8b3aa3fc8d688
4
- data.tar.gz: 8a560e09d06920fbba375d0ad6218f7390ba8db4
3
+ metadata.gz: 7f7c65359fa58890e69ebd599e538474dfaae1ac
4
+ data.tar.gz: 0635b5d20453ea7cb40225142af9a7bd6e611f5d
5
5
  SHA512:
6
- metadata.gz: 3d8ed511dcf4fc9a79216204a1b2e9241bf22ca61bd9bf90ac5d5a8de42ce10abac408b9029ea839ce93f3f43cb50f5640beef12712c1e950b0918c7e19b72c6
7
- data.tar.gz: afda4beac21ccc536a3f9d56a022b8d5b348d517e3123351643f3a05effab56fb7779111492f680d6eb3bceeef7c0250ee3ab7f172f09e5a7d11d4802664c888
6
+ metadata.gz: 0ee8642f285940a7503b119817dee9bd41f167129f9606228a17467830ab4adcd76f33995b4ea4a241abc93dc79b3a403a32c07390f98a0f4aff0f367eab824b
7
+ data.tar.gz: a94348c709d7195b3f1a253fc4135fb829faa11dec6674bc9c9a40ee178804f31ad73aede8e20d5ab3fd170b958452a7a757d6d05b11b44617a34e53dc044c76
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- swagger_model (0.3.6)
4
+ swagger_model (0.4.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -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
@@ -1,3 +1,3 @@
1
1
  module SwaggerModel
2
- VERSION = "0.3.6"
2
+ VERSION = "0.4.0"
3
3
  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
- object = parse_object(value, model, root_key)
233
- properties = object['properties']
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
- object = parse_object(response, model, response_name)
331
- properties = object['properties']
332
- if properties.has_key?('included')
333
- properties.delete('included')
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
- if properties.has_key?('links')
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
- if properties.has_key?('meta')
361
+
362
+ # Create Meta
363
+ if response.has_key?('meta')
365
364
  meta_name = response_name + 'Meta'
366
- response_model[meta_name] = properties['meta']
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.3.6
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-06-26 00:00:00.000000000 Z
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