lib/yard/code_objects/namespace_object.rb in yard-0.6.8 vs lib/yard/code_objects/namespace_object.rb in yard-0.7.0

- old
+ new

@@ -1,14 +1,14 @@ module YARD::CodeObjects # A "namespace" is any object that can store other objects within itself. - # The two main Ruby objects that can act as namespaces are modules + # The two main Ruby objects that can act as namespaces are modules # ({ModuleObject}) and classes ({ClassObject}). class NamespaceObject < Base attr_writer :constants, :cvars, :mixins, :child, :meths attr_writer :class_attributes, :instance_attributes attr_writer :included_constants, :included_meths - + # @return [Array<String>] a list of ordered group names inside the namespace # @since 0.6.0 attr_accessor :groups # The list of objects defined in this namespace @@ -16,23 +16,23 @@ attr_reader :children # A hash containing two keys, class and instance, each containing # the attribute name with a { :read, :write } hash for the read and # write objects respectively. - # + # # @example The attributes of an object # >> Registry.at('YARD::Docstring').attributes # => { - # :class => { }, + # :class => { }, # :instance => { # :ref_tags => { - # :read => #<yardoc method YARD::Docstring#ref_tags>, - # :write => nil - # }, + # :read => #<yardoc method YARD::Docstring#ref_tags>, + # :write => nil + # }, # :object => { # :read => #<yardoc method YARD::Docstring#object>, - # :write => #<yardoc method YARD::Docstring#object=> + # :write => #<yardoc method YARD::Docstring#object=> # }, # ... # } # } # @return [Hash] a list of methods @@ -40,19 +40,19 @@ # A hash containing two keys, :class and :instance, each containing # a hash of objects and their alias names. # @return [Hash] a list of methods attr_reader :aliases - + # Class mixins # @return [Array<ModuleObject>] a list of mixins attr_reader :class_mixins - + # Instance mixins # @return [Array<ModuleObject>] a list of mixins attr_reader :instance_mixins - + # Creates a new namespace object inside +namespace+ with +name+. # @see Base#initialize def initialize(namespace, name, *args, &block) @children = CodeObjectList.new(self) @class_mixins = CodeObjectList.new(self) @@ -60,87 +60,87 @@ @attributes = SymbolHash[:class => SymbolHash.new, :instance => SymbolHash.new] @aliases = {} @groups = [] super end - + # Only the class attributes # @return [Hash] a list of method names and their read/write objects # @see #attributes def class_attributes attributes[:class] end - + # Only the instance attributes # @return [Hash] a list of method names and their read/write objects # @see #attributes - def instance_attributes + def instance_attributes attributes[:instance] end - + # Looks for a child that matches the attributes specified by +opts+. - # + # # @example Finds a child by name and scope # namespace.child(:name => :to_s, :scope => :instance) # # => #<yardoc method MyClass#to_s> # @return [Base, nil] the first matched child object, or nil def child(opts = {}) if !opts.is_a?(Hash) children.find {|o| o.name == opts.to_sym } else opts = SymbolHash[opts] - children.find do |obj| + children.find do |obj| opts.each do |meth, value| break false if !(value.is_a?(Array) ? value.include?(obj[meth]) : obj[meth] == value) end end end end - + # Returns all methods that match the attributes specified by +opts+. If # no options are provided, returns all methods. - # + # # @example Finds all private and protected class methods # namespace.meths(:visibility => [:private, :protected], :scope => :class) # # => [#<yardoc method MyClass.privmeth>, #<yardoc method MyClass.protmeth>] - # @option opts [Array<Symbol>, Symbol] :visibility ([:public, :private, - # :protected]) the visibility of the methods to list. Can be an array or + # @option opts [Array<Symbol>, Symbol] :visibility ([:public, :private, + # :protected]) the visibility of the methods to list. Can be an array or # single value. - # @option opts [Array<Symbol>, Symbol] :scope ([:class, :instance]) the + # @option opts [Array<Symbol>, Symbol] :scope ([:class, :instance]) the # scope of the methods to list. Can be an array or single value. - # @option opts [Boolean] :included (true) whether to include mixed in + # @option opts [Boolean] :included (true) whether to include mixed in # methods in the list. # @return [Array<MethodObject>] a list of method objects def meths(opts = {}) opts = SymbolHash[ :visibility => [:public, :private, :protected], :scope => [:class, :instance], :included => true ].update(opts) - + opts[:visibility] = [opts[:visibility]].flatten opts[:scope] = [opts[:scope]].flatten - ourmeths = children.select do |o| - o.is_a?(MethodObject) && + ourmeths = children.select do |o| + o.is_a?(MethodObject) && opts[:visibility].include?(o.visibility) && opts[:scope].include?(o.scope) end - + ourmeths + (opts[:included] ? included_meths(opts) : []) end - + # Returns methods included from any mixins that match the attributes # specified by +opts+. If no options are specified, returns all included # methods. - # - # @option opts [Array<Symbol>, Symbol] :visibility ([:public, :private, - # :protected]) the visibility of the methods to list. Can be an array or + # + # @option opts [Array<Symbol>, Symbol] :visibility ([:public, :private, + # :protected]) the visibility of the methods to list. Can be an array or # single value. - # @option opts [Array<Symbol>, Symbol] :scope ([:class, :instance]) the + # @option opts [Array<Symbol>, Symbol] :scope ([:class, :instance]) the # scope of the methods to list. Can be an array or single value. - # @option opts [Boolean] :included (true) whether to include mixed in + # @option opts [Boolean] :included (true) whether to include mixed in # methods in the list. # @see #meths def included_meths(opts = {}) opts = SymbolHash[:scope => [:instance, :class]].update(opts) [opts[:scope]].flatten.map do |scope| @@ -153,38 +153,38 @@ arr.map! {|o| ExtendedMethodObject.new(o) } if scope == :class list + arr end end.flatten end - + # Returns all constants in the namespace - # + # # @option opts [Boolean] :included (true) whether or not to include # mixed in constants in list # @return [Array<ConstantObject>] a list of constant objects def constants(opts = {}) opts = SymbolHash[:included => true].update(opts) consts = children.select {|o| o.is_a? ConstantObject } consts + (opts[:included] ? included_constants : []) end - + # Returns constants included from any mixins # @return [Array<ConstantObject>] a list of constant objects def included_constants instance_mixins.inject([]) do |list, mixin| if mixin.respond_to? :constants - list += mixin.constants.reject do |o| + list += mixin.constants.reject do |o| child(:name => o.name) || list.find {|o2| o2.name == o.name } end else list end end end - + # Returns class variables defined in this namespace. # @return [Array<ClassVariableObject>] a list of class variable objects - def cvars + def cvars children.select {|o| o.is_a? ClassVariableObject } end # Returns for specific scopes. If no scopes are provided, returns all mixins. # @param [Array<Symbol>] scopes a list of scopes (:class, :instance) to