rspec-html 0.2.1 → 0.2.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d34bf3daf886cca4a7e1b50de449025cd6255629a1fb6a5f6d319c6353fedb0a
4
- data.tar.gz: 7f3ae650fa77a60700211ccda0cb3478e034d8b14f22a40375b89ed007ecb843
3
+ metadata.gz: 0b613fed0b8e19c8069435ab30d735afa9660c66bb7beb6ee226aede70014f0e
4
+ data.tar.gz: c3526928723a917ed6511d3e17e6627df79090d342203e78fa64ab84e174a309
5
5
  SHA512:
6
- metadata.gz: a0ae4675dfe2790a31f953e089ce97157f6b736967abc96281eb50adc04641e1725765085be03770686dbff3c8ccd8d2fa4d567fd366edaabb74c7f2348f5e27
7
- data.tar.gz: '0384ab293fe9397088d0c6356585d1c0657a443ba7a2be8ed1d6a8cdd05ada3b173adc7138091db29b4eedf0c3a267360231735fe1d9fa53144ee64f7367bf39'
6
+ metadata.gz: f3e0dfbd5105659467f468131d7ea32baaf94e406af8dbef7e521ff762572479ad0394ee69474e1fc2f510e493d62d5981cb32b9756665b63af9c7d12220750d
7
+ data.tar.gz: 8cbc3b3579dee20f89d55de6b6e8221f1a32e73b67e3b875a18b8b604d579a12e46d835d63cc14c0c4453022a888f3b44b92d2c7ab97c08299945eb7538382cd
@@ -3,6 +3,16 @@ Metrics/BlockLength:
3
3
  - 'spec/**/*'
4
4
  - 'rspec-html.gemspec'
5
5
 
6
+ Gemspec/RequiredRubyVersion:
7
+ Enabled: false
8
+
9
+ Layout/LineLength:
10
+ Max: 100
11
+
12
+ # Compatibility with older (< 2.6) Rubies.
13
+ Style/SlicingWithRange:
14
+ Enabled: false
15
+
6
16
  Layout/EmptyLinesAroundAttributeAccessor:
7
17
  Enabled: true
8
18
  Layout/SpaceAroundMethodCallOperator:
@@ -47,5 +57,31 @@ Style/RedundantRegexpCharacterClass:
47
57
  Enabled: true
48
58
  Style/RedundantRegexpEscape:
49
59
  Enabled: true
50
- Style/SlicingWithRange:
60
+ Lint/BinaryOperatorWithIdenticalOperands:
61
+ Enabled: true
62
+ Lint/DuplicateRescueException:
63
+ Enabled: true
64
+ Lint/EmptyConditionalBody:
65
+ Enabled: true
66
+ Lint/FloatComparison:
67
+ Enabled: true
68
+ Lint/MissingSuper:
69
+ Enabled: true
70
+ Lint/OutOfRangeRegexpRef:
71
+ Enabled: true
72
+ Lint/SelfAssignment:
73
+ Enabled: true
74
+ Lint/TopLevelReturnWithArgument:
75
+ Enabled: true
76
+ Lint/UnreachableLoop:
77
+ Enabled: true
78
+ Style/ExplicitBlockArgument:
79
+ Enabled: true
80
+ Style/GlobalStdStream:
81
+ Enabled: true
82
+ Style/OptionalBooleanParameter:
83
+ Enabled: true
84
+ Style/SingleArgumentDig:
85
+ Enabled: true
86
+ Style/StringConcatenation:
51
87
  Enabled: true
@@ -1 +1 @@
1
- 2.6.5
1
+ 2.7.1
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rspec-html (0.2.1)
4
+ rspec-html (0.2.5)
5
5
  nokogiri (~> 1.10)
6
6
  rspec (~> 3.0)
7
7
 
@@ -42,17 +42,17 @@ GEM
42
42
  diff-lcs (>= 1.2.0, < 2.0)
43
43
  rspec-support (~> 3.9.0)
44
44
  rspec-support (3.9.3)
45
- rubocop (0.88.0)
45
+ rubocop (0.89.1)
46
46
  parallel (~> 1.10)
47
47
  parser (>= 2.7.1.1)
48
48
  rainbow (>= 2.2.2, < 4.0)
49
49
  regexp_parser (>= 1.7)
50
50
  rexml
51
- rubocop-ast (>= 0.1.0, < 1.0)
51
+ rubocop-ast (>= 0.3.0, < 1.0)
52
52
  ruby-progressbar (~> 1.7)
53
53
  unicode-display_width (>= 1.4.0, < 2.0)
54
- rubocop-ast (0.2.0)
55
- parser (>= 2.7.0.1)
54
+ rubocop-ast (0.3.0)
55
+ parser (>= 2.7.1.4)
56
56
  rubocop-rspec (1.42.0)
57
57
  rubocop (>= 0.87.0)
58
58
  ruby-progressbar (1.10.1)
@@ -72,9 +72,9 @@ DEPENDENCIES
72
72
  rake (~> 13.0)
73
73
  rspec-html!
74
74
  rspec-its (~> 1.3)
75
- rubocop (~> 0.88.0)
75
+ rubocop (~> 0.89.1)
76
76
  rubocop-rspec (~> 1.36)
77
77
  strong_versions (~> 0.4.5)
78
78
 
79
79
  BUNDLED WITH
