decode 0.15.3 → 0.17.1

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
  SHA256:
3
- metadata.gz: fef5bd0d089112f4e4897666683a8ecebb9306a9c4a1d454aa2cfef8a30daecf
4
- data.tar.gz: cddb38a43954d3bd8ee2587ee66a2a7bd9ab207b33553dcc871b1d032fcde01e
3
+ metadata.gz: e93383d44bf331fbbe47bf804d1f59331de0437d9adbe725ba9a9182510842ef
4
+ data.tar.gz: 48e8dc949ea4ea603da59bfde63e42040b6fe3df448064fd0107fa2d8fd2d99a
5
5
  SHA512:
6
- metadata.gz: 2ffceab58980663e235b35dcf68575e4a6857a483b796fe9a6df8248d52df5c52810711f7a4d9ba249113c6bb5facfc36af5efab22482b8ab1dc52956503c18e
7
- data.tar.gz: daf76f009f6bc36d3f7515f182fc8daf5aceec3fc74758cd11fcb67c3f5f0780cbd55cffc0b3786dbe058f95c1a3085a7442d7a09833797a1c625add875def1a
6
+ metadata.gz: 9b74c5d5c31cc1f8b0bc0dbc3a9e00ab2d8862763d009acfbb7734ae330138d264ddd06cb6ae2efa23ce907d1f7af330ef5e43475e828bdfaca32c9cc87c87a7
7
+ data.tar.gz: 3d1c155aa5cb886fe536d6e15ab04e3a955b59be026b223a8ae064ae175e635293f3dc12dd292eb0a15622f371d0c4687e3ef62534bba34fa8e092f616ae4b35
checksums.yaml.gz.sig ADDED
Binary file
@@ -54,6 +54,14 @@ module Decode
54
54
  end
55
55
  end
56
56
 
57
+ def filter(klass)
58
+ return to_enum(:filter, klass) unless block_given?
59
+
60
+ @children&.each do |child|
61
+ yield child if child.is_a?(klass)
62
+ end
63
+ end
64
+
57
65
  # Any lines of text associated wtih this node.
58
66
  # @returns [Array(String) | Nil] The lines of text.
59
67
  def text
@@ -30,13 +30,15 @@ module Decode
30
30
  # - `@asynchronous This method may yield.`
31
31
  #
32
32
  class Pragma < Tag
33
- PATTERN = /\A(?<details>.*?)?\Z/
33
+ def self.parse(directive, text, lines, tags, level = 0)
34
+ self.build(directive, text)
35
+ end
34
36
 
35
- def self.build(directive, match)
37
+ def self.build(directive, text)
36
38
  node = self.new(directive)
37
39
 
38
- if details = match[:details]
39
- node.add(Text.new(details))
40
+ if text
41
+ node.add(Text.new(text))
40
42
  end
41
43
 
42
44
  return node
@@ -23,8 +23,12 @@ require_relative 'node'
23
23
  module Decode
24
24
  module Comment
25
25
  class Tag < Node
26
+ def self.match(text)
27
+ self::PATTERN.match(text)
28
+ end
29
+
26
30
  def self.parse(directive, text, lines, tags, level = 0)
27
- if match = self::PATTERN.match(text)
31
+ if match = self.match(text)
28
32
  node = self.build(directive, match)
29
33
 
30
34
  tags.parse(lines, level + 1) do |child|
@@ -29,13 +29,13 @@ module Decode
29
29
  def initialize(name, parent: nil, language: parent.language, comments: nil)
30
30
  @name = name
31
31
 
32
- @comments = comments
33
- @language = language
34
32
  @parent = parent
33
+ @language = language
34
+
35
+ @comments = comments
35
36
 
36
37
  @path = nil
37
38
  @qualified_name = nil
38
- @documentation = nil
39
39
  end
40
40
 
41
41
  def to_s
@@ -20,6 +20,7 @@
20
20
 
