swaggard 1.1.1 → 1.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
  SHA256:
3
- metadata.gz: 57f3251f22ae437dfa4a4030dc6e1929def89936e209bd9fdef0b6d7ed92c554
4
- data.tar.gz: 859c0573aee509bf0f6c376e20d451c5f97729c3b6cf03f988f450d90041ae4d
3
+ metadata.gz: ed70536923570dc261e856336612392dbf360df9e5fbe0854c435eca43be1379
4
+ data.tar.gz: a838d6c384fe16bc135463d5c356871bc949fa5410f079822b7e79f757817733
5
5
  SHA512:
6
- metadata.gz: 4d7f32e8aef8e8f5edfd761982e8a9b845364de71a042f1e56ebae621a00ea7193c1d6377991a22c021d5a1316466031aeb25204fc23d388a4ba96cca9c30f2f
7
- data.tar.gz: d9b0b90737efd86097f61bbcc06ac9c3b51881a83bfff8ad1f726940c2140f640adff9e549d81dec907b3f221a2fa21737cbeab76fd0c80ca9f450e91315f756
6
+ metadata.gz: 99b13f5741da156d8d9f442131f4fd7b5d2cb9c69d5218ae64bcb14beb0937a4918bf7ea3da6cd7ea102c4e99a5b3ccf564107046745af55b45f46fa9442b7e4
7
+ data.tar.gz: 99c290f273f52991dd9f7fbd26bd3d40e170991e5e5eadbc6417e8d3e228a2d27f3fc5d953263539bb7f35e6096b1241e7b8d759bb6a46ce02f32f65d4ca89ab
@@ -7,7 +7,7 @@ module Swaggard
7
7
  def initialize
8
8
  @paths = {}
9
9
  @tags = {}
10
- @definitions = []
10
+ @definitions = {}
11
11
  end
12
12
 
13
13
  def add_tag(tag)
@@ -19,7 +19,7 @@ module Swaggard
19
19
  def add_operation(operation)
20
20
  @paths[operation.path] ||= Swagger::Path.new(operation.path)
21
21
  @paths[operation.path].add_operation(operation)
22
- @definitions.concat(operation.definitions)
22
+ @definitions.merge!(operation.definitions)
23
23
  end
24
24
 
25
25
  def ignore_put_if_patch!
@@ -51,7 +51,7 @@ module Swaggard
51
51
  'produces' => Swaggard.configuration.api_formats.map { |format| "application/#{format}" },
52
52
  'tags' => @tags.map { |_, tag| tag.to_doc },
53
53
  'paths' => Hash[@paths.values.map { |path| [format_path(path.path), path.to_doc] }],
54
- 'definitions' => Hash[@definitions.map { |definition| [definition.id, definition.to_doc] }]
54
+ 'definitions' => Hash[@definitions.merge(Swaggard.configuration.definitions).map { |id, definition| [id, definition.to_doc(@definitions)] }]
55
55
  }
56
56
  end
57
57
 
@@ -23,8 +23,6 @@ module Swaggard
23
23
  :default_response_status_code, :excluded_paths, :path_parameter_description,
24
24
  :ignore_put_if_patch_exists
25
25
 
26
- attr_reader :custom_types
27
-
28
26
  def swagger_version
29
27
  @swagger_version ||= '2.0'
30
28
  end
@@ -149,6 +147,14 @@ module Swaggard
149
147
  custom_types[name] = definition
150
148
  end
151
149
 
150
+ def definitions
151
+ @definitions ||= {}
152
+ end
153
+
154
+ def add_definition(definition)
155
+ definitions[definition.id] = definition
156
+ end
157
+
152
158
  def path_parameter_description
153
159
  @path_parameter_description ||= ->(path_parameter) { "Scope response to #{path_parameter.name}" }
154
160
  end
@@ -1,29 +1,38 @@
1
1
  require_relative '../swagger/definition'
2
- require_relative '../swagger/property'
2
+ require_relative 'property'
3
3
 
4
4
  module Swaggard
5
5
  module Parsers
6
6
  class Models
7
7
 
8
8
  def run(yard_objects)
9
- definitions = []
9
+ definitions = {}
10
10
 
11
11
  yard_objects.each do |yard_object|
12
- next unless yard_object.type == :class
12
+ definition = parse_yard_object(yard_object)
13
13
 
14
- definition = Swagger::Definition.new(yard_object.path)
14
+ definitions[definition.id] = definition if definition
15
+ end
16
+
17
+ definitions
18
+ end
15
19
 
