decode 0.15.2 → 0.17.0

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: 1e996212bd910f20ac9875edc81588dc35294a4b33069e64b2bda61e754be1a9
4
- data.tar.gz: f8e78b386f4f2a9cf25267c0d62d90985f50ae8842520f478ed7766044cd6d35
3
+ metadata.gz: 46261946c303174f919739a47b679548956f72cac96129fc3a3244c45e20e5f9
4
+ data.tar.gz: 4a42af06139fb8fcfeb0acfa827e3f7750c0615bdf1fab3da307fc542d3955b0
5
5
  SHA512:
6
- metadata.gz: 7dbaf3a9f15060fb40f718271c235a01bec1488954030e3130cd78d56e7f6fc42494c47c757617707bdf0c43714fc365bd69a22493e9e95f6c9265c6b2a91b0a
7
- data.tar.gz: d0f80917980849a694ade904566a1c89cebd76db7ca5d5267e311f221cf5295ddc9dad8a511b9146bbaeb194050c33a00fa8c03f875904a400a2b9b00f014df4
6
+ metadata.gz: 781d7182b8ab6cfbfd6cace3a8afb19bf2ccad79693e3cba410cd85806c003c71f07386255af6f321403a75d5675d230b0c2d0a2881c7f3f519740e89b1908d6
7
+ data.tar.gz: bdf5446b31e7439a058d1459318ff0fbbab5de576df0ca2ead53d7b2d2ab320265745984389cc66fcdef87ae7cce8e3f08c936bcdbf2edacf0f6d70b5690fa6d
@@ -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
@@ -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
@@ -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
@@ -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.2"
22
+ VERSION = "0.17.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.2
4
+ version: 0.17.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-07-07 00:00:00.000000000 Z
11
+ date: 2021-07-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parser
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: covered
42
+ name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: bundler
56
+ name: covered
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -82,7 +82,6 @@ dependencies:
82
82
  version: '0'
83
83
  description:
84
84
  email:
85
- - samuel.williams@oriontransfer.co.nz
86
85
  executables: []
87
86
  extensions: []
88
87
  extra_rdoc_files: []
@@ -115,6 +114,7 @@ files:
115
114
  - lib/decode/language/ruby/constant.rb
116
115
  - lib/decode/language/ruby/definition.rb
117
116
  - lib/decode/language/ruby/function.rb
117
+ - lib/decode/language/ruby/generic.rb
118
118
  - lib/decode/language/ruby/method.rb
119
119
  - lib/decode/language/ruby/module.rb
120
120
  - lib/decode/language/ruby/parser.rb
@@ -132,14 +132,15 @@ files:
132
132
  homepage: https://github.com/ioquatix/decode
133
133
  licenses:
134
134
  - MIT
135
- metadata: {}
135
+ metadata:
136
+ funding_uri: https://github.com/sponsors/ioquatix/
136
137
  post_install_message:
137
138
  rdoc_options: []
138
139
  require_paths:
139
140
  - lib
140
141
  required_ruby_version: !ruby/object:Gem::Requirement
141
142
  requirements:
142
- - - "~>"
143
+ - - ">="
143
144
  - !ruby/object:Gem::Version
144
145
  version: '2.5'
145
146
  required_rubygems_version: !ruby/object:Gem::Requirement
@@ -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.1.2
152
+ rubygems_version: 3.2.22
152
153
  signing_key:
153
154
  specification_version: 4
154
155
  summary: Code analysis for documentation generation.