rdoc-markdown 0.9.0 → 0.10.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: 56a6f33ad7581c2e300d358c58f4537c6154d064495600ea9bd1270116408073
4
- data.tar.gz: 1a72d5f06233b6264138f9452a494cdada10e99dad50104c4c73473e450e347b
3
+ metadata.gz: a3af6b5292a9333e8e0749195f1b799f80015a2b23bc7c8bd47068f315671d5c
4
+ data.tar.gz: 759122408198407ee3f300ee7effa75e4f7d02cf765a989f30db4ee1d79b4fa9
5
5
  SHA512:
6
- metadata.gz: 2abde2f7a06a945237f594f4bdb32c7103c51f7c3779b57e754f9cb58cca0c88252984547908ed6e201f3caacdf9e56e2d438602b8f6eee7beb8135754d4e563
7
- data.tar.gz: a37cc849f3844ba85037b866939b0d3f1000293fa2c7c693745f99ba654244a4cbb1610fc8c0c804413a202a2a25d367dfd8954bb2178f03eb089560862783e9
6
+ metadata.gz: e259a75c590f3414e036763c213a3b19e8df9d78a964155ba20ebb6b5ec440b25cca3b4a925fc39181100267079cd89e30db711aabb087b34245b72dc3ca9873
7
+ data.tar.gz: e70488f82388bdbb6e1bd8a99e32864da66c86adf2e8cf58f2ee3775523a9283002b30aa31f8a8d080cc70812d6efcee5300bffb665b4bf432b2fd8643db5a86
data/Appraisals ADDED
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ appraise "rdoc_7" do
4
+ gem "rdoc", "~> 7.0"
5
+ end
6
+
7
+ appraise "rdoc_8" do
8
+ gem "rdoc", "~> 8.0"
9
+ end
10
+
11
+ appraise "rdoc_head" do
12
+ gem "rdoc", git: "https://github.com/ruby/rdoc.git", branch: "master"
13
+ end
data/CHANGELOG.md CHANGED
@@ -2,6 +2,19 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.10.0
6
+
7
+ - Reworked RDoc 8 support
8
+
9
+ ## 0.9.0
10
+
11
+ ### Fixed
12
+ - Render RDoc 8 inline and sidecar RBS signatures in Markdown method headings.
13
+ - Resolve explicit relative `.rbs` inputs against the directory where RDoc started, not the output directory.
14
+
15
+ ### Changed
16
+ - Run CI against both RDoc 7 and RDoc 8 dependency sets.
17
+
5
18
  ## 0.8.0
6
19
 
7
20
  ### Added
data/Gemfile CHANGED
@@ -7,6 +7,7 @@ gemspec
7
7
 
8
8
  gem "rake", "~> 13.0"
9
9
 
10
+ gem "appraisal"
10
11
  gem "erb_lint", require: false
11
12
  gem "minitest", "~> 5.0"
12
13
  gem "standard"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rdoc-markdown (0.9.0)
4
+ rdoc-markdown (0.10.0)
5
5
  csv
6
6
  erb
7
7
  rdoc
@@ -29,6 +29,10 @@ GEM
29
29
  securerandom (>= 0.3)
30
30
  tzinfo (~> 2.0, >= 2.0.5)
31
31
  uri (>= 0.13.1)
32
+ appraisal (2.5.0)
33
+ bundler
34
+ rake
35
+ thor (>= 0.14.0)
32
36
  ast (2.4.3)
33
37
  base64 (0.3.0)
34
38
  better_html (2.2.0)
@@ -167,6 +171,7 @@ GEM
167
171
  lint_roller (~> 1.1)
168
172
  rubocop-performance (~> 1.26.0)
169
173
  stringio (3.2.0)
174
+ thor (1.5.0)
170
175
  tsort (0.2.0)
171
176
  tzinfo (2.0.6)
172
177
  concurrent-ruby (~> 1.0)
@@ -188,6 +193,7 @@ PLATFORMS
188
193
  x86_64-linux-gnu
189
194
 
190
195
  DEPENDENCIES
196
+ appraisal
191
197
  bundler (>= 2.0)
192
198
  commonmarker
193
199
  erb_lint
data/Rakefile CHANGED
@@ -21,7 +21,10 @@ task default: [:test]
21
21
  namespace :erb do
22
22
  desc "Lint markdown ERB templates"
23
23
  task :lint do
24
- sh "bundle exec erb_lint --lint-all"
24
+ files = Dir["lib/templates/**/*.{md,markdown}.erb"]
25
+ raise "No markdown ERB templates found" if files.empty?
26
+
27
+ sh "bundle", "exec", "erb_lint", *files
25
28
  end
26
29
  end
27
30
 
