blather 0.6.2 → 0.7.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 (78) hide show
  1. data/.rspec +3 -0
  2. data/.travis.yml +1 -8
  3. data/CHANGELOG.md +230 -0
  4. data/Guardfile +4 -4
  5. data/README.md +2 -8
  6. data/Rakefile +14 -27
  7. data/blather.gemspec +8 -18
  8. data/lib/blather.rb +1 -0
  9. data/lib/blather/client/client.rb +8 -0
  10. data/lib/blather/roster.rb +7 -0
  11. data/lib/blather/stanza/iq/roster.rb +1 -1
  12. data/lib/blather/stanza/message/muc_user.rb +2 -0
  13. data/lib/blather/stanza/muc/muc_user_base.rb +4 -3
  14. data/lib/blather/stanza/presence.rb +12 -14
  15. data/lib/blather/stanza/presence/c.rb +58 -62
  16. data/lib/blather/stanza/presence/muc.rb +14 -10
  17. data/lib/blather/stanza/presence/muc_user.rb +47 -36
  18. data/lib/blather/stanza/presence/status.rb +106 -101
  19. data/lib/blather/stanza/presence/subscription.rb +59 -60
  20. data/lib/blather/stream.rb +1 -3
  21. data/lib/blather/stream/features/resource.rb +0 -1
  22. data/lib/blather/version.rb +1 -2
  23. data/lib/blather/xmpp_node.rb +24 -3
  24. data/spec/blather/client/client_spec.rb +64 -64
  25. data/spec/blather/client/dsl/pubsub_spec.rb +127 -127
  26. data/spec/blather/client/dsl_spec.rb +11 -11
  27. data/spec/blather/errors/sasl_error_spec.rb +3 -3
  28. data/spec/blather/errors/stanza_error_spec.rb +26 -26
  29. data/spec/blather/errors/stream_error_spec.rb +22 -22
  30. data/spec/blather/errors_spec.rb +7 -7
  31. data/spec/blather/file_transfer_spec.rb +16 -18
  32. data/spec/blather/jid_spec.rb +29 -29
  33. data/spec/blather/roster_item_spec.rb +18 -18
  34. data/spec/blather/roster_spec.rb +18 -18
  35. data/spec/blather/stanza/discos/disco_info_spec.rb +56 -57
  36. data/spec/blather/stanza/discos/disco_items_spec.rb +33 -33
  37. data/spec/blather/stanza/iq/command_spec.rb +57 -57
  38. data/spec/blather/stanza/iq/ibb_spec.rb +27 -39
  39. data/spec/blather/stanza/iq/ping_spec.rb +13 -9
  40. data/spec/blather/stanza/iq/query_spec.rb +16 -16
  41. data/spec/blather/stanza/iq/roster_spec.rb +29 -30
  42. data/spec/blather/stanza/iq/s5b_spec.rb +10 -13
  43. data/spec/blather/stanza/iq/si_spec.rb +20 -23
  44. data/spec/blather/stanza/iq/vcard_spec.rb +22 -25
  45. data/spec/blather/stanza/iq_spec.rb +12 -12
  46. data/spec/blather/stanza/message/muc_user_spec.rb +36 -36
  47. data/spec/blather/stanza/message_spec.rb +56 -56
  48. data/spec/blather/stanza/presence/c_spec.rb +17 -7
  49. data/spec/blather/stanza/presence/muc_spec.rb +8 -8
  50. data/spec/blather/stanza/presence/muc_user_spec.rb +23 -23
  51. data/spec/blather/stanza/presence/status_spec.rb +42 -30
  52. data/spec/blather/stanza/presence/subscription_spec.rb +22 -23
  53. data/spec/blather/stanza/presence_spec.rb +72 -34
  54. data/spec/blather/stanza/pubsub/affiliations_spec.rb +12 -12
  55. data/spec/blather/stanza/pubsub/create_spec.rb +10 -10
  56. data/spec/blather/stanza/pubsub/event_spec.rb +31 -31
  57. data/spec/blather/stanza/pubsub/items_spec.rb +21 -21
  58. data/spec/blather/stanza/pubsub/publish_spec.rb +21 -21
  59. data/spec/blather/stanza/pubsub/retract_spec.rb +20 -20
  60. data/spec/blather/stanza/pubsub/subscribe_spec.rb +17 -17
  61. data/spec/blather/stanza/pubsub/subscription_spec.rb +28 -28
  62. data/spec/blather/stanza/pubsub/subscriptions_spec.rb +11 -11
  63. data/spec/blather/stanza/pubsub/unsubscribe_spec.rb +22 -22
  64. data/spec/blather/stanza/pubsub_owner/delete_spec.rb +9 -9
  65. data/spec/blather/stanza/pubsub_owner/purge_spec.rb +9 -9
  66. data/spec/blather/stanza/pubsub_owner_spec.rb +6 -6
  67. data/spec/blather/stanza/pubsub_spec.rb +16 -16
  68. data/spec/blather/stanza/x_spec.rb +53 -53
  69. data/spec/blather/stanza_spec.rb +39 -39
  70. data/spec/blather/stream/client_spec.rb +133 -133
  71. data/spec/blather/stream/component_spec.rb +7 -7
  72. data/spec/blather/stream/parser_spec.rb +24 -24
  73. data/spec/blather/stream/ssl_spec.rb +7 -7
  74. data/spec/blather/xmpp_node_spec.rb +17 -7
  75. data/spec/blather_spec.rb +4 -4
  76. data/spec/spec_helper.rb +6 -54
  77. metadata +53 -68
  78. data/CHANGELOG +0 -220
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --colour
3
+ --tty
data/.travis.yml CHANGED
@@ -1,15 +1,8 @@
1
1
  rvm:
2
- - 1.8.7
3
- - ree
4
2
  - 1.9.2
5
3
  - 1.9.3
6
4
  - jruby-18mode
7
5
  - jruby-19mode
8
6
  - rbx-18mode
9
7
  - rbx-19mode
10
- - jruby
11
-
12
- branches:
13
- only:
14
- - master
15
- - develop
8
+ - ruby-head
data/CHANGELOG.md ADDED
@@ -0,0 +1,230 @@
1
+ # develop
2
+
3
+ # v0.7.0
4
+ * Change(benlangfeld): Drop Ruby 1.8.7 compatability
5
+ * Change(bklang): Remove the wire log, which duplicated the parsed logging
6
+ * Feature(benlangfeld): Stanza handlers are now executed outside of the EM reactor, so it is not blocked on stanza processing
7
+ * Bugfix(benlangfeld): MUC user presence and messages now have separate handler names
8
+ * Feature(benlangfeld): Stanzas may now be imported from a string using `XMPPNode.parse`
9
+ * Bugfix(benlangfeld): All `Blather::Stanza::Presence::C` attributes are now accessible on importing
10
+ * Bugfix(benlangfeld): Presence stanzas are now composed on import, including all children
11
+ * Bugfix(mtrudel): JIDs in roster item stanzas are now stripped of resources
12
+
13
+ # v0.6.2
14
+ * Feature(benlangfeld): Add password support to MUCUser
15
+ * Feature(benlangfeld): Add support for invitation elements to MUCUser messages
16
+ * Feature(benlangfeld): Add support for MUC invite declines
17
+ * Bugfix(benlangfeld): Don't implicitly create an invite node when checking invite status
18
+ * Bugfix(benlangfeld): Ensure that form nodes are not duplicated on muc/muc_user presence stanzas
19
+
20
+ # v0.6.1
21
+ * Bugfix(benlangfeld): Ensure MUC presence nodes (joining) have a form element on creation
22
+
23
+ # v0.6.0
24
+ * Feature(benlangfeld): Very basic MUC and delayed message support
25
+ * Bugfix(theozaurus): Disable connection timeout timer if client deliberately disconnects
26
+ * Bugfix(mtrudel): Fix Roster#each to return roster_items as per documentation
27
+
28
+ # v0.5.12
29
+ * Bugfix(benlangfeld): Allow specifying the connection timeout in DSL setup
30
+
31
+ # v0.5.11
32
+ * Feature(benlangfeld): Allow specifying a connection timeout
33
+ * Raise Blather::Stream::ConnectionTimeout if timeout is exceeded
34
+ * Default to 180 seconds
35
+
36
+ # v0.5.10
37
+ * Feature(juandebravo): Allow configuring the wire log level
38
+ * Bugfix(benlangfeld): Checking connection status before the stream is established
39
+
40
+ # v0.5.9
41
+ * Bugfix(benlangfeld): Failed connections now raise a Blather::Stream::ConnectionFailed exception
42
+ * Bugfix(crohr): Blather now supports EventMachine 1.0
43
+
44
+ # v0.5.8
45
+ * Bugfix(benlangfeld): JIDs now maintain case, but still compare case insensitively
46
+ * Bugfix(jmazzi): Development dependencies now resolve correctly on JRuby and Rubinius
47
+
48
+ # v0.5.7
49
+ * Bugfix(benlangfeld): Don't install BlueCloth as a development dependency when on JRuby
50
+
51
+ # v0.5.6
52
+ * Changes from 0.5.5, this time without a bug when using the namespaced DSL approach
53
+
54
+ # v0.5.5 (yanked)
55
+ * Bugfix(benlangfeld/kibs): ActiveSupport was overriding the presence DSL method
56
+ * Feature(fyafighter): Adds SSL peer verification to TLS
57
+
58
+ # v0.5.4
59
+ * Bugfix(fyafighter): Regression related to earlier refactoring: https://github.com/sprsquish/blather/issues/53
60
+ * Feature(fyafighter): Make it much easier to allow private network addresses
61
+ * Bugfix(benlangfeld): Fix the Nokogiri dependency to the 1.4.x series, due to a bug in 1.5.x
62
+ * Bugfix(zlu): Replace class_inheritable_attribute with class_attribute because it is deprecated in ActiveSupport 3.1
63
+
64
+ # v0.5.3
65
+ * Feature(benlangfeld): Add XMPP Ping (XEP-0199) support
66
+
67
+ # v0.5.2
68
+ * Bugfix(benlangfeld): Remove specs for the Nokogiri extensions which were moved out
69
+
70
+ # v0.5.1 - yanked
71
+ * Feature(benlangfeld): Abstract out Nokogiri extensions and helpers into new Niceogiri gem for better sharing
72
+ * Documentation(benlangfeld)
73
+
74
+ # v0.5.0
75
+ * Feature(radsaq): Add a #connected? method on Blather::Client
76
+ * Feature(benlangfeld)[API change]: Allow the removal of child nodes from an IQ reply
77
+ * Bugfix(zlu): Use rubygems properly in examples
78
+ * Bugfix(benlangfeld): Remove code borrowed from ActiveSupport and instead depend on it to avoid version conflicts
79
+ * Documentation(sprsquish)
80
+
81
+ # v0.4.16
82
+ * Feature(benlangfeld): switch from jeweler to bundler
83
+ * Feature(benlangfeld): add cap support (XEP-0115)
84
+ * Bugfix(sprsquish): Better equality checking
85
+ * Bugfix(sprsquish): Fix #to_proc
86
+ * Bugfix(mironov): Skip private IPs by default
87
+
88
+ # v0.4.15
89
+ * Feature(mironov): Implement XEP-0054: vcard-temp
90
+ * Feature(benlangfeld): Basic support for PubSub subscription notifications as PubSub events
91
+ * Feature(mironov): Ability to clear handlers
92
+ * Feature(mironov): Implement incoming file transfers (XEP-0096, XEP-0065, XEP-0047)
93
+ * Bugfix(mironov): Fix for importing messages with chat states
94
+ * Bugfix(mironov): Added Symbol#to_proc method to work on ruby 1.8.6
95
+ * Bugfix(mironov): Fix roster items .status method to return highest priority presence
96
+ * Bugfix(mironov): Remove old unavailable presences while adding new one
97
+ * Bugfix(mironov): Use Nokogiri::XML::ParseOptions::NOENT to prevent double-encoding of entities
98
+ * Bugfix(benlangfeld): Disco Info Identities should have an xml:lang attribute
99
+ * Bugfix(mironov): Fix lookup path for ruby 1.9
100
+ * Bugfix(mironov): stanza_error.to_node must set type of the error
101
+ * Bugfix(mironov): Allow message to have iq child
102
+ * Bugfix(mironov): Find xhtml body in messages sent from iChat 5.0.3
103
+
104
+ # v0.4.14
105
+ * Tests: get specs fully passing on rubinius
106
+ * Feature(mironov): Implement XEP-0085 Chat State Notifications
107
+ * Bugfix(mironov): send stanzas unformatted
108
+ * Bugfix(mironov): Message#xhtml uses inner_html so tags aren't escaped
109
+ * Bugfix(mironov): Message#xhtml= now works with multiple root nodes
110
+
111
+ # v0.4.13
112
+ * Bugfix: Place form child of command inside command element
113
+
114
+ # v0.4.12
115
+ * API Change: Switch order of var and type arguments to X::Field.new since var is always required but type is not
116
+ * API Change: PubSub payloads can be strings or nodes and can be set nil. PubSub#payload will always return a string
117
+ * Feature: Add forms to Message stanzas
118
+
119
+ # v0.4.11
120
+ * Bugfix: command nodes where generating the wrong xml
121
+ * Bugfix: x nodes where generating the wrong xml
122
+ * Feature: ability to set identities and features on disco info nodes
123
+ * Feature: ability to set items on disco item nodes
124
+
125
+ # v0.4.10
126
+ * no change
127
+
128
+ # v0.4.9
129
+ * Feature: XEP-0004 x:data (benlangfeld)
130
+ * Feature: XEP-0050 Ad-Hoc commands (benlangfeld)
131
+ * Minor bugfixes for the specs
132
+
133
+ # v0.4.8
134
+ * Feature: add xhtml getter/setter to Message stanza
135
+ * Bugfix: heirarchy -> hierarchy spelling mistake
136
+ * Hella documentation
137
+
138
+ # v0.4.7
139
+ * Update to work with Nokogiri 1.4.0
140
+
141
+ # v0.4.6
142
+ * Bugfix: prioritize authentication mechanisms
143
+
144
+ # v0.4.5
145
+ * Bugfix: Change DSL#write to DSL#write_to_stream. Previous way was messing with YAML
146
+
147
+ # v0.4.4
148
+ * Add "disconnected" handler type to handle connection termination
149
+ * Bugfix: Fix error with pubsub using the wrong client connection
150
+
151
+ # v0.4.3
152
+ * Bugfix: status stanza with a blank state will be considered :available (GH-23)
153
+ * Bugfix: ensure regexp guards try to match against a string (GH-24)
154
+ * Stream creation is now evented. The stream object will be sent to #post_init
155
+ * Parser debugging disabled by default
156
+ * Update parser to work with Nokogiri 1.3.2
157
+ * Bugfix: discover helper now calls the correct method on client
158
+ * Bugfix: ensure XMPPNode#inherit properly sets namespaces on inherited nodes
159
+ * Bugfix: xpath guards with namespaces work properly (GH-25)
160
+
161
+ # v0.4.2
162
+ * Fix -D option to actually put Blather in debug mode
163
+ * Stanzas over a client connection will either have the full JID or no JID
164
+ * Regexp guards can be anything that implements #last_match (Regexp or Oniguruma)
165
+ * Add "halt" and "pass" to allow handlers to either halt the handler chain or pass to the next handler
166
+ * Fix default status handler so it doesn't eat the stanza
167
+ * Add before and after filters. Filters, like handlers, can have guards.
168
+
169
+ # v0.4.1
170
+ * Bugfix in roster: trying to call the wrong method on client
171
+
172
+ # v0.4.0
173
+ * Switch from LibXML-Ruby to Nokogiri
174
+ * Update test suite to run on Ruby 1.9
175
+ * Add "<<" style writer to the DSL to provide for chaining outbound writes
176
+ * SRV lookup support
177
+ * Add XPath type of handler guard
178
+ * PubSub support
179
+
180
+ # v0.3.4
181
+ * Remove unneeded functions from the push parser.
182
+ * Create a ParseWarning error that doesn't kill the stream.
183
+ * When a parse error comes in the reply should let the other side know it screwed up before dying.
184
+ * Add the LibXML::XML::Error node to the ParseError/ParseWarning objects.
185
+
186
+ # v0.3.3
187
+ * Fix the load error related to not pushing Blather's dir into the load path
188
+
189
+ # v0.3.2
190
+ * Switch the push parser from chunking to streaming.
191
+ * Don't push Blather's dir into the load paths
192
+
193
+ # v0.3.1
194
+ * Small changes to the DSL due to handler collisions:
195
+ "status" -> "set_status"
196
+ "roster" -> "my_roster"
197
+ * Small changes to the Blather::Client API to keep it feeling more like EM's API:
198
+ #stream_started -> #post_init
199
+ #call -> #receive_data
200
+ #stop -> #close
201
+ #stopped -> #unbind
202
+ * Refactored some of the code internal to Blather::Client
203
+ * Added command line option handler to default use method (see README)
204
+ * require libxml-ruby >=1.1.2 (1.1.3 has an inconsistent malloc err on OS X 10.5)
205
+ * complete specs
206
+ * add single process ping-pong example
207
+
208
+ # v0.3.0
209
+ * Remove autotest discover.rb (created all sorts of conflicts)
210
+ * Added Hash with Array guard
211
+ * Added a hirrarchy printer to examples directory
212
+ * Moved Disco to be in the Stanza namespace (staves off deeply namespaced classes)
213
+ * Namespaced the DSL methods to Blather::DSL. These can be included in any object you like now. "require 'blather/client'" will still include them directly in Kernel to keep the simple one-file dsl
214
+ * Stopped doing one class per error type. This created a giant hierarchy tree that was just unnecessary. The error name is now #name. Errors can be matched with a combination of handler and guard.
215
+ * Fixed XML namespaces. Previous versions weren't actually adding the node to the namespace making xpath queries inconsistent at best.
216
+ * Added support for anonymous authentication by providing a blank node on the jid ("@[host]")
217
+
218
+ # v0.2.3
219
+ * Go back to using the master branch for gems (stupid mistake)
220
+
221
+ # v0.2.2
222
+ * Switch to Jeweler.
223
+ * Move from custom libxml to just a custom push parser
224
+ * Add guards to handlers
225
+
226
+ # v0.2.1 Upgrade to libxml 0.9.7
227
+
228
+ # v0.2 Overhaul the DSL to look more like Sinatra
229
+
230
+ # v0.1 Initial release (birth!)
data/Guardfile CHANGED
@@ -1,5 +1,5 @@
1
- guard 'minitest' do
2
- watch(%r|^spec/(.*)_spec\.rb|)
3
- watch(%r|^lib/(.*)\.rb|) { |m| "spec/#{m[1]}_spec.rb" }
4
- watch(%r|^spec/spec_helper\.rb|) { "spec" }
1
+ guard 'rspec', :version => 2, :cli => '--format documentation' do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec/" }
5
5
  end
data/README.md CHANGED
@@ -162,14 +162,8 @@ than a change set made directly on master.
162
162
 
163
163
  # Author
164
164
 
165
- [Jeff Smick](http://github.com/sprsquish)
166
-
167
- ### Contributors
168
-
169
- * [Nolan Darilek](http://github.com/thewordnerd)
170
- * [Tim Carey-Smith](http://github.com/halorgium)
171
- * [Ben Langfeld](http://github.com/benlangfeld)
172
- * [Anton Mironov](http://github.com/mironov)
165
+ * [Jeff Smick](http://github.com/sprsquish)
166
+ * [Other Contributors](https://github.com/sprsquish/blather/contributors)
173
167
 
174
168
  # Copyright
175
169
 
data/Rakefile CHANGED
@@ -1,33 +1,20 @@
1
- require 'rubygems'
2
- require 'rake'
1
+ # -*- ruby -*-
2
+ ENV['RUBY_FLAGS'] = "-I#{%w(lib ext bin spec).join(File::PATH_SEPARATOR)}"
3
3
 
4
- require 'bundler'
5
- Bundler::GemHelper.install_tasks
4
+ require 'rubygems'
5
+ require 'bundler/gem_tasks'
6
+ require 'bundler/setup'
6
7
 
7
- require 'rake/testtask'
8
- Rake::TestTask.new(:test) do |test|
9
- test.libs << 'spec'
10
- test.pattern = 'spec/**/*_spec.rb'
11
- test.verbose = true
12
- end
8
+ task :default => :spec
9
+ task :test => :spec
13
10
 
14
- begin
15
- require 'rcov/rcovtask'
16
- Rcov::RcovTask.new do |test|
17
- test.libs << 'spec'
18
- test.pattern = 'spec/**/*_spec.rb'
19
- test.rcov_opts += ['--exclude \/Library\/Ruby,spec\/', '--xrefs']
20
- test.verbose = true
21
- end
11
+ require 'rspec/core/rake_task'
12
+ RSpec::Core::RakeTask.new
22
13
 
23
- require 'yard'
24
- YARD::Tags::Library.define_tag 'Blather handler', :handler, :with_name
25
- YARD::Templates::Engine.register_template_path 'yard/templates'
14
+ require 'yard'
15
+ YARD::Tags::Library.define_tag 'Blather handler', :handler, :with_name
16
+ YARD::Templates::Engine.register_template_path 'yard/templates'
26
17
 
27
- YARD::Rake::YardocTask.new(:doc) do |t|
28
- t.options = ['--no-private', '-m', 'markdown', '-o', './doc/public/yard']
29
- end
30
- rescue LoadError
18
+ YARD::Rake::YardocTask.new(:doc) do |t|
19
+ t.options = ['--no-private', '-m', 'markdown', '-o', './doc/public/yard']
31
20
  end
32
-
33
- task :default => :test
data/blather.gemspec CHANGED
@@ -35,26 +35,16 @@ Gem::Specification.new do |s|
35
35
 
36
36
  s.add_dependency "eventmachine", [">= 0.12.6"]
37
37
  s.add_dependency "nokogiri", ["~> 1.4.0"]
38
- s.add_dependency "niceogiri", [">= 0.1.0"]
38
+ s.add_dependency "niceogiri", ["~> 1.0.0"]
39
39
  s.add_dependency "activesupport", [">= 3.0.7"]
40
+ s.add_dependency "girl_friday"
40
41
 
41
- s.add_development_dependency "minitest", ["~> 1.7.1"]
42
+ s.add_development_dependency "bundler", ["~> 1.0"]
43
+ s.add_development_dependency "rake"
44
+ s.add_development_dependency "rspec", ["~> 2.7"]
42
45
  s.add_development_dependency "mocha", ["~> 0.9.12"]
43
- s.add_development_dependency "bundler", ["~> 1.0.0"]
44
- unless rbx?
45
- s.add_development_dependency "rcov", ["~> 0.9.9"]
46
- s.add_development_dependency "yard", ["~> 0.6.1"]
47
- end
46
+ s.add_development_dependency "guard-rspec"
47
+ s.add_development_dependency "yard", ["~> 0.6.1"]
48
48
  s.add_development_dependency "jruby-openssl", ["~> 0.7.4"] if jruby?
49
- s.add_development_dependency "rake"
50
- s.add_development_dependency "guard-minitest"
51
-
52
- unless jruby? || rbx?
53
- s.add_development_dependency 'bluecloth'
54
- end
55
-
56
- if RUBY_PLATFORM =~ /darwin/ && !rbx?
57
- s.add_development_dependency 'growl_notify'
58
- s.add_development_dependency 'rb-fsevent'
59
- end
49
+ s.add_development_dependency "bluecloth" unless jruby? || rbx?
60
50
  end
data/lib/blather.rb CHANGED
@@ -8,6 +8,7 @@
8
8
  digest/sha1
9
9
  logger
10
10
  openssl
11
+ girl_friday
11
12
 
12
13
  active_support/core_ext/class/attribute
13
14
  active_support/core_ext/object/blank
@@ -59,6 +59,10 @@ module Blather
59
59
  @roster = Roster.new self
60
60
  @caps = Stanza::Capabilities.new
61
61
 
62
+ @handler_queue = GirlFriday::WorkQueue.new :handle_stanza, :size => 5 do |stanza|
63
+ handle_data stanza
64
+ end
65
+
62
66
  setup_initial_handlers
63
67
  end
64
68
 
@@ -181,6 +185,10 @@ module Blather
181
185
 
182
186
  # @private
183
187
  def receive_data(stanza)
188
+ @handler_queue << stanza
189
+ end
190
+
191
+ def handle_data(stanza)
184
192
  catch(:halt) do
185
193
  run_filters :before, stanza
186
194
  handle_stanza stanza
@@ -86,6 +86,13 @@ module Blather
86
86
  @items.dup
87
87
  end
88
88
 
89
+ # Number of items in the roster
90
+ #
91
+ # @return [Integer] the number of items in the roster
92
+ def length
93
+ @items.length
94
+ end
95
+
89
96
  # A hash of items keyed by group
90
97
  #
91
98
  # @return [Hash<group => Array<RosterItem>>]
@@ -99,7 +99,7 @@ class Iq
99
99
  #
100
100
  # @param [Blather::JID, String, nil] jid the new JID
101
101
  def jid=(jid)
102
- write_attr :jid, jid
102
+ write_attr :jid, (jid.nil?) ? nil : JID.new(jid).stripped
103
103
  end
104
104
 
105
105
  # Get the item name
@@ -7,6 +7,8 @@ class Message
7
7
  class MUCUser < Message
8
8
  include Blather::Stanza::MUC::MUCUserBase
9
9
 
10
+ register :muc_user_message, :x, "http://jabber.org/protocol/muc#user"
11
+
10
12
  def self.new(to = nil, body = nil, type = :normal)
11
13
  super
12
14
  end
@@ -3,9 +3,10 @@ class Stanza
3
3
  class MUC
4
4
 
5
5
  module MUCUserBase
6
+ MUC_USER_NAMESPACE = "http://jabber.org/protocol/muc#user"
7
+
6
8
  def self.included(klass)
7
9
  klass.extend ClassMethods
8
- klass.register :muc_user, :x, "http://jabber.org/protocol/muc#user"
9
10
  end
10
11
 
11
12
  module ClassMethods
@@ -29,7 +30,7 @@ class MUC
29
30
  end
30
31
 
31
32
  def muc_user
32
- unless muc_user = find_first('ns:x', :ns => self.class.registered_ns)
33
+ unless muc_user = find_first('ns:x', :ns => MUC_USER_NAMESPACE)
33
34
  self << (muc_user = XMPPNode.new('x', self.document))
34
35
  muc_user.namespace = self.class.registered_ns
35
36
  end
@@ -44,7 +45,7 @@ class MUC
44
45
  end
45
46
 
46
47
  def find_password_node
47
- muc_user.find_first 'ns:password', :ns => self.class.registered_ns
48
+ muc_user.find_first 'ns:password', :ns => MUC_USER_NAMESPACE
48
49
  end
49
50
  end # MUCUserBase
50
51