21
21
  require_relative 'comment/node'
22
22
 
23
+ require_relative 'comment/tags'
23
24
  require_relative 'comment/attribute'
24
25
  require_relative 'comment/parameter'
25
26
  require_relative 'comment/pragma'
@@ -19,32 +19,77 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  require_relative 'reference'
22
+ require_relative '../documentation'
22
23
 
23
24
  module Decode
24
25
  module Language
25
26
  # The Ruby language.
26
27
  class Generic
27
- def initialize(name)
28
+ EXTENSIONS = []
29
+
30
+ TAGS = Comment::Tags.build do |tags|
31
+ tags['attribute'] = Comment::Attribute
32
+ tags['parameter'] = Comment::Parameter
33
+ tags['yields'] = Comment::Yields
34
+ tags['returns'] = Comment::Returns
35
+ tags['raises'] = Comment::Raises
36
+ tags['throws'] = Comment::Throws
37
+
38
+ tags['deprecated'] = Comment::Pragma
39
+
40
+ tags['asynchronous'] = Comment::Pragma
41
+
42
+ tags['public'] = Comment::Pragma
43
+ tags['private'] = Comment::Pragma
44
+ end
45
+
46
+ def initialize(name, extensions: self.class::EXTENSIONS, tags: self.class::TAGS)
28
47
  @name = name
48
+ @extensions = extensions
49
+ @tags = tags
29
50
  end
30
51
 
31
52
  attr :name
32
53
 
33
- # Generate a generic reference.
54
+ def names
55
+ [@name]
56
+ end
57
+
58
+ attr :extensions
59
+
60
+ attr :tags
61
+
62
+ # Generate a language-specific reference.
63
+ # @parameter identifier [String] A valid identifier.
34
64
  def reference_for(identifier)
35
65
  Reference.new(identifier, self)
36
66
  end
37
67
 
68
+ def parser
69
+ nil
70
+ end
71
+
38
72
  # Parse the input yielding definitions.
39
- # @block {|definition| ... }
40
- # @yield definition [Definition]
73
+ # @parameter input [File] The input file which contains the source code.
74
+ # @yields {|definition| ...} Receives the definitions extracted from the source code.
75
+ # @parameter definition [Definition] The source code definition including methods, classes, etc.
76
+ # @returns [Enumerator(Segment)] If no block given.
41
77
  def definitions_for(input, &block)
78
+ if parser = self.parser
79
+ parser.definitions_for(input, &block)
80
+ end
42
81
  end
43
82
 
44
- # Parse the input yielding interleaved comments and code segments.
45
- # @block {|segment| ... }
46
- # @yield segment [Segment]
83
+ # Parse the input yielding segments.
84
+ # Segments are constructed from a block of top level comments followed by a block of code.
85
+ # @parameter input [File] The input file which contains the source code.
86
+ # @yields {|segment| ...}
87
+ # @parameter segment [Segment]
88
+ # @returns [Enumerator(Segment)] If no block given.
47
89
  def segments_for(input, &block)
90
+ if parser = self.parser
91
+ parser.segments_for(input, &block)
92
+ end
48
93
  end
49
94
  end
50
95
  end
@@ -0,0 +1,48 @@
1
+ # Copyright, 2020, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ require_relative 'reference'
22
+ require_relative 'parser'
23
+ require_relative 'code'
24
+
25
+ module Decode
26
+ module Language
27
+ module Ruby
28
+ # The Ruby language.
29
+ class Generic < Language::Generic
30
+ EXTENSIONS = ['.rb', '.ru']
31
+
32
+ def parser
33
+ @parser ||= Parser.new(self)
34
+ end
35
+
36
+ # Generate a language-specific reference.
37
+ # @parameter identifier [String] A valid identifier.
38
+ def reference_for(identifier)
39
+ Reference.new(identifier, self)
40
+ end
41
+
42
+ def code_for(text, index, relative_to: nil)
43
+ Code.new(text, index, relative_to: relative_to, language: self)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -38,6 +38,10 @@ module Decode
38
38
  module Ruby