@@ -0,0 +1,20 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rake", "~> 13.0"
6
+ gem "appraisal"
7
+ gem "erb_lint", require: false
8
+ gem "minitest", "~> 5.0"
9
+ gem "standard"
10
+ gem "yard-lint"
11
+
12
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("3.3")
13
+ gem "mutant"
14
+ gem "mutant-minitest"
15
+ gem "mutex_m"
16
+ end
17
+
18
+ gem "rdoc", "~> 7.0"
19
+
20
+ gemspec path: "../"
@@ -0,0 +1,20 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rake", "~> 13.0"
6
+ gem "appraisal"
7
+ gem "erb_lint", require: false
8
+ gem "minitest", "~> 5.0"
9
+ gem "standard"
10
+ gem "yard-lint"
11
+
12
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("3.3")
13
+ gem "mutant"
14
+ gem "mutant-minitest"
15
+ gem "mutex_m"
16
+ end
17
+
18
+ gem "rdoc", "~> 8.0"
19
+
20
+ gemspec path: "../"
@@ -1,5 +1,20 @@
1
- # frozen_string_literal: true
1
+ # This file was generated by Appraisal
2
2
 
3
- eval_gemfile "../Gemfile"
3
+ source "https://rubygems.org"
4
+
5
+ gem "rake", "~> 13.0"
6
+ gem "appraisal"
7
+ gem "erb_lint", require: false
8
+ gem "minitest", "~> 5.0"
9
+ gem "standard"
10
+ gem "yard-lint"
11
+
12
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("3.3")
13
+ gem "mutant"
14
+ gem "mutant-minitest"
15
+ gem "mutex_m"
16
+ end
4
17
 
5
18
  gem "rdoc", git: "https://github.com/ruby/rdoc.git", branch: "master"
19
+
20
+ gemspec path: "../"
@@ -5,68 +5,161 @@ class RDoc::Generator::Markdown::RbsSignatureIndex
5
5
  # Builds a signature index from RBS files included in an RDoc run.
6
6
  #
7
7
  # @param files [Array<String>] Input files passed to RDoc.
8
+ # @param base_dir [String, Pathname, nil] Directory where RDoc started.
9
+ # @param store [RDoc::Store, nil] Store containing Ruby code objects and RDoc 8 sidecar signatures.
8
10
  #
9
11
  # @return [RDoc::Generator::Markdown::RbsSignatureIndex] Signature index.
10
- def self.build(files)
12
+ def self.build(files, base_dir = nil, store = nil)
11
13
  rbs_files = files.select { |file| File.extname(file) == ".rbs" }
12
- new(signatures_from(rbs_files))
14
+ new(signatures_from_store(store).merge(signatures_from(rbs_files, base_dir)))
13
15
  end
14
16
 
15
17
  # Builds signatures by reusing RBS's own RDoc parser.
16
18
  #
17
19
  # @param files [Array<String>] RBS files to parse.
20
+ # @param base_dir [String, Pathname, nil] Directory where RDoc started.
18
21
  #
19
- # @return [Hash{Array => String}] Signature lookup keyed by class and method.
20
- def self.signatures_from(files)
22
+ # @return [Hash{Array => Array<String>}] Signature lookup keyed by class and method.
23
+ def self.signatures_from(files, base_dir)
21
24
  files.each_with_object({}) do |file, signatures|
22
- parsed_classes(file).each do |klass|
25
+ parsed_classes(file, base_dir).each do |klass|
23
26
  klass.method_list.each do |method|
24
- add_method_signature(signatures, klass: klass, method: method)
27
+ add_method_signature_lines(signatures, klass: klass, method: method, lines: rbs_signature_lines_from_method(method))
25
28
  end
26
29
  end
27
30
  end
28
31
  end
29
32
 
33
+ # Builds signatures already merged into an RDoc store.
34
+ #
35
+ # @param store [RDoc::Store, nil] Store containing Ruby code objects and RDoc 8 sidecar signatures.
36
+ #
37
+ # @return [Hash{Array => Array<String>}] Signature lookup keyed by class and method.
38
+ def self.signatures_from_store(store)
39
+ return {} unless store
40
+
41
+ store.all_classes_and_modules.each_with_object({}) do |klass, signatures|
42
+ klass.method_list.each do |method|
43
+ add_method_signature_lines(signatures, klass: klass, method: method, lines: store_signature_lines_from_method(method, store))
44
+ end
45
+ end
46
+ end
47
+
30
48
  # Parses one RBS file into RDoc class/module objects.
31
49
  #
32
50
  # @param file [String] RBS file path.
51
+ # @param base_dir [String, Pathname, nil] Directory where RDoc started.
33
52
  #
34
53
  # @return [Array<RDoc::Context>] Classes and modules parsed from RBS.
35
- def self.parsed_classes(file)
54
+ def self.parsed_classes(file, base_dir)
55
+ file_path = rbs_file_path(file, base_dir)
36
56
  store = RDoc::Store.new(RDoc::Options.new)
