lib/honeybadger/cli/main.rb in honeybadger-5.2.0 vs lib/honeybadger/cli/main.rb in honeybadger-5.2.1

- old
+ new

@@ -1,237 +1,237 @@ -require 'honeybadger/cli/deploy' -require 'honeybadger/cli/exec' -require 'honeybadger/cli/heroku' -require 'honeybadger/cli/install' -require 'honeybadger/cli/notify' -require 'honeybadger/cli/test' -require 'honeybadger/config' -require 'honeybadger/config/defaults' -require 'honeybadger/ruby' -require 'honeybadger/util/http' -require 'honeybadger/version' -require 'logger' - -module Honeybadger - module CLI - BLANK = /\A\s*\z/ - - NOTIFIER = { - name: 'honeybadger-ruby (cli)'.freeze, - url: 'https://github.com/honeybadger-io/honeybadger-ruby'.freeze, - version: VERSION, - language: nil - }.freeze - - class Main < Thor - def self.project_options - option :api_key, required: false, aliases: :'-k', type: :string, desc: 'Api key of your Honeybadger application' - option :environment, required: false, aliases: [:'-e', :'-env'], type: :string, desc: 'Environment this command is being executed in (i.e. "production", "staging")' - option :skip_rails_load, required: false, type: :boolean, desc: 'Flag to skip rails initialization' - end - - def help(*args, &block) - if args.size == 0 - say(<<-WELCOME) -⚡ Honeybadger v#{VERSION} - -Honeybadger is your favorite error tracker for Ruby. When your app raises an -exception we notify you with all the context you need to fix it. - -The Honeybadger CLI provides tools for interacting with Honeybadger via the -command line. - -If you need support, please drop us a line: support@honeybadger.io - -WELCOME - end - super - end - - desc 'install API_KEY', 'Install Honeybadger into a new project' - def install(api_key) - Install.new(options, api_key).run - rescue => e - log_error(e) - exit(1) - end - - desc 'test', 'Send a test notification from Honeybadger' - option :dry_run, type: :boolean, aliases: :'-d', default: false, desc: 'Skip sending data to Honeybadger' - option :file, type: :string, aliases: :'-f', default: nil, desc: 'Write the output to FILE' - def test - Test.new(options).run - rescue => e - log_error(e) - exit(1) - end - - desc 'deploy', 'Notify Honeybadger of deployment' - project_options - option :repository, required: true, type: :string, aliases: :'-r', desc: 'The address of your repository' - option :revision, required: true, type: :string, aliases: :'-s', desc: 'The revision/sha that is being deployed' - option :user, required: true, type: :string, aliases: :'-u', default: ENV['USER'] || ENV['USERNAME'], desc: 'The local user who is deploying' - def deploy - config = build_config(options) - - if config.get(:api_key).to_s =~ BLANK - say("No value provided for required options '--api-key'") - exit(1) - end - - Deploy.new(options, [], config).run - rescue => e - log_error(e) - exit(1) - end - - desc 'notify', 'Notify Honeybadger of an error' - project_options - option :class, required: true, type: :string, aliases: :'-c', default: 'CLI Notification', desc: 'The class name of the error. (Default: CLI Notification)' - option :message, required: true, type: :string, aliases: :'-m', desc: 'The error message.' - option :action, required: false, type: :string, aliases: :'-a', desc: 'The action.' - option :component, required: false, type: :string, aliases: :'-C', desc: 'The component.' - option :fingerprint, required: false, type: :string, aliases: :'-f', desc: 'The fingerprint.' - option :tags, required: false, type: :string, aliases: :'-t', desc: 'The tags.' - option :url, required: false, type: :string, aliases: :'-u', desc: 'The URL.' - def notify - config = build_config(options) - - if config.get(:api_key).to_s =~ BLANK - say("No value provided for required options '--api-key'") - exit(1) - end - - Notify.new(options, [], config).run - rescue => e - log_error(e) - exit(1) - end - - desc 'exec', 'Execute a command. If the exit status is not 0, report the result to Honeybadger' - project_options - option :quiet, required: false, type: :boolean, aliases: :'-q', default: false, desc: 'Suppress all output unless notification fails.' - def exec(*args) - if args.size == 0 - say("honeybadger: exec needs a command to run", :red) - exit(1) - end - - config = build_config(options) - - if config.get(:api_key).to_s =~ BLANK - say("No value provided for required options '--api-key'", :red) - exit(1) - end - - Exec.new(options, args, config).run - rescue => e - log_error(e) - exit(1) - end - - desc 'heroku SUBCOMMAND ...ARGS', 'Manage Honeybadger on Heroku' - subcommand 'heroku', Heroku - - private - - def fetch_value(options, key) - options[key] == key ? nil : options[key] - end - - def build_config(options) - load_env(options) - - config = Honeybadger.config - config.set(:report_data, true) - config.set(:api_key, fetch_value(options, 'api_key')) if options.has_key?('api_key') - config.set(:env, fetch_value(options, 'environment')) if options.has_key?('environment') - - config - end - - def load_env(options) - # Initialize Rails when running from Rails root. - environment_rb = File.join(Dir.pwd, 'config', 'environment.rb') - if File.exist?(environment_rb) - load_rails_env_if_allowed(environment_rb, options) - end - # Ensure config is loaded (will be skipped if initialized by Rails). - Honeybadger.config.load! - end - - def load_rails_env_if_allowed(environment_rb, options) - # Skip Rails initialization according to option flag - if options.has_key?('skip_rails_load') && fetch_value(options, 'skip_rails_load') - say("Skipping Rails initialization.") - else - load_rails_env(environment_rb) - end - end - - def load_rails_env(environment_rb) - begin - require 'rails' - rescue LoadError - # No Rails, so skip loading Rails environment. - return - end - require environment_rb - end - - def log_error(e) - case e - when *Util::HTTP::ERRORS - say(<<-MSG, :red) -!! --- Failed to notify Honeybadger ------------------------------------------- !! - -# What happened? - - We encountered an HTTP error while contacting our service. Issues like this are - usually temporary. - -# Error details - - #{e.class}: #{e.message}\n at #{e.backtrace && e.backtrace.first} - -# What can I do? - - - Retry the command. - - Make sure you can connect to api.honeybadger.io (`curl https://api.honeybadger.io/v1/notices`). - - If you continue to see this message, email us at support@honeybadger.io - (don't forget to attach this output!) - -!! --- End -------------------------------------------------------------------- !! -MSG - else - say(<<-MSG, :red) -!! --- Honeybadger command failed --------------------------------------------- !! - -# What did you try to do? - - You tried to execute the following command: - `honeybadger #{ARGV.join(' ')}` - -# What actually happend? - - We encountered a Ruby exception and were forced to cancel your request. - -# Error details - - #{e.class}: #{e.message} - #{e.backtrace && e.backtrace.join("\n ")} - -# What can I do? - - - If you're calling the `install` or `test` command in a Rails app, make sure - you can boot the Rails console: `bundle exec rails console`. - - Retry the command. - - If you continue to see this message, email us at support@honeybadger.io - (don't forget to attach this output!) - -!! --- End -------------------------------------------------------------------- !! -MSG - end - end - end - end -end +require 'honeybadger/cli/deploy' +require 'honeybadger/cli/exec' +require 'honeybadger/cli/heroku' +require 'honeybadger/cli/install' +require 'honeybadger/cli/notify' +require 'honeybadger/cli/test' +require 'honeybadger/config' +require 'honeybadger/config/defaults' +require 'honeybadger/ruby' +require 'honeybadger/util/http' +require 'honeybadger/version' +require 'logger' + +module Honeybadger + module CLI + BLANK = /\A\s*\z/ + + NOTIFIER = { + name: 'honeybadger-ruby (cli)'.freeze, + url: 'https://github.com/honeybadger-io/honeybadger-ruby'.freeze, + version: VERSION, + language: nil + }.freeze + + class Main < Thor + def self.project_options + option :api_key, required: false, aliases: :'-k', type: :string, desc: 'Api key of your Honeybadger application' + option :environment, required: false, aliases: [:'-e', :'-env'], type: :string, desc: 'Environment this command is being executed in (i.e. "production", "staging")' + option :skip_rails_load, required: false, type: :boolean, desc: 'Flag to skip rails initialization' + end + + def help(*args, &block) + if args.size == 0 + say(<<-WELCOME) +⚡ Honeybadger v#{VERSION} + +Honeybadger is your favorite error tracker for Ruby. When your app raises an +exception we notify you with all the context you need to fix it. + +The Honeybadger CLI provides tools for interacting with Honeybadger via the +command line. + +If you need support, please drop us a line: support@honeybadger.io + +WELCOME + end + super + end + + desc 'install API_KEY', 'Install Honeybadger into a new project' + def install(api_key) + Install.new(options, api_key).run + rescue => e + log_error(e) + exit(1) + end + + desc 'test', 'Send a test notification from Honeybadger' + option :dry_run, type: :boolean, aliases: :'-d', default: false, desc: 'Skip sending data to Honeybadger' + option :file, type: :string, aliases: :'-f', default: nil, desc: 'Write the output to FILE' + def test + Test.new(options).run + rescue => e + log_error(e) + exit(1) + end + + desc 'deploy', 'Notify Honeybadger of deployment' + project_options + option :repository, required: true, type: :string, aliases: :'-r', desc: 'The address of your repository' + option :revision, required: true, type: :string, aliases: :'-s', desc: 'The revision/sha that is being deployed' + option :user, required: true, type: :string, aliases: :'-u', default: ENV['USER'] || ENV['USERNAME'], desc: 'The local user who is deploying' + def deploy + config = build_config(options) + + if config.get(:api_key).to_s =~ BLANK + say("No value provided for required options '--api-key'") + exit(1) + end + + Deploy.new(options, [], config).run + rescue => e + log_error(e) + exit(1) + end + + desc 'notify', 'Notify Honeybadger of an error' + project_options + option :class, required: true, type: :string, aliases: :'-c', default: 'CLI Notification', desc: 'The class name of the error. (Default: CLI Notification)' + option :message, required: true, type: :string, aliases: :'-m', desc: 'The error message.' + option :action, required: false, type: :string, aliases: :'-a', desc: 'The action.' + option :component, required: false, type: :string, aliases: :'-C', desc: 'The component.' + option :fingerprint, required: false, type: :string, aliases: :'-f', desc: 'The fingerprint.' + option :tags, required: false, type: :string, aliases: :'-t', desc: 'The tags.' + option :url, required: false, type: :string, aliases: :'-u', desc: 'The URL.' + def notify + config = build_config(options) + + if config.get(:api_key).to_s =~ BLANK + say("No value provided for required options '--api-key'") + exit(1) + end + + Notify.new(options, [], config).run + rescue => e + log_error(e) + exit(1) + end + + desc 'exec', 'Execute a command. If the exit status is not 0, report the result to Honeybadger' + project_options + option :quiet, required: false, type: :boolean, aliases: :'-q', default: false, desc: 'Suppress all output unless notification fails.' + def exec(*args) + if args.size == 0 + say("honeybadger: exec needs a command to run", :red) + exit(1) + end + + config = build_config(options) + + if config.get(:api_key).to_s =~ BLANK + say("No value provided for required options '--api-key'", :red) + exit(1) + end + + Exec.new(options, args, config).run + rescue => e + log_error(e) + exit(1) + end + + desc 'heroku SUBCOMMAND ...ARGS', 'Manage Honeybadger on Heroku' + subcommand 'heroku', Heroku + + private + + def fetch_value(options, key) + options[key] == key ? nil : options[key] + end + + def build_config(options) + load_env(options) + + config = Honeybadger.config + config.set(:report_data, true) + config.set(:api_key, fetch_value(options, 'api_key')) if options.has_key?('api_key') + config.set(:env, fetch_value(options, 'environment')) if options.has_key?('environment') + + config + end + + def load_env(options) + # Initialize Rails when running from Rails root. + environment_rb = File.join(Dir.pwd, 'config', 'environment.rb') + if File.exist?(environment_rb) + load_rails_env_if_allowed(environment_rb, options) + end + # Ensure config is loaded (will be skipped if initialized by Rails). + Honeybadger.config.load! + end + + def load_rails_env_if_allowed(environment_rb, options) + # Skip Rails initialization according to option flag + if options.has_key?('skip_rails_load') && fetch_value(options, 'skip_rails_load') + say("Skipping Rails initialization.") + else + load_rails_env(environment_rb) + end + end + + def load_rails_env(environment_rb) + begin + require 'rails' + rescue LoadError + # No Rails, so skip loading Rails environment. + return + end + require environment_rb + end + + def log_error(e) + case e + when *Util::HTTP::ERRORS + say(<<-MSG, :red) +!! --- Failed to notify Honeybadger ------------------------------------------- !! + +# What happened? + + We encountered an HTTP error while contacting our service. Issues like this are + usually temporary. + +# Error details + + #{e.class}: #{e.message}\n at #{e.backtrace && e.backtrace.first} + +# What can I do? + + - Retry the command. + - Make sure you can connect to api.honeybadger.io (`curl https://api.honeybadger.io/v1/notices`). + - If you continue to see this message, email us at support@honeybadger.io + (don't forget to attach this output!) + +!! --- End -------------------------------------------------------------------- !! +MSG + else + say(<<-MSG, :red) +!! --- Honeybadger command failed --------------------------------------------- !! + +# What did you try to do? + + You tried to execute the following command: + `honeybadger #{ARGV.join(' ')}` + +# What actually happend? + + We encountered a Ruby exception and were forced to cancel your request. + +# Error details + + #{e.class}: #{e.message} + #{e.backtrace && e.backtrace.join("\n ")} + +# What can I do? + + - If you're calling the `install` or `test` command in a Rails app, make sure + you can boot the Rails console: `bundle exec rails console`. + - Retry the command. + - If you continue to see this message, email us at support@honeybadger.io + (don't forget to attach this output!) + +!! --- End -------------------------------------------------------------------- !! +MSG + end + end + end + end +end