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.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/lib/capybara/ui.rb +33 -0
  3. data/lib/capybara/ui/assertions.rb +21 -0
  4. data/lib/{capybara-ui → capybara/ui}/capybara.rb +0 -0
  5. data/lib/capybara/ui/checkpoint.rb +113 -0
  6. data/lib/capybara/ui/conversions.rb +33 -0
  7. data/lib/capybara/ui/cucumber.rb +5 -0
  8. data/lib/capybara/ui/dsl.rb +109 -0
  9. data/lib/capybara/ui/instance_conversions.rb +21 -0
  10. data/lib/{capybara-ui → capybara/ui}/matchers.rb +4 -4
  11. data/lib/capybara/ui/optional_dependencies.rb +7 -0
  12. data/lib/capybara/ui/rails.rb +5 -0
  13. data/lib/capybara/ui/rails/role.rb +11 -0
  14. data/lib/capybara/ui/role.rb +21 -0
  15. data/lib/capybara/ui/text_table.rb +109 -0
  16. data/lib/capybara/ui/text_table/cell_text.rb +9 -0
  17. data/lib/capybara/ui/text_table/mapping.rb +42 -0
  18. data/lib/capybara/ui/text_table/transformations.rb +15 -0
  19. data/lib/capybara/ui/text_table/void_mapping.rb +10 -0
  20. data/lib/capybara/ui/version.rb +5 -0
  21. data/lib/capybara/ui/widgets.rb +63 -0
  22. data/lib/capybara/ui/widgets/check_box.rb +28 -0
  23. data/lib/capybara/ui/widgets/cucumber_methods.rb +75 -0
  24. data/lib/capybara/ui/widgets/document.rb +21 -0
  25. data/lib/capybara/ui/widgets/dsl.rb +49 -0
  26. data/lib/capybara/ui/widgets/field.rb +24 -0
  27. data/lib/capybara/ui/widgets/field_group.rb +331 -0
  28. data/lib/capybara/ui/widgets/form.rb +28 -0
  29. data/lib/capybara/ui/widgets/list.rb +202 -0
  30. data/lib/capybara/ui/widgets/list_item.rb +24 -0
  31. data/lib/capybara/ui/widgets/parts/container.rb +48 -0
  32. data/lib/capybara/ui/widgets/parts/struct.rb +119 -0
  33. data/lib/capybara/ui/widgets/radio_button.rb +64 -0
  34. data/lib/capybara/ui/widgets/select.rb +59 -0
  35. data/lib/capybara/ui/widgets/string_value.rb +45 -0
  36. data/lib/capybara/ui/widgets/table.rb +78 -0
  37. data/lib/capybara/ui/widgets/text_field.rb +29 -0
  38. data/lib/capybara/ui/widgets/widget.rb +394 -0
  39. data/lib/capybara/ui/widgets/widget/node_filter.rb +50 -0
  40. data/lib/capybara/ui/widgets/widget_class.rb +13 -0
  41. data/lib/capybara/ui/widgets/widget_name.rb +58 -0
  42. metadata +47 -43
  43. data/lib/capybara-ui.rb +0 -31
  44. data/lib/capybara-ui/assertions.rb +0 -19
  45. data/lib/capybara-ui/checkpoint.rb +0 -111
  46. data/lib/capybara-ui/conversions.rb +0 -31
  47. data/lib/capybara-ui/cucumber.rb +0 -5
  48. data/lib/capybara-ui/dsl.rb +0 -107
  49. data/lib/capybara-ui/instance_conversions.rb +0 -19
  50. data/lib/capybara-ui/optional_dependencies.rb +0 -5
  51. data/lib/capybara-ui/rails.rb +0 -5
  52. data/lib/capybara-ui/rails/role.rb +0 -9
  53. data/lib/capybara-ui/role.rb +0 -19
  54. data/lib/capybara-ui/text_table.rb +0 -107
  55. data/lib/capybara-ui/text_table/cell_text.rb +0 -7
  56. data/lib/capybara-ui/text_table/mapping.rb +0 -40
  57. data/lib/capybara-ui/text_table/transformations.rb +0 -13
  58. data/lib/capybara-ui/text_table/void_mapping.rb +0 -8
  59. data/lib/capybara-ui/version.rb +0 -3
  60. data/lib/capybara-ui/widgets.rb +0 -61
  61. data/lib/capybara-ui/widgets/check_box.rb +0 -26
  62. data/lib/capybara-ui/widgets/cucumber_methods.rb +0 -73
  63. data/lib/capybara-ui/widgets/document.rb +0 -19
  64. data/lib/capybara-ui/widgets/dsl.rb +0 -47
  65. data/lib/capybara-ui/widgets/field.rb +0 -22
  66. data/lib/capybara-ui/widgets/field_group.rb +0 -329
  67. data/lib/capybara-ui/widgets/form.rb +0 -26
  68. data/lib/capybara-ui/widgets/list.rb +0 -200
  69. data/lib/capybara-ui/widgets/list_item.rb +0 -22
  70. data/lib/capybara-ui/widgets/parts/container.rb +0 -46
  71. data/lib/capybara-ui/widgets/parts/struct.rb +0 -117
  72. data/lib/capybara-ui/widgets/radio_button.rb +0 -62
  73. data/lib/capybara-ui/widgets/select.rb +0 -57
  74. data/lib/capybara-ui/widgets/string_value.rb +0 -43
  75. data/lib/capybara-ui/widgets/table.rb +0 -76
  76. data/lib/capybara-ui/widgets/text_field.rb +0 -27
  77. data/lib/capybara-ui/widgets/widget.rb +0 -392
  78. data/lib/capybara-ui/widgets/widget/node_filter.rb +0 -48
  79. data/lib/capybara-ui/widgets/widget_class.rb +0 -11
  80. 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,13 @@
