blather 1.1.4 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a85d8fb5a9772eeec0acbfa01a8209eca2e75444
4
- data.tar.gz: 45ddd3d5a7f0cadb2dc77092d60ddc126e7edc8f
3
+ metadata.gz: 26cf5c0a6d1dba72a71b5c0b48696354f78c421b
4
+ data.tar.gz: f1bd35632f6b5b809dcf6fa062da13f750eae39b
5
5
  SHA512:
6
- metadata.gz: dc515219630366c9c16ea6dca0df9760bd3a524cc3af1e7548b915ff32acadc85b5b691404c0da258093bf7bfe414b01b4b263e9a6d42af585ffbd6fcebc0141
7
- data.tar.gz: c099266674663efada77e9daf5b1884633b2bf5f5b8cb2a2419003d1f6d2652d945d67e507b16497f24a5bb942159cae4f154aa6c51aaf1e54415944a5d1507c
6
+ metadata.gz: 92884baac11b0f449f6b87b2a52f55534bca13f1638783c5c4c2f50c160af35b30712d47a89395455aeb6fbe6585c87ee0b0ad5b81b84782415605f28c80662d
7
+ data.tar.gz: eeb47327e6496182a286311a0873c1347679fa09f1ed827c5e71b35843aa6c117a299dc64e93fc1bb340b14c3100f64ad3e9a2c871b03752fb7c66c414371ae4
@@ -11,5 +11,7 @@ matrix:
11
11
  - rvm: jruby
12
12
  - rvm: ruby-head
13
13
  - rvm: rbx-2.1.1
14
+ before_install:
15
+ - gem install bundler
14
16
  notifications:
15
17
  irc: "irc.freenode.org#adhearsion"
@@ -1,5 +1,11 @@
1
1
  # [develop](https://github.com/adhearsion/blather/compare/master...develop)
2
2
 
3
+ # [v1.2.0](https://github.com/adhearsion/blather/compare/v1.1.4...v1.2.0) - [2016-01-07](https://rubygems.org/gems/blather/versions/1.2.0)
4
+ * Bugfix: Properly sort resources with the same priority but different status
5
+ * Bugfix: Lock to Nokogiri <= 1.6.1 because new versions are more broken than old ones
6
+ * Bugfix: Avoid repeatedly parsing nodes which are already parsed
7
+ * Feature: Implement Blather::Roster#version, which returns version of last processed roster stanza
8
+
3
9
  # [v1.1.4](https://github.com/adhearsion/blather/compare/v1.1.4...v1.1.4) - [2015-06-12](https://rubygems.org/gems/blather/versions/1.1.4)
4
10
  * Bugfix: Typo in passing through connection options
5
11
  * Today was a very dark day. I am ashamed of myself.
@@ -35,7 +35,7 @@ Gem::Specification.new do |s|
35
35
  s.extra_rdoc_files = %w{LICENSE README.md}
36
36
 
37
37
  s.add_dependency "eventmachine", [">= 1.0.0"]
38
- s.add_dependency "nokogiri", ["~> 1.5", ">= 1.5.6"]
38
+ s.add_dependency "nokogiri", ["~> 1.5", ">= 1.5.6", "<= 1.6.1"]
39
39
  s.add_dependency "niceogiri", ["~> 1.0"]
40
40
  s.add_dependency "activesupport", [">= 2.3.11"]
41
41
  s.add_dependency "girl_friday"
@@ -46,7 +46,6 @@ Gem::Specification.new do |s|
46
46
  s.add_development_dependency "mocha", ["~> 0.9"]
47
47
  s.add_development_dependency "guard-rspec"
48
48
  s.add_development_dependency "yard", ["~> 0.6"]
49
- s.add_development_dependency "jruby-openssl", ["~> 0.7"] if jruby?
50
49
  s.add_development_dependency "bluecloth" unless jruby? || rbx?
51
50
  s.add_development_dependency "countdownlatch"
52
51
  s.add_development_dependency 'rb-fsevent', ['~> 0.9']
@@ -5,24 +5,27 @@ module Blather
5
5
  class Roster
6
6
  include Enumerable
7
7
 
8
+ attr_reader :version
9
+
8
10
  # Create a new roster
9
11
  #
10
12
  # @param [Blather::Stream] stream the stream the roster should use to
11
13
  # update roster entries
