module Gitlab::CLI::Helpers
Defines methods related to CLI
output and formatting.
Public Instance Methods
Source
# File lib/gitlab/cli_helpers.rb, line 16 def actions @actions ||= Gitlab.actions end
Returns actions available to CLI
& Shell
@return [Array]
Source
# File lib/gitlab/cli_helpers.rb, line 23 def client @client ||= Gitlab::Client.new(endpoint: Gitlab.endpoint || '') end
Returns Gitlab::Client
instance
@return [Gitlab::Client]
Source
# File lib/gitlab/cli_helpers.rb, line 73 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
Confirms command with a desctructive action.
@return [String]
Source
# File lib/gitlab/cli_helpers.rb, line 49 def excluded_fields(args) filtered_fields(args, '--except=') end
Returns filtered excluded fields.
@return [Array]
Source
# File lib/gitlab/cli_helpers.rb, line 56 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
Returns fields filtered by a keyword.
@return [Array]
Source
# File lib/gitlab/cli_helpers.rb, line 200 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
Helper function to get rows and keys from data returned from API call
Source
# File lib/gitlab/cli_helpers.rb, line 209 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
Helper function to call Gitlab
commands with args.
Source
# File lib/gitlab/cli_helpers.rb, line 89 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
Gets defined help for a specific command/action.
@return [String]
Source
# File lib/gitlab/cli_helpers.rb, line 231 def hex_color?(arg) pattern = /\A#\h{6}\Z/ pattern.match(arg) end
Check if arg is a color in 6-digit hex notation with leading ‘#’ sign
Source
# File lib/gitlab/cli_helpers.rb, line 30 def method_owners @method_owners ||= actions.map do |action| { name: action.to_s, owner: client.method(action).owner.to_s } end end
Returns method names and their owners
@return [Array<Hash>]
Source
# File lib/gitlab/cli_helpers.rb, line 109 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
Source
# File lib/gitlab/cli_helpers.rb, line 98 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
Outputs a nicely formatted table or error message.
Source
# File lib/gitlab/cli_helpers.rb, line 166 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
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
Source
# File lib/gitlab/cli_helpers.rb, line 128 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
Table to display records.
@return [Terminal::Table]
Source
# File lib/gitlab/cli_helpers.rb, line 42 def required_fields(args) filtered_fields(args, '--only=') end
Returns filtered required fields.
@return [Array]
Source
# File lib/gitlab/cli_helpers.rb, line 218 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
Convert a hash (recursively) to use symbol hash keys @return [Hash]
Source
# File lib/gitlab/cli_helpers.rb, line 65 def valid_command?(cmd) command = cmd.is_a?(Symbol) ? cmd : cmd.to_sym Gitlab.actions.include?(command) end
Confirms command is valid.
@return [Boolean]
Source
# File lib/gitlab/cli_helpers.rb, line 238 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
YAML::load on a single argument