decode 0.15.3 → 0.17.1

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: 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