39
39
  # The Ruby source code parser.
40
40
  class Parser
41
+ def initialize(language)
42
+ @language = language
43
+ end
44
+
41
45
  # Extract definitions from the given input file.
42
46
  def definitions_for(input, &block)
43
47
  top, comments = ::Parser::CurrentRuby.parse_with_comments(input)
@@ -84,7 +88,7 @@ module Decode
84
88
  node, node.children[0].children[1],
85
89
  comments: extract_comments_for(node, comments),
86
90
  parent: parent,
87
- language: Ruby
91
+ language: @language
88
92
  )
89
93
 
90
94
  yield definition
@@ -94,9 +98,9 @@ module Decode
94
98
  end
95
99
  when :class
96
100
  definition = Class.new(
97
- node, node.children[0].children[1],
101
+ node, class_name_for(node.children[0]),
98
102
  comments: extract_comments_for(node, comments),
99
- parent: parent, language: Ruby
103
+ parent: parent, language: @language
100
104
  )
101
105
 
102
106
  yield definition
@@ -108,7 +112,7 @@ module Decode
108
112
  definition = Singleton.new(
109
113
  node, node.children[0],
110
114
  comments: extract_comments_for(node, comments),
111
- parent: parent, language: Ruby
115
+ parent: parent, language: @language
112
116
  )
113
117
 
114
118
  yield definition
@@ -120,7 +124,7 @@ module Decode
120
124
  definition = Method.new(
121
125
  node, node.children[0],
122
126
  comments: extract_comments_for(node, comments),
123
- parent: parent, language: Ruby
127
+ parent: parent, language: @language
124
128
  )
125
129
 
126
130
  yield definition
@@ -128,7 +132,7 @@ module Decode
128
132
  definition = Function.new(
129
133
  node, node.children[1],
130
134
  comments: extract_comments_for(node, comments),
131
- parent: parent, language: Ruby
135
+ parent: parent, language: @language
132
136
  )
133
137
 
134
138
  yield definition
@@ -136,18 +140,19 @@ module Decode
136
140
  definition = Constant.new(
137
141
  node, node.children[1],
138
142
  comments: extract_comments_for(node, comments),
139
- parent: parent, language: Ruby
143
+ parent: parent, language: @language
140
144
  )
141
145
 
142
146
  yield definition
143
147
  when :send
144
148
  name = node.children[1]
149
+
145
150
  case name
146
151
  when :attr, :attr_reader, :attr_writer, :attr_accessor
147
152
  definition = Attribute.new(
148
153
  node, name_for(node.children[2]),
149
154
  comments: extract_comments_for(node, comments),
150
- parent: parent, language: Ruby
155
+ parent: parent, language: @language
151
156
  )
152
157
 
153
158
  yield definition
@@ -157,7 +162,7 @@ module Decode
157
162
  definition = Call.new(
158
163
  node, name_for(node, extracted_comments),
159
164
  comments: extracted_comments,
160
- parent: parent, language: Ruby
165
+ parent: parent, language: @language
161
166
  )
162
167
 
163
168
  yield definition
@@ -171,7 +176,7 @@ module Decode
171
176
  node, name,
172
177
  comments: extracted_comments,
173
178
  parent: scope_for(extracted_comments, parent, &block),
174
- language: Ruby
179
+ language: @language
175
180
  )
176
181
 
177
182
  if kind = kind_for(node, extracted_comments)
@@ -206,6 +211,14 @@ module Decode
206
211
  end
207
212
  end
208
213
 
214
+ def class_name_for(node)
215
+ if prefix = node.children[0]
216
+ "#{class_name_for(prefix)}::#{node.children[1]}"
217
+ else
218
+ node.children[1]
219
+ end
220
+ end
221
+
209
222
  KIND_ATTRIBUTE = /\A