37
- top_level = store.add_file(file)
38
- parser = RDoc::Parser.for(top_level, File.read(file), store.options, nil)
57
+ top_level = store.add_file(file_path)
58
+ parser = RDoc::Parser.for(top_level, File.read(file_path), store.options, nil)
39
59
  parser.scan
40
60
  store.all_classes_and_modules
41
61
  end
42
62
 
43
- # Adds one RBS-parsed method signature to the lookup.
63
+ # Resolves an RBS file path against the directory RDoc started from.
64
+ # RDoc changes into the output directory before generators run.
65
+ #
66
+ # @param file [String] RBS file path passed to RDoc.
67
+ # @param base_dir [String, Pathname, nil] Directory where RDoc started.
68
+ #
69
+ # @return [String] Absolute or already absolute RBS file path.
70
+ def self.rbs_file_path(file, base_dir)
71
+ Pathname.new(file).expand_path(base_dir).to_s
72
+ end
73
+
74
+ # Adds resolved method signature lines to the lookup.
44
75
  #
45
- # @param signatures [Hash{Array => String}] Signature lookup being populated.
76
+ # @param signatures [Hash{Array => Array<String>}] Signature lookup being populated.
46
77
  # @param klass [RDoc::Context] Method owner.
47
- # @param method [RDoc::AnyMethod] Method parsed by the RBS plugin.
78
+ # @param method [RDoc::AnyMethod] Method object.
79
+ # @param lines [Array<String>] Signature text lines.
48
80
  #
49
81
  # @return [void]
50
- def self.add_method_signature(signatures, klass:, method:)
51
- signatures[[klass.full_name, method.singleton, method.name]] = method.param_seq
82
+ def self.add_method_signature_lines(signatures, klass:, method:, lines:)
83
+ return if lines.empty?
84
+
85
+ signatures[[klass.full_name, method.singleton, method.name]] = lines
52
86
 
53
87
  return unless method.name == "initialize" && !method.singleton
54
88
 
55
- signatures[[klass.full_name, true, "new"]] = method.param_seq
89
+ signatures[[klass.full_name, true, "new"]] = lines
56
90
  end
57
91
 
58
- # @param signatures [Hash{Array => String}] Signature lookup.
92
+ # Extracts explicit RBS method signature lines from RDoc parser output.
93
+ # RDoc 7 exposes parsed RBS signatures through `param_seq`; RDoc 8 stores
94
+ # them as `type_signature_lines`.
95
+ #
96
+ # @param method [RDoc::AnyMethod] Method parsed by RDoc's RBS parser.
97
+ #
98
+ # @return [Array<String>] RBS signature lines.
99
+ def self.rbs_signature_lines_from_method(method)
100
+ lines = method_type_signature_lines(method)
101
+ lines = method.param_seq if lines.empty?
102
+ nonblank_lines(lines)
103
+ end
104
+
105
+ # Extracts RBS method signature lines already merged into a Ruby store.
106
+ # Unlike explicit RBS parser output, ordinary Ruby `param_seq` is not a type
107
+ # signature and must not populate the index.
108
+ #
109
+ # @param method [RDoc::AnyMethod] Method object from the Ruby store.
110
+ # @param store [RDoc::Store] Store with sidecar RBS signatures.
111
+ #
112
+ # @return [Array<String>] RBS signature lines.
113
+ def self.store_signature_lines_from_method(method, store)
114
+ lines = method_type_signature_lines(method)
115
+ lines = store_type_signature_lines(method, store) if lines.empty?
116
+ lines
117
+ end
118
+
119
+ # Extracts RDoc 8 inline type signatures from a method.
120
+ #
121
+ # @param method [RDoc::AnyMethod] Method object.
122
+ #
123
+ # @return [Array<String>] Signature lines.
124
+ def self.method_type_signature_lines(method)
125
+ return [] unless method.respond_to?(:type_signature_lines)
126
+
127
+ nonblank_lines(method.type_signature_lines)
128
+ end
129
+
130
+ # Extracts RDoc 8 sidecar signatures from a store.
131
+ #
132
+ # @param method [RDoc::AnyMethod] Method object.
133
+ # @param store [RDoc::Store, nil] Optional RDoc store with sidecar RBS signatures.
134
+ #
135
+ # @return [Array<String>] Signature lines.
136
+ def self.store_type_signature_lines(method, store)
137
+ return [] unless store.respond_to?(:rbs_signature_for)
138
+
139
+ nonblank_lines(store.rbs_signature_for(method))
140
+ end
141
+
142
+ # Normalizes a signature-line value to non-blank strings.
143
+ #
144
+ # @param lines [Array<String>, String, nil] Signature text lines.
145
+ #
146
+ # @return [Array<String>] Non-blank signature lines.
147
+ def self.nonblank_lines(lines)
148
+ Array(lines).select { |line| line&.match?(/\S/) }
149
+ end
150
+
151
+ # @param signatures [Hash{Array => Array<String>}] Signature lookup.
59
152
  def initialize(signatures)
