swagger_model 0.2.3 → 0.3.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: 6c83e98e2dee62c14c2cdd92a0e081d39f6c17e5
4
- data.tar.gz: ce9dad2994461111e429ea2572234d31115300c5
3
+ metadata.gz: b19b48f3e26291b2954ae1cb40ffe665393f880f
4
+ data.tar.gz: a00fb33b74a738146125dc97d8c29091014a327c
5
5
  SHA512:
6
- metadata.gz: c4b92d50a0e51c08eb8987c9669cf9e0b0d105ed90747ff323d2dd579b0be376ec68a7c5372bd22d506d0bc864484bd838c7e3a19c155cd93acbab2f5f13b0bc
7
- data.tar.gz: 37bc53349d8aff2afd01ddacc40cf1c219cc0cefc1dc58cdfa906392b402eecda80c051f86b3e1f7ccd39a63c889f744c8c9c64ec1898ec34cbc7bdee9c56ed9
6
+ metadata.gz: f8f42d8e05976ad9943ed4e4839dd05adad5b01c479a6363840ff6fe97ae74a25938c2986a310c609b84e16205b8fb6ff16e6208b658a1305268230cf6b27171
7
+ data.tar.gz: 053e2c34a307f4a0756805821b82961a04093bb6749bc2603c43906815236f6fa2b0b274b2dfd4e78afc0a5a3ab82609328c981389a8ecde81fae3529ff18e93
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- swagger_model (0.2.3)
4
+ swagger_model (0.3.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -68,22 +68,48 @@ Or install it yourself as:
68
68
 
69
69
  ## Usage
70
70
 
71
+ ### Swagger v2
72
+
71
73
  ```ruby
72
74
  require 'swagger_model'
73
75
 
74
76
  json = <<-EOS
75
77
  {
76
- "user": {
77
- "name": "marumemomo",
78
- "age": 24
79
- },
80
- "message": "hello",
81
- "created_at": "2018-05-05T20:02:24.000+09:00",
82
- "updated_at": null
78
+ "data": {
79
+ "id": "id",
80
+ "type": "users",
81
+ "attributes": {
82
+ "name": "marumemomo",
83
+ "age": 24
84
+ }
85
+ }
83
86
  }
84
87
  EOS
88
+ EOS
89
+
90
+ SwaggerModel::SwaggerV2.create_from_json(json_string: json, output_path: './example/output/', response_name: "ExampleResponse")
91
+ ```
92
+
93
+ ### OpenAPI v3
94
+
95
+ ```ruby
96
+ require 'swagger_model'
97
+
98
+ json = <<-EOS
99
+ {
100
+ "data": {
101
+ "id": "id",
102
+ "type": "users",
103
+ "attributes": {
104
+ "name": "marumemomo",
105
+ "age": 24
106
+ }
107
+ }
108
+ }
109
+ EOS
110
+ EOS
85
111
 
86
- SwaggerModel.create_from_json(json_string: json, output_path: './example/output/', response_name: "ExampleResponse")
112
+ SwaggerModel::OpenAPIv3.create_from_json(json_string: json, output_path: './example/output/', response_name: "ExampleResponse")
87
113
  ```
88
114
 
89
115
  ## Development
data/lib/swagger_model.rb CHANGED
@@ -5,183 +5,357 @@ require 'date'
5
5
  require 'active_support'
6
6
  require 'active_support/core_ext'
7
7
  require 'fileutils'
8
+ require 'logger'
8
9
 
9
10
  module SwaggerModel
10
- def self.date_time_valid?(str)
11
- if (!! Date.parse(str) rescue false)
12
- date = Date._parse(str)
13
- !date[:zone].nil? && !date[:hour].nil? && !date[:min].nil? && !date[:sec].nil? && !date[:year].nil? && !date[:mon].nil?
14
- else
15
- false
11
+ module OpenAPIv3
12
+ def self.date_time_valid?(str)
13
+ if (!! Date.parse(str) rescue false)
14
+ date = Date._parse(str)
15
+ !date[:zone].nil? && !date[:hour].nil? && !date[:min].nil? && !date[:sec].nil? && !date[:year].nil? && !date[:mon].nil?
16
+ else
17
+ false
18
+ end
16
19
  end
17
- end
18
20
 
19
- def self.get_property(key, value, model, root_key)
20
- type_class = value.class.to_s
21
- obj = {}
22
- case type_class
23
- when 'Hash'
24
- if value.has_key?('id') && value.has_key?('type')
25
- model_name = ActiveSupport::Inflector.classify(value['type'].gsub('-', '_'))
26
- model[model_name] = {}
27
- object = parse_object(value, model, model_name)
28
- properties = object['properties']
29
- newProperties = {}
30
- newProperties['allOf'] = []
31
- newProperties['allOf'][0] = {}
32
- newProperties['allOf'][0]['$ref'] = '#/components/schemas/ModelBase'
33
- newProperties['allOf'][1] = {}
34
- newProperties['allOf'][1]['type'] = 'object'
35
- if object['required'].size > 0
36
- newProperties['allOf'][1]['required'] = object['required']
21
+ def self.get_property(key, value, model, root_key)
22
+ type_class = value.class.to_s
23
+ obj = {}
24
+ case type_class
25
+ when 'Hash'
26
+ if value.has_key?('id') && value.has_key?('type')
27
+ model_name = ActiveSupport::Inflector.classify(value['type'].gsub('-', '_'))
28
+ model[model_name] = {}
29
+ object = parse_object(value, model, model_name)
30
+ properties = object['properties']
31
+ newProperties = {}
32
+ newProperties['allOf'] = []
33
+ newProperties['allOf'][0] = {}
34
+ newProperties['allOf'][0]['$ref'] = '#/components/schemas/ModelBase'
35
+ newProperties['allOf'][1] = {}
36
+ newProperties['allOf'][1]['type'] = 'object'
37
+ if object['required'].size > 0
38
+ newProperties['allOf'][1]['required'] = object['required']
39
+ end
40
+ properties.delete('id')
41
+ properties.delete('type')
42
+ newProperties['allOf'][1]['properties'] = properties
43
+ model[model_name][model_name] = newProperties
44
+ obj['$ref'] = '#/components/schemas/' + model_name
45
+ elsif key == 'attributes'
46
+ object = parse_object(value, model, root_key)
47
+ properties = object['properties']
48
+ model_name = root_key + 'Attributes'
49
+ model[root_key][model_name] = {}
50
+ model[root_key][model_name]['type'] = 'object'
51
+ model[root_key][model_name]['properties'] = properties
52
+ if object['required'].size > 0
53
+ model[root_key][model_name]['required'] = object['required']
54
+ end
55
+ obj['$ref'] = '#/components/schemas/' + model_name
56
+ elsif key == 'relationships'
57
+ object = parse_object(value, model, root_key)
58
+ properties = object['properties']
59
+ model_name = root_key + 'Relationships'
60
+ model[root_key][model_name] = {}
61
+ model[root_key][model_name]['type'] = 'object'
62
+ model[root_key][model_name]['properties'] = properties
63
+ if object['required'].size > 0
64
+ model[root_key][model_name]['required'] = object['required']
65
+ end
66
+ obj['$ref'] = '#/components/schemas/' + model_name
67
+ else
68
+ object = parse_object(value, model, root_key)
69
+ properties = object['properties']
70
+ obj['type'] = 'object'
71
+ obj['properties'] = properties
72
+ if object['required'].size > 0
73
+ obj['required'] = object['required']
74
+ end
37
75
  end
38
- properties.delete('id')
39
- properties.delete('type')
40
- newProperties['allOf'][1]['properties'] = properties
41
- model[model_name][model_name] = newProperties
42
- obj['$ref'] = '#/components/schemas/' + model_name
43
- elsif key == 'attributes'
44
- object = parse_object(value, model, root_key)
45
- properties = object['properties']
46
- model_name = root_key + 'Attributes'
47
- model[root_key][model_name] = {}
48
- model[root_key][model_name]['type'] = 'object'
49
- model[root_key][model_name]['properties'] = properties
50
- if object['required'].size > 0
51
- model[root_key][model_name]['required'] = object['required']
76
+ when 'Array'
77
+ if key == 'included'
78
+ obj['type'] = 'array'
79
+ obj['items'] = {}
80
+ obj['items']['oneOf'] = parse_array_with_multi_model(value, model, root_key)
81
+ else
82
+ obj['type'] = 'array'
83
+ obj['items'] = parse_array(value, model, root_key)
52
84
  end
53
- obj['$ref'] = '#/components/schemas/' + model_name
54
- elsif key == 'relationships'
55
- object = parse_object(value, model, root_key)
56
- properties = object['properties']
57
- model_name = root_key + 'Relationships'
58
- model[root_key][model_name] = {}
59
- model[root_key][model_name]['type'] = 'object'
60
- model[root_key][model_name]['properties'] = properties
61
- if object['required'].size > 0
62
- model[root_key][model_name]['required'] = object['required']
85
+ when 'String'
86
+ obj['type'] = 'string'
87
+ obj['example'] = value
88
+ if date_time_valid?(value)
89
+ obj['format'] = 'date-time'
63
90
  end
64
- obj['$ref'] = '#/components/schemas/' + model_name
91
+ when 'Fixnum'
92
+ obj['type'] = 'integer'
93
+ obj['example'] = value
94
+ when 'TrueClass', 'FalseClass'
95
+ obj['type'] = 'boolean'
96
+ obj['example'] = value
97
+ when 'Float'
98
+ obj['type'] = 'number'
99
+ obj['format'] = 'float'
100
+ obj['example'] = value
65
101
  else
66
- object = parse_object(value, model, root_key)
67
- properties = object['properties']
68
- obj['type'] = 'object'
69
- obj['properties'] = properties
70
- if object['required'].size > 0
71
- obj['required'] = object['required']
72
- end
102
+ obj['type'] = ''
103
+ obj['example'] = ''
73
104
  end
74
- when 'Array'
75
- if key == 'included'
76
- obj['type'] = 'array'
77
- obj['items'] = {}
78
- obj['items']['oneOf'] = parse_array_with_multi_model(value, model, root_key)
79
- else
80
- obj['type'] = 'array'
81
- obj['items'] = parse_array(value, model, root_key)
82
- end
83
- when 'String'
84
- obj['type'] = 'string'
85
- obj['example'] = value
86
- if date_time_valid?(value)
87
- obj['format'] = 'date-time'
88
- end
89
- when 'Fixnum'
90
- obj['type'] = 'integer'
91
- obj['example'] = value
92
- when 'TrueClass', 'FalseClass'
93
- obj['type'] = 'boolean'
94
- obj['example'] = value
95
- when 'Float'
96
- obj['type'] = 'number'
97
- obj['format'] = 'float'
98
- obj['example'] = value
99
- else
100
- obj['type'] = ''
101
- obj['example'] = ''
105
+ obj
102
106
  end
103
- obj
104
- end
105
107
 
106
- def self.parse_array(items, model, root_key)
107
- m = {}
108
- value = items.first
109
- get_property(nil, value, model, root_key)
110
- end
108
+ def self.parse_array(items, model, root_key)
109
+ m = {}
110
+ value = items.first
111
+ get_property(nil, value, model, root_key)
112
+ end
111
113
 
112
- def self.parse_array_with_multi_model(items, model, root_key)
113
- types = []
114
- items.each do |value|
115
- types.push(get_property(nil, value, model, root_key))
114
+ def self.parse_array_with_multi_model(items, model, root_key)
115
+ types = []
116
+ items.each do |value|
117
+ types.push(get_property(nil, value, model, root_key))
118
+ end
119
+ types
116
120
  end
117
- types
118
- end
119
121
 
120
- def self.parse_object(res, model, root_key)
121
- keys = res.keys
122
- m = {}
123
- required = []
124
- for key in keys do
125
- value = res[key]
126
- m[key] = get_property(key, value, model, root_key)
127
- if m[key]['type'] != ''
128
- unless (keys.include?('id') && keys.include?('type')) && (key == 'id' || key == 'type')
129
- required.push(key)
122
+ def self.parse_object(res, model, root_key)
123
+ keys = res.keys
124
+ m = {}
125
+ required = []
126
+ for key in keys do
127
+ value = res[key]
128
+ m[key] = get_property(key, value, model, root_key)
129
+ if m[key]['type'] != ''
130
+ unless (keys.include?('id') && keys.include?('type')) && (key == 'id' || key == 'type')
131
+ required.push(key)
132
+ end
130
133
  end
131
134
  end
135
+ obj = {}
136
+ obj['properties'] = m
137
+ obj['required'] = required
138
+ obj
139
+ end
140
+ def self.create_from_json(params)
141
+ response = {}.to_json
142
+ json_string = params[:json_string]
143
+ if !json_string.nil?
144
+ response = JSON.load(json_string)
145
+ else
146
+ json_file_path = params[:json_file_path] || gets
147
+ json = open(json_file_path) do |io|
148
+ JSON.load(io)
149
+ end
150
+ response = json
151
+ end
152
+ response_name = params[:response_name] || gets
153
+ response_model = {}
154
+ response_model[response_name] = {}
155
+ response_model[response_name]['type'] = "object"
156
+ model = {}
157
+ object = parse_object(response, model, response_name)
158
+ properties = object['properties']
159
+ if properties.has_key?('links')
160
+ links = {}
161
+ links['$ref'] = '#/components/schemas/Links'
162
+ properties['links'] = links
163
+ end
164
+ if properties.has_key?('meta')
165
+ meta_name = response_name + 'Meta'
166
+ response_model[meta_name] = properties['meta']
167
+ meta = {}
168
+ meta['$ref'] = '#/components/schemas/' + meta_name
169
+ properties['meta'] = meta
170
+ end
171
+ response_model[response_name]['properties'] = properties
172
+ if object['required'].size > 0
173
+ response_model[response_name]['required'] = object['required']
174
+ end
175
+ output_path = params[:output_path] || './'
176
+ output_path_responses = File.join(output_path, 'Responses/')
177
+ output_path_models = File.join(output_path, 'Models/')
178
+
179
+ FileUtils::mkdir_p output_path_responses
180
+ FileUtils::mkdir_p output_path_models
181
+
182
+ File.write(File.join(output_path_responses, "#{response_name}.yaml"), response_model.to_yaml)
183
+
184
+ keys = model.keys
185
+ for key in keys do
186
+ File.write(File.join(output_path_models, "#{key}.yaml"), model[key].to_yaml)
187
+ end
132
188
  end
133
- obj = {}
134
- obj['properties'] = m
135
- obj['required'] = required
136
- obj
137
189
  end
138
- def self.create_from_json(params)
139
- response = {}.to_json
140
- json_string = params[:json_string]
141
- if !json_string.nil?
142
- response = JSON.load(json_string)
143
- else
144
- json_file_path = params[:json_file_path] || gets
145
- json = open(json_file_path) do |io|
146
- JSON.load(io)
147
- end
148
- response = json
190
+
191
+ module SwaggerV2
192
+ @logger = Logger.new(STDOUT)
193
+ def self.date_time_valid?(str)
194
+ if (!! Date.parse(str) rescue false)
195
+ date = Date._parse(str)
196
+ !date[:zone].nil? && !date[:hour].nil? && !date[:min].nil? && !date[:sec].nil? && !date[:year].nil? && !date[:mon].nil?
197
+ else
198
+ false
199
+ end
149
200
  end
150
- response_name = params[:response_name] || gets
151
- response_model = {}
152
- response_model[response_name] = {}
153
- response_model[response_name]['type'] = "object"
154
- model = {}
155
- object = parse_object(response, model, response_name)
156
- properties = object['properties']
157
- if properties.has_key?('links')
158
- links = {}
159
- links['$ref'] = '#/components/schemas/Links'
160
- properties['links'] = links
201
+
202
+ def self.get_property(key, value, model, root_key)
203
+ type_class = value.class.to_s
204
+ obj = {}
205
+ case type_class
206
+ when 'Hash'
207
+ if value.has_key?('id') && value.has_key?('type')
208
+ model_name = ActiveSupport::Inflector.classify(value['type'].gsub('-', '_'))
209
+ model[model_name] = {}
210
+ object = parse_object(value, model, model_name)
211
+ properties = object['properties']
212
+ newProperties = {}
213
+ newProperties['allOf'] = []
214
+ newProperties['allOf'][0] = {}
215
+ newProperties['allOf'][0]['$ref'] = '#/definitions/ModelBase'
216
+ newProperties['allOf'][1] = {}
217
+ newProperties['allOf'][1]['type'] = 'object'
218
+ if object['required'].size > 0
219
+ newProperties['allOf'][1]['required'] = object['required']
220
+ end
221
+ properties.delete('id')
222
+ properties.delete('type')
223
+ newProperties['allOf'][1]['properties'] = properties
224
+ model[model_name][model_name] = newProperties
225
+ obj['$ref'] = '#/definitions/' + model_name
226
+ elsif key == 'attributes'
227
+ object = parse_object(value, model, root_key)
228
+ properties = object['properties']
229
+ model_name = root_key + 'Attributes'
230
+ model[root_key][model_name] = {}
231
+ model[root_key][model_name]['type'] = 'object'
232
+ model[root_key][model_name]['properties'] = properties
233
+ if object['required'].size > 0
234
+ model[root_key][model_name]['required'] = object['required']
235
+ end
236
+ obj['$ref'] = '#/definitions/' + model_name
237
+ elsif key == 'relationships'
238
+ object = parse_object(value, model, root_key)
239
+ properties = object['properties']
240
+ model_name = root_key + 'Relationships'
241
+ model[root_key][model_name] = {}
242
+ model[root_key][model_name]['type'] = 'object'
243
+ model[root_key][model_name]['properties'] = properties
244
+ if object['required'].size > 0
245
+ model[root_key][model_name]['required'] = object['required']
246
+ end
247
+ obj['$ref'] = '#/definitions/' + model_name
248
+ else
249
+ object = parse_object(value, model, root_key)
250
+ properties = object['properties']
251
+ obj['type'] = 'object'
252
+ obj['properties'] = properties
253
+ if object['required'].size > 0
254
+ obj['required'] = object['required']
255
+ end
256
+ end
257
+ when 'Array'
258
+ if key == 'included'
259
+ @logger.warn("Cannot parse `included` key Array")
260
+ else
261
+ obj['type'] = 'array'
262
+ obj['items'] = parse_array(value, model, root_key)
263
+ end
264
+ when 'String'
265
+ obj['type'] = 'string'
266
+ obj['example'] = value
267
+ if date_time_valid?(value)
268
+ obj['format'] = 'date-time'
269
+ end
270
+ when 'Fixnum'
271
+ obj['type'] = 'integer'
272
+ obj['example'] = value
273
+ when 'TrueClass', 'FalseClass'
274
+ obj['type'] = 'boolean'
275
+ obj['example'] = value
276
+ when 'Float'
277
+ obj['type'] = 'number'
278
+ obj['format'] = 'float'
279
+ obj['example'] = value
280
+ else
281
+ obj['type'] = ''
282
+ obj['example'] = ''
283
+ end
284
+ obj
161
285
  end
162
- if properties.has_key?('meta')
163
- meta_name = response_name + 'Meta'
164
- response_model[meta_name] = properties['meta']
165
- meta = {}
166
- meta['$ref'] = '#/components/schemas/' + meta_name
167
- properties['meta'] = meta
286
+
287
+ def self.parse_array(items, model, root_key)
288
+ m = {}
289
+ value = items.first
290
+ get_property(nil, value, model, root_key)
168
291
  end
169
- response_model[response_name]['properties'] = properties
170
- if object['required'].size > 0
171
- response_model[response_name]['required'] = object['required']
292
+
293
+ def self.parse_object(res, model, root_key)
294
+ keys = res.keys
295
+ m = {}
296
+ required = []
297
+ for key in keys do
298
+ value = res[key]
299
+ m[key] = get_property(key, value, model, root_key)
300
+ if m[key]['type'] != ''
301
+ unless (keys.include?('id') && keys.include?('type')) && (key == 'id' || key == 'type')
302
+ required.push(key)
303
+ end
304
+ end
305
+ end
306
+ obj = {}
307
+ obj['properties'] = m
308
+ obj['required'] = required
309
+ obj
172
310
  end
173
- output_path = params[:output_path] || './'
174
- output_path_responses = File.join(output_path, 'Responses/')
175
- output_path_models = File.join(output_path, 'Models/')
311
+ def self.create_from_json(params)
312
+ response = {}.to_json
313
+ json_string = params[:json_string]
314
+ if !json_string.nil?
315
+ response = JSON.load(json_string)
316
+ else
317
+ json_file_path = params[:json_file_path] || gets
318
+ json = open(json_file_path) do |io|
319
+ JSON.load(io)
320
+ end
321
+ response = json
322
+ end
323
+ response_name = params[:response_name] || gets
324
+ response_model = {}
325
+ response_model[response_name] = {}
326
+ response_model[response_name]['type'] = "object"
327
+ model = {}
328
+ object = parse_object(response, model, response_name)
329
+ properties = object['properties']
330
+ if properties.has_key?('links')
331
+ links = {}
332
+ links['$ref'] = '#/definitions/Links'
333
+ properties['links'] = links
334
+ end
335
+ if properties.has_key?('meta')
336
+ meta_name = response_name + 'Meta'
337
+ response_model[meta_name] = properties['meta']
338
+ meta = {}
339
+ meta['$ref'] = '#/definitions/' + meta_name
340
+ properties['meta'] = meta
341
+ end
342
+ response_model[response_name]['properties'] = properties
343
+ if object['required'].size > 0
344
+ response_model[response_name]['required'] = object['required']
345
+ end
346
+ output_path = params[:output_path] || './'
347
+ output_path_responses = File.join(output_path, 'Responses/')
348
+ output_path_models = File.join(output_path, 'Models/')
176
349
 
177
- FileUtils::mkdir_p output_path_responses
178
- FileUtils::mkdir_p output_path_models
350
+ FileUtils::mkdir_p output_path_responses
351
+ FileUtils::mkdir_p output_path_models
179
352
 
180
- File.write(File.join(output_path_responses, "#{response_name}.yaml"), response_model.to_yaml)
353
+ File.write(File.join(output_path_responses, "#{response_name}.yaml"), response_model.to_yaml)
181
354
 
182
- keys = model.keys
183
- for key in keys do
184
- File.write(File.join(output_path_models, "#{key}.yaml"), model[key].to_yaml)
355
+ keys = model.keys
356
+ for key in keys do
357
+ File.write(File.join(output_path_models, "#{key}.yaml"), model[key].to_yaml)
358
+ end
185
359
  end
186
360
  end
187
361
  end
@@ -1,3 +1,3 @@
1
1
  module SwaggerModel
2
- VERSION = "0.2.3"
2
+ VERSION = "0.3.0"
3
3
  end
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.2.3
4
+ version: 0.3.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-05 00:00:00.000000000 Z
11
+ date: 2018-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler