nokogiri_bang_finders 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -1
- data/README.md +8 -0
- data/Rakefile +5 -0
- data/lib/nokogiri_bang_finders.rb +19 -2
- data/lib/nokogiri_bang_finders/version.rb +1 -1
- data/nokogiri_bang_finders.gemspec +1 -1
- data/spec/nokogiri_bang_finders_spec.rb +70 -3
- data/spec/spec_helper.rb +9 -1
- metadata +17 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 38f3b45d9436abb86e0308f5eb9edf95baf0fdbc
|
4
|
+
data.tar.gz: b84eb8c29d48d8546ddd84bde32ee78901b09095
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 716b0b308507f3598b3cc50ec9a25e680258448f43131922bc8b55c0b759c83749ac6ad270a69c27a4b2eb1552a9675baf25c0c2a2d888c977241ed01fc3bd43
|
7
|
+
data.tar.gz: 7ecb8574b7322a8dc6e77f8fa334abd5c1062ad0b2bb92047bde36ca1df3706d8f126f77131a7126a085eea6d31475e824a6e072802ea8834068159df0d178f1
|
data/CHANGELOG.md
CHANGED
@@ -4,7 +4,13 @@ All notable changes to this project will be documented in this file. Version num
|
|
4
4
|
|
5
5
|
## Unreleased
|
6
6
|
|
7
|
-
|
7
|
+
None
|
8
|
+
|
9
|
+
## 1.1.0 - 2015-03-19
|
10
|
+
|
11
|
+
### Added
|
12
|
+
|
13
|
+
Allow user to specify an integer number of characters of context to be given with exceptions, or to request `:all` context, using `Nokogiri::XML::BangFinders.context_length = some_value`
|
8
14
|
|
9
15
|
## 1.0.0 - 2014-08-14
|
10
16
|
|
data/README.md
CHANGED
@@ -25,6 +25,14 @@ Each method just calls its non-bang namesake and, if the result is `nil`, raises
|
|
25
25
|
|
26
26
|
This gem is so tiny, you could just copy and paste its code. But if it's convenient, use it. :smile:
|
27
27
|
|
28
|
+
## Context
|
29
|
+
|
30
|
+
When an exception is raised, its message includes some context from the document, to show "I was looking for your selector in a document that looks like this". By default, up to 200 characters of context are given.
|
31
|
+
|
32
|
+
You can specify an integer number of characters of context, like `Nokogiri::XML::BangFinders.context_length = 500`.
|
33
|
+
|
34
|
+
Or you can specify `:all` to get the whole document in the exception message (though this probably isn't a good idea for production code): `Nokogiri::XML::BangFinders.context_length = :all`
|
35
|
+
|
28
36
|
## Installation
|
29
37
|
|
30
38
|
$ gem install nokogiri_bang_finders
|
data/Rakefile
CHANGED
@@ -3,6 +3,19 @@ require "nokogiri_bang_finders/version"
|
|
3
3
|
module Nokogiri
|
4
4
|
module XML
|
5
5
|
module BangFinders
|
6
|
+
|
7
|
+
def self.context_length
|
8
|
+
@context_length ||= 200
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.context_length=(val)
|
12
|
+
@context_length = if val.to_s == "all"
|
13
|
+
Float::INFINITY
|
14
|
+
else
|
15
|
+
val.to_i
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
6
19
|
def at!(*args)
|
7
20
|
node = at(*args); raise NotFound.new(args, self) if node.nil?; node
|
8
21
|
end
|
@@ -20,11 +33,15 @@ module Nokogiri
|
|
20
33
|
class NotFound < StandardError
|
21
34
|
attr_reader :message
|
22
35
|
def initialize(needle, haystack)
|
23
|
-
@message = "#{needle} in \n#{snippet(haystack)}"
|
36
|
+
@message = "#{needle} in \n#{snippet(haystack)}\n"
|
24
37
|
end
|
25
38
|
def snippet(haystack)
|
26
39
|
snippet = haystack.to_s
|
27
|
-
snippet.length
|
40
|
+
snippet.length <= context_length ? snippet : "#{snippet[0..(context_length - 1)]}...\n"
|
41
|
+
end
|
42
|
+
|
43
|
+
def context_length
|
44
|
+
Nokogiri::XML::BangFinders.context_length
|
28
45
|
end
|
29
46
|
end
|
30
47
|
end
|
@@ -21,6 +21,6 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_dependency "nokogiri", ">= 1.0"
|
22
22
|
|
23
23
|
spec.add_development_dependency "bundler", "~> 1.5"
|
24
|
-
spec.add_development_dependency "rspec",
|
24
|
+
spec.add_development_dependency "rspec", "~> 3.2"
|
25
25
|
spec.add_development_dependency "rake"
|
26
26
|
end
|
@@ -25,7 +25,9 @@ describe Nokogiri::XML::BangFinders do
|
|
25
25
|
describe "when #at returns nil" do
|
26
26
|
|
27
27
|
it "raises an exception describing the failed search" do
|
28
|
-
|
28
|
+
e = exception_from { xml_doc.at!("robots") }
|
29
|
+
expect(e).to be_a(Nokogiri::XML::NotFound)
|
30
|
+
expect(e.message).to match(/robots/)
|
29
31
|
end
|
30
32
|
|
31
33
|
end
|
@@ -50,7 +52,9 @@ describe Nokogiri::XML::BangFinders do
|
|
50
52
|
describe "when #at_css returns nil" do
|
51
53
|
|
52
54
|
it "raises an exception describing the failed search" do
|
53
|
-
|
55
|
+
e = exception_from { xml_doc.at_css!("robots") }
|
56
|
+
expect(e).to be_a(Nokogiri::XML::NotFound)
|
57
|
+
expect(e.message).to match(/robots/)
|
54
58
|
end
|
55
59
|
|
56
60
|
end
|
@@ -75,7 +79,70 @@ describe Nokogiri::XML::BangFinders do
|
|
75
79
|
describe "when #at_xpath returns nil" do
|
76
80
|
|
77
81
|
it "raises an exception describing the failed search" do
|
78
|
-
|
82
|
+
e = exception_from { xml_doc.at_xpath!("//robots") }
|
83
|
+
expect(e).to be_a(Nokogiri::XML::NotFound)
|
84
|
+
expect(e.message).to match(/\/\/robots/)
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "providing context with an exception" do
|
92
|
+
|
93
|
+
let(:xml_doc) {
|
94
|
+
body = "<root><numbers>"
|
95
|
+
1_000.times do |i|
|
96
|
+
body << "<number>#{i}</number>"
|
97
|
+
end
|
98
|
+
body << "</numbers></root>"
|
99
|
+
Nokogiri::XML(body)
|
100
|
+
}
|
101
|
+
|
102
|
+
it "does not include the whole document" do
|
103
|
+
e = exception_from { xml_doc.at_css!("robots") }
|
104
|
+
expect(e.message).not_to include(xml_doc.to_s)
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
it "includes the first 200 characters of the document by default" do
|
109
|
+
e = exception_from { xml_doc.at_css!("robots") }
|
110
|
+
expect(e.message ).to include(xml_doc.to_s[0..199])
|
111
|
+
expect(e.message).not_to include(xml_doc.to_s[0..200])
|
112
|
+
end
|
113
|
+
|
114
|
+
describe "specifying how much document context to supply with errors" do
|
115
|
+
|
116
|
+
before :each do
|
117
|
+
@original_setting = Nokogiri::XML::BangFinders.context_length
|
118
|
+
Nokogiri::XML::BangFinders.context_length = specified_context
|
119
|
+
end
|
120
|
+
|
121
|
+
after :each do
|
122
|
+
Nokogiri::XML::BangFinders.context_length = @original_setting
|
123
|
+
end
|
124
|
+
|
125
|
+
describe "when context_length is given as a number" do
|
126
|
+
|
127
|
+
let(:specified_context) { 10 }
|
128
|
+
|
129
|
+
it "includes the specified number of characters of context" do
|
130
|
+
e = exception_from { xml_doc.at_css!("robots") }
|
131
|
+
expect(e.message ).to include(xml_doc.to_s[0..9])
|
132
|
+
expect(e.message).not_to include(xml_doc.to_s[0..10])
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
|
137
|
+
describe "when context is given as 'all'" do
|
138
|
+
|
139
|
+
let(:specified_context) { :all }
|
140
|
+
|
141
|
+
it "includes the entire document" do
|
142
|
+
e = exception_from { xml_doc.at_css!("robots") }
|
143
|
+
expect(e.message ).to include(xml_doc.to_s)
|
144
|
+
end
|
145
|
+
|
79
146
|
end
|
80
147
|
|
81
148
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -3,7 +3,6 @@ require 'nokogiri_bang_finders'
|
|
3
3
|
|
4
4
|
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
5
5
|
RSpec.configure do |config|
|
6
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
7
6
|
config.run_all_when_everything_filtered = true
|
8
7
|
config.filter_run :focus
|
9
8
|
|
@@ -13,3 +12,12 @@ RSpec.configure do |config|
|
|
13
12
|
# --seed 1234
|
14
13
|
config.order = 'random'
|
15
14
|
end
|
15
|
+
|
16
|
+
def exception_from
|
17
|
+
begin
|
18
|
+
yield
|
19
|
+
rescue => e
|
20
|
+
return e
|
21
|
+
end
|
22
|
+
fail "Tried to get the exception from the block given, but it didn't raise one"
|
23
|
+
end
|
metadata
CHANGED
@@ -1,69 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nokogiri_bang_finders
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Long
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-03-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - ~>
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '1.5'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - ~>
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.5'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - ~>
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 2
|
47
|
+
version: '3.2'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - ~>
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 2
|
54
|
+
version: '3.2'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
description: Adds XML finders to Nokogiri that raise if nothing is found.
|
@@ -73,8 +73,8 @@ executables: []
|
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
|
-
- .gitignore
|
77
|
-
- .rspec
|
76
|
+
- ".gitignore"
|
77
|
+
- ".rspec"
|
78
78
|
- CHANGELOG.md
|
79
79
|
- Gemfile
|
80
80
|
- LICENSE.txt
|
@@ -95,17 +95,17 @@ require_paths:
|
|
95
95
|
- lib
|
96
96
|
required_ruby_version: !ruby/object:Gem::Requirement
|
97
97
|
requirements:
|
98
|
-
- -
|
98
|
+
- - ">="
|
99
99
|
- !ruby/object:Gem::Version
|
100
100
|
version: '0'
|
101
101
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
102
102
|
requirements:
|
103
|
-
- -
|
103
|
+
- - ">="
|
104
104
|
- !ruby/object:Gem::Version
|
105
105
|
version: '0'
|
106
106
|
requirements: []
|
107
107
|
rubyforge_project:
|
108
|
-
rubygems_version: 2.
|
108
|
+
rubygems_version: 2.2.2
|
109
109
|
signing_key:
|
110
110
|
specification_version: 4
|
111
111
|
summary: Adds XML finders to Nokogiri that raise if nothing is found.
|