scamp 0.0.4 → 0.1.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.
@@ -2,11 +2,24 @@ require "spec_helper"
2
2
 
3
3
  describe Scamp do
4
4
  before do
5
- @valid_params = {:api_key => "6124d98749365e3db2c9e5b27ca04db6", :subdomain => "oxygen"}
5
+ @valid_params = {:api_key => "6124d98749365e3db2c9e5b27ca04db6", :subdomain => "oxygen"}
6
6
  @valid_user_cache_data = {123 => {"name" => "foo"}, 456 => {"name" => "bar"}}
7
- @valid_channel_cache_data = {123 => {"name" => "foo"}, 456 => {"name" => "bar"}}
7
+
8
+ # Stub fetch for room data
9
+ @valid_room_cache_data = {
10
+ 123 => {
11
+ "id" => 123,
12
+ "name" => "foo",
13
+ "users" => []
14
+ },
15
+ 456 => {
16
+ "id" => 456,
17
+ "name" => "bar",
18
+ "users" => []
19
+ }
20
+ }
8
21
  end
9
-
22
+
10
23
  describe "#initialize" do
11
24
  it "should work with valid params" do
12
25
  a(Scamp).should be_a(Scamp)
@@ -93,32 +106,32 @@ describe Scamp do
93
106
  describe "matching" do
94
107
 
95
108
  context "with conditions" do
96
- it "should limit matches by channel id" do
109
+ it "should limit matches by room id" do
97
110
  canary = mock
98
111
  canary.expects(:lives).once
99
112
  canary.expects(:bang).never
100
113
 
101
114
  bot = a Scamp
102
115
  bot.behaviour do
103
- match("a string", :conditions => {:channel => 123}) {canary.lives}
104
- match("a string", :conditions => {:channel => 456}) {canary.bang}
116
+ match("a string", :conditions => {:room => 123}) {canary.lives}
117
+ match("a string", :conditions => {:room => 456}) {canary.bang}
105
118
  end
106
119
 
107
120
  bot.send(:process_message, {:room_id => 123, :body => "a string"})
108
121
  end
109
122
 
110
- it "should limit matches by channel name" do
123
+ it "should limit matches by room name" do
111
124
  canary = mock
112
125
  canary.expects(:lives).once
113
126
  canary.expects(:bang).never
114
127
 
115
128
  bot = a Scamp
116
129
  bot.behaviour do
117
- match("a string", :conditions => {:channel => "foo"}) {canary.lives}
118
- match("a string", :conditions => {:channel => "bar"}) {canary.bang}
130
+ match("a string", :conditions => {:room => "foo"}) {canary.lives}
131
+ match("a string", :conditions => {:room => "bar"}) {canary.bang}
119
132
  end
120
133
 
121
- bot.channel_cache = @valid_channel_cache_data
134
+ bot.room_cache = @valid_room_cache_data
122
135
 
123
136
  bot.send(:process_message, {:room_id => 123, :body => "a string"})
124
137
  end
@@ -153,18 +166,18 @@ describe Scamp do
153
166
  bot.send(:process_message, {:user_id => 123, :body => "a string"})
154
167
  end
155
168
 
156
- it "should limit matches by channel and user" do
169
+ it "should limit matches by room and user" do
157
170
  canary = mock
158
171
  canary.expects(:lives).once
159
172
  canary.expects(:bang).never
160
173
 
161
174
  bot = a Scamp
162
175
  bot.behaviour do
163
- match("a string", :conditions => {:channel => 123, :user => 123}) {canary.lives}
164
- match("a string", :conditions => {:channel => 456, :user => 456}) {canary.bang}
176
+ match("a string", :conditions => {:room => 123, :user => 123}) {canary.lives}
177
+ match("a string", :conditions => {:room => 456, :user => 456}) {canary.bang}
165
178
  end
166
179
 
167
- bot.channel_cache = @valid_channel_cache_data
180
+ bot.room_cache = @valid_room_cache_data
168
181
  bot.user_cache = @valid_user_cache_data
