capybara-ui 0.10.0 → 1.0.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.
- checksums.yaml +4 -4
- data/lib/capybara/ui.rb +33 -0
- data/lib/capybara/ui/assertions.rb +21 -0
- data/lib/{capybara-ui → capybara/ui}/capybara.rb +0 -0
- data/lib/capybara/ui/checkpoint.rb +113 -0
- data/lib/capybara/ui/conversions.rb +33 -0
- data/lib/capybara/ui/cucumber.rb +5 -0
- data/lib/capybara/ui/dsl.rb +109 -0
- data/lib/capybara/ui/instance_conversions.rb +21 -0
- data/lib/{capybara-ui → capybara/ui}/matchers.rb +4 -4
- data/lib/capybara/ui/optional_dependencies.rb +7 -0
- data/lib/capybara/ui/rails.rb +5 -0
- data/lib/capybara/ui/rails/role.rb +11 -0
- data/lib/capybara/ui/role.rb +21 -0
- data/lib/capybara/ui/text_table.rb +109 -0
- data/lib/capybara/ui/text_table/cell_text.rb +9 -0
- data/lib/capybara/ui/text_table/mapping.rb +42 -0
- data/lib/capybara/ui/text_table/transformations.rb +15 -0
- data/lib/capybara/ui/text_table/void_mapping.rb +10 -0
- data/lib/capybara/ui/version.rb +5 -0
- data/lib/capybara/ui/widgets.rb +63 -0
- data/lib/capybara/ui/widgets/check_box.rb +28 -0
- data/lib/capybara/ui/widgets/cucumber_methods.rb +75 -0
- data/lib/capybara/ui/widgets/document.rb +21 -0
- data/lib/capybara/ui/widgets/dsl.rb +49 -0
- data/lib/capybara/ui/widgets/field.rb +24 -0
- data/lib/capybara/ui/widgets/field_group.rb +331 -0
- data/lib/capybara/ui/widgets/form.rb +28 -0
- data/lib/capybara/ui/widgets/list.rb +202 -0
- data/lib/capybara/ui/widgets/list_item.rb +24 -0
- data/lib/capybara/ui/widgets/parts/container.rb +48 -0
- data/lib/capybara/ui/widgets/parts/struct.rb +119 -0
- data/lib/capybara/ui/widgets/radio_button.rb +64 -0
- data/lib/capybara/ui/widgets/select.rb +59 -0
- data/lib/capybara/ui/widgets/string_value.rb +45 -0
- data/lib/capybara/ui/widgets/table.rb +78 -0
- data/lib/capybara/ui/widgets/text_field.rb +29 -0
- data/lib/capybara/ui/widgets/widget.rb +394 -0
- data/lib/capybara/ui/widgets/widget/node_filter.rb +50 -0
- data/lib/capybara/ui/widgets/widget_class.rb +13 -0
- data/lib/capybara/ui/widgets/widget_name.rb +58 -0
- metadata +47 -43
- data/lib/capybara-ui.rb +0 -31
- data/lib/capybara-ui/assertions.rb +0 -19
- data/lib/capybara-ui/checkpoint.rb +0 -111
- data/lib/capybara-ui/conversions.rb +0 -31
- data/lib/capybara-ui/cucumber.rb +0 -5
- data/lib/capybara-ui/dsl.rb +0 -107
- data/lib/capybara-ui/instance_conversions.rb +0 -19
- data/lib/capybara-ui/optional_dependencies.rb +0 -5
- data/lib/capybara-ui/rails.rb +0 -5
- data/lib/capybara-ui/rails/role.rb +0 -9
- data/lib/capybara-ui/role.rb +0 -19
- data/lib/capybara-ui/text_table.rb +0 -107
- data/lib/capybara-ui/text_table/cell_text.rb +0 -7
- data/lib/capybara-ui/text_table/mapping.rb +0 -40
- data/lib/capybara-ui/text_table/transformations.rb +0 -13
- data/lib/capybara-ui/text_table/void_mapping.rb +0 -8
- data/lib/capybara-ui/version.rb +0 -3
- data/lib/capybara-ui/widgets.rb +0 -61
- data/lib/capybara-ui/widgets/check_box.rb +0 -26
- data/lib/capybara-ui/widgets/cucumber_methods.rb +0 -73
- data/lib/capybara-ui/widgets/document.rb +0 -19
- data/lib/capybara-ui/widgets/dsl.rb +0 -47
- data/lib/capybara-ui/widgets/field.rb +0 -22
- data/lib/capybara-ui/widgets/field_group.rb +0 -329
- data/lib/capybara-ui/widgets/form.rb +0 -26
- data/lib/capybara-ui/widgets/list.rb +0 -200
- data/lib/capybara-ui/widgets/list_item.rb +0 -22
- data/lib/capybara-ui/widgets/parts/container.rb +0 -46
- data/lib/capybara-ui/widgets/parts/struct.rb +0 -117
- data/lib/capybara-ui/widgets/radio_button.rb +0 -62
- data/lib/capybara-ui/widgets/select.rb +0 -57
- data/lib/capybara-ui/widgets/string_value.rb +0 -43
- data/lib/capybara-ui/widgets/table.rb +0 -76
- data/lib/capybara-ui/widgets/text_field.rb +0 -27
- data/lib/capybara-ui/widgets/widget.rb +0 -392
- data/lib/capybara-ui/widgets/widget/node_filter.rb +0 -48
- data/lib/capybara-ui/widgets/widget_class.rb +0 -11
- data/lib/capybara-ui/widgets/widget_name.rb +0 -56
@@ -0,0 +1,50 @@
|
|
1
|
+
module Capybara
|
2
|
+
module UI
|
3
|
+
class Widget
|
4
|
+
class NodeFilter
|
5
|
+
attr_reader :selector
|
6
|
+
|
7
|
+
def initialize(*selector)
|
8
|
+
@selector = selector.flatten
|
9
|
+
end
|
10
|
+
|
11
|
+
def node(parent_widget, *args)
|
12
|
+
parent_widget.root.find(*capybara_selector(*args))
|
13
|
+
end
|
14
|
+
|
15
|
+
def node?(parent_widget, *args)
|
16
|
+
parent_widget.root.has_selector?(*capybara_selector(*args))
|
17
|
+
end
|
18
|
+
|
19
|
+
def nodeless?(parent_widget, *args)
|
20
|
+
parent_widget.root.has_no_selector?(*capybara_selector(*args))
|
21
|
+
end
|
22
|
+
|
23
|
+
def nodes(parent_widget, *args)
|
24
|
+
parent_widget.root.all(*capybara_selector(*args))
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def capybara_selector(*args)
|
30
|
+
# TODO detect signature errors (e.g., passing a different arity than the
|
31
|
+
# one required by the selector proc, etc)
|
32
|
+
selector = if @selector.first.respond_to?(:call)
|
33
|
+
@selector.first.call(*args)
|
34
|
+
else
|
35
|
+
@selector
|
36
|
+
end
|
37
|
+
selector = Array(selector).flatten
|
38
|
+
|
39
|
+
defaults = {:wait => 0}
|
40
|
+
|
41
|
+
if Hash === selector.last
|
42
|
+
selector + [defaults.merge(selector.pop)]
|
43
|
+
else
|
44
|
+
selector + [defaults]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Capybara
|
2
|
+
module UI
|
3
|
+
# The name of a widget in a format-independent representation.
|
4
|
+
class WidgetName < String
|
5
|
+
CAMEL_CASE_FORMAT = /\A([A-Z][a-z]*)+\Z/
|
6
|
+
SNAKE_CASE_FORMAT = /\A\w+\Z/
|
7
|
+
|
8
|
+
# Constructs the widget name.
|
9
|
+
#
|
10
|
+
# @param name [String, Symbol] the name of the widget in primitive form
|
11
|
+
def initialize(name)
|
12
|
+
@name = name
|
13
|
+
@canonical = canonical(@name)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Returns the class for this widget name, in the given scope.
|
17
|
+
def to_class(scope = Object)
|
18
|
+
const = scope.const_get(@canonical)
|
19
|
+
|
20
|
+
raise TypeError, "`#{@canonical}' is not a widget in this scope" \
|
21
|
+
unless const < Widget
|
22
|
+
|
23
|
+
const
|
24
|
+
rescue NameError
|
25
|
+
raise Missing, "couldn't find `#{@name}' widget in this scope"
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_sym
|
29
|
+
@canonical.to_sym
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def canonical(name)
|
35
|
+
str = name.to_s
|
36
|
+
|
37
|
+
case str
|
38
|
+
when SNAKE_CASE_FORMAT
|
39
|
+
camel_case_from_snake_case(str)
|
40
|
+
when CAMEL_CASE_FORMAT
|
41
|
+
str
|
42
|
+
else
|
43
|
+
raise ArgumentError, "`#{str.inspect}' is an unrecognized format. Try snake case or camel case."
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def camel_case_from_snake_case(name)
|
48
|
+
capitalize_word = ->(word) { word[0].upcase + word[1..-1] }
|
49
|
+
word_separator = '_'
|
50
|
+
|
51
|
+
name
|
52
|
+
.split(word_separator)
|
53
|
+
.map(&capitalize_word)
|
54
|
+
.join
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capybara-ui
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Leal
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-01-
|
12
|
+
date: 2016-01-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: chronic
|
@@ -165,7 +165,11 @@ dependencies:
|
|
165
165
|
- - ">="
|
166
166
|
- !ruby/object:Gem::Version
|
167
167
|
version: '0'
|
168
|
-
description:
|
168
|
+
description: Capybara-UI (formerly called Dill) is a Capybara abstraction that makes
|
169
|
+
it easy to define reuseable DOM "widgets", aka page objects, and introduces the
|
170
|
+
concept of "roles" to allow you to easily organize your testing methods and widgets.
|
171
|
+
Capybara-UI also introduces helpers and syntactic sugar to make your testing even
|
172
|
+
easier.
|
169
173
|
email:
|
170
174
|
- dleal@mojotech.com
|
171
175
|
- ags@mojotech.com
|
@@ -173,46 +177,46 @@ executables: []
|
|
173
177
|
extensions: []
|
174
178
|
extra_rdoc_files: []
|
175
179
|
files:
|
176
|
-
- lib/capybara
|
177
|
-
- lib/capybara
|
178
|
-
- lib/capybara
|
179
|
-
- lib/capybara
|
180
|
-
- lib/capybara
|
181
|
-
- lib/capybara
|
182
|
-
- lib/capybara
|
183
|
-
- lib/capybara
|
184
|
-
- lib/capybara
|
185
|
-
- lib/capybara
|
186
|
-
- lib/capybara
|
187
|
-
- lib/capybara
|
188
|
-
- lib/capybara
|
189
|
-
- lib/capybara
|
190
|
-
- lib/capybara
|
191
|
-
- lib/capybara
|
192
|
-
- lib/capybara
|
193
|
-
- lib/capybara
|
194
|
-
- lib/capybara
|
195
|
-
- lib/capybara
|
196
|
-
- lib/capybara
|
197
|
-
- lib/capybara
|
198
|
-
- lib/capybara
|
199
|
-
- lib/capybara
|
200
|
-
- lib/capybara
|
201
|
-
- lib/capybara
|
202
|
-
- lib/capybara
|
203
|
-
- lib/capybara
|
204
|
-
- lib/capybara
|
205
|
-
- lib/capybara
|
206
|
-
- lib/capybara
|
207
|
-
- lib/capybara
|
208
|
-
- lib/capybara
|
209
|
-
- lib/capybara
|
210
|
-
- lib/capybara
|
211
|
-
- lib/capybara
|
212
|
-
- lib/capybara
|
213
|
-
- lib/capybara
|
214
|
-
- lib/capybara
|
215
|
-
- lib/capybara
|
180
|
+
- lib/capybara/ui.rb
|
181
|
+
- lib/capybara/ui/assertions.rb
|
182
|
+
- lib/capybara/ui/capybara.rb
|
183
|
+
- lib/capybara/ui/checkpoint.rb
|
184
|
+
- lib/capybara/ui/conversions.rb
|
185
|
+
- lib/capybara/ui/cucumber.rb
|
186
|
+
- lib/capybara/ui/dsl.rb
|
187
|
+
- lib/capybara/ui/instance_conversions.rb
|
188
|
+
- lib/capybara/ui/matchers.rb
|
189
|
+
- lib/capybara/ui/optional_dependencies.rb
|
190
|
+
- lib/capybara/ui/rails.rb
|
191
|
+
- lib/capybara/ui/rails/role.rb
|
192
|
+
- lib/capybara/ui/role.rb
|
193
|
+
- lib/capybara/ui/text_table.rb
|
194
|
+
- lib/capybara/ui/text_table/cell_text.rb
|
195
|
+
- lib/capybara/ui/text_table/mapping.rb
|
196
|
+
- lib/capybara/ui/text_table/transformations.rb
|
197
|
+
- lib/capybara/ui/text_table/void_mapping.rb
|
198
|
+
- lib/capybara/ui/version.rb
|
199
|
+
- lib/capybara/ui/widgets.rb
|
200
|
+
- lib/capybara/ui/widgets/check_box.rb
|
201
|
+
- lib/capybara/ui/widgets/cucumber_methods.rb
|
202
|
+
- lib/capybara/ui/widgets/document.rb
|
203
|
+
- lib/capybara/ui/widgets/dsl.rb
|
204
|
+
- lib/capybara/ui/widgets/field.rb
|
205
|
+
- lib/capybara/ui/widgets/field_group.rb
|
206
|
+
- lib/capybara/ui/widgets/form.rb
|
207
|
+
- lib/capybara/ui/widgets/list.rb
|
208
|
+
- lib/capybara/ui/widgets/list_item.rb
|
209
|
+
- lib/capybara/ui/widgets/parts/container.rb
|
210
|
+
- lib/capybara/ui/widgets/parts/struct.rb
|
211
|
+
- lib/capybara/ui/widgets/radio_button.rb
|
212
|
+
- lib/capybara/ui/widgets/select.rb
|
213
|
+
- lib/capybara/ui/widgets/string_value.rb
|
214
|
+
- lib/capybara/ui/widgets/table.rb
|
215
|
+
- lib/capybara/ui/widgets/text_field.rb
|
216
|
+
- lib/capybara/ui/widgets/widget.rb
|
217
|
+
- lib/capybara/ui/widgets/widget/node_filter.rb
|
218
|
+
- lib/capybara/ui/widgets/widget_class.rb
|
219
|
+
- lib/capybara/ui/widgets/widget_name.rb
|
216
220
|
homepage: https://github.com/mojotech/capybara-ui
|
217
221
|
licenses:
|
218
222
|
- MIT
|
data/lib/capybara-ui.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
require 'chronic'
|
2
|
-
require 'nokogiri'
|
3
|
-
require 'capybara'
|
4
|
-
|
5
|
-
require 'capybara-ui/optional_dependencies'
|
6
|
-
require 'capybara-ui/conversions'
|
7
|
-
require 'capybara-ui/instance_conversions'
|
8
|
-
require 'capybara-ui/checkpoint'
|
9
|
-
require 'capybara-ui/widgets'
|
10
|
-
require 'capybara-ui/text_table'
|
11
|
-
require 'capybara-ui/text_table/mapping'
|
12
|
-
require 'capybara-ui/text_table/void_mapping'
|
13
|
-
require 'capybara-ui/text_table/transformations'
|
14
|
-
require 'capybara-ui/text_table/cell_text'
|
15
|
-
require 'capybara-ui/capybara'
|
16
|
-
require 'capybara-ui/dsl'
|
17
|
-
|
18
|
-
module CapybaraUI
|
19
|
-
# An exception that signals that something is missing.
|
20
|
-
class Missing < StandardError; end
|
21
|
-
class MissingWidget < StandardError; end
|
22
|
-
class AmbiguousWidget < StandardError; end
|
23
|
-
class InvalidOption < StandardError; end
|
24
|
-
class InvalidRadioButton < StandardError; end
|
25
|
-
|
26
|
-
def deprecate(method, alternate_method, once=false)
|
27
|
-
@deprecation_notified ||= {}
|
28
|
-
warn "DEPRECATED: ##{method} is deprecated, please use ##{alternate_method} instead" unless once and @deprecation_notified[method]
|
29
|
-
@deprecation_notified[method] = true
|
30
|
-
end
|
31
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module CapybaraUI
|
2
|
-
module Assertions
|
3
|
-
def assert_visible(role, widget_name, *args)
|
4
|
-
eventually do
|
5
|
-
assert role.see?(widget_name, *args)
|
6
|
-
|
7
|
-
true
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def assert_not_visible(role, widget_name, *args)
|
12
|
-
eventually do
|
13
|
-
refute role.see?(widget_name, *args)
|
14
|
-
|
15
|
-
true
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,111 +0,0 @@
|
|
1
|
-
module CapybaraUI
|
2
|
-
# A point in time where some condition, or some set of conditions, should be
|
3
|
-
# verified.
|
4
|
-
#
|
5
|
-
# @see http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Base#synchronize-instance_method,
|
6
|
-
# which inspired this class.
|
7
|
-
class Checkpoint
|
8
|
-
class ConditionNotMet < StandardError; end
|
9
|
-
|
10
|
-
class << self
|
11
|
-
attr_accessor :rescuable_errors
|
12
|
-
end
|
13
|
-
|
14
|
-
self.rescuable_errors = [StandardError]
|
15
|
-
|
16
|
-
if defined?(RSpec)
|
17
|
-
require 'rspec/expectations'
|
18
|
-
self.rescuable_errors << RSpec::Expectations::ExpectationNotMetError
|
19
|
-
end
|
20
|
-
|
21
|
-
class Timer
|
22
|
-
class Frozen < StandardError; end
|
23
|
-
|
24
|
-
def initialize(duration)
|
25
|
-
@duration = duration
|
26
|
-
end
|
27
|
-
|
28
|
-
attr_reader :duration
|
29
|
-
|
30
|
-
def expired?
|
31
|
-
duration < elapsed
|
32
|
-
end
|
33
|
-
|
34
|
-
def elapsed
|
35
|
-
now - start_time
|
36
|
-
end
|
37
|
-
|
38
|
-
def start
|
39
|
-
@start_time = now
|
40
|
-
end
|
41
|
-
|
42
|
-
def tick
|
43
|
-
sleep tick_duration
|
44
|
-
|
45
|
-
raise Frozen, 'time appears to be frozen' if frozen?
|
46
|
-
end
|
47
|
-
|
48
|
-
protected
|
49
|
-
|
50
|
-
def now
|
51
|
-
Time.now
|
52
|
-
end
|
53
|
-
|
54
|
-
attr_reader :start_time
|
55
|
-
|
56
|
-
def frozen?
|
57
|
-
now == start_time
|
58
|
-
end
|
59
|
-
|
60
|
-
def tick_duration
|
61
|
-
0.05
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
# Shortcut for instance level wait_for.
|
66
|
-
def self.wait_for(wait_time = Capybara.default_max_wait_time, &block)
|
67
|
-
new(wait_time).call(&block)
|
68
|
-
end
|
69
|
-
|
70
|
-
# Initializes a new Checkpoint.
|
71
|
-
#
|
72
|
-
# @param wait_time how long this checkpoint will wait for its conditions to
|
73
|
-
# be met, in seconds.
|
74
|
-
def initialize(wait_time = Capybara.default_max_wait_time)
|
75
|
-
@timer = Timer.new(wait_time)
|
76
|
-
end
|
77
|
-
|
78
|
-
# Executes +block+ repeatedly until it returns a "truthy" value or
|
79
|
-
# +wait_time+ expires.
|
80
|
-
#
|
81
|
-
# Swallows any StandardError or StandardError descendent until +wait_time+
|
82
|
-
# expires. If an exception is raised and the time has expired, that
|
83
|
-
# exception will be raised again.
|
84
|
-
#
|
85
|
-
# If the block does not return a "truthy" value until +wait_time+ expires,
|
86
|
-
# raises a CapybaraUI::Checkpoint::ConditionNotMet error.
|
87
|
-
#
|
88
|
-
# Returns whatever value is returned by the block.
|
89
|
-
def call(&condition)
|
90
|
-
timer.start
|
91
|
-
|
92
|
-
begin
|
93
|
-
yield or raise ConditionNotMet
|
94
|
-
rescue *rescuable_errors
|
95
|
-
raise if timer.expired?
|
96
|
-
|
97
|
-
timer.tick
|
98
|
-
|
99
|
-
retry
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
protected
|
104
|
-
|
105
|
-
def rescuable_errors
|
106
|
-
self.class.rescuable_errors
|
107
|
-
end
|
108
|
-
|
109
|
-
attr_reader :timer
|
110
|
-
end
|
111
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module CapybaraUI
|
2
|
-
module Conversions
|
3
|
-
extend self
|
4
|
-
|
5
|
-
def Boolean(val)
|
6
|
-
case val
|
7
|
-
when 'yes', 'true', true
|
8
|
-
true
|
9
|
-
when 'no', 'false', false, nil, ''
|
10
|
-
false
|
11
|
-
else
|
12
|
-
raise ArgumentError, "can't convert #{val.inspect} to boolean"
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def List(valstr, &block)
|
17
|
-
vs = valstr.strip.split(/\s*,\s*/)
|
18
|
-
|
19
|
-
block ? vs.map(&block) : vs
|
20
|
-
end
|
21
|
-
|
22
|
-
def Timeish(val)
|
23
|
-
raise ArgumentError, "can't convert nil to Timeish" if val.nil?
|
24
|
-
|
25
|
-
return val if Date === val || Time === val || DateTime === val
|
26
|
-
|
27
|
-
Chronic.parse(val) or
|
28
|
-
raise ArgumentError, "can't parse #{val.inspect} to Timeish"
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|