blather 0.4.16 → 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.
Files changed (62) hide show
  1. data/.gemtest +0 -0
  2. data/CHANGELOG +12 -5
  3. data/README.md +1 -1
  4. data/Rakefile +1 -3
  5. data/blather.gemspec +11 -24
  6. data/examples/echo.rb +1 -0
  7. data/examples/execute.rb +1 -0
  8. data/examples/ping_pong.rb +1 -0
  9. data/examples/print_hierarchy.rb +1 -0
  10. data/examples/rosterprint.rb +1 -0
  11. data/examples/stream_only.rb +1 -0
  12. data/examples/xmpp4r/echo.rb +1 -0
  13. data/lib/blather.rb +5 -1
  14. data/lib/blather/client/client.rb +29 -154
  15. data/lib/blather/client/dsl.rb +9 -3
  16. data/lib/blather/client/dsl/pubsub.rb +2 -0
  17. data/lib/blather/core_ext/eventmachine.rb +4 -1
  18. data/lib/blather/core_ext/ipaddr.rb +2 -1
  19. data/lib/blather/core_ext/nokogiri.rb +3 -1
  20. data/lib/blather/errors/sasl_error.rb +1 -0
  21. data/lib/blather/errors/stanza_error.rb +3 -1
  22. data/lib/blather/errors/stream_error.rb +1 -0
  23. data/lib/blather/file_transfer.rb +4 -1
  24. data/lib/blather/file_transfer/s5b.rb +3 -4
  25. data/lib/blather/jid.rb +2 -0
  26. data/lib/blather/roster_item.rb +13 -3
  27. data/lib/blather/stanza.rb +11 -3
  28. data/lib/blather/stanza/disco/capabilities.rb +161 -0
  29. data/lib/blather/stanza/disco/disco_info.rb +3 -1
  30. data/lib/blather/stanza/disco/disco_items.rb +0 -1
  31. data/lib/blather/stanza/iq.rb +8 -2
  32. data/lib/blather/stanza/iq/command.rb +18 -3
  33. data/lib/blather/stanza/iq/ibb.rb +6 -3
  34. data/lib/blather/stanza/iq/s5b.rb +6 -3
  35. data/lib/blather/stanza/iq/si.rb +6 -1
  36. data/lib/blather/stanza/iq/vcard.rb +3 -1
  37. data/lib/blather/stanza/message.rb +5 -0
  38. data/lib/blather/stanza/presence.rb +1 -0
  39. data/lib/blather/stanza/presence/c.rb +1 -0
  40. data/lib/blather/stanza/presence/status.rb +1 -0
  41. data/lib/blather/stanza/pubsub/event.rb +2 -4
  42. data/lib/blather/stanza/pubsub/subscription.rb +1 -0
  43. data/lib/blather/stanza/x.rb +8 -0
  44. data/lib/blather/stream.rb +2 -0
  45. data/lib/blather/stream/client.rb +1 -0
  46. data/lib/blather/stream/component.rb +1 -0
  47. data/lib/blather/stream/features.rb +4 -3
  48. data/lib/blather/stream/features/resource.rb +4 -3
  49. data/lib/blather/stream/features/sasl.rb +9 -6
  50. data/lib/blather/stream/features/session.rb +5 -4
  51. data/lib/blather/stream/features/tls.rb +4 -3
  52. data/lib/blather/stream/parser.rb +4 -5
  53. data/lib/blather/version.rb +2 -1
  54. data/lib/blather/xmpp_node.rb +9 -0
  55. data/spec/blather/client/client_spec.rb +14 -1
  56. data/spec/blather/stanza/iq_spec.rb +16 -0
  57. data/spec/blather/stanza/presence_spec.rb +1 -1
  58. data/spec/blather/stanza_spec.rb +18 -0
  59. data/spec/blather/stream/client_spec.rb +2 -2
  60. metadata +52 -35
  61. data/lib/blather/core_ext/active_support.rb +0 -45
  62. data/lib/blather/core_ext/active_support/inheritable_attributes.rb +0 -117
