swagger_docs_generator 0.1.1 → 0.1.2

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: 88cb5ca367ad15e76eb3c350fd799a9463b14ebd
4
- data.tar.gz: 7fe85ae4081c3e680a69c66c36b4b8833c359a07
3
+ metadata.gz: 6c5734093ec6f9cbab3b957e7a2a6d90b0d780ae
4
+ data.tar.gz: 96a39e44e18eadde0f0e0a530c41437d84f00e71
5
5
  SHA512:
6
- metadata.gz: 433a1104b08265a7bbd596243523a6dac7bd19ae48f872821f3bd70892fffa547743fa071f1c367464655b87f7effc60dbee2293f3603f456ebcba287e3d326c
7
- data.tar.gz: d1dda1c6e3d952e331d09a58dcca9c5750ebf49b2a753892ce4fc7602b5551a6596c66029e1170c6fec3faa73c11387a1cb896978c0170a64d2610072721f918
6
+ metadata.gz: 00cf5fbd1e2fa923f38f64ef2c8ddd15f3d148682b1967b8d99aa7f6876ab395db61049e5088281b5ba192a89877f996e5a06c7c6a48c50edee01f33573f4127
7
+ data.tar.gz: 4b8db2dddcc67381a419f5bf84dc54cf32e71253914b6953df2df56ba78a793471b33c926d39d267c241bf700d5e1619feadfc539a0597509871ceb9da6b1d51
@@ -11,10 +11,10 @@ module SwaggerDocsGenerator
11
11
  attr_reader :swagger_file
12
12
 
13
13
  def initialize
14
+ @hash = {}
14
15
  @file = 'swagger.json'
15
- @path = File.join(Dir.pwd, '/public')
16
- @swagger_file = File.join(@path, @file)
17
- @version = File.join(@path, SwaggerDocsGenerator.configure_info.version)
16
+ @swagger_file = File.join(path, @file)
17
+ @version = File.join(path, SwaggerDocsGenerator.configure_info.version)
18
18
  create_version_folder
19
19
  end
20
20
 
@@ -25,14 +25,20 @@ module SwaggerDocsGenerator
25
25
  end
26
26
 
27
27
  # Delete files temporary
28
+ # @todo necessary ?
28
29
  def delete_temporary_files
29
- FileUtils.rm_rf(@version)
30
+ # FileUtils.rm_rf(@version)
30
31
  end
31
32
 
32
33
  private
33
34
 
34
35
  attr_reader :meta
35
36
 
37
+ # :reek:UtilityFunction
38
+ def path
39
+ File.join(Dir.pwd, '/public')
40
+ end
41
+
36
42
  def delete_file_before
37
43
  File.delete(@swagger_file) if File.exist?(@swagger_file)
38
44
  end
@@ -41,13 +47,24 @@ module SwaggerDocsGenerator
41
47
  FileUtils.mkdir_p(@version) unless File.directory?(@version)
42
48
  end
43
49
 
44
- # :reek:UtilityFunction
45
50
  def write_in_swagger_file
46
- hash = {}
47
- hash.merge!(MetadataConfiguration.new.construct_swagger_file)
48
- hash.merge!(MetadataInfo.new.construct_swagger_file)
49
- hash.merge!(MetadataPath.new.construct_swagger_file)
50
- hash.merge!(MetadataTag.new.construct_swagger_file)
51
+ write_in_swagger_file_configurations
52
+ write_in_swagger_file_controllers
53
+ write_in_swagger_file_models
54
+ end
55
+
56
+ def write_in_swagger_file_configurations
57
+ @hash.merge!(MetadataConfiguration.new.construct_swagger_file)
58
+ @hash.merge!(MetadataInfo.new.construct_swagger_file)
59
+ end
60
+
61
+ def write_in_swagger_file_controllers
62
+ @hash.merge!(MetadataPath.new.construct_swagger_file)
63
+ @hash.merge!(MetadataTag.new.construct_swagger_file)
64
+ end
65
+
66
+ def write_in_swagger_file_models
67
+ @hash.merge!(MetadataDefinition.new.construct_swagger_file)
51
68
  end