169
182
  bot.send(:process_message, {:room_id => 123, :user_id => 123, :body => "a string"})
170
183
  bot.send(:process_message, {:room_id => 123, :user_id => 456, :body => "a string"})
@@ -187,8 +200,33 @@ describe Scamp do
187
200
 
188
201
  bot.send(:process_message, {:body => "a string"})
189
202
  end
203
+
204
+ it "should not match without prefix when required_prefix is true" do
205
+ canary = mock
206
+ canary.expects(:bang).never
207
+
208
+ bot = a Scamp, :required_prefix => 'Bot: '
209
+ bot.behaviour do
210
+ match("a string") {canary.bang}
211
+ end
212
+
213
+ bot.send(:process_message, {:body => "a string"})
214
+ end
215
+
216
+ it "should match with exact prefix when required_prefix is true" do
217
+ canary = mock
218
+ canary.expects(:lives).once
219
+
220
+ bot = a Scamp, :required_prefix => 'Bot: '
221
+ bot.behaviour do
222
+ match("a string") {canary.lives}
223
+ end
224
+
225
+ bot.send(:process_message, {:body => "Bot: a string"})
226
+ end
190
227
  end
191
228
 
229
+
192
230
  describe "regexes" do
193
231
  it "should match a regex" do
194
232
  canary = mock
@@ -236,6 +274,360 @@ describe Scamp do
236
274
 
237
275
  bot.send(:process_message, {:body => "please match first and the rest of it"})
238
276
  end
