rspec-html 0.2.9 → 0.2.12

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: 152d9f0198dc22aa14461a8814b98d3be18e663e1b9b95206247cdc3c99ffdf7
4
- data.tar.gz: ea64b6dafe91b0e13a46e3231a493c0a2b7097458ac02b28d5599639dc3f585f
3
+ metadata.gz: 0c34a7cf68a03240483a87a23055af2dd15b8215e8e9d071b3d5a1599a69af0e
4
+ data.tar.gz: 03c82e1d52598e7b77f0fcdd9c7a12223e60dbd9e638d31d06be64d2833a26cf
5
5
  SHA512:
6
- metadata.gz: 728cc6614e604366f38f90d85e93d9822480bbe56b7542810c4887d1723db4b2d39963b8c77a7d5415b5a8fe21489df56135c13630442f2201d18ba4bc2d01a3
7
- data.tar.gz: b77a735db02261431fea9caabf7d3674c7365198709167780761a983e8175a11ce7d770d81c75202b23a719c8faf110559321fff305f4ccb1eba527176c1d763
6
+ metadata.gz: 576bb61d56e699378ec157adc9b4d8a14097c4443b1a79586f10bf866d26904e5a9e9777a4a9bc68650d1c53552e50c8c3dbba7f35e1326989a4bcff2fa071d7
7
+ data.tar.gz: 27a02c3c756539d5e24d441f49a1e09463638567425f36e19a231d849d6c42eb3faea86633d6a76685135b9e4dbdeb8b05ceba9e9eca514cfdfdfb9473c4a645
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rspec-html (0.2.9)
4
+ rspec-html (0.2.11)
5
5
  nokogiri (~> 1.10)
6
6
  rspec (~> 3.0)
7
7
 
data/README.md CHANGED
@@ -7,7 +7,7 @@ _RSpec::HTML_ provides a simple object interface to HTML responses from [_RSpec
7
7
  Add the gem to your `Gemfile`:
8
8
 
9
9
  ```ruby
10
- gem 'rspec-html', '~> 0.2.9'
10
+ gem 'rspec-html', '~> 0.2.12'
11
11
  ```
12
12
 
13
13
  And rebuild your bundle:
@@ -41,6 +41,11 @@ it 'says hello' do
41
41
  end
42
42
  ```
43
43
 
44
+ This method can also be used for _ActionMailer_ emails:
45
+ ```ruby
46
+ before { parse_html(ActionMailer::Base.deliveries.last.body.decoded) }
47
+ ```
48
+
44
49
  To navigate the _DOM_ by a sequence of tag names use chained method calls on the `document` object:
45
50
 
46
51
  #### Tag Traversal
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RSpec
4
4
  module HTML
5
- VERSION = '0.2.9'
5
+ VERSION = '0.2.12'
6
6
  end
7
7
  end
@@ -8,7 +8,10 @@ module RSpecHTML
8
8
  extend Forwardable
9
9
 
10
10
  def_delegators :@search,
11
- :has_css?, :has_xpath?, :include?, :text, :truncated_text, :size, :length, :css, :xpath, :[]
11
+ :has_css?, :has_xpath?, :include?,
12
+ :siblings, :text, :truncated_text,
13
+ :size, :length, :[],
14
+ :css, :xpath
12
15
 
13
16
  def initialize(element, name, options: {}, siblings: [])
14
17
  @name = name
@@ -26,7 +29,7 @@ module RSpecHTML
26
29
  alias exist? present?
27
30
 
28
31
  def inspect
29
- "<#{self.class}::#{name.to_s.capitalize}>"
32
+ reconstituted
30
33
  end
31
34
 
32
35
  def to_s
@@ -10,10 +10,28 @@ module RSpecHTML
10
10
 
11
11
  def match(actual)
12
12
  @rspec_actual = actual&.text
13
- return (actual&.text || '').include?(@expected.to_s) unless @expected.is_a?(Regexp)
13
+ return regexp_match?(actual) || regexp_siblings_match?(actual) if @expected.is_a?(Regexp)
14
14
 
15
+ string_match?(actual) || string_siblings_match?(actual)
16
+ end
17
+
18
+ private
19
+
20
+ def regexp_match?(actual)
15
21
  @expected.match(actual&.text || '')
16
22
  end
23
+
24
+ def regexp_siblings_match?(actual)
25
+ actual.siblings.any? { |sibling| @expected.match(sibling&.text || '') }
26
+ end
27
+
28
+ def string_match?(actual)
29
+ (actual&.text || '').include?(@expected.to_s)
30
+ end
31
+
32
+ def string_siblings_match?(actual)
33
+ actual.siblings.any? { |sibling| (sibling&.text || '').include?(@expected.to_s) }
34
+ end
17
35
  end
18
36
  end
19
37
  end
@@ -12,7 +12,7 @@ module RSpecHTML
12
12
  name = @tag.to_s.downcase
13
13
  return '#document' if name == 'document'
14
14
  return name if name == 'document'
15
- return "<#{name}#{@options} />" if @options.is_a?(String)
15
+ return "<#{name}#{shorthand_options} />" if @options.is_a?(String)
16
16
  return "<#{name}#{formatted_attributes} />" unless @options&.key?(:text)
17
17
 
18
18
  "<#{name}#{formatted_attributes}>#{@options[:text]}</#{name}>"
@@ -33,5 +33,23 @@ module RSpecHTML
33
33
  def formatted_attributes
34
34
  mapped_attributes.empty? ? nil : " #{mapped_attributes.join(' ')}"
35
35
  end
36
+
37
+ def shorthand_options
38
+ case @options[0]
39
+ when '.'
40
+ " #{shorthand_classes}"
41
+ when '#'
42
+ options = %( id="#{@options.partition('#').last.partition('.').first}")
43
+ shorthand_classes.nil? ? options : "#{options} #{shorthand_classes}"
44
+ else
45
+ @options
46
+ end
47
+ end
48
+
49
+ def shorthand_classes
50
+ return nil unless @options.include?('.')
51
+
52
+ %(class="#{@options.partition('.').last.split('.').map(&:strip).reject(&:empty?).join(' ')}")
53
+ end
36
54
  end
37
55
  end
@@ -4,6 +4,8 @@ module RSpecHTML
4
4
  # Provides element/attribute/text searching for HTML entities
5
5
  # rubocop:disable Metrics/ClassLength
6
6
  class Search
7
+ attr_reader :siblings
8
+
7
9
  def initialize(element, siblings)
8
10
  @element = element
9
11
  @siblings = siblings
@@ -57,7 +59,7 @@ module RSpecHTML
57
59
  def size
58
60
  return @element.size if @element.respond_to?(:size)
59
61
 
60
- @siblings.size
62
+ @siblings&.size || 0
61
63
  end
62
64
  alias length size
63
65
 
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.9
4
+ version: 0.2.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bob Farrell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-28 00:00:00.000000000 Z
11
+ date: 2022-06-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri