From 4183a52ca6344d86aa152e189bc20c467c96c5a5 Mon Sep 17 00:00:00 2001 From: Nihad Abbasov Date: Wed, 21 May 2014 00:22:06 +0500 Subject: [PATCH] improve help message --- lib/gitlab/cli.rb | 40 ++++++++++++++++++++++++++++++++++++---- spec/gitlab/cli_spec.rb | 2 +- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/lib/gitlab/cli.rb b/lib/gitlab/cli.rb index ae94eb4ad..ba126b06b 100644 --- a/lib/gitlab/cli.rb +++ b/lib/gitlab/cli.rb @@ -10,14 +10,12 @@ def self.start(args) def self.run(cmd, args=[]) case cmd when 'help' - puts 'Available commands:' - puts '-' * 19 - puts Gitlab.actions.sort.join(', ') + puts actions_table when '-v', '--version' puts "Gitlab Ruby Gem #{Gitlab::VERSION}" else unless Gitlab.actions.include?(cmd.to_sym) - puts 'Unknown command' + puts "Unknown command. Run `gitlab help` for a list of available commands." exit(1) end @@ -40,6 +38,40 @@ def self.run(cmd, args=[]) end end + def self.actions_table + client = Gitlab::Client.new(endpoint: '') + actions = Gitlab.actions + methods = [] + + actions.each do |action| + methods << { + name: action, + owner: client.method(action).owner.to_s.gsub('Gitlab::Client::', '') + } + end + + owners = methods.map {|m| m[:owner]}.uniq.sort + methods_c = methods.group_by {|m| m[:owner]} + methods_c = methods_c.map {|_, v| [_, v.sort_by {|hv| hv[:name]}] } + methods_c = methods_c.sort_by {|v| v.first}.to_h + max_column_length = methods_c.values.max_by {|v| v.size}.size + + rows = max_column_length.times.map do |i| + methods_c.keys.map do |key| + methods_c[key][i] ? methods_c[key][i][:name] : '' + end + end + + table do |t| + t.title = "Available commands (#{actions.size} total)" + t.headings = owners + + rows.each do |row| + t.add_row row + end + end + end + def self.required_fields(args) if args.any? && args.last.start_with?('--only=') args.last.gsub('--only=', '').split(',') diff --git a/spec/gitlab/cli_spec.rb b/spec/gitlab/cli_spec.rb index 426e3d8b9..bab728d56 100644 --- a/spec/gitlab/cli_spec.rb +++ b/spec/gitlab/cli_spec.rb @@ -12,7 +12,7 @@ context "when command is help" do it "should show available actions" do output = capture_output { Gitlab::CLI.run('help') } - expect(output).to include('Available commands:') + expect(output).to include('Available commands') end end