210
223
  (@(?<kind>attribute)\s+(?<value>.*?))|
211
224
  (@define\s+(?<kind>)\s+(?<value>.*?))
@@ -229,7 +242,7 @@ module Decode
229
242
  comments&.each do |comment|
230
243
  if match = comment.match(SCOPE_ATTRIBUTE)
231
244
  return match[:names].split(/\s+/).map(&:to_sym).inject(nil) do |memo, name|
232
- scope = Scope.new(name, parent: memo, language: Ruby)
245
+ scope = Scope.new(name, parent: memo, language: @language)
233
246
  yield scope
234
247
  scope
235
248
  end
@@ -268,11 +281,11 @@ module Decode
268
281
  if segment.nil?
269
282
  segment = Segment.new(
270
283
  extract_comments_for(child, comments),
271
- Ruby, child
284
+ @language, child
272
285
  )
273
286
  elsif next_comments = extract_comments_for(child, comments)
274
287
  yield segment if segment
275
- segment = Segment.new(next_comments, Ruby, child)
288
+ segment = Segment.new(next_comments, @language, child)
276
289
  else
277
290
  segment.expand(child)
278
291
  end
@@ -283,7 +296,7 @@ module Decode
283
296
  # One top level segment:
284
297
  segment = Segment.new(
285
298
  extract_comments_for(node, comments),
286
- Ruby, node
299
+ @language, node
287
300
  )
288
301
 
289
302
  yield segment
@@ -18,78 +18,14 @@
18
18
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
19
  # THE SOFTWARE.
20
20
 
21
- require_relative 'ruby/reference'
22
- require_relative 'ruby/parser'
23
- require_relative 'ruby/code'
24
-
25
- require_relative '../comment/tags'
26
- require_relative '../comment/parameter'
27
- require_relative '../comment/yields'
28
- require_relative '../comment/returns'
21
+ require_relative 'ruby/generic'
29
22
 
30
23
  module Decode
31
24
  module Language
32
25
  # An interface for extracting information from Ruby source code.
33
26
  module Ruby
34
- # The canoical name of the language for use in output formatting.
35
- # e.g. source code highlighting.
36
- def self.name
37
- "ruby"
38
- end
39
-
40
- def self.names
41
- [self.name]
42
- end
43
-
44
- def self.extensions
45
- ['.rb', '.ru']
46
- end
47
-
48
- TAGS = Comment::Tags.build do |tags|
49
- tags['attribute'] = Comment::Attribute
50
- tags['parameter'] = Comment::Parameter
51
- tags['yields'] = Comment::Yields
52
- tags['returns'] = Comment::Returns
53
- tags['raises'] = Comment::Raises
54
- tags['throws'] = Comment::Throws
55
-
56
- tags['reentrant'] = Comment::Pragma
57
- tags['deprecated'] = Comment::Pragma
58
- tags['blocking'] = Comment::Pragma
59
- tags['asynchronous'] = Comment::Pragma
60
- end
61
-
62
- def self.tags
63
- TAGS
64
- end
65
-
66
- # Generate a language-specific reference.
67
- # @parameter identifier [String] A valid identifier.
68
- def self.reference_for(identifier)
69
- Reference.new(identifier, self)
70
- end
71
-
72
- # Parse the input yielding definitions.
73
- # @parameter input [File] The input file which contains the source code.
74
- # @yields {|definition| ...} Receives the definitions extracted from the source code.
75
- # @parameter definition [Definition] The source code definition including methods, classes, etc.
76
- # @returns [Enumerator(Segment)] If no block given.
77
- def self.definitions_for(input, &block)
78
- Parser.new.definitions_for(input, &block)
79
- end
80
-
81
- # Parse the input yielding segments.
82
- # Segments are constructed from a block of top level comments followed by a block of code.
83
- # @parameter input [File] The input file which contains the source code.
84
- # @yields {|segment| ...}
85
- # @parameter segment [Segment]
86
- # @returns [Enumerator(Segment)] If no block given.
87
- def self.segments_for(input, &block)
88
- Parser.new.segments_for(input, &block)
89
- end
90
-
91
- def self.code_for(text, index, relative_to: nil)
92
- Code.new(text, index, relative_to: relative_to, language: self)
27
+ def self.new
28
+ Generic.new("ruby")
93
29
  end