80
- 2.0.2
80
+ 2.1.4
data/README.md CHANGED
@@ -4,18 +4,17 @@ _RSpec::HTML_ provides a simple object interface to HTML responses from [_RSpec
4
4
 
5
5
  ## Installation
6
6
 
7
+ Add the gem to your `Gemfile`:
8
+
7
9
  ```ruby
8
- gem 'rspec-html', '~> 0.2.1'
10
+ gem 'rspec-html', '~> 0.2.6'
9
11
  ```
10
12
 
11
- Bundle
12
- And then execute:
13
-
14
- $ bundle
15
-
16
- Or install it yourself as:
13
+ And rebuild your bundle:
17
14
 
18
- $ gem install rspec-html
15
+ ```bash
16
+ $ bundle install
17
+ ```
19
18
 
20
19
  ## Usage
21
20
 
@@ -26,7 +25,10 @@ Require the gem in your `spec_helper.rb`:
26
25
  require 'rspec/html'
27
26
  ```
28
27
 
28
+ Several [matchers](#matchers) are provided to identify text and _HTML_ elements within the _DOM_. These matchers can only be used with the provided [object interface](#object-interface).
29
+
29
30
  ### Object Interface
31
+ <a name="object-interface"></a>
30
32
 
31
33
  The top-level object `document` is available in all tests which reflects the current response body (e.g. in request specs).
32
34
 
@@ -35,7 +37,7 @@ If you need to parse _HTML_ manually you can use the provided `parse_html` helpe
35
37
  ```ruby
36
38
  before { parse_html('<html><body>hello</body></html>') }
37
39
  it 'says hello' do
38
- expect(document.body).to include 'hello'
40
+ expect(document.body).to contain_text 'hello'
39
41
  end
40
42
  ```
41
43
 
@@ -43,33 +45,41 @@ To navigate the _DOM_ by a sequence of tag names use chained method calls on the
43
45
 
44
46
  #### Tag Traversal
45
47
  ```ruby
46
- expect(document.body.div.span).to include 'some text'
48
+ expect(document.body.div.span).to contain_text 'some text'
47
49
  ```
48
50
 
49
51
  #### Attribute Matching
50
52
  To select an element matching certain attributes pass a hash to any of the chained methods:
51
53
  ```ruby
52
- expect(document.body.div(id: 'my-div').span(align: 'left')).to include 'some text'
54
+ expect(document.body.div(id: 'my-div').span(align: 'left')).to contain_text 'some text'
53
55
  ```
54
56
 
55
57
  #### Class Matching
56
- CSS classes are treated as a special case: to select an element matching a specific class (or array of classes) pass the `class` parameter:
58
+ _CSS_ classes are treated as a special case: to select an element matching a set of classes pass the `class` parameter:
59
+ ```ruby
60
+ expect(document.body.div(id: 'my-div').span(class: 'my-class')).to contain_text 'some text'
61
+ expect(document.body.div(id: 'my-div').span(class: 'my-class my-other-class')).to contain_text 'some text'
62
+ ```
63
+
64
+ Classes can be provided in any order, i.e. `'my-class my-other-class'` is equivalent to `'my-other-class my-class'`.
65
+
66
+ #### Text Matching
67
+ To select an element that includes a given text string (i.e. excluding mark-up) use the `text` option:
57
68
  ```ruby
58
- expect(document.body.div(id: 'my-div').span(class: 'my-class')).to include 'some text'
59
- expect(document.body.div(id: 'my-div').span(class: ['my-class', 'my-other-class'])).to include 'some text'
69
+ expect(document.body.div(text: 'some text').input[:value]).to eql 'some-value'
60
70
  ```
61
71
 
62
72
  #### Attribute Retrieval
63
73
  To select an attribute from an element use the hash-style interface:
64
74
  ```ruby
65
- expect(document.body.div.span[:class]).to include 'my-class'
66
- expect(document.body.div.span['data-content']).to include 'my content'
75
+ expect(document.body.div.span[:class]).to contain_text 'my-class'
76
+ expect(document.body.div.span['data-content']).to contain_text 'my content'
67
77
  ```
68
78
 
69
79
  #### Indexing a Matching Set
70
80
  To select an index from a set of matched elements use the array-style interface (the first matching element is `1`, not `0`):
71
81
  ```ruby
72
- expect(document.body.div[1].span[1][:class]).to include 'my-class'
82
+ expect(document.body.div[1].span[1][:class]).to contain_text 'my-class'
73
83
  ```
74
84
 
75
85
  #### Element Existence
@@ -89,8 +99,8 @@ expect(document.body.div.length).to eql 3
89
99
  #### XPath / CSS Selectors
90
100
  If you need something more specific you can always use the _Nokogiri_ `#xpath` and `#css` methods on any element:
91
101
  ```ruby
92
- expect(document.body.xpath('//span[@class="my-class"]')).to include 'some text'
93
- expect(document.body.css('span.my-class')).to include 'some text'
102
+ expect(document.body.xpath('//span[@class="my-class"]')).to contain_text 'some text'
103
+ expect(document.body.css('span.my-class')).to contain_text 'some text'
94
104
  ```
95
105
 
96
106
  To simply check that an _XPath_ or _CSS_ selector exists use `have_xpath` and `have_css`:
@@ -99,6 +109,34 @@ expect(document.body).to have_css 'html body div.myclass'
99
109
  expect(document.body).to have_xpath '//html/body/div[@class="myclass"]'
100
110
  ```
101
111
 
112
+ ### Custom Matchers
113
+ <a name="matchers"></a>
114
+
115
+ #### contain_text
116
+
117
+ Use the `contain_text` matcher to locate text within a _DOM_ element. All mark-up elements are stripped when using this matcher.
118
+
119
+ ```ruby
120
+ expect(document.body.form).to contain_text 'Please enter your password'
121
+ ```
122
+
123
+ #### contain_tag
124
+
125
+ Use the `contain_tag` matcher to locate _DOM_ elements within any given element. This matcher accepts two arguments:
126
+
127
+ * The tag name of the element you want to match (e.g. `:div`);
128
+ * _(Optional)_ A hash of options. All options supported by the [object interface](#object-interface) can be used here.
129
+
130
+ Without options:
131
+ ```ruby
132
+ expect(document.div(class: 'my-class')).to contain_tag :span
133
+ ```
134
+
135
+ With options:
136
+ ```ruby
137
+ expect(document.form(class: 'my-form')).to contain_tag :input, name: 'email', class: 'email-input'
138
+ ```
139
+
102
140
  ## Contributing
103
141
 
104
142
  Feel free to make a pull request.
@@ -9,7 +9,11 @@ module RSpec
9
9
  # Module extension for RSpec::SharedContext
10
10
  module HTML
11
11
  def document
12
- @document || RSpecHTML::Element.new(Nokogiri::HTML.parse(response.body), :document)
12
+ return @document if @document
13
+
14
+ RSpecHTML::Element.new(Nokogiri::HTML.parse(response.body), :document)
15
+ rescue NameError
16
+ raise RSpecHTML::NoResponseError, 'No `response` object found. Make a request first.'
13
17
  end
14
18
 
15
19
  def parse_html(content)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RSpec
4
4
  module HTML
5
- VERSION = '0.2.1'
5
+ VERSION = '0.2.6'
6
6
  end
7
7
  end
@@ -1,16 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'nokogiri'
4
+
4
5
  require 'pathname'
6
+ require 'forwardable'
5
7
 
6
- require 'rspec_html/nameable'
7
- require 'rspec_html/searchable'
8
- require 'rspec_html/element'
9
8
  require 'rspec_html/tags'
9
+ require 'rspec_html/element'
10
+ require 'rspec_html/search'
11
+ require 'rspec_html/reconstituted_element'
12
+ require 'rspec_html/matchers'
10
13
 
11
14
  # Support module for rspec/html
12
15
  module RSpecHTML
16
+ class Error < StandardError; end
17
+ class NoResponseError < Error; end
13
18
  def self.root
14
19
  Pathname.new(__dir__).parent
15
20
  end
16
21
  end
22
+
23
+ RSpec.configure { |config| config.include RSpecHTML::Matchers }
@@ -3,13 +3,51 @@
3
3
  module RSpecHTML
4
4
  # HTML DOM element abstraction
5
5
  class Element
6
- include Searchable
7
- include Nameable
6
+ attr_reader :name, :element
8
7
 
9
- def initialize(element, name, siblings: [])
8
+ extend Forwardable
9
+
10
+ def_delegators :@search,
11
+ :has_css?, :has_xpath?, :include?, :text, :truncated_text, :size, :length, :[]
12
+
13
+ def initialize(element, name, options: {}, siblings: [])
10
14
  @name = name
11
15
  @element = element
16
+ @options = options
12
17
  @siblings = siblings
18
+ @search = Search.new(@element, @siblings)
19
+ end
20
+
21
+ def present?
22
+ return true if name == :document
23
+
24
+ @search.present?
25
+ end
26
+ alias exist? present?
27
+
28
+ def inspect
29
+ "<#{self.class}::#{name.to_s.capitalize}>"
30
+ end
31
+
32
+ def to_s
33
+ @element.to_s
34
+ end
35
+
36
+ Tags.each do |tag|
37
+ define_method tag.downcase do |*args|
38
+ options = args.first
39
+ return @search.new_from_find(tag.downcase, options) if options.nil?
40
+
41
+ @search.new_from_where(tag.downcase, options)
42
+ end
43
+ end
44
+
45
+ def reconstituted
46
+ self.class.reconstituted(name, @options)
47
+ end
48
+
49
+ def self.reconstituted(tag, options = {})
50
+ ReconstitutedElement.new(tag, options).to_s
13
51
  end
14
52
  end
15
53
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rspec_html/matchers/base'
4
+ require 'rspec_html/matchers/contain_text'
5
+ require 'rspec_html/matchers/contain_tag'
6
+
7
+ module RSpecHTML
8
+ # Provides matchers for identifying elements and text within a DOM element.
9
+ module Matchers
10
+ extend RSpec::Matchers::DSL
11
+ extend RSpec::Matchers::DSL::Macros
12
+
13
+ # rubocop:disable Metrics/MethodLength
14
+ def self.define_matcher(name, class_)
15
+ matcher name do |expected, options|
16
+ rspec_html_matcher = class_.new(expected, options || {})
17
+ match do |actual|
18
+ rspec_html_matcher
19
+ .save_actual(actual)
20
+ .match(actual)
21
+ .tap { @actual = rspec_html_matcher.rspec_actual }
22
+ end
23
+ description { rspec_html_matcher.description }
24
+ failure_message { rspec_html_matcher.failure_message }
25
+ diffable if class_.diffable?
26
+ end
27
+ end
28
+ # rubocop:enable Metrics/MethodLength
29
+
30
+ define_matcher(:contain_text, ContainText)
31
+ define_matcher(:contain_tag, ContainTag)
32
+ end
33
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RSpecHTML
4
+ module Matchers
5
+ # Mix-in class to provide a uniform interface and message templating for all matchers.
6
+ module Base
7
+ def self.included(base)
8
+ base.class_eval do
9
+ class << self
10
+ def diffable
11
+ @diffable = true
12
+ end
13
+
14
+ def diffable?
15
+ @diffable
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ attr_reader :rspec_actual
22
+
23
+ def initialize(expected, options)
24
+ @expected = expected
25
+ @options = options
26
+ end
27
+
28
+ def description
29
+ template(:description, @options, @expected)
30
+ end
31
+
32
+ def failure_message
33
+ template(:failure, @options, @expected, @actual)
34
+ end
35
+
36
+ def save_actual(actual)
37
+ @actual = actual
38
+ self
39
+ end
40
+
41
+ def reconstituted(element, options)
42
+ RSpecHTML::Element.reconstituted(element, options)
43
+ end
44
+
45
+ private
46
+
47
+ def template(type, options, expected, actual = nil)
48
+ ERB.new(template_path(type).read).result(binding)
49
+ end
50
+
51
+ def template_path(type)
52
+ RSpecHTML.root.join('templates', type.to_s, "#{filename}.erb")
53
+ end
54
+
55
+ def filename
56
+ _, _, name = self.class.name.rpartition('::')
57
+ (name[0] + name[1..-1].gsub(/(.)([A-Z])/, '\1_\2')).downcase
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RSpecHTML
4
+ module Matchers
5
+ # Matches elements within a given DOM element.
6
+ class ContainTag
7
+ include Base
8
+
9
+ def match(actual)
10
+ @actual = actual.to_s
11
+ actual.public_send(@expected, @options).present?
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RSpecHTML
4
+ module Matchers
5
+ # Matches text within a given DOM element.
6
+ class ContainText
7
+ include Base
8
+
9
+ diffable
10
+
11
+ def match(actual)
12
+ @rspec_actual = actual&.text
13
+ (actual&.text || '').include?(@expected.to_s)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RSpecHTML
4
+ # Reconstructs an HTML representation of an element from provided parameters.
5
+ class ReconstitutedElement
6
+ def initialize(tag, options)
7
+ @tag = tag
8
+ @options = options
9
+ end
10
+
11
+ def to_s
12
+ name = @tag.to_s.downcase
13
+ return '#document' if name == 'document'
14
+ return name if name == 'document'
15
+ return "<#{name}#{formatted_attributes} />" unless @options&.key?(:text)
16
+
17
+ "<#{name}#{formatted_attributes}>#{@options[:text]}</#{name}>"
18
+ end
19
+
20
+ private
21
+
22
+ def mapped_attributes
23
+ return [] if @options.nil?
24
+
25
+ @options.reject { |key| key.to_sym == :text }.map do |key, value|
26
+ next %(#{key}="#{value}") unless key.to_sym == :class && value.is_a?(Array)
27
+
28
+ %(#{key}="#{value.join(' ')}")
29
+ end
30
+ end
31
+
32
+ def formatted_attributes
33
+ mapped_attributes.empty? ? nil : " #{mapped_attributes.join(' ')}"
34
+ end
35
+ end
36
+ end
@@ -1,10 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RSpecHTML
4
- # Mixin module providing methods for searching text content of HTML entities
5
- module Searchable
4
+ # Provides element/attribute/text searching for HTML entities
5
+ class Search
6
+ def initialize(element, siblings)
7
+ @element = element
8
+ @siblings = siblings
9
+ end
10
+
6
11
  def include?(val)
7
- @element.text.include?(val)
12
+ text.include?(val)
8
13
  end
9
14
 
10
15
  def css(*args)
@@ -30,14 +35,6 @@ module RSpecHTML
30
35
  end
31
36
  # rubocop:enable Naming/PredicateName
32
37
 
33
- def to_s
34
- @element&.text&.strip
35
- end
36
-
37
- def inspect
38
- %("#{@element}")
39
- end
40
-
41
38
  def [](val)
42
39
  return index(val) if val.is_a?(Integer)
43
40
  return range(val) if val.is_a?(Range)
@@ -45,6 +42,17 @@ module RSpecHTML
45
42
  @element&.attr(val.to_s)
46
43
  end
47
44
 
45
+ def text
46
+ @element&.text&.gsub(/\s+/, ' ')&.strip || ''
47
+ end
48
+
49
+ def truncated_text
50
+ max = RSpec::Support::ObjectFormatter.default_instance.max_formatted_output_length
51
+ return text if text.size <= max
52
+
53
+ "#{text[0..max]}...#{text[-max..-1]}"
54
+ end
55
+
48
56
  def size
49
57
  return @element.size if @element.respond_to?(:size)
50
58
 
@@ -52,18 +60,29 @@ module RSpecHTML
52
60
  end
53
61
  alias length size
54
62
 
55
- private
56
-
57
- def method_missing(tag, *args)
58
- return super unless Tags.include?(tag)
59
- return self.class.new(find(tag), tag, siblings: find(tag, all: true)) if args.empty?
63
+ def new_from_find(tag, options)
64
+ Element.new(
65
+ find(tag),
66
+ tag,
67
+ options: options,
68
+ siblings: find(tag, all: true)
69
+ )
70
+ end
60
71
 
61
- self.class.new(where(tag, args.first), tag, siblings: where(tag, args.first, all: true))
72
+ def new_from_where(tag, options)
73
+ Element.new(
74
+ where(tag, options),
75
+ tag,
76
+ options: options,
77
+ siblings: where(tag, options, all: true)
78
+ )
62
79
  end
63
80
 
81
+ private
82
+
64
83
  def index(val)
65
84
  zero_index_error if val.zero?
66
- self.class.new(@siblings[val - 1], name)
85
+ self.class.new(@siblings[val - 1], @element.name)
67
86
  end
68
87
 
69
88
  def range(val)
@@ -81,6 +100,7 @@ module RSpecHTML
81
100
  else
82
101
  where_xpath(tag, query)
83
102
  end
103
+ return nil unless matched || all
84
104
  return matched&.first unless all
85
105
 
86
106
  matched
@@ -94,13 +114,15 @@ module RSpecHTML
94
114
  def where_conditions(query)
95
115
  query.compact.map do |key, value|
96
116
  next if value.nil?
117
+ next %(@#{key}="#{value}") unless key == :text
97
118
 
98
- %(@#{key}="#{value}")
119
+ %[contains(text(),"#{value}")]
99
120
  end.join ' and '
100
121
  end
101
122
 
102
123
  def where_class(tag, class_or_classes)
103
- selector = class_or_classes.is_a?(Array) ? class_or_classes.join('.') : class_or_classes
124
+ classes = class_or_classes.is_a?(Array) ? class_or_classes : class_or_classes.to_s.split
125
+ selector = classes.map(&:to_s).join('.')
104
126
  @element&.css("#{tag}.#{selector}")
105
127
  end
106
128
 
@@ -109,9 +131,5 @@ module RSpecHTML
109
131
 
110
132
  @element&.css(tag.to_s)
111
133
  end
112
-
113
- def respond_to_missing?(method_name, *_)
114
- Tags.include?(method_name)
115
- end
116
134
  end
117
135
  end
@@ -7,6 +7,10 @@ module RSpecHTML
7
7
  tags.include?(val.to_s.upcase)
8
8
  end
9
9
 
10
+ def self.each(&block)
11
+ tags.each { |tag| block.call(tag) }
12
+ end
13
+
10
14
  # rubocop:disable Metrics/MethodLength
11
15
  def self.tags
12
16
  %w[
@@ -37,7 +37,7 @@ Gem::Specification.new do |spec|
37
37
  spec.add_development_dependency 'i18n', '~> 1.7'
38
38
  spec.add_development_dependency 'rake', '~> 13.0'
39
39
  spec.add_development_dependency 'rspec-its', '~> 1.3'
40
- spec.add_development_dependency 'rubocop', '~> 0.88.0'
40
+ spec.add_development_dependency 'rubocop', '~> 0.89.1'
41
41
  spec.add_development_dependency 'rubocop-rspec', '~> 1.36'
42
42
  spec.add_development_dependency 'strong_versions', '~> 0.4.5'
43
43
  end
@@ -0,0 +1 @@
1
+ contain tag <%= RSpecHTML::Element.reconstituted(expected, @options) %>
@@ -0,0 +1 @@
1
+ contain text <%= expected.inspect %>
@@ -0,0 +1,5 @@
1
+ <% if actual.element.nil? %>
2
+ Expected <%= reconstituted(actual, @options) %> to contain <%= reconstituted(expected, @options) %> but the element did not exist.
3
+ <% else %>
4
+ Expected <%= reconstituted(actual, @options) %> to contain <%= reconstituted(expected, @options) %> but it did not.
5
+ <% end %>
@@ -0,0 +1,5 @@
1
+ <% unless actual.exist? %>
2
+ Expected <%= actual.reconstituted %> to contain <%= expected.inspect %> but the element did not exist.
3
+ <% else %>
4
+ Expected text in <%= actual.reconstituted %> <%= (actual.truncated_text).inspect %> to contain <%= expected.inspect %> but it did not.
5
+ <% end %>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-html
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bob Farrell
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-30 00:00:00.000000000 Z
11
+ date: 2020-10-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -128,14 +128,14 @@ dependencies:
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: 0.88.0
131
+ version: 0.89.1
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: 0.88.0
138
+ version: 0.89.1
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: rubocop-rspec
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -188,10 +188,18 @@ files:
188
188
  - lib/rspec/html/version.rb
189
189
  - lib/rspec_html.rb
190
190
  - lib/rspec_html/element.rb
191
- - lib/rspec_html/nameable.rb
192
- - lib/rspec_html/searchable.rb
191
+ - lib/rspec_html/matchers.rb
192
+ - lib/rspec_html/matchers/base.rb
193
+ - lib/rspec_html/matchers/contain_tag.rb
194
+ - lib/rspec_html/matchers/contain_text.rb
195
+ - lib/rspec_html/reconstituted_element.rb
196
+ - lib/rspec_html/search.rb
193
197
  - lib/rspec_html/tags.rb
194
198
  - rspec-html.gemspec
199
+ - templates/description/contain_tag.erb
200
+ - templates/description/contain_text.erb
201
+ - templates/failure/contain_tag.erb
202
+ - templates/failure/contain_text.erb
195
203
  homepage: https://github.com/bobf/rspec-html
196
204
  licenses:
197
205
  - MIT
@@ -199,7 +207,7 @@ metadata:
199
207
  homepage_uri: https://github.com/bobf/rspec-html
200
208
  source_code_uri: https://github.com/bobf/rspec-html
201
209
  changelog_uri: https://github.com/bobf/rspec-html/blob/master/LICENSE
202
- post_install_message:
210
+ post_install_message:
203
211
  rdoc_options: []
204
212
  require_paths:
205
213
  - lib
@@ -214,8 +222,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
214
222
  - !ruby/object:Gem::Version
215
223
  version: '0'
216
224
  requirements: []
217
- rubygems_version: 3.0.3
218
- signing_key:
225
+ rubygems_version: 3.1.2
226
+ signing_key:
219
227
  specification_version: 4
220
228
  summary: RSpec HTML
221
229
  test_files: []
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RSpecHTML
4
- # Mixin module providing methods allowing an entity to specify its name
5
- module Nameable
6
- attr_reader :name
7
- end
8
- end