Class: Bashly::Script::Command

Instance Attribute Summary collapse

Attributes inherited from Base

#options

Attributes included from Renderable

#render_options

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Introspection::Visibility

#visibility

Methods included from Introspection::Variables

#variables

Methods included from Introspection::Flags

#default_flags, #flags, #global_flags?, #needy_flags, #public_flags, #required_flags, #short_flag_exist?, #visible_flags, #whitelisted_flags

Methods included from Introspection::Examples

#examples

Methods included from Introspection::EnvironmentVariables

#default_environment_variables, #environment_variables, #public_environment_variables, #required_environment_variables, #validated_environment_variables, #visible_environment_variables, #whitelisted_environment_variables

Methods included from Introspection::Dependencies

#dependencies

Methods included from Introspection::Commands

#command_aliases, #command_help_data, #command_names, #commands, #deep_commands, #default_command, #grouped_commands, #public_command_aliases, #public_commands, #visible_command_aliases, #visible_commands

Methods included from Introspection::Arguments

#args, #default_args, #repeatable_arg_exist?, #required_args, #usage_string_args, #whitelisted_args

Methods included from Completions::Command

#completion_data, #completion_function, #completion_script

Methods inherited from Base

#help, #initialize, #method_missing, #optional, #respond_to_missing?, #summary

Methods included from Renderable

#load_user_file, #render, #strings, #user_file_exist?, #user_file_path, #view_marker

Constructor Details

This class inherits a constructor from Bashly::Script::Base

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Bashly::Script::Base

Instance Attribute Details

#parent_commandObject

Returns the value of attribute parent_command.



26
27
28
# File 'lib/bashly/script/command.rb', line 26

def parent_command
  @parent_command
end

#parentsObject

Returns an array of all parents. For example, the command “docker container run” will have [docker, container] as its parents



110
111
112
# File 'lib/bashly/script/command.rb', line 110

def parents
  @parents ||= []
end

Class Method Details

.option_keysObject



15
16
17
18
19
20
21
22
23
# File 'lib/bashly/script/command.rb', line 15

def option_keys
  @option_keys ||= %i[
    alias args catch_all commands completions
    default dependencies environment_variables examples
    extensible expose filename filters flags
    footer function group help name
    private variables version
  ]
end

Instance Method Details

#action_nameObject

Returns the name to be used as an action.

  • If it is the root command, the action is “root”

  • Else, it is all the parents, except the first one (root) joined by space. For example, for a command like “docker container run” the action name is “container run”.



34
35
36
# File 'lib/bashly/script/command.rb', line 34

def action_name
  parents.any? ? (parents[1..] + [name]).join(' ') : 'root'
end

#aliasesObject

Returns all the possible aliases for this command



39
40
41
# File 'lib/bashly/script/command.rb', line 39

def aliases
  [name] + alt
end

#altObject

Returns an array of alternative aliases if any



44
45
46
47
48
# File 'lib/bashly/script/command.rb', line 44

def alt
  return [] unless options['alias']

  options['alias'].is_a?(String) ? [options['alias']] : options['alias']
end

#base_usage_patternObject

Returns a base usage string that considers whether this command is the default, and if it has any parents. Used internally by ‘usage_string`.



147
148
149
150
# File 'lib/bashly/script/command.rb', line 147

def base_usage_pattern
  usage_pattern = default ? "[#{name}]" : name
  parents.any? ? (parents + [usage_pattern]).join(' ') : usage_pattern
end

#caption_stringObject

Returns a string suitable to be a headline



51
52
53
# File 'lib/bashly/script/command.rb', line 51

def caption_string
  help.empty? ? full_name : "#{full_name} - #{summary}"
end

#catch_allObject

Returns an object representing the catch_all configuration



56
57
58
# File 'lib/bashly/script/command.rb', line 56

def catch_all
  @catch_all ||= CatchAll.from_config options['catch_all']
end

#filenameObject

Returns the filename that is expected to hold the user code for this command



62
63
64
# File 'lib/bashly/script/command.rb', line 62

def filename
  options['filename'] || implicit_filename
end

#full_nameObject

Returns the name of the command, including its parent name (in case this is a subcommand)



73
74
75
# File 'lib/bashly/script/command.rb', line 73

def full_name
  parents.any? ? (parents + [name]).join(' ') : name
end

#function_nameObject

Returns a unique name, suitable to be used in a bash function



67
68
69
# File 'lib/bashly/script/command.rb', line 67

def function_name
  options['function'] || full_name.to_underscore
end

#group_stringObject

Returns the string for the group caption



78
79
80
81
82
83
84
# File 'lib/bashly/script/command.rb', line 78

def group_string
  if group
    strings[:group] % { group: group }
  else
    strings[:commands]
  end
end

#has_unique_args_or_flags?Boolean

Returns true if this command, or any subcommand (deep) as any arg or flag with arg that is defined as unique

Returns:

  • (Boolean)


88
89
90
91
92
93
94
# File 'lib/bashly/script/command.rb', line 88

def has_unique_args_or_flags?
  deep_commands(include_self: true).each do |command|
    return true if command.args.count(&:unique).positive? ||
      command.flags.count(&:unique).positive?
  end
  false
end

#modeObject

Returns a mode identifier



97
98
99
100
101
102
103
104
105
106
# File 'lib/bashly/script/command.rb', line 97

def mode
  @mode ||= if global_flags?    then :global_flags
  elsif commands.any?           then :commands
  elsif args.any? && flags.any? then :args_and_flags
  elsif args.any?               then :args
  elsif flags.any?              then :flags
  else
    :empty
  end
end

#root_command?Boolean

Returns true if this is the root command (no parents)

Returns:

  • (Boolean)


115
116
117
# File 'lib/bashly/script/command.rb', line 115

def root_command?
  parents.empty?
end

#summary_stringObject

Returns the summary string



120
121
122
123
124
125
126
# File 'lib/bashly/script/command.rb', line 120

def summary_string
  if default
    strings[:default_command_summary] % { summary: summary }
  else
    summary
  end
end

#usage_stringObject

Returns a constructed string suitable for Usage pattern



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/bashly/script/command.rb', line 129

def usage_string
  result = [base_usage_pattern]
  command_string = default_command&.default == 'force' ? '[COMMAND]' : 'COMMAND'

  result.push case mode
  when :global_flags    then ['[OPTIONS]', command_string]
  when :commands        then [command_string]
  when :args_and_flags  then usage_string_args + ['[OPTIONS]']
  when :args            then usage_string_args
  when :flags           then ['[OPTIONS]']
  end

  result.push catch_all.usage_string if catch_all.enabled? && commands.empty?
  result.compact.join ' '
end

#user_libObject

Returns an array of files to include as is inside the script This is meant to provide the user with the ability to add custom functions



155
156
157
# File 'lib/bashly/script/command.rb', line 155

def user_lib
  @user_lib ||= Dir["#{Settings.full_lib_dir}/**/*.#{Settings.partials_extension}"]
end

#validatablesObject

Returns a mixed array of Argument and Flag objects that have validations



160
161
162
# File 'lib/bashly/script/command.rb', line 160

def validatables
  @validatables ||= args.select(&:validate) + flags.select(&:validate)
end