skates 0.4.0 → 0.5.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.
- data/Rakefile +1 -1
- data/lib/skates/client_connection.rb +8 -6
- data/lib/skates/component_connection.rb +2 -2
- data/lib/skates/xmpp_parser.rb +47 -20
- data/spec/lib/skates/base/controller_spec.rb +3 -3
- data/spec/lib/skates/client_connection_spec.rb +12 -12
- data/spec/lib/skates/component_connection_spec.rb +4 -4
- data/spec/lib/skates/xmpp_parser_spec.rb +237 -51
- metadata +5 -5
data/Rakefile
CHANGED
@@ -12,7 +12,7 @@ begin
|
|
12
12
|
|
13
13
|
gem.add_dependency('eventmachine', ">= 0.12.10")
|
14
14
|
gem.add_dependency('log4r')
|
15
|
-
gem.add_dependency('nokogiri', "= 1.4.
|
15
|
+
gem.add_dependency('nokogiri', "= 1.4.4")
|
16
16
|
gem.add_dependency('utf8cleaner')
|
17
17
|
gem.requirements = ["bundler", "eventmachine", "yaml", "fileutils", "log4r", "nokogiri", "optparse", "digest/sha1", "base64", "resolv", "utf8cleaner"]
|
18
18
|
gem.executables = "skates"
|
@@ -25,7 +25,7 @@ module Skates
|
|
25
25
|
end
|
26
26
|
|
27
27
|
##
|
28
|
-
# Resolution for clients, based on SRV records
|
28
|
+
# Resolution for clients, based on SRV records, or A if no SRV is present. Also randomizes the servers if multiple with same priority are found.
|
29
29
|
def self.resolve(host, &block)
|
30
30
|
Resolv::DNS.open { |dns|
|
31
31
|
# If ruby version is too old and SRV is unknown, this will raise a NameError
|
@@ -67,7 +67,9 @@ module Skates
|
|
67
67
|
"RESOLVING: #{host} (A record)"
|
68
68
|
}
|
69
69
|
records = dns.getresources(host, Resolv::DNS::Resource::IN::A)
|
70
|
-
records.
|
70
|
+
records.sort_by { |record|
|
71
|
+
rand()
|
72
|
+
}.each do |record|
|
71
73
|
ip = record.address.to_s
|
72
74
|
if block.call({"host" => ip, "port" => Integer(Skates.config["port"]) || 5222})
|
73
75
|
found = true
|
@@ -117,17 +119,17 @@ module Skates
|
|
117
119
|
super # Can be dispatched
|
118
120
|
|
119
121
|
when :wait_for_stream_authenticated
|
120
|
-
if stanza.name == "stream
|
122
|
+
if stanza.name == "stream" && stanza.attributes['id']
|
121
123
|
@state = :wait_for_bind
|
122
124
|
end
|
123
125
|
|
124
126
|
when :wait_for_stream
|
125
|
-
if stanza.name == "stream
|
127
|
+
if stanza.name == "stream" && stanza.attributes['id']
|
126
128
|
@state = :wait_for_auth_mechanisms
|
127
129
|
end
|
128
130
|
|
129
131
|
when :wait_for_auth_mechanisms
|
130
|
-
if stanza.name == "
|
132
|
+
if stanza.name == "features"
|
131
133
|
if stanza.children.first.name == "starttls"
|
132
134
|
doc = Nokogiri::XML::Document.new
|
133
135
|
starttls = Nokogiri::XML::Node.new("starttls", doc)
|
@@ -164,7 +166,7 @@ module Skates
|
|
164
166
|
end
|
165
167
|
|
166
168
|
when :wait_for_bind
|
167
|
-
if stanza.name == "
|
169
|
+
if stanza.name == "features"
|
168
170
|
if stanza.children.first.name == "bind"
|
169
171
|
doc = Nokogiri::XML::Document.new
|
170
172
|
# Let's build the binding_iq
|
@@ -43,7 +43,7 @@ module Skates
|
|
43
43
|
super(stanza) # Can be dispatched
|
44
44
|
|
45
45
|
when :wait_for_stream
|
46
|
-
if stanza.name == "stream
|
46
|
+
if stanza.name == "stream" && stanza.attributes['id']
|
47
47
|
# This means the XMPP session started!
|
48
48
|
# We must send the handshake now.
|
49
49
|
send_xml(handshake(stanza))
|
@@ -62,7 +62,7 @@ module Skates
|
|
62
62
|
}
|
63
63
|
end
|
64
64
|
@state = :connected
|
65
|
-
elsif stanza.name == "
|
65
|
+
elsif stanza.name == "error"
|
66
66
|
raise AuthenticationError
|
67
67
|
else
|
68
68
|
raise
|
data/lib/skates/xmpp_parser.rb
CHANGED
@@ -43,11 +43,35 @@ module Skates
|
|
43
43
|
clear_characters_buffer
|
44
44
|
@doc ||= Nokogiri::XML::Document.new
|
45
45
|
@elem ||= @doc # If we have no current element, then, we take the doc
|
46
|
-
@
|
46
|
+
@parent = @elem
|
47
47
|
|
48
|
-
|
48
|
+
# First thing first : identify namespaces, and attributes
|
49
|
+
namespaces, attributes = identify_namespaces_and_attributes(attributes)
|
49
50
|
|
50
|
-
|
51
|
+
# Now, we may need to add a namespace!
|
52
|
+
namespace, qname = qname.split(":") if qname.match(/.*:.*/)
|
53
|
+
|
54
|
+
@elem = Nokogiri::XML::Element.new(qname, @doc)
|
55
|
+
# Let's now add all namespaces
|
56
|
+
namespaces.each do |prefix, uri|
|
57
|
+
set_namespace(prefix, uri)
|
58
|
+
end
|
59
|
+
|
60
|
+
# And all attributes
|
61
|
+
attributes.each do |name, value|
|
62
|
+
set_attribute(name, value)
|
63
|
+
end
|
64
|
+
|
65
|
+
# And now addback the namespace if applicable
|
66
|
+
if prefix = ["xmlns", namespace].join(":") and uri = @parent.namespaces[prefix]
|
67
|
+
@elem.namespace = @parent.namespace_definitions.select() {|ns|
|
68
|
+
ns.href == uri
|
69
|
+
}.first
|
70
|
+
end
|
71
|
+
|
72
|
+
@parent.add_child(@elem) # Finally, add the element
|
73
|
+
|
74
|
+
if @elem.name == "stream"
|
51
75
|
# We activate the callback since this element will never end.
|
52
76
|
@callback.call(@elem)
|
53
77
|
@doc = @elem = nil # Let's prepare for the next stanza
|
@@ -84,29 +108,32 @@ module Skates
|
|
84
108
|
end
|
85
109
|
|
86
110
|
##
|
87
|
-
#
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
111
|
+
# Idenitifies namespaces and attributes
|
112
|
+
# Nokogiri passes them as a array of [[ns_name, ns_url], [ns_name, ns_url]..., key, value, key, value]...
|
113
|
+
def identify_namespaces_and_attributes(attrs)
|
114
|
+
namespaces = {}
|
115
|
+
attributes = {}
|
116
|
+
|
117
|
+
attrs.each do |pair|
|
118
|
+
if pair[0].match /xmlns/
|
119
|
+
# It's a namespace!
|
120
|
+
prefix = pair[0].split(":").last
|
121
|
+
prefix = nil if prefix == "xmlns"
|
122
|
+
namespaces[prefix] = pair[1] # Now assign the url. Easy.
|
123
|
+
else
|
124
|
+
# It's an attribute
|
125
|
+
attributes[pair[0]] = pair[1]
|
126
|
+
end
|
97
127
|
end
|
128
|
+
[namespaces, attributes]
|
98
129
|
end
|
99
|
-
|
100
|
-
def
|
130
|
+
|
131
|
+
def set_attribute(key, value)
|
101
132
|
@elem.set_attribute key, Skates.decode_xml(value)
|
102
133
|
end
|
103
134
|
|
104
135
|
def set_namespace(key, value)
|
105
|
-
|
106
|
-
@elem.add_namespace(key.split(':').last, value)
|
107
|
-
else
|
108
|
-
@elem.add_namespace(nil, value)
|
109
|
-
end
|
136
|
+
@elem.add_namespace(key, value)
|
110
137
|
end
|
111
138
|
end
|
112
139
|
end
|
@@ -15,8 +15,8 @@ describe Skates::Base::Controller do
|
|
15
15
|
stanza = mock(Object)
|
16
16
|
c = Skates::Base::Controller.new(stanza)
|
17
17
|
|
18
|
-
c.instance_variables.should be_include "@stanza"
|
19
|
-
c.instance_variable_get("@stanza").should == stanza
|
18
|
+
c.instance_variables.should be_include :"@stanza"
|
19
|
+
c.instance_variable_get(:"@stanza").should == stanza
|
20
20
|
end
|
21
21
|
|
22
22
|
it "should not be rendered yet" do
|
@@ -140,7 +140,7 @@ describe Skates::Base::Controller do
|
|
140
140
|
end
|
141
141
|
@controller = MyController.new(@stanza)
|
142
142
|
@controller.do_something
|
143
|
-
@controller.assigns.should == vars.merge("stanza" => @stanza)
|
143
|
+
@controller.assigns.should == vars.merge("stanza" => @stanza, "view" => nil)
|
144
144
|
end
|
145
145
|
end
|
146
146
|
|
@@ -25,9 +25,9 @@ describe Skates::ClientConnection do
|
|
25
25
|
@params.delete("host")
|
26
26
|
@params.delete("port")
|
27
27
|
@srv = [
|
28
|
-
mock(Resolv::DNS::Resource, :priority => 10, :target => "12.13.14.15", :port => 1234),
|
29
|
-
mock(Resolv::DNS::Resource, :priority => 3, :target => "12.13.14.16", :port => 4567),
|
30
|
-
mock(Resolv::DNS::Resource, :priority => 100, :target => "12.13.14.17", :port => 8910)
|
28
|
+
mock(Resolv::DNS::Resource, :priority => 10, :target => "12.13.14.15", :port => 1234, :address => "12.13.14.15"),
|
29
|
+
mock(Resolv::DNS::Resource, :priority => 3, :target => "12.13.14.16", :port => 4567, :address => "12.13.14.16"),
|
30
|
+
mock(Resolv::DNS::Resource, :priority => 100, :target => "12.13.14.17", :port => 8910, :address => "12.13.14.17")
|
31
31
|
]
|
32
32
|
@mock_dns = mock(Object)
|
33
33
|
Resolv::DNS.stub!(:open).and_yield(@mock_dns)
|
@@ -36,7 +36,7 @@ describe Skates::ClientConnection do
|
|
36
36
|
|
37
37
|
it "should get resources assiated with _xmpp-client._tcp.host.tld}" do
|
38
38
|
Resolv::DNS.should_receive(:open).and_yield(@mock_dns)
|
39
|
-
@mock_dns.should_receive(:getresources).with("
|
39
|
+
@mock_dns.should_receive(:getresources).with("server.tld", Resolv::DNS::Resource::IN::SRV).and_return(@srv)
|
40
40
|
Skates::ClientConnection.resolve("server.tld")
|
41
41
|
end
|
42
42
|
|
@@ -84,10 +84,10 @@ describe Skates::ClientConnection do
|
|
84
84
|
describe "when wait_for_stream_authenticated" do
|
85
85
|
before(:each) do
|
86
86
|
@client.instance_variable_set("@state", :wait_for_stream_authenticated)
|
87
|
-
@stanza = Nokogiri::XML::Node.new("stream
|
87
|
+
@stanza = Nokogiri::XML::Node.new("stream", @doc)
|
88
88
|
@stanza["id"] = "123"
|
89
89
|
end
|
90
|
-
it "should change state to wait_for_bind if the stanza is stream
|
90
|
+
it "should change state to wait_for_bind if the stanza is stream with an id" do
|
91
91
|
@client.receive_stanza(@stanza)
|
92
92
|
@client.instance_variable_get("@state").should == :wait_for_bind
|
93
93
|
end
|
@@ -96,10 +96,10 @@ describe Skates::ClientConnection do
|
|
96
96
|
describe "when wait_for_stream" do
|
97
97
|
before(:each) do
|
98
98
|
@client.instance_variable_set("@state", :wait_for_stream)
|
99
|
-
@stanza = Nokogiri::XML::Node.new("stream
|
99
|
+
@stanza = Nokogiri::XML::Node.new("stream", @doc)
|
100
100
|
@stanza["id"] = "123"
|
101
101
|
end
|
102
|
-
it "should change state to wait_for_auth_mechanisms if the stanza is stream
|
102
|
+
it "should change state to wait_for_auth_mechanisms if the stanza is stream with an id" do
|
103
103
|
@client.receive_stanza(@stanza)
|
104
104
|
@client.instance_variable_get("@state").should == :wait_for_auth_mechanisms
|
105
105
|
end
|
@@ -110,9 +110,9 @@ describe Skates::ClientConnection do
|
|
110
110
|
@client.instance_variable_set("@state", :wait_for_auth_mechanisms)
|
111
111
|
end
|
112
112
|
|
113
|
-
describe "if the stanza is
|
113
|
+
describe "if the stanza is features" do
|
114
114
|
before(:each) do
|
115
|
-
@stanza = Nokogiri::XML::Node.new("
|
115
|
+
@stanza = Nokogiri::XML::Node.new("features", @doc)
|
116
116
|
@stanza["id"] = "123"
|
117
117
|
end
|
118
118
|
|
@@ -194,9 +194,9 @@ describe Skates::ClientConnection do
|
|
194
194
|
@client.instance_variable_set("@state", :wait_for_bind)
|
195
195
|
end
|
196
196
|
|
197
|
-
describe "if stanza is
|
197
|
+
describe "if stanza is features" do
|
198
198
|
before(:each) do
|
199
|
-
@stanza = Nokogiri::XML::Node.new("
|
199
|
+
@stanza = Nokogiri::XML::Node.new("features", @doc)
|
200
200
|
end
|
201
201
|
|
202
202
|
describe "if stanza has bind" do
|
@@ -47,7 +47,7 @@ describe Skates::ComponentConnection do
|
|
47
47
|
|
48
48
|
describe "if the stanza is stream" do
|
49
49
|
before(:each) do
|
50
|
-
@stanza = Nokogiri::XML::Node.new("stream
|
50
|
+
@stanza = Nokogiri::XML::Node.new("stream", @doc)
|
51
51
|
@stanza["xmlns:stream"] = 'http://etherx.jabber.org/streams'
|
52
52
|
@stanza["xmlns"] = 'jabber:component:accept'
|
53
53
|
@stanza["from"] = 'plays.shakespeare.lit'
|
@@ -98,7 +98,7 @@ describe Skates::ComponentConnection do
|
|
98
98
|
|
99
99
|
describe "if we receive a stream:error" do
|
100
100
|
it "should raise an Authentication Error" do
|
101
|
-
lambda {@component.receive_stanza(Nokogiri::XML::Node.new("
|
101
|
+
lambda {@component.receive_stanza(Nokogiri::XML::Node.new("error", @doc))}.should raise_error(Skates::AuthenticationError)
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
@@ -122,7 +122,7 @@ describe Skates::ComponentConnection do
|
|
122
122
|
it "should build a handshake Element with the password and the id of the stanza" do
|
123
123
|
@component.connection_completed
|
124
124
|
doc = Nokogiri::XML::Document.new
|
125
|
-
stanza = Nokogiri::XML::Node.new("stream
|
125
|
+
stanza = Nokogiri::XML::Node.new("stream", doc)
|
126
126
|
stanza["xmlns:stream"] = 'http://etherx.jabber.org/streams'
|
127
127
|
stanza["xmlns"] = 'jabber:component:accept'
|
128
128
|
stanza["from"] = 'plays.shakespeare.lit'
|
@@ -135,7 +135,7 @@ describe Skates::ComponentConnection do
|
|
135
135
|
describe "when resolving" do
|
136
136
|
it "should resolve records" do
|
137
137
|
Skates::ComponentConnection.resolve("xmpp2.superfeedr.com") do |res|
|
138
|
-
res["host"].should == "173.
|
138
|
+
res["host"].should == "173.255.193.75"
|
139
139
|
true
|
140
140
|
end
|
141
141
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
$: << "." # Adding the local directory to the path, so we can safely require models, controllers and views.
|
1
2
|
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
3
|
|
3
4
|
describe Skates::XmppParser do
|
@@ -69,7 +70,7 @@ describe Skates::XmppParser do
|
|
69
70
|
|
70
71
|
before(:each) do
|
71
72
|
@new_elem_name = "new"
|
72
|
-
@new_elem_attributes = ["to", "you@yourserver.com/home", "xmlns", "http://ns.com"]
|
73
|
+
@new_elem_attributes = [["to", "you@yourserver.com/home"], ["xmlns", "http://ns.com"]]
|
73
74
|
end
|
74
75
|
|
75
76
|
it "should create a new doc if we don't have one" do
|
@@ -117,8 +118,7 @@ describe Skates::XmppParser do
|
|
117
118
|
it "should add the right attributes and namespaces to the newly created element" do
|
118
119
|
@parser.start_element(@new_elem_name, @new_elem_attributes)
|
119
120
|
@parser.elem["to"].should == "you@yourserver.com/home"
|
120
|
-
|
121
|
-
@parser.elem.namespaces.should == {}
|
121
|
+
@parser.elem.namespaces.should == {"xmlns"=>"http://ns.com"}
|
122
122
|
end
|
123
123
|
|
124
124
|
describe "when the new element is of name stream:stream" do
|
@@ -182,53 +182,6 @@ describe Skates::XmppParser do
|
|
182
182
|
end
|
183
183
|
end
|
184
184
|
|
185
|
-
describe ".add_namespaces_and_attributes_to_node" do
|
186
|
-
before(:each) do
|
187
|
-
@doc = Nokogiri::XML::Document.new
|
188
|
-
@parser.doc = @doc
|
189
|
-
@element = Nokogiri::XML::Element.new("element", @parser.doc)
|
190
|
-
@attrs = ["from", "me", "xmlns:atom", "http://www.w3.org/2005/Atom" ,"to", "you", "xmlns", "http://namespace.com"]
|
191
|
-
@parser.elem = @element
|
192
|
-
end
|
193
|
-
|
194
|
-
it "should assign even elements to attributes value or namespaces urls" do
|
195
|
-
@parser.__send__(:add_namespaces_and_attributes_to_current_node, @attrs)
|
196
|
-
even = []
|
197
|
-
@attrs.size.times do |i|
|
198
|
-
even << @attrs[i*2]
|
199
|
-
end
|
200
|
-
even.compact!
|
201
|
-
@element.attributes.keys.each do |k|
|
202
|
-
even.should include(k)
|
203
|
-
end
|
204
|
-
end
|
205
|
-
|
206
|
-
it "should assign odd elements to attributes names of namespaces prefixes" do
|
207
|
-
@parser.__send__(:add_namespaces_and_attributes_to_current_node, @attrs)
|
208
|
-
even = []
|
209
|
-
@attrs.size.times do |i|
|
210
|
-
even << @attrs[i*2+1]
|
211
|
-
end
|
212
|
-
even.compact!
|
213
|
-
@element.attributes.values.each do |v|
|
214
|
-
even.should include("#{v}")
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
218
|
-
it "should add namespace for each attribute name that starts with xmlns" do
|
219
|
-
@parser.__send__(:add_namespaces_and_attributes_to_current_node, @attrs)
|
220
|
-
# TODO: FIX NAMESPACES @element.namespaces.values.should == ["http://www.w3.org/2005/Atom", "http://namespace.com"]
|
221
|
-
@element.namespaces.values.should == []
|
222
|
-
end
|
223
|
-
|
224
|
-
it "should escape characters correctly" do
|
225
|
-
@attrs = ["url", "http://api.flickr.com/services/feeds/photos_public.gne?id=49724566@N00&lang=en-us&format=atom"]
|
226
|
-
@parser.__send__(:add_namespaces_and_attributes_to_current_node, @attrs)
|
227
|
-
@element["url"].should == "http://api.flickr.com/services/feeds/photos_public.gne?id=49724566@N00&lang=en-us&format=atom"
|
228
|
-
end
|
229
|
-
|
230
|
-
end
|
231
|
-
|
232
185
|
describe "a communication with an XMPP Client" do
|
233
186
|
|
234
187
|
before(:each) do
|
@@ -274,10 +227,243 @@ describe Skates::XmppParser do
|
|
274
227
|
@parser.push(s)
|
275
228
|
end
|
276
229
|
|
277
|
-
@stanzas.join("").should == "<stream
|
230
|
+
@stanzas.map(&:to_xml).join("").should == "<stream xmlns:stream=\"http://etherx.jabber.org/streams\" xmlns=\"jabber:component:accept\" from=\"plays.shakespeare.lit\" id=\"3BF96D32\"/><handshake/><message from=\"juliet@example.com\" to=\"romeo@example.net\" xml:lang=\"en\">\n <body>Art thou not Romeo, and a Montague?</body>\n <link href=\"http://sfbay.craigslist.org/search/sss?query=%2522mac+mini%2522+Intel+Core+Duo&minAsk=min&maxAsk=max&format=rss&format=rss\"/>\n</message>"
|
278
231
|
@stanzas.last.at("link")["href"].should == "http://sfbay.craigslist.org/search/sss?query=%2522mac+mini%2522+Intel+Core+Duo&minAsk=min&maxAsk=max&format=rss&format=rss"
|
279
232
|
end
|
280
233
|
|
281
234
|
end
|
282
235
|
|
236
|
+
describe "when parsing a complex stanza" do
|
237
|
+
before(:each) do
|
238
|
+
@xml =<<-EOXML
|
239
|
+
<iq id="pub-296" to="test-track.superfeedr.com" type="set">
|
240
|
+
<feed xmlns="http://superfeedr.com/xmpp-superfeedr-ext" id="368">
|
241
|
+
<url>http://superfeedr.com/dummy.xml</url>
|
242
|
+
<http_code>200</http_code>
|
243
|
+
<etag>"eb8dfc6fa342dc8326851907efe35cda"</etag>
|
244
|
+
<number_of_new_entries>10</number_of_new_entries>
|
245
|
+
<last_error_message>7462B in 1.036602s, 10/10 new entries</last_error_message>
|
246
|
+
<last_fetch>2011-02-21T14:34:52-05:00</last_fetch>
|
247
|
+
<next_fetch>2011-02-21T14:38:37-05:00</next_fetch>
|
248
|
+
<period>225</period>
|
249
|
+
<last_maintenance_at>2011-02-21T14:34:52-05:00</last_maintenance_at>
|
250
|
+
<entries_count>10</entries_count>
|
251
|
+
<perform_maintenance>true</perform_maintenance>
|
252
|
+
<title>The Dummy Time Feed</title>
|
253
|
+
<format>feed</format>
|
254
|
+
<link href="http://superfeedr.com" rel="alternate" type="text/html"/>
|
255
|
+
<link href="http://superfeedr.com/dummy.xml" rel="self" type="application/atom+xml"/>
|
256
|
+
<last_parse>2011-02-21T14:34:52-05:00</last_parse>
|
257
|
+
<headers>
|
258
|
+
<server>nginx/0.8.52</server>
|
259
|
+
<date>Mon, 21 Feb 2011 19:35:41 GMT</date>
|
260
|
+
<content_type>application/xml; charset=utf-8</content_type>
|
261
|
+
<connection>close</connection>
|
262
|
+
<status>200 OK</status>
|
263
|
+
<etag>"eb8dfc6fa342dc8326851907efe35cda"</etag>
|
264
|
+
<x_runtime>858</x_runtime>
|
265
|
+
<content_length>7462</content_length>
|
266
|
+
<set_cookie/>
|
267
|
+
<cache_control>private, max-age=0, must-revalidate</cache_control>
|
268
|
+
</headers>
|
269
|
+
<id>tag:superfeedr.com,2005:/hubbub/dummy</id>
|
270
|
+
</feed>
|
271
|
+
<pubsub xmlns="http://jabber.org/protocol/pubsub">
|
272
|
+
<publish node="368">
|
273
|
+
<item>
|
274
|
+
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.georss.org/georss" xmlns:as="http://activitystrea.ms/spec/1.0/" xmlns:sf="http://superfeedr.com/xmpp-pubsub-ext" xml:lang="en-US">
|
275
|
+
<id>tag:superfeedr.com,2005:String/1298307758</id>
|
276
|
+
<published>2011-02-21T12:02:38-05:00</published>
|
277
|
+
<updated>2011-02-21T12:02:38-05:00</updated>
|
278
|
+
<title>17:02:38</title>
|
279
|
+
<summary type="text"/>
|
280
|
+
<content type="text">Monday February 21 17:02:38 UTC 2011 Somebody wanted to know what time it was.</content>
|
281
|
+
<geo:point>37.773721,-122.414957</geo:point>
|
282
|
+
<link href="http://superfeedr.com/?1298307758" title="17:02:38" rel="alternate" type="text/html"/>
|
283
|
+
<category term="tests"/>
|
284
|
+
<author>
|
285
|
+
<name>Superfeedr</name>
|
286
|
+
<uri>http://superfeedr.com/</uri>
|
287
|
+
<email>julien@superfeedr.com</email>
|
288
|
+
</author>
|
289
|
+
</entry>
|
290
|
+
</item>
|
291
|
+
<item>
|
292
|
+
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.georss.org/georss" xmlns:as="http://activitystrea.ms/spec/1.0/" xmlns:sf="http://superfeedr.com/xmpp-pubsub-ext" xml:lang="en-US">
|
293
|
+
<id>tag:superfeedr.com,2005:String/1298307618</id>
|
294
|
+
<published>2011-02-21T12:00:18-05:00</published>
|
295
|
+
<updated>2011-02-21T12:00:18-05:00</updated>
|
296
|
+
<title>17:00:18</title>
|
297
|
+
<summary type="text"/>
|
298
|
+
<content type="text">Monday February 21 17:00:18 UTC 2011 Somebody wanted to know what time it was.</content>
|
299
|
+
<geo:point>37.773721,-122.414957</geo:point>
|
300
|
+
<link href="http://superfeedr.com/?1298307618" title="17:00:18" rel="alternate" type="text/html"/>
|
301
|
+
<category term="tests"/>
|
302
|
+
<author>
|
303
|
+
<name>Superfeedr</name>
|
304
|
+
<uri>http://superfeedr.com/</uri>
|
305
|
+
<email>julien@superfeedr.com</email>
|
306
|
+
</author>
|
307
|
+
</entry>
|
308
|
+
</item>
|
309
|
+
<item>
|
310
|
+
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.georss.org/georss" xmlns:as="http://activitystrea.ms/spec/1.0/" xmlns:sf="http://superfeedr.com/xmpp-pubsub-ext" xml:lang="en-US">
|
311
|
+
<id>tag:superfeedr.com,2005:String/1298307454</id>
|
312
|
+
<published>2011-02-21T11:57:34-05:00</published>
|
313
|
+
<updated>2011-02-21T11:57:34-05:00</updated>
|
314
|
+
<title>16:57:34</title>
|
315
|
+
<summary type="text"/>
|
316
|
+
<content type="text">Monday February 21 16:57:34 UTC 2011 Somebody wanted to know what time it was.</content>
|
317
|
+
<geo:point>37.773721,-122.414957</geo:point>
|
318
|
+
<link href="http://superfeedr.com/?1298307454" title="16:57:34" rel="alternate" type="text/html"/>
|
319
|
+
<category term="tests"/>
|
320
|
+
<author>
|
321
|
+
<name>Superfeedr</name>
|
322
|
+
<uri>http://superfeedr.com/</uri>
|
323
|
+
<email>julien@superfeedr.com</email>
|
324
|
+
</author>
|
325
|
+
</entry>
|
326
|
+
</item>
|
327
|
+
<item>
|
328
|
+
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.georss.org/georss" xmlns:as="http://activitystrea.ms/spec/1.0/" xmlns:sf="http://superfeedr.com/xmpp-pubsub-ext" xml:lang="en-US">
|
329
|
+
<id>tag:superfeedr.com,2005:String/1298307099</id>
|
330
|
+
<published>2011-02-21T11:51:39-05:00</published>
|
331
|
+
<updated>2011-02-21T11:51:39-05:00</updated>
|
332
|
+
<title>16:51:39</title>
|
333
|
+
<summary type="text"/>
|
334
|
+
<content type="text">Monday February 21 16:51:39 UTC 2011 Somebody wanted to know what time it was.</content>
|
335
|
+
<geo:point>37.773721,-122.414957</geo:point>
|
336
|
+
<link href="http://superfeedr.com/?1298307099" title="16:51:39" rel="alternate" type="text/html"/>
|
337
|
+
<category term="tests"/>
|
338
|
+
<author>
|
339
|
+
<name>Superfeedr</name>
|
340
|
+
<uri>http://superfeedr.com/</uri>
|
341
|
+
<email>julien@superfeedr.com</email>
|
342
|
+
</author>
|
343
|
+
</entry>
|
344
|
+
</item>
|
345
|
+
<item>
|
346
|
+
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.georss.org/georss" xmlns:as="http://activitystrea.ms/spec/1.0/" xmlns:sf="http://superfeedr.com/xmpp-pubsub-ext" xml:lang="en-US">
|
347
|
+
<id>tag:superfeedr.com,2005:String/1298305317</id>
|
348
|
+
<published>2011-02-21T11:21:57-05:00</published>
|
349
|
+
<updated>2011-02-21T11:21:57-05:00</updated>
|
350
|
+
<title>16:21:57</title>
|
351
|
+
<summary type="text"/>
|
352
|
+
<content type="text">Monday February 21 16:21:57 UTC 2011 Somebody wanted to know what time it was.</content>
|
353
|
+
<geo:point>37.773721,-122.414957</geo:point>
|
354
|
+
<link href="http://superfeedr.com/?1298305317" title="16:21:57" rel="alternate" type="text/html"/>
|
355
|
+
<category term="tests"/>
|
356
|
+
<author>
|
357
|
+
<name>Superfeedr</name>
|
358
|
+
<uri>http://superfeedr.com/</uri>
|
359
|
+
<email>julien@superfeedr.com</email>
|
360
|
+
</author>
|
361
|
+
</entry>
|
362
|
+
</item>
|
363
|
+
<item>
|
364
|
+
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.georss.org/georss" xmlns:as="http://activitystrea.ms/spec/1.0/" xmlns:sf="http://superfeedr.com/xmpp-pubsub-ext" xml:lang="en-US">
|
365
|
+
<id>tag:superfeedr.com,2005:String/1298305151</id>
|
366
|
+
<published>2011-02-21T11:19:11-05:00</published>
|
367
|
+
<updated>2011-02-21T11:19:11-05:00</updated>
|
368
|
+
<title>16:19:11</title>
|
369
|
+
<summary type="text"/>
|
370
|
+
<content type="text">Monday February 21 16:19:11 UTC 2011 Somebody wanted to know what time it was.</content>
|
371
|
+
<geo:point>37.773721,-122.414957</geo:point>
|
372
|
+
<link href="http://superfeedr.com/?1298305151" title="16:19:11" rel="alternate" type="text/html"/>
|
373
|
+
<category term="tests"/>
|
374
|
+
<author>
|
375
|
+
<name>Superfeedr</name>
|
376
|
+
<uri>http://superfeedr.com/</uri>
|
377
|
+
<email>julien@superfeedr.com</email>
|
378
|
+
</author>
|
379
|
+
</entry>
|
380
|
+
</item>
|
381
|
+
<item>
|
382
|
+
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.georss.org/georss" xmlns:as="http://activitystrea.ms/spec/1.0/" xmlns:sf="http://superfeedr.com/xmpp-pubsub-ext" xml:lang="en-US">
|
383
|
+
<id>tag:superfeedr.com,2005:String/1298304372</id>
|
384
|
+
<published>2011-02-21T11:06:12-05:00</published>
|
385
|
+
<updated>2011-02-21T11:06:12-05:00</updated>
|
386
|
+
<title>16:06:12</title>
|
387
|
+
<summary type="text"/>
|
388
|
+
<content type="text">Monday February 21 16:06:12 UTC 2011 Somebody wanted to know what time it was.</content>
|
389
|
+
<geo:point>37.773721,-122.414957</geo:point>
|
390
|
+
<link href="http://superfeedr.com/?1298304372" title="16:06:12" rel="alternate" type="text/html"/>
|
391
|
+
<category term="tests"/>
|
392
|
+
<author>
|
393
|
+
<name>Superfeedr</name>
|
394
|
+
<uri>http://superfeedr.com/</uri>
|
395
|
+
<email>julien@superfeedr.com</email>
|
396
|
+
</author>
|
397
|
+
</entry>
|
398
|
+
</item>
|
399
|
+
<item>
|
400
|
+
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.georss.org/georss" xmlns:as="http://activitystrea.ms/spec/1.0/" xmlns:sf="http://superfeedr.com/xmpp-pubsub-ext" xml:lang="en-US">
|
401
|
+
<id>tag:superfeedr.com,2005:String/1298304371</id>
|
402
|
+
<published>2011-02-21T11:06:11-05:00</published>
|
403
|
+
<updated>2011-02-21T11:06:11-05:00</updated>
|
404
|
+
<title>16:06:11</title>
|
405
|
+
<summary type="text"/>
|
406
|
+
<content type="text">Monday February 21 16:06:11 UTC 2011 Somebody wanted to know what time it was.</content>
|
407
|
+
<geo:point>37.773721,-122.414957</geo:point>
|
408
|
+
<link href="http://superfeedr.com/?1298304371" title="16:06:11" rel="alternate" type="text/html"/>
|
409
|
+
<category term="tests"/>
|
410
|
+
<author>
|
411
|
+
<name>Superfeedr</name>
|
412
|
+
<uri>http://superfeedr.com/</uri>
|
413
|
+
<email>julien@superfeedr.com</email>
|
414
|
+
</author>
|
415
|
+
</entry>
|
416
|
+
</item>
|
417
|
+
<item>
|
418
|
+
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.georss.org/georss" xmlns:as="http://activitystrea.ms/spec/1.0/" xmlns:sf="http://superfeedr.com/xmpp-pubsub-ext" xml:lang="en-US">
|
419
|
+
<id>tag:superfeedr.com,2005:String/1298304085</id>
|
420
|
+
<published>2011-02-21T11:01:25-05:00</published>
|
421
|
+
<updated>2011-02-21T11:01:25-05:00</updated>
|
422
|
+
<title>16:01:25</title>
|
423
|
+
<summary type="text"/>
|
424
|
+
<content type="text">Monday February 21 16:01:25 UTC 2011 Somebody wanted to know what time it was.</content>
|
425
|
+
<geo:point>37.773721,-122.414957</geo:point>
|
426
|
+
<link href="http://superfeedr.com/?1298304085" title="16:01:25" rel="alternate" type="text/html"/>
|
427
|
+
<category term="tests"/>
|
428
|
+
<author>
|
429
|
+
<name>Superfeedr</name>
|
430
|
+
<uri>http://superfeedr.com/</uri>
|
431
|
+
<email>julien@superfeedr.com</email>
|
432
|
+
</author>
|
433
|
+
</entry>
|
434
|
+
</item>
|
435
|
+
<item>
|
436
|
+
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.georss.org/georss" xmlns:as="http://activitystrea.ms/spec/1.0/" xmlns:sf="http://superfeedr.com/xmpp-pubsub-ext" xml:lang="en-US">
|
437
|
+
<id>tag:superfeedr.com,2005:String/1298303653</id>
|
438
|
+
<published>2011-02-21T10:54:13-05:00</published>
|
439
|
+
<updated>2011-02-21T10:54:13-05:00</updated>
|
440
|
+
<title>15:54:13</title>
|
441
|
+
<summary type="text"/>
|
442
|
+
<content type="text">Monday February 21 15:54:13 UTC 2011 Somebody wanted to know what time it was.</content>
|
443
|
+
<geo:point>37.773721,-122.414957</geo:point>
|
444
|
+
<link href="http://superfeedr.com/?1298303653" title="15:54:13" rel="alternate" type="text/html"/>
|
445
|
+
<category term="tests"/>
|
446
|
+
<author>
|
447
|
+
<name>Superfeedr</name>
|
448
|
+
<uri>http://superfeedr.com/</uri>
|
449
|
+
<email>julien@superfeedr.com</email>
|
450
|
+
</author>
|
451
|
+
</entry>
|
452
|
+
</item>
|
453
|
+
</publish>
|
454
|
+
</pubsub>
|
455
|
+
</iq>
|
456
|
+
EOXML
|
457
|
+
|
458
|
+
@proc = Proc.new { |stanza|
|
459
|
+
stanza.to_xml.should == @xml.strip
|
460
|
+
}
|
461
|
+
@parser = Skates::XmppParser.new(@proc)
|
462
|
+
end
|
463
|
+
|
464
|
+
it "should parse correctly the namespaces and the attributes" do
|
465
|
+
@parser.push(@xml)
|
466
|
+
end
|
467
|
+
end
|
468
|
+
|
283
469
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 5
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.5.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- julien Genestoux
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-02-21 00:00:00 -05:00
|
18
18
|
default_executable: skates
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -56,8 +56,8 @@ dependencies:
|
|
56
56
|
segments:
|
57
57
|
- 1
|
58
58
|
- 4
|
59
|
-
-
|
60
|
-
version: 1.4.
|
59
|
+
- 4
|
60
|
+
version: 1.4.4
|
61
61
|
type: :runtime
|
62
62
|
version_requirements: *id003
|
63
63
|
- !ruby/object:Gem::Dependency
|