52
69
 
53
70
  def agregate_metadata
@@ -5,7 +5,7 @@ module SwaggerDocsGenerator
5
5
  # Name to gem
6
6
  GEM = 'swagger_docs_generator'
7
7
  # Version to gem
8
- VERSION = '0.1.1'
8
+ VERSION = '0.1.2'
9
9
  # Authors contributed to gem
10
10
  AUTHORS = ['VAILLANT Jeremy'].freeze
11
11
  # Email to ahuthors
@@ -7,8 +7,8 @@ module SwaggerDocsGenerator
7
7
  # Abstract class for metadata provide to controlloer in Rails application
8
8
  class MetadataController < Metadata
9
9
  def initialize
10
- @path = File.join(Dir.pwd, 'public',
11
- SwaggerDocsGenerator.configure_info.version)
10
+ @file_path = File.join(Dir.pwd, 'public',
11
+ SwaggerDocsGenerator.configure_info.version)
12
12
  conf = SwaggerDocsGenerator.configure.base_controller
13
13
  @controllers = if conf.is_a?(String)
14
14
  ApplicationController.subclasses
@@ -19,9 +19,10 @@ module SwaggerDocsGenerator
19
19
 
20
20
  private
21
21
 
22
- attr_accessor :controllers, :path
22
+ attr_accessor :controllers, :file_path
23
23
  end
24
24
  end
25
25
 
26
26
  require 'swagger_docs_generator/metadata/path'
27
27
  require 'swagger_docs_generator/metadata/tag'
28
+ require 'swagger_docs_generator/metadata/definition'
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'swagger_docs_generator/parser/model'
4
+
5
+ module SwaggerDocsGenerator
6
+ # # Metadata generated
7
+ #
8
+ # Generate metadata for block definition in swagger file
9
+ #
10
+ # @see https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#definitions-object
11
+ class MetadataDefinition < MetadataController
12
+ def initialize
13
+ super
14
+ @model = nil
15
+ end
16
+
17
+ def construct_swagger_file
18
+ { definitions: find_models }
19
+ end
20
+
21
+ private
22
+
23
+ # :reek:NilCheck
24
+ def find_models
25
+ hash = {}
26
+ controllers.each do |controller|
27
+ data = each_controller(controller)
28
+ hash.merge!(data) unless data.nil?
29
+ end
30
+ hash
31
+ end
32
+
33
+ def each_controller(controller)
34
+ @model = Model.new(controller)
35
+ contruct_hash
36
+ rescue NameError => message
37
+ puts "Error model name : #{message.name}"
38
+ end
39
+
40
+ def contruct_hash
41
+ {
42
+ @model.name => {
43
+ type: 'object',
44
+ properties: @model.attribute_properties
45
+ }
46
+ }
47
+ end
48
+ end
49
+ end
@@ -5,6 +5,9 @@ module SwaggerDocsGenerator
5
5
  #
6
6
  # Metadata generated in swagger json file
7
7
  class Metadata
8
+ ACCEPT = %i(title version contact description host schemes base_path
9
+ swagger).freeze
10
+
8
11
  def initialize
9
12
  @config = nil
10
13
  end
@@ -12,7 +15,9 @@ module SwaggerDocsGenerator
12
15
  def construct_swagger_file
13
16
  hash = {}
14
17
  self.class.protected_instance_methods.each do |method|
15
- hash.merge!(send(method)) unless @config.send(method).blank?
18
+ if ACCEPT.include?(method) || method.is_a?(Hash)
19
+ hash.merge!(send(method)) unless @config.send(method).blank?
20
+ end
16
21
  end
17
22
  hash
18
23
  end
@@ -15,7 +15,7 @@ module SwaggerDocsGenerator
15
15
  def construct_swagger_file
16
16
  hash = {}
17
17
  controllers.each do |controller|