@@ -1,7 +1,8 @@
1
- module Blather # :nodoc:
2
- class Stream # :nodoc:
1
+ module Blather
2
+ class Stream
3
3
 
4
- class Session < Features # :nodoc:
4
+ # @private
5
+ class Session < Features
5
6
  SESSION_NS = 'urn:ietf:params:xml:ns:xmpp-session'.freeze
6
7
  register SESSION_NS
7
8
 
@@ -22,7 +23,7 @@ class Stream # :nodoc:
22
23
  private
23
24
  def check_response
24
25
  if @node[:type] == 'result'
25
- succeed!
26
+ succeed!
26
27
  else
27
28
  fail!(StanzaError.import(@node))
28
29
  end
@@ -1,7 +1,8 @@
1
- module Blather # :nodoc:
2
- class Stream # :nodoc:
1
+ module Blather
2
+ class Stream
3
3
 
4
- class TLS < Features # :nodoc:
4
+ # @private
5
+ class TLS < Features
5
6
  class TLSFailure < BlatherError
6
7
  register :tls_failure
7
8
  end
@@ -1,9 +1,8 @@
1
- require 'nokogiri'
1
+ module Blather
2
+ class Stream
2
3
 
3
- module Blather # :nodoc:
4
- class Stream # :nodoc:
5
-
6
- class Parser < Nokogiri::XML::SAX::Document # :nodoc:
4
+ # @private
5
+ class Parser < Nokogiri::XML::SAX::Document
7
6
  NS_TO_IGNORE = %w[jabber:client jabber:component:accept]
8
7
 
9
8
  @@debug = false
@@ -1,3 +1,4 @@
1
1
  module Blather
2
- VERSION = '0.4.16'
2
+ # Blather version number
3
+ VERSION = '0.5.0'
3
4
  end
@@ -210,14 +210,23 @@ module Blather
210
210
  self
211
211
  end
212
212
 
213
+ # The node as XML
214
+ #
215
+ # @return [String] XML representation of the node
213
216
  def inspect
214
217
  self.to_xml
215
218
  end
216
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>]
217
225
  def eql?(o, *fields)
218
226
  o.is_a?(self.class) && fields.all? { |f| self.__send__(f) == o.__send__(f) }
219
227
  end
220
228
 
229
+ # @private
221
230
  def ==(o)
222
231
  eql?(o)
223
232
  end
@@ -28,7 +28,7 @@ describe Blather::Client do
28
28
 
29
29
  it 'should have a caps handler' do
30
30
  @client.must_respond_to :caps
31
- @client.caps.must_be_kind_of Blather::Client::Caps
31
+ @client.caps.must_be_kind_of Blather::Stanza::Capabilities
32
32
  end
33
33
 
34
34
  it 'can be setup' do
@@ -61,6 +61,19 @@ describe Blather::Client do
61
61
  @client.run
62
62
  end
63
63
 
64
+ it 'knows if it is disconnected' do
65
+ @client.must_respond_to :connected?
66
+ @client.connected?.must_equal false
67
+ end
68
+
69
+ it 'knows if it is connected' do
70
+ stream = mock()
71
+ stream.expects(:stopped?).returns false
72
+ @client.setup('me.com', 'secret')
73
+ @client.post_init stream, Blather::JID.new('me.com')
74
+ @client.connected?.must_equal true
75
+ end
76
+
64
77
  it 'writes to the connection the closes when #close is called' do
65
78
  stream = mock()
66
79
  stream.expects(:close_connection_after_writing)
@@ -42,4 +42,20 @@ describe Blather::Stanza::Iq do
42
42
  Blather::Stanza::Iq.new.must_respond_to :"#{valid_type}?"
43
43
  end
44
44
  end
45
+
46
+ it 'removes the body when replying' do
47
+ iq = Blather::Stanza::Iq.new :get, 'me@example.com'
48
+ iq.from = 'them@example.com'
49
+ iq << Blather::XMPPNode.new('query', iq.document)
50
+ r = iq.reply
51
+ r.children.empty?.must_equal true
52
+ end
53
+
54
+ it 'does not remove the body when replying if we ask to keep it' do
55
+ iq = Blather::Stanza::Iq.new :get, 'me@example.com'
56
+ iq.from = 'them@example.com'
57
+ iq << Blather::XMPPNode.new('query', iq.document)
58
+ r = iq.reply :remove_children => false
59
+ r.children.empty?.must_equal false
60
+ end
45
61
  end