20
+ def parse_yard_object(yard_object)
21
+ return unless yard_object.type == :class
22
+
23
+ Swagger::Definition.new(yard_object.path, ancestors: yard_object.inheritance_tree.map(&:path)).tap do |definition|
16
24
  yard_object.tags.each do |tag|
17
- property = Swagger::Property.new(tag)
18
- definition.add_property(property)
25
+ case tag.tag_name
26
+ when 'attr'
27
+ property = Swaggard::Parsers::Property.run(tag)
28
+ definition.add_property(property)
29
+ when 'ignore_inherited'
30
+ definition.ignore_inherited = true
31
+ end
19
32
  end
20
-
21
- definitions << definition
22
33
  end
23
-
24
- definitions
25
34
  end
26
35
 
27
36
  end
28
37
  end
29
- end
38
+ end
@@ -0,0 +1,21 @@
1
+ require_relative '../swagger/property'
2
+
3
+ module Swaggard
4
+ module Parsers
5
+ module Property
6
+ def self.run(yard_object)
7
+ name = yard_object.name.dup
8
+ options_and_description = yard_object.text&.dup || ''
9
+
10
+ options_and_description.gsub!("\n", ' ')
11
+ options, description = options_and_description.match(/\A(\[.*\])?(.*)\Z/).captures
12
+ options = options ? options.gsub(/\[?\]?\s?/, '').split(',') : []
13
+ description = description.strip
14
+ required = name.gsub!(/^!/, '')
15
+ type = Parsers::Type.run(yard_object.types.first)
16
+
17
+ Swaggard::Swagger::Property.new(name, type, description, required.present?, options)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ require_relative '../swagger/type'
2
+
3
+ module Swaggard
4
+ module Parsers
5
+ module Type
6
+ def self.run(string)
7
+ parts = string.split(/[<>]/)
8
+ name = parts.last
9
+ is_array = parts.grep(/array/i).any?
10
+
11
+ Swaggard::Swagger::Type.new(name, is_array)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -3,13 +3,15 @@ module Swaggard
3
3
  class Definition
4
4
 
5
5
  attr_reader :id
6
- attr_writer :description, :title
6
+ attr_writer :description, :title, :ignore_inherited
7
7
 
8
- def initialize(id)
8
+ def initialize(id, ancestors: [])
9
9
  @id = id
10
10
  @title = ''
11
11
  @properties = []
12
12
  @description = ''
13
+ @ancestors = ancestors
14
+ @ignore_inherited = false
13
15
  end
14
16
 
15
17
  def add_property(property)
@@ -20,15 +22,35 @@ module Swaggard
20
22
  @properties.empty?
21
23
  end
22
24
 
23
- def to_doc
25
+ def properties(definitions)
26
+ inherited_properties(definitions)
27
+ .concat(@properties)
28
+ .uniq { |property| property.id }
29
+ end
30
+
31
+ def inherited_properties(definitions)
32
+ return [] if @ignore_inherited
33
+
34
+ @ancestors.flat_map do |ancestor|
35
+ definition = definitions[ancestor]
36
+
37
+ next unless definition && definition.id != id
38
+
39
+ definition.properties(definitions)
40
+ end.compact
41
+ end
42
+
43
+ def to_doc(definitions)
24
44
  {}.tap do |doc|
25
45
  doc['title'] = @title if @title.present?
26
46
  doc['type'] = 'object'
27
47
 
28
48
  doc['description'] = @description if @description.present?
29
49
 
30
- doc['properties'] = Hash[@properties.map { |property| [property.id, property.to_doc] }]
31
- required_properties = @properties.select(&:required?).map(&:id)
50
+ all_properties = properties(definitions)
51
+
52
+ doc['properties'] = Hash[all_properties.map { |property| [property.id, property.to_doc] }]
53
+ required_properties = all_properties.select(&:required?).map(&:id)
32
54
  doc['required'] = required_properties if required_properties.any?
33
55
  end
34
56
 
@@ -92,8 +92,12 @@ module Swaggard
92
92
  end
93
93
 
94
94
  def definitions
95
- @responses.map(&:definition).compact.tap do |definitions|
96
- definitions << @body_parameter.definition if @body_parameter
95
+ @responses.map(&:definition).compact.inject({}) do |definitions, definition|
96
+ definitions[definition.id] = definition
97
+ end.tap do |definitions|
98
+ next unless @body_parameter
99
+
100
+ definitions[@body_parameter.definition.id] = @body_parameter.definition
97
101
  end
98
102
  end