12
- # @param [Blather::Stanza::Roster] stanza a roster stanza used to preload
14
+ # @param [Blather::Stanza::Iq::Roster] stanza a roster stanza used to preload
13
15
  # the roster
14
16
  # @return [Blather::Roster]
15
17
  def initialize(stream, stanza = nil)
16
18
  @stream = stream
17
19
  @items = {}
18
- stanza.items.each { |i| push i, false } if stanza
20
+ process(stanza) if stanza
19
21
  end
20
22
 
21
23
  # Process any incoming stanzas and either adds or removes the
22
24
  # corresponding RosterItem
23
25
  #
24
- # @param [Blather::Stanza::Roster] stanza a roster stanza
26
+ # @param [Blather::Stanza::Iq::Roster] stanza a roster stanza
25
27
  def process(stanza)
28
+ @version = stanza.version
26
29
  stanza.items.each do |i|
27
30
  case i.subscription
28
31
  when :remove then @items.delete(key(i.jid))
@@ -84,6 +84,8 @@ class Stanza
84
84
  # @param [String, nil] type the type of the Identity
85
85
  # @param [String, nil] category the category of the Identity
86
86
  def self.new(name, type = nil, category = nil, xml_lang = nil)
87
+ return name if name.class == self
88
+
87
89
  new_node = super :identity
88
90
 
89
91
  case name
@@ -170,6 +172,8 @@ class Stanza
170
172
  # @param [String] var a the Feautre's var
171
173
  # @return [DiscoInfo::Feature]
172
174
  def self.new(var)
175
+ return var if var.class == self
176
+
173
177
  new_node = super :feature
174
178
  case var
175
179
  when Nokogiri::XML::Node
@@ -62,6 +62,8 @@ class Stanza
62
62
  # @param [#to_s] node the node the item is attached to
63
63
  # @param [#to_s] name the name of the Item
64
64
  def self.new(jid, node = nil, name = nil)
65
+ return jid if jid.class == self
66
+
65
67
  new_node = super :item
66
68
 
67
69
  case jid
@@ -42,6 +42,13 @@ class Iq
42
42
  end
43
43
  end
44
44
 
45
+ # The provided roster version if available
46
+ #
47
+ # @return [String]
48
+ def version
49
+ query[:ver]
50
+ end
51
+
45
52
  # # RosterItem Fragment
46
53
  #
47
54
  # Individual roster items.
@@ -76,9 +76,13 @@ class Presence
76
76
  # @handler :status
77
77
  class Status < Presence
78
78
  # @private
79
+ # The spec requires only the following 4 states
79
80
  VALID_STATES = [:away, :chat, :dnd, :xa].freeze
80
81
  VALID_TYPES = [:unavailable].freeze
81
82
 
83
+ # ...but this is the sorted list of possible states
84
+ POSSIBLE_STATES = [:unavailable, :dnd, :xa, :away, :available, :chat].freeze
85
+
82
86
  include Comparable
83
87
 
84
88
  register :status, :status
@@ -200,7 +204,11 @@ class Presence
200
204
  end
201
205
 
202
206
  if (self.type.nil? && o.type.nil?) || (!self.type.nil? && !o.type.nil?)
203
- self.priority <=> o.priority
207
+ if self.priority == o.priority
208
+ POSSIBLE_STATES.index(self.state) <=> POSSIBLE_STATES.index(o.state)
209
+ else
210
+ self.priority <=> o.priority
211
+ end
204
212
  elsif self.type.nil? && !o.type.nil?
205
213
  1
206
214
  elsif !self.type.nil? && o.type.nil?
@@ -72,6 +72,8 @@ class Stanza
72
72
  # @param [XML::Document, nil] document the document the node should be
73
73
  # attached to. This should be the document of the parent PubSub node.
74
74
  def self.new(id = nil, payload = nil, document = nil)
75
+ return id if id.class == self
76
+
75
77
  new_node = super 'item', document
76
78
  new_node.id = id
77
79
  new_node.payload = payload if payload
@@ -1,3 +1,3 @@
1
1
  module Blather
2
- VERSION = '1.1.4'
2
+ VERSION = '1.2.0'
3
3
  end
@@ -6,14 +6,15 @@ describe Blather::Roster do
6
6
  @stream.stubs(:write)
7
7
 
8
8
  @stanza = mock()
