dill 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7868bfe9fa6361d88848300bfecc8865641aa20d
4
+ data.tar.gz: c9ef7dcdd55253ba2bd4c2c13b573e9ddce90fda
5
+ SHA512:
6
+ metadata.gz: a60a3f55322d125cb64522d7bfc8c8c8e2235f7a1c70bf7d64763286e22a1e6e296e057ad5886392fbf26b2f06e7cb892fdc03379c66f8a174578244cf211291
7
+ data.tar.gz: bc94abaf53d82cc1d2b231c8fe4ad1fc47fff52724249e9b00f8a3f42c028047886722be6c7658779f5d059398fd74c823c346ff24d25a48fb30816a771d0df7
@@ -13,8 +13,12 @@ require 'dill/text_table/transformations'
13
13
  require 'dill/text_table/cell_text'
14
14
  require 'dill/capybara'
15
15
  require 'dill/dsl'
16
+ require 'dill/matchers'
16
17
 
17
18
  module Dill
18
19
  # An exception that signals that something is missing.
19
20
  class Missing < StandardError; end
21
+ class MissingWidget < StandardError; end
22
+ class AmbiguousWidget < StandardError; end
23
+ class InvalidOption < StandardError; end
20
24
  end
@@ -1,3 +1,4 @@
1
- require 'dill'
1
+ require 'capybara/cucumber'
2
+ require 'dill/rails'
2
3
 
3
4
  World(Dill::DSL)
@@ -2,6 +2,21 @@ module Dill
2
2
  module DSL
3
3
  attr_writer :widget_lookup_scope
4
4
 
5
+ # Clicks the widget defined by +name+ and optional +args+.
6
+ #
7
+ # Makes no distinction between links or buttons.
8
+ #
9
+ # class MyWidget < Dill::Widget
10
+ # root { |text| ['.my-widget', text: text] }
11
+ # end
12
+ #
13
+ # # <a href="#one" class="my-widget">One</li>
14
+ # # <a href="#two" class="my-widget">Two</li> <!-- clicks this node -->
15
+ # click :my_widget, 'Two'
16
+ def click(name, *args)
17
+ widget(name, *args).click
18
+ end
19
+
5
20
  # @return [Document] the current document with the class of the
6
21
  # current object set as the widget lookup scope.
7
22
  def document
@@ -14,10 +29,28 @@ module Dill
14
29
  document.has_widget?(name, *args)
15
30
  end
16
31
 
32
+ alias_method :widget?, :has_widget?
33
+
34
+ def set(name, fields)
35
+ widget(name).set fields
36
+ end
37
+
38
+ def submit(name, fields = {})
39
+ widget(name).submit_with fields
40
+ end
41
+
17
42
  def value(name, *args)
18
43
  widget(name, *args).value
19
44
  end
20
45
 
46
+ def values(name, *args)
47
+ widgets(name, *args).map(&:value)
48
+ end
49
+
50
+ def visit(path)
51
+ Capybara.current_session.visit path
52
+ end
53
+
21
54
  # Returns a widget instance for the given name.
22
55
  #
23
56
  # @param name [String, Symbol]
@@ -25,6 +58,13 @@ module Dill
25
58
  document.widget(name, *args)
26
59
  end
27
60
 
61
+ # Returns a list of widget instances for the given name.
62
+ #
63
+ # @param name [String, Symbol]
64
+ def widgets(name, *args)
65
+ document.widgets(name, *args)
66
+ end
67
+
28
68
  def widget_lookup_scope
29
69
  @widget_lookup_scope ||= default_widget_lookup_scope
30
70
  end
@@ -0,0 +1,7 @@
1
+ require 'rspec/matchers'
2
+
3
+ RSpec::Matchers.define :see do |widget_name, *args|
4
+ match do |role|
5
+ role.see?(widget_name, *args)
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ require 'action_dispatch/testing/integration'
2
+
3
+ require 'dill/rails/role'
4
+ require 'dill'
5
+ require 'dill/role'
@@ -0,0 +1,9 @@
1
+ module Dill
2
+ module Rails
3
+ class Role < ActionDispatch::IntegrationTest
4
+ def initialize
5
+ super self.class.name
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ module Dill
2
+ class Role < Dill::Rails::Role
3
+ extend Widgets::DSL
4
+
5
+ include Dill::DSL
6
+
7
+ def see?(name, *args)
8
+ if respond_to?("see_#{name}?")
9
+ send("see_#{name}?", *args)
10
+ else
11
+ widget?(name, *args)
12
+ end
13
+ end
14
+
15
+ def inspect
16
+ self.class.name
17
+ end
18
+ end
19
+ end
@@ -1,3 +1,3 @@
1
1
  module Dill
