Method: Fit::FixtureLoader#find_class

Defined in:
lib/fit/fixture_loader.rb

#find_class(name) ⇒ Object

Try to load the named class. We first see if it’s already loaded by looking for the class name. If not, we convert the class name to a file name (by changing ‘::’ to ‘/’, then try to require that file. We then look for the constant again. This means that the class Example::Sqrt must be in the file Example/sqrt.rb or the file example/sqrt.rb.



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
# File 'lib/fit/fixture_loader.rb', line 26

def find_class name
  klass = find_constant name
  unless klass
    ([''] + @@fixture_packages.to_a).detect do |prefix|
      file_path = (prefix + name).gsub(/::/, '/').gsub(/\./, '/')
      classname = basename = File::basename(file_path)
      if basename.index('$')
        basename_parts = basename.split(/\$/)
        basename = basename_parts[0]
        classname = basename_parts.join('::')
      end
      file_basename = basename.split(/([A-Z][^A-Z]+)/).delete_if {|e| e.empty?}.collect {|e| e.downcase!}.join('_')
      file_dirname = File::dirname(file_path)
      file_name = (file_dirname == '.' ? '' : file_dirname + '/') + file_basename

      require_file file_name

      if file_dirname == '.'
        klass_name = classname
      else
        klass_name = File::dirname(file_path).split(%r{/}).collect { |e|
          e.index(/[A-Z]/).nil? ? e.capitalize : e
        }.join('::') + "::#{classname}"
      end
      klass = find_constant klass_name
    end
  end
  klass
end