decode 0.22.0 → 0.23.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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/bake/decode/index.rb +16 -9
- data/context/coverage.md +325 -0
- data/context/getting-started.md +242 -0
- data/context/ruby-documentation.md +363 -0
- data/lib/decode/comment/attribute.rb +9 -3
- data/lib/decode/comment/node.rb +4 -2
- data/lib/decode/comment/option.rb +1 -1
- data/lib/decode/comment/parameter.rb +12 -6
- data/lib/decode/comment/pragma.rb +12 -1
- data/lib/decode/comment/raises.rb +1 -1
- data/lib/decode/comment/returns.rb +3 -4
- data/lib/decode/comment/tag.rb +13 -3
- data/lib/decode/comment/tags.rb +17 -2
- data/lib/decode/comment/text.rb +4 -1
- data/lib/decode/comment/throws.rb +1 -1
- data/lib/decode/comment/yields.rb +7 -1
- data/lib/decode/definition.rb +54 -42
- data/lib/decode/documentation.rb +12 -14
- data/lib/decode/index.rb +29 -14
- data/lib/decode/language/generic.rb +30 -14
- data/lib/decode/language/reference.rb +13 -4
- data/lib/decode/language/ruby/alias.rb +41 -0
- data/lib/decode/language/ruby/attribute.rb +7 -6
- data/lib/decode/language/ruby/block.rb +4 -1
- data/lib/decode/language/ruby/call.rb +16 -6
- data/lib/decode/language/ruby/class.rb +19 -36
- data/lib/decode/language/ruby/code.rb +27 -15
- data/lib/decode/language/ruby/constant.rb +9 -8
- data/lib/decode/language/ruby/definition.rb +27 -19
- data/lib/decode/language/ruby/function.rb +2 -1
- data/lib/decode/language/ruby/generic.rb +17 -7
- data/lib/decode/language/ruby/method.rb +47 -12
- data/lib/decode/language/ruby/module.rb +4 -11
- data/lib/decode/language/ruby/parser.rb +358 -207
- data/lib/decode/language/ruby/reference.rb +26 -17
- data/lib/decode/language/ruby/segment.rb +11 -4
- data/lib/decode/language/ruby.rb +4 -2
- data/lib/decode/language.rb +2 -2
- data/lib/decode/languages.rb +25 -6
- data/lib/decode/location.rb +2 -0
- data/lib/decode/scope.rb +1 -1
- data/lib/decode/segment.rb +6 -5
- data/lib/decode/source.rb +12 -4
- data/lib/decode/syntax/link.rb +9 -1
- data/lib/decode/syntax/match.rb +12 -0
- data/lib/decode/syntax/rewriter.rb +10 -0
- data/lib/decode/trie.rb +27 -22
- data/lib/decode/version.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +9 -10
- metadata.gz.sig +0 -0
@@ -3,44 +3,53 @@
|
|
3
3
|
# Released under the MIT License.
|
4
4
|
# Copyright, 2020-2024, by Samuel Williams.
|
5
5
|
|
6
|
-
require_relative
|
6
|
+
require_relative "../reference"
|
7
7
|
|
8
8
|
module Decode
|
9
9
|
module Language
|
10
10
|
module Ruby
|
11
11
|
# An Ruby-specific reference which can be resolved to zero or more definitions.
|
12
12
|
class Reference < Language::Reference
|
13
|
+
# Create a reference from a constant node.
|
14
|
+
# @parameter node [Prism::Node] The constant node.
|
15
|
+
# @parameter language [Language] The language instance.
|
13
16
|
def self.from_const(node, language)
|
14
17
|
lexical_path = append_const(node)
|
15
18
|
|
16
|
-
return self.new(node.location.
|
19
|
+
return self.new(node.location.slice, language, lexical_path)
|
17
20
|
end
|
18
21
|
|
22
|
+
# Append a constant node to the path.
|
23
|
+
# @parameter node [Prism::Node] The constant node.
|
24
|
+
# @parameter path [Array] The path to append to.
|
19
25
|
def self.append_const(node, path = [])
|
20
|
-
parent, name = node.children
|
21
|
-
|
22
|
-
if parent and parent.type != :cbase
|
23
|
-
append_const(parent, path)
|
24
|
-
end
|
25
|
-
|
26
26
|
case node.type
|
27
|
-
when :
|
28
|
-
|
29
|
-
|
27
|
+
when :constant_read_node
|
28
|
+
path << [nil, node.name.to_s]
|
29
|
+
when :constant_path_node
|
30
|
+
if node.parent
|
31
|
+
append_const(node.parent, path)
|
32
|
+
path << ["::", node.name.to_s]
|
33
|
+
else
|
34
|
+
path << [nil, node.name.to_s]
|
35
|
+
end
|
36
|
+
when :call_node
|
37
|
+
# For call nodes like Tuple(...), treat them as constant references
|
38
|
+
if node.receiver.nil?
|
39
|
+
path << [nil, node.name.to_s]
|
30
40
|
else
|
31
|
-
|
41
|
+
append_const(node.receiver, path)
|
42
|
+
path << [".", node.name.to_s]
|
32
43
|
end
|
33
|
-
when :send
|
34
|
-
path << ['#', name]
|
35
|
-
when :cbase
|
36
|
-
# Ignore.
|
37
44
|
else
|
38
|
-
raise ArgumentError, "Could not determine reference for #{node}!"
|
45
|
+
raise ArgumentError, "Could not determine reference for #{node.type}!"
|
39
46
|
end
|
40
47
|
|
41
48
|
return path
|
42
49
|
end
|
43
50
|
|
51
|
+
# Split a Ruby identifier into prefix and name components.
|
52
|
+
# @parameter text [String] The text to split.
|
44
53
|
def split(text)
|
45
54
|
text.scan(/(::|\.|#|:)?([^:.#]+)/)
|
46
55
|
end
|
@@ -3,31 +3,38 @@
|
|
3
3
|
# Released under the MIT License.
|
4
4
|
# Copyright, 2020-2024, by Samuel Williams.
|
5
5
|
|
6
|
-
require_relative
|
6
|
+
require_relative "../../segment"
|
7
7
|
|
8
8
|
module Decode
|
9
9
|
module Language
|
10
10
|
module Ruby
|
11
11
|
# A Ruby specific code segment.
|
12
12
|
class Segment < Decode::Segment
|
13
|
+
# Initialize a new Ruby segment.
|
14
|
+
# @parameter comments [Array(String)] The comments for this segment.
|
15
|
+
# @parameter language [Language] The language instance.
|
16
|
+
# @parameter node [Prism::Node] The syntax tree node.
|
17
|
+
# @parameter options [Hash] Additional options.
|
13
18
|
def initialize(comments, language, node, **options)
|
14
19
|
super(comments, language, **options)
|
15
20
|
|
16
21
|
@node = node
|
17
|
-
@expression = node.location
|
22
|
+
@expression = node.location
|
18
23
|
end
|
19
24
|
|
20
25
|
# The parser syntax tree node.
|
21
26
|
attr :node
|
22
27
|
|
28
|
+
# Expand the segment to include another node.
|
29
|
+
# @parameter node [Prism::Node] The node to include.
|
23
30
|
def expand(node)
|
24
|
-
@expression = @expression.join(node.location
|
31
|
+
@expression = @expression.join(node.location)
|
25
32
|
end
|
26
33
|
|
27
34
|
# The source code trailing the comments.
|
28
35
|
# @returns [String | nil]
|
29
36
|
def code
|
30
|
-
@expression.
|
37
|
+
@expression.slice
|
31
38
|
end
|
32
39
|
end
|
33
40
|
end
|
data/lib/decode/language/ruby.rb
CHANGED
@@ -3,12 +3,14 @@
|
|
3
3
|
# Released under the MIT License.
|
4
4
|
# Copyright, 2020-2024, by Samuel Williams.
|
5
5
|
|
6
|
-
require_relative
|
6
|
+
require_relative "ruby/generic"
|
7
7
|
|
8
8
|
module Decode
|
9
9
|
module Language
|
10
|
-
#
|
10
|
+
# Represents an interface for extracting information from Ruby source code.
|
11
11
|
module Ruby
|
12
|
+
# Create a new Ruby language instance.
|
13
|
+
# @returns [Ruby::Generic] A configured Ruby language parser.
|
12
14
|
def self.new
|
13
15
|
Generic.new("ruby")
|
14
16
|
end
|
data/lib/decode/language.rb
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
# Released under the MIT License.
|
4
4
|
# Copyright, 2020-2024, by Samuel Williams.
|
5
5
|
|
6
|
-
require_relative
|
7
|
-
require_relative
|
6
|
+
require_relative "language/generic"
|
7
|
+
require_relative "language/ruby"
|
8
8
|
|
9
9
|
module Decode
|
10
10
|
# Language specific parsers and definitions.
|
data/lib/decode/languages.rb
CHANGED
@@ -3,23 +3,27 @@
|
|
3
3
|
# Released under the MIT License.
|
4
4
|
# Copyright, 2020-2024, by Samuel Williams.
|
5
5
|
|
6
|
-
require_relative
|
7
|
-
require_relative
|
6
|
+
require_relative "language/generic"
|
7
|
+
require_relative "language/ruby"
|
8
8
|
|
9
9
|
module Decode
|
10
|
-
#
|
10
|
+
# Represents a context for looking up languages based on file extension or name.
|
11
11
|
class Languages
|
12
|
+
# Create a new languages context with all supported languages.
|
13
|
+
# @returns [Languages] A languages context with Ruby support enabled.
|
12
14
|
def self.all
|
13
15
|
self.new.tap do |languages|
|
14
16
|
languages.add(Language::Ruby.new)
|
15
17
|
end
|
16
18
|
end
|
17
19
|
|
20
|
+
# Initialize a new languages context.
|
18
21
|
def initialize
|
19
22
|
@named = {}
|
20
23
|
@extensions = {}
|
21
24
|
end
|
22
25
|
|
26
|
+
# Freeze the languages context to prevent further modifications.
|
23
27
|
def freeze
|
24
28
|
return unless frozen?
|
25
29
|
|
@@ -29,16 +33,23 @@ module Decode
|
|
29
33
|
super
|
30
34
|
end
|
31
35
|
|
36
|
+
# Add a language to this context.
|
37
|
+
# @parameter language [Language::Generic] The language to add.
|
32
38
|
def add(language)
|
39
|
+
# Register by name:
|
33
40
|
language.names.each do |name|
|
34
41
|
@named[name] = language
|
35
42
|
end
|
36
43
|
|
44
|
+
# Register by file extension:
|
37
45
|
language.extensions.each do |extension|
|
38
46
|
@extensions[extension] = language
|
39
47
|
end
|
40
48
|
end
|
41
49
|
|
50
|
+
# Fetch a language by name, creating a generic language if needed.
|
51
|
+
# @parameter name [String] The name of the language to fetch.
|
52
|
+
# @returns [Language::Generic] The language instance for the given name.
|
42
53
|
def fetch(name)
|
43
54
|
@named.fetch(name) do
|
44
55
|
unless @named.frozen?
|
@@ -47,6 +58,9 @@ module Decode
|
|
47
58
|
end
|
48
59
|
end
|
49
60
|
|
61
|
+
# Create a source object for the given file path.
|
62
|
+
# @parameter path [String] The file system path to create a source for.
|
63
|
+
# @returns [Source | Nil] A source object if the file extension is supported, nil otherwise.
|
50
64
|
def source_for(path)
|
51
65
|
extension = File.extname(path)
|
52
66
|
|
@@ -57,9 +71,10 @@ module Decode
|
|
57
71
|
|
58
72
|
REFERENCE = /\A(?<name>[a-z]+)?\s+(?<identifier>.*?)\z/
|
59
73
|
|
60
|
-
# Parse a language agnostic reference
|
61
|
-
# e.g
|
62
|
-
#
|
74
|
+
# Parse a language agnostic reference.
|
75
|
+
# @parameter text [String] The text to parse (e.g., "ruby MyModule::MyClass").
|
76
|
+
# @parameter default_language [Language::Generic] The default language to use if none specified.
|
77
|
+
# @returns [Language::Reference | Nil] The parsed reference, or nil if parsing fails.
|
63
78
|
def parse_reference(text, default_language: nil)
|
64
79
|
if match = REFERENCE.match(text)
|
65
80
|
language = self.fetch(match[:name]) || default_language
|
@@ -70,6 +85,10 @@ module Decode
|
|
70
85
|
end
|
71
86
|
end
|
72
87
|
|
88
|
+
# Create a reference for the given language and identifier.
|
89
|
+
# @parameter name [String] The name of the language.
|
90
|
+
# @parameter identifier [String] The identifier to create a reference for.
|
91
|
+
# @returns [Language::Reference] The created reference.
|
73
92
|
def reference_for(name, identifier)
|
74
93
|
self.fetch(name).reference_for(identifier)
|
75
94
|
end
|
data/lib/decode/location.rb
CHANGED
data/lib/decode/scope.rb
CHANGED
data/lib/decode/segment.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
# Released under the MIT License.
|
4
4
|
# Copyright, 2020-2024, by Samuel Williams.
|
5
5
|
|
6
|
-
require_relative
|
6
|
+
require_relative "documentation"
|
7
7
|
|
8
8
|
module Decode
|
9
9
|
# A chunk of code with an optional preceeding comment block.
|
@@ -14,17 +14,18 @@ module Decode
|
|
14
14
|
# ~~~
|
15
15
|
#
|
16
16
|
class Segment
|
17
|
+
# Initialize a new segment.
|
18
|
+
# @parameter comments [Array(String)] The preceeding comments.
|
19
|
+
# @parameter language [Language::Generic] The language of the code.
|
17
20
|
def initialize(comments, language)
|
18
21
|
@comments = comments
|
19
22
|
@language = language
|
20
23
|
end
|
21
24
|
|
22
|
-
# The preceeding comments.
|
23
|
-
# @attribute [Array(String)]
|
25
|
+
# @attribute [Array(String)] The preceeding comments.
|
24
26
|
attr :comments
|
25
27
|
|
26
|
-
# The language of the code attached to this segment.
|
27
|
-
# @attribute [Language::Generic]
|
28
|
+
# @attribute [Language::Generic] The language of the code attached to this segment.
|
28
29
|
attr :language
|
29
30
|
|
30
31
|
# An interface for accsssing the documentation of the definition.
|
data/lib/decode/source.rb
CHANGED
@@ -3,11 +3,14 @@
|
|
3
3
|
# Released under the MIT License.
|
4
4
|
# Copyright, 2020-2024, by Samuel Williams.
|
5
5
|
|
6
|
-
require_relative
|
6
|
+
require_relative "language"
|
7
7
|
|
8
8
|
module Decode
|
9
9
|
# Represents a source file in a specific language.
|
10
10
|
class Source
|
11
|
+
# Initialize a new source file.
|
12
|
+
# @parameter path [String] The file-system path to the source file.
|
13
|
+
# @parameter language [Language::Generic] The language parser to use.
|
11
14
|
def initialize(path, language)
|
12
15
|
@path = path
|
13
16
|
@buffer = nil
|
@@ -15,10 +18,11 @@ module Decode
|
|
15
18
|
end
|
16
19
|
|
17
20
|
# The path of the source file.
|
18
|
-
# @attribute [String] A file-system path.
|
21
|
+
# @attribute [String] A file-system path to the source file.
|
19
22
|
attr :path
|
20
23
|
|
21
24
|
# The relative path of the source, if it is known.
|
25
|
+
# @returns [String] The relative path or the full path if relative path is unknown.
|
22
26
|
def relative_path
|
23
27
|
if @path.respond_to?(:relative_path)
|
24
28
|
@path.relative_path
|
@@ -28,11 +32,11 @@ module Decode
|
|
28
32
|
end
|
29
33
|
|
30
34
|
# The language of the source file.
|
31
|
-
# @attribute [Language::Generic]
|
35
|
+
# @attribute [Language::Generic] The language parser for this source.
|
32
36
|
attr :language
|
33
37
|
|
34
38
|
# Read the source file into an internal buffer/cache.
|
35
|
-
# @returns [String]
|
39
|
+
# @returns [String] The contents of the source file.
|
36
40
|
def read
|
37
41
|
@buffer ||= File.read(@path).freeze
|
38
42
|
end
|
@@ -57,6 +61,10 @@ module Decode
|
|
57
61
|
@language.segments_for(self, &block)
|
58
62
|
end
|
59
63
|
|
64
|
+
# Generate code representation with optional index for link resolution.
|
65
|
+
# @parameter index [Index] Optional index for resolving links.
|
66
|
+
# @parameter relative_to [Definition] Optional definition to resolve relative references.
|
67
|
+
# @returns [String] The formatted code representation.
|
60
68
|
def code(index = nil, relative_to: nil)
|
61
69
|
@language.code_for(self.read, index, relative_to: relative_to)
|
62
70
|
end
|
data/lib/decode/syntax/link.rb
CHANGED
@@ -3,11 +3,16 @@
|
|
3
3
|
# Released under the MIT License.
|
4
4
|
# Copyright, 2020-2024, by Samuel Williams.
|
5
5
|
|
6
|
-
require_relative
|
6
|
+
require_relative "match"
|
7
7
|
|
8
8
|
module Decode
|
9
|
+
# Provides syntax rewriting and linking functionality.
|
9
10
|
module Syntax
|
11
|
+
# Represents a link to a definition in the documentation.
|
10
12
|
class Link < Match
|
13
|
+
# Initialize a new link.
|
14
|
+
# @parameter range [Range] The range of text to link.
|
15
|
+
# @parameter definition [Definition] The definition to link to.
|
11
16
|
def initialize(range, definition)
|
12
17
|
@definition = definition
|
13
18
|
|
@@ -16,6 +21,9 @@ module Decode
|
|
16
21
|
|
17
22
|
attr :definition
|
18
23
|
|
24
|
+
# Apply the link to the output.
|
25
|
+
# @parameter output [String] The output to append to.
|
26
|
+
# @parameter rewriter [Rewriter] The rewriter instance.
|
19
27
|
def apply(output, rewriter)
|
20
28
|
output << rewriter.link_to(
|
21
29
|
@definition,
|
data/lib/decode/syntax/match.rb
CHANGED
@@ -5,29 +5,41 @@
|
|
5
5
|
|
6
6
|
module Decode
|
7
7
|
module Syntax
|
8
|
+
# Represents a match in the source text for syntax rewriting.
|
8
9
|
class Match
|
10
|
+
# Initialize a new match.
|
11
|
+
# @parameter range [Range] The range of text this match covers.
|
9
12
|
def initialize(range)
|
10
13
|
@range = range
|
11
14
|
end
|
12
15
|
|
13
16
|
attr :range
|
14
17
|
|
18
|
+
# Apply the match to extract text from source.
|
19
|
+
# @parameter source [String] The source text.
|
15
20
|
def apply(source)
|
16
21
|
return source[range]
|
17
22
|
end
|
18
23
|
|
24
|
+
# Compare matches by their starting position.
|
25
|
+
# @parameter other [Match] The other match to compare.
|
19
26
|
def <=> other
|
20
27
|
@range.min <=> other.range.min
|
21
28
|
end
|
22
29
|
|
30
|
+
# Get the starting offset of this match.
|
23
31
|
def offset
|
24
32
|
@range.min
|
25
33
|
end
|
26
34
|
|
35
|
+
# Get the size of this match.
|
27
36
|
def size
|
28
37
|
@range.size
|
29
38
|
end
|
30
39
|
|
40
|
+
# Apply the match to the output.
|
41
|
+
# @parameter output [String] The output to append to.
|
42
|
+
# @parameter rewriter [Rewriter] The rewriter instance.
|
31
43
|
def apply(output, rewriter)
|
32
44
|
output << rewriter.text_for(@range)
|
33
45
|
|
@@ -5,7 +5,10 @@
|
|
5
5
|
|
6
6
|
module Decode
|
7
7
|
module Syntax
|
8
|
+
# Provides text rewriting functionality with match-based substitutions.
|
8
9
|
class Rewriter
|
10
|
+
# Initialize a new rewriter.
|
11
|
+
# @parameter text [String] The text to rewrite.
|
9
12
|
def initialize(text)
|
10
13
|
@text = text
|
11
14
|
@matches = []
|
@@ -15,6 +18,8 @@ module Decode
|
|
15
18
|
|
16
19
|
attr :matches
|
17
20
|
|
21
|
+
# Add a match to the rewriter.
|
22
|
+
# @parameter match [Match] The match to add.
|
18
23
|
def << match
|
19
24
|
@matches << match
|
20
25
|
end
|
@@ -24,6 +29,8 @@ module Decode
|
|
24
29
|
@text[range]
|
25
30
|
end
|
26
31
|
|
32
|
+
# Apply all matches to generate the rewritten output.
|
33
|
+
# @parameter output [Array] The output array to append to.
|
27
34
|
def apply(output = [])
|
28
35
|
offset = 0
|
29
36
|
|
@@ -47,6 +54,9 @@ module Decode
|
|
47
54
|
return output
|
48
55
|
end
|
49
56
|
|
57
|
+
# Generate a link to a definition.
|
58
|
+
# @parameter definition [Definition] The definition to link to.
|
59
|
+
# @parameter text [String] The text to display for the link.
|
50
60
|
def link_to(definition, text)
|
51
61
|
"[#{text}]"
|
52
62
|
end
|
data/lib/decode/trie.rb
CHANGED
@@ -3,36 +3,40 @@
|
|
3
3
|
# Released under the MIT License.
|
4
4
|
# Copyright, 2020-2024, by Samuel Williams.
|
5
5
|
|
6
|
-
require_relative
|
6
|
+
require_relative "source"
|
7
7
|
|
8
8
|
module Decode
|
9
|
-
#
|
9
|
+
# Represents a prefix-trie data structure for fast lexical lookups.
|
10
10
|
class Trie
|
11
|
-
#
|
11
|
+
# Represents a single node in the trie.
|
12
12
|
class Node
|
13
|
+
# Initialize a new trie node.
|
13
14
|
def initialize
|
14
15
|
@values = nil
|
15
16
|
@children = Hash.new
|
16
17
|
end
|
17
18
|
|
19
|
+
# Generate a string representation of this node.
|
20
|
+
# @returns [String] A formatted string showing the number of children.
|
18
21
|
def inspect
|
19
22
|
"#<#{self.class} #{@children.size} children>"
|
20
23
|
end
|
21
24
|
|
25
|
+
# Generate a string representation of the node.
|
22
26
|
alias to_s inspect
|
23
27
|
|
24
28
|
# A mutable array of all values that terminate at this node.
|
25
|
-
# @attribute [Array]
|
29
|
+
# @attribute [Array | Nil] The values stored at this node, or nil if no values.
|
26
30
|
attr_accessor :values
|
27
31
|
|
28
32
|
# A hash table of all children nodes, indexed by name.
|
29
|
-
# @attribute [Hash(String, Node)]
|
33
|
+
# @attribute [Hash(String, Node)] Child nodes indexed by their path component.
|
30
34
|
attr :children
|
31
35
|
|
32
36
|
# Look up a lexical path starting at this node.
|
33
|
-
#
|
34
37
|
# @parameter path [Array(String)] The path to resolve.
|
35
|
-
# @
|
38
|
+
# @parameter index [Integer] The current index in the path (used for recursion).
|
39
|
+
# @returns [Node | Nil] The node at the specified path, or nil if not found.
|
36
40
|
def lookup(path, index = 0)
|
37
41
|
if index < path.size
|
38
42
|
if child = @children[path[index]]
|
@@ -45,13 +49,11 @@ module Decode
|
|
45
49
|
|
46
50
|
# Traverse the trie from this node.
|
47
51
|
# Invoke `descend.call` to traverse the children of the current node.
|
48
|
-
#
|
49
52
|
# @parameter path [Array(String)] The current lexical path.
|
50
|
-
#
|
51
|
-
#
|
52
|
-
#
|
53
|
-
#
|
54
|
-
# @yield descend [Proc] The recursive method for traversing children.
|
53
|
+
# @yields {|path, node, descend| ...} Called for each node during traversal.
|
54
|
+
# @parameter path [Array(String)] The current lexical path.
|
55
|
+
# @parameter node [Node] The current node which is being traversed.
|
56
|
+
# @parameter descend [Proc] The recursive method for traversing children.
|
55
57
|
def traverse(path = [], &block)
|
56
58
|
yield(path, self, ->{
|
57
59
|
@children.each do |name, node|
|
@@ -67,35 +69,36 @@ module Decode
|
|
67
69
|
end
|
68
70
|
|
69
71
|
# The root of the trie.
|
70
|
-
# @attribute [Node]
|
72
|
+
# @attribute [Node] The root node of the trie structure.
|
71
73
|
attr :root
|
72
74
|
|
73
75
|
# Insert the specified value at the given path into the trie.
|
74
76
|
# @parameter path [Array(String)] The lexical path where the value will be inserted.
|
75
|
-
# @parameter value [Object] The value to insert.
|
77
|
+
# @parameter value [Object] The value to insert at the specified path.
|
76
78
|
def insert(path, value)
|
77
79
|
node = @root
|
78
80
|
|
81
|
+
# Navigate to the target node, creating nodes as needed:
|
79
82
|
path.each do |key|
|
80
83
|
node = (node.children[key] ||= Node.new)
|
81
84
|
end
|
82
85
|
|
86
|
+
# Add the value to the target node:
|
83
87
|
(node.values ||= []) << value
|
84
88
|
end
|
85
89
|
|
86
90
|
# Lookup the values at the specified path.
|
87
|
-
#
|
88
91
|
# @parameter path [Array(String)] The lexical path which contains the values.
|
89
|
-
# @returns [
|
92
|
+
# @returns [Node | Nil] The node at the specified path, or nil if not found.
|
90
93
|
def lookup(path)
|
91
94
|
@root.lookup(path)
|
92
95
|
end
|
93
96
|
|
94
97
|
# Enumerate all lexical scopes under the specified path.
|
95
|
-
#
|
96
|
-
# @
|
97
|
-
#
|
98
|
-
#
|
98
|
+
# @parameter path [Array(String)] The starting path to enumerate from.
|
99
|
+
# @yields {|path, values| ...} Called for each path with values.
|
100
|
+
# @parameter path [Array(String)] The lexical path.
|
101
|
+
# @parameter values [Array(Object) | Nil] The values that exist at the given path.
|
99
102
|
def each(path = [], &block)
|
100
103
|
if node = @root.lookup(path)
|
101
104
|
node.traverse do |path, node, descend|
|
@@ -106,8 +109,10 @@ module Decode
|
|
106
109
|
end
|
107
110
|
end
|
108
111
|
|
109
|
-
# Traverse the trie.
|
112
|
+
# Traverse the trie starting from the specified path.
|
110
113
|
# See {Node#traverse} for details.
|
114
|
+
# @parameter path [Array(String)] The starting path to traverse from.
|
115
|
+
# @yields {|path, node, descend| ...} Called for each node during traversal.
|
111
116
|
def traverse(path = [], &block)
|
112
117
|
if node = @root.lookup(path)
|
113
118
|
node.traverse(&block)
|
data/lib/decode/version.rb
CHANGED
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: decode
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.23.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
8
|
-
autorequire:
|
9
8
|
bindir: bin
|
10
9
|
cert_chain:
|
11
10
|
- |
|
@@ -37,10 +36,10 @@ cert_chain:
|
|
37
36
|
Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
|
38
37
|
voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
|
39
38
|
-----END CERTIFICATE-----
|
40
|
-
date:
|
39
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
41
40
|
dependencies:
|
42
41
|
- !ruby/object:Gem::Dependency
|
43
|
-
name:
|
42
|
+
name: prism
|
44
43
|
requirement: !ruby/object:Gem::Requirement
|
45
44
|
requirements:
|
46
45
|
- - ">="
|
@@ -53,13 +52,14 @@ dependencies:
|
|
53
52
|
- - ">="
|
54
53
|
- !ruby/object:Gem::Version
|
55
54
|
version: '0'
|
56
|
-
description:
|
57
|
-
email:
|
58
55
|
executables: []
|
59
56
|
extensions: []
|
60
57
|
extra_rdoc_files: []
|
61
58
|
files:
|
62
59
|
- bake/decode/index.rb
|
60
|
+
- context/coverage.md
|
61
|
+
- context/getting-started.md
|
62
|
+
- context/ruby-documentation.md
|
63
63
|
- lib/decode.rb
|
64
64
|
- lib/decode/comment/attribute.rb
|
65
65
|
- lib/decode/comment/node.rb
|
@@ -80,6 +80,7 @@ files:
|
|
80
80
|
- lib/decode/language/generic.rb
|
81
81
|
- lib/decode/language/reference.rb
|
82
82
|
- lib/decode/language/ruby.rb
|
83
|
+
- lib/decode/language/ruby/alias.rb
|
83
84
|
- lib/decode/language/ruby/attribute.rb
|
84
85
|
- lib/decode/language/ruby/block.rb
|
85
86
|
- lib/decode/language/ruby/call.rb
|
@@ -113,7 +114,6 @@ metadata:
|
|
113
114
|
documentation_uri: https://ioquatix.github.io/decode/
|
114
115
|
funding_uri: https://github.com/sponsors/ioquatix/
|
115
116
|
source_code_uri: https://github.com/ioquatix/decode.git
|
116
|
-
post_install_message:
|
117
117
|
rdoc_options: []
|
118
118
|
require_paths:
|
119
119
|
- lib
|
@@ -121,15 +121,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
121
121
|
requirements:
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: '3.
|
124
|
+
version: '3.2'
|
125
125
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
126
|
requirements:
|
127
127
|
- - ">="
|
128
128
|
- !ruby/object:Gem::Version
|
129
129
|
version: '0'
|
130
130
|
requirements: []
|
131
|
-
rubygems_version: 3.
|
132
|
-
signing_key:
|
131
|
+
rubygems_version: 3.6.7
|
133
132
|
specification_version: 4
|
134
133
|
summary: Code analysis for documentation generation.
|
135
134
|
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|