9
- items = []; 4.times { |n| items << Blather::JID.new("n@d/#{n}r") }
9
+ items = 4.times.map { |n| Blather::Stanza::Iq::Roster::RosterItem.new(jid: "n@d/#{n}r") }
10
10
  @stanza.stubs(:items).returns(items)
11
+ @stanza.stubs(:version).returns('24d091d0dcfab1b3')
11
12
 
12
13
  @roster = Blather::Roster.new(@stream, @stanza)
13
14
  end
14
15
 
15
16
  it 'initializes with items' do
16
- @roster.items.map { |_,i| i.jid.to_s }.should == (@stanza.items.map { |i| i.stripped.to_s }.uniq)
17
+ @roster.items.map { |_,i| i.jid.to_s }.should == (@stanza.items.map { |i| i.jid.stripped.to_s }.uniq)
17
18
  end
18
19
 
19
20
  it 'processes @stanzas with remove requests' do
@@ -104,4 +105,8 @@ describe Blather::Roster do
104
105
  'group3' => [item2]
105
106
  })
106
107
  end
108
+
109
+ it 'has a version' do
110
+ expect(@roster.version).to eq @stanza.version
111
+ end
107
112
  end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  def roster_xml
4
4
  <<-XML
5
5
  <iq to='juliet@example.com/balcony' type='result' id='roster_1'>
6
- <query xmlns='jabber:iq:roster'>
6
+ <query xmlns='jabber:iq:roster' ver='3bb607aa4fa0bc9e'>
7
7
  <item jid='romeo@example.net'
8
8
  name='Romeo'
9
9
  subscription='both'>
@@ -38,6 +38,12 @@ describe Blather::Stanza::Iq::Roster do
38
38
  it 'can be created with #import' do
39
39
  Blather::XMPPNode.parse(roster_xml).should be_instance_of Blather::Stanza::Iq::Roster
40
40
  end
41
+
42
+ it 'retrieves version' do
43
+ n = parse_stanza roster_xml
44
+ r = Blather::Stanza::Iq::Roster.new.inherit n.root
45
+ expect(r.version).to eq '3bb607aa4fa0bc9e'
46
+ end
41
47
  end
42
48
 
43
49
  describe Blather::Stanza::Iq::Roster::RosterItem do
@@ -118,6 +118,20 @@ describe Blather::Stanza::Presence::Status do
118
118
  (status1 <=> status2).should == 0
119
119
  end
120
120
 
121
+ it 'must should sort by status if priorities are equal' do
122
+ jid = Blather::JID.new 'a@b/c'
123
+
124
+ status1 = Blather::Stanza::Presence::Status.new :away
125
+ status1.from = jid
126
+
127
+ status2 = Blather::Stanza::Presence::Status.new :available
128
+ status2.from = jid
129
+
130
+ status1.priority = status2.priority = 1
131
+ (status1 <=> status2).should == -1
132
+ (status2 <=> status1).should == 1
133
+ end
134
+
121
135
  it 'raises an argument error if compared to a status with a different Blather::JID' do
122
136
  status1 = Blather::Stanza::Presence::Status.new
123
137
  status1.from = 'a@b/c'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blather
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.4
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Smick
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-06-12 00:00:00.000000000 Z
12
+ date: 2016-01-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: eventmachine
@@ -35,6 +35,9 @@ dependencies:
35
35
  - - ">="
36
36
  - !ruby/object:Gem::Version
37
37
  version: 1.5.6
38
+ - - "<="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.6.1
38
41
  type: :runtime
39
42
  prerelease: false
40
43
  version_requirements: !ruby/object:Gem::Requirement
@@ -45,6 +48,9 @@ dependencies:
45
48
  - - ">="
46
49
  - !ruby/object:Gem::Version
47
50
  version: 1.5.6
51
+ - - "<="
52
+ - !ruby/object:Gem::Version
53
+ version: 1.6.1
48
54
  - !ruby/object:Gem::Dependency
49
55
  name: niceogiri
50
56
  requirement: !ruby/object:Gem::Requirement
@@ -392,7 +398,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
392
398
  version: '0'
393
399
  requirements: []
394
400
  rubyforge_project:
395
- rubygems_version: 2.4.5
401
+ rubygems_version: 2.5.1
396
402
  signing_key:
397
403
  specification_version: 4
398
404
  summary: Simpler XMPP built for speed