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 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
|
# frozen_string_literal: true
include Helpers::ModuleHelper
def init
sections :header, :box_info, :pre_docstring, T('docstring'), :children,
:constant_summary, [T('docstring')], :inherited_constants,
:attribute_summary, [:item_summary], :inherited_attributes,
:method_summary, [:item_summary], :inherited_methods,
:methodmissing, [T('method_details')],
:attribute_details, [T('method_details')],
:method_details_list, [T('method_details')]
end
def pre_docstring
return if object.docstring.blank?
erb(:pre_docstring)
end
def children
@inner = [[:modules, []], [:classes, []]]
object.children.each do |child|
@inner[0][1] << child if child.type == :module
@inner[1][1] << child if child.type == :class
end
@inner.map! {|v| [v[0], run_verifier(v[1].sort_by {|o| o.name.to_s })] }
return if (@inner[0][1].size + @inner[1][1].size) == 0
erb(:children)
end
def methodmissing
mms = object.meths(:inherited => true, :included => true)
@mm = mms.find {|o| o.name == :method_missing && o.scope == :instance }
erb(:methodmissing) if @mm
end
def method_listing(include_specials = true)
return @smeths ||= method_listing.reject {|o| special_method?(o) } unless include_specials
return @meths if defined?(@meths) && @meths
@meths = object.meths(:inherited => false, :included => !options.embed_mixins.empty?)
unless options.embed_mixins.empty?
@meths = @meths.reject {|m| options.embed_mixins_match?(m.namespace) == false }
end
@meths = sort_listing(prune_method_listing(@meths))
@meths
end
def special_method?(meth)
return true if meth.name(true) == '#method_missing'
return true if meth.constructor?
false
end
def attr_listing
return @attrs if defined?(@attrs) && @attrs
@attrs = []
object.inheritance_tree(true).each do |superclass|
next if superclass.is_a?(CodeObjects::Proxy)
next if !options.embed_mixins.empty? &&
!options.embed_mixins_match?(superclass)
[:class, :instance].each do |scope|
superclass.attributes[scope].each do |_name, rw|
attr = prune_method_listing([rw[:read], rw[:write]].compact, false).first
@attrs << attr if attr
end
end
break if options.embed_mixins.empty?
end
@attrs = sort_listing(@attrs)
end
def constant_listing
return @constants if defined?(@constants) && @constants
@constants = object.constants(:included => false, :inherited => false)
@constants += object.cvars
@constants = run_verifier(@constants)
@constants
end
def sort_listing(list)
list.sort_by {|o| [o.scope.to_s, o.name.to_s.downcase] }
end
def inherited_attr_list
object.inheritance_tree(true)[1..-1].each do |superclass|
next if superclass.is_a?(YARD::CodeObjects::Proxy)
next if !options.embed_mixins.empty? && options.embed_mixins_match?(superclass) != false
attribs = superclass.attributes[:instance]
attribs = attribs.select {|name, _rw| object.child(:scope => :instance, :name => name).nil? }
attribs = attribs.sort_by {|args| args.first.to_s }.map {|_n, m| m[:read] || m[:write] }
attribs = prune_method_listing(attribs, false)
yield superclass, attribs unless attribs.empty?
end
end
def inherited_constant_list
object.inheritance_tree(true)[1..-1].each do |superclass|
next if superclass.is_a?(YARD::CodeObjects::Proxy)
next if !options.embed_mixins.empty? && options.embed_mixins_match?(superclass) != false
consts = superclass.constants(:included => false, :inherited => false)
consts = consts.select {|const| object.child(:type => :constant, :name => const.name).nil? }
consts = consts.sort_by {|const| const.name.to_s }
consts = run_verifier(consts)
yield superclass, consts unless consts.empty?
end
end
def docstring_full(obj)
docstring = obj.tags(:overload).size == 1 && obj.docstring.empty? ?
obj.tag(:overload).docstring : obj.docstring
if docstring.summary.empty? && obj.tags(:return).size == 1 && obj.tag(:return).text
docstring = Docstring.new(obj.tag(:return).text.gsub(/\A([a-z])/, &:upcase).strip)
end
docstring
end
def docstring_summary(obj)
docstring_full(obj).summary
end
def groups(list, type = "Method")
groups_data = object.groups
if groups_data
list.each {|m| groups_data |= [m.group] if m.group && owner != m.namespace }
others = list.select {|m| !m.group || !groups_data.include?(m.group) }
groups_data.each do |name|
items = list.select {|m| m.group == name }
yield(items, name) unless items.empty?
end
else
others = []
group_data = {}
list.each do |itm|
if itm.group
(group_data[itm.group] ||= []) << itm
else
others << itm
end
end
group_data.each {|group, items| yield(items, group) unless items.empty? }
end
return if others.empty?
if others.first.respond_to?(:scope)
scopes(others) {|items, scope| yield(items, "#{scope.to_s.capitalize} #{type} Summary") }
else
yield(others, "#{type} Summary")
end
end
def scopes(list)
[:class, :instance].each do |scope|
items = list.select {|m| m.scope == scope }
yield(items, scope) unless items.empty?
end
end
def mixed_into(object)
unless globals.mixed_into
globals.mixed_into = {}
list = run_verifier Registry.all(:class, :module)
list.each {|o| o.mixins.each {|m| (globals.mixed_into[m.path] ||= []) << o } }
end
globals.mixed_into[object.path] || []
end
|