class Dill::List

Use a List when you want to treat repeating elements as a unit.

Usage

Consider the following HTML:

<ul id="colors">
  <li>Red <span class="pt">Vermelho</span></li>
  <li>Green <span class="pt">Verde</span></li>
  <li>Blue <span class="pt">Azul</span></li>
</ul>

You can then define the following widget:

class Colors < Dill::List
  root '#colors'
  item 'li'
end

Now you'll be able to iterate over each item:

# prints:
# Red Vermelho
# Green Verde
# Blue Azul
widget(:colors).each do |e|
  puts e
end

This is the same as doing the following in Capybara:

all('#colors li').each do |e|
  puts e.text.strip
end

Note that, by default, the root selector of a List is ul and the list item selector is li. So you could wrap the +<ul>+ above simply by using the following:

class Colors < Dill::List
end

Narrowing items

You can define the root selector for your list items using the ::item macro:

class PortugueseColors < Dill::List
  root '#colors
  item '.pt'
end

If you iterate over this list you get the following:

# prints:
# Vermelho
# Verde
# Azul
widget(:portuguese_colors).each do |e|
  puts e
end

You can make a list out of any repeating elements, as long as you can define parent and child selectors.

<div id="not-a-list-colors">
  <div class="child">Red</div>
  <div class="child">Green</div>
  <div class="child">Blue</div>
</div>

You can define the following widget:

class NotAListColors < Dill::List
  root '#not-a-list-colors'
  item '.child'
end

Attributes

item_factory[W]

Public Class Methods

item(selector, type = ListItem, &block) click to toggle source

Configures the List item selector and class.

Usage

Given the following HTML:

<ul>
  <li>One</li>
  <li>Two</li>
  <li>Three</li>
</ul>

In its most basic form, allows you to configure the list item selector, using the default list item class (Dill::ListItem):

class Numbers < Dill::List
  root 'ul'
  item 'li'
end

Extending the list item class

You can define the list item class for the current List:

class Number < Dill::Widget
  # ...
end

class Numbers < Dill::List
  root 'ul'
  item 'li', Number
end

widget(:numbers).first.class < Number #=> true

Alternatively, you can extend the list item type inline. This is useful when you want to add small extensions to the default list item class. The extensions will apply only to list items of the current List.

class Numbers < Dill::List
  root 'ul'

  item 'li' do
    def upcase
      text.upcase
    end
  end

  widget(:numbers).first.upcase #=> "ONE"
end
# File lib/dill/widgets/list.rb, line 136
def item(selector, type = ListItem, &block)
  self.item_factory = WidgetClass.new(selector, type, &block)
end
item_factory() click to toggle source
# File lib/dill/widgets/list.rb, line 142
def item_factory
  @item_factory ||= WidgetClass.new('li', ListItem)
end

Public Instance Methods

count() click to toggle source
# File lib/dill/widgets/list.rb, line 147
def count
  items.count
end
empty?() click to toggle source

TODO: Convert value to primitive data structures.

# File lib/dill/widgets/list.rb, line 152
def empty?
  items.empty?
end
exclude?(element) click to toggle source
# File lib/dill/widgets/list.rb, line 156
def exclude?(element)
  ! include?(element)
end
include?(element) click to toggle source
# File lib/dill/widgets/list.rb, line 160
def include?(element)
  value.include?(element)
end
length() click to toggle source
# File lib/dill/widgets/list.rb, line 164
def length
  items.length
end
size() click to toggle source
# File lib/dill/widgets/list.rb, line 168
def size
  items.size
end
to_row() click to toggle source
# File lib/dill/widgets/list.rb, line 172
def to_row
  items.map(&:to_cell)
end
to_table() click to toggle source
# File lib/dill/widgets/list.rb, line 176
def to_table
  items.map(&:to_row)
end
value() click to toggle source
# File lib/dill/widgets/list.rb, line 180
def value
  items.map(&:value)
end

Protected Instance Methods

item_filter() click to toggle source
# File lib/dill/widgets/list.rb, line 192
def item_filter
  item_factory.filter
end
item_for(node) click to toggle source
# File lib/dill/widgets/list.rb, line 188
def item_for(node)
  item_factory.new(node)
end
items() click to toggle source
# File lib/dill/widgets/list.rb, line 196
def items
  item_filter.nodes(self).map { |node| item_for(node) }
end