decode 0.15.0 → 0.16.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/decode/definition.rb +3 -3
- data/lib/decode/documentation.rb +1 -0
- data/lib/decode/language/generic.rb +50 -7
- data/lib/decode/language/ruby.rb +3 -67
- data/lib/decode/language/ruby/code.rb +2 -2
- data/lib/decode/language/ruby/definition.rb +4 -4
- data/lib/decode/language/ruby/generic.rb +48 -0
- data/lib/decode/language/ruby/module.rb +6 -0
- data/lib/decode/language/ruby/parser.rb +18 -13
- data/lib/decode/languages.rb +1 -1
- data/lib/decode/version.rb +1 -1
- metadata +11 -38
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dae66e72979c078b311b91e8ad4ae7b6e3adbb0d3b03d0982db05b176d75d417
|
4
|
+
data.tar.gz: f42f00c8f685fa1ce6ae05336e4a41ade53b1cf40bc7002cb7f540327e5ec92c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 205d18a44b532e6951babfe9582e43d64c5a03d7dfec8cfccf9e3ed02adbef5e8f72121632d86f15096a30ad1e6559075959394b79b29c0570d7c395b381e87d
|
7
|
+
data.tar.gz: b6106e00e17c5d7680046f837c3eabbc8c939e705bae924687635a8dc3ba1ffdb9d182b1b35df9765069974034d7506e631ad6f42b3434e1842677d2f342606a
|
data/lib/decode/definition.rb
CHANGED
@@ -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
|
data/lib/decode/documentation.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
# @
|
40
|
-
# @
|
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
|
45
|
-
#
|
46
|
-
# @
|
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
|
data/lib/decode/language/ruby.rb
CHANGED
@@ -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/
|
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
|
-
|
35
|
-
|
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
|
-
|
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
|
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
|
-
|
57
|
-
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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
|
-
|
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,
|
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
|
-
|
291
|
+
@language, node
|
287
292
|
)
|
288
293
|
|
289
294
|
yield segment
|
data/lib/decode/languages.rb
CHANGED
data/lib/decode/version.rb
CHANGED
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.
|
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:
|
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:
|
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
|
-
|
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: []
|