vines 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. data/README +1 -1
  2. data/Rakefile +10 -10
  3. data/conf/certs/ca-bundle.crt +112 -378
  4. data/conf/config.rb +18 -9
  5. data/lib/vines.rb +8 -1
  6. data/lib/vines/command/cert.rb +2 -1
  7. data/lib/vines/command/init.rb +11 -0
  8. data/lib/vines/command/ldap.rb +6 -3
  9. data/lib/vines/command/schema.rb +1 -1
  10. data/lib/vines/config.rb +57 -146
  11. data/lib/vines/config/host.rb +85 -0
  12. data/lib/vines/config/port.rb +111 -0
  13. data/lib/vines/contact.rb +1 -1
  14. data/lib/vines/jid.rb +26 -4
  15. data/lib/vines/kit.rb +6 -0
  16. data/lib/vines/log.rb +24 -0
  17. data/lib/vines/router.rb +70 -38
  18. data/lib/vines/stanza.rb +45 -8
  19. data/lib/vines/stanza/iq.rb +3 -3
  20. data/lib/vines/stanza/iq/disco_info.rb +5 -1
  21. data/lib/vines/stanza/iq/disco_items.rb +3 -0
  22. data/lib/vines/stanza/iq/private_storage.rb +9 -5
  23. data/lib/vines/stanza/iq/roster.rb +11 -12
  24. data/lib/vines/stanza/iq/vcard.rb +4 -4
  25. data/lib/vines/stanza/iq/version.rb +25 -0
  26. data/lib/vines/stanza/message.rb +4 -5
  27. data/lib/vines/stanza/presence.rb +20 -18
  28. data/lib/vines/stanza/presence/probe.rb +3 -4
  29. data/lib/vines/stanza/presence/subscribe.rb +4 -3
  30. data/lib/vines/stanza/presence/subscribed.rb +6 -5
  31. data/lib/vines/stanza/presence/unsubscribe.rb +4 -4
  32. data/lib/vines/stanza/presence/unsubscribed.rb +4 -3
  33. data/lib/vines/storage/couchdb.rb +3 -3
  34. data/lib/vines/storage/ldap.rb +19 -8
  35. data/lib/vines/storage/local.rb +23 -12
  36. data/lib/vines/storage/redis.rb +3 -3
  37. data/lib/vines/storage/sql.rb +5 -5
  38. data/lib/vines/stream.rb +40 -6
  39. data/lib/vines/stream/client.rb +5 -6
  40. data/lib/vines/stream/client/auth.rb +3 -2
  41. data/lib/vines/stream/client/bind.rb +2 -2
  42. data/lib/vines/stream/client/bind_restart.rb +1 -2
  43. data/lib/vines/stream/client/ready.rb +2 -0
  44. data/lib/vines/stream/client/session.rb +13 -4
  45. data/lib/vines/stream/client/tls.rb +1 -0
  46. data/lib/vines/stream/component.rb +6 -5
  47. data/lib/vines/stream/component/ready.rb +5 -6
  48. data/lib/vines/stream/http.rb +10 -4
  49. data/lib/vines/stream/http/request.rb +23 -2
  50. data/lib/vines/stream/server.rb +13 -11
  51. data/lib/vines/stream/server/outbound/auth_result.rb +1 -0
  52. data/lib/vines/stream/server/outbound/tls_result.rb +1 -0
  53. data/lib/vines/stream/server/ready.rb +2 -2
  54. data/lib/vines/user.rb +2 -1
  55. data/lib/vines/version.rb +1 -1
  56. data/test/config/host_test.rb +292 -0
  57. data/test/config_test.rb +244 -103
  58. data/test/contact_test.rb +7 -1
  59. data/test/jid_test.rb +48 -0
  60. data/test/router_test.rb +16 -47
  61. data/test/stanza/iq/disco_info_test.rb +76 -0
  62. data/test/stanza/iq/disco_items_test.rb +47 -0
  63. data/test/stanza/iq/private_storage_test.rb +33 -10
  64. data/test/stanza/iq/roster_test.rb +15 -5
  65. data/test/stanza/iq/vcard_test.rb +8 -25
  66. data/test/stanza/iq/version_test.rb +62 -0
  67. data/test/stanza/iq_test.rb +13 -10
  68. data/test/stanza/message_test.rb +16 -24
  69. data/test/stanza/presence/probe_test.rb +52 -0
  70. data/test/stanza/presence/subscribe_test.rb +1 -5
  71. data/test/stanza_test.rb +77 -0
  72. data/test/stream/client/auth_test.rb +1 -0
  73. data/test/stream/client/ready_test.rb +2 -0
  74. data/test/stream/client/session_test.rb +7 -2
  75. data/test/stream/component/ready_test.rb +19 -36
  76. data/test/stream/http/request_test.rb +22 -2
  77. data/test/stream/server/ready_test.rb +14 -21
  78. data/web/404.html +9 -3
  79. data/web/chat/index.html +2 -2
  80. data/web/chat/javascripts/app.js +1 -1
  81. data/web/chat/stylesheets/chat.css +4 -9
  82. data/web/lib/coffeescripts/layout.coffee +2 -2
  83. data/web/{chat → lib}/coffeescripts/logout.coffee +0 -0
  84. data/web/lib/coffeescripts/notification.coffee +14 -0
  85. data/web/lib/coffeescripts/session.coffee +28 -24
  86. data/web/lib/coffeescripts/transfer.coffee +37 -34
  87. data/web/lib/javascripts/base.js +8 -8
  88. data/web/lib/javascripts/icons.js +3 -0
  89. data/web/lib/javascripts/jquery.js +4 -18
  90. data/web/lib/javascripts/layout.js +2 -2
  91. data/web/{chat → lib}/javascripts/logout.js +0 -0
  92. data/web/lib/javascripts/notification.js +26 -0
  93. data/web/lib/javascripts/session.js +20 -16
  94. data/web/lib/javascripts/transfer.js +45 -55
  95. data/web/lib/stylesheets/base.css +45 -9
  96. metadata +31 -15