2
- VERSION = '0.6.0'
2
+ VERSION = '0.7.0'
3
3
  end
@@ -6,28 +6,30 @@
6
6
  module Dill
7
7
  module Constructors
8
8
  def Widget(*selector, &block)
9
- WidgetClass.new(selector.flatten, &block)
9
+ if block_given?
10
+ WidgetClass.new(selector.flatten) do
11
+ define_method :value do
12
+ block.call(text)
13
+ end
14
+ end
15
+ else
16
+ WidgetClass.new(selector.flatten)
17
+ end
10
18
  end
11
19
 
12
20
  alias_method :String, :Widget
13
21
 
14
22
  def Integer(*selector)
15
- Widget(selector) do
16
- def value
17
- Integer(text)
18
- end
19
- end
23
+ Widget(selector) { |text| Kernel::Integer(text) }
20
24
  end
21
25
 
22
26
  require 'bigdecimal'
23
27
 
24
28
  def Decimal(*selector)
25
- Widget(selector) do
26
- def value
27
- # ensure we can convert to float first
28
- Float(text) && BigDecimal.new(text)
29
- end
30
- end
29
+ Widget(selector) { |text|
30
+ # ensure we can convert to float first
31
+ Float(text) && BigDecimal.new(text)
32
+ }
31
33
  end
32
34
  end
33
35
 
@@ -39,9 +41,11 @@ module Dill::WidgetParts; end
39
41
  require 'dill/widgets/parts/struct'
40
42
  require 'dill/widgets/parts/container'
41
43
 
44
+ require 'dill/widgets/dsl'
42
45
  require 'dill/widgets/widget_class'
43
46
  require 'dill/widgets/widget_name'
44
47
  require 'dill/widgets/widget'
48
+ require 'dill/widgets/widget/node_filter'
45
49
  require 'dill/widgets/list_item'
46
50
  require 'dill/widgets/list'
47
51
  require 'dill/widgets/base_table'
@@ -0,0 +1,47 @@
1
+ module Dill
2
+ module Widgets
3
+ module DSL
4
+ # Declares a new form widget.
5
+ #
6
+ # See features/role.feature.
7
+ def form(name, *rest, &block)
8
+ widget name, *rest, Dill::Form, &block
9
+ end
10
+
11
+ # Declares a new list widget.
12
+ #
13
+ # See features/roles/list.feature.
14
+ def list(name, *rest, &block)
15
+ widget name, *rest, Dill::List, &block
16
+ end
17
+
18
+ # Declares a new child widget.
19
+ #
20
+ # See https://github.com/mojotech/dill/blob/master/features/roles/widget.feature
21
+ def widget(name, selector_or_parent, parent = Widget, &block)
22
+ raise ArgumentError, "`#{name}' is a reserved name" \
23
+ if WidgetParts::Container.instance_methods.include?(name.to_sym)
24
+
25
+ case selector_or_parent
26
+ when String, Array, Proc
27
+ selector, type = selector_or_parent, parent
28
+ when Class
29
+ selector, type = selector_or_parent.selector, selector_or_parent
30
+ else
31
+ raise ArgumentError, "wrong number of arguments (#{rest.size} for 1)"
32
+ end
33
+
34
+ raise TypeError, "can't convert `#{type}' to Widget" \
35
+ unless type.methods.include?(:selector)
36
+
37
+ raise ArgumentError, "missing selector" unless selector || type.selector
38
+
39
+ child = WidgetClass.new(selector, type, &block)
40
+
41
+ const_set(Dill::WidgetName.new(name).to_sym, child)
42
+
43
+ child
44
+ end
45
+ end
46
+ end
47
+ end
@@ -1,12 +1,8 @@
1
1
  module Dill
2
2
  # A form field.
3
3
  class Field < Widget
4
- def self.find_in(parent)
5
- new { parent.root.find_field(*selector) }
6
- end
7
-
8
- def self.present_in?(parent)
9
- parent.root.has_field?(*selector)
4
+ def self.root(*selector)
5
+ @filter = NodeFilter.new([:field] + selector)
10
6
  end
11
7
 
12
8
  # @return This field's value.
@@ -1,5 +1,7 @@
1
1
  module Dill
2
2
  class Form < FieldGroup
3
+ root 'form'
4
+
3
5
  action :submit, '[type = submit]'
4
6
 
5
7
  # Submit form with +attributes+.
@@ -64,9 +64,9 @@ module Dill
64
64
  # parent and child selectors.
65
65
  #
66
66
  # <div id="not-a-list-colors">
67
- # <div class=".child">Red</div>
68
- # <div class=".child">Green</div>
69
- # <div class=".child">Blue</div>
67
+ # <div class="child">Red</div>
68
+ # <div class="child">Green</div>
69
+ # <div class="child">Blue</div>
70
70
  # </div>
71
71
  #
72
72
  # You can define the following widget:
@@ -80,6 +80,8 @@ module Dill
80
80
 
81
81
  def_delegators :items, :each, :first, :last
82
82
 
83
+ root 'ul' unless filter?
84
+
83
85
  class << self
84
86
  # Configures the List item selector and class.
85
87
  #
@@ -140,16 +142,6 @@ module Dill
140
142
  def item_factory
141
143
  @item_factory ||= WidgetClass.new('li', ListItem)
142
144
  end
143
-
144
- def selector
145
- begin
146
- super
147
- rescue Widget::MissingSelector
148
- root 'ul'
149
-
150
- super
151
- end
152
- end
153
145
  end
154
146
 
155
147
  def count
@@ -197,12 +189,12 @@ module Dill
197
189
  item_factory.new(node)
198
190
  end
199
191
 
200
- def item_selector
201
- item_factory.selector
192
+ def item_filter
193
+ item_factory.filter
202
194
  end
203
195
 
204
196
  def items
205
- root.all(*item_selector).map { |node| item_for(node) }
197
+ item_filter.nodes(self).map { |node| item_for(node) }
206
198
  end
207
199
  end
208
200
  end
@@ -9,10 +9,16 @@ module Dill
9
9
  widget(name, *args).present?
10
10
  end
11
11
 
12
+ alias_method :widget?, :has_widget?
13
+
12
14
  def widget(name, *args)
13
15
  widget_class(name).find_in(self, *args)
14
16
  end
15
17
 
18
+ def widgets(name, *args)
19
+ widget_class(name).find_all_in(self, *args)
20
+ end
21
+
16
22
  private
17
23
 
18
24
  attr_writer :widget_lookup_scope
@@ -12,9 +12,13 @@ module Dill
12
12
  #
13
13
  # You may pass in the option text or value.
14
14
  def set(option)
15
- root.
16
- find(:xpath, "option[@value = '#{option}' or . = '#{option}']").
17
- select_option
15
+ root.find(:option, option).select_option
16
+ rescue
17
+ begin
18
+ root.find("option[value = #{option.inspect}]").select_option
19
+ rescue Capybara::ElementNotFound => e
20
+ raise wrap_exception(e, InvalidOption)
21
+ end
18
22
  end
19
23
 
20
24
  # @!method to_s
@@ -1,6 +1,7 @@
1
1
  module Dill
2
2
  class Widget
3
3
  extend Forwardable
4
+ extend Widgets::DSL
4
5
 
5
6
  include WidgetParts::Struct
6
7
  include WidgetParts::Container
@@ -42,110 +43,18 @@ module Dill
42
43
  #
43
44
  # @param name the name of the action
44
45
  # @param selector the selector for the widget that will be clicked
45
- def self.action(name, selector)
46
- wname = :"#{name}_widget"
46
+ def self.action(name, selector = nil)
47
+ block = if selector
48
+ wname = :"#{name}_widget"
47
49
 
48
- widget wname, selector
50
+ widget wname, selector
49
51
 
50
- define_method name do
51
- widget(wname).click
52
+ -> { widget(wname).click; self }
53
+ else
54
+ -> { click; self }
55
+ end
52
56
 
