Sha256: 115140ef38d1bd92097ff61507d870a38ade9cfae5dcd143d133132812aaf498

Contents?: true

Size: 1.67 KB

Versions: 4

Compression:

Stored size: 1.67 KB

Contents

module Gherkin
  class Query
    def initialize
      @ast_node_locations = {}
    end

    def update(message)
      update_feature(message[:gherkinDocument][:feature]) if message[:gherkinDocument]
    end

    def location(ast_node_id)
      return @ast_node_locations[ast_node_id] if @ast_node_locations.has_key?(ast_node_id)
      raise AstNodeNotLocatedException, "No location found for #{ast_node_id} }. Known: #{@ast_node_locations.keys}"
    end

    private

    def update_feature(feature)
      return if feature.nil?
      store_nodes_location(feature[:tags])

      feature[:children].each do |child|
        update_rule(child[:rule]) if child[:rule]
        update_background(child[:background]) if child[:background]
        update_scenario(child[:scenario]) if child[:scenario]
      end
    end

    def update_rule(rule)
      rule[:children].each do |child|
        update_background(child[:background]) if child[:background]
        update_scenario(child[:scenario]) if child[:scenario]
      end
    end

    def update_background(background)
      update_steps(background[:steps])
    end

    def update_scenario(scenario)
      store_node_location(scenario)
      store_nodes_location(scenario[:tags])
      update_steps(scenario[:steps])
      scenario[:examples].each do |examples|
        store_nodes_location(examples[:tags] || [])
        store_nodes_location(examples[:tableBody] || [])
      end
    end

    def update_steps(steps)
      store_nodes_location(steps)
    end

    def store_nodes_location(nodes)
      nodes.each { |node| store_node_location(node) }
    end

    def store_node_location(node)
      @ast_node_locations[node[:id]] = node[:location]
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
cucumber-gherkin-19.0.3 lib/gherkin/query.rb
cucumber-gherkin-19.0.2 lib/gherkin/query.rb
cucumber-gherkin-19.0.1 lib/gherkin/query.rb
cucumber-gherkin-19.0.0 lib/gherkin/query.rb