class YARD::Handlers::Cucumber::FeatureHandler

Public Class Methods

cache(type) click to toggle source

Store all comparable items with their compare_value as the key and the item as the value

  • Reject any compare values that contain escapes #{} as that means they have unpacked constants

# File lib/yard/handlers/cucumber/feature_handler.rb, line 81
def cache(type)
  YARD::Registry.all(type).inject({}) do |hash,item|
    hash[item.regex] = item if item.regex
    hash
  end
end
match_step_to_step_definition_and_transforms(step) click to toggle source

Given a step object, attempt to match that step to a step transformation

# File lib/yard/handlers/cucumber/feature_handler.rb, line 102
def match_step_to_step_definition_and_transforms(step)
  @@step_definitions.each_pair do |stepdef,stepdef_object|
    stepdef_matches = step.value.match(stepdef)

    if stepdef_matches
      step.definition = stepdef_object
      stepdef_matches[1..-1].each do |match|
        @@step_transforms.each do |steptrans,steptransform_object|
          if steptrans.match(match)
            step.transforms << steptransform_object
            steptransform_object.steps << step
          end
        end
      end

      # Step has been matched to step definition and step transforms
      # TODO: If the step were to match again then we would be able to display ambigous step definitions
      break

    end

  end

end
match_steps_to_step_definitions(statement) click to toggle source
# File lib/yard/handlers/cucumber/feature_handler.rb, line 45
def match_steps_to_step_definitions(statement)
  # Create a cache of all of the step definitions and the step transforms
  @@step_definitions = cache(:stepdefinition) unless @@step_definitions
  @@step_transforms = cache(:steptransform) unless @@step_transforms

  if statement
    # For the background and the scenario, find the steps that have definitions
    process_scenario(statement.background) if statement.background

    statement.scenarios.each do |scenario|
      if scenario.outline?
        #log.info "Scenario Outline: #{scenario.value}"
        scenario.scenarios.each_with_index do |example,index|
          #log.info " * Processing Example #{index + 1}"
          process_scenario(example)
        end
      else
        process_scenario(scenario)
      end
    end


  else
    log.warn "Empty feature file.  A feature failed to process correctly or contains no feature"
  end

rescue YARD::Handlers::NamespaceMissingError
rescue Exception => exception
  log.error "Skipping feature because an error has occurred."
  log.debug "\n#{exception}\n#{exception.backtrace.join("\n")}\n"
end
process_scenario(scenario) click to toggle source

process a scenario

# File lib/yard/handlers/cucumber/feature_handler.rb, line 89
def process_scenario(scenario)
  scenario.steps.each {|step| process_step(step) }
end
process_step(step) click to toggle source

process a step

# File lib/yard/handlers/cucumber/feature_handler.rb, line 94
def process_step(step)
  match_step_to_step_definition_and_transforms(step)
end

Public Instance Methods

process() click to toggle source
# File lib/yard/handlers/cucumber/feature_handler.rb, line 8
def process
  #
  # Features have already been created when they were parsed. So there
  # is no need to process the feature further. Previously this is where
  # feature steps were matched to step definitions and step definitions
  # were matched to step transforms. This only worked if the feature
  # files were were assured to be processed last which was accomplished
  # by overriding YARD::SourceParser to make it load file in a similar
  # order as Cucumber.
  #
  # As of YARD 0.7.0 this is no longer necessary as there are callbacks
  # that can be registered after all the files have been loaded. That
  # callback _after_parse_list_ is defined below and performs the
  # functionality described above.
  #
end