rdoc-markdown 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6f862496849b46537b75b6d25d1e313a830a9aaf535854a5233fad42081b0a0c
4
- data.tar.gz: e7505ea0dadde9f2f6d357d96ce022e9b9cdc3b0a5457a1648a49bffb4c09fd4
3
+ metadata.gz: c3c8efb1f673d2b95ce85319abcf5e35b8cd46d3fa31260dbf2c4082d952556e
4
+ data.tar.gz: da6d4d6a45e85c905c087065ab6ddd235097c75962fd2ee701d576e4f9d44070
5
5
  SHA512:
6
- metadata.gz: d6fb9ba4435a1b7e3ae3d9da59b2102a47574dc8c33570ca807358bec137116b17474a1721277d3ebe5833e1093b016fcc08a1dfd24d93f71f12b785382259ca
7
- data.tar.gz: 3f25a645ec86e266b05fc0b934e2aa82f088011a6bf9906b881c796eff4c86684fafe05da70259fbdeb0c0221a2bfaf28262a867a292d58add5f1b4ca329bf5a
6
+ metadata.gz: 1914a8ec4a9a6bdc749f997eb6ac39bd418333aeabe12102f6933c95a3909961ec3a1aa8e54c7fbb0315cb4d7f76ec2eb70f5bef452dc547f0dc6ba2fd4b725c
7
+ data.tar.gz: 8db50c4acd4fce77dd8c3b52516fe2db549acbdb18481bb8caa3c2ee94091caed11236d99898aaa7f19b9c4813a6a48a1839bd86abc6a370a767f4c96fb76d0b
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.23.0
4
+
5
+ - Show optional argument defaults in method headings.
6
+ - Preserve Ruby expressions in optional argument defaults.
7
+
3
8
  ## 0.22.0
4
9
 
5
10
  - BREAKING: Use Ruby notation in search-index names: `Duck.MAX_VELOCITY` becomes `Duck::MAX_VELOCITY`, and instance attributes use `Class#attr` instead of `Class.attr`. Consumers matching index names must update these lookups. Class-level attributes retain `Class.attr`; document paths and anchors are unchanged.
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "prism"
4
+
3
5
  # Normalizes RDoc and RBS method signatures for headings.
4
6
  module RDoc::Generator::Markdown::Signatures
5
7
  # Signature opening delimiters and their matching closers.
@@ -15,18 +17,17 @@ module RDoc::Generator::Markdown::Signatures
15
17
  # @return [String] Complete signature including the method name or documented receiver.
16
18
  def self.render_method_signature(method, store)
17
19
  name = method.name
18
- signatures = method.type_signature_lines || store.rbs_signature_for(method)
19
- if !signatures && ["[]", "[]="].include?(name) && (call_seq = method.call_seq)
20
+ type_signatures = method.type_signature_lines || store.rbs_signature_for(method)
21
+ if !type_signatures && ["[]", "[]="].include?(name) && (call_seq = method.call_seq)
20
22
  return call_seq.lines.map { |line| normalize_signature(line) }.join(" | ")
21
23
  end
22
- signatures ||= [method.param_seq]
24
+ params = method.params
23
25
 
24
- signatures = signatures.filter_map do |signature|
26
+ signatures = (type_signatures || [method.param_seq]).filter_map do |signature|
25
27
  next unless signature&.match?(/\S/)
26
28
 
27
- signature = normalize_signature(signature)
28
- signature = " #{signature}" if signature.start_with?("->")
29
- merge_method_signature_arguments(signature, method.params)
29
+ signature = merge_method_signature_arguments(signature, params)
30
+ type_signatures ? signature : restore_method_parameter_defaults(signature, params)
30
31
  end
31
32
 
32
33
  "#{name}#{signatures.empty? ? "()" : signatures.join(" | ")}"
@@ -41,13 +42,43 @@ module RDoc::Generator::Markdown::Signatures
41
42
  signature.gsub("->", " -> ").gsub(/\s+/, " ").strip
42
43
  end
43
44
 
44
- # Merges RDoc parameter names into a type-only signature.
45
+ # Restores source defaults for bare argument names in an untyped call sequence.
46
+ #
47
+ # @param signature [String] Normalized call sequence without the method name.
48
+ # @param raw_params [String, nil] Method parameter list from RDoc.
49
+ # @return [String] Signature with matching source default expressions preserved.
50
+ def self.restore_method_parameter_defaults(signature, raw_params)
51
+ signature_args, signature_suffix = split_signature_arguments_and_suffix(signature)
52
+ source_params = ruby_parameters(raw_params)
53
+ documented_params = ruby_parameters(signature_args)
54
+ return signature unless source_params && documented_params
55
+
56
+ defaults = source_params.optionals.to_h { |param| [param.name.to_s, param.slice] }
57
+ signature_parts = documented_params.compact_child_nodes.map(&:slice)
58
+ default_parts = signature_parts.map { |part| defaults.fetch(part, part) }
59
+ return signature if default_parts == signature_parts
60
+
61
+ "(#{default_parts.join(", ")})#{signature_suffix}"
62
+ end
63
+
64
+ # Parses Ruby parameter boundaries without evaluating or rewriting default expressions.
65
+ #
66
+ # @param params [String, nil] Parenthesized or bare Ruby parameters.
67
+ # @return [Prism::ParametersNode, nil] Parameters, or nil for empty or invalid syntax.
68
+ def self.ruby_parameters(params)
69
+ result = Prism.parse("def _ #{params.to_s.lstrip}\nend")
70
+ result.value.statements.body.first.parameters if result.success?
71
+ end
72
+
73
+ # Normalizes a signature and merges RDoc parameter names into type-only arguments.
45
74
  #
46
75
  # @param signature [String] Method signature from RDoc call sequence.
47
76
  # @param raw_params [String, nil] Method parameter list from RDoc.
48
77
  #
49
78
  # @return [String] Signature with names added when safe.
50
79
  def self.merge_method_signature_arguments(signature, raw_params)
80
+ signature = normalize_signature(signature)
81
+ signature = " #{signature}" if signature.start_with?("->")
51
82
  params = raw_params.to_s.strip
52
83
  params = params[1...-1] if params.start_with?("(") && params.end_with?(")")
53
84
 
@@ -106,25 +137,20 @@ module RDoc::Generator::Markdown::Signatures
106
137
  # @return [Array<String>] Signature parts.
107
138
  def self.split_signature_list(list)
108
139
  parts = []
109
- current = +""
140
+ start = 0
110
141
  delimiters = []
111
142
 
112
- list.each_char do |char|
143
+ list.each_char.with_index do |char, index|
113
144
  if char == "," && delimiters.empty?
114
- parts << current.strip
115
- current.clear
116
- else
117
- closing = DELIMITER_PAIRS[char]
118
- if closing
119
- delimiters << closing
120
- elsif char == delimiters.last
121
- delimiters.pop
122
- end
123
- current << char
145
+ parts << list[start...index].strip
146
+ start = index + 1
124
147
  end
148
+ closing = DELIMITER_PAIRS[char]
149
+ delimiters << closing if closing
150
+ delimiters.pop if char == delimiters.last
125
151
  end
126
152
 
127
- parts << current.strip unless current.empty?
153
+ parts << list[start..].strip if start < list.length
128
154
  parts
129
155
  end
130
156
  end
@@ -5,6 +5,6 @@ module Rdoc
5
5
  # @private
6
6
  module Markdown
7
7
  # @private
8
- VERSION = "0.22.0"
8
+ VERSION = "0.23.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.22.0
4
+ version: 0.23.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stanislav (Stas) Katkov