class BranchIOCLI::CLI

Public Instance Methods

add_options_for_command(c) click to toggle source
# File lib/branch_io_cli/cli.rb, line 73
def add_options_for_command(c)
  configuration_class = configuration_class(c.name)
  return unless configuration_class.respond_to?(:available_options)

  available_options = configuration_class.available_options
  available_options.each do |option|
    args = option.aliases
    declaration = "--"
    declaration += "[no-]" if option.negatable
    declaration += option.name.to_s.gsub(/_/, '-')
    if option.example
      declaration += " "
      declaration += "[" if option.argument_optional
      declaration += option.example
      declaration += "]" if option.argument_optional
    end
    args << declaration
    args << option.type if option.type

    if option.type.nil?
      default_value = option.default_value ? "yes" : "no"
    else
      default_value = option.default_value
    end

    default_string = default_value ? " (default: #{default_value})" : nil
    args << "#{option.description}#{default_string}"

    c.option(*args)
  end
end
class_for_command(name, type) click to toggle source
# File lib/branch_io_cli/cli.rb, line 62
def class_for_command(name, type)
  type_name = type.to_s.capitalize
  type_module = BranchIOCLI.const_get(type_name)
  candidate = type_module.const_get("#{name.to_s.capitalize}#{type_name}")
  return nil unless candidate

  base = type_module.const_get(type_name)
  return nil unless candidate.superclass == base
  candidate
end
command_class(name) click to toggle source
# File lib/branch_io_cli/cli.rb, line 58
def command_class(name)
  class_for_command name, :command
end
configuration_class(name) click to toggle source
# File lib/branch_io_cli/cli.rb, line 54
def configuration_class(name)
  class_for_command name, :configuration
end
run() click to toggle source
# File lib/branch_io_cli/cli.rb, line 10
def run
  program :name, "Branch.io command-line interface"
  program :version, VERSION
  program :description, render(:program_description)

  # Automatically detect all commands from branch_io_cli/command.
  all_commands = Dir[File.expand_path(File.join("..", "command", "*_command.rb"), __FILE__)].map do |path|
    File.basename(path, ".rb").sub(/_command$/, "")
  end

  all_commands.each do |command_name|
    configuration_class = configuration_class command_name
    command_class = command_class command_name
    next unless configuration_class && command_class

    command command_name do |c|
      c.syntax = "branch_io #{c.name} [OPTIONS]\n    br #{c.name} [OPTIONS]"
      c.summary = configuration_class.summary if configuration_class.respond_to?(:summary)

      begin
        c.description = render "#{c.name}_description"
      rescue Errno::ENOENT
      end

      add_options_for_command c

      if configuration_class.respond_to?(:examples) && configuration_class.examples
        configuration_class.examples.each_key do |text|
          example = configuration_class.examples[text]
          c.example text, example
        end
      end

      c.action do |args, options|
        options.default configuration_class.defaults
        return_value = command_class.new(options).run!
        exit(return_value.respond_to?(:to_i) ? return_value.to_i : 0)
      end
    end
  end

  run!
end