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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
#!/usr/bin/env ruby
if ARGV.include?('--debug') || ARGV.include?('-d')
DEBUG=true
begin
if RUBY_VERSION =~ /^2/
require 'byebug'
else
require 'debugger'
end
rescue LoadError
end
else
DEBUG=false
end
LEAP_CLI_BASE_DIR = File.expand_path('..', File.dirname(File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__))
ORIGINAL_ARGV = ARGV.dup
begin
require 'leap_cli'
rescue LoadError
#
# When developing a gem with a command, you normally use `bundle exec bin/command-name`
# to run your app. At install-time, RubyGems will make sure lib, etc. are in the load path,
# so that you can run the command directly.
#
# However, I don't like using 'bundle exec'. It is slow, and limits which directory you can
# run in. So, instead, we fall back to some path manipulation hackery.
#
# This allows you to run the command directly while developing the gem, and also lets you
# run from anywhere (I like to link 'bin/leap' to /usr/local/bin/leap).
#
require File.join(LEAP_CLI_BASE_DIR, 'lib','leap_cli','load_paths')
require 'leap_cli'
end
require 'gli'
require 'highline'
require 'forwardable'
require 'leap_cli/lib_ext/gli' # our custom extensions to gli
#
# Typically, GLI and Highline methods are loaded into the global namespace.
# Instead, here we load these into the module LeapCli::Commands in order to
# ensure that the cli logic and code is kept isolated to leap_cli/commands/*.rb
#
# no cheating!
#
module LeapCli::Commands
extend GLI::App
extend Forwardable
# delegate highline methods to make them available to sub-commands
@terminal = HighLine.new
def_delegator :@terminal, :ask, 'self.ask'
def_delegator :@terminal, :agree, 'self.agree'
def_delegator :@terminal, :choose, 'self.choose'
def_delegator :@terminal, :say, 'self.say'
def_delegator :@terminal, :color, 'self.color'
def_delegator :@terminal, :list, 'self.list'
# make config manager available as 'manager'
def self.manager
@manager ||= begin
manager = LeapCli::Config::Manager.new
manager.load
manager
end
end
# make provider config available as 'provider'
def self.provider
manager.provider
end
# make leapfile available as 'leapfile'
def self.leapfile
LeapCli::leapfile
end
# info about leap command line suite
program_desc LeapCli::SUMMARY
program_long_desc LeapCli::DESCRIPTION
# handle --version ourselves (and not GLI)
if ARGV.grep(/--version/).any?
puts "leap #{LeapCli::VERSION}, ruby #{RUBY_VERSION}"
begin
commands_from('leap_cli/commands')
initialize_leap_cli(false, {:verbose => 2})
rescue StandardError => exc
puts exc.to_s
raise exc if DEBUG
end
exit(0)
end
# disable GLI error catching
ENV['GLI_DEBUG'] = "true"
def error_message(msg)
end
# load commands
commands_from('leap_cli/commands')
# run command
begin
exit_status = run(ARGV)
exit(LeapCli::Util.exit_status || exit_status)
rescue StandardError => exc
if exc.respond_to? :log
exc.log
else
puts
LeapCli.log :error, "%s: %s" % [exc.class, exc.message]
puts
end
if DEBUG
raise exc
end
end
end
|