1
+ module Capybara
2
+ module UI
3
+ module WidgetClass
4
+ def self.new(selector, parent = Widget, &extensions)
5
+ klass = Class.new(parent) { root selector }
6
+
7
+ klass.class_eval(&extensions) if block_given?
8
+
9
+ klass
10
+ end
11
+ end
12
+ end
13
+ 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.10.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-16 00:00:00.000000000 Z
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: See https://github.com/mojotech/capybara-ui/README.md
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-ui.rb
177
- - lib/capybara-ui/assertions.rb
178
- - lib/capybara-ui/capybara.rb
179
- - lib/capybara-ui/checkpoint.rb
180
- - lib/capybara-ui/conversions.rb
181
- - lib/capybara-ui/cucumber.rb
182
- - lib/capybara-ui/dsl.rb
183
- - lib/capybara-ui/instance_conversions.rb
184
- - lib/capybara-ui/matchers.rb
185
- - lib/capybara-ui/optional_dependencies.rb
186
- - lib/capybara-ui/rails.rb
187
- - lib/capybara-ui/rails/role.rb
188
- - lib/capybara-ui/role.rb
189
- - lib/capybara-ui/text_table.rb
190
- - lib/capybara-ui/text_table/cell_text.rb
191
- - lib/capybara-ui/text_table/mapping.rb
192
- - lib/capybara-ui/text_table/transformations.rb
193
- - lib/capybara-ui/text_table/void_mapping.rb
194
- - lib/capybara-ui/version.rb
195
- - lib/capybara-ui/widgets.rb
196
- - lib/capybara-ui/widgets/check_box.rb
197
- - lib/capybara-ui/widgets/cucumber_methods.rb
198
- - lib/capybara-ui/widgets/document.rb
199
- - lib/capybara-ui/widgets/dsl.rb
200
- - lib/capybara-ui/widgets/field.rb
201
- - lib/capybara-ui/widgets/field_group.rb
202
- - lib/capybara-ui/widgets/form.rb
203
- - lib/capybara-ui/widgets/list.rb
204
- - lib/capybara-ui/widgets/list_item.rb
205
- - lib/capybara-ui/widgets/parts/container.rb
206
- - lib/capybara-ui/widgets/parts/struct.rb
207
- - lib/capybara-ui/widgets/radio_button.rb
208
- - lib/capybara-ui/widgets/select.rb
209
- - lib/capybara-ui/widgets/string_value.rb
210
- - lib/capybara-ui/widgets/table.rb
211
- - lib/capybara-ui/widgets/text_field.rb
212
- - lib/capybara-ui/widgets/widget.rb
213
- - lib/capybara-ui/widgets/widget/node_filter.rb
214
- - lib/capybara-ui/widgets/widget_class.rb
215
- - lib/capybara-ui/widgets/widget_name.rb
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
@@ -1,5 +0,0 @@
1
- require 'capybara/cucumber'
2
- require 'capybara-ui/rails'
3
- require 'capybara-ui/matchers'
4
-
5
- World(CapybaraUI::DSL)