File: help.rb

package info (click to toggle)
ruby-gitlab 5.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,660 kB
  • sloc: ruby: 12,582; makefile: 7; sh: 4
file content (94 lines) | stat: -rw-r--r-- 2,690 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# frozen_string_literal: true

require 'gitlab'
require 'gitlab/cli_helpers'

module Gitlab::Help
  extend Gitlab::CLI::Helpers

  class << self
    # Returns the (modified) help from the 'ri' command or returns an error.
    #
    # @return [String]
    def get_help(cmd)
      cmd_namespace = namespace cmd

      if cmd_namespace
        ri_output = `#{ri_cmd} -T #{cmd_namespace} 2>&1`.chomp

        if $CHILD_STATUS == 0
          change_help_output! cmd, ri_output
          yield ri_output if block_given?

          ri_output
        else
          "Ri docs not found for #{cmd}, please install the docs to use 'help'."
        end
      else
        "Unknown command: #{cmd}."
      end
    end

    # Finds the location of 'ri' on a system.
    #
    # @return [String]
    def ri_cmd
      which_ri = `which ri`.chomp
      raise "'ri' tool not found in $PATH. Please install it to use the help." if which_ri.empty?

      which_ri
    end

    # A hash map that contains help topics (Branches, Groups, etc.)
    # and a list of commands that are defined under a topic (create_branch,
    # branches, protect_branch, etc.).
    #
    # @return [Hash<Array>]
    def help_map
      @help_map ||=
        actions.each_with_object({}) do |action, hsh|
          key = client.method(action)
                      .owner.to_s.gsub(/Gitlab::(?:Client::)?/, '')
          hsh[key] ||= []
          hsh[key] << action.to_s
        end
    end

    # Table with available commands.
    #
    # @return [Terminal::Table]
    def actions_table(topic = nil)
      rows = topic ? help_map[topic] : help_map.keys
      table do |t|
        t.title = topic || 'Help Topics'

        # add_row expects an array and we have strings hence the map.
        rows.sort.map { |r| [r] }.each_with_index do |row, index|
          t.add_row row
          t.add_separator unless rows.size - 1 == index
        end
      end
    end

    # Returns full namespace of a command (e.g. Gitlab::Client::Branches.cmd)
    def namespace(cmd)
      method_owners.select { |method| method[:name] == cmd }
                   .map { |method| "#{method[:owner]}.#{method[:name]}" }
                   .shift
    end

    # Massage output from 'ri'.
    def change_help_output!(cmd, output_str)
      output_str = +output_str
      output_str.gsub!(/#{cmd}(\(.*?\))/m, "#{cmd}\\1")
      output_str.gsub!(/,\s*/, ', ')

      # Ensure @option descriptions are on a single line
      output_str.gsub!(/\n\[/, " \[")
      output_str.gsub!(/\s(@)/, "\n@")
      output_str.gsub!(/(\])\n(:)/, '\\1 \\2')
      output_str.gsub!(/(:.*)(\n)(.*\.)/, '\\1 \\3')
      output_str.gsub!(/\{(.+)\}/, '"{\\1}"')
    end
  end
end