Skip to content

Instantly share code, notes, and snippets.

@mccxj
Created July 9, 2009 05:27
Show Gist options
  • Save mccxj/143451 to your computer and use it in GitHub Desktop.
Save mccxj/143451 to your computer and use it in GitHub Desktop.
def require_or_load(file_name, const_path = nil)
log_call file_name, const_path
# file_name = $1 if file_name =~ /^(.*)\.rb$/
file_name = $1 if file_name =~ /^(.*)\.(rb|class)$/
expanded = File.expand_path(file_name)
return if loaded.include?(expanded)
# Record that we've seen this file *before* loading it to avoid an
# infinite loop with mutual dependencies.
loaded << expanded
begin
if load?
log "loading #{file_name}"
# Enable warnings iff this file has not been loaded before and
# warnings_on_first_load is set.
# load_args = ["#{file_name}.rb"]
if File.file? "#{file_name}.rb"
file_to_load = "#{file_name}.rb"
elsif File.file? "#{file_name}.class"
file_to_load = "#{file_name}.class"
else
file_to_load = file_name
end
load_args = [file_to_load]
load_args << const_path unless const_path.nil?
if !warnings_on_first_load or history.include?(expanded)
result = load_file(*load_args)
else
enable_warnings { result = load_file(*load_args) }
end
else
log "requiring #{file_name}"
result = require file_name
end
rescue Exception
loaded.delete expanded
raise
end
# Record history *after* loading so first load gets warnings.
history << expanded
return result
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment