lib/pdk/cli/console.rb in pdk-2.4.0 vs lib/pdk/cli/console.rb in pdk-2.5.0

- old
+ new

@@ -1,148 +1,148 @@ -module PDK::CLI - @console_cmd = @base_cmd.define_command do - name 'console' - usage _('console [console_options]') - summary _('(Experimental) Start a session of the puppet debugger console.') - default_subcommand 'help' - description _(<<-EOF -The pdk console runs a interactive session of the puppet debugger tool to test out snippets of code, run -language evaluations, datatype prototyping and much more. A virtual playground for your puppet code! -For usage details see the puppet debugger docs at https://docs.puppet-debugger.com. - -EOF - ) - PDK::CLI.puppet_version_options(self) - PDK::CLI.puppet_dev_option(self) - # we have to skip option parsing because it is expected the user - # will be passing additional args that are passed to the debugger - skip_option_parsing - - # TODO: using -h or --help skips the pdk help and passes to puppet debugger help - run do |_opts, args, _cmd| - require 'pdk/cli/util' - require 'pdk/util' - - PDK::CLI::Util.ensure_in_module!( - message: _('Console can only be run from inside a valid module directory'), - log_level: :fatal, - ) - - PDK::CLI::Util.module_version_check - - processed_options, processed_args = process_opts(args) - - PDK::CLI::Util.validate_puppet_version_opts(processed_options) - - PDK::CLI::Util.analytics_screen_view('console', args) - - # TODO: figure out if we need to remove default configs set by puppet - # so it is scoped for the module only - # "--environmentpath"... - flags = if PDK::Util.in_module_root? - ["--basemodulepath=#{base_module_path}", - "--modulepath=#{base_module_path}"] - else - [] - end - debugger_args = ['debugger'] + processed_args + flags - result = run_in_module(processed_options, debugger_args) - - exit result[:exit_code] - end - - # Logs a fatal message about the gem missing and how to add it - def inform_user_for_missing_gem(gem_name = 'puppet-debugger', version = '~> 0.14') - PDK.logger.fatal(<<-EOF -Your Gemfile is missing the #{gem_name} gem. You can add the missing gem -by updating your #{File.join(PDK::Util.module_root, '.sync.yml')} file with the following -and running pdk update. - -Gemfile: - required: - ":development": - - gem: #{gem_name} - version: \"#{version}\" - -EOF - ) - end - - # @return [Boolean] - true if the gem was found in the lockfile - # @param [String] - name of ruby gem to check in bundle lockfile - def gem_in_bundle_lockfile?(gem_name) - require 'bundler' - require 'pdk/util/bundler' - - lock_file_path = PDK::Util::Bundler::BundleHelper.new.gemfile_lock - PDK.logger.debug("Checking lockfile #{lock_file_path} for #{gem_name}") - lock_file = ::Bundler::LockfileParser.new(::Bundler.read_file(lock_file_path)) - !lock_file.specs.find { |spec| spec.name.eql?(gem_name) }.nil? - rescue ::Bundler::GemfileNotFound => e - PDK.logger.debug _(e.message) - false - end - - def check_fixtures_dir - existing_path = base_module_path.split(':').find do |path| - PDK::Util::Filesystem.directory?(path) && Dir.entries(path).length > 2 - end - PDK.logger.warn _('Module fixtures not found, please run pdk bundle exec rake spec_prep.') unless existing_path - end - - # @return [Array] - array of split options [{:"puppet-version"=>"6.9.0"}, ['--loglevel=debug']] - # options are for the pdk and debugger pass through - def process_opts(opts) - args = opts.map do |e| - if e =~ %r{\A-{2}puppet|pe\-version|dev} - value = e.split('=') - (value.count < 2) ? value + [''] : value - end - end - args = args.compact.to_h - # symbolize keys - args = args.inject({}) do |memo, (k, v)| # rubocop:disable Style/EachWithObject - memo[k.sub('--', '').to_sym] = v - memo - end - # pass through all other args that are bound for puppet debugger - processed_args = opts.map { |e| e unless e =~ %r{\A-{2}puppet|pe\-version|dev} }.compact - [args, processed_args] - end - - # @param opts [Hash] - the options passed into the CRI command - # @param bundle_args [Array] array of bundle exec args and puppet debugger args - # @return [Hash] - a command result hash - def run_in_module(opts, bundle_args) - require 'pdk/cli/exec' - require 'pdk/cli/exec/interactive_command' - require 'pdk/util/ruby_version' - require 'pdk/util/bundler' - - check_fixtures_dir - output = opts[:debug].nil? - puppet_env = PDK::CLI::Util.puppet_from_opts_or_env(opts, output) - gemfile_env = PDK::Util::Bundler::BundleHelper.gemfile_env(puppet_env[:gemset]) - PDK::Util::RubyVersion.use(puppet_env[:ruby_version]) - PDK::Util::RubyVersion.instance(puppet_env[:ruby_version]) - PDK::Util::Bundler.ensure_bundle!(puppet_env[:gemset]) - unless gem_in_bundle_lockfile?('puppet-debugger') - inform_user_for_missing_gem - return { exit_code: 1 } - end - - debugger_args = %w[exec puppet] + bundle_args - command = PDK::CLI::Exec::InteractiveCommand.new(PDK::CLI::Exec.bundle_bin, *debugger_args).tap do |c| - c.context = :pwd - c.update_environment(gemfile_env) - end - command.execute! - end - - # @return [String] - the basemodulepath of the fixtures and modules from the current module - # also includes ./modules in case librarian puppet is used - def base_module_path - base_module_path = File.join(PDK::Util.module_fixtures_dir, 'modules') - "#{base_module_path}:#{File.join(PDK::Util.module_root, 'modules')}" - end - end -end +module PDK::CLI + @console_cmd = @base_cmd.define_command do + name 'console' + usage _('console [console_options]') + summary _('(Experimental) Start a session of the puppet debugger console.') + default_subcommand 'help' + description _(<<-EOF +The pdk console runs a interactive session of the puppet debugger tool to test out snippets of code, run +language evaluations, datatype prototyping and much more. A virtual playground for your puppet code! +For usage details see the puppet debugger docs at https://docs.puppet-debugger.com. + +EOF + ) + PDK::CLI.puppet_version_options(self) + PDK::CLI.puppet_dev_option(self) + # we have to skip option parsing because it is expected the user + # will be passing additional args that are passed to the debugger + skip_option_parsing + + # TODO: using -h or --help skips the pdk help and passes to puppet debugger help + run do |_opts, args, _cmd| + require 'pdk/cli/util' + require 'pdk/util' + + PDK::CLI::Util.ensure_in_module!( + message: _('Console can only be run from inside a valid module directory'), + log_level: :fatal, + ) + + PDK::CLI::Util.module_version_check + + processed_options, processed_args = process_opts(args) + + PDK::CLI::Util.validate_puppet_version_opts(processed_options) + + PDK::CLI::Util.analytics_screen_view('console', args) + + # TODO: figure out if we need to remove default configs set by puppet + # so it is scoped for the module only + # "--environmentpath"... + flags = if PDK::Util.in_module_root? + ["--basemodulepath=#{base_module_path}", + "--modulepath=#{base_module_path}"] + else + [] + end + debugger_args = ['debugger'] + processed_args + flags + result = run_in_module(processed_options, debugger_args) + + exit result[:exit_code] + end + + # Logs a fatal message about the gem missing and how to add it + def inform_user_for_missing_gem(gem_name = 'puppet-debugger', version = '~> 0.14') + PDK.logger.fatal(<<-EOF +Your Gemfile is missing the #{gem_name} gem. You can add the missing gem +by updating your #{File.join(PDK::Util.module_root, '.sync.yml')} file with the following +and running pdk update. + +Gemfile: + required: + ":development": + - gem: #{gem_name} + version: \"#{version}\" + +EOF + ) + end + + # @return [Boolean] - true if the gem was found in the lockfile + # @param [String] - name of ruby gem to check in bundle lockfile + def gem_in_bundle_lockfile?(gem_name) + require 'bundler' + require 'pdk/util/bundler' + + lock_file_path = PDK::Util::Bundler::BundleHelper.new.gemfile_lock + PDK.logger.debug("Checking lockfile #{lock_file_path} for #{gem_name}") + lock_file = ::Bundler::LockfileParser.new(::Bundler.read_file(lock_file_path)) + !lock_file.specs.find { |spec| spec.name.eql?(gem_name) }.nil? + rescue ::Bundler::GemfileNotFound => e + PDK.logger.debug _(e.message) + false + end + + def check_fixtures_dir + existing_path = base_module_path.split(':').find do |path| + PDK::Util::Filesystem.directory?(path) && Dir.entries(path).length > 2 + end + PDK.logger.warn _('Module fixtures not found, please run pdk bundle exec rake spec_prep.') unless existing_path + end + + # @return [Array] - array of split options [{:"puppet-version"=>"6.9.0"}, ['--loglevel=debug']] + # options are for the pdk and debugger pass through + def process_opts(opts) + args = opts.map do |e| + if e =~ %r{\A-{2}puppet|pe\-version|dev} + value = e.split('=') + (value.count < 2) ? value + [''] : value + end + end + args = args.compact.to_h + # symbolize keys + args = args.inject({}) do |memo, (k, v)| # rubocop:disable Style/EachWithObject + memo[k.sub('--', '').to_sym] = v + memo + end + # pass through all other args that are bound for puppet debugger + processed_args = opts.map { |e| e unless e =~ %r{\A-{2}puppet|pe\-version|dev} }.compact + [args, processed_args] + end + + # @param opts [Hash] - the options passed into the CRI command + # @param bundle_args [Array] array of bundle exec args and puppet debugger args + # @return [Hash] - a command result hash + def run_in_module(opts, bundle_args) + require 'pdk/cli/exec' + require 'pdk/cli/exec/interactive_command' + require 'pdk/util/ruby_version' + require 'pdk/util/bundler' + + check_fixtures_dir + output = opts[:debug].nil? + puppet_env = PDK::CLI::Util.puppet_from_opts_or_env(opts, output) + gemfile_env = PDK::Util::Bundler::BundleHelper.gemfile_env(puppet_env[:gemset]) + PDK::Util::RubyVersion.use(puppet_env[:ruby_version]) + PDK::Util::RubyVersion.instance(puppet_env[:ruby_version]) + PDK::Util::Bundler.ensure_bundle!(puppet_env[:gemset]) + unless gem_in_bundle_lockfile?('puppet-debugger') + inform_user_for_missing_gem + return { exit_code: 1 } + end + + debugger_args = %w[exec puppet] + bundle_args + command = PDK::CLI::Exec::InteractiveCommand.new(PDK::CLI::Exec.bundle_bin, *debugger_args).tap do |c| + c.context = :pwd + c.update_environment(gemfile_env) + end + command.execute! + end + + # @return [String] - the basemodulepath of the fixtures and modules from the current module + # also includes ./modules in case librarian puppet is used + def base_module_path + base_module_path = File.join(PDK::Util.module_fixtures_dir, 'modules') + "#{base_module_path}:#{File.join(PDK::Util.module_root, 'modules')}" + end + end +end