Module: Kernel

Defined in:
lib/endlessruby/custom_require.rb

Instance Method Summary collapse

Instance Method Details

#endlessruby_original_requireObject



8
# File 'lib/endlessruby/custom_require.rb', line 8

alias endlessruby_original_require require

#require(path) ⇒ Object

EndlessRuby によって再定義された require です。 たいていのこのrequireはオリジナルなrequireまたはrubygemsのrequireがSyntaxErrorによって失敗した場合のみ機能します。 SytanxError によってrequireが失敗した場合、pathを探してpathまたはpath.erの名前のファイルをEndlessRubyの構文として評価します。 pathが./または/で以外で始まる場合は$LOAD_PATHと$:をそれぞれ参照してpathを探します。 もしpathがそれらで始まる場合はそれぞれ参照しません。(つまり通常のrequireの動作と同じです)



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
# File 'lib/endlessruby/custom_require.rb', line 15

def require path
  endlessruby_original_require path
rescue SyntaxError, LoadError

  load = lambda do |path, abspath|

    if !File.exist?(abspath) || File.directory?(abspath)
      if File.exist? "#{abspath}.er"
        abspath = "#{abspath}.er"
      else
        raise LoadError, "no such file to load -- #{path}"
      end
    end

    return false if $".include? abspath

    if File.directory? abspath
      raise LoadError, "Is a directory - #{path}"
    end

    open(abspath) do |file|
      EndlessRuby.ereval file.read, TOPLEVEL_BINDING, abspath
      $" << abspath
      return true
    end
  end

  case path
  when /^\~(.*?)$/
    load.call path, File.join(ENV['HOME'], $1)
  when /^\.\/.*?$/, /^\/.*?$/
    load.call path, path
  else
    is_that_dir = false
    $:.each do |load_path|
      abspath = File.join load_path, path
      begin
        return load.call path, abspath
      rescue SyntaxError => e
        $stderr.puts "*ENDLESSRUBY BUG*"
        raise e
      rescue LoadError => e
        raise e if load_path == $:.last
      end
    end
  end
end