ryoba 1.0.0 → 1.1.0

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
- SHA1:
3
- metadata.gz: c8f9b74acd04ed36e1171fb82634e96d9da6bea4
4
- data.tar.gz: ce38a2666fa0e0cc710386bf97a06e52312a9c6a
2
+ SHA256:
3
+ metadata.gz: 16fd5950cac40b739a0578ed3af49099f4dc4866ea1e52b1e11b2120b4901320
4
+ data.tar.gz: 4899e26d14262f21ce419615ac1a574f9a6355fd24c7bf42c6b96044000a701b
5
5
  SHA512:
6
- metadata.gz: c341734a0b8656a61f4889b01a74b3ca2c3593532635ea533cf75c31d6e1859612641c24113e57df12ef1d21ba180b306cd32ab804a087e01a9f49453d0158e7
7
- data.tar.gz: be4be1c45496f21e0c4ed2d7da8627bf845306fd2970d77223984120c0b416517d8ec6c2a2a63e9f72271e997838cfe3e88c6aa0027f669d684b6e84ef9ac730
6
+ metadata.gz: ae9ff3dca31fad1510852a3af7270bab7641957f7a6b0f0fd54a2eafda9ecd062ca16fe3974eb791e4ef10cf74f162e81b4abc6d20a87637ca796d15ddf67b1f
7
+ data.tar.gz: 56298bda462fe9c8fe5bd6f4066bf7d83c89d9a806c2732e06915ff98d26a40743fa6528f39c5ed4a918dfe2674a2eb185b00e0378d49d644c54bcabea7f2140
@@ -0,0 +1,11 @@
1
+ ## 1.1.0
2
+
3
+ * Rename `Nokogiri::XML::Node#text!` to `#content!`, and alias as
4
+ `#text!` and `#inner_text!`
5
+ * Add `Nokogiri::XML::Node#content?`, and alias as `#inner_text?`
6
+ * Add `Nokogiri::XML::Document#uri`
7
+
8
+
9
+ ## 1.0.0
10
+
11
+ * Initial release
data/README.md CHANGED
@@ -5,11 +5,17 @@
5
5
 
6
6
  ## API
7
7
 
