decode 0.15.4 → 0.16.0

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: 3e72d09d01f600b6c256246f13059690b23f49c0698b7b31e24421e928b73fcd
4
- data.tar.gz: e582753a3e97b18d0a2ab7d5cde6998eb28f32c6128462bc869dc822bb5bd66d
3
+ metadata.gz: dae66e72979c078b311b91e8ad4ae7b6e3adbb0d3b03d0982db05b176d75d417
4
+ data.tar.gz: f42f00c8f685fa1ce6ae05336e4a41ade53b1cf40bc7002cb7f540327e5ec92c
5
5
  SHA512:
6
- metadata.gz: 6fe459bba1a7675f1ce6e5bfa788765f2f0acc489e5b16d8b77896c62f5e7bb8a3ca08ca25fc579965613bb7cc38f0972a9b00b15d47a19a0df5a64d610e4f65
7
- data.tar.gz: bbd9fc07585e0fdc5c7fab11ce2cb2b321b2ceb38e0c28e483347ac68547845e9b57d109bd4ff691a32372c14c556026ea42a7c5cf1e94537dae3e68633b954a
6
+ metadata.gz: 205d18a44b532e6951babfe9582e43d64c5a03d7dfec8cfccf9e3ed02adbef5e8f72121632d86f15096a30ad1e6559075959394b79b29c0570d7c395b381e87d
7
+ data.tar.gz: b6106e00e17c5d7680046f837c3eabbc8c939e705bae924687635a8dc3ba1ffdb9d182b1b35df9765069974034d7506e631ad6f42b3434e1842677d2f342606a
@@ -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,75 @@
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['reentrant'] = Comment::Pragma
39
+ tags['deprecated'] = Comment::Pragma
40
+ tags['blocking'] = Comment::Pragma
41
+ tags['asynchronous'] = Comment::Pragma
42
+ end
43
+
44
+ def initialize(name, extensions: self.class::EXTENSIONS, tags: self.class::TAGS)
28
45
  @name = name
46
+ @extensions = extensions
47
+ @tags = tags
29
48
  end
30
49
 
31
50
  attr :name
32
51
 
33
- # Generate a generic reference.
52
+ def names
53
+ [@name]
54
+ end
55
+
56
+ attr :extensions
57
+
58
+ attr :tags
59
+
60
+ # Generate a language-specific reference.
61
+ # @parameter identifier [String] A valid identifier.
34
62
  def reference_for(identifier)
35
63
  Reference.new(identifier, self)
36
64
  end
37
65
 
66
+ def parser
67
+ nil
68
+ end
69
+
38
70
  # Parse the input yielding definitions.
39
- # @block {|definition| ... }
40
- # @yield definition [Definition]
71
+ # @parameter input [File] The input file which contains the source code.
72
+ # @yields {|definition| ...} Receives the definitions extracted from the source code.
73
+ # @parameter definition [Definition] The source code definition including methods, classes, etc.
74
+ # @returns [Enumerator(Segment)] If no block given.
41
75
  def definitions_for(input, &block)
76
+ if parser = self.parser
77
+ parser.definitions_for(input, &block)
78
+ end
42
79
  end
43
80
 
44
- # Parse the input yielding interleaved comments and code segments.
45
- # @block {|segment| ... }
46
- # @yield segment [Segment]
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.
47
87
  def segments_for(input, &block)
88
+ if parser = self.parser
89
+ parser.segments_for(input, &block)
90
+ end
48
91
  end
49
92
  end
50
93
  end
@@ -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
@@ -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
@@ -96,7 +100,7 @@ module Decode
96
100
  definition = Class.new(
97
101
  node, node.children[0].children[1],
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)
@@ -229,7 +234,7 @@ module Decode
229
234
  comments&.each do |comment|
230
235
  if match = comment.match(SCOPE_ATTRIBUTE)
231
236
  return match[:names].split(/\s+/).map(&:to_sym).inject(nil) do |memo, name|
232
- scope = Scope.new(name, parent: memo, language: Ruby)
237
+ scope = Scope.new(name, parent: memo, language: @language)
233
238
  yield scope
234
239
  scope
235
240
  end
@@ -268,11 +273,11 @@ module Decode
268
273
  if segment.nil?
269
274
  segment = Segment.new(
270
275
  extract_comments_for(child, comments),
271
- Ruby, child
276
+ @language, child
272
277
  )
273
278
  elsif next_comments = extract_comments_for(child, comments)
274
279
  yield segment if segment
275
- segment = Segment.new(next_comments, Ruby, child)
280
+ segment = Segment.new(next_comments, @language, child)
276
281
  else
277
282
  segment.expand(child)
278
283
  end
@@ -283,7 +288,7 @@ module Decode
283
288
  # One top level segment:
284
289
  segment = Segment.new(
285
290
  extract_comments_for(node, comments),
286
- Ruby, node
291
+ @language, node
287
292
  )
288
293
 
289
294
  yield segment
@@ -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.4"
22
+ VERSION = "0.16.0"
23
23
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: decode
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.4
4
+ version: 0.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-19 00:00:00.000000000 Z
11
+ date: 2021-05-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parser
@@ -114,6 +114,7 @@ files:
114
114
  - lib/decode/language/ruby/constant.rb
115
115
  - lib/decode/language/ruby/definition.rb
116
116
  - lib/decode/language/ruby/function.rb
117
+ - lib/decode/language/ruby/generic.rb
117
118
  - lib/decode/language/ruby/method.rb
118
119
  - lib/decode/language/ruby/module.rb
119
120
  - lib/decode/language/ruby/parser.rb
@@ -148,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
148
149
  - !ruby/object:Gem::Version
149
150
  version: '0'
150
151
  requirements: []
151
- rubygems_version: 3.0.3
152
+ rubygems_version: 3.1.2
152
153
  signing_key:
153
154
  specification_version: 4
154
155
  summary: Code analysis for documentation generation.