277
+
278
+ it "should not match without prefix when required_prefix is present" do
279
+ canary = mock
280
+ canary.expects(:bang).never
281
+
282
+ bot = a Scamp, :required_prefix => /^Bot[\:,\s]+/i
283
+ bot.behaviour do
284
+ match(/a string/) {canary.bang}
285
+ end
286
+
287
+ bot.send(:process_message, {:body => "a string"})
288
+ bot.send(:process_message, {:body => "some kind of a string"})
289
+ bot.send(:process_message, {:body => "a string!!!"})
290
+ end
291
+
292
+ it "should match with regex prefix when required_prefix is present" do
293
+ canary = mock
294
+ canary.expects(:lives).times(4)
295
+
296
+ bot = a Scamp, :required_prefix => /^Bot\W{1,2}/i
297
+ bot.behaviour do
298
+ match(/a string/) {canary.lives}
299
+ end
300
+
301
+ bot.send(:process_message, {:body => "Bot, a string"})
302
+ bot.send(:process_message, {:body => "Bot a string"})
303
+ bot.send(:process_message, {:body => "bot: a string"})
304
+ bot.send(:process_message, {:body => "Bot: a string oh my!"})
305
+ end
306
+ end
307
+ end
308
+
309
+ describe "match block" do
310
+ it "should make the room details available to the action block" do
311
+ canary = mock
312
+ canary.expects(:id).with(123)
313
+ canary.expects(:name).with(@valid_room_cache_data[123]["name"])
314
+
315
+ bot = a Scamp
316
+ bot.behaviour do
317
+ match("a string") {
318
+ canary.id(room_id)
319
+ canary.name(room)
320
+ }
321
+ end
322
+
323
+ bot.room_cache = @valid_room_cache_data
324
+ bot.send(:process_message, {:room_id => 123, :body => "a string"})
325
+ end
326
+
327
+ it "should make the speaking user details available to the action block" do
328
+ canary = mock
329
+ canary.expects(:id).with(123)
330
+ canary.expects(:name).with(@valid_user_cache_data[123]["name"])
331
+
332
+ bot = a Scamp
333
+ bot.behaviour do
334
+ match("a string") {
335
+ canary.id(user_id)
336
+ canary.name(user)
337
+ }
338
+ end
339
+
340
+ bot.user_cache = @valid_user_cache_data
341
+ bot.send(:process_message, {:user_id => 123, :body => "a string"})
342
+ end
343
+
344
+ it "should make the message said available to the action block" do
345
+ canary = mock
346
+ canary.expects(:message).with("Hello world")
347
+
348
+ bot = a Scamp
349
+ bot.behaviour do
350
+ match("Hello world") {
351
+ canary.message(message)
352
+ }
353
+ end
354
+
355
+ bot.send(:process_message, {:body => "Hello world"})
356
+ end
357
+
358
+ it "should provide a command list" do
359
+ canary = mock
360
+ canary.expects(:commands).with([["Hello world", {}], ["Hello other world", {:room=>123}], [/match me/, {:user=>123}]])
361
+
362
+ bot = a Scamp
363
+ bot.behaviour do
364
+ match("Hello world") {
365
+ canary.commands(command_list)
366
+ }
367
+ match("Hello other world", :conditions => {:room => 123}) {}
368
+ match(/match me/, :conditions => {:user => 123}) {}
369
+ end
370
+
371
+ bot.send(:process_message, {:body => "Hello world"})
372
+ end
373
+
374
+ it "should be able to play a sound to the room the action was triggered in" do
375
+ bot = a Scamp
376
+ bot.behaviour do
377
+ match("Hello world") {
378
+ play "yeah"
379
+ }
380
+ end
381
+
382
+ EM.run_block {
383
+ room_id = 123
384
+ stub_request(:post, "https://#{@valid_params[:subdomain]}.campfirenow.com/room/#{room_id}/speak.json").
385
+ with(
386
+ :body => "{\"message\":{\"body\":\"yeah\",\"type\":\"SoundMessage\"}}",
387
+ :headers => {'Authorization'=>[@valid_params[:api_key], 'X'], 'Content-Type'=>'application/json'}
388
+ )
389
+
390
+ bot.send(:process_message, {:room_id => room_id, :body => "Hello world"})
391
+ }
392
+ end
393
+
394
+ it "should be able to play a sound to an arbitrary room" do
395
+ play_room = 456
396
+
397
+ bot = a Scamp
398
+ bot.behaviour do
399
+ match("Hello world") {
400
+ play "yeah", play_room
401
+ }
402
+ end
403
+
404
+ EM.run_block {
405
+ room_id = 123
406
+ stub_request(:post, "https://#{@valid_params[:subdomain]}.campfirenow.com/room/#{play_room}/speak.json").
407
+ with(
408
+ :body => "{\"message\":{\"body\":\"yeah\",\"type\":\"SoundMessage\"}}",
409
+ :headers => {'Authorization'=>[@valid_params[:api_key], 'X'], 'Content-Type'=>'application/json'}
410
+ )
411
+
412
+ bot.send(:process_message, {:room_id => room_id, :body => "Hello world"})
413
+ }
414
+ end
415
+
416
+ it "should be able to say a message to the room the action was triggered in" do
417
+ bot = a Scamp
418
+ bot.behaviour do
419
+ match("Hello world") {
420
+ say "yeah"
421
+ }
422
+ end
423
+
424
+ EM.run_block {
425
+ room_id = 123
426
+ stub_request(:post, "https://#{@valid_params[:subdomain]}.campfirenow.com/room/#{room_id}/speak.json").
427
+ with(
428
+ :body => "{\"message\":{\"body\":\"yeah\",\"type\":\"Textmessage\"}}",
429
+ :headers => {'Authorization'=>[@valid_params[:api_key], 'X'], 'Content-Type'=>'application/json'}
430
+ )
431
+
432
+ bot.send(:process_message, {:room_id => room_id, :body => "Hello world"})
433
+ }
434
+ end
435
+
436
+ it "should be able to say a message to an arbitrary room" do
437
+ play_room = 456
438
+
439
+ bot = a Scamp
440
+ bot.behaviour do
441
+ match("Hello world") {
442
+ say "yeah", play_room
443
+ }
444
+ end
445
+
446
+ EM.run_block {
447
+ room_id = 123
448
+ stub_request(:post, "https://#{@valid_params[:subdomain]}.campfirenow.com/room/#{play_room}/speak.json").
449
+ with(
450
+ :body => "{\"message\":{\"body\":\"yeah\",\"type\":\"Textmessage\"}}",
451
+ :headers => {'Authorization'=>[@valid_params[:api_key], 'X'], 'Content-Type'=>'application/json'}
452
+ )
453
+
454
+ bot.send(:process_message, {:room_id => room_id, :body => "Hello world"})
455
+ }
456
+ end
457
+ end
458
+
459
+ describe "API" do
460
+ context "user operations" do
461
+ it "should fetch user data" do
462
+ bot = a Scamp
463
+
464
+ EM.run_block {
465
+ stub_request(:get, "https://#{@valid_params[:subdomain]}.campfirenow.com/users/123.json").
466
+ with(:headers => {'Authorization'=>[@valid_params[:api_key], 'X'], 'Content-Type'=>'application/json'}).
467
+ to_return(:status => 200, :body => Yajl::Encoder.encode(:user => @valid_user_cache_data[123]), :headers => {})
468
+ bot.username_for(123)
469
+ }
470
+ end
471
+
472
+ it "should handle HTTP errors fetching user data" do
473
+ mock_logger
474
+ bot = a Scamp
475
+
476
+ url = "https://#{@valid_params[:subdomain]}.campfirenow.com/users/123.json"
477
+ EM.run_block {
478
+ stub_request(:get, url).
479
+ with(:headers => {'Authorization'=>[@valid_params[:api_key], 'X'], 'Content-Type'=>'application/json'}).
480
+ to_return(:status => 502, :body => "", :headers => {'Content-Type'=>'text/html'})
481
+ lambda {bot.username_for(123)}.should_not raise_error
482
+ }
483
+ logger_output.should =~ /ERROR.*Couldn't fetch user data for user 123 with url #{url}, http response from API was 502/
484
+ end
485
+
486
+ it "should handle network errors fetching user data" do
487
+ mock_logger
488
+ bot = a Scamp
489
+
490
+ url = "https://#{@valid_params[:subdomain]}.campfirenow.com/users/123.json"
491
+ EM.run_block {
492
+ stub_request(:get, url).
493
+ with(:headers => {'Authorization'=>[@valid_params[:api_key], 'X'], 'Content-Type'=>'application/json'}).to_timeout
494
+ lambda {bot.username_for(123)}.should_not raise_error
495
+ }
496
+ logger_output.should =~ /ERROR.*Couldn't connect to #{url} to fetch user data for user 123/
497
+ end
498
+ end
499
+
500
+ context "room operations" do
501
+ before do
502
+ @room_list_url = "https://#{@valid_params[:subdomain]}.campfirenow.com/rooms.json"
503
+ @room_url = "https://#{@valid_params[:subdomain]}.campfirenow.com/room/123.json"
504
+ @stream_url = "https://streaming.campfirenow.com/room/123/live.json"
505
+ end
506
+
507
+ it "should fetch a room list" do
508
+ mock_logger
509
+ bot = a Scamp
510
+
511
+ EM.run_block {
512
+ stub_request(:get, @room_list_url).
513
+ with(:headers => {'Authorization'=>[@valid_params[:api_key], 'X']}).
514
+ to_return(:status => 200, :body => Yajl::Encoder.encode(:rooms => @valid_room_cache_data.values), :headers => {})
515
+ bot.send(:populate_room_list)
516
+ }
517
+ logger_output.should =~ /DEBUG.*Fetched room list/
518
+ end
519
+
520
+ it "should handle HTTP errors fetching the room list" do
521
+ mock_logger
522
+ bot = a Scamp
523
+
524
+ EM.run_block {
525
+ # stub_request(:get, url).
526
+ # with(:headers => {'Authorization'=>[@valid_params[:api_key], 'X'], 'Content-Type'=>'application/json'}).
527
+ # to_return(:status => 502, :body => "", :headers => {'Content-Type'=>'text/html'})
528
+ stub_request(:get, @room_list_url).
529
+ with(:headers => {'Authorization'=>[@valid_params[:api_key], 'X']}).
530
+ to_return(:status => 502, :body => "", :headers => {'Content-Type'=>'text/html'})
531
+ lambda {bot.send(:populate_room_list)}.should_not raise_error
532
+ }
533
+ logger_output.should =~ /ERROR.*Couldn't fetch room list with url #{@room_list_url}, http response from API was 502/
534
+ end
535
+
536
+ it "should handle network errors fetching the room list" do
537
+ mock_logger
538
+ bot = a Scamp
539
+ EM.run_block {
540
+ stub_request(:get, @room_list_url).
541
+ with(:headers => {'Authorization'=>[@valid_params[:api_key], 'X']}).to_timeout
542
+ lambda {bot.send(:populate_room_list)}.should_not raise_error
543
+ }
544
+ logger_output.should =~ /ERROR.*Couldn't connect to url #{@room_list_url} to fetch room list/
545
+ end
546
+
547
+ it "should fetch individual room data" do
548
+ mock_logger
549
+ bot = a Scamp
550
+
551
+ EM.run_block {
552
+ stub_request(:get, @room_url).
553
+ with(:headers => {'Authorization'=>[@valid_params[:api_key], 'X']}).
554
+ to_return(:status => 200, :body => Yajl::Encoder.encode(:room => @valid_room_cache_data[123]), :headers => {})
555
+ bot.room_name_for(123)
556
+ }
557
+ logger_output.should =~ /DEBUG.*Fetched room data for 123/
558
+ end
559
+
560
+ it "should handle HTTP errors fetching individual room data" do
561
+ mock_logger
562
+ bot = a Scamp
563
+
564
+ EM.run_block {
565
+ stub_request(:get, @room_url).
566
+ with(:headers => {'Authorization'=>[@valid_params[:api_key], 'X']}).
567
+ to_return(:status => 502, :body => "", :headers => {'Content-Type'=>'text/html'})
568
+ lambda {bot.room_name_for(123)}.should_not raise_error
569
+ }
570
+ logger_output.should =~ /ERROR.*Couldn't fetch room data for room 123 with url #{@room_url}, http response from API was 502/
571
+ end
572
+
573
+ it "should handle network errors fetching individual room data" do
574
+ mock_logger
575
+ bot = a Scamp
576
+
577
+ EM.run_block {
578
+ stub_request(:get, @room_url).
579
+ with(:headers => {'Authorization'=>[@valid_params[:api_key], 'X']}).to_timeout
580
+ lambda {bot.room_name_for(123)}.should_not raise_error
581
+ }
582
+ logger_output.should =~ /ERROR.*Couldn't connect to #{@room_url} to fetch room data for room 123/
583
+ end
584
+
585
+ it "should stream a room"
586
+ it "should handle HTTP errors streaming a room"
587
+ it "should handle network errors streaming a room"
588
+ end
589
+
590
+ context "message operations" do
591
+ before do
592
+ @message_post_url = "https://#{@valid_params[:subdomain]}.campfirenow.com/room/123/speak.json"
593
+ end
594
+ it "should send a message" do
595
+ mock_logger
596
+ bot = a Scamp
597
+
598
+ EM.run_block {
599
+ stub_request(:post, @message_post_url).
600
+ with(:headers => {'Authorization'=>[@valid_params[:api_key], 'X'], 'Content-Type' => 'application/json'}).
601
+ to_return(:status => 200, :body => Yajl::Encoder.encode(:room => @valid_room_cache_data[123]), :headers => {})
602
+ bot.send(:send_message, 123, "Hi", "Textmessage")
603
+ }
604
+ logger_output.should =~ /DEBUG.*Posted message "Hi" to room 123/
605
+ end
606
+
607
+ it "should handle HTTP errors fetching individual room data" do
608
+ mock_logger
609
+ bot = a Scamp
610
+
611
+ EM.run_block {
612
+ stub_request(:post, @message_post_url).
613
+ with(:headers => {'Authorization'=>[@valid_params[:api_key], 'X'], 'Content-Type' => 'application/json'}).
614
+ to_return(:status => 502, :body => "", :headers => {'Content-Type'=>'text/html'})
615
+ lambda {bot.send(:send_message, 123, "Hi", "Textmessage")}.should_not raise_error
616
+ }
617
+ logger_output.should =~ /ERROR.*Couldn't post message "Hi" to room 123 using url #{@message_post_url}, http response from the API was 502/
618
+ end
619
+
620
+ it "should handle network errors fetching individual room data" do
621
+ mock_logger
622
+ bot = a Scamp
623
+
624
+ EM.run_block {
625
+ stub_request(:post, @message_post_url).
626
+ with(:headers => {'Authorization'=>[@valid_params[:api_key], 'X'], 'Content-Type' => 'application/json'}).to_timeout
627
+ lambda {bot.send(:send_message, 123, "Hi", "Textmessage")}.should_not raise_error
628
+ }
629
+ logger_output.should =~ /ERROR.*Couldn't connect to #{@message_post_url} to post message "Hi" to room 123/
630
+ end
239
631
  end