8
- - Nokogiri::XML::Node
8
+ - [Nokogiri::XML::Document](https://www.rubydoc.info/gems/ryoba/Nokogiri/XML/Document)
9
+ - [#uri](http://www.rubydoc.info/gems/ryoba/Nokogiri/XML/Document:uri)
10
+ - [Nokogiri::XML::Node](https://www.rubydoc.info/gems/ryoba/Nokogiri/XML/Node)
11
+ - [#content!](http://www.rubydoc.info/gems/ryoba/Nokogiri/XML/Node:content%21)
12
+ - aliased as [#inner_text!](http://www.rubydoc.info/gems/ryoba/Nokogiri/XML/Node:inner_text%21)
13
+ - aliased as [#text!](http://www.rubydoc.info/gems/ryoba/Nokogiri/XML/Node:text%21)
14
+ - [#content?](http://www.rubydoc.info/gems/ryoba/Nokogiri/XML/Node:content%3F)
15
+ - aliased as [#inner_text?](http://www.rubydoc.info/gems/ryoba/Nokogiri/XML/Node:inner_text%3F)
9
16
  - [#matches!](http://www.rubydoc.info/gems/ryoba/Nokogiri/XML/Node:matches%21)
10
- - [#text!](http://www.rubydoc.info/gems/ryoba/Nokogiri/XML/Node:text%21)
11
17
  - [#uri](http://www.rubydoc.info/gems/ryoba/Nokogiri/XML/Node:uri)
12
- - Nokogiri::XML::Searchable
18
+ - [Nokogiri::XML::Searchable](https://www.rubydoc.info/gems/ryoba/Nokogiri/XML/Searchable)
13
19
  - [#ancestor](http://www.rubydoc.info/gems/ryoba/Nokogiri/XML/Searchable:ancestor)
14
20
  - [#ancestor!](http://www.rubydoc.info/gems/ryoba/Nokogiri/XML/Searchable:ancestor%21)
15
21
  - [#ancestors!](http://www.rubydoc.info/gems/ryoba/Nokogiri/XML/Searchable:ancestors%21)
@@ -2,5 +2,6 @@ require "nokogiri"
2
2
 
3
3
  require_relative "ryoba/version"
4
4
  require_relative "ryoba/error"
5
+ require_relative "ryoba/nokogiri/xml/document"
5
6
  require_relative "ryoba/nokogiri/xml/node"
6
7
  require_relative "ryoba/nokogiri/xml/searchable"
File without changes
@@ -0,0 +1,19 @@
1
+ require "uri"
2
+
3
+ class Nokogiri::XML::Document
4
+
5
+ # Constructs a URI from the document's +url+ if +url+ is not nil.
6
+ #
7
+ # @example
8
+ # xml = Nokogiri::XML(<<-XML, "https://www.example.com/foo")
9
+ # <body>FOO</body>
10
+ # XML
11
+ #
12
+ # xml.uri # == URI("https://www.example.com/foo")
13
+ #
14
+ # @return [URI, nil]
15
+ def uri
16
+ URI(url) if url
17
+ end
18
+
19
+ end
@@ -2,25 +2,79 @@ require "uri"
2
2
 
3
3
  class Nokogiri::XML::Node
4
4
 
5
- # Equivalent to +.text.strip+, but raises an error if the result is an
5
+ # Equivalent to +.content.strip+, but returns nil if the result is an
6
6
  # empty string.
7
7
  #
8
+ # @example
9
+ # xml = Nokogiri::XML(<<-XML)
10
+ # <body>
11
+ # <h1>
12
+ # Headline 1
13
+ # </h1>
14
+ # <h2> Headline 2 </h2>
15
+ # <h3> </h3>
16
+ # </body>
17
+ # XML
18
+ #
19
+ # xml.at("h1").content? # == "Headline 1"
20
+ # xml.at("h2").content? # == "Headline 2"
21
+ # xml.at("h3").content? # == nil
22
+ #
23
+ # @return [String, nil]
24
+ def content?
25
+ result = self.content.strip
26
+ result unless result.empty?
27
+ end
28
+
29
+ alias_method :inner_text?, :content?
30
+
31
+ # Equivalent to +.content.strip+, but raises an error if the result is
32
+ # an empty string.
33
+ #
34
+ # @example
35
+ # xml = Nokogiri::XML(<<-XML)
36
+ # <body>
37
+ # <h1>
38
+ # Headline 1
39
+ # </h1>
40
+ # <h2> Headline 2 </h2>
41
+ # <h3> </h3>
42
+ # </body>
43
+ # XML
44
+ #
45
+ # xml.at("h1").content! # == "Headline 1"
46
+ # xml.at("h2").content! # == "Headline 2"
47
+ # xml.at("h3").content! # raise error
48
+ #
8
49
  # @return [String]
9
50
  # @raise [Ryoba::Error]
10
51
  # if result is an empty string
11
- def text!
12
- result = self.text.strip
52
+ def content!
53
+ result = self.content.strip
13
54
  if result.empty?
14
55
  raise Ryoba::Error.new("No text in:\n#{self.to_html}")
15
56
  end
16
57
  result
17
58
  end
18
59
 
19
- # Like +Node#matches?+, but, instead of returning a boolean, returns
20
- # the Node if it matches +selector+ and raises an error otherwise.
60
+ alias_method :inner_text!, :content!
61
+ alias_method :text!, :content!
62
+
63
+ # Like +Node#matches?+, but returns the Node if +selector+ matches,
64
+ # and raises an error otherwise.
65
+ #
66
+ # @example
67
+ # xml = Nokogiri::XML(<<-XML)
68
+ # <body>
69
+ # <div id="a" class="c" />
70
+ # <div id="b" />
71
+ # </body>
72
+ # XML
73
+ #
74
+ # xml.at("#a").matches(".c")! # == Node div#a.c
75
+ # xml.at("#b").matches(".c")! # raise error
21
76
  #
22
77
  # @param selector [String]
23
- # selector to match
24
78
  # @return [self]
25
79
  # @raise [Ryoba::Error]
26
80
  # if Node does not match +selector+
@@ -38,35 +92,33 @@ class Nokogiri::XML::Node
38
92
  "form" => "action",
39
93
  }
40
94
 
41
- # Returns a URI from a specified attribute's value. If no attribute
42
- # is specified, an appropriate attribute will be chosen from
43
- # {HTML_ELEMENT_URI_ATTRIBUTES} using the Node's +name+, if possible.
44
- # A relative URI will be converted to an absolute URI, based on the
45
- # Node document's +url+, if possible.
95
+ # Builds a URI from a specified attribute. If no attribute is
96
+ # specified, an element-appropriate attribute will be chosen from
97
+ # {HTML_ELEMENT_URI_ATTRIBUTES}, if possible. Relative URIs will be
98
+ # converted to absolute URIs using the Node document's +url+, if
99
+ # possible.
46
100
  #
47
101
  # @example
48
- # xml = Nokogiri::XML(<<-XML, "http://localhost/qux")
102
+ # xml = Nokogiri::XML(<<-XML, "http://localhost/qux/")
49
103
  # <body>
50
104
  # <a href="https://www.example.com/foo">FOO</a>
51
- # <div data-src="/bar" />
105
+ # <img src="/bar" />
106
+ # <div data-src="baz" />
52
107
  # <p>blah</p>
53
108
  # </body>
54
109
  # XML
55
110
  #
56
111
  # xml.at("a").uri # == URI("https://www.example.com/foo")
57
- # xml.at("div").uri("data-src") # == URI("http://localhost/qux/bar")
112
+ # xml.at("img").uri # == URI("http://localhost/bar")
113
+ # xml.at("div").uri("data-src") # == URI("http://localhost/qux/baz")
58
114
  # xml.at("p").uri # == nil
59
115
  #
60
116
  # @param attribute_name [String]
61
- # name of the attribute to return as a URI
62
117
  # @return [URI, nil]
63
118
  def uri(attribute_name = nil)
64
119
  attribute_name ||= HTML_ELEMENT_URI_ATTRIBUTES[self.name]
65
120
  url = self[attribute_name]
66
-
67
- if url
68
- self.document.url ? URI.join(self.document.url, url) : URI(url)
69
- end
121
+ URI.join(*self.document.url, url) if url
70
122
  end
71
123
 
72
124
  end
@@ -1,10 +1,21 @@
1
1
  module Nokogiri::XML::Searchable
2
2
 
3
- # Like +Searchable#search+, but raises an exception if there are no
3
+ # Like +Searchable#search+, but raises an error if there are no
4
4
  # results.
5
5
  #
6
+ # @example
7
+ # xml = Nokogiri::XML(<<-XML)
8
+ # <body>
9
+ # <div id="a" />
10
+ # <div id="b" />
11
+ # </body>
12
+ # XML
13
+ #
14
+ # xml.search!("div") # == NodeSet [div#a, div#b]
15
+ # xml.search!("img") # raise error
16
+ #
6
17
  # @param queries [Array<String>]
7
- # @return [Array<Nokogiri::XML::Element>]
18
+ # @return [Nokogiri::XML::NodeSet]
8
19
  # @raise [Ryoba::Error]
9
20
  # if all queries yield no results
10
21
  def search!(*queries)
@@ -15,8 +26,18 @@ module Nokogiri::XML::Searchable
15
26
  results
16
27
  end
17
28
 
18
- # Like +Searchable#at+, but raises an exception if there are no
19
- # results.
29
+ # Like +Searchable#at+, but raises an error if there are no results.
30
+ #
31
+ # @example
32
+ # xml = Nokogiri::XML(<<-XML)
33
+ # <body>
34
+ # <div id="a" />
35
+ # <div id="b" />
36
+ # </body>
37
+ # XML
38
+ #
39
+ # xml.at!("div") # == Node div#a
40
+ # xml.at!("img") # raise error
20
41
  #
21
42
  # @param queries [Array<String>]
22
43
  # @return [Nokogiri::XML::Element]
@@ -30,11 +51,26 @@ module Nokogiri::XML::Searchable
30
51
  result
31
52
  end
32
53
 
33
- # Like +Searchable#ancestors+, but raises an exception if there are no
54
+ # Like +Searchable#ancestors+, but raises an error if there are no
34
55
  # matching ancestors.
35
56
  #
57
+ # @example
58
+ # xml = Nokogiri::XML(<<-XML)
59
+ # <body>
60
+ # <div id="a">
61
+ # <div id="b">
62
+ # <img src="cat.jpg">
63
+ # </div>
64
+ # </div>
65
+ # </body>
66
+ # XML
67
+ #
68
+ # xml.at("img").ancestors!("div") # == NodeSet [div#b, div#a]
69
+ # xml.at("img").ancestors!("#a") # == NodeSet [div#a]
70
+ # xml.at("img").ancestors!("#z") # raise error
71
+ #
36
72
  # @param selector [String]
37
- # @return [Array<Nokogiri::XML::Element>]
73
+ # @return [Nokogiri::XML::NodeSet]
38
74
  # @raise [Ryoba::Error]
39
75
  # if no ancestors match +selector+
40
76
  def ancestors!(selector = nil)
@@ -48,6 +84,21 @@ module Nokogiri::XML::Searchable
48
84
  # Like +Searchable#ancestors+, but returns only the first matching
49
85
  # ancestor.
50
86
  #
87
+ # @example
88
+ # xml = Nokogiri::XML(<<-XML)
89
+ # <body>
90
+ # <div id="a">
91
+ # <div id="b">
92
+ # <img src="cat.jpg">
93
+ # </div>
94
+ # </div>
95
+ # </body>
96
+ # XML
97
+ #
98
+ # xml.at("img").ancestor("div") # == Node div#b
99
+ # xml.at("img").ancestor("#a") # == Node div#a
100
+ # xml.at("img").ancestor("#z") # == nil
101
+ #
51
102
  # @param selector [String]
52
103
  # @return [Nokogiri::XML::Element, nil]
53
104
  def ancestor(selector = nil)
@@ -57,6 +108,21 @@ module Nokogiri::XML::Searchable
57
108
  # Like +Searchable#ancestors!+, but returns only the first matching
58
109
  # ancestor.
59
110
  #
111
+ # @example
112
+ # xml = Nokogiri::XML(<<-XML)
113
+ # <body>
114
+ # <div id="a">
115
+ # <div id="b">
116
+ # <img src="cat.jpg">
117
+ # </div>
118
+ # </div>
119
+ # </body>
120
+ # XML
121
+ #
122
+ # xml.at("img").ancestor!("div") # == Node div#b
123
+ # xml.at("img").ancestor!("#a") # == Node div#a
124
+ # xml.at("img").ancestor!("#z") # raise error
125
+ #
60
126
  # @param selector [String]
61
127
  # @return [Nokogiri::XML::Element]
62
128
  # @raise [Ryoba::Error]
@@ -1,3 +1,3 @@
1
1
  module Ryoba
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ryoba
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Hefner
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-04-16 00:00:00.000000000 Z
11
+ date: 2019-07-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -95,12 +95,14 @@ extra_rdoc_files: []
95
95
  files:
96
96
  - ".gitignore"
97
97
  - ".travis.yml"
98
+ - CHANGELOG.md
98
99
  - Gemfile
99
100
  - LICENSE.txt
100
101
  - README.md
101
102
  - Rakefile
102
103
  - lib/ryoba.rb
103
104
  - lib/ryoba/error.rb
105
+ - lib/ryoba/nokogiri/xml/document.rb
104
106
  - lib/ryoba/nokogiri/xml/node.rb
105
107
  - lib/ryoba/nokogiri/xml/searchable.rb
106
108
  - lib/ryoba/version.rb
@@ -124,8 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
124
126
  - !ruby/object:Gem::Version
125
127
  version: '0'
126
128
  requirements: []
127
- rubyforge_project:
128
- rubygems_version: 2.6.13
129
+ rubygems_version: 3.0.1
129
130
  signing_key:
130
131
  specification_version: 4
131
132
  summary: Nokogiri utility methods