-
Notifications
You must be signed in to change notification settings - Fork 0
/
irbrc.symlink
93 lines (83 loc) · 3.22 KB
/
irbrc.symlink
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# IRB silently fails if there's an exception in irbrc. So have to wrap the
# whole file to catch it.
begin
# Require gems from outside of the bundle.
# https://github.com/carlhuda/bundler/issues/183#issuecomment-1149953
# https://gist.github.com/932231
#
# These methods all have a major flaw - they don't load through the gem
# system. Instead they add to the load path and require. This works in some
# cases, but breaks when requiring wirb, as it makes a call to
# `Gem.datadir 'wirb'`, and since gem has no idea what that is, it breaks.
#
# Adding an outside path to gem after initialization seems impossible.
# Loading gems has to be done through manually adding the gemspec to
# Gem::Specification. There seems to be two types of gemspecs. The one that
# comes with gems, and the 'processed' version that is evaluated and
# rewritten when the gem is installed. The former lives in the gem's
# directory, the latter lives in the specifications folder.
#
# Requiring the gemspec that comes with the gem isn't a good solution as
# people write gemspecs with more than just the spec in them. E.g. requiring
# unicorn's gemspec exits as there's no version specified:
# Gem.load Dir.glob("#{Gem.dir}/gems/unicorn-*.gemspec").last
# Also Gem also adds an extra 'gem' directory to the load path:
# >> Gem.datadir('wirb')
# => "/usr/local/Cellar/ruby/1.9.3-p194/lib/ruby/gems/1.9.1/gems/gems/wirb-0.4.2/data/wirb"
# So instead, have to require the processed version.
#
# Note that this is still missing something as the gem still doesn't turn up
# when doing Gem::Specification.find_by_name - I clearly don't understand the
# gem system enough.
def unbundled_require gem
if defined?(::Bundler)
# Have to check for a version to avoid gems with dashes, e.g. pry-rails
spec_path = Dir.glob("#{Gem.dir}/specifications/#{gem}-[0-9]*.gemspec").last
if spec_path.nil?
warn "Couldn't find #{gem}"
return
end
spec = Gem::Specification.load spec_path
spec.runtime_dependencies.each do |dependency|
puts "loading dependency #{dependency}"
# TODO: handle versions
unbundled_require dependency.name
end
spec.activate
end
begin
require gem
yield if block_given?
rescue Exception => err
warn "Couldn't load #{gem}: #{err}"
end
end
class Object
# Return a list of methods defined locally for a particular object. Useful
# for seeing what it does whilst losing all the guff that's implemented
# by its parents (eg Object).
def local_methods(obj = self)
(obj.methods - obj.class.superclass.instance_methods).sort
end
end
require 'irb/ext/save-history'
require 'irb/completion'
# I'm a sucker for blank? and present?
require 'active_support'
require 'active_support/core_ext'
def log_disable
ActiveRecord::Base.logger = nil
end
IRB.conf[:SAVE_HISTORY] = 1000
IRB.conf[:EVAL_HISTORY] = 100
IRB.conf[:HISTORY_FILE] = "#{ENV['HOME']}/.irb_history"
IRB.conf[:PROMPT_MODE] = :SIMPLE
IRB.conf[:AUTO_INDENT] = true
IRB.conf[:USE_READLINE] = true
unbundled_require "pry" do
Pry.start
exit!
end
rescue Exception => e
warn "Error loading irbrc: #{e}"
end