mache 1.0.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 57a3cffa66255ddaa95d41917a45842c4eb4f6e1
4
- data.tar.gz: 54565c4f1a3b141facd22ecc3f70acf20d7402a7
3
+ metadata.gz: a7d084d201649e516f630f6a837d312fcd6e62ec
4
+ data.tar.gz: 5cc13f16c2078c326c9979d953690cf7c3f34eb6
5
5
  SHA512:
6
- metadata.gz: a713135868ef06a9df6cf2e40a430703de6eac61fe96e6c49eabc3fe039a71e0aa7b31fccac4ba56a02487e4c25af1411ac520b3c3728ae23a2b280723d1675f
7
- data.tar.gz: 440ebba8dc3a9149e259c80640aa49a738f2e8de5ff967ec3b42482f0ce1a9d13ab466ebac58fc5bd324db0a61cb50770009cd6b162d9fe8ac668e200ac711ea
6
+ metadata.gz: afd3efc23afd21149227b50c0a461cb3f61ce49b30d4894560d76e1a6b9befdc850518b84247f4ff91ec4694eb5c5b73760c8c2da87dfc111efb190018fa05ef
7
+ data.tar.gz: d05c14504c5bc9ed11b9f0e918307b53860b242a68cf7fa42dc1ff67f286269cb9f89a98d91089d6e554be099eed786e07199aedcaed058a2e3b20e2aef6999e
data/.rubocop.yml CHANGED
@@ -6,12 +6,18 @@ AllCops:
6
6
  Metrics/BlockLength:
7
7
  ExcludedMethods: describe
8
8
 
9
+ Style/BlockDelimiters:
10
+ Enabled: false
11
+
9
12
  Style/Documentation:
10
13
  Exclude:
11
14
  - "spec/**/*"
12
15
 
13
- Style/StringLiterals:
14
- EnforcedStyle: double_quotes
15
-
16
16
  Style/FrozenStringLiteralComment:
17
17
  Enabled: false
18
+
19
+ Style/SpaceInsideHashLiteralBraces:
20
+ Enabled: false
21
+
22
+ Style/StringLiterals:
23
+ EnforcedStyle: double_quotes
data/README.md CHANGED
@@ -87,7 +87,7 @@ page.node # <Capybara::Node>
87
87
  ### Elements
88
88
 
89
89
  To make our page object more useful, we can define an element on our page
90
- object class using the `element` macro. An element is simply a HTML element
90
+ object class using the `element` macro. An element is simply an HTML element
91
91
  that we expect to find on the page using a CSS selector.
92
92
 
93
93
  Let's define a `main` element to represent the main section of our HTML page:
@@ -106,21 +106,19 @@ We can query the `main` element as an attribute of our page object:
106
106
 
107
107
  ```ruby
108
108
  page.has_main? # true
109
- page.main.visible? # true
110
109
  page.main.text # "lorem ipsum"
111
110
  ```
112
111
 
113
112
  ### Components
114
113
 
115
114
  For elements that can be shared across any number of page object classes it may
116
- be useful to define a reusable component by extending the `Mache::Component`
117
- class. A component can contain any number of elements (or even other
118
- components).
115
+ be useful to define a reusable component by extending the `Mache::Node` class.
116
+ A component can contain any number of elements (or even other components).
119
117
 
120
118
  Let's define a `Header` component to represent the header of our HTML page:
121
119
 
122
120
  ```ruby
123
- class Header < Mache::Component
121
+ class Header < Mache::Node
124
122
  element :title, "h1"
125
123
  end
126
124
  ```
@@ -143,7 +141,6 @@ Querying a component of our page object is much the same as with an element:
143
141
 
144
142
  ```ruby
145
143
  page.has_header? # true
146
- page.header.visible? # true
147
144
  page.header.title.text # "Welcome"
148
145
  ```
149
146
 
@@ -154,17 +151,17 @@ Let's look at a more complete example for our `WelcomePage`. Note that the
154
151
  object classes we may define later for our web application.
155
152
 
156
153
  ```ruby
157
- class Header < Mache::Component
154
+ class Header < Mache::Node
158
155
  element :title, "h1"
159
156
  end
160
157
 
161
- class NavItem < Mache::Component
158
+ class NavItem < Mache::Node
162
159
  def selected?
163
160
  node[:class].include?("selected")
164
161
  end
165
162
  end
166
163
 
167
- class Nav < Mache::Component
164
+ class Nav < Mache::Node
168
165
  components :items, NavItem, "a"
169
166
  end
170
167
 
data/lib/mache/dsl.rb CHANGED
@@ -1,42 +1,127 @@
1
1
  module Mache
2
- # Provides the mache DSL for nodes.
3
- module DSL
2
+ # See {ClassMethods} for documentation.
3
+ module DSL # :nodoc:
4
4
  def self.included(base)
5
5
  base.extend ClassMethods
6
6
  end
7
7
 
8
- module ClassMethods #:nodoc:
8
+ # Provides a set of macro-like methods for wrapping HTML fragments in {Node}
9
+ # objects.
10
+ #
11
+ # ## Elements
12
+ #
13
+ # The {#element} method wraps an HTML fragment in a {Node} and exposes it as
14
+ # an *attribute* of the declaring class.
15
+ #
16
+ # The following example declares the `main` element, which is found on the
17
+ # welcome page using the `#main` selector:
18
+ #
19
+ # class WelcomePage < Mache::Page
20
+ # element :main, "#main"
21
+ # end
22
+ #
23
+ # The `main` element can be accessed as an attribute of a `WelcomePage`
24
+ # instance:
25
+ #
26
+ # page = WelcomePage.new
27
+ # page.has_main? # true
28
+ # page.main.text # lorem ipsum
29
+ #
30
+ # ## Components
31
+ #
32
+ # The {#component} method wraps an HTML fragment in a user-defined class and
33
+ # exposes it as an *attribute* of the declaring class.
34
+ #
35
+ # The following example declaring the `alert` component, which is found on
36
+ # the welcome page using the `#alert` selector. The component will be
37
+ # wrapped in the user-defined `Alert` class:
38
+ #
39
+ # class WelcomePage < Mache::Page
40
+ # component :alert, Alert, "#alert"
41
+ # end
42
+ #
43
+ # The `Alert` class can define an API for accessing the alert HTML fragment:
44
+ #
45
+ # class Alert < Mache::Node
46
+ # element :close_button, "button.close"
47
+ #
48
+ # def dismiss
49
+ # close_button.click
50
+ # end
51
+ # end
52
+ #
53
+ module ClassMethods
9
54
  def automation(*ids)
