rspec_tag_matchers 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 Kyle Hargraves
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOa AND
17
+ NONINFRINGEMENT. IN NO EVENT SaALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,105 @@
1
+ h1. RSPEC_TAG_MATCHER
2
+
3
+ _Implementation of *have_tag()* RSpec matcher using *Nokogiri*._
4
+
5
+ h2. Description
6
+
7
+ An implementation of rspec_on_rails' @have_tag()@ matcher which does not depend on Rails' @assert_select()@. Using *Nokogiri* instead, the matcher is available to non-Rails projects, and enjoys the full flexibility of Nokogiri's advanced and blazing fast CSS and XPath selector support.
8
+
9
+ h2. Installation
10
+
11
+ *Gem:*
12
+
13
+ <pre>sudo gem install rspec_tag_matchers --source http://gemcutter.org</pre>
14
+
15
+ *Dependencies:*
16
+
17
+ * "rspec":http://github.com/dchelimsky/rspec (stating the obvious)
18
+
19
+ *Configuration*
20
+
21
+ In @spec_helper.rb@:
22
+
23
+ <pre>
24
+ require 'rspec_tag_matchers'
25
+
26
+ Spec::Runner.configure do |config|
27
+ config.include(RspecTagMatchers)
28
+ end
29
+ </pre>
30
+
31
+ h2. Usage
32
+
33
+ As its first argument, @have_tag()@ accepts any CSS or XPath selectors which are supported by *Nokogiri*.
34
+
35
+ <pre>
36
+ body.should have_tag('form[@action*=session]')
37
+ body.should have_tag('ul > li + li')
38
+ </pre>
39
+
40
+ Expectations can be placed upon the inner text of the matched element by providing another argument, which should be either a @String@ or a @Regexp@:
41
+
42
+ <pre>
43
+ body.should have_tag('h1', 'Welcome')
44
+ body.should have_tag('p', /a very important blurb/i)
45
+ </pre>
46
+
47
+ Expectations can be placed upon the number of matched elements by passing an options hash:
48
+
49
+ <pre>
50
+ body.should have_tag('abbr', :count => 1) # exactly one
51
+ body.should have_tag('dt', :minimum => 4) # at least 4
52
+ body.should have_tag('dd', :maximum => 4) # at most 4
53
+ body.should have_tag('a.outgoing', /rspec/i, :count => 2)
54
+ </pre>
55
+
56
+ The @:count@ key also accepts a @Range@, making the following equivalent:
57
+
58
+ <pre>
59
+ body.should have_tag('tr', :count => 3..5)
60
+ body.should have_tag('tr', :minimum => 3, :maximum => 5)
61
+ </pre>
62
+
63
+ The usage of @with_tag()@, however, is no longer supported. Instead, a block passed to @have_tag()@ will have each matched element successively yielded to it. If none of the blocks return without raising an @ExpectationNotMetError@, the outer @have_tag()@ is treated as having failed:
64
+
65
+ <pre>
66
+ body.should have_tag('thead') do |thead|
67
+ thead.should have_tag('th', :count => 5)
68
+ end
69
+ </pre>
70
+
71
+ This also allows arbitrary expectations to be applied from within the block, such as:
72
+
73
+ <pre>
74
+ body.should have_tag('dl dd.sha1') do |dd|
75
+ dd.inner_text.length.should == 40
76
+ end
77
+ </pre>
78
+
79
+ h2. Notes
80
+
81
+ Currently, this implementation does not support substitution values as assert_select did (by way of @HTML::Selector@):
82
+
83
+ *Note supported:*
84
+
85
+ <pre>
86
+ body.should have_tag('li[class=?]', dom_class)
87
+ body.should have_tag('tr.person#?', /^person-\d+$/)
88
+ </pre>
89
+
90
+ I (Kyle Hargraves, original author) rarely use these, and Hpricot's advanced selectors make them mostly useless, as far as I can tell, so I am unlikely to implement them myself.
91
+
92
+ This @have_tag()@ further differs from the @assert_select@-based implementation in that the nested @have_tag()@ calls must *all* pass on a single selected element in order to be true. This was a source of confusion in RSpec ticket #316. There is a spec covering this case if you need an example.
93
+
94
+ h2. Origin
95
+
96
+ This project was originally forked from:
97
+
98
+ "http://github.com/cjohansen/validatious-on-rails":http://github.com/pd/rspec_hpricot_matchers
99
+
100
+ h2. License
101
+
102
+ *Original work:*
103
+
104
+ Released under the MIT license.<br />
105
+ Copyright (c) 2008 "Kyle Hargraves":http://github.com/pd
@@ -0,0 +1,74 @@
1
+ # coding: utf-8
2
+ require 'rubygems'
3
+ require 'rake'
4
+ require 'rake/rdoctask'
5
+
6
+ begin
7
+ require 'spec/rake/spectask'
8
+ rescue LoadError
9
+ begin
10
+ gem 'rspec-rails', '>= 1.0.0'
11
+ require 'spec/rake/spectask'
12
+ rescue LoadError
13
+ puts "RSpec - or one of it's dependencies - is not available. Install it with: sudo gem install rspec-rails"
14
+ end
15
+ end
16
+
17
+ NAME = "rspec_tag_matchers"
18
+ SUMMARY = %Q{Implementation of have_tag() RSpec matcher using Nokogiri.}
19
+ DESCRIPTION = <<-END
20
+ rspec_tag_matchers provides an implementation of rspec_on_rails'
21
+ have_tag() matcher which does not depend on Rails' assert_select().
22
+ Using Nokogiri instead, the matcher is available to non-Rails projects,
23
+ and enjoys the full flexibility of Nokogiri's advanced and blazing fast
24
+ CSS and XPath selector support. Forked from rspec_hpricot_matchers.
25
+ END
26
+ HOMEPAGE = "http://github.com/grimen/#{NAME}"
27
+ AUTHOR = "Kyle Hargraves"
28
+ EMAIL = "pd@krh.me"
29
+ SUPPORT_FILES = %w(README.textile)
30
+
31
+ begin
32
+ gem 'jeweler', '>= 1.0.0'
33
+ require 'jeweler'
34
+
35
+ Jeweler::Tasks.new do |gemspec|
36
+ gemspec.name = NAME
37
+ gemspec.summary = SUMMARY
38
+ gemspec.description = DESCRIPTION
39
+ gemspec.homepage = HOMEPAGE
40
+ gemspec.author = AUTHOR
41
+ gemspec.email = EMAIL
42
+
43
+ gemspec.require_paths = %w{lib}
44
+ gemspec.files = SUPPORT_FILES << %w(MIT-LICENSE Rakefile) << Dir.glob(File.join(*%w[{generators,lib,test} ** *]).to_s)
45
+ gemspec.extra_rdoc_files = SUPPORT_FILES
46
+
47
+ gemspec.add_dependency 'nokogiri', '>= 1.4.0'
48
+ gemspec.add_dependency 'rspec-rails', '>= 1.2.6'
49
+ end
50
+
51
+ Jeweler::GemcutterTasks.new
52
+ rescue LoadError
53
+ puts "Jeweler - or one of it's dependencies - is not available. Install it with: sudo gem install jeweler -s http://gemcutter.org"
54
+ end
55
+
56
+ desc 'Default: Run specs.'
57
+ task :default => :spec
58
+
59
+ desc %Q{Generate documentation.}
60
+ Rake::RDocTask.new(:rdoc) do |rdoc|
61
+ rdoc.rdoc_dir = 'rdoc'
62
+ rdoc.title = NAME
63
+ rdoc.options << '--line-numbers' << '--inline-source' << '--charset=UTF-8'
64
+ rdoc.rdoc_files.include(SUPPORT_FILES)
65
+ rdoc.rdoc_files.include(File.join(*%w[lib ** *.rb]))
66
+ end
67
+
68
+ #if defined?(Spec)
69
+ desc 'Run specs.'
70
+ Spec::Rake::SpecTask.new('spec') do |t|
71
+ t.spec_files = FileList['spec/**/*_spec.rb']
72
+ t.spec_opts = ['-c']
73
+ end
74
+ #end
@@ -0,0 +1,9 @@
1
+ # coding: utf-8
2
+ require 'rubygems'
3
+ require 'nokogiri'
4
+
5
+ require 'rspec_tag_matchers/have_tag'
6
+
7
+ class Nokogiri::XML::Element
8
+ alias body inner_html
9
+ end
@@ -0,0 +1,114 @@
1
+ # coding: utf-8
2
+
3
+ module RspecTagMatchers
4
+ class HaveTag
5
+ def initialize(selector, inner_text_or_options, options, &block)
6
+ @selector = selector
7
+ if Hash === inner_text_or_options
8
+ @inner_text = nil
9
+ @options = inner_text_or_options
10
+ else
11
+ @inner_text = inner_text_or_options
12
+ @options = options
13
+ end
14
+ end
15
+
16
+ def matches?(actual, &block)
17
+ @actual = actual
18
+ @hdoc = hdoc_for(@actual)
19
+
20
+ matched_elements = @hdoc.search(@selector)
21
+ if matched_elements.empty?
22
+ return @options[:count] == 0
23
+ end
24
+
25
+ if @inner_text
26
+ matched_elements = filter_on_inner_text(matched_elements)
27
+ end
28
+
29
+ if block
30
+ matched_elements = filter_on_nested_expectations(matched_elements, block)
31
+ end
32
+
33
+ @actual_count = matched_elements.length
34
+ return false if not acceptable_count?(@actual_count)
35
+
36
+ !matched_elements.empty?
37
+ end
38
+
39
+ def failure_message
40
+ explanation = @actual_count ? "but found #{@actual_count}" : "but did not"
41
+ "expected\n#{@hdoc.to_s}\nto have #{failure_count_phrase} #{failure_selector_phrase}, #{explanation}"
42
+ end
43
+
44
+ def negative_failure_message
45
+ explanation = @actual_count ? "but found #{@actual_count}" : "but did"
46
+ "expected\n#{@hdoc.to_s}\nnot to have #{failure_count_phrase} #{failure_selector_phrase}, #{explanation}"
47
+ end
48
+
49
+ private
50
+ def hdoc_for(input)
51
+ if Nokogiri::XML::Document === input
52
+ input
53
+ elsif input.respond_to?(:body)
54
+ Nokogiri::HTML(input.body)
55
+ else
56
+ Nokogiri::HTML(input.to_s)
57
+ end
58
+ end
59
+
60
+ def filter_on_inner_text(elements)
61
+ elements.select do |el|
62
+ next(el.inner_text =~ @inner_text) if @inner_text.is_a?(Regexp)
63
+ el.inner_text == @inner_text
64
+ end
65
+ end
66
+
67
+ def filter_on_nested_expectations(elements, block)
68
+ elements.select do |el|
69
+ begin
70
+ block.call(el)
71
+ rescue Spec::Expectations::ExpectationNotMetError
72
+ false
73
+ else
74
+ true
75
+ end
76
+ end
77
+ end
78
+
79
+ def acceptable_count?(actual_count)
80
+ if @options[:count]
81
+ return false unless @options[:count] === actual_count
82
+ end
83
+ if @options[:minimum]
84
+ return false unless actual_count >= @options[:minimum]
85
+ end
86
+ if @options[:maximum]
87
+ return false unless actual_count <= @options[:maximum]
88
+ end
89
+ true
90
+ end
91
+
92
+ def failure_count_phrase
93
+ if @options[:count]
94
+ "#{@options[:count]} elements matching"
95
+ elsif @options[:minimum] || @options[:maximum]
96
+ count_explanations = []
97
+ count_explanations << "at least #{@options[:minimum]}" if @options[:minimum]
98
+ count_explanations << "at most #{@options[:maximum]}" if @options[:maximum]
99
+ "#{count_explanations.join(' and ')} elements matching"
100
+ else
101
+ "an element matching"
102
+ end
103
+ end
104
+
105
+ def failure_selector_phrase
106
+ phrase = @selector.inspect
107
+ phrase << (@inner_text ? " with inner text #{@inner_text.inspect}" : "")
108
+ end
109
+ end
110
+
111
+ def have_tag(selector, inner_text_or_options = nil, options = {}, &block)
112
+ HaveTag.new(selector, inner_text_or_options, options, &block)
113
+ end
114
+ end
@@ -0,0 +1,241 @@
1
+ # coding: utf-8
2
+ require File.join(File.dirname(__FILE__), *%w[.. spec_helper])
3
+
4
+ describe 'have_tag' do
5
+ before(:each) do
6
+ @html = "<ul><li>An egregiously long string</li></ul>"
7
+ end
8
+
9
+ it "should match against strings" do
10
+ @html.should have_tag('li')
11
+ end
12
+
13
+ it "should match against nokogiri documents" do
14
+ hdoc = Nokogiri::HTML(@html)
15
+ hdoc.should have_tag('li')
16
+ end
17
+
18
+ it "should use the response of #body if the target responds to it" do
19
+ response = Object.new
20
+ class << response
21
+ def body
22
+ "<ul><li>An egregiously long string</li></ul>"
23
+ end
24
+ end
25
+ response.should have_tag('li')
26
+ end
27
+
28
+ it "should not match when the target does not have the selected element" do
29
+ @html.should_not have_tag('dd')
30
+ end
31
+
32
+ it "should match against the inner text of the selected element" do
33
+ @html.should have_tag('li', 'An egregiously long string')
34
+ end
35
+
36
+ it "should match negatively against the inner text" do
37
+ @html.should_not have_tag('li', 'Some other string entirely')
38
+ end
39
+
40
+ it "should match against a Regexp describing the inner text" do
41
+ @html.should have_tag('li', /GREG/i)
42
+ end
43
+
44
+ it "should match negatively against a Regexp describing the inner text" do
45
+ @html.should_not have_tag('li', /GREG/)
46
+ end
47
+
48
+ it "should include the body in the failure message" do
49
+ lambda {
50
+ @html.should have_tag('abbr')
51
+ }.should raise_error(SpecFailed, /#{Regexp.escape(@html)}/)
52
+ end
53
+
54
+ it "should include the selector in the failure message" do
55
+ lambda {
56
+ @html.should have_tag('abbr')
57
+ }.should raise_error(SpecFailed, /"abbr"/)
58
+ end
59
+
60
+ it "should include the expected inner text if provided" do
61
+ lambda {
62
+ @html.should have_tag('li', /something else/)
63
+ }.should raise_error(SpecFailed, %r{/something else/})
64
+ end
65
+ end
66
+
67
+ describe 'have_tag inner expectations' do
68
+ before(:each) do
69
+ @html = "<ul><li>An egregiously long string</li></ul>"
70
+ end
71
+
72
+ it "should fail when the outer selector fails" do
73
+ lambda {
74
+ @html.should have_tag('dl') do |dl|
75
+ dl.should have_tag('li')
76
+ end
77
+ }.should raise_error(SpecFailed)
78
+ end
79
+
80
+ it "should match the inner expectations against the elements matched by the outer selector" do
81
+ @html.should have_tag('ul') do |ul|
82
+ ul.should have_tag('li')
83
+ end
84
+ end
85
+
86
+ it "should support negated inner expectations" do
87
+ @html.should have_tag('ul') do |ul|
88
+ ul.should_not have_tag('dd')
89
+ end
90
+ end
91
+
92
+ it "should treat multiple nested have_tag() expectations as a logical AND" do
93
+ @html.should have_tag('ul') do |ul|
94
+ ul.should have_tag('li')
95
+ ul.should_not have_tag('dd')
96
+ end
97
+ end
98
+
99
+ it "should only match against a single element at a time when nesting expectations (see RSpec LH#316)" do
100
+ html = <<-EOHTML
101
+ <ul>
102
+ <li>
103
+ <a href="1">1</a>
104
+ </li>
105
+ <li>
106
+ <a href="2">2</a>
107
+ <span>Hello</span>
108
+ </li>
109
+ </ul>
110
+ EOHTML
111
+
112
+ html.should have_tag('li', :count => 1) do |li|
113
+ li.should have_tag('a')
114
+ li.should have_tag('span')
115
+ end
116
+
117
+ html.should have_tag('li', :count => 1) do |li|
118
+ li.should have_tag('a')
119
+ li.should_not have_tag('span')
120
+ end
121
+
122
+ html.should have_tag('li', :count => 2) do |li|
123
+ li.should have_tag('a')
124
+ end
125
+ end
126
+
127
+ it "should yield elements which respond to #body" do
128
+ @html.should have_tag('ul') do |ul|
129
+ ul.should respond_to(:body)
130
+ end
131
+ end
132
+
133
+ it "should supports arbitrary expectations within the block" do
134
+ html = %q{<span class="sha1">cbc0bd52f99fe19304bccad383694e92b8ee2c71</span>}
135
+ html.should have_tag('span.sha1') do |span|
136
+ span.inner_text.length.should == 40
137
+ end
138
+ html.should_not have_tag('span.sha1') do |span|
139
+ span.inner_text.length.should == 41
140
+ end
141
+ end
142
+
143
+ it "should include a description of the inner expectation in the failure message" do
144
+ pending "No idea how to implement this."
145
+ end
146
+ end
147
+
148
+ describe 'have_tag with counts' do
149
+ before(:each) do
150
+ @html = <<-EOHTML
151
+ <ul>
152
+ <li>Foo</li>
153
+ <li>Bar</li>
154
+ <li>Foo again</li>
155
+ <li><a href="/baz">With inner elements</a></li>
156
+ </ul>
157
+ EOHTML
158
+ end
159
+
160
+ it "should treat an integer :count as expecting exactly n matched elements" do
161
+ @html.should have_tag('li', :count => 4)
162
+ @html.should_not have_tag('li', :count => 3)
163
+ @html.should_not have_tag('li', :count => 5)
164
+ end
165
+
166
+ it "should treat a range :count as expecting between x and y matched elements" do
167
+ @html.should have_tag('li', :count => 1..5)
168
+ @html.should_not have_tag('li', :count => 2..3)
169
+ end
170
+
171
+ it "should treat a :count of zero as if a negative match were expected" do
172
+ @html.should have_tag('dd', :count => 0)
173
+ end
174
+
175
+ it "should treat :minimum as expecting at least n matched elements" do
176
+ (0..4).each { |n| @html.should have_tag('li', :minimum => n) }
177
+ @html.should_not have_tag('li', :minimum => 5)
178
+ end
179
+
180
+ it "should treat :maximum as expecting at most n matched elements" do
181
+ @html.should_not have_tag('li', :maximum => 3)
182
+ @html.should have_tag('li', :maximum => 4)
183
+ @html.should have_tag('li', :maximum => 5)
184
+ end
185
+
186
+ it "should support matching of content while specifying a count" do
187
+ @html.should have_tag('li', /foo/i, :count => 2)
188
+ end
189
+
190
+ it "should work when the have_tag is nested" do
191
+ @html.should have_tag('ul') do |ul|
192
+ ul.should have_tag('li', :minimum => 2)
193
+ ul.should have_tag('li', /foo/i, :count => 2)
194
+ end
195
+ end
196
+
197
+ it "should include the actual number of elements matched in the failure message" do
198
+ lambda {
199
+ @html.should have_tag('li', :count => 3)
200
+ }.should raise_error(SpecFailed, /found 4/)
201
+ lambda {
202
+ @html.should have_tag('li', :count => 5)
203
+ }.should raise_error(SpecFailed, /found 4/)
204
+ end
205
+
206
+ it "should include the actual number of elements matched in the negative failure message" do
207
+ lambda {
208
+ @html.should_not have_tag('li', :count => 4)
209
+ }.should raise_error(SpecFailed, /found 4/)
210
+ end
211
+
212
+ it "should include the expected number of elements in the failure message" do
213
+ lambda {
214
+ @html.should have_tag('li', :count => 2)
215
+ }.should raise_error(SpecFailed, /to have 2 elements matching/)
216
+ end
217
+
218
+ it "should include the expected number of elements in the negative failure message" do
219
+ lambda {
220
+ @html.should_not have_tag('li', :count => 4)
221
+ }.should raise_error(SpecFailed, /to have 4 elements matching/)
222
+ end
223
+
224
+ it "should describe the :minimum case using 'at least ...'" do
225
+ lambda {
226
+ @html.should have_tag('li', :minimum => 80)
227
+ }.should raise_error(SpecFailed, /to have at least 80 elements matching/)
228
+ end
229
+
230
+ it "should describe the :maximum case using 'at most ...'" do
231
+ lambda {
232
+ @html.should have_tag('li', :maximum => 2)
233
+ }.should raise_error(SpecFailed, /to have at most 2 elements matching/)
234
+ end
235
+
236
+ it "should describe the :minimum and :maximum case using 'at least ... and at most ...'" do
237
+ lambda {
238
+ @html.should have_tag('li', :minimum => 8, :maximum => 30)
239
+ }.should raise_error(SpecFailed, /to have at least 8 and at most 30 elements matching/)
240
+ end
241
+ end
@@ -0,0 +1,11 @@
1
+ # coding: utf-8
2
+ $: << File.join(File.dirname(__FILE__), *%w[.. lib])
3
+ require 'rspec_tag_matchers'
4
+
5
+ Spec::Runner.configure do |config|
6
+ config.include(RspecTagMatchers)
7
+ end
8
+
9
+ unless defined?(SpecFailed)
10
+ SpecFailed = Spec::Expectations::ExpectationNotMetError
11
+ end
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rspec_tag_matchers
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Kyle Hargraves
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-11-22 00:00:00 +01:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: nokogiri
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.4.0
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec-rails
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.2.6
34
+ version:
35
+ description: " rspec_tag_matchers provides an implementation of rspec_on_rails'\n have_tag() matcher which does not depend on Rails' assert_select().\n Using Nokogiri instead, the matcher is available to non-Rails projects,\n and enjoys the full flexibility of Nokogiri's advanced and blazing fast \n CSS and XPath selector support. Forked from rspec_hpricot_matchers.\n"
36
+ email: pd@krh.me
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files:
42
+ - MIT-LICENSE
43
+ - README.textile
44
+ - Rakefile
45
+ - lib/rspec_tag_matchers.rb
46
+ - lib/rspec_tag_matchers/have_tag.rb
47
+ files:
48
+ - MIT-LICENSE
49
+ - README.textile
50
+ - Rakefile
51
+ - lib/rspec_tag_matchers.rb
52
+ - lib/rspec_tag_matchers/have_tag.rb
53
+ has_rdoc: true
54
+ homepage: http://github.com/grimen/rspec_tag_matchers
55
+ licenses: []
56
+
57
+ post_install_message:
58
+ rdoc_options:
59
+ - --charset=UTF-8
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: "0"
67
+ version:
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: "0"
73
+ version:
74
+ requirements: []
75
+
76
+ rubyforge_project:
77
+ rubygems_version: 1.3.5
78
+ signing_key:
79
+ specification_version: 3
80
+ summary: Implementation of have_tag() RSpec matcher using Nokogiri.
81
+ test_files:
82
+ - spec/rspec_tag_matchers/have_tag_spec.rb
83
+ - spec/spec_helper.rb