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 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: []