class Cucumber::Cli::ProfileLoader

Public Class Methods

new() click to toggle source
# File lib/cucumber/cli/profile_loader.rb, line 8
def initialize
  @cucumber_yml = nil
end

Public Instance Methods

args_from(profile) click to toggle source
# File lib/cucumber/cli/profile_loader.rb, line 12
      def args_from(profile)
        unless cucumber_yml.key?(profile)
          raise(ProfileNotFound, <<-END_OF_ERROR)
Could not find profile: '#{profile}'

Defined profiles in cucumber.yml:
  * #{cucumber_yml.keys.sort.join("\n  * ")}
          END_OF_ERROR
        end

        args_from_yml = cucumber_yml[profile] || ''

        case args_from_yml
        when String
          if args_from_yml =~ /^\s*$/
            raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was blank." \
            "  Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n"
          end

          args_from_yml = processed_shellwords(args_from_yml)
        when Array
          raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was empty.  Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n" if args_from_yml.empty?
        else
          raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was a #{args_from_yml.class}. It must be a String or Array"
        end

        args_from_yml
      end
cucumber_yml_defined?() click to toggle source
# File lib/cucumber/cli/profile_loader.rb, line 45
def cucumber_yml_defined?
  cucumber_file && File.exist?(cucumber_file)
end
profile?(profile) click to toggle source
# File lib/cucumber/cli/profile_loader.rb, line 41
def profile?(profile)
  cucumber_yml.key?(profile)
end

Private Instance Methods

cucumber_file() click to toggle source

Locates cucumber.yml file. The file can end in .yml or .yaml, and be located in the current directory (eg. project root) or in a .config/ or config/ subdirectory of the current directory.

# File lib/cucumber/cli/profile_loader.rb, line 100
def cucumber_file
  @cucumber_file ||= Dir.glob('{,.config/,config/}cucumber{.yml,.yaml}').first
end
cucumber_yml() click to toggle source

Loads the profile, processing it through ERB and YAML, and returns it as a hash.

# File lib/cucumber/cli/profile_loader.rb, line 52
def cucumber_yml
  return @cucumber_yml if @cucumber_yml

  ensure_configuration_file_exists
  process_configuration_file_with_erb
  load_configuration

  if @cucumber_yml.nil? || !@cucumber_yml.is_a?(Hash)
    raise(YmlLoadError, 'cucumber.yml was found, but was blank or malformed. ' \
    "Please refer to cucumber's documentation on correct profile usage.\n")
  end

  @cucumber_yml
end
ensure_configuration_file_exists() click to toggle source
# File lib/cucumber/cli/profile_loader.rb, line 67
def ensure_configuration_file_exists
  return if cucumber_yml_defined?

  raise(ProfilesNotDefinedError, "cucumber.yml was not found.  Current directory is #{Dir.pwd}." \
                                 "Please refer to cucumber's documentation on defining profiles in cucumber.yml.  You must define" \
                                 "a 'default' profile to use the cucumber command without any arguments.\nType 'cucumber --help' for usage.\n")
end
load_configuration() click to toggle source
# File lib/cucumber/cli/profile_loader.rb, line 88
def load_configuration
  require 'yaml'
  begin
    @cucumber_yml = YAML.load(@cucumber_erb) # rubocop:disable Security/YAMLLoad
  rescue StandardError
    raise(YmlLoadError, "cucumber.yml was found, but could not be parsed. Please refer to cucumber's documentation on correct profile usage.\n")
  end
end
process_configuration_file_with_erb() click to toggle source
# File lib/cucumber/cli/profile_loader.rb, line 75
def process_configuration_file_with_erb
  require 'erb'
  begin
    @cucumber_erb = if RUBY_VERSION >= '2.6'
                      ERB.new(IO.read(cucumber_file), trim_mode: '%').result(binding)
                    else
                      ERB.new(IO.read(cucumber_file), nil, '%').result(binding)
                    end
  rescue StandardError
    raise(YmlLoadError, "cucumber.yml was found, but could not be parsed with ERB.  Please refer to cucumber's documentation on correct profile usage.\n#{$ERROR_INFO.inspect}")
  end
end
processed_shellwords(args_from_yml) click to toggle source
# File lib/cucumber/cli/profile_loader.rb, line 104
def processed_shellwords(args_from_yml)
  require 'shellwords'

  return Shellwords.shellwords(args_from_yml) unless Cucumber::WINDOWS

  # Shellwords treats backslash as an escape character so we have to mask it out temporarily
  placeholder = 'pseudo_unique_backslash_placeholder'
  sanitized_line = args_from_yml.gsub('\\', placeholder)

  Shellwords.shellwords(sanitized_line).collect { |argument| argument.gsub(placeholder, '\\') }
end