1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
# frozen_string_literal: true
module ViewComponent
class DocsBuilderComponent < Base
class Section < Struct.new(:heading, :methods, :show_types, keyword_init: true)
def initialize(heading: nil, methods: [], show_types: true)
methods.sort_by! { |method| method[:name] }
super
end
end
class MethodDoc < ViewComponent::Base
def initialize(method, section: Section.new(show_types: true))
@method = method
@section = section
end
def show_types?
@section.show_types
end
def deprecated?
@method.tag(:deprecated).present?
end
def suffix
" (Deprecated)" if deprecated?
end
def types
" → [#{@method.tag(:return).types.join(",")}]" if @method.tag(:return)&.types && show_types?
end
def signature_or_name
@method.signature ? @method.signature.gsub("def ", "") : @method.name
end
def separator
@method.sep
end
def docstring
@method.docstring
end
def deprecation_text
@method.tag(:deprecated)&.text
end
def docstring_and_deprecation_text
<<~DOCS.strip
#{docstring}
#{"_#{deprecation_text}_" if deprecated?}
DOCS
end
def call
<<~DOCS.chomp
#{separator}#{signature_or_name}#{types}#{suffix}
#{docstring_and_deprecation_text}
DOCS
end
end
# { heading: String, public_only: Boolean, show_types: Boolean}
def initialize(sections: [])
@sections = sections
end
# deprecation
# return
# only public methods
# sig with types or name
end
end
|