60
153
  @signatures = signatures
61
154
  end
62
155
 
63
- # Looks up the RBS signature for an RDoc method.
156
+ # Looks up the RBS signature lines for an RDoc method.
64
157
  #
65
158
  # @param method [RDoc::AnyMethod] Method object to render.
66
159
  #
67
- # @return [String, nil] RBS method type string when available.
68
- def signature_for(method)
69
- @signatures[[method.parent.full_name, method.singleton, method.name]]
160
+ # @return [Array<String>] RBS method type lines when available.
161
+ def signature_lines_for(method)
162
+ @signatures.fetch([method.parent.full_name, method.singleton, method.name], [])
70
163
  end
71
164
 
72
165
  # Checks whether any RBS signatures were parsed.
@@ -75,4 +168,16 @@ class RDoc::Generator::Markdown::RbsSignatureIndex
75
168
  def any?
76
169
  @signatures.any?
77
170
  end
171
+
172
+ private_class_method \
173
+ :signatures_from,
174
+ :signatures_from_store,
175
+ :parsed_classes,
176
+ :rbs_file_path,
177
+ :add_method_signature_lines,
178
+ :rbs_signature_lines_from_method,
179
+ :store_signature_lines_from_method,
180
+ :method_type_signature_lines,
181
+ :store_type_signature_lines,
182
+ :nonblank_lines
78
183
  end
@@ -386,13 +386,21 @@ class RDoc::Generator::Markdown
386
386
  #
387
387
  # @return [String] Normalized method signature.
388
388
  def method_signature(method)
389
- signature = @rbs_method_signatures.signature_for(method) || method.param_seq
390
- return "()" unless signature.match?(/\S/)
389
+ signatures = @rbs_method_signatures.signature_lines_for(method)
390
+ signatures = [method.param_seq] if signatures.empty?
391
391
 
392
- signature = signature.gsub("->", " -> ")
393
- signature = signature.gsub(/\s+/, " ").strip
394
- signature = " #{signature}" if signature.start_with?("->")
395
- merge_method_signature_arguments(signature, method.params)
392
+ signatures = signatures.filter_map do |signature|
393
+ next unless signature&.match?(/\S/)
394
+
395
+ signature = signature.gsub("->", " -> ")
396
+ signature = signature.gsub(/\s+/, " ").strip
397
+ signature = " #{signature}" if signature.start_with?("->")
398
+ merge_method_signature_arguments(signature, method.params)
399
+ end
400
+
401
+ return "()" if signatures.empty?
402
+
403
+ signatures.join(" | ")
396
404
  end
397
405
 
398
406
  # Checks whether this documentation set has parsed RBS signatures.
@@ -822,7 +830,7 @@ class RDoc::Generator::Markdown
822
830
  @class_docs_by_object_id = @class_docs.to_h { |doc| [doc.fetch(:klass).object_id, doc] }
823
831
  @classes = @class_docs.map { |doc| doc.fetch(:klass) }
824
832
  @pages = @store.all_files.select(&:text?).select(&:display?).sort_by(&:base_name)
825
- @rbs_method_signatures = RbsSignatureIndex.build(Array(@options.files))
833
+ @rbs_method_signatures = RbsSignatureIndex.build(Array(@options.files), @base_dir, @store)
826
834
 
827
835
  @known_output_paths = Set.new
828
836
  @class_docs.each do |doc|
@@ -5,6 +5,6 @@ module Rdoc
5
5
  # Version namespace for rdoc-markdown.
6
6
  module Markdown
7
7
  # Current gem version.
8
- VERSION = "0.9.0"
8
+ VERSION = "0.10.0"
9
9
  end
10
10
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdoc-markdown
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stanislav (Stas) Katkov
@@ -192,6 +192,7 @@ files:
192
192
  - ".standard.yml"
193
193
  - ".yard-lint.yml"
194
194
  - AGENTS.md
195
+ - Appraisals
195
196
  - CHANGELOG.md
196
197
  - CODE_OF_CONDUCT.md
197
198
  - Gemfile
@@ -216,6 +217,8 @@ files:
216
217
  - example/jekyll-seo-tag/Liquid.md
217
218
  - example/jekyll-seo-tag/Liquid/Tag.md
218
219
  - example/jekyll-seo-tag/index.csv
220
+ - gemfiles/rdoc_7.gemfile
221
+ - gemfiles/rdoc_8.gemfile
219
222
  - gemfiles/rdoc_head.gemfile
220
223
  - lib/markdown.rb
221
224
  - lib/rdoc/discover.rb