99
103
 
@@ -1,11 +1,10 @@
1
1
  require_relative 'base'
2
- require_relative '../type'
2
+ require_relative '../../parsers/type'
3
3
 
4
4
  module Swaggard
5
5
  module Swagger
6
6
  module Parameters
7
7
  class Body < Base
8
-
9
8
  attr_reader :definition
10
9
 
11
10
  def initialize(operation_name)
@@ -51,9 +50,7 @@ module Swaggard
51
50
 
52
51
  private
53
52
 
54
-
55
53
  class Property
56
-
57
54
  attr_reader :id
58
55
 
59
56
  def initialize(string)
@@ -83,13 +80,11 @@ module Swaggard
83
80
 
84
81
  @id = name
85
82
  @description = description if description.present?
86
- @type = Type.new([data_type])
83
+ @type = Parsers::Type.run(data_type)
87
84
  @required = required
88
85
  @options = options
89
86
  end
90
-
91
87
  end
92
-
93
88
  end
94
89
  end
95
90
  end
@@ -1,10 +1,10 @@
1
1
  require_relative 'base'
2
+ require_relative '../../parsers/type'
2
3
 
3
4
  module Swaggard
4
5
  module Swagger
5
6
  module Parameters
6
7
  class Query < Base
7
-
8
8
  def initialize(string)
9
9
  @in = 'query'
10
10
  parse(string)
@@ -37,12 +37,11 @@ module Swaggard
37
37
 
38
38
  @name = name
39
39
  @description = description
40
- @type = Type.new([data_type])
40
+ @type = Parsers::Type.run(data_type)
41
41
  @is_required = required.present?
42
42
  @allow_multiple = allow_multiple.present?
43
43
  @options = options
44
44
  end
45
-
46
45
  end
47
46
  end
48
47
  end
@@ -3,23 +3,13 @@ require_relative 'type'
3
3
  module Swaggard
4
4
  module Swagger
5
5
  class Property
6
-
7
6
  attr_reader :id, :type, :description
8
7
 
9
- def initialize(yard_object)
10
- name = yard_object.name.dup
11
- options_and_description = yard_object.text&.dup || ''
12
-
13
- options_and_description.gsub!("\n", ' ')
14
- options, description = options_and_description.match(/\A(\[.*\])?(.*)\Z/).captures
15
- options = options ? options.gsub(/\[?\]?\s?/, '').split(',') : []
16
- description = description.strip
17
- required = name.gsub!(/^!/, '')
18
-
8
+ def initialize(name, type, description = '', required = false, options = [])
19
9
  @id = name
20
- @type = Type.new(yard_object.types)
10
+ @type = type
21
11
  @description = description
22
- @required = required.present?
12
+ @required = required
23
13
  @options = options
24
14
  end
25
15
 
@@ -33,7 +23,6 @@ module Swaggard
33
23
  result['enum'] = @options if @options.present?
34
24
  result
35
25
  end
36
-
37
26
  end
38
27
  end
39
28
  end
@@ -12,14 +12,16 @@ module Swaggard
12
12
  'boolean' => { 'type' => 'boolean' },
13
13
  'date' => { 'type' => 'string', 'format' => 'date' },
14
14
  'date-time' => { 'type' => 'string', 'format' => 'date-time' },
15
+ 'datetime' => { 'type' => 'string', 'format' => 'date-time' },
15
16
  'password' => { 'type' => 'string', 'format' => 'password' },
16
17
  'hash' => { 'type' => 'object' }
17
18
  }
18
19
 
19
20
  attr_reader :name
20
21
 
21
- def initialize(types)
22
- parse(types)
22
+ def initialize(name, is_array = false)
23
+ @name = name.to_s
24
+ @is_array = is_array
23
25
  end
24
26
 
25
27
  def to_doc
@@ -32,14 +34,6 @@ module Swaggard
32
34
 
33
35
  private
34
36
 
35
- def parse(types)
36
- parts = types.first.split(/[<>]/)
37
-
38
- @name = parts.last
39
- @is_array = parts.grep(/array/i).any?
40
- end
41
-
42
-
43
37
  def basic_type?
44
38
  BASIC_TYPES.has_key?(@name.downcase)
45
39
  end
@@ -1,3 +1,3 @@
1
1
  module Swaggard
2
- VERSION = '1.1.1'
2
+ VERSION = '1.4.0'
3
3
  end
data/lib/swaggard.rb CHANGED
@@ -38,6 +38,7 @@ module Swaggard
38
38
  ::YARD::Tags::Library.define_tag('Response description', :response_description)