@@ -16,10 +16,10 @@ Transfer = (function() {
16
16
  this.sent = 0;
17
17
  }
18
18
  Transfer.prototype.start = function() {
19
- var callback, node;
19
+ var node;
20
20
  node = $("<iq id=\"" + (this.session.uniqueId()) + "\" to=\"" + this.to + "\" type=\"set\">\n <si xmlns=\"http://jabber.org/protocol/si\" id=\"" + (this.session.uniqueId()) + "\" profile=\"http://jabber.org/protocol/si/profile/file-transfer\">\n <file xmlns=\"http://jabber.org/protocol/si/profile/file-transfer\" name=\"\" size=\"" + this.file.size + "\"/>\n <feature xmlns=\"http://jabber.org/protocol/feature-neg\">\n <x xmlns=\"jabber:x:data\" type=\"form\">\n <field var=\"stream-method\" type=\"list-single\">\n <option><value>http://jabber.org/protocol/ibb</value></option>\n </field>\n </x>\n </feature>\n </si>\n</iq>");
21
21
  $('file', node).attr('name', this.file.name);
22
- callback = __bind(function(result) {
22
+ return this.session.sendIQ(node.get(0), __bind(function(result) {
23
23
  var m, methods, ok;
24
24
  methods = $('si feature x field[var="stream-method"] value', result);
25
25
  ok = ((function() {
@@ -36,45 +36,42 @@ Transfer = (function() {
36
36
  if (ok) {
37
37
  return this.open();
38
38
  }
39
- }, this);
40
- return this.session.sendIQ(node.get(0), callback);
39
+ }, this));
41
40
  };
42
41
  Transfer.prototype.open = function() {
43
- var callback, node;
42
+ var node;
44
43
  node = $("<iq id=\"" + (this.session.uniqueId()) + "\" to=\"" + this.to + "\" type=\"set\">\n <open xmlns=\"http://jabber.org/protocol/ibb\" sid=\"" + this.sid + "\" block-size=\"4096\"/>\n</iq>");
45
- callback = __bind(function(result) {
44
+ return this.session.sendIQ(node.get(0), __bind(function(result) {
46
45
  if (this.ok(result)) {
47
46
  this.opened = true;
48
- return this.chunks.start(__bind(function() {
49
- return this.sendChunk();
50
- }, this));
47
+ return this.sendChunk();
51
48
  }
52
- }, this);
53
- return this.session.sendIQ(node.get(0), callback);
49
+ }, this));
54
50
  };
55
51
  Transfer.prototype.sendChunk = function() {
56
- var callback, chunk, node;
57
52
  if (this.closed) {
58
53
  return;
59
54
  }
60
- if (!(chunk = this.chunks.chunk())) {
61
- this.close();
62
- return;
63
- }
64
- node = $("<iq id=\"" + (this.session.uniqueId()) + "\" to=\"" + this.to + "\" type=\"set\">\n <data xmlns=\"http://jabber.org/protocol/ibb\" sid=\"" + this.sid + "\" seq=\"" + (this.seq++) + "\">" + chunk + "</data>\n</iq>");
65
- if (this.seq > 65535) {
66
- this.seq = 0;
67
- }
68
- callback = __bind(function(result) {
69
- var pct;
70
- if (!this.ok(result)) {
55
+ return this.chunks.chunk(__bind(function(chunk) {
56
+ var node;
57
+ if (!chunk) {
58
+ this.close();
71
59
  return;
72
60
  }
73
- pct = Math.ceil(++this.sent / this.chunks.total * 100);
74
- this.progress(pct);
75
- return this.sendChunk();
76
- }, this);
77
- return this.session.sendIQ(node.get(0), callback);
61
+ node = $("<iq id=\"" + (this.session.uniqueId()) + "\" to=\"" + this.to + "\" type=\"set\">\n <data xmlns=\"http://jabber.org/protocol/ibb\" sid=\"" + this.sid + "\" seq=\"" + (this.seq++) + "\">" + chunk + "</data>\n</iq>");
62
+ if (this.seq > 65535) {
63
+ this.seq = 0;
64
+ }
65
+ return this.session.sendIQ(node.get(0), __bind(function(result) {
66
+ var pct;
67
+ if (!this.ok(result)) {
68
+ return;
69
+ }
70
+ pct = Math.ceil(++this.sent / this.chunks.total * 100);
71
+ this.progress(pct);
72
+ return this.sendChunk();
73
+ }, this));
74
+ }, this));
78
75
  };
79
76
  Transfer.prototype.close = function() {
80
77
  var node;
@@ -97,36 +94,29 @@ Transfer = (function() {
97
94
  return $(result).attr('type') === 'result';
98
95
  };
99
96
  Chunks = (function() {
97
+ var CHUNK_SIZE;
98
+ CHUNK_SIZE = 3 / 4 * 4096;
100
99
  function Chunks(file) {
101
100
  this.file = file;
102
- this.chunks = [];
103
- this.total = 0;
101
+ this.total = Math.ceil(this.file.size / CHUNK_SIZE);
102
+ this.slice = this.file.slice || this.file.webkitSlice || this.file.mozSlice;
103
+ this.pos = 0;
104
104
  }
105
- Chunks.prototype.chunk = function() {
106
- return this.chunks.shift();
107
- };
108
- Chunks.prototype.start = function(callback) {
109
- var reader;
110
- reader = new FileReader();
111
- reader.onload = __bind(function(event) {
112
- var chunk, data;
113
- data = btoa(event.target.result);
114
- this.chunks = (function() {
115
- var _i, _len, _ref, _results;
116
- _ref = data.split(/(.{1,4096})/);
117
- _results = [];
118
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
119
- chunk = _ref[_i];
120
- if (chunk) {
121
- _results.push(chunk);
122
- }
123
- }
124
- return _results;
125
- })();
126
- this.total = this.chunks.length;
127
- return callback();
128
- }, this);
129
- return reader.readAsBinaryString(this.file);
105
+ Chunks.prototype.chunk = function(callback) {
106
+ var chunk, end, reader, start;
107
+ start = this.pos;
108
+ end = this.pos + CHUNK_SIZE;
109
+ this.pos = end;
110
+ if (start > this.file.size) {
111
+ return callback(null);
112
+ } else {
113
+ chunk = this.slice.call(this.file, start, end);
114
+ reader = new FileReader();
115
+ reader.onload = function(event) {
116
+ return callback(btoa(event.target.result));
117
+ };
118
+ return reader.readAsBinaryString(chunk);
119
+ }
130
120
  };
131
121
  return Chunks;
132
122
  })();
@@ -2,21 +2,24 @@
2
2
  margin: 0;
3
3
  padding: 0;
4
4
  }
5
+ html, body {
6
+ height: 100%;
7
+ overflow: hidden;
8
+ }
5
9
  html {
6
10
  background: #0c1a2d;
7
- height: 100%;
8
11
  }
9
12
  body {
10
13
  background: #0c1a2d;
11
14
  color: #222;
12
15
  font-family: "Helvetica Neue", Helvetica, sans-serif;
13
16
  font-size: 10pt;
14
- height: 100%;
15
17
  line-height: 20pt;
16
18
  }
17
19
  input[type="text"],
18
20
  input[type="email"],
19
- input[type="password"] {
21
+ input[type="password"],
22
+ textarea {
20
23
  border-radius: 2px;
21
24
  border: none;
22
25
  -webkit-box-shadow: inset 1px 1px 2px rgba(0, 0, 0, 0.2);
@@ -26,6 +29,13 @@ input[type="password"] {
26
29
  outline: none;
27
30
  padding: 6px;
28
31
  }
32
+ input[type="text"]:focus,
33
+ input[type="email"]:focus,
34
+ input[type="password"]:focus,
35
+ textarea:focus {
36
+ -webkit-box-shadow: inset 1px 1px 2px rgba(0, 0, 0, 0.6);
37
+ box-shadow: inset 1px 1px 2px rgba(0, 0, 0, 0.6);
38
+ }
29
39
  input[type="button"],
30
40
  input[type="submit"] {
31
41
  background: -moz-linear-gradient(#ececec, #dcdcdc);
@@ -253,13 +263,24 @@ optgroup option {
253
263
  background: rgba(0, 0, 0, .2);
254
264
  }
255
265
  ul.selectable li.selected {
256
- background: #4693FF;
257
- background: -moz-linear-gradient(#4693FF, #015de6);
258
- background: -o-linear-gradient(#4693FF, #015de6);
259
- background: -webkit-gradient(linear, left top, left bottom, from(#4693FF), to(#015de6));
260
- border-bottom: 1px solid #fff;
266
+ background: #319be7;
267
+ background: -moz-linear-gradient(#319be7, #1b78d9);
268
+ background: -o-linear-gradient(#319be7, #1b78d9);
269
+ background: -webkit-gradient(linear, left top, left bottom, from(#319be7), to(#1b78d9));
270
+ border-top: 1px solid #148ddf;
271
+ border-bottom: 1px solid #095bba;
272
+ color: #fff;
273
+ text-shadow: -1px 1px 1px hsl(210, 51%, 45%), 0px -1px 1px hsl(210, 51%, 49%);
274
+ }
275
+ ul.selectable li.selected.secondary {
276
+ background: hsl(220, 29%, 80%);
277
+ background: -moz-linear-gradient(hsl(220, 29%, 80%), hsl(217, 25%, 69%));
278
+ background: -o-linear-gradient(hsl(220, 29%, 80%), hsl(217, 25%, 69%));
279
+ background: -webkit-gradient(linear, left top, left bottom, from(hsl(220, 29%, 80%)), to(hsl(217, 25%, 69%)));
280
+ border-top: 1px solid hsl(218, 23%, 79%);
281
+ border-bottom: 1px solid hsl(218, 20%, 65%);
261
282
  color: #fff;
262
- text-shadow: 0 -1px 1px #1b3a65;
283
+ text-shadow: -1px 1px 1px #94a1b8;
263
284
  }
264
285
  .column {
265
286
  height: 100%;
@@ -339,9 +360,24 @@ form.inset .buttons {
339
360
  text-align: right;
340
361
  }
341
362
  form.overlay input[type="text"],
363
+ form.overlay input[type="password"],
342
364
  form.overlay input[type="email"] {
343
365
  margin-bottom: 10px;
344
366
  width: 228px;
345
367
  position: relative;
346
368
  left: 10px;
347
369
  }
370
+ .notification {
371
+ background: rgba(12, 26, 45, 0.75);
372
+ border-radius: 30px;
373
+ color: #fff;
374
+ font-size: 10pt;
375
+ font-weight: bold;
376
+ padding: 5px 100px;
377
+ position: absolute;
378
+ top: 50%;
379
+ left: 50%;
380
+ text-align: center;
381
+ text-shadow: 0 1px 1px #000;
382
+ z-index: 2;
383
+ }
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: vines
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.2.1
5
+ version: 0.3.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - David Graham
@@ -11,8 +11,7 @@ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
13
 
14
- date: 2011-07-22 00:00:00 -06:00
15
- default_executable:
14
+ date: 2011-09-28 00:00:00 Z
16
15
  dependencies:
17
16
  - !ruby/object:Gem::Dependency
18
17
  name: activerecord
@@ -22,7 +21,7 @@ dependencies:
22
21
  requirements:
23
22
  - - ~>
24
23
  - !ruby/object:Gem::Version
25
- version: "3.0"
24
+ version: 3.1.0
26
25
  type: :runtime
27
26
  version_requirements: *id001
28
27
  - !ruby/object:Gem::Dependency
@@ -33,7 +32,7 @@ dependencies:
33
32
  requirements:
34
33
  - - ~>
35
34
  - !ruby/object:Gem::Version
36
- version: "2.1"
35
+ version: 3.0.0
37
36
  type: :runtime
38
37
  version_requirements: *id002
39
38
  - !ruby/object:Gem::Dependency
@@ -44,7 +43,7 @@ dependencies:
44
43
  requirements:
45
44
  - - ~>
46
45
  - !ruby/object:Gem::Version
47
- version: "0.3"
46
+ version: 0.3.0
48
47
  type: :runtime
49
48
  version_requirements: *id003
50
49
  - !ruby/object:Gem::Dependency
@@ -55,7 +54,7 @@ dependencies:
55
54
  requirements:
56
55
  - - ~>
57
56
  - !ruby/object:Gem::Version
58
- version: "0.3"
57
+ version: 0.3.0
59
58
  type: :runtime
60
59
  version_requirements: *id004
61
60
  - !ruby/object:Gem::Dependency
@@ -66,7 +65,7 @@ dependencies:
66
65
  requirements:
67
66
  - - ~>
68
67
  - !ruby/object:Gem::Version
69
- version: "0.12"
68
+ version: 0.12.10
70
69
  type: :runtime
71
70
  version_requirements: *id005
72
71
  - !ruby/object:Gem::Dependency
@@ -77,7 +76,7 @@ dependencies:
77
76
  requirements:
78
77
  - - ~>
79
78
  - !ruby/object:Gem::Version
80
- version: "0.5"
79
+ version: 0.5.2
81
80
  type: :runtime
82
81
  version_requirements: *id006
83
82
  - !ruby/object:Gem::Dependency
@@ -88,7 +87,7 @@ dependencies:
88
87
  requirements:
89
88
  - - ~>
90
89
  - !ruby/object:Gem::Version
91
- version: "0.2"
90
+ version: 0.2.2
92
91
  type: :runtime
93
92
  version_requirements: *id007
94
93
  - !ruby/object:Gem::Dependency
@@ -99,7 +98,7 @@ dependencies:
99
98
  requirements:
100
99
  - - ~>
101
100
  - !ruby/object:Gem::Version
102
- version: "1.5"
101
+ version: 1.4.7
103
102
  type: :runtime
104
103
  version_requirements: *id008
105
104
  - !ruby/object:Gem::Dependency
@@ -164,12 +163,15 @@ files:
164
163
  - lib/vines/command/schema.rb
165
164
  - lib/vines/command/start.rb
166
165
  - lib/vines/command/stop.rb
166
+ - lib/vines/config/host.rb
167
+ - lib/vines/config/port.rb
167
168
  - lib/vines/config.rb
168
169
  - lib/vines/contact.rb
169
170
  - lib/vines/daemon.rb
170
171
  - lib/vines/error.rb
171
172
  - lib/vines/jid.rb
172
173
  - lib/vines/kit.rb
174
+ - lib/vines/log.rb
173
175
  - lib/vines/router.rb
174
176
  - lib/vines/stanza/iq/auth.rb
175
177
  - lib/vines/stanza/iq/disco_info.rb
@@ -182,6 +184,7 @@ files:
182
184
  - lib/vines/stanza/iq/roster.rb
183
185
  - lib/vines/stanza/iq/session.rb
184
186
  - lib/vines/stanza/iq/vcard.rb
187
+ - lib/vines/stanza/iq/version.rb
185
188
  - lib/vines/stanza/iq.rb
186
189
  - lib/vines/stanza/message.rb
187
190
  - lib/vines/stanza/presence/error.rb
@@ -253,12 +256,10 @@ files:
253
256
  - web/apple-touch-icon.png
254
257
  - web/chat/coffeescripts/chat.coffee
255
258
  - web/chat/coffeescripts/init.coffee
256
- - web/chat/coffeescripts/logout.coffee
257
259
  - web/chat/index.html
258
260
  - web/chat/javascripts/app.js
259
261
  - web/chat/javascripts/chat.js
260
262
  - web/chat/javascripts/init.js
261
- - web/chat/javascripts/logout.js
262
263
  - web/chat/stylesheets/chat.css
263
264
  - web/favicon.png
264
265
  - web/lib/coffeescripts/button.coffee
@@ -266,7 +267,9 @@ files:
266
267
  - web/lib/coffeescripts/filter.coffee
267
268
  - web/lib/coffeescripts/layout.coffee
268
269
  - web/lib/coffeescripts/login.coffee
270
+ - web/lib/coffeescripts/logout.coffee
269
271
  - web/lib/coffeescripts/navbar.coffee
272
+ - web/lib/coffeescripts/notification.coffee
270
273
  - web/lib/coffeescripts/router.coffee
271
274
  - web/lib/coffeescripts/session.coffee
272
275
  - web/lib/coffeescripts/transfer.coffee
@@ -282,7 +285,9 @@ files:
282
285
  - web/lib/javascripts/jquery.js
283
286
  - web/lib/javascripts/layout.js
284
287
  - web/lib/javascripts/login.js
288
+ - web/lib/javascripts/logout.js
285
289
  - web/lib/javascripts/navbar.js
290
+ - web/lib/javascripts/notification.js
286
291
  - web/lib/javascripts/raphael.js
287
292
  - web/lib/javascripts/router.js
288
293
  - web/lib/javascripts/session.js
@@ -290,6 +295,7 @@ files:
290
295
  - web/lib/javascripts/transfer.js
291
296
  - web/lib/stylesheets/base.css
292
297
  - web/lib/stylesheets/login.css
298
+ - test/config/host_test.rb
293
299
  - test/config_test.rb
294
300
  - test/contact_test.rb
295
301
  - test/error_test.rb
@@ -298,13 +304,18 @@ files:
298
304
  - test/kit_test.rb
299
305
  - test/rake_test_loader.rb
300
306
  - test/router_test.rb
307
+ - test/stanza/iq/disco_info_test.rb
308
+ - test/stanza/iq/disco_items_test.rb
301
309
  - test/stanza/iq/private_storage_test.rb
302
310
  - test/stanza/iq/roster_test.rb
303
311
  - test/stanza/iq/session_test.rb
304
312
  - test/stanza/iq/vcard_test.rb
313
+ - test/stanza/iq/version_test.rb
305
314
  - test/stanza/iq_test.rb
306
315
  - test/stanza/message_test.rb
316
+ - test/stanza/presence/probe_test.rb
307
317
  - test/stanza/presence/subscribe_test.rb
318
+ - test/stanza_test.rb
308
319
  - test/storage/couchdb_test.rb
309
320
  - test/storage/ldap_test.rb
310
321
  - test/storage/local_test.rb
@@ -328,7 +339,6 @@ files:
328
339
  - test/stream/server/ready_test.rb
329
340
  - test/token_bucket_test.rb
330
341
  - test/user_test.rb
331
- has_rdoc: true
332
342
  homepage: http://www.getvines.com
333
343
  licenses: []
334
344
 
@@ -352,11 +362,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
352
362
  requirements: []
353
363
 
354
364
  rubyforge_project:
355
- rubygems_version: 1.6.2
365
+ rubygems_version: 1.8.10
356
366
  signing_key:
357
367
  specification_version: 3
358
368
  summary: Vines is an XMPP chat server that's easy to install and run.
359
369
  test_files:
370
+ - test/config/host_test.rb
360
371
  - test/config_test.rb
361
372
  - test/contact_test.rb
362
373
  - test/error_test.rb
@@ -365,13 +376,18 @@ test_files:
365
376
  - test/kit_test.rb
366
377
  - test/rake_test_loader.rb
367
378
  - test/router_test.rb
379
+ - test/stanza/iq/disco_info_test.rb
380
+ - test/stanza/iq/disco_items_test.rb
368
381
  - test/stanza/iq/private_storage_test.rb
369
382
  - test/stanza/iq/roster_test.rb
370
383
  - test/stanza/iq/session_test.rb
371
384
  - test/stanza/iq/vcard_test.rb
385
+ - test/stanza/iq/version_test.rb
372
386
  - test/stanza/iq_test.rb
373
387
  - test/stanza/message_test.rb
388
+ - test/stanza/presence/probe_test.rb
374
389
  - test/stanza/presence/subscribe_test.rb
390
+ - test/stanza_test.rb
375
391
  - test/storage/couchdb_test.rb
376
392
  - test/storage/ldap_test.rb
377
393
  - test/storage/local_test.rb