blather 0.5.0 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +7 -0
- data/LICENSE +1 -1
- data/README.md +2 -2
- data/blather.gemspec +1 -1
- data/lib/blather.rb +1 -2
- data/lib/blather/version.rb +1 -1
- data/lib/blather/xmpp_node.rb +5 -169
- data/spec/blather/xmpp_node_spec.rb +0 -195
- metadata +53 -26
- data/lib/blather/core_ext/nokogiri.rb +0 -44
- data/spec/blather/core_ext/nokogiri_spec.rb +0 -83
data/CHANGELOG
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
v0.5.2
|
2
|
+
Bugfix(benlangfeld): Remove specs for the Nokogiri extensions which were moved out
|
3
|
+
|
4
|
+
v0.5.1 - yanked
|
5
|
+
Feature(benlangfeld): Abstract out Nokogiri extensions and helpers into new Niceogiri gem for better sharing
|
6
|
+
Documentation(benlangfeld)
|
7
|
+
|
1
8
|
v0.5.0
|
2
9
|
Feature(radsaq): Add a #connected? method on Blather::Client
|
3
10
|
Feature(benlangfeld)[API change]: Allow the removal of child nodes from an IQ reply
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -19,7 +19,7 @@ XMPP DSL (and more) for Ruby written on EventMachine and Nokogiri.
|
|
19
19
|
|
20
20
|
## Installation
|
21
21
|
|
22
|
-
|
22
|
+
gem install blather
|
23
23
|
|
24
24
|
## Example
|
25
25
|
|
@@ -173,4 +173,4 @@ than a change set made directly on master.
|
|
173
173
|
|
174
174
|
# Copyright
|
175
175
|
|
176
|
-
Copyright (c)
|
176
|
+
Copyright (c) 2011 Jeff Smick. See LICENSE for details.
|
data/blather.gemspec
CHANGED
@@ -8,7 +8,6 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
9
|
s.authors = ["Jeff Smick"]
|
10
10
|
s.email = %q{sprsquish@gmail.com}
|
11
|
-
s.date = %q{2010-09-02}
|
12
11
|
s.homepage = "http://github.com/sprsquish/blather"
|
13
12
|
s.summary = %q{Simpler XMPP built for speed}
|
14
13
|
s.description = %q{An XMPP DSL for Ruby written on top of EventMachine and Nokogiri}
|
@@ -23,6 +22,7 @@ Gem::Specification.new do |s|
|
|
23
22
|
|
24
23
|
s.add_dependency("eventmachine", ["~> 0.12.6"])
|
25
24
|
s.add_dependency("nokogiri", [">= 1.4.0"])
|
25
|
+
s.add_dependency("niceogiri", [">= 0.0.4"])
|
26
26
|
s.add_dependency("minitest", [">= 1.7.1"])
|
27
27
|
s.add_dependency("activesupport", [">= 3.0.7"])
|
28
28
|
|
data/lib/blather.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
%w[
|
3
3
|
rubygems
|
4
4
|
eventmachine
|
5
|
-
|
5
|
+
niceogiri
|
6
6
|
ipaddr
|
7
7
|
digest/md5
|
8
8
|
digest/sha1
|
@@ -13,7 +13,6 @@
|
|
13
13
|
|
14
14
|
blather/core_ext/eventmachine
|
15
15
|
blather/core_ext/ipaddr
|
16
|
-
blather/core_ext/nokogiri
|
17
16
|
|
18
17
|
blather/errors
|
19
18
|
blather/errors/sasl_error
|
data/lib/blather/version.rb
CHANGED
data/lib/blather/xmpp_node.rb
CHANGED
@@ -2,15 +2,14 @@ module Blather
|
|
2
2
|
|
3
3
|
# Base XML Node
|
4
4
|
# All XML classes subclass XMPPNode it allows the addition of helpers
|
5
|
-
class XMPPNode <
|
5
|
+
class XMPPNode < Niceogiri::XML::Node
|
6
6
|
# @private
|
7
7
|
BASE_NAMES = %w[presence message iq].freeze
|
8
8
|
|
9
9
|
# @private
|
10
10
|
@@registrations = {}
|
11
11
|
|
12
|
-
class_inheritable_accessor
|
13
|
-
:registered_name
|
12
|
+
class_inheritable_accessor :registered_ns, :registered_name
|
14
13
|
|
15
14
|
# Register a new stanza class to a name and/or namespace
|
16
15
|
#
|
@@ -32,8 +31,7 @@ module Blather
|
|
32
31
|
# @param [String, nil] xmlns the namespace the node belongs to
|
33
32
|
# @return [Class, nil] the class appropriate for the name/ns combination
|
34
33
|
def self.class_from_registration(name, ns = nil)
|
35
|
-
name
|
36
|
-
@@registrations[[name, ns]]
|
34
|
+
@@registrations[[name.to_s, ns]]
|
37
35
|
end
|
38
36
|
|
39
37
|
# Import an XML::Node to the appropriate class
|
@@ -58,43 +56,8 @@ module Blather
|
|
58
56
|
# @param [XML::Document, nil] doc the document to attach the node to. If
|
59
57
|
# not provided one will be created
|
60
58
|
# @return a new object with the registered name and namespace
|
61
|
-
def self.new(name =
|
62
|
-
name
|
63
|
-
|
64
|
-
node = super name.to_s, (doc || Nokogiri::XML::Document.new)
|
65
|
-
node.document.root = node unless doc
|
66
|
-
node.namespace = self.registered_ns unless BASE_NAMES.include?(name.to_s)
|
67
|
-
node
|
68
|
-
end
|
69
|
-
|
70
|
-
# Helper method to read an attribute
|
71
|
-
#
|
72
|
-
# @param [#to_sym] attr_name the name of the attribute
|
73
|
-
# @param [String, Symbol, nil] to_call the name of the method to call on
|
74
|
-
# the returned value
|
75
|
-
# @return nil or the value
|
76
|
-
def read_attr(attr_name, to_call = nil)
|
77
|
-
val = self[attr_name.to_sym]
|
78
|
-
val && to_call ? val.__send__(to_call) : val
|
79
|
-
end
|
80
|
-
|
81
|
-
# Helper method to write a value to an attribute
|
82
|
-
#
|
83
|
-
# @param [#to_sym] attr_name the name of the attribute
|
84
|
-
# @param [#to_s] value the value to set the attribute to
|
85
|
-
def write_attr(attr_name, value)
|
86
|
-
self[attr_name.to_sym] = value
|
87
|
-
end
|
88
|
-
|
89
|
-
# Helper method to read the content of a node
|
90
|
-
#
|
91
|
-
# @param [#to_sym] node the name of the node
|
92
|
-
# @param [String, Symbol, nil] to_call the name of the method to call on
|
93
|
-
# the returned value
|
94
|
-
# @return nil or the value
|
95
|
-
def read_content(node, to_call = nil)
|
96
|
-
val = content_from node.to_sym
|
97
|
-
val && to_call ? val.__send__(to_call) : val
|
59
|
+
def self.new(name = registered_name, doc = nil)
|
60
|
+
super name, doc, BASE_NAMES.include?(name.to_s) ? nil : self.registered_ns
|
98
61
|
end
|
99
62
|
|
100
63
|
# Turn the object into a proper stanza
|
@@ -103,133 +66,6 @@ module Blather
|
|
103
66
|
def to_stanza
|
104
67
|
self.class.import self
|
105
68
|
end
|
106
|
-
|
107
|
-
# @private
|
108
|
-
alias_method :nokogiri_namespace=, :namespace=
|
109
|
-
# Attach a namespace to the node
|
110
|
-
#
|
111
|
-
# @overload namespace=(ns)
|
112
|
-
# Attach an already created XML::Namespace
|
113
|
-
# @param [XML::Namespace] ns the namespace object
|
114
|
-
# @overload namespace=(ns)
|
115
|
-
# Create a new namespace and attach it
|
116
|
-
# @param [String] ns the namespace uri
|
117
|
-
# @overload namespace=(namespaces)
|
118
|
-
# Createa and add new namespaces from a hash
|
119
|
-
# @param [Hash] namespaces a hash of prefix => uri pairs
|
120
|
-
def namespace=(namespaces)
|
121
|
-
case namespaces
|
122
|
-
when Nokogiri::XML::Namespace
|
123
|
-
self.nokogiri_namespace = namespaces
|
124
|
-
when String
|
125
|
-
self.add_namespace nil, namespaces
|
126
|
-
when Hash
|
127
|
-
if ns = namespaces.delete(nil)
|
128
|
-
self.add_namespace nil, ns
|
129
|
-
end
|
130
|
-
namespaces.each do |p, n|
|
131
|
-
ns = self.add_namespace p, n
|
132
|
-
self.nokogiri_namespace = ns
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
# Helper method to get the node's namespace
|
138
|
-
#
|
139
|
-
# @return [XML::Namespace, nil] The node's namespace object if it exists
|
140
|
-
def namespace_href
|
141
|
-
namespace.href if namespace
|
142
|
-
end
|
143
|
-
|
144
|
-
# Remove a child with the name and (optionally) namespace given
|
145
|
-
#
|
146
|
-
# @param [String] name the name or xpath of the node to remove
|
147
|
-
# @param [String, nil] ns the namespace the node is in
|
148
|
-
def remove_child(name, ns = nil)
|
149
|
-
child = xpath(name, ns).first
|
150
|
-
child.remove if child
|
151
|
-
end
|
152
|
-
|
153
|
-
# Remove all children with a given name regardless of namespace
|
154
|
-
#
|
155
|
-
# @param [String] name the name of the nodes to remove
|
156
|
-
def remove_children(name)
|
157
|
-
xpath("./*[local-name()='#{name}']").remove
|
158
|
-
end
|
159
|
-
|
160
|
-
# The content of the named node
|
161
|
-
#
|
162
|
-
# @param [String] name the name or xpath of the node
|
163
|
-
# @param [String, nil] ns the namespace the node is in
|
164
|
-
# @return [String, nil] the content of the node
|
165
|
-
def content_from(name, ns = nil)
|
166
|
-
child = xpath(name, ns).first
|
167
|
-
child.content if child
|
168
|
-
end
|
169
|
-
|
170
|
-
# Sets the content for the specified node.
|
171
|
-
# If the node exists it is updated. If not a new node is created
|
172
|
-
# If the node exists and the content is nil, the node will be removed
|
173
|
-
# entirely
|
174
|
-
#
|
175
|
-
# @param [String] node the name of the node to update/create
|
176
|
-
# @param [String, nil] content the content to set within the node
|
177
|
-
def set_content_for(node, content = nil)
|
178
|
-
if content
|
179
|
-
child = xpath(node).first
|
180
|
-
self << (child = XMPPNode.new(node, self.document)) unless child
|
181
|
-
child.content = content
|
182
|
-
else
|
183
|
-
remove_child node
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
alias_method :copy, :dup
|
188
|
-
|
189
|
-
# Inherit the attributes and children of an XML::Node
|
190
|
-
#
|
191
|
-
# @param [XML::Node] stanza the node to inherit
|
192
|
-
# @return [self]
|
193
|
-
def inherit(stanza)
|
194
|
-
set_namespace stanza.namespace if stanza.namespace
|
195
|
-
inherit_attrs stanza.attributes
|
196
|
-
stanza.children.each do |c|
|
197
|
-
self << (n = c.dup)
|
198
|
-
ns = n.namespace_definitions.find { |ns| ns.prefix == c.namespace.prefix }
|
199
|
-
n.namespace = ns if ns
|
200
|
-
end
|
201
|
-
self
|
202
|
-
end
|
203
|
-
|
204
|
-
# Inherit a set of attributes
|
205
|
-
#
|
206
|
-
# @param [Hash] attrs a hash of attributes to set on the node
|
207
|
-
# @return [self]
|
208
|
-
def inherit_attrs(attrs)
|
209
|
-
attrs.each { |name, value| self[name] = value }
|
210
|
-
self
|
211
|
-
end
|
212
|
-
|
213
|
-
# The node as XML
|
214
|
-
#
|
215
|
-
# @return [String] XML representation of the node
|
216
|
-
def inspect
|
217
|
-
self.to_xml
|
218
|
-
end
|
219
|
-
|
220
|
-
# Check that a set of fields are equal between nodes
|
221
|
-
#
|
222
|
-
# @param [XMPPNode] other the other node to compare against
|
223
|
-
# @param [*#to_s] fields the set of fields to compare
|
224
|
-
# @return [Fixnum<-1,0,1>]
|
225
|
-
def eql?(o, *fields)
|
226
|
-
o.is_a?(self.class) && fields.all? { |f| self.__send__(f) == o.__send__(f) }
|
227
|
-
end
|
228
|
-
|
229
|
-
# @private
|
230
|
-
def ==(o)
|
231
|
-
eql?(o)
|
232
|
-
end
|
233
69
|
end # XMPPNode
|
234
70
|
|
235
71
|
end # Blather
|
@@ -3,28 +3,6 @@ require 'spec_helper'
|
|
3
3
|
describe Blather::XMPPNode do
|
4
4
|
before { @doc = Nokogiri::XML::Document.new }
|
5
5
|
|
6
|
-
it 'generates a new node automatically setting the document' do
|
7
|
-
n = Blather::XMPPNode.new 'foo'
|
8
|
-
n.element_name.must_equal 'foo'
|
9
|
-
n.document.wont_equal @doc
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'sets the new document root to the node' do
|
13
|
-
n = Blather::XMPPNode.new 'foo'
|
14
|
-
n.document.root.must_equal n
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'does not set the document root if the document is provided' do
|
18
|
-
n = Blather::XMPPNode.new 'foo', @doc
|
19
|
-
n.document.root.wont_equal n
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'generates a new node with the given document' do
|
23
|
-
n = Blather::XMPPNode.new 'foo', @doc
|
24
|
-
n.element_name.must_equal 'foo'
|
25
|
-
n.document.must_equal @doc
|
26
|
-
end
|
27
|
-
|
28
6
|
it 'generates a node based on the registered_name' do
|
29
7
|
foo = Class.new(Blather::XMPPNode)
|
30
8
|
foo.registered_name = 'foo'
|
@@ -51,182 +29,9 @@ describe Blather::XMPPNode do
|
|
51
29
|
Blather::XMPPNode.import(n).must_be_kind_of ImportSubClass
|
52
30
|
end
|
53
31
|
|
54
|
-
it 'provides an attribute reader' do
|
55
|
-
foo = Blather::XMPPNode.new
|
56
|
-
foo.read_attr(:bar).must_be_nil
|
57
|
-
foo[:bar] = 'baz'
|
58
|
-
foo.read_attr(:bar).must_equal 'baz'
|
59
|
-
end
|
60
|
-
|
61
|
-
it 'provides an attribute reader with converstion' do
|
62
|
-
foo = Blather::XMPPNode.new
|
63
|
-
foo.read_attr(:bar, :to_sym).must_be_nil
|
64
|
-
foo[:bar] = 'baz'
|
65
|
-
foo.read_attr(:bar, :to_sym).must_equal :baz
|
66
|
-
end
|
67
|
-
|
68
|
-
it 'provides an attribute writer' do
|
69
|
-
foo = Blather::XMPPNode.new
|
70
|
-
foo[:bar].must_be_nil
|
71
|
-
foo.write_attr(:bar, 'baz')
|
72
|
-
foo[:bar].must_equal 'baz'
|
73
|
-
end
|
74
|
-
|
75
|
-
it 'provides a content reader' do
|
76
|
-
foo = Blather::XMPPNode.new('foo')
|
77
|
-
foo << (bar = Blather::XMPPNode.new('bar', foo.document))
|
78
|
-
bar.content = 'baz'
|
79
|
-
foo.read_content(:bar).must_equal 'baz'
|
80
|
-
end
|
81
|
-
|
82
|
-
it 'provides a content reader that converts the value' do
|
83
|
-
foo = Blather::XMPPNode.new('foo')
|
84
|
-
foo << (bar = Blather::XMPPNode.new('bar', foo.document))
|
85
|
-
bar.content = 'baz'
|
86
|
-
foo.read_content(:bar, :to_sym).must_equal :baz
|
87
|
-
end
|
88
|
-
|
89
|
-
it 'provides a content writer' do
|
90
|
-
foo = Blather::XMPPNode.new('foo')
|
91
|
-
foo.set_content_for :bar, 'baz'
|
92
|
-
foo.content_from(:bar).must_equal 'baz'
|
93
|
-
end
|
94
|
-
|
95
|
-
it 'provides a content writer that removes a child when set to nil' do
|
96
|
-
foo = Blather::XMPPNode.new('foo')
|
97
|
-
foo << (bar = Blather::XMPPNode.new('bar', foo.document))
|
98
|
-
bar.content = 'baz'
|
99
|
-
foo.content_from(:bar).must_equal 'baz'
|
100
|
-
foo.xpath('bar').wont_be_empty
|
101
|
-
|
102
|
-
foo.set_content_for :bar, nil
|
103
|
-
foo.content_from(:bar).must_be_nil
|
104
|
-
foo.xpath('bar').must_be_empty
|
105
|
-
end
|
106
|
-
|
107
32
|
it 'can convert itself into a stanza' do
|
108
33
|
class StanzaConvert < Blather::XMPPNode; register 'foo'; end
|
109
34
|
n = Blather::XMPPNode.new('foo')
|
110
35
|
n.to_stanza.must_be_kind_of StanzaConvert
|
111
36
|
end
|
112
|
-
|
113
|
-
it 'provides "attr_accessor" for namespace' do
|
114
|
-
n = Blather::XMPPNode.new('foo')
|
115
|
-
n.namespace.must_be_nil
|
116
|
-
|
117
|
-
n.namespace = 'foo:bar'
|
118
|
-
n.namespace_href.must_equal 'foo:bar'
|
119
|
-
end
|
120
|
-
|
121
|
-
it 'will remove a child element' do
|
122
|
-
n = Blather::XMPPNode.new 'foo'
|
123
|
-
n << Blather::XMPPNode.new('bar', n.document)
|
124
|
-
n << Blather::XMPPNode.new('bar', n.document)
|
125
|
-
|
126
|
-
n.find(:bar).size.must_equal 2
|
127
|
-
n.remove_child 'bar'
|
128
|
-
n.find(:bar).size.must_equal 1
|
129
|
-
end
|
130
|
-
|
131
|
-
it 'will remove a child with a specific xmlns' do
|
132
|
-
n = Blather::XMPPNode.new 'foo'
|
133
|
-
n << Blather::XMPPNode.new('bar')
|
134
|
-
c = Blather::XMPPNode.new('bar')
|
135
|
-
c.namespace = 'foo:bar'
|
136
|
-
n << c
|
137
|
-
|
138
|
-
n.find(:bar).size.must_equal 1
|
139
|
-
n.find('//xmlns:bar', :xmlns => 'foo:bar').size.must_equal 1
|
140
|
-
n.remove_child '//xmlns:bar', :xmlns => 'foo:bar'
|
141
|
-
n.find(:bar).size.must_equal 1
|
142
|
-
n.find('//xmlns:bar', :xmlns => 'foo:bar').size.must_equal 0
|
143
|
-
end
|
144
|
-
|
145
|
-
it 'will remove all child elements' do
|
146
|
-
n = Blather::XMPPNode.new 'foo'
|
147
|
-
n << Blather::XMPPNode.new('bar')
|
148
|
-
n << Blather::XMPPNode.new('bar')
|
149
|
-
|
150
|
-
n.find(:bar).size.must_equal 2
|
151
|
-
n.remove_children 'bar'
|
152
|
-
n.find(:bar).size.must_equal 0
|
153
|
-
end
|
154
|
-
|
155
|
-
it 'provides a copy mechanism' do
|
156
|
-
n = Blather::XMPPNode.new 'foo'
|
157
|
-
n2 = n.copy
|
158
|
-
n2.object_id.wont_equal n.object_id
|
159
|
-
n2.element_name.must_equal n.element_name
|
160
|
-
end
|
161
|
-
|
162
|
-
it 'provides an inherit mechanism' do
|
163
|
-
n = Blather::XMPPNode.new 'foo'
|
164
|
-
n2 = Blather::XMPPNode.new 'foo'
|
165
|
-
n2.content = 'bar'
|
166
|
-
n2['foo'] = 'bar'
|
167
|
-
|
168
|
-
n.inherit(n2)
|
169
|
-
n['foo'].must_equal 'bar'
|
170
|
-
n.content.must_equal 'bar'
|
171
|
-
n2.to_s.must_equal n.to_s
|
172
|
-
end
|
173
|
-
|
174
|
-
it 'holds on to namespaces when inheriting content' do
|
175
|
-
n = parse_stanza('<message><bar:foo xmlns:bar="http://bar.com"></message>').root
|
176
|
-
n2 = Blather::XMPPNode.new('message').inherit n
|
177
|
-
n2.to_s.must_equal n.to_s
|
178
|
-
end
|
179
|
-
|
180
|
-
it 'provides a mechanism to inherit attrs' do
|
181
|
-
n = Blather::XMPPNode.new 'foo'
|
182
|
-
n2 = Blather::XMPPNode.new 'foo'
|
183
|
-
n2['foo'] = 'bar'
|
184
|
-
|
185
|
-
n.inherit_attrs(n2.attributes)
|
186
|
-
n['foo'].must_equal 'bar'
|
187
|
-
end
|
188
|
-
|
189
|
-
it 'has a content_from helper that pulls the content from a child node' do
|
190
|
-
f = Blather::XMPPNode.new('foo')
|
191
|
-
f << (b = Blather::XMPPNode.new('bar'))
|
192
|
-
b.content = 'content'
|
193
|
-
f.content_from(:bar).must_equal 'content'
|
194
|
-
end
|
195
|
-
|
196
|
-
it 'returns nil when sent #content_from and a missing node' do
|
197
|
-
f = Blather::XMPPNode.new('foo')
|
198
|
-
f.content_from(:bar).must_be_nil
|
199
|
-
end
|
200
|
-
|
201
|
-
it 'creates a new node and sets content when sent #set_content_for' do
|
202
|
-
f = Blather::XMPPNode.new('foo')
|
203
|
-
f.must_respond_to :set_content_for
|
204
|
-
f.xpath('bar').must_be_empty
|
205
|
-
f.set_content_for :bar, :baz
|
206
|
-
f.xpath('bar').wont_be_empty
|
207
|
-
f.xpath('bar').first.content.must_equal 'baz'
|
208
|
-
end
|
209
|
-
|
210
|
-
it 'removes a child node when sent #set_content_for with nil' do
|
211
|
-
f = Blather::XMPPNode.new('foo')
|
212
|
-
f << (b = Blather::XMPPNode.new('bar'))
|
213
|
-
f.must_respond_to :set_content_for
|
214
|
-
f.xpath('bar').wont_be_empty
|
215
|
-
f.set_content_for :bar, nil
|
216
|
-
f.xpath('bar').must_be_empty
|
217
|
-
end
|
218
|
-
|
219
|
-
it 'will change the content of an existing node when sent #set_content_for' do
|
220
|
-
f = Blather::XMPPNode.new('foo')
|
221
|
-
f << (b = Blather::XMPPNode.new('bar'))
|
222
|
-
b.content = 'baz'
|
223
|
-
f.must_respond_to :set_content_for
|
224
|
-
f.xpath('bar').wont_be_empty
|
225
|
-
f.xpath('bar').first.content.must_equal 'baz'
|
226
|
-
control = f.xpath('bar').first.pointer_id
|
227
|
-
|
228
|
-
f.set_content_for :bar, 'fiz'
|
229
|
-
f.xpath('bar').first.content.must_equal 'fiz'
|
230
|
-
f.xpath('bar').first.pointer_id.must_equal control
|
231
|
-
end
|
232
37
|
end
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blather
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 15
|
5
|
+
prerelease:
|
5
6
|
segments:
|
6
7
|
- 0
|
7
8
|
- 5
|
8
|
-
-
|
9
|
-
version: 0.5.
|
9
|
+
- 2
|
10
|
+
version: 0.5.2
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Jeff Smick
|
@@ -14,7 +15,7 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date:
|
18
|
+
date: 2011-06-09 00:00:00 +01:00
|
18
19
|
default_executable:
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
@@ -25,6 +26,7 @@ dependencies:
|
|
25
26
|
requirements:
|
26
27
|
- - ~>
|
27
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 35
|
28
30
|
segments:
|
29
31
|
- 0
|
30
32
|
- 12
|
@@ -40,6 +42,7 @@ dependencies:
|
|
40
42
|
requirements:
|
41
43
|
- - ">="
|
42
44
|
- !ruby/object:Gem::Version
|
45
|
+
hash: 7
|
43
46
|
segments:
|
44
47
|
- 1
|
45
48
|
- 4
|
@@ -48,138 +51,163 @@ dependencies:
|
|
48
51
|
type: :runtime
|
49
52
|
version_requirements: *id002
|
50
53
|
- !ruby/object:Gem::Dependency
|
51
|
-
name:
|
54
|
+
name: niceogiri
|
52
55
|
prerelease: false
|
53
56
|
requirement: &id003 !ruby/object:Gem::Requirement
|
54
57
|
none: false
|
55
58
|
requirements:
|
56
59
|
- - ">="
|
57
60
|
- !ruby/object:Gem::Version
|
61
|
+
hash: 23
|
62
|
+
segments:
|
63
|
+
- 0
|
64
|
+
- 0
|
65
|
+
- 4
|
66
|
+
version: 0.0.4
|
67
|
+
type: :runtime
|
68
|
+
version_requirements: *id003
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest
|
71
|
+
prerelease: false
|
72
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 9
|
58
78
|
segments:
|
59
79
|
- 1
|
60
80
|
- 7
|
61
81
|
- 1
|
62
82
|
version: 1.7.1
|
63
83
|
type: :runtime
|
64
|
-
version_requirements: *
|
84
|
+
version_requirements: *id004
|
65
85
|
- !ruby/object:Gem::Dependency
|
66
86
|
name: activesupport
|
67
87
|
prerelease: false
|
68
|
-
requirement: &
|
88
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
69
89
|
none: false
|
70
90
|
requirements:
|
71
91
|
- - ">="
|
72
92
|
- !ruby/object:Gem::Version
|
93
|
+
hash: 9
|
73
94
|
segments:
|
74
95
|
- 3
|
75
96
|
- 0
|
76
97
|
- 7
|
77
98
|
version: 3.0.7
|
78
99
|
type: :runtime
|
79
|
-
version_requirements: *
|
100
|
+
version_requirements: *id005
|
80
101
|
- !ruby/object:Gem::Dependency
|
81
102
|
name: minitest
|
82
103
|
prerelease: false
|
83
|
-
requirement: &
|
104
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
84
105
|
none: false
|
85
106
|
requirements:
|
86
107
|
- - ~>
|
87
108
|
- !ruby/object:Gem::Version
|
109
|
+
hash: 9
|
88
110
|
segments:
|
89
111
|
- 1
|
90
112
|
- 7
|
91
113
|
- 1
|
92
114
|
version: 1.7.1
|
93
115
|
type: :development
|
94
|
-
version_requirements: *
|
116
|
+
version_requirements: *id006
|
95
117
|
- !ruby/object:Gem::Dependency
|
96
118
|
name: mocha
|
97
119
|
prerelease: false
|
98
|
-
requirement: &
|
120
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
99
121
|
none: false
|
100
122
|
requirements:
|
101
123
|
- - ~>
|
102
124
|
- !ruby/object:Gem::Version
|
125
|
+
hash: 35
|
103
126
|
segments:
|
104
127
|
- 0
|
105
128
|
- 9
|
106
129
|
- 12
|
107
130
|
version: 0.9.12
|
108
131
|
type: :development
|
109
|
-
version_requirements: *
|
132
|
+
version_requirements: *id007
|
110
133
|
- !ruby/object:Gem::Dependency
|
111
134
|
name: bundler
|
112
135
|
prerelease: false
|
113
|
-
requirement: &
|
136
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
114
137
|
none: false
|
115
138
|
requirements:
|
116
139
|
- - ~>
|
117
140
|
- !ruby/object:Gem::Version
|
141
|
+
hash: 23
|
118
142
|
segments:
|
119
143
|
- 1
|
120
144
|
- 0
|
121
145
|
- 0
|
122
146
|
version: 1.0.0
|
123
147
|
type: :development
|
124
|
-
version_requirements: *
|
148
|
+
version_requirements: *id008
|
125
149
|
- !ruby/object:Gem::Dependency
|
126
150
|
name: rcov
|
127
151
|
prerelease: false
|
128
|
-
requirement: &
|
152
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
129
153
|
none: false
|
130
154
|
requirements:
|
131
155
|
- - ~>
|
132
156
|
- !ruby/object:Gem::Version
|
157
|
+
hash: 41
|
133
158
|
segments:
|
134
159
|
- 0
|
135
160
|
- 9
|
136
161
|
- 9
|
137
162
|
version: 0.9.9
|
138
163
|
type: :development
|
139
|
-
version_requirements: *
|
164
|
+
version_requirements: *id009
|
140
165
|
- !ruby/object:Gem::Dependency
|
141
166
|
name: yard
|
142
167
|
prerelease: false
|
143
|
-
requirement: &
|
168
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
144
169
|
none: false
|
145
170
|
requirements:
|
146
171
|
- - ~>
|
147
172
|
- !ruby/object:Gem::Version
|
173
|
+
hash: 5
|
148
174
|
segments:
|
149
175
|
- 0
|
150
176
|
- 6
|
151
177
|
- 1
|
152
178
|
version: 0.6.1
|
153
179
|
type: :development
|
154
|
-
version_requirements: *
|
180
|
+
version_requirements: *id010
|
155
181
|
- !ruby/object:Gem::Dependency
|
156
182
|
name: bluecloth
|
157
183
|
prerelease: false
|
158
|
-
requirement: &
|
184
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
159
185
|
none: false
|
160
186
|
requirements:
|
161
187
|
- - ~>
|
162
188
|
- !ruby/object:Gem::Version
|
189
|
+
hash: 11
|
163
190
|
segments:
|
164
191
|
- 2
|
165
192
|
- 1
|
166
193
|
- 0
|
167
194
|
version: 2.1.0
|
168
195
|
type: :development
|
169
|
-
version_requirements: *
|
196
|
+
version_requirements: *id011
|
170
197
|
- !ruby/object:Gem::Dependency
|
171
198
|
name: rake
|
172
199
|
prerelease: false
|
173
|
-
requirement: &
|
200
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
174
201
|
none: false
|
175
202
|
requirements:
|
176
203
|
- - ">="
|
177
204
|
- !ruby/object:Gem::Version
|
205
|
+
hash: 3
|
178
206
|
segments:
|
179
207
|
- 0
|
180
208
|
version: "0"
|
181
209
|
type: :development
|
182
|
-
version_requirements: *
|
210
|
+
version_requirements: *id012
|
183
211
|
description: An XMPP DSL for Ruby written on top of EventMachine and Nokogiri
|
184
212
|
email: sprsquish@gmail.com
|
185
213
|
executables: []
|
@@ -215,7 +243,6 @@ files:
|
|
215
243
|
- lib/blather/client/dsl/pubsub.rb
|
216
244
|
- lib/blather/core_ext/eventmachine.rb
|
217
245
|
- lib/blather/core_ext/ipaddr.rb
|
218
|
-
- lib/blather/core_ext/nokogiri.rb
|
219
246
|
- lib/blather/errors.rb
|
220
247
|
- lib/blather/errors/sasl_error.rb
|
221
248
|
- lib/blather/errors/stanza_error.rb
|
@@ -274,7 +301,6 @@ files:
|
|
274
301
|
- spec/blather/client/client_spec.rb
|
275
302
|
- spec/blather/client/dsl/pubsub_spec.rb
|
276
303
|
- spec/blather/client/dsl_spec.rb
|
277
|
-
- spec/blather/core_ext/nokogiri_spec.rb
|
278
304
|
- spec/blather/errors/sasl_error_spec.rb
|
279
305
|
- spec/blather/errors/stanza_error_spec.rb
|
280
306
|
- spec/blather/errors/stream_error_spec.rb
|
@@ -337,6 +363,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
337
363
|
requirements:
|
338
364
|
- - ">="
|
339
365
|
- !ruby/object:Gem::Version
|
366
|
+
hash: 3
|
340
367
|
segments:
|
341
368
|
- 0
|
342
369
|
version: "0"
|
@@ -345,13 +372,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
345
372
|
requirements:
|
346
373
|
- - ">="
|
347
374
|
- !ruby/object:Gem::Version
|
375
|
+
hash: 3
|
348
376
|
segments:
|
349
377
|
- 0
|
350
378
|
version: "0"
|
351
379
|
requirements: []
|
352
380
|
|
353
381
|
rubyforge_project:
|
354
|
-
rubygems_version: 1.
|
382
|
+
rubygems_version: 1.4.2
|
355
383
|
signing_key:
|
356
384
|
specification_version: 3
|
357
385
|
summary: Simpler XMPP built for speed
|
@@ -359,7 +387,6 @@ test_files:
|
|
359
387
|
- spec/blather/client/client_spec.rb
|
360
388
|
- spec/blather/client/dsl/pubsub_spec.rb
|
361
389
|
- spec/blather/client/dsl_spec.rb
|
362
|
-
- spec/blather/core_ext/nokogiri_spec.rb
|
363
390
|
- spec/blather/errors/sasl_error_spec.rb
|
364
391
|
- spec/blather/errors/stanza_error_spec.rb
|
365
392
|
- spec/blather/errors/stream_error_spec.rb
|
@@ -1,44 +0,0 @@
|
|
1
|
-
# @private
|
2
|
-
module Nokogiri
|
3
|
-
module XML
|
4
|
-
|
5
|
-
# Nokogiri::Node extensions
|
6
|
-
class Node
|
7
|
-
# Alias #name to #element_name so we can use #name in an XMPP Stanza context
|
8
|
-
alias_method :element_name, :name
|
9
|
-
alias_method :element_name=, :name=
|
10
|
-
|
11
|
-
alias_method :attr_set, :[]=
|
12
|
-
# Override Nokogiri's attribute setter to add the ability to kill an attribute
|
13
|
-
# by setting it to nil and to be able to lookup an attribute by symbol
|
14
|
-
#
|
15
|
-
# @param [#to_s] name the name of the attribute
|
16
|
-
# @param [#to_s, nil] value the new value or nil to remove it
|
17
|
-
def []=(name, value)
|
18
|
-
name = name.to_s
|
19
|
-
value.nil? ? remove_attribute(name) : attr_set(name, value.to_s)
|
20
|
-
end
|
21
|
-
|
22
|
-
alias_method :nokogiri_xpath, :xpath
|
23
|
-
# Override Nokogiri's #xpath method to add the ability to use symbols for lookup
|
24
|
-
# and namespace designation
|
25
|
-
def xpath(*paths)
|
26
|
-
paths[0] = paths[0].to_s
|
27
|
-
|
28
|
-
if paths.size > 1 && (namespaces = paths.pop).is_a?(Hash)
|
29
|
-
paths << namespaces.inject({}) { |h,v| h[v[0].to_s] = v[1]; h }
|
30
|
-
end
|
31
|
-
|
32
|
-
nokogiri_xpath *paths
|
33
|
-
end
|
34
|
-
alias_method :find, :xpath
|
35
|
-
|
36
|
-
# Return the first element at a specified xpath
|
37
|
-
# @see #xpath
|
38
|
-
def find_first(*paths)
|
39
|
-
xpath(*paths).first
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
end #XML
|
44
|
-
end #Blather
|
@@ -1,83 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe 'Nokogiri::XML::Node' do
|
4
|
-
before { @doc = Nokogiri::XML::Document.new }
|
5
|
-
|
6
|
-
it 'aliases #name to #element_name' do
|
7
|
-
node = Nokogiri::XML::Node.new 'foo', @doc
|
8
|
-
node.must_respond_to :element_name
|
9
|
-
node.element_name.must_equal node.name
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'aliases #name= to #element_name=' do
|
13
|
-
node = Nokogiri::XML::Node.new 'foo', @doc
|
14
|
-
node.must_respond_to :element_name=
|
15
|
-
node.element_name.must_equal node.name
|
16
|
-
node.element_name = 'bar'
|
17
|
-
node.element_name.must_equal 'bar'
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'allows symbols as hash keys for attributes' do
|
21
|
-
attrs = Nokogiri::XML::Node.new('foo', @doc)
|
22
|
-
attrs['foo'] = 'bar'
|
23
|
-
|
24
|
-
attrs['foo'].must_equal 'bar'
|
25
|
-
attrs[:foo].must_equal 'bar'
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'ensures a string is passed to the attribute setter' do
|
29
|
-
attrs = Nokogiri::XML::Node.new('foo', @doc)
|
30
|
-
attrs[:foo] = 1
|
31
|
-
attrs[:foo].must_equal '1'
|
32
|
-
|
33
|
-
attrs[:jid] = Blather::JID.new('n@d/r')
|
34
|
-
attrs[:jid].must_equal 'n@d/r'
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'removes an attribute when set to nil' do
|
38
|
-
attrs = Nokogiri::XML::Node.new('foo', @doc)
|
39
|
-
attrs['foo'] = 'bar'
|
40
|
-
|
41
|
-
attrs['foo'].must_equal 'bar'
|
42
|
-
attrs['foo'] = nil
|
43
|
-
attrs['foo'].must_be_nil
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'allows attribute values to change' do
|
47
|
-
attrs = Nokogiri::XML::Node.new('foo', @doc)
|
48
|
-
attrs['foo'] = 'bar'
|
49
|
-
|
50
|
-
attrs['foo'].must_equal 'bar'
|
51
|
-
attrs['foo'] = 'baz'
|
52
|
-
attrs['foo'].must_equal 'baz'
|
53
|
-
end
|
54
|
-
|
55
|
-
it 'allows symbols as the path in #xpath' do
|
56
|
-
node = Nokogiri::XML::Node.new('foo', @doc)
|
57
|
-
node.must_respond_to :find
|
58
|
-
@doc.root = node
|
59
|
-
@doc.xpath(:foo).first.wont_be_nil
|
60
|
-
@doc.xpath(:foo).first.must_equal @doc.xpath('/foo').first
|
61
|
-
end
|
62
|
-
|
63
|
-
it 'allows symbols as namespace names in #xpath' do
|
64
|
-
node = Nokogiri::XML::Node.new('foo', @doc)
|
65
|
-
node.namespace = node.add_namespace('bar', 'baz')
|
66
|
-
@doc.root = node
|
67
|
-
node.xpath('/bar:foo', :bar => 'baz').first.wont_be_nil
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'aliases #xpath to #find' do
|
71
|
-
node = Nokogiri::XML::Node.new('foo', @doc)
|
72
|
-
node.must_respond_to :find
|
73
|
-
@doc.root = node
|
74
|
-
node.find('/foo').first.wont_be_nil
|
75
|
-
end
|
76
|
-
|
77
|
-
it 'has a helper function #find_first' do
|
78
|
-
node = Nokogiri::XML::Node.new('foo', @doc)
|
79
|
-
node.must_respond_to :find
|
80
|
-
@doc.root = node
|
81
|
-
node.find_first('/foo').must_equal node.find('/foo').first
|
82
|
-
end
|
83
|
-
end
|