capybara-ui 0.10.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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)