Sha256: 83c20b91c0678d2c9bdd91ac93479c50ae00b014eb77f35b5f47bc870839c8b1

Contents?: true

Size: 1.96 KB

Versions: 5

Compression:

Stored size: 1.96 KB

Contents

require 'nokogiri'

module Cucumber
  module Tableish
    # This method returns an Array of Array of String, using CSS3 selectors. 
    # This is particularly handy when using Cucumber's Table#diff! method.
    #
    # The +row_selector+ argument must be a String, and picks out all the rows
    # from the web page's DOM. If the number of cells in each row differs, it
    # will be constrained by (or padded with) the number of cells in the first row
    #
    # The +column_selectors+ argument must be a String or a Proc, picking out
    # cells from each row. If you pass a Proc, it will be yielded an instance
    # of Nokogiri::HTML::Element.
    #
    # == Example with a table
    #
    #   <table id="tools">
    #     <tr>
    #       <th>tool</th>
    #       <th>dude</th>
    #     </tr>
    #     <tr>
    #       <td>webrat</td>
    #       <td>bryan</td>
    #     </tr>
    #     <tr>
    #       <td>cucumber</td>
    #       <td>aslak</td>
    #     </tr>
    #   </table>
    #
    #   t = tableish('table#tools tr', 'td,th')
    #
    # == Example with a dl
    #
    #   <dl id="tools">
    #     <dt>webrat</dt>
    #     <dd>bryan</dd>
    #     <dt>cucumber</dt>
    #     <dd>aslak</dd>
    #   </dl>
    #
    #   t = tableish('dl#tools dt', lambda{|dt| [dt, dt.next.next]})
    #
    def tableish(row_selector, column_selectors)
      html = defined?(Capybara) ? body : response_body
      _tableish(html, row_selector, column_selectors)
    end

    def _tableish(html, row_selector, column_selectors) #:nodoc
      doc = Nokogiri::HTML(html)
      column_count = nil
      doc.search(row_selector).map do |row|
        cells = case(column_selectors)
        when String
          row.search(column_selectors)
        when Proc
          column_selectors.call(row)
        end
        column_count ||= cells.length
        (0...column_count).map do |n|
          cell = cells[n]
          cell ? cell.text.strip : ''
        end
      end
    end
  end
end

World(Cucumber::Tableish)

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
cucumber-rails-0.2.2 lib/cucumber/web/tableish.rb
cucumber-rails-0.2.1 lib/cucumber/web/tableish.rb
cucumber-rails-0.2.0 lib/cucumber/web/tableish.rb
cucumber-rails-0.1.1.rc6 lib/cucumber/web/tableish.rb
cucumber-rails-0.1.1.rc5 lib/cucumber/web/tableish.rb