53
- self
54
- end
55
- end
56
-
57
- # Declares a new child widget.
58
- #
59
- # Child widgets are accessible inside the container widget using the
60
- # {#widget} message, or by sending a message +name+. They
61
- # are automatically scoped to the parent widget's root node.
62
- #
63
- # @example Defining a widget
64
- # # Given the following HTML:
65
- # #
66
- # # <div id="root">
67
- # # <span id="child">Child</span>
68
- # # </div>
69
- # class Container < Dill::Widget
70
- # root '#root'
71
- #
72
- # widget :my_widget, '#child'
73
- # end
74
- #
75
- # container = widget(:container)
76
- #
77
- # # accessing using #widget
78
- # my_widget = container.widget(:my_widget)
79
- #
80
- # # accessing using #my_widget
81
- # my_widget = container.my_widget
82
- #
83
- # @overload widget(name, selector, type = Widget)
84
- #
85
- # The most common form, it allows you to pass in a selector as well as a
86
- # type for the child widget. The selector will override +type+'s
87
- # root selector, if +type+ has one defined.
88
- #
89
- # @param name the child widget's name.
90
- # @param selector the child widget's selector. You can pass either a
91
- # String or, if you want to use a composite selector, an Array.
92
- # @param type the child widget's parent class.
93
- #
94
- # @overload widget(name, type)
95
- #
96
- # This form allows you to omit +selector+ from the arguments. It will
97
- # reuse +type+'s root selector.
98
- #
99
- # @param name the child widget's name.
100
- # @param type the child widget's parent class.
101
- #
102
- # @raise ArgumentError if +type+ has no root selector defined.
103
- #
104
- # @yield A block allowing you to further customize the widget behavior.
105
- #
106
- # @see #widget
107
- def self.widget(name, *rest, &block)
108
- raise ArgumentError, "`#{name}' is a reserved name" \
109
- if WidgetParts::Container.instance_methods.include?(name.to_sym)
110
-
111
- case rest.first
112
- when Class
113
- arg_count = rest.size + 1
114
- raise ArgumentError, "wrong number of arguments (#{arg_count} for 2)" \
115
- unless arg_count == 2
116
-
117
- type = rest.first
118
- raise TypeError, "can't convert `#{type}' to Widget" \
119
- unless type.methods.include?(:selector)
120
- raise ArgumentError, "missing root selector for `#{type}'" \
121
- unless type.selector
122
-
123
- selector = type.selector
124
- when String, Array, Proc
125
- arg_count = rest.size + 1
126
-
127
- case arg_count
128
- when 0, 1
129
- raise ArgumentError, "wrong number of arguments (#{arg_count} for 2)"
130
- when 2
131
- selector, type = [*rest, Widget]
132
- when 3
133
- selector, type = rest
134
-
135
- raise TypeError, "can't convert `#{type}' to Widget" \
136
- unless Class === type
137
- else
138
- raise ArgumentError, "wrong number of arguments (#{arg_count} for 3)"
139
- end
140
- else
141
- raise ArgumentError, "unknown method signature: #{rest.inspect}"
142
- end
143
-
144
- child = WidgetClass.new(selector, type, &block)
145
-
146
- const_set(Dill::WidgetName.new(name).to_sym, child)
147
-
148
- child
57
+ define_method name, &block
149
58
  end
150
59
 
151
60
  # Creates a delegator for one child widget message.
@@ -181,7 +90,11 @@ module Dill
181
90
  #
182
91
  # @raise [Capybara::ElementNotFoundError] if the widget can't be found
183
92
  def self.find_in(parent, *args)
184
- new { parent.root.find(*selector(*args)) }
93
+ new(filter.query(parent, *args))
94
+ end
95
+
96
+ def self.find_all_in(parent, *args)
97
+ filter.nodes(parent, *args).map { |e| new(e) }
185
98
  end
186
99
 
187
100
  # Determines if an instance of this widget class exists in
@@ -248,30 +161,28 @@ module Dill
248
161
  # root :xpath, '//some/node'
249
162
  # end
250
163
  def self.root(*selector, &block)
251
- @selector = block ? [block] : selector.flatten
164
+ @filter = NodeFilter.new(block || selector)
252
165
  end
253
166
 
254
167
  class MissingSelector < StandardError
255
168
  end
256
169
 
257
- # Returns the selector specified with +root+.
258
- def self.selector(*args)
259
- if @selector
260
- fst = @selector.first
170
+ def self.filter
171
+ @filter || superclass.filter
172
+ rescue NoMethodError
173
+ raise MissingSelector, 'no selector defined'
174
+ end
261
175
 