240
632
  end
241
633
 
@@ -249,7 +641,7 @@ describe Scamp do
249
641
  def mock_logger
250
642
  @logger_string = StringIO.new
251
643
  @fake_logger = Logger.new(@logger_string)
252
- Scamp.any_instance.should_receive(:logger).and_return(@fake_logger)
644
+ Scamp.any_instance.expects(:logger).returns(@fake_logger)
253
645
  end
254
646
 
255
647
  # Bleurgh
data/spec/spec_helper.rb CHANGED
@@ -1,2 +1,8 @@
1
1
  require File.expand_path("../lib/scamp", File.dirname(__FILE__))
2
- require 'mocha'
2
+
3
+ require 'mocha'
4
+ require 'webmock/rspec'
5
+
6
+ RSpec.configure do |config|
7
+ config.mock_framework = :mocha
8
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scamp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-20 00:00:00.000000000Z
12
+ date: 2011-09-24 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: eventmachine
16
- requirement: &2152335860 !ruby/object:Gem::Requirement
16
+ requirement: &2152463380 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.0.0.beta.4
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2152335860
24
+ version_requirements: *2152463380
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: yajl-ruby
27
- requirement: &2152335100 !ruby/object:Gem::Requirement
27
+ requirement: &2152461660 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 0.8.3
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2152335100
35
+ version_requirements: *2152461660
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: em-http-request
38
- requirement: &2152334240 !ruby/object:Gem::Requirement
38
+ requirement: &2152459120 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.0.0.beta.4
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2152334240
46
+ version_requirements: *2152459120
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &2152333240 !ruby/object:Gem::Requirement
49
+ requirement: &2152457780 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 2.6.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2152333240
57
+ version_requirements: *2152457780
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: mocha
60
- requirement: &2152332420 !ruby/object:Gem::Requirement
60
+ requirement: &2152454380 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,7 +65,18 @@ dependencies:
65
65
  version: 0.10.0
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *2152332420
68
+ version_requirements: *2152454380
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: &2152453060 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: 1.7.6
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *2152453060
69
80
  description: Eventmachine based Campfire bot framework
70
81
  email:
71
82
  - will@willj.net
@@ -81,15 +92,16 @@ files:
81
92
  - examples/bot.rb
82
93
  - lib/scamp.rb
83
94
  - lib/scamp/action.rb
84
- - lib/scamp/channels.rb
85
95
  - lib/scamp/connection.rb
86
96
  - lib/scamp/matcher.rb
97
+ - lib/scamp/messages.rb
98
+ - lib/scamp/rooms.rb
87
99
  - lib/scamp/users.rb
88
100
  - lib/scamp/version.rb
89
101
  - scamp.gemspec
90
102
  - spec/lib/scamp_spec.rb
91
103
  - spec/spec_helper.rb
92
- homepage: ''
104
+ homepage: https://github.com/wjessop/Scamp
93
105
  licenses: []
94
106
  post_install_message:
95
107
  rdoc_options: []