summaryrefslogtreecommitdiff
path: root/bin/leap
blob: e42b8c26fc6525030e9bdaf3ad90e2e3a557ebaf (plain)
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