262
- fst.respond_to?(:call) ? fst.call(*args) : @selector
263
- else
264
- if superclass.respond_to?(:selector)
265
- superclass.selector
266
- else
267
- raise MissingSelector, 'no selector defined'
268
- end
269
- end
176
+ def self.filter?
177
+ filter rescue false
270
178
  end
271
179
 
272
- def initialize(node = nil, &query)
273
- self.node = node
274
- self.query = query
180
+ def self.selector
181
+ filter.selector
182
+ end
183
+
184
+ def initialize(node)
185
+ self.query = node.respond_to?(:call) ? node : -> { node }
275
186
  end
276
187
 
277
188
  # Alias for #gone?
@@ -345,6 +256,14 @@ module Dill
345
256
  has_widget?(:"#{name}_widget")
346
257
  end
347
258
 
259
+ def id
260
+ root['id']
261
+ end
262
+
263
+ def classes
264
+ root['class'].split
265
+ end
266
+
348
267
  def inspect
349
268
  inspection = "<!-- #{self.class.name}: -->\n"
350
269
 
@@ -355,7 +274,7 @@ module Dill
355
274
  inspection << Nokogiri::XML(xml, &:noblanks).to_xhtml
356
275
  rescue Capybara::NotSupportedByDriverError
357
276
  inspection << "<#{root.tag_name}>\n#{to_s}"
358
- rescue Capybara::ElementNotFound, *page.driver.invalid_element_errors
277
+ rescue Dill::MissingWidget, *page.driver.invalid_element_errors
359
278
  "#<DETACHED>"
360
279
  end
361
280
  end
@@ -366,7 +285,11 @@ module Dill
366
285
  end
367
286
 
368
287
  def root
369
- node || query.()
288
+ query.()
289
+ rescue Capybara::Ambiguous => e
290
+ raise wrap_exception(e, AmbiguousWidget)
291
+ rescue Capybara::ElementNotFound => e
292
+ raise wrap_exception(e, MissingWidget)
370
293
  end
371
294
 
372
295
  def text
@@ -400,5 +323,9 @@ module Dill
400
323
  def page
401
324
  Capybara.current_session
402
325
  end
326
+
327
+ def wrap_exception(e, wrapper_class)
328
+ wrapper_class.new(e.message).tap { |x| x.set_backtrace e.backtrace }
329
+ end
403
330
  end
404
331
  end
@@ -0,0 +1,35 @@
1
+ module Dill
2
+ class Widget
3
+ class NodeFilter
4
+ attr_reader :selector
5
+
6
+ def initialize(*selector)
7
+ @selector = selector.flatten
8
+ end
9
+
10
+ def node(parent_widget, *args)
11
+ parent_widget.root.find(*capybara_selector(*args))
12
+ end
13
+
14
+ def nodes(parent_widget, *args)
15
+ parent_widget.root.all(*capybara_selector(*args))
16
+ end
17
+
18
+ def query(parent, *args)
19
+ -> { node(parent, *args) }
20
+ end
21
+
22
+ private
23
+
24
+ def capybara_selector(*args)
25
+ # TODO detect signature errors (e.g., passing a different arity than the
26
+ # one required by the selector proc, etc)
27
+ if @selector.first.respond_to?(:call)
28
+ @selector.first.call(*args)
29
+ else
30
+ @selector
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
metadata CHANGED
@@ -1,160 +1,183 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dill
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.6.0
4
+ version: 0.7.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - David Leal
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-12-29 00:00:00.000000000 Z
11
+ date: 2014-09-02 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
- version_requirements: !ruby/object:Gem::Requirement
14
+ name: chronic
15
+ requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
- none: false
21
- name: chronic
22
20
  type: :runtime
23
21
  prerelease: false
24
- requirement: !ruby/object:Gem::Requirement
22
+ version_requirements: !ruby/object:Gem::Requirement
25
23
  requirements:
26
- - - ! '>='
24
+ - - '>='
27
25
  - !ruby/object:Gem::Version
28
26
  version: '0'
29
- none: false
30
27
  - !ruby/object:Gem::Dependency
31
- version_requirements: !ruby/object:Gem::Requirement
28
+ name: capybara
29
+ requirement: !ruby/object:Gem::Requirement
32
30
  requirements:
