swagger_model 0.2.3 → 0.3.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: 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