class ChefDK::CLI
Attributes
argv[R]
Public Class Methods
new(argv)
click to toggle source
Calls superclass method
# File lib/chef-dk/cli.rb, line 56 def initialize(argv) @argv = argv super() # mixlib-cli #initialize doesn't allow arguments end
Public Instance Methods
commands_map()
click to toggle source
# File lib/chef-dk/cli.rb, line 132 def commands_map ChefDK.commands_map end
exit(n)
click to toggle source
# File lib/chef-dk/cli.rb, line 128 def exit(n) Kernel.exit(n) end
handle_options()
click to toggle source
If no subcommand is given, then this class is handling the CLI
request.
# File lib/chef-dk/cli.rb, line 88 def handle_options parse_options(argv) if config[:version] show_version else show_help end exit 0 end
have_command?(name)
click to toggle source
# File lib/chef-dk/cli.rb, line 136 def have_command?(name) commands_map.have_command?(name) end
instantiate_subcommand(name)
click to toggle source
# File lib/chef-dk/cli.rb, line 152 def instantiate_subcommand(name) commands_map.instantiate(name) end
option?(param)
click to toggle source
# File lib/chef-dk/cli.rb, line 148 def option?(param) param =~ /^-/ end
run(enforce_license: false)
click to toggle source
# File lib/chef-dk/cli.rb, line 61 def run(enforce_license: false) sanity_check! subcommand_name, *subcommand_params = argv # # Runs the appropriate subcommand if the given parameters contain any # subcommands. # if subcommand_name.nil? || option?(subcommand_name) handle_options elsif have_command?(subcommand_name) subcommand = instantiate_subcommand(subcommand_name) exit_code = subcommand.run_with_default_options(enforce_license, subcommand_params) exit normalized_exit_code(exit_code) else err "Unknown command `#{subcommand_name}'." show_help exit 1 end rescue OptionParser::InvalidOption => e err(e.message) show_help exit 1 end
show_help()
click to toggle source
# File lib/chef-dk/cli.rb, line 116 def show_help msg(banner) msg("\nAvailable Commands:") justify_length = subcommands.map(&:length).max + 2 subcommand_specs.each do |name, spec| next if spec.hidden msg(" #{"#{name}".ljust(justify_length)}#{spec.description}") end end
show_version()
click to toggle source
# File lib/chef-dk/cli.rb, line 98 def show_version msg("#{ChefDK::Dist::PRODUCT} version: #{ChefDK::VERSION}") { "#{ChefDK::Dist::INFRA_CLIENT_PRODUCT}": "#{ChefDK::Dist::INFRA_CLIENT_CLI}", "#{ChefDK::Dist::INSPEC_PRODUCT}": "#{ChefDK::Dist::INSPEC_CLI}", "Test Kitchen": "kitchen", "Foodcritic": "foodcritic", "Cookstyle": "cookstyle", }.each do |name, cli| result = Bundler.with_clean_env { shell_out("#{cli} --version") } if result.exitstatus != 0 msg("#{name} version: ERROR") else version = result.stdout.lines.first.scan(/(?:master\s)?[\d+\.\(\)]+\S+/).join("\s") msg("#{name} version: #{version}") end end end
subcommand_specs()
click to toggle source
# File lib/chef-dk/cli.rb, line 144 def subcommand_specs commands_map.command_specs end
subcommands()
click to toggle source
# File lib/chef-dk/cli.rb, line 140 def subcommands commands_map.command_names end
Private Instance Methods
drive_upcase(path)
click to toggle source
upcase drive letters for comparison since ruby has a String#capitalize function
# File lib/chef-dk/cli.rb, line 172 def drive_upcase(path) if Chef::Platform.windows? && path[0] =~ /^[A-Za-z]$/ && path[1, 2] == ":\\" path.capitalize else path end end
env()
click to toggle source
# File lib/chef-dk/cli.rb, line 180 def env ENV end
normalized_exit_code(maybe_integer)
click to toggle source
# File lib/chef-dk/cli.rb, line 158 def normalized_exit_code(maybe_integer) if maybe_integer.is_a?(Integer) && (0..255).cover?(maybe_integer) maybe_integer else 0 end end
path_key()
click to toggle source
Find PATH or Path correctly if we are on Windows
# File lib/chef-dk/cli.rb, line 167 def path_key env.keys.grep(/\Apath\Z/i).first end
sanity_check!()
click to toggle source
catch the cases where users setup only the embedded_bin_dir in their path, or when they have the embedded_bin_dir before the omnibus_bin_dir – both of which will defeat appbundler and interact very badly with our intent.
# File lib/chef-dk/cli.rb, line 187 def sanity_check! # When installed outside of omnibus, trust the user to configure their PATH return true unless omnibus_install? paths = env[path_key].split(File::PATH_SEPARATOR) paths.map! { |p| drive_upcase(Chef::Util::PathHelper.cleanpath(p)) } embed_index = paths.index(drive_upcase(Chef::Util::PathHelper.cleanpath(omnibus_embedded_bin_dir))) bin_index = paths.index(drive_upcase(Chef::Util::PathHelper.cleanpath(omnibus_bin_dir))) if embed_index if bin_index if embed_index < bin_index err("WARN: #{omnibus_embedded_bin_dir} is before #{omnibus_bin_dir} in your #{path_key}, please reverse that order.") err("WARN: consider using the correct `#{ChefDK::Dist::EXEC} shell-init <shell>` command to setup your environment correctly.") end else err("WARN: only #{omnibus_embedded_bin_dir} is present in your path, you must add #{omnibus_bin_dir} before that directory.") err("WARN: consider using the correct `#{ChefDK::Dist::EXEC} shell-init <shell>` command to setup your environment correctly.") end end end