94
30
  end
95
31
  end
@@ -26,7 +26,7 @@ module Decode
26
26
  class Languages
27
27
  def self.all
28
28
  self.new.tap do |languages|
29
- languages.add(Language::Ruby)
29
+ languages.add(Language::Ruby.new)
30
30
  end
31
31
  end
32
32
 
@@ -19,5 +19,5 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  module Decode
22
- VERSION = "0.15.3"
22
+ VERSION = "0.17.1"
23
23
  end
data.tar.gz.sig ADDED
Binary file
metadata CHANGED
@@ -1,14 +1,42 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: decode
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.3
4
+ version: 0.17.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
- cert_chain: []
11
- date: 2020-08-05 00:00:00.000000000 Z
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIEhDCCAuygAwIBAgIBATANBgkqhkiG9w0BAQsFADA3MTUwMwYDVQQDDCxzYW11
14
+ ZWwud2lsbGlhbXMvREM9b3Jpb250cmFuc2Zlci9EQz1jby9EQz1uejAeFw0yMTA4
15
+ MTYwNjMzNDRaFw0yMjA4MTYwNjMzNDRaMDcxNTAzBgNVBAMMLHNhbXVlbC53aWxs
16
+ aWFtcy9EQz1vcmlvbnRyYW5zZmVyL0RDPWNvL0RDPW56MIIBojANBgkqhkiG9w0B
17
+ AQEFAAOCAY8AMIIBigKCAYEAyXLSS/cw+fXJ5e7hi+U/TeChPWeYdwJojDsFY1xr
18
+ xvtqbTTL8gbLHz5LW3QD2nfwCv3qTlw0qI3Ie7a9VMJMbSvgVEGEfQirqIgJXWMj
19
+ eNMDgKsMJtC7u/43abRKx7TCURW3iWyR19NRngsJJmaR51yGGGm2Kfsr+JtKKLtL
20
+ L188Wm3f13KAx7QJU8qyuBnj1/gWem076hzdA7xi1DbrZrch9GCRz62xymJlrJHn
21
+ 9iZEZ7AxrS7vokhMlzSr/XMUihx/8aFKtk+tMLClqxZSmBWIErWdicCGTULXCBNb
22
+ E/mljo4zEVKhlTWpJklMIhr55ZRrSarKFuW7en0+tpJrfsYiAmXMJNi4XAYJH7uL
23
+ rgJuJwSaa/dMz+VmUoo7VKtSfCoOI+6v5/z0sK3oT6sG6ZwyI47DBq2XqNC6tnAj
24
+ w+XmCywiTQrFzMMAvcA7rPI4F0nU1rZId51rOvvfxaONp+wgTi4P8owZLw0/j0m4
25
+ 8C20DYi6EYx4AHDXiLpElWh3AgMBAAGjgZowgZcwCQYDVR0TBAIwADALBgNVHQ8E
26
+ BAMCBLAwHQYDVR0OBBYEFB6ZaeWKxQjGTI+pmz7cKRmMIywwMC4GA1UdEQQnMCWB
27
+ I3NhbXVlbC53aWxsaWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MC4GA1UdEgQnMCWB
28
+ I3NhbXVlbC53aWxsaWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MA0GCSqGSIb3DQEB
29
+ CwUAA4IBgQBVoM+pu3dpdUhZM1w051iw5GfiqclAr1Psypf16Tiod/ho//4oAu6T
30
+ 9fj3DPX/acWV9P/FScvqo4Qgv6g4VWO5ZU7z2JmPoTXZtYMunRAmQPFL/gSUc6aK
31
+ vszMHIyhtyzRc6DnfW2AiVOjMBjaYv8xXZc9bduniRVPrLR4J7ozmGLh4o4uJp7w
32
+ x9KCFaR8Lvn/r0oJWJOqb/DMAYI83YeN2Dlt3jpwrsmsONrtC5S3gOUle5afSGos
33
+ bYt5ocnEpKSomR9ZtnCGljds/aeO1Xgpn2r9HHcjwnH346iNrnHmMlC7BtHUFPDg
34
+ Ts92S47PTOXzwPBDsrFiq3VLbRjHSwf8rpqybQBH9MfzxGGxTaETQYOd6b4e4Ag6
35
+ y92abGna0bmIEb4+Tx9rQ10Uijh1POzvr/VTH4bbIPy9FbKrRsIQ24qDbNJRtOpE
36
+ RAOsIl+HOBTb252nx1kIRN5hqQx272AJCbCjKx8egcUQKffFVVCI0nye09v5CK+a
37
+ HiLJ8VOFx6w=
38
+ -----END CERTIFICATE-----
39
+ date: 2021-10-08 00:00:00.000000000 Z
12
40
  dependencies:
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: parser
@@ -39,7 +67,7 @@ dependencies:
39
67
  - !ruby/object:Gem::Version
