Is there a way to get the paths to all previously required files?

Let's say I am in irb and I execute

require 'base64.rb"

=>true

and then I want to know the path to the base64.rb file,
are the paths to previously required files stored in a global
variable?

I wan't to do something like:

$required_files

=>['/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/
ruby/1.8/base64.rb']

Anyone?
Thanks,
Tim

P.S. I know that I can do shift+cmd+D in text mate and open the file,
which obviously requires the path--but this script uses
TM_SUPPORT_PATH--and it seems like something that could be more
easilly accessed directly from RUBY. At any rate, I would rather be
able to do it in irb. Thanks.

################From 'open require' command of the RUBY bundle of
TextMate######################
#!/usr/bin/env ruby

require "#{ENV['TM_SUPPORT_PATH']}/lib/ui.rb"
require "#{ENV['TM_SUPPORT_PATH']}/lib/textmate.rb"

REQUIRE_RE = /^\s*(?:require|load)\s*(['"])([^'"#]+?)(?:\.rb)?\1[ \t]*
$/

gems_installed = begin
                   require 'rubygems'
                   true
                 rescue LoadError
                   false
                 end

requires = if ENV['TM_CURRENT_LINE'].to_s =~ REQUIRE_RE
             ["#{$2}.rb"]
           else
             $stdin.read.scan(REQUIRE_RE).map { |_, path| "#
{path}.rb" }
           end
abort 'No includes found.' if requires.empty?

file = if requires.size > 1
         choice = TextMate::UI.menu(requires) or exit
         requires[choice]
       else
         requires.pop
       end
dir = $LOAD_PATH.find { |dir| File.exist? File.join(dir, file) }
if not dir and gems_installed and gem_spec =
Gem::GemPathSearcher.new.find(file)
  dir = File.join(gem_spec.full_gem_path, gem_spec.require_path)
end

if file and dir
  dir.sub!(%r{\A\.(?=/|\z)}, ENV['TM_DIRECTORY']) if ENV
['TM_DIRECTORY']
  file_path = File.join(dir, file)
  puts file_path
  TextMate.go_to :file => file_path
  exit
else
  puts "File not found: #{file}"
end

Look at:
$" (historic variable)
$LOADED_FEATURES (English equivalent)

It's not exactly what you want, but you could combine those with:
$:
$LOAD_PATH

To find out where each one came from. (Assuming, of course, that the LOAD_PATH hasn't been altered since the require happened.)

-Rob

Rob Biedenharn http://agileconsultingllc.com
Rob@AgileConsultingLLC.com

···

On Jan 4, 2009, at 11:38 PM, timr wrote:

Let's say I am in irb and I execute

require 'base64.rb"

=>true

and then I want to know the path to the base64.rb file,
are the paths to previously required files stored in a global
variable?

I wan't to do something like:

$required_files

=>['/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/
ruby/1.8/base64.rb']

Anyone?
Thanks,
Tim

P.S. I know that I can do shift+cmd+D in text mate and open the file,
which obviously requires the path--but this script uses
TM_SUPPORT_PATH--and it seems like something that could be more
easilly accessed directly from RUBY. At any rate, I would rather be
able to do it in irb. Thanks.

################From 'open require' command of the RUBY bundle of
TextMate######################
#!/usr/bin/env ruby

require "#{ENV['TM_SUPPORT_PATH']}/lib/ui.rb"
require "#{ENV['TM_SUPPORT_PATH']}/lib/textmate.rb"

REQUIRE_RE = /^\s*(?:require|load)\s*(['"])([^'"#]+?)(?:\.rb)?\1[ \t]*
$/

gems_installed = begin
                  require 'rubygems'
                  true
                rescue LoadError
                  false
                end

requires = if ENV['TM_CURRENT_LINE'].to_s =~ REQUIRE_RE
            ["#{$2}.rb"]
          else
            $stdin.read.scan(REQUIRE_RE).map { |_, path| "#
{path}.rb" }
          end
abort 'No includes found.' if requires.empty?

file = if requires.size > 1
        choice = TextMate::UI.menu(requires) or exit
        requires[choice]
      else
        requires.pop
      end
dir = $LOAD_PATH.find { |dir| File.exist? File.join(dir, file) }
if not dir and gems_installed and gem_spec =
Gem::GemPathSearcher.new.find(file)
dir = File.join(gem_spec.full_gem_path, gem_spec.require_path)
end

if file and dir
dir.sub!(%r{\A\.(?=/|\z)}, ENV['TM_DIRECTORY']) if ENV
['TM_DIRECTORY']
file_path = File.join(dir, file)
puts file_path
TextMate.go_to :file => file_path
exit
else
puts "File not found: #{file}"
end

Here is a one liner that does it. Thanks for the hint.

@file = "/mathn.rb"
$:.each{|next_search_path| puts next_search_path + @file if File::exists?(next_search_path + @file)}

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/
1.8/mathn.rb

···

On Jan 4, 9:03 pm, Rob Biedenharn <R...@AgileConsultingLLC.com> wrote:

Look at:
$" (historic variable)
$LOADED_FEATURES (English equivalent)

It's not exactly what you want, but you could combine those with:
$:
$LOAD_PATH

To find out where each one came from. (Assuming, of course, that the
LOAD_PATH hasn't been altered since the require happened.)

-Rob

Rob Biedenharn http://agileconsultingllc.com
R...@AgileConsultingLLC.com

On Jan 4, 2009, at 11:38 PM, timr wrote:

> Let's say I am in irb and I execute

>>> require 'base64.rb"
> =>true

> and then I want to know the path to the base64.rb file,
> are the paths to previously required files stored in a global
> variable?

> I wan't to do something like:
>>> $required_files
> =>['/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/
> ruby/1.8/base64.rb']

> Anyone?
> Thanks,
> Tim

> P.S. I know that I can do shift+cmd+D in text mate and open the file,
> which obviously requires the path--but this script uses
> TM_SUPPORT_PATH--and it seems like something that could be more
> easilly accessed directly from RUBY. At any rate, I would rather be
> able to do it in irb. Thanks.

> ################From 'open require' command of the RUBY bundle of
> TextMate######################
> #!/usr/bin/env ruby

> require "#{ENV['TM_SUPPORT_PATH']}/lib/ui.rb"
> require "#{ENV['TM_SUPPORT_PATH']}/lib/textmate.rb"

> REQUIRE_RE = /^\s*(?:require|load)\s*(['"])([^'"#]+?)(?:\.rb)?\1[ \t]*
> $/

> gems_installed = begin
> require 'rubygems'
> true
> rescue LoadError
> false
> end

> requires = if ENV['TM_CURRENT_LINE'].to_s =~ REQUIRE_RE
> ["#{$2}.rb"]
> else
> $stdin.read.scan(REQUIRE_RE).map { |_, path| "#
> {path}.rb" }
> end
> abort 'No includes found.' if requires.empty?

> file = if requires.size > 1
> choice = TextMate::UI.menu(requires) or exit
> requires[choice]
> else
> requires.pop
> end
> dir = $LOAD_PATH.find { |dir| File.exist? File.join(dir, file) }
> if not dir and gems_installed and gem_spec =
> Gem::GemPathSearcher.new.find(file)
> dir = File.join(gem_spec.full_gem_path, gem_spec.require_path)
> end

> if file and dir
> dir.sub!(%r{\A\.(?=/|\z)}, ENV['TM_DIRECTORY']) if ENV
> ['TM_DIRECTORY']
> file_path = File.join(dir, file)
> puts file_path
> TextMate.go_to :file => file_path
> exit
> else
> puts "File not found: #{file}"
> end