33
- - - ! '>='
31
+ - - '>='
34
32
  - !ruby/object:Gem::Version
35
33
  version: '2.0'
36
- none: false
37
- name: capybara
38
34
  type: :runtime
39
35
  prerelease: false
40
- requirement: !ruby/object:Gem::Requirement
36
+ version_requirements: !ruby/object:Gem::Requirement
41
37
  requirements:
42
- - - ! '>='
38
+ - - '>='
43
39
  - !ruby/object:Gem::Version
44
40
  version: '2.0'
45
- none: false
46
41
  - !ruby/object:Gem::Dependency
47
- version_requirements: !ruby/object:Gem::Requirement
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
48
44
  requirements:
49
- - - ~>
45
+ - - <
50
46
  - !ruby/object:Gem::Version
51
47
  version: 3.0.0
52
- none: false
53
- name: rspec-given
54
- type: :development
48
+ type: :runtime
55
49
  prerelease: false
56
- requirement: !ruby/object:Gem::Requirement
50
+ version_requirements: !ruby/object:Gem::Requirement
57
51
  requirements:
58
- - - ~>
52
+ - - <
59
53
  - !ruby/object:Gem::Version
60
54
  version: 3.0.0
61
- none: false
62
55
  - !ruby/object:Gem::Dependency
63
- version_requirements: !ruby/object:Gem::Requirement
56
+ name: rspec-given
57
+ requirement: !ruby/object:Gem::Requirement
64
58
  requirements:
65
- - - ! '>='
59
+ - - ~>
66
60
  - !ruby/object:Gem::Version
67
- version: '0'
68
- none: false
69
- name: sinatra
61
+ version: 3.0.0
70
62
  type: :development
71
63
  prerelease: false
72
- requirement: !ruby/object:Gem::Requirement
64
+ version_requirements: !ruby/object:Gem::Requirement
73
65
  requirements:
74
- - - ! '>='
66
+ - - ~>
75
67
  - !ruby/object:Gem::Version
76
- version: '0'
77
- none: false
68
+ version: 3.0.0
78
69
  - !ruby/object:Gem::Dependency
79
- version_requirements: !ruby/object:Gem::Requirement
70
+ name: capybara-webkit
71
+ requirement: !ruby/object:Gem::Requirement
80
72
  requirements:
81
73
  - - ~>
82
74
  - !ruby/object:Gem::Version
83
75
  version: 1.0.0
84
- none: false
85
- name: capybara-webkit
86
76
  type: :development
87
77
  prerelease: false
88
- requirement: !ruby/object:Gem::Requirement
78
+ version_requirements: !ruby/object:Gem::Requirement
89
79
  requirements:
90
80
  - - ~>
91
81
  - !ruby/object:Gem::Version
92
82
  version: 1.0.0
93
- none: false
94
83
  - !ruby/object:Gem::Dependency
95
- version_requirements: !ruby/object:Gem::Requirement
84
+ name: poltergeist
85
+ requirement: !ruby/object:Gem::Requirement
96
86
  requirements:
97
87
  - - ~>
98
88
  - !ruby/object:Gem::Version
99
89
  version: 1.3.0
100
- none: false
101
- name: poltergeist
102
90
  type: :development
103
91
  prerelease: false
104
- requirement: !ruby/object:Gem::Requirement
92
+ version_requirements: !ruby/object:Gem::Requirement
105
93
  requirements:
106
94
  - - ~>
107
95
  - !ruby/object:Gem::Version
108
96
  version: 1.3.0
109
- none: false
110
97
  - !ruby/object:Gem::Dependency
111
- version_requirements: !ruby/object:Gem::Requirement
98
+ name: cucumber
99
+ requirement: !ruby/object:Gem::Requirement
112
100
  requirements:
113
101
  - - ~>
114
102
  - !ruby/object:Gem::Version
115
103
  version: 1.3.0
116
- none: false
117
- name: cucumber
118
104
  type: :development
119
105
  prerelease: false
120
- requirement: !ruby/object:Gem::Requirement
106
+ version_requirements: !ruby/object:Gem::Requirement
121
107
  requirements:
122
108
  - - ~>
123
109
  - !ruby/object:Gem::Version
124
110
  version: 1.3.0
125
- none: false
126
111
  - !ruby/object:Gem::Dependency
