decode 0.15.0 → 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: 46819e1068182148b9179638359c81fe75b3276f3ae07285f962fbeda31f3a48
4
- data.tar.gz: 24e0acf13ec561c1bb28be8700302302c2027c314d5c951613e3734260b1e995
3
+ metadata.gz: dae66e72979c078b311b91e8ad4ae7b6e3adbb0d3b03d0982db05b176d75d417
4
+ data.tar.gz: f42f00c8f685fa1ce6ae05336e4a41ade53b1cf40bc7002cb7f540327e5ec92c
5
5
  SHA512:
6
- metadata.gz: 8b07a7bb594c53d26e81903b54cf640b766318eba6365a90a6b443fa2036ab4b4b5ac2145aadf44aca5fff8b4f373ff4379f7301c1658ffc25bce693ab49a268
7
- data.tar.gz: a23772085b48311f6f4596f1215dd3b2a0e1974a5ca3d78c4bd207118c3c6b048beb342fd3dd04accdd39ed531ebcd29d8b73e9733bcff532f90b8203ba7f746
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
@@ -42,7 +42,7 @@ module Decode
42
42
 
43
43
  def extract(into = [])
44
44
  if @index
45
- self.traverse(@root, into)
45
+ traverse(@root, into)
46
46
  end
47
47
 
48
48
  return into
@@ -62,7 +62,7 @@ module Decode
62
62
  end
63
63
 
64
64
  # Extract constants from arguments:
65
- children = node.children[2..].each do |node|
65
+ children = node.children[2..-1].each do |node|
66
66
  traverse(node, into)
67
67
  end
68
68
  when :const
@@ -51,10 +51,10 @@ module Decode
51
51
  if lines.count == 1
52
52
  return lines.first
53
53
  else
54
- indentation = expression.source_line[/\A\s+/]
55
-
56
- # Remove all the indentation:
57
- lines.each{|line| line.sub!(indentation, '')}
54
+ if indentation = expression.source_line[/\A\s+/]
55
+ # Remove all the indentation:
56
+ lines.each{|line| line.sub!(indentation, '')}
57
+ end
58
58
 
59
59
  return lines.join
60
60
  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
@@ -42,6 +42,12 @@ module Decode
42
42
 
43
43
  # The long form is the same as the short form.
44
44
  alias long_form short_form
45
+
46
+ # The fully qualified name of the class.
47
+ # e.g. `module ::Barnyard::Dog`.
48
+ def qualified_form
49
+ "module #{self.qualified_name}"
50
+ end
45
51
  end
46
52
  end
47
53
  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.0"
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.0
4
+ version: 0.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-18 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
@@ -39,21 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: bake-bundler
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: utopia-project
42
+ name: bundler
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
45
  - - ">="
@@ -80,20 +66,6 @@ dependencies:
80
66
  - - ">="
81
67
  - !ruby/object:Gem::Version
82
68
  version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: bundler
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
69
  - !ruby/object:Gem::Dependency
98
70
  name: rspec
99
71
  requirement: !ruby/object:Gem::Requirement
@@ -108,9 +80,8 @@ dependencies:
108
80
  - - ">="
109
81
  - !ruby/object:Gem::Version
110
82
  version: '0'
111
- description:
83
+ description:
112
84
  email:
113
- - samuel.williams@oriontransfer.co.nz
114
85
  executables: []
115
86
  extensions: []
116
87
  extra_rdoc_files: []
@@ -143,6 +114,7 @@ files:
143
114
  - lib/decode/language/ruby/constant.rb
144
115
  - lib/decode/language/ruby/definition.rb
145
116
  - lib/decode/language/ruby/function.rb
117
+ - lib/decode/language/ruby/generic.rb
146
118
  - lib/decode/language/ruby/method.rb
147
119
  - lib/decode/language/ruby/module.rb
148
120
  - lib/decode/language/ruby/parser.rb
@@ -160,14 +132,15 @@ files:
160
132
  homepage: https://github.com/ioquatix/decode
161
133
  licenses:
162
134
  - MIT
163
- metadata: {}
164
- post_install_message:
135
+ metadata:
136
+ funding_uri: https://github.com/sponsors/ioquatix/
137
+ post_install_message:
165
138
  rdoc_options: []
166
139
  require_paths:
167
140
  - lib
168
141
  required_ruby_version: !ruby/object:Gem::Requirement
169
142
  requirements:
170
- - - "~>"
143
+ - - ">="
171
144
  - !ruby/object:Gem::Version
172
145
  version: '2.5'
173
146
  required_rubygems_version: !ruby/object:Gem::Requirement
@@ -177,7 +150,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
177
150
  version: '0'
178
151
  requirements: []
179
152
  rubygems_version: 3.1.2
180
- signing_key:
153
+ signing_key:
181
154
  specification_version: 4
182
155
  summary: Code analysis for documentation generation.
183
156
  test_files: []