@@ -56,7 +56,7 @@ describe Blather::Stanza::Presence do
56
56
  s.type.must_equal :subscribe
57
57
  end
58
58
 
59
- it 'creates a Presence object when importing a node with type equal to something unkown' do
59
+ it 'creates a Presence object when importing a node with type equal to something unknown' do
60
60
  n = Blather::XMPPNode.new
61
61
  n[:type] = :foo
62
62
  s = Blather::Stanza::Presence.import(n)
@@ -62,6 +62,24 @@ describe Blather::Stanza do
62
62
  r.to.must_equal f
63
63
  end
64
64
 
65
+ it 'does not remove the body when replying' do
66
+ s = Blather::Stanza.new('message')
67
+ s.from = f = Blather::JID.new('n@d/r')
68
+ s.to = t = Blather::JID.new('d@n/r')
69
+ s << Blather::XMPPNode.new('query', s.document)
70
+ r = s.reply
71
+ r.children.empty?.must_equal false
72
+ end
73
+
74
+ it 'removes the body when replying if we ask to remove it' do
75
+ s = Blather::Stanza.new('message')
76
+ s.from = f = Blather::JID.new('n@d/r')
77
+ s.to = t = Blather::JID.new('d@n/r')
78
+ s << Blather::XMPPNode.new('query', s.document)
79
+ r = s.reply :remove_children => true
80
+ r.children.empty?.must_equal true
81
+ end
82
+
65
83
  it 'provides "attr_accessor" for id' do
66
84
  s = Blather::Stanza.new('message')
67
85
  s.id.must_be_nil
@@ -666,7 +666,7 @@ describe Blather::Stream::Client do
666
666
  end
667
667
  end
668
668
 
669
- it 'fails when an unkown node comes through during SASL negotiation' do
669
+ it 'fails when an unknown node comes through during SASL negotiation' do
670
670
  @client = mock()
671
671
  @client.expects(:receive_data).with do |n|
672
672
  n.must_be_instance_of Blather::UnknownResponse
@@ -827,7 +827,7 @@ describe Blather::Stream::Client do
827
827
  end
828
828
  end
829
829
 
830
- it 'will return an error if an unkown node comes through during resouce binding' do
830
+ it 'will return an error if an unknown node comes through during resouce binding' do
831
831
  state = nil
832
832
  @client = mock()
833
833
  @client.expects(:receive_data).with do |n|
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blather
3
3
  version: !ruby/object:Gem::Version
4
- hash: 47
5
- prerelease:
4
+ prerelease: false
6
5
  segments:
7
6
  - 0
8
- - 4
9
- - 16
10
- version: 0.4.16
7
+ - 5
8
+ - 0
9
+ version: 0.5.0
11
10
  platform: ruby
12
11
  authors:
13
12
  - Jeff Smick
@@ -15,7 +14,7 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-09-02 00:00:00 -07:00
17
+ date: 2010-09-02 00:00:00 +01:00
19
18
  default_executable:
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
@@ -26,7 +25,6 @@ dependencies:
26
25
  requirements:
27
26
  - - ~>
28
27
  - !ruby/object:Gem::Version
29
- hash: 35
30
28
  segments:
31
29
  - 0
32
30
  - 12
@@ -40,9 +38,8 @@ dependencies:
40
38
  requirement: &id002 !ruby/object:Gem::Requirement
41
39
  none: false
42
40
  requirements:
43
- - - ~>
41
+ - - ">="
44
42
  - !ruby/object:Gem::Version
45
- hash: 7
46
43
  segments:
47
44
  - 1
48
45
  - 4
@@ -54,112 +51,135 @@ dependencies:
54
51
  name: minitest
55
52
  prerelease: false
56
53
  requirement: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ segments:
59
+ - 1
60
+ - 7
61
+ - 1
62
+ version: 1.7.1
63
+ type: :runtime
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ name: activesupport
67
+ prerelease: false
68
+ requirement: &id004 !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ segments:
74
+ - 3
75
+ - 0
76
+ - 7
77
+ version: 3.0.7
78
+ type: :runtime
79
+ version_requirements: *id004
80
+ - !ruby/object:Gem::Dependency
81
+ name: minitest
82
+ prerelease: false
83
+ requirement: &id005 !ruby/object:Gem::Requirement
57
84
  none: false
58
85
  requirements:
59
86
  - - ~>
60
87
  - !ruby/object:Gem::Version
61
- hash: 9
62
88
  segments:
63
89
  - 1
64
90
  - 7
65
91
  - 1
66
92
  version: 1.7.1
67
93
  type: :development
68
- version_requirements: *id003
94
+ version_requirements: *id005
69
95
  - !ruby/object:Gem::Dependency
70
96
  name: mocha
71
97
  prerelease: false
72
- requirement: &id004 !ruby/object:Gem::Requirement
98
+ requirement: &id006 !ruby/object:Gem::Requirement
73
99
  none: false
74
100
  requirements:
75
101
  - - ~>
76
102
  - !ruby/object:Gem::Version
77
- hash: 35
78
103
  segments:
79
104
  - 0
80
105
  - 9
81
106
  - 12
82
107
  version: 0.9.12
83
108
  type: :development
84
- version_requirements: *id004
109
+ version_requirements: *id006
85
110
  - !ruby/object:Gem::Dependency
86
111
  name: bundler
87
112
  prerelease: false
88
- requirement: &id005 !ruby/object:Gem::Requirement
113
+ requirement: &id007 !ruby/object:Gem::Requirement
89
114
  none: false
90
115
  requirements:
91
116
  - - ~>
92
117
  - !ruby/object:Gem::Version
93
- hash: 23
94
118
  segments:
95
119
  - 1
96
120
  - 0
97
121
  - 0
98
122
  version: 1.0.0
99
123
  type: :development
100
- version_requirements: *id005
124
+ version_requirements: *id007
101
125
  - !ruby/object:Gem::Dependency
102
126
  name: rcov
103
127
  prerelease: false
104
- requirement: &id006 !ruby/object:Gem::Requirement
128
+ requirement: &id008 !ruby/object:Gem::Requirement
105
129
  none: false
106
130
  requirements:
107
131
  - - ~>
108
132
  - !ruby/object:Gem::Version
109
- hash: 41
110
133
  segments:
111
134
  - 0
112
135
  - 9
113
136
  - 9
114
137
  version: 0.9.9
115
138
  type: :development
116
- version_requirements: *id006
139
+ version_requirements: *id008
117
140
  - !ruby/object:Gem::Dependency
118
141
  name: yard
119
142
  prerelease: false
120
- requirement: &id007 !ruby/object:Gem::Requirement
143
+ requirement: &id009 !ruby/object:Gem::Requirement
121
144
  none: false
122
145
  requirements:
123
146
  - - ~>
124
147
  - !ruby/object:Gem::Version
125
- hash: 5
126
148
  segments:
127
149
  - 0
128
150
  - 6
129
151
  - 1
130
152
  version: 0.6.1
131
153
  type: :development
132
- version_requirements: *id007
154
+ version_requirements: *id009
133
155
  - !ruby/object:Gem::Dependency
134
156
  name: bluecloth
135
157
  prerelease: false
136
- requirement: &id008 !ruby/object:Gem::Requirement
158
+ requirement: &id010 !ruby/object:Gem::Requirement
137
159
  none: false
138
160
  requirements:
139
161
  - - ~>
140
162
  - !ruby/object:Gem::Version
141
- hash: 11
142
163
  segments:
143
164
  - 2
144
165
  - 1
145
166
  - 0
146
167
  version: 2.1.0
147
168
  type: :development
148
- version_requirements: *id008
169
+ version_requirements: *id010
149
170
  - !ruby/object:Gem::Dependency
150
171
  name: rake
151
172
  prerelease: false
152
- requirement: &id009 !ruby/object:Gem::Requirement
173
+ requirement: &id011 !ruby/object:Gem::Requirement
153
174
  none: false
154
175
  requirements:
155
176
  - - ">="
156
177
  - !ruby/object:Gem::Version
157
- hash: 3
158
178
  segments:
159
179
  - 0
160
180
  version: "0"
161
181
  type: :development
162
- version_requirements: *id009
182
+ version_requirements: *id011
163
183
  description: An XMPP DSL for Ruby written on top of EventMachine and Nokogiri
164
184
  email: sprsquish@gmail.com
165
185
  executables: []
@@ -171,10 +191,10 @@ extra_rdoc_files:
171
191
  - README.md
172
192
  files:
173
193
  - .autotest
194
+ - .gemtest
174
195
  - .gitignore
175
196
  - CHANGELOG
176
197
  - Gemfile
177
- - Gemfile.lock
178
198
  - LICENSE
179
199
  - README.md
180
200
  - Rakefile
@@ -193,8 +213,6 @@ files:
193
213
  - lib/blather/client/client.rb
194
214
  - lib/blather/client/dsl.rb
195
215
  - lib/blather/client/dsl/pubsub.rb
196
- - lib/blather/core_ext/active_support.rb
197
- - lib/blather/core_ext/active_support/inheritable_attributes.rb
198
216
  - lib/blather/core_ext/eventmachine.rb
199
217
  - lib/blather/core_ext/ipaddr.rb
200
218
  - lib/blather/core_ext/nokogiri.rb
@@ -210,6 +228,7 @@ files:
210
228
  - lib/blather/roster_item.rb
211
229
  - lib/blather/stanza.rb
212
230
  - lib/blather/stanza/disco.rb
231
+ - lib/blather/stanza/disco/capabilities.rb
213
232
  - lib/blather/stanza/disco/disco_info.rb
214
233
  - lib/blather/stanza/disco/disco_items.rb
215
234
  - lib/blather/stanza/iq.rb
@@ -318,7 +337,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
318
337
  requirements:
319
338
  - - ">="
320
339
  - !ruby/object:Gem::Version
321
- hash: 3
322
340
  segments:
323
341
  - 0
324
342
  version: "0"
@@ -327,14 +345,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
327
345
  requirements:
328
346
  - - ">="
329
347
  - !ruby/object:Gem::Version
330
- hash: 3
331
348
  segments:
332
349
  - 0
333
350
  version: "0"
334
351
  requirements: []
335
352
 
336
353
  rubyforge_project:
337
- rubygems_version: 1.6.2
354
+ rubygems_version: 1.3.7
338
355
  signing_key:
339
356
  specification_version: 3
340
357
  summary: Simpler XMPP built for speed
@@ -1,45 +0,0 @@
1
- require File.join(File.dirname(__FILE__), 'active_support', 'inheritable_attributes')
2
-
3
- class Object # @private
4
- def duplicable?; true; end
5
- def blank?; respond_to?(:empty?) ? empty? : !self; end
6
- def present?; !blank?; end
7
- end
8
-
9
- class Array # @private
10
- alias_method :blank?, :empty?
11
- def extract_options!; last.is_a?(::Hash) ? pop : {}; end
12
- end
13
-
14
- class Hash # @private
15
- alias_method :blank?, :empty?
16
- end
17
-
18
- class String # @private
19
- def blank?; self !~ /\S/; end
20
- end
21
-
22
- class NilClass # @private
23
- def duplicable?; false; end
24
- def blank?; true; end
25
- end
26
-
27
- class FalseClass # @private
28
- def duplicable?; false; end
29
- def blank?; true; end
30
- end
31
-
32
- class TrueClass # @private
33
- def duplicable?; false; end
34
- def blank?; false; end
35
- end
36
-
37
- class Symbol # @private
38
- def duplicable?; false; end
39
- def to_proc; Proc.new { |*args| args.shift.__send__(self, *args) }; end
40
- end
41
-
42
- class Numeric # @private
43
- def duplicable?; false; end
44
- def blank?; false; end
45
- end