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 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