module Gitlab::CLI::Helpers

Defines methods related to CLI output and formatting.

Public Instance Methods

actions() click to toggle source

Returns actions available to CLI & Shell

@return [Array]

# File lib/gitlab/cli_helpers.rb, line 15
def actions
  @actions ||= Gitlab.actions
end
client() click to toggle source

Returns Gitlab::Client instance

@return [Gitlab::Client]

# File lib/gitlab/cli_helpers.rb, line 22
def client
  @client ||= Gitlab::Client.new(endpoint: Gitlab.endpoint || '')
end
confirm_command(cmd) click to toggle source

Confirms command with a desctructive action.

@return [String]

# File lib/gitlab/cli_helpers.rb, line 72
def confirm_command(cmd)
  return unless cmd.start_with?('remove_', 'delete_')

  puts 'Are you sure? (y/n)'

  if %w[y yes].include?($stdin.gets.to_s.strip.downcase)
    puts 'Proceeding..'
  else
    puts 'Command aborted.'
    exit(1)
  end
end
excluded_fields(args) click to toggle source

Returns filtered excluded fields.

@return [Array]

# File lib/gitlab/cli_helpers.rb, line 48
def excluded_fields(args)
  filtered_fields(args, '--except=')
end
filtered_fields(args, key) click to toggle source

Returns fields filtered by a keyword.

@return [Array]

# File lib/gitlab/cli_helpers.rb, line 55
def filtered_fields(args, key)
  return [] unless args.any? && args.last.is_a?(String) && args.last.start_with?(key)

  args.last.gsub(key, '').split(',')
end
get_keys(args, data) click to toggle source

Helper function to get rows and keys from data returned from API call

# File lib/gitlab/cli_helpers.rb, line 199
def get_keys(args, data)
  arr = data.map(&:to_h)
  keys = arr.first.keys.sort_by(&:to_s)
  keys &= required_fields(args) if required_fields(args).any?
  keys -= excluded_fields(args)
  [arr, keys]
end
gitlab_helper(cmd, args = []) { || ... } click to toggle source

Helper function to call Gitlab commands with args.

# File lib/gitlab/cli_helpers.rb, line 208
def gitlab_helper(cmd, args = [])
  args.any? ? Gitlab.send(cmd, *args) : Gitlab.send(cmd)
rescue StandardError => e
  puts e.message
  yield if block_given?
end
help(cmd = nil, &block) click to toggle source

Gets defined help for a specific command/action.

@return [String]

# File lib/gitlab/cli_helpers.rb, line 88
def help(cmd = nil, &block)
  if cmd.nil? || Gitlab::Help.help_map.key?(cmd)
    Gitlab::Help.actions_table(cmd)
  else
    Gitlab::Help.get_help(cmd, &block)
  end
end
hex_color?(arg) click to toggle source

Check if arg is a color in 6-digit hex notation with leading ‘#’ sign

# File lib/gitlab/cli_helpers.rb, line 230
def hex_color?(arg)
  pattern = /\A#\h{6}\Z/

  pattern.match(arg)
end
method_owners() click to toggle source

Returns method names and their owners

@return [Array<Hash>]

# File lib/gitlab/cli_helpers.rb, line 29
def method_owners
  @method_owners ||= actions.map do |action|
    {
      name: action.to_s,
      owner: client.method(action).owner.to_s
    }
  end
end
output_json(cmd, args, data) click to toggle source
# File lib/gitlab/cli_helpers.rb, line 108
def output_json(cmd, args, data)
  if data.respond_to?(:empty?) && data.empty?
    puts '{}'
  else
    hash_result = case data
                  when Gitlab::ObjectifiedHash, Gitlab::FileResponse
                    record_hash([data], cmd, args, single_value: true)
                  when Gitlab::PaginatedResponse
                    record_hash(data, cmd, args)
                  else
                    { cmd: cmd, data: data, args: args }
                  end
    puts JSON.pretty_generate(hash_result)
  end
end
output_table(cmd, args, data) click to toggle source

Outputs a nicely formatted table or error message.

# File lib/gitlab/cli_helpers.rb, line 97
def output_table(cmd, args, data)
  case data
  when Gitlab::ObjectifiedHash, Gitlab::FileResponse
    puts record_table([data], cmd, args)
  when Gitlab::PaginatedResponse
    puts record_table(data, cmd, args)
  else # probably just an error message
    puts data
  end
end
record_hash(data, cmd, args, single_value: false) click to toggle source

Renders the result of given commands and arguments into a Hash

@param [Array] data Resultset from the API call @param [String] cmd The command passed to the API @param [Array] args Options passed to the API call @param [bool] single_value If set to true, a single result should be returned @return [Hash] Result hash

# File lib/gitlab/cli_helpers.rb, line 165
def record_hash(data, cmd, args, single_value: false)
  if data.empty?
    result = nil
  else
    arr, keys = get_keys(args, data)
    result = []
    arr.each do |hash|
      row = {}

      keys.each do |key|
        row[key] = case hash[key]
                   when Hash
                     'Hash'
                   when StringIO
                     Base64.encode64(hash[key].read)
                   when nil
                     nil
                   else
                     hash[key]
                   end
      end

      result.push row
    end
    result = result[0] if single_value && result.count.positive?
  end

  {
    cmd: "Gitlab.#{cmd} #{args.join(', ')}".strip,
    result: result
  }
end
record_table(data, cmd, args) click to toggle source

Table to display records.

@return [Terminal::Table]

# File lib/gitlab/cli_helpers.rb, line 127
def record_table(data, cmd, args)
  return 'No data' if data.empty?

  arr, keys = get_keys(args, data)

  table do |t|
    t.title = "Gitlab.#{cmd} #{args.join(', ')}"
    t.headings = keys

    arr.each_with_index do |hash, index|
      values = []

      keys.each do |key|
        case value = hash[key]
        when Hash
          value = value.key?('id') ? value['id'] : 'Hash'
        when StringIO
          value = 'File'
        when nil
          value = 'null'
        end

        values << value
      end

      t.add_row values
      t.add_separator unless arr.size - 1 == index
    end
  end
end
required_fields(args) click to toggle source

Returns filtered required fields.

@return [Array]

# File lib/gitlab/cli_helpers.rb, line 41
def required_fields(args)
  filtered_fields(args, '--only=')
end
symbolize_keys(hash) click to toggle source

Convert a hash (recursively) to use symbol hash keys @return [Hash]

# File lib/gitlab/cli_helpers.rb, line 217
def symbolize_keys(hash)
  if hash.is_a?(Hash)
    hash = hash.each_with_object({}) do |(key, value), new_hash|
      new_hash[key.to_sym] = symbolize_keys(value)
    rescue NoMethodError
      raise "Error: cannot convert hash key to symbol: #{key}"
    end
  end

  hash
end
valid_command?(cmd) click to toggle source

Confirms command is valid.

@return [Boolean]

# File lib/gitlab/cli_helpers.rb, line 64
def valid_command?(cmd)
  command = cmd.is_a?(Symbol) ? cmd : cmd.to_sym
  Gitlab.actions.include?(command)
end
yaml_load(arg) click to toggle source

YAML::load on a single argument

# File lib/gitlab/cli_helpers.rb, line 237
def yaml_load(arg)
  hex_color?(arg) ? arg : YAML.safe_load(arg)
rescue Psych::SyntaxError
  raise "Error: Argument is not valid YAML syntax: #{arg}"
end