39
39
  ::YARD::Tags::Library.define_tag('Response example', :response_example)
40
40
  ::YARD::Tags::Library.define_tag('Response header', :response_header)
41
+ ::YARD::Tags::Library.define_tag('Ignore inherited attributes', :ignore_inherited)
41
42
  end
42
43
 
43
44
  def get_doc(host = nil)
@@ -119,7 +120,6 @@ module Swaggard
119
120
 
120
121
  tags.each do |tag|
121
122
  @tags << [tag, operations]
122
- # [tag.controller_class.controller_path] ||= { tag: tag, operations: operations }
123
123
  end
124
124
  end
125
125
 
@@ -136,12 +136,12 @@ module Swaggard
136
136
  def parse_models
137
137
  parser = Parsers::Models.new
138
138
 
139
- definitions =[]
139
+ definitions = {}
140
140
  configuration.models_paths.each do |path|
141
141
  Dir[path].each do |file|
142
142
  yard_objects = get_yard_objects(file)
143
143
 
144
- definitions.concat(parser.run(yard_objects))
144
+ definitions.merge!(parser.run(yard_objects))
145
145
  end
146
146
 
147
147
  @api.definitions = definitions
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: swaggard
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adrian Gomez
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-06 00:00:00.000000000 Z
11
+ date: 2022-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: '4.0'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '7.0'
22
+ version: '8.0'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: '4.0'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '7.0'
32
+ version: '8.0'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: sass-rails
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -168,7 +168,9 @@ files:
168
168
  - lib/swaggard/engine.rb
169
169
  - lib/swaggard/parsers/controller.rb
170
170
  - lib/swaggard/parsers/models.rb
171
+ - lib/swaggard/parsers/property.rb
171
172
  - lib/swaggard/parsers/routes.rb
173
+ - lib/swaggard/parsers/type.rb
172
174
  - lib/swaggard/swagger/definition.rb
173
175
  - lib/swaggard/swagger/operation.rb
174
176
  - lib/swaggard/swagger/parameters/base.rb
@@ -192,7 +194,6 @@ files:
192
194
  - spec/fixtures/dummy/config/application.rb
193
195
  - spec/fixtures/dummy/config/environments/development.rb
194
196
  - spec/fixtures/dummy/config/routes.rb
195
- - spec/fixtures/dummy/log/development.log
196
197
  - spec/fixtures/swagger_schema.json
197
198
  - spec/integration/swaggard_spec.rb
198
199
  - spec/spec_helper.rb
@@ -200,7 +201,7 @@ homepage: https://github.com/adrian-gomez/swaggard
200
201
  licenses:
201
202
  - MIT
202
203
  metadata: {}
203
- post_install_message:
204
+ post_install_message:
204
205
  rdoc_options: []
205
206
  require_paths:
206
207
  - lib
@@ -215,19 +216,18 @@ required_rubygems_version: !ruby/object:Gem::Requirement
215
216
  - !ruby/object:Gem::Version
216
217
  version: '0'
217
218
  requirements: []
218
- rubygems_version: 3.0.3
219
- signing_key:
219
+ rubygems_version: 3.2.15
220
+ signing_key:
220
221
  specification_version: 4
221
222
  summary: 'Swaggard: Swagger Rails REST API doc using yard YARD'
222
223
  test_files:
223
- - spec/spec_helper.rb
224
- - spec/integration/swaggard_spec.rb
225
- - spec/fixtures/swagger_schema.json
226
- - spec/fixtures/dummy/app/controllers/pets_controller.rb
227
- - spec/fixtures/dummy/app/controllers/application_controller.rb
224
+ - spec/fixtures/api.json
228
225
  - spec/fixtures/dummy/app/controllers/admin/pets_controller.rb
229
- - spec/fixtures/dummy/config/routes.rb
230
- - spec/fixtures/dummy/config/environments/development.rb
226
+ - spec/fixtures/dummy/app/controllers/application_controller.rb
227
+ - spec/fixtures/dummy/app/controllers/pets_controller.rb
231
228
  - spec/fixtures/dummy/config/application.rb
232
- - spec/fixtures/dummy/log/development.log
233
- - spec/fixtures/api.json
229
+ - spec/fixtures/dummy/config/environments/development.rb
230
+ - spec/fixtures/dummy/config/routes.rb
231
+ - spec/fixtures/swagger_schema.json
232
+ - spec/integration/swaggard_spec.rb
233
+ - spec/spec_helper.rb
File without changes