18
- file = File.join(path, "#{controller.controller_name}.json")
18
+ file = File.join(file_path, "#{controller.controller_name}.json")
19
19
  hash.merge!(JSON.parse(File.read(file))['paths']) if File.exist?(file)
20
20
  end
21
21
  { paths: hash }
@@ -15,7 +15,7 @@ module SwaggerDocsGenerator
15
15
  def construct_swagger_file
16
16
  array = []
17
17
  controllers.each do |controller|
18
- file = File.join(path, "#{controller.controller_name}.json")
18
+ file = File.join(file_path, "#{controller.controller_name}.json")
19
19
  array.push(JSON.parse(File.read(file))['tags']) if File.exist?(file)
20
20
  end
21
21
  { tags: array }
@@ -39,4 +39,5 @@ require 'swagger_docs_generator/parser/actions/description'
39
39
  require 'swagger_docs_generator/parser/actions/response'
40
40
  require 'swagger_docs_generator/parser/actions/consumes'
41
41
  require 'swagger_docs_generator/parser/actions/produces'
42
+ require 'swagger_docs_generator/parser/actions/deprecated'
42
43
  require 'swagger_docs_generator/parser/actions/parameters'
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SwaggerDocsGenerator
4
+ module Actions
5
+ # # Test :deprecated
6
+ #
7
+ # Complete deprected field for action
8
+ class Deprecated < Actions
9
+ VALUE = :deprecated
10
+
11
+ def initialize(data)
12
+ super(VALUE)
13
+ complete_hash(data)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # :reek:UtilityFunction
3
4
  module SwaggerDocsGenerator
4
5
  module Actions
5
6
  # # Test :parameters
@@ -10,7 +11,80 @@ module SwaggerDocsGenerator
10
11
 
11
12
  def initialize(data)
12
13
  super(VALUE)
13
- complete_hash(data)
14
+ complete_hash(data) if data[VALUE].present?
15
+ end
16
+
17
+ private
18
+
19
+ # name: 0
20
+ # in: 1 -- [query, header, path, formData, body]
21
+ # description: 2
22
+ # type: || schema: 3 -- [string, number, integer, boolean, array, file]
23
+ # required: 4
24
+ # other: 5
25
+ def complete_hash(data)
26
+ all_parameters = []
27
+ raw ||= data[key]
28
+ raw.each do |parameter|
29
+ all_parameters.push(write_param(parameter))
30
+ end
31
+ hash[key] = all_parameters
32
+ end
33
+
34
+ def write_param(param)
35
+ hash = case param_in(param)
36
+ when 'body'
37
+ body(param)
38
+ else
39
+ classic(param)
40
+ end
41
+ type_or_schema = param[5]
42
+ hash.merge!(type_or_schema) if type_or_schema.present?
43
+ hash
44
+ end
45
+
46
+ def classic(param)
47
+ {
48
+ name: param_name(param),
49
+ in: param_in(param),
50
+ description: param_description(param),
51
+ type: param_type(param),
52
+ required: param_required(param)
53
+ }
54
+ end
55
+
56
+ def body(param)
57
+ {
58
+ name: param_name(param),
59
+ in: param_in(param),
60
+ description: param_description(param),
61
+ schema: { '$ref': param_schema(param) },
62
+ required: param_required(param)
63
+ }
64
+ end
65
+
66
+ def param_name(param)
67
+ param[0].to_s
68
+ end
69
+
70
+ def param_in(param)
71
+ param[1].to_s.camelize(:lower)
72
+ end
73
+
74
+ def param_description(param)
75
+ param[2].humanize
76
+ end
77
+
78
+ def param_type(param)
79
+ param[3]
80
+ end
81
+
82
+ def param_required(param)
83
+ param[4] || false
84
+ end
85
+
86
+ def param_schema(param)
87
+ param[3]
14
88
  end
15
89
  end
16
90
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # :reek:UtilityFunction
4
+
3
5
  module SwaggerDocsGenerator
4
6
  module Actions
