Module: GetText::ClassInfo

Extended by:
ClassInfo
Included in:
ClassInfo
Defined in:
lib/gettext/class_info.rb

Overview

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)

Instance Method Summary collapse

Instance Method Details

#normalize_class(klass) ⇒ Object

normalize the class name klass should kind of the class, not object.


11
12
13
14
15
16
17
# File 'lib/gettext/class_info.rb', line 11

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

Returns the classes which related to klass (klass's ancestors, included modules and nested modules)


56
57
58
59
60
61
62
# File 'lib/gettext/class_info.rb', line 56

def related_classes(klass, all_classes = [])
  ret = related_classes_internal(klass, all_classes)
  unless ret.include? Object
    ret += [Object]
  end
  ret
end

Internal method for related_classes.


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
# File 'lib/gettext/class_info.rb', line 24

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

#root_ancestorsObject

:nodoc:


19
20
21
# File 'lib/gettext/class_info.rb', line 19

def root_ancestors  # :nodoc:
  Object.ancestors
end