127
- version_requirements: !ruby/object:Gem::Requirement
112
+ name: pry
113
+ requirement: !ruby/object:Gem::Requirement
128
114
  requirements:
129
- - - ! '>='
115
+ - - '>='
130
116
  - !ruby/object:Gem::Version
131
117
  version: '0'
132
- none: false
133
- name: pry
134
118
  type: :development
135
119
  prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: pry-nav
136
127
  requirement: !ruby/object:Gem::Requirement
137
128
  requirements:
138
- - - ! '>='
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
139
137
  - !ruby/object:Gem::Version
140
138
  version: '0'
141
- none: false
142
139
  - !ruby/object:Gem::Dependency
140
+ name: sinatra
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
143
148
  version_requirements: !ruby/object:Gem::Requirement
144
149
  requirements:
145
- - - ! '>='
150
+ - - '>='
146
151
  - !ruby/object:Gem::Version
147
152
  version: '0'
148
- none: false
149
- name: pry-nav
153
+ - !ruby/object:Gem::Dependency
154
+ name: rails
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ~>
158
+ - !ruby/object:Gem::Version
159
+ version: 4.0.0
150
160
  type: :development
151
161
  prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ~>
165
+ - !ruby/object:Gem::Version
166
+ version: 4.0.0
167
+ - !ruby/object:Gem::Dependency
168
+ name: codeclimate-test-reporter
152
169
  requirement: !ruby/object:Gem::Requirement
153
170
  requirements:
154
- - - ! '>='
171
+ - - '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - '>='
155
179
  - !ruby/object:Gem::Version
156
180
  version: '0'
157
- none: false
158
181
  description: See https://github.com/mojotech/dill/README.md
159
182
  email:
160
183
  - dleal@mojotech.com
@@ -169,6 +192,10 @@ files:
169
192
  - lib/dill/cucumber.rb
170
193
  - lib/dill/dsl.rb
171
194
  - lib/dill/instance_conversions.rb
195
+ - lib/dill/matchers.rb
196
+ - lib/dill/rails.rb
197
+ - lib/dill/rails/role.rb
198
+ - lib/dill/role.rb
172
199
  - lib/dill/text_table.rb
173
200
  - lib/dill/text_table/cell_text.rb
174
201
  - lib/dill/text_table/mapping.rb
@@ -180,6 +207,7 @@ files:
180
207
  - lib/dill/widgets/base_table.rb
181
208
  - lib/dill/widgets/check_box.rb
182
209
  - lib/dill/widgets/document.rb
210
+ - lib/dill/widgets/dsl.rb
183
211
  - lib/dill/widgets/field.rb
184
212
  - lib/dill/widgets/field_group.rb
185
213
  - lib/dill/widgets/form.rb
@@ -191,32 +219,32 @@ files:
191
219
  - lib/dill/widgets/table.rb
192
220
  - lib/dill/widgets/text_field.rb
193
221
  - lib/dill/widgets/widget.rb
222
+ - lib/dill/widgets/widget/node_filter.rb
194
223
  - lib/dill/widgets/widget_class.rb
195
224
  - lib/dill/widgets/widget_name.rb
196
225
  homepage: https://github.com/mojotech/dill
197
226
  licenses:
198
227
  - MIT
228
+ metadata: {}
199
229
  post_install_message:
200
230
  rdoc_options: []
201
231
  require_paths:
202
232
  - lib
203
233
  required_ruby_version: !ruby/object:Gem::Requirement
204
234
  requirements:
205
- - - ! '>='
235
+ - - '>='
206
236
  - !ruby/object:Gem::Version
207
237
  version: '0'
208
- none: false
209
238
  required_rubygems_version: !ruby/object:Gem::Requirement
210
239
  requirements:
211
- - - ! '>='
240
+ - - '>='
212
241
  - !ruby/object:Gem::Version
213
242
  version: '0'
214
- none: false
215
243
  requirements: []
216
- rubyforge_project: ! '[none]'
217
- rubygems_version: 1.8.23
244
+ rubyforge_project: '[none]'
245
+ rubygems_version: 2.2.1
218
246
  signing_key:
219
- specification_version: 3
247
+ specification_version: 4
220
248
  summary: A set of helpers to ease integration testing
221
249
  test_files: []
222
250
  has_rdoc: