jubjub 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/README.mdown +27 -1
- data/lib/jubjub.rb +1 -1
- data/lib/jubjub/connection/xmpp_gateway.rb +9 -9
- data/lib/jubjub/connection/xmpp_gateway/helper.rb +5 -5
- data/lib/jubjub/connection/xmpp_gateway/muc.rb +127 -32
- data/lib/jubjub/connection/xmpp_gateway/pubsub.rb +64 -64
- data/lib/jubjub/data_form.rb +16 -13
- data/lib/jubjub/errors.rb +2 -2
- data/lib/jubjub/helpers.rb +32 -0
- data/lib/jubjub/jid.rb +8 -8
- data/lib/jubjub/muc.rb +3 -1
- data/lib/jubjub/muc/affiliation.rb +77 -0
- data/lib/jubjub/muc/affiliations_collection.rb +31 -0
- data/lib/jubjub/muc/collection.rb +12 -19
- data/lib/jubjub/muc/configuration.rb +2 -2
- data/lib/jubjub/muc/muc.rb +24 -11
- data/lib/jubjub/pubsub.rb +1 -1
- data/lib/jubjub/pubsub/affiliation.rb +20 -20
- data/lib/jubjub/pubsub/affiliation_collection.rb +11 -18
- data/lib/jubjub/pubsub/collection.rb +14 -21
- data/lib/jubjub/pubsub/configuration.rb +2 -2
- data/lib/jubjub/pubsub/item.rb +8 -8
- data/lib/jubjub/pubsub/item_collection.rb +10 -17
- data/lib/jubjub/pubsub/pubsub.rb +17 -17
- data/lib/jubjub/pubsub/subscription.rb +6 -6
- data/lib/jubjub/response.rb +1 -1
- data/lib/jubjub/response/error.rb +6 -6
- data/lib/jubjub/response/proxy.rb +8 -8
- data/lib/jubjub/response/response.rb +10 -10
- data/lib/jubjub/user.rb +16 -15
- data/spec/connection/xmpp_gateway_muc_spec.rb +174 -40
- data/spec/connection/xmpp_gateway_pubsub_spec.rb +100 -104
- data/spec/fixtures/vcr_cassettes/muc_configuration.yml +73 -6
- data/spec/fixtures/vcr_cassettes/muc_create_with_configuration.yml +8 -8
- data/spec/fixtures/vcr_cassettes/muc_message.yml +89 -0
- data/spec/fixtures/vcr_cassettes/muc_modify_affiliations.yml +367 -0
- data/spec/fixtures/vcr_cassettes/muc_retrieve_affiliations.yml +93 -0
- data/spec/fixtures/vcr_cassettes/pubsub_publish_with_dataform_payload.yml +3 -3
- data/spec/fixtures/vcr_cassettes/pubsub_retrieve_items.yml +24 -18
- data/spec/mixins/user_spec.rb +37 -37
- data/spec/models/data_form_spec.rb +3 -3
- data/spec/models/jid_spec.rb +41 -41
- data/spec/models/muc_affiliation_collection_spec.rb +146 -0
- data/spec/models/muc_affiliation_spec.rb +215 -0
- data/spec/models/muc_collection_spec.rb +64 -32
- data/spec/models/muc_configuration_spec.rb +3 -3
- data/spec/models/muc_spec.rb +44 -23
- data/spec/models/pubsub_affiliation_collection_spec.rb +65 -30
- data/spec/models/pubsub_affiliation_spec.rb +50 -50
- data/spec/models/pubsub_collection_spec.rb +65 -49
- data/spec/models/pubsub_item_collection_spec.rb +17 -17
- data/spec/models/pubsub_item_spec.rb +18 -18
- data/spec/models/pubsub_spec.rb +41 -41
- data/spec/models/pubsub_subscription_spec.rb +23 -23
- data/spec/models/response_error_spec.rb +19 -19
- data/spec/models/response_proxy_spec.rb +51 -49
- data/spec/models/response_spec.rb +33 -33
- data/spec/support/helpers.rb +21 -1
- data/spec/support/matchers.rb +4 -4
- data/spec/support/shared_examples.rb +132 -94
- data/spec/support/webmock_stanza_matching.rb +43 -0
- metadata +45 -16
@@ -1,7 +1,9 @@
|
|
1
1
|
class Jubjub::Pubsub::AffiliationCollection
|
2
|
-
|
2
|
+
|
3
3
|
attr_reader :jid, :node
|
4
|
-
|
4
|
+
|
5
|
+
include Jubjub::Helpers::Collection
|
6
|
+
|
5
7
|
def initialize(jid,node,connection)
|
6
8
|
@jid = Jubjub::Jid.new jid
|
7
9
|
@node = node
|
@@ -11,28 +13,19 @@ class Jubjub::Pubsub::AffiliationCollection
|
|
11
13
|
def [](jid_num)
|
12
14
|
case jid_num
|
13
15
|
when Fixnum
|
14
|
-
|
16
|
+
list[jid_num]
|
15
17
|
when Jubjub::Jid
|
16
|
-
|
18
|
+
search_list( Jubjub::Pubsub::Affiliation.new( jid, node, jid_num, 'none', @connection ) ){|i| i.jid == jid_num }
|
17
19
|
else
|
18
20
|
j = Jubjub::Jid.new( jid_num )
|
19
|
-
|
21
|
+
search_list( Jubjub::Pubsub::Affiliation.new( jid, node, j, 'none', @connection ) ){|i| i.jid == j }
|
20
22
|
end
|
21
23
|
end
|
22
24
|
|
23
|
-
# Hint that methods are actually applied to list using method_missing
|
24
|
-
def inspect
|
25
|
-
affiliations.inspect
|
26
|
-
end
|
27
|
-
|
28
25
|
private
|
29
26
|
|
30
|
-
def
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
def affiliations
|
35
|
-
@affiliations ||= @connection.pubsub.retrieve_affiliations( @jid, @node )
|
27
|
+
def list
|
28
|
+
@list ||= @connection.pubsub.retrieve_affiliations( @jid, @node )
|
36
29
|
end
|
37
|
-
|
38
|
-
end
|
30
|
+
|
31
|
+
end
|
@@ -2,18 +2,20 @@
|
|
2
2
|
# and delaying expensive operations until
|
3
3
|
# required
|
4
4
|
class Jubjub::Pubsub::Collection
|
5
|
-
|
5
|
+
|
6
6
|
attr_reader :jid
|
7
|
-
|
7
|
+
|
8
|
+
include Jubjub::Helpers::Collection
|
9
|
+
|
8
10
|
def initialize(jid, connection)
|
9
11
|
@jid = Jubjub::Jid.new jid
|
10
12
|
@connection = connection
|
11
13
|
end
|
12
|
-
|
14
|
+
|
13
15
|
def create(node)
|
14
16
|
@connection.pubsub.create jid, node
|
15
17
|
end
|
16
|
-
|
18
|
+
|
17
19
|
def create(node, &block)
|
18
20
|
config = nil
|
19
21
|
if block_given?
|
@@ -23,46 +25,37 @@ class Jubjub::Pubsub::Collection
|
|
23
25
|
end
|
24
26
|
@connection.pubsub.create jid, node, config
|
25
27
|
end
|
26
|
-
|
28
|
+
|
27
29
|
def destroy(node, redirect_jid = nil, redirect_node = nil)
|
28
30
|
redirect_jid = Jubjub::Jid.new(redirect_jid) if redirect_jid
|
29
31
|
@connection.pubsub.destroy jid, node, redirect_jid, redirect_node
|
30
32
|
end
|
31
|
-
|
33
|
+
|
32
34
|
def purge(node)
|
33
35
|
@connection.pubsub.purge jid, node
|
34
36
|
end
|
35
|
-
|
37
|
+
|
36
38
|
def subscribe(node)
|
37
39
|
@connection.pubsub.subscribe jid, node
|
38
40
|
end
|
39
|
-
|
41
|
+
|
40
42
|
def unsubscribe(node, subid=nil)
|
41
43
|
@connection.pubsub.unsubscribe jid, node, subid
|
42
44
|
end
|
43
|
-
|
45
|
+
|
44
46
|
def [](node_num)
|
45
47
|
case node_num
|
46
48
|
when Fixnum
|
47
49
|
list[node_num]
|
48
50
|
else
|
49
|
-
|
51
|
+
search_list(Jubjub::Pubsub.new( jid, node_num, @connection )){|p| p.node == node_num }
|
50
52
|
end
|
51
53
|
end
|
52
|
-
|
53
|
-
# Hint that methods are actually applied to list using method_missing
|
54
|
-
def inspect
|
55
|
-
list.inspect
|
56
|
-
end
|
57
54
|
|
58
55
|
private
|
59
56
|
|
60
|
-
def method_missing(name, *args, &block)
|
61
|
-
list.send(name, *args, &block)
|
62
|
-
end
|
63
|
-
|
64
57
|
def list
|
65
58
|
@list ||= @connection.pubsub.list jid
|
66
59
|
end
|
67
|
-
|
68
|
-
end
|
60
|
+
|
61
|
+
end
|
data/lib/jubjub/pubsub/item.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
class Jubjub::Pubsub::Item
|
2
|
-
|
2
|
+
|
3
3
|
attr_reader :jid, :node, :item_id, :data
|
4
|
-
|
4
|
+
|
5
5
|
def initialize(jid, node, item_id, data, connection)
|
6
6
|
@jid = Jubjub::Jid.new jid
|
7
7
|
@node = node
|
@@ -9,17 +9,17 @@ class Jubjub::Pubsub::Item
|
|
9
9
|
@data = data
|
10
10
|
@connection = connection
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
# Hide the connection details and show jid as string for compactness
|
14
14
|
def inspect
|
15
15
|
obj_id = "%x" % (object_id << 1)
|
16
16
|
"#<#{self.class}:0x#{obj_id} @jid=\"#{jid}\" @node=#{node.inspect} @item_id=#{item_id.inspect} @data=#{data.inspect}>"
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
def retract
|
20
20
|
@connection.pubsub.retract jid, node, item_id
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
def ==(other)
|
24
24
|
other.is_a?( self.class ) &&
|
25
25
|
other.jid == self.jid &&
|
@@ -27,9 +27,9 @@ class Jubjub::Pubsub::Item
|
|
27
27
|
other.item_id == self.item_id &&
|
28
28
|
other.data == self.data
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def uri
|
32
32
|
"xmpp:#{@jid}?;node=#{@node};item=#{@item_id}"
|
33
33
|
end
|
34
|
-
|
35
|
-
end
|
34
|
+
|
35
|
+
end
|
@@ -1,7 +1,9 @@
|
|
1
1
|
class Jubjub::Pubsub::ItemCollection
|
2
|
-
|
2
|
+
|
3
3
|
attr_reader :jid, :node
|
4
|
-
|
4
|
+
|
5
|
+
include Jubjub::Helpers::Collection
|
6
|
+
|
5
7
|
def initialize(jid,node,connection)
|
6
8
|
@jid = Jubjub::Jid.new jid
|
7
9
|
@node = node
|
@@ -11,25 +13,16 @@ class Jubjub::Pubsub::ItemCollection
|
|
11
13
|
def [](item_num)
|
12
14
|
case item_num
|
13
15
|
when Fixnum
|
14
|
-
|
16
|
+
list[item_num]
|
15
17
|
else
|
16
|
-
|
18
|
+
search_list{|i| i.item_id == item_num }
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
20
|
-
# Hint that methods are actually applied to list using method_missing
|
21
|
-
def inspect
|
22
|
-
items.inspect
|
23
|
-
end
|
24
|
-
|
25
22
|
private
|
26
23
|
|
27
|
-
def
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
def items
|
32
|
-
@items ||= @connection.pubsub.retrieve_items( @jid, @node )
|
24
|
+
def list
|
25
|
+
@list ||= @connection.pubsub.retrieve_items( @jid, @node )
|
33
26
|
end
|
34
|
-
|
35
|
-
end
|
27
|
+
|
28
|
+
end
|
data/lib/jubjub/pubsub/pubsub.rb
CHANGED
@@ -1,66 +1,66 @@
|
|
1
1
|
class Jubjub::Pubsub
|
2
|
-
|
2
|
+
|
3
3
|
attr_reader :jid, :node
|
4
|
-
|
4
|
+
|
5
5
|
def initialize(jid, node, connection)
|
6
6
|
@jid = Jubjub::Jid.new jid
|
7
7
|
@node = node
|
8
8
|
@connection = connection
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
def destroy(redirect_jid = nil, redirect_node = nil)
|
12
12
|
redirect_jid = Jubjub::Jid.new(redirect_jid) if redirect_jid
|
13
13
|
@connection.pubsub.destroy jid, node, redirect_jid, redirect_node
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
def purge
|
17
17
|
@connection.pubsub.purge jid, node
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
def subscribe
|
21
21
|
@connection.pubsub.subscribe jid, node
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
def unsubscribe(subid = nil)
|
25
|
-
@connection.pubsub.unsubscribe jid, node, subid
|
25
|
+
@connection.pubsub.unsubscribe jid, node, subid
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
def publish(data, item_id = nil)
|
29
29
|
@connection.pubsub.publish jid, node, data, item_id
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
def retract(item_id)
|
33
33
|
@connection.pubsub.retract jid, node, item_id
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
# Hide the connection details and show jid as string for compactness
|
37
37
|
def inspect
|
38
38
|
obj_id = "%x" % (object_id << 1)
|
39
39
|
"#<#{self.class}:0x#{obj_id} @jid=\"#{jid}\" @node=#{node.inspect}>"
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
def items
|
43
43
|
ItemCollection.new jid, node, @connection
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
def affiliations
|
47
47
|
AffiliationCollection.new jid, node, @connection
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
def uri
|
51
51
|
"xmpp:#{@jid}?;node=#{@node}"
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
def ==(other)
|
55
55
|
other.is_a?( self.class ) &&
|
56
56
|
other.jid == self.jid &&
|
57
57
|
other.node == self.node
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
private
|
61
61
|
|
62
62
|
def method_missing(name, *args, &block)
|
63
63
|
items.send(name, *args, &block)
|
64
64
|
end
|
65
|
-
|
66
|
-
end
|
65
|
+
|
66
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class Jubjub::Pubsub::Subscription
|
2
|
-
|
2
|
+
|
3
3
|
attr_reader :jid, :node, :subscriber, :subid, :subscription
|
4
|
-
|
4
|
+
|
5
5
|
def initialize(jid, node, subscriber, subid, subscription, connection)
|
6
6
|
@jid = Jubjub::Jid.new jid
|
7
7
|
@node = node
|
@@ -10,15 +10,15 @@ class Jubjub::Pubsub::Subscription
|
|
10
10
|
@subscription = subscription
|
11
11
|
@connection = connection
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
def unsubscribe
|
15
15
|
@connection.pubsub.unsubscribe jid, node, subid
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
# Hide the connection details and show jid as string for compactness
|
19
19
|
def inspect
|
20
20
|
obj_id = "%x" % (object_id << 1)
|
21
21
|
"#<#{self.class}:0x#{obj_id} @jid=\"#{jid}\" @node=#{node.inspect} @subscriber=\"#{subscriber}\" @subid=#{subid.inspect} @subscription=#{subscription.inspect}>"
|
22
22
|
end
|
23
|
-
|
24
|
-
end
|
23
|
+
|
24
|
+
end
|
data/lib/jubjub/response.rb
CHANGED
@@ -7,19 +7,19 @@ module Jubjub
|
|
7
7
|
def initialize(xml)
|
8
8
|
@stanza = xml
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
def condition
|
12
12
|
@condition ||= begin
|
13
13
|
condition = @stanza.xpath('//error/ietf:*','ietf' => 'urn:ietf:params:xml:ns:xmpp-stanzas').first
|
14
14
|
condition.name if condition
|
15
15
|
end
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
def type
|
19
19
|
@error_type ||= stanza.xpath('//error').first.attr('type')
|
20
20
|
end
|
21
|
-
|
22
|
-
def text(language=nil)
|
21
|
+
|
22
|
+
def text(language=nil)
|
23
23
|
if language
|
24
24
|
xpath = "//error/text[@xml:lang='#{language}']"
|
25
25
|
else
|
@@ -27,7 +27,7 @@ module Jubjub
|
|
27
27
|
end
|
28
28
|
stanza.xpath(xpath).text
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
end
|
32
32
|
end
|
33
|
-
end
|
33
|
+
end
|
@@ -6,39 +6,39 @@ module Jubjub
|
|
6
6
|
instance_methods.each do |m|
|
7
7
|
undef_method(m) if m.to_s !~ /(?:^__|^nil?$|^send$|^object_id$|^should$)/
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
attr_reader :proxy_primary, :proxy_secondary
|
11
|
-
|
11
|
+
|
12
12
|
def initialize(primary, secondary, primary_method)
|
13
13
|
@proxy_primary = primary
|
14
14
|
@proxy_secondary = secondary
|
15
15
|
@primary_method = primary_method
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
# We really want to show the secondary object
|
19
19
|
# as the primary is just a thin layer on top
|
20
20
|
def inspect
|
21
21
|
proxy_secondary.inspect
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
# Used to give away this is really a proxy
|
25
25
|
def proxy_class
|
26
26
|
Jubjub::Response::Proxy
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
private
|
30
30
|
|
31
31
|
def method_missing(name, *args, &block)
|
32
32
|
# If the method exists on the primary use that
|
33
33
|
# unless it's the method name called to create the proxy from the primary, or is a standard object method
|
34
|
-
if name.to_s != @primary_method && (proxy_primary.public_methods - Object.public_methods).include?( name.to_s )
|
34
|
+
if name.to_s != @primary_method && (proxy_primary.public_methods - Object.public_methods).map{|m| m.to_s }.include?( name.to_s )
|
35
35
|
proxy_primary.send(name, *args, &block)
|
36
36
|
else
|
37
37
|
# Else use a method on the secondary
|
38
38
|
proxy_secondary.send(name, *args, &block)
|
39
39
|
end
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
end
|
43
43
|
end
|
44
|
-
end
|
44
|
+
end
|
@@ -1,33 +1,33 @@
|
|
1
1
|
module Jubjub
|
2
|
-
|
2
|
+
|
3
3
|
class Response
|
4
|
-
|
4
|
+
|
5
5
|
attr_reader :stanza, :result
|
6
|
-
|
6
|
+
|
7
7
|
def initialize(xml,&block)
|
8
8
|
@stanza = xml
|
9
|
-
|
9
|
+
|
10
10
|
@result = nil
|
11
11
|
@result = yield stanza if block_given?
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
def proxy_result
|
15
|
-
# Allows some syntax sugar. We can chain from the result,
|
15
|
+
# Allows some syntax sugar. We can chain from the result,
|
16
16
|
# but still get access to the response via the proxy
|
17
17
|
@proxy_result ||= Proxy.new self, result, 'proxy_result'
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
def success?
|
21
21
|
@success ||= stanza.xpath('/iq[@type="result"]|/iq[@type="set"]|/iq[@type="get"]').any?
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
def error
|
25
25
|
@errors ||= begin
|
26
26
|
s = stanza.at_xpath('/iq[@type="error"]/error')
|
27
27
|
Error.new s if s
|
28
28
|
end
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
end
|