Sha256: 7e3a321d470b23fcbf5a8809dacb2935daeb6de926f9f714e9e3e204881e1954

Contents?: true

Size: 1.77 KB

Versions: 48

Compression:

Stored size: 1.77 KB

Contents

# -*- coding: utf-8 -*-

module GetText
  # For normalize/finding the related classes/modules.
  # This is used for realizing the scope of TextDomain.
  # (see: http://www.yotabanana.com/hiki/ruby-gettext-scope.html)
  module ClassInfo
    extend self
    # normalize the class name
    # klass should kind of the class, not object.
    def normalize_class(klass)
      ret = (klass.kind_of? Module) ? klass : klass.class
      if ret.name =~ /^\#<|^$/ or ret == GetText or ret.name.nil?
        ret = Object
      end
      ret
    end

    def root_ancestors  # :nodoc:
      Object.ancestors
    end

    # Internal method for related_classes.
    def related_classes_internal(klass, all_classes = [], analyzed_classes = [] )
      ret = []
      klass = normalize_class(klass)

      return [Object] if root_ancestors.include? klass

      ary = klass.name.split(/::/)
      while(v = ary.shift)
        ret.unshift(((ret.size == 0) ? Object.const_get(v) : ret[0].const_get(v)))
      end
      ret -= analyzed_classes
      if ret.size > 1
        ret += related_classes_internal(ret[1], all_classes, analyzed_classes)
        ret.uniq!
      end
      analyzed_classes << klass unless analyzed_classes.include? klass

      klass.ancestors.each do |a|
        next if a == klass
        ret += related_classes_internal(a, all_classes, analyzed_classes)
        ret.uniq!
      end

      if all_classes.size > 0
        (ret & all_classes).uniq
      else
        ret.uniq
      end
    end

    # Returns the classes which related to klass
    # (klass's ancestors, included modules and nested modules)
    def related_classes(klass, all_classes = [])
      ret = related_classes_internal(klass, all_classes)
      unless ret.include? Object
        ret += [Object]
      end
      ret
    end
  end
end

Version data entries

48 entries across 48 versions & 1 rubygems

Version Path
gettext-3.5.1 lib/gettext/class_info.rb
gettext-3.5.0 lib/gettext/class_info.rb
gettext-3.4.9 lib/gettext/class_info.rb
gettext-3.4.8 lib/gettext/class_info.rb
gettext-3.4.7 lib/gettext/class_info.rb
gettext-3.4.6 lib/gettext/class_info.rb
gettext-3.4.5 lib/gettext/class_info.rb
gettext-3.4.4 lib/gettext/class_info.rb
gettext-3.4.3 lib/gettext/class_info.rb
gettext-3.4.2 lib/gettext/class_info.rb
gettext-3.4.1 lib/gettext/class_info.rb
gettext-3.4.0 lib/gettext/class_info.rb
gettext-3.3.9 lib/gettext/class_info.rb
gettext-3.3.8 lib/gettext/class_info.rb
gettext-3.3.7 lib/gettext/class_info.rb
gettext-3.3.6 lib/gettext/class_info.rb
gettext-3.3.5 lib/gettext/class_info.rb
gettext-3.3.4 lib/gettext/class_info.rb
gettext-3.3.3 lib/gettext/class_info.rb
gettext-3.3.2 lib/gettext/class_info.rb