5
7
  # # Test :response
@@ -16,9 +18,61 @@ module SwaggerDocsGenerator
16
18
  private
17
19
 
18
20
  def complete_hash(data)
19
- default = { ok: { description: 'Request successfully processed.' } }
20
- raw = data.key?(key) ? data[key] : default
21
- hash[key] = raw
21
+ raw = data[key]
22
+ hash[key] = raw.present? ? each_response(raw) : no_response
23
+ end
24
+
25
+ def each_response(raw)
26
+ sh = {}
27
+ raw.each do |code|
28
+ case code
29
+ when Array
30
+ sh.merge!(one_response_with_schema(code))
31
+ when Integer
32
+ sh.merge!(one_response(code))
33
+ end
34
+ end
35
+ sh
36
+ end
37
+
38
+ def no_response
39
+ one_response(200)
40
+ end
41
+
42
+ def one_response(code)
43
+ response = ActionDispatch::Response.new(code)
44
+ { response.code => { description: response.message } }
45
+ end
46
+
47
+ # :reek:FeatureEnvy
48
+ def one_response_with_schema(code)
49
+ key = code[0]
50
+ response = ActionDispatch::Response.new(key)
51
+ {
52
+ response.code => {
53
+ 'description' => response.message,
54
+ 'schema' => type_or_not(code)
55
+ }
56
+ }
57
+ end
58
+
59
+ def type_or_not(code)
60
+ code.length.eql?(3) ? include_type(code) : no_type(code)
61
+ end
62
+
63
+ def include_type(code)
64
+ {
65
+ 'type' => code[1],
66
+ 'items' => {
67
+ '$ref' => code[2]
68
+ }
69
+ }
70
+ end
71
+
72
+ def no_type(code)
73
+ {
74
+ '$ref' => code[1]
75
+ }
22
76
  end
23
77
  end
