class Cucumber::Glue::RegistryAndMore

TODO: This class has too many responsibilities, split off

Attributes

current_world[R]
step_definitions[R]

Public Class Methods

cli_snippet_type_options() click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 194
def self.cli_snippet_type_options
  registry = CucumberExpressions::ParameterTypeRegistry.new
  cucumber_expression_generator = CucumberExpressions::CucumberExpressionGenerator.new(registry)
  Snippet::SNIPPET_TYPES.keys.sort_by(&:to_s).map do |type|
    Snippet::SNIPPET_TYPES[type].cli_option_string(type, cucumber_expression_generator)
  end
end
new(runtime, configuration) click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 55
def initialize(runtime, configuration)
  @runtime = runtime
  @configuration = configuration
  @step_definitions = []
  Glue::Dsl.rb_language = self
  @world_proc = @world_modules = nil
  @parameter_type_registry = CucumberExpressions::ParameterTypeRegistry.new
  cucumber_expression_generator = CucumberExpressions::CucumberExpressionGenerator.new(@parameter_type_registry)
  @configuration.register_snippet_generator(Snippet::Generator.new(cucumber_expression_generator))
end

Public Instance Methods

add_hook(phase, hook) click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 163
def add_hook(phase, hook)
  hooks[phase.to_sym] << hook
  hook
end
after_all() click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 157
def after_all
  hooks[:after_all].each do |hook|
    hook.invoke('AfterAll', [])
  end
end
after_configuration(configuration) click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 137
def after_configuration(configuration)
  deprecate_after_configuration_hook if hooks[:after_configuration].any?

  hooks[:after_configuration].each do |hook|
    hook.invoke('AfterConfiguration', configuration)
  end
end
available_step_definition(regexp_source, file_colon_line) click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 180
def available_step_definition(regexp_source, file_colon_line)
  available_step_definition_hash[StepDefinitionLight.new(regexp_source, file_colon_line)] = nil
end
before_all() click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 151
def before_all
  hooks[:before_all].each do |hook|
    hook.invoke('BeforeAll', [])
  end
end
begin_scenario(test_case) click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 125
def begin_scenario(test_case)
  @current_world = WorldFactory.new(@world_proc).create_world
  @current_world.extend(ProtoWorld.for(@runtime, test_case.language))
  MultiTest.extend_with_best_assertion_library(@current_world)
  @current_world.add_modules!(@world_modules || [],
                              @namespaced_world_modules || {})
end
build_rb_world_factory(world_modules, namespaced_world_modules, proc) click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 99
def build_rb_world_factory(world_modules, namespaced_world_modules, proc)
  if proc
    raise MultipleWorld.new(@world_proc, proc) if @world_proc
    @world_proc = proc
  end
  @world_modules ||= []
  @world_modules += world_modules

  @namespaced_world_modules ||= Hash.new { |h, k| h[k] = [] }
  namespaced_world_modules.each do |namespace, world_module|
    @namespaced_world_modules[namespace] << world_module unless @namespaced_world_modules[namespace].include?(world_module)
  end
end
clear_hooks() click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 168
def clear_hooks
  @hooks = nil
end
create_expression(string_or_regexp) click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 188
def create_expression(string_or_regexp)
  return CucumberExpressions::CucumberExpression.new(string_or_regexp, @parameter_type_registry) if string_or_regexp.is_a?(String)
  return CucumberExpressions::RegularExpression.new(string_or_regexp, @parameter_type_registry) if string_or_regexp.is_a?(Regexp)
  raise ArgumentError, 'Expression must be a String or Regexp'
end
define_parameter_type(parameter_type) click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 80
def define_parameter_type(parameter_type)
  @configuration.notify :envelope, parameter_type_envelope(parameter_type)

  @parameter_type_registry.define_parameter_type(parameter_type)
end
end_scenario() click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 133
def end_scenario
  @current_world = nil
end
install_plugin(configuration, registry) click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 145
def install_plugin(configuration, registry)
  hooks[:install_plugin].each do |hook|
    hook.invoke('InstallPlugin', [configuration, registry])
  end
end
invoked_step_definition(regexp_source, file_colon_line) click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 184
def invoked_step_definition(regexp_source, file_colon_line)
  invoked_step_definition_hash[StepDefinitionLight.new(regexp_source, file_colon_line)] = nil
end
load_code_file(code_file) click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 113
def load_code_file(code_file)
  return unless File.extname(code_file) == '.rb'

  # This will cause self.add_step_definition, self.add_hook, and self.define_parameter_type to be called from Glue::Dsl

  if Cucumber.use_legacy_autoloader
    load File.expand_path(code_file)
  else
    require File.expand_path(code_file)
  end
end
register_rb_hook(phase, tag_expressions, proc) click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 74
def register_rb_hook(phase, tag_expressions, proc)
  hook = add_hook(phase, Hook.new(@configuration.id_generator.new_id, self, tag_expressions, proc))
  @configuration.notify :envelope, hook.to_envelope
  hook
end
register_rb_step_definition(string_or_regexp, proc_or_sym, options) click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 86
def register_rb_step_definition(string_or_regexp, proc_or_sym, options)
  step_definition = StepDefinition.new(@configuration.id_generator.new_id, self, string_or_regexp, proc_or_sym, options)
  @step_definitions << step_definition
  @configuration.notify :step_definition_registered, step_definition
  @configuration.notify :envelope, step_definition.to_envelope
  step_definition
rescue Cucumber::CucumberExpressions::UndefinedParameterTypeError => e
  # TODO: add a way to extract the parameter type directly from the error.
  type_name = e.message.match(/^Undefined parameter type ['|\{](.*)['|\}].?$/)[1]

  @configuration.notify :undefined_parameter_type, type_name, string_or_regexp
end
step_matches(name_to_match) click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 66
def step_matches(name_to_match)
  @step_definitions.each_with_object([]) do |step_definition, result|
    if (arguments = step_definition.arguments_from(name_to_match))
      result << StepMatch.new(step_definition, name_to_match, arguments)
    end
  end
end
unmatched_step_definitions() click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 176
def unmatched_step_definitions
  available_step_definition_hash.keys - invoked_step_definition_hash.keys
end

Private Instance Methods

available_step_definition_hash() click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 219
def available_step_definition_hash
  @available_step_definition_hash ||= {}
end
deprecate_after_configuration_hook() click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 231
def deprecate_after_configuration_hook
  Cucumber.deprecate(
    'See https://github.com/cucumber/cucumber-ruby/blob/main/UPGRADING.md#upgrading-to-710 for more info',
    ' AfterConfiguration hook',
    '8.0.0'
  )
end
hooks() click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 227
def hooks
  @hooks ||= Hash.new { |h, k| h[k] = [] }
end
invoked_step_definition_hash() click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 223
def invoked_step_definition_hash
  @invoked_step_definition_hash ||= {}
end
parameter_type_envelope(parameter_type) click to toggle source
# File lib/cucumber/glue/registry_and_more.rb, line 204
def parameter_type_envelope(parameter_type)
  # TODO: should me moved to Cucumber::Expression::ParameterType#to_envelope ?
  # Note: that would mean that cucumber-expression would depend on cucumber-messages

  Cucumber::Messages::Envelope.new(
    parameter_type: Cucumber::Messages::ParameterType.new(
      id: @configuration.id_generator.new_id,
      name: parameter_type.name,
      regular_expressions: parameter_type.regexps.map(&:to_s),
      prefer_for_regular_expression_match: parameter_type.prefer_for_regexp_match?,
      use_for_snippets: parameter_type.use_for_snippets?
    )
  )
end