40
68
  version: '0'
41
69
  - !ruby/object:Gem::Dependency
42
- name: covered
70
+ name: bundler
43
71
  requirement: !ruby/object:Gem::Requirement
44
72
  requirements:
45
73
  - - ">="
@@ -53,7 +81,7 @@ dependencies:
53
81
  - !ruby/object:Gem::Version
54
82
  version: '0'
55
83
  - !ruby/object:Gem::Dependency
56
- name: bundler
84
+ name: covered
57
85
  requirement: !ruby/object:Gem::Requirement
58
86
  requirements:
59
87
  - - ">="
@@ -82,7 +110,6 @@ dependencies:
82
110
  version: '0'
83
111
  description:
84
112
  email:
85
- - samuel.williams@oriontransfer.co.nz
86
113
  executables: []
87
114
  extensions: []
88
115
  extra_rdoc_files: []
@@ -115,6 +142,7 @@ files:
115
142
  - lib/decode/language/ruby/constant.rb
116
143
  - lib/decode/language/ruby/definition.rb
117
144
  - lib/decode/language/ruby/function.rb
145
+ - lib/decode/language/ruby/generic.rb
118
146
  - lib/decode/language/ruby/method.rb
119
147
  - lib/decode/language/ruby/module.rb
120
148
  - lib/decode/language/ruby/parser.rb
@@ -132,14 +160,15 @@ files:
132
160
  homepage: https://github.com/ioquatix/decode
133
161
  licenses:
134
162
  - MIT
135
- metadata: {}
163
+ metadata:
164
+ funding_uri: https://github.com/sponsors/ioquatix/
136
165
  post_install_message:
137
166
  rdoc_options: []
138
167
  require_paths:
139
168
  - lib
140
169
  required_ruby_version: !ruby/object:Gem::Requirement
141
170
  requirements:
142
- - - "~>"
171
+ - - ">="
143
172
  - !ruby/object:Gem::Version
144
173
  version: '2.5'
145
174
  required_rubygems_version: !ruby/object:Gem::Requirement
@@ -148,7 +177,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
148
177
  - !ruby/object:Gem::Version
149
178
  version: '0'
150
179
  requirements: []
151
- rubygems_version: 3.1.2
180
+ rubygems_version: 3.1.6
152
181
  signing_key:
153
182
  specification_version: 4
154
183
  summary: Code analysis for documentation generation.
metadata.gz.sig ADDED
Binary file