24
78
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'swagger_docs_generator/parser/models/mongo'
4
+ require 'swagger_docs_generator/parser/models/active_record'
5
+
6
+ module SwaggerDocsGenerator
7
+ # Parser models
8
+ class Model
9
+ attr_reader :name
10
+
11
+ def initialize(controller)
12
+ @name = controller.controller_name.singularize.camelize
13
+ @orm = if defined?(Mongoid)
14
+ ModelMongo.new(name)
15
+ else
16
+ ModelActiveRecord.new(name)
17
+ end
18
+ end
19
+
20
+ def attribute_properties
21
+ @orm.attribute_properties
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Lint/Eval
4
+ module SwaggerDocsGenerator
5
+ # # Parse Active Record model
6
+ class ModelActiveRecord
7
+ NAME = :active_record
8
+ TYPES = {
9
+ 'binary' => { type: 'string', format: 'binary' },
10
+ 'boolean' => { type: 'boolean' },
11
+ 'date' => { type: 'string', format: 'date' },
12
+ 'datetime' => { type: 'string', format: 'date-time' },
13
+ 'decimal' => { type: 'number', format: 'double' },
14
+ 'float' => { type: 'number', format: 'float' },
15
+ 'integer' => { type: 'integer', format: 'int32' },
16
+ 'bigint' => { type: 'integer', format: 'int64' },
17
+ 'primary_key' => { type: 'integer', format: 'int32' },
18
+ 'references' => { type: 'integer', format: 'int32' },
19
+ 'string' => { type: 'string' },
20
+ 'text' => { type: 'string' },
21
+ 'time' => { type: 'string', format: 'date-time' },
22
+ 'timestamp' => { type: 'string', format: 'date-time' }
23
+ }.freeze
24
+
25
+ def initialize(model)
26
+ @model = eval(model)
27
+ end
28
+
29
+ def attribute_properties
30
+ propertie = {}
31
+ @model.columns_hash.each do |name, _value|
32
+ propertie.merge!(attribute_propertie(name))
33
+ end
34
+ propertie
35
+ end
36
+
37
+ private
38
+
39
+ def attribute_propertie(name)
40
+ {
41
+ name => TYPES[@model.columns_hash[name].type.to_s]
42
+ }
43
+ end
44
+ end
45
+ end
46
+ # rubocop:enable Lint/Eval
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Lint/Eval
4
+ module SwaggerDocsGenerator
5
+ # # Parse Mongo model
6
+ class ModelMongo
7
+ NAME = :mongo
8
+ TYPES = {
9
+ 'Array' => { type: 'string' },
10
+ 'BigDecimal' => { type: 'number', format: 'double' },
11
+ 'Mongoid::Boolean' => { type: 'boolean' },
12
+ 'Date' => { type: 'string', format: 'date' },
13
+ 'DateTime' => { type: 'string', format: 'date-time' },
14
+ 'Float' => { type: 'number', format: 'float' },
15
+ 'Hash' => { type: 'string' },
16
+ 'Integer' => { type: 'integer', format: 'int64' },
17
+ 'BSON::ObjectId' => { type: 'string' },
18
+ 'Object' => { type: 'string' },
19
+ 'BSON::Binary' => { type: 'string', format: 'binary' },
20
+ 'Range' => { type: 'string' },
21
+ 'String' => { type: 'string' },
22
+ 'Symbol' => { type: 'string' },
23
+ 'Time' => { type: 'string', format: 'date-time' },
24
+ 'TimeWithZone' => { type: 'string', format: 'date-time' }
25
+ }.freeze
26
+
27
+ def initialize(model)
28
+ @model = eval(model)
29
+ end
30
+
31
+ def attribute_properties
32
+ propertie = {}
33
+ @model.fields.each do |name, _value|
34
+ propertie.merge!(attribute_propertie(name))
35
+ end
36
+ propertie
37
+ end
38
+
39
+ private
40
+
41
+ def attribute_propertie(name)
42
+ {
43
+ name => TYPES.fetch(@model.fields[name].type.to_s)
44
+ }
45
+ end
46
+ end
47
+ end
48
+ # rubocop:enable Lint/Eval
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: swagger_docs_generator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - VAILLANT Jeremy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-05 00:00:00.000000000 Z
11
+ date: 2017-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -162,6 +162,7 @@ files:
162
162
  - lib/swagger_docs_generator/info.rb
163
163
  - lib/swagger_docs_generator/metadata/configuration.rb
164
164
  - lib/swagger_docs_generator/metadata/controller.rb
165
+ - lib/swagger_docs_generator/metadata/definition.rb
165
166
  - lib/swagger_docs_generator/metadata/info.rb
166
167
  - lib/swagger_docs_generator/metadata/metadata.rb
167
168
  - lib/swagger_docs_generator/metadata/path.rb
@@ -170,6 +171,7 @@ files:
170
171
  - lib/swagger_docs_generator/parser/action.rb
171
172
  - lib/swagger_docs_generator/parser/actions/actions.rb
172
173
  - lib/swagger_docs_generator/parser/actions/consumes.rb
174
+ - lib/swagger_docs_generator/parser/actions/deprecated.rb
173
175
  - lib/swagger_docs_generator/parser/actions/description.rb
174
176
  - lib/swagger_docs_generator/parser/actions/parameters.rb
175
177
  - lib/swagger_docs_generator/parser/actions/produces.rb
@@ -177,6 +179,9 @@ files:
177
179
  - lib/swagger_docs_generator/parser/actions/summary.rb
178
180
  - lib/swagger_docs_generator/parser/actions/tags.rb
179
181
  - lib/swagger_docs_generator/parser/controller.rb
182
+ - lib/swagger_docs_generator/parser/model.rb
183
+ - lib/swagger_docs_generator/parser/models/active_record.rb
184
+ - lib/swagger_docs_generator/parser/models/mongo.rb
180
185
  - lib/swagger_docs_generator/parser/parser.rb
181
186
  - lib/swagger_docs_generator/railtie.rb
182
187
  - lib/tasks/swagger.rake