10
55
  ids.map { |id| %([data-automation="#{id}"]) }.join(" ")
11
56
  end
12
57
 
13
- def element(name, selector)
58
+ # Defines an element that wraps an HTML fragment.
59
+ #
60
+ # @param name [String, Symbol] the elements collection name
61
+ # @param selector [String] the selector to find the element
62
+ # @param options [Hash] the options to pass to the Capybara finder
63
+ def element(name, selector, options = {})
14
64
  define_method(name.to_s) do
15
- @node.find(selector)
65
+ Node.new(node: @node.find(selector, options))
16
66
  end
67
+
17
68
  define_helper_methods(name, selector)
18
69
  end
19
70
 
20
- def elements(name, selector)
71
+ # Defines a collection of elements that wrap HTML fragments.
72
+ #
73
+ # @param name [String, Symbol] the elements collection name
74
+ # @param selector [String] the selector to find the elements
75
+ # @param options [Hash] the options to pass to the Capybara finder
76
+ def elements(name, selector, options = {})
77
+ options = {minimum: 1}.merge(options)
78
+
21
79
  define_method(name.to_s) do
22
- @node.all(selector, minimum: 1)
80
+ @node.all(selector, options).map do |node|
81
+ Node.new(node: node)
82
+ end
23
83
  end
84
+
24
85
  define_helper_methods(name, selector)
25
86
  end
26
87
 
27
- def component(name, klass, selector)
88
+ # Defines a component that wraps an HTML fragment.
89
+ #
90
+ # @param name [String, Symbol] the elements collection name
91
+ # @param klass [Class] the component class
92
+ # @param selector [String] the selector to find the component
93
+ # @param options [Hash] the options to pass to the Capybara finder
94
+ def component(name, klass, selector, options = {})
95
+ unless klass < Node
96
+ raise ArgumentError, "Must be given a subclass of Node"
97
+ end
98
+
28
99
  define_method(name.to_s) do
29
- klass.new(node: @node.find(selector))
100
+ klass.new(node: @node.find(selector, options))
30
101
  end
102
+
31
103
  define_helper_methods(name, selector)
32
104
  end
33
105
 
34
- def components(name, klass, selector)
106
+ # Defines a collection of components that wrap HTML fragments.
107
+ #
108
+ # @param name [String, Symbol] the elements collection name
109
+ # @param klass [Class] the component class
110
+ # @param selector [String] the selector to find the components
111
+ # @param options [Hash] the options to pass to the Capybara finder
112
+ def components(name, klass, selector, options = {})
113
+ unless klass < Node
114
+ raise ArgumentError, "Must be given a subclass of Node"
115
+ end
116
+
117
+ options = {minimum: 1}.merge(options)
118
+
35
119
  define_method(name.to_s) do
36
- @node.all(selector, minimum: 1).map do |element|
37
- klass.new(node: element)
120
+ @node.all(selector, options).map do |node|
121
+ klass.new(node: node)
38
122
  end
39
123
  end
124
+
40
125
  define_helper_methods(name, selector)
41
126
  end
42
127
 
data/lib/mache/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Mache
2
- VERSION = "1.0.1".freeze
2
+ VERSION = "2.0.0".freeze
3
3
  end
data/lib/mache.rb CHANGED
@@ -1,3 +1,3 @@
1
- require "mache/component"
1
+ require "mache/node"
2
2
  require "mache/page"
3
3
  require "mache/version"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mache
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Bassett
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-10 00:00:00.000000000 Z
11
+ date: 2017-03-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: capybara
@@ -114,7 +114,6 @@ files:
114
114
  - Rakefile
115
115
  - bin/console
116
116
  - lib/mache.rb
117
- - lib/mache/component.rb
118
117
  - lib/mache/dsl.rb
119
118
  - lib/mache/node.rb
120
119
  - lib/mache/page.rb
@@ -1,22 +0,0 @@
1
- require "mache/node"
2
-
3
- module Mache
4
- # The Component class wraps a fragment of HTML and can be used in any number
5
- # of {Page} classes using the `component` macro. A component can contain
6
- # elements and other components.
7
- #
8
- # @example
9
- #
10
- # class NavItem < Mache::Component
11
- # def selected?
12
- # node[:class].include?("selected")
13
- # end
14
- # end
15
- #
16
- # class Nav < Mache::Component
17
- # components :items, NavItem, "a"
18
- # end
19
- #
20
- class Component < Node
21
- end
22
- end