campfire_chat 0.0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d7adbda79939752b58f8a50c20e2fe70c8f443af
4
+ data.tar.gz: 8d1fcb826b80add159346ea4eed7dec26d1247b5
5
+ SHA512:
6
+ metadata.gz: ce7231f38939e362eff142f85f37f91977d738040201bd36ef3fbd594f2b78977d5467754a0b9496f9a9663f4738af44cc181126af6555e26447ab02175fddb3
7
+ data.tar.gz: 0fe85245e61629bf896e77cffd9e843b2b70d8e5b9321c422218911c5592cd1a85655868d0eb43ac57ecb1cb70b604ff8b5ea89341884e7680cc1792cb68d18a
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in campfire_chat.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Richard Luther
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,29 @@
1
+ # CampfireChat
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'campfire_chat'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install campfire_chat
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+ require 'rubygems'
5
+ require 'campfire_chat'
6
+
7
+ options = {}
8
+
9
+ OptionParser.new do |opts|
10
+ opts.banner = "Usage: campfire_chat [Names seperated by spaces] [options]"
11
+ end.parse!
12
+
13
+ raise RuntimeError.new("growlnotify is required to run campfire_chat") if `which growlnotify`.empty?
14
+
15
+ pairs = ARGV
16
+
17
+ pairs.each do |pair|
18
+ CampfireChat.config.add_pair pair
19
+ end
20
+
21
+ CampfireChat::Monitor.run
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'campfire_chat/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "campfire_chat"
8
+ spec.version = CampfireChat::VERSION
9
+ spec.authors = ["Richard Luther"]
10
+ spec.email = ["richard.luther@gmail.com"]
11
+ spec.description = %q{Monitor a campfire room for messages to notify via growl}
12
+ spec.summary = %q{Monitor a campfire room for messages to notify via growl}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency 'tinder'
22
+ spec.add_dependency 'growl'
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.3"
25
+ spec.add_development_dependency "rake"
26
+ spec.add_development_dependency "rspec"
27
+ end
@@ -0,0 +1,19 @@
1
+ require 'singleton'
2
+ require 'time' #getting an error with Tinder "#undefined method parse for Time
3
+ require "campfire_chat/version"
4
+ require 'campfire_chat/engineer'
5
+ require 'campfire_chat/client'
6
+ require 'campfire_chat/configuration'
7
+ require 'campfire_chat/message'
8
+ require 'campfire_chat/monitor'
9
+ require 'campfire_chat/checks'
10
+ require 'campfire_chat/checks/pair_message'
11
+ require 'campfire_chat/notification'
12
+ require 'campfire_chat/notifier/growl'
13
+
14
+ module CampfireChat
15
+ def self.config
16
+ @config ||= Configuration.build
17
+ end
18
+ # Your code goes here...
19
+ end
@@ -0,0 +1,18 @@
1
+ module CampfireChat
2
+ module Checks
3
+ def self.extended(base)
4
+ checks << base
5
+ end
6
+
7
+ def self.checks
8
+ @checks ||= []
9
+ end
10
+
11
+ def self.process(notification)
12
+ checks.each do |check|
13
+ check.process_notification(notification)
14
+ end
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ module CampfireChat
2
+ module Checks
3
+ module PairMessage
4
+ extend CampfireChat::Checks
5
+
6
+ def self.process_notification(notification)
7
+ CampfireChat.config.pairs.each do |pair|
8
+ if notification.message.body.include?(pair.name)
9
+ notification.important!
10
+ notification.add_title title(pair)
11
+ end
12
+ end
13
+ end
14
+
15
+ def self.title(pair)
16
+ "#{pair.name}:"
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,32 @@
1
+ require 'tinder'
2
+ module CampfireChat
3
+ class Client
4
+ attr_reader :config
5
+ attr_accessor :last_message_id
6
+ def initialize(config = CampfireChat.config)
7
+ @config = config
8
+ end
9
+
10
+ def tinder
11
+ @tinder ||= Tinder::Campfire.new(config.subdomain, :token => config.token)
12
+ end
13
+
14
+ def messages
15
+ recent_messages = room.recent.select {|x| x.type == 'TextMessage' }
16
+ recent_messages = recent_messages.select {|x| x.id.to_i > last_message_id.to_i }.map {|m| build_message(m) }
17
+ self.last_message_id = recent_messages.last.id unless recent_messages.empty?
18
+ recent_messages
19
+ end
20
+
21
+ private
22
+
23
+ def build_message(msg)
24
+ CampfireChat::Message.new(msg)
25
+ end
26
+
27
+ def room
28
+ @room ||= tinder.find_room_by_name(config.room)
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,30 @@
1
+ require 'yaml'
2
+ module CampfireChat
3
+ class Configuration
4
+ attr_reader :token, :room, :subdomain, :pairs
5
+
6
+ def self.build(path = nil)
7
+ path ||= Pathname.new(ENV['HOME']).join('.campfire.yml')
8
+ new load_config(path)
9
+ end
10
+
11
+ def self.load_config(path)
12
+ conf = YAML.load_file(path) || {}
13
+ Hash[conf.map{ |k, v| [k.to_sym, v] }]
14
+ rescue Errno::ENOENT, TypeError
15
+ {}
16
+ end
17
+
18
+ def initialize(attrs={})
19
+ @token = attrs[:token]
20
+ @subdomain = attrs[:subdomain]
21
+ @room = attrs[:room]
22
+ @pairs = []
23
+ end
24
+
25
+ def add_pair(name)
26
+ pairs << CampfireChat::Engineer.new(:name => name)
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,9 @@
1
+ module CampfireChat
2
+ class Engineer
3
+ attr_reader :name
4
+ def initialize(attributes={})
5
+ @name = attributes[:name]
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ module CampfireChat
2
+ class Message
3
+ attr_reader :author, :body, :id
4
+ def initialize(raw_message)
5
+ @author = raw_message.user.name
6
+ @body = raw_message.body
7
+ @id = raw_message.id
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,56 @@
1
+ module CampfireChat
2
+ class Monitor
3
+ include Singleton
4
+ attr_accessor :last_run_time
5
+
6
+ def self.retry_time
7
+ 30
8
+ end
9
+
10
+ def self.sleep_time
11
+ retry_time / 2
12
+ end
13
+
14
+ def self.run
15
+ instance.run
16
+ end
17
+
18
+ def run
19
+ loop do
20
+ if check_client?
21
+ check_messages
22
+ set_last_run_time
23
+ sleep self.class.sleep_time
24
+ end
25
+ end
26
+ end
27
+
28
+ def check_messages
29
+ client.messages.each do |message|
30
+ notification = prepare_notification(message)
31
+ notifier.push(notification)
32
+ end
33
+ end
34
+
35
+ def set_last_run_time
36
+ self.last_run_time = Time.now
37
+ end
38
+
39
+ def check_client?
40
+ return true if last_run_time.nil?
41
+ last_run_time + self.class.retry_time < Time.now
42
+ end
43
+
44
+ def prepare_notification(message)
45
+ CampfireChat::Notification.build(message)
46
+ end
47
+
48
+ def client
49
+ @client ||= CampfireChat::Client.new
50
+ end
51
+
52
+ def notifier
53
+ @notifier ||= CampfireChat::Notifier::Growl.instance
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,51 @@
1
+ module CampfireChat
2
+ class Notification
3
+ attr_reader :message
4
+
5
+ def self.build(message)
6
+ notification = new(message)
7
+ CampfireChat::Checks.process(notification)
8
+ notification
9
+ end
10
+
11
+ def initialize(message)
12
+ @message = message
13
+ @additional_messages = []
14
+ @titles = []
15
+ @important = false
16
+ @error = false
17
+ end
18
+
19
+ def body
20
+ (@additional_messages + [message.body]).join("\n")
21
+ end
22
+
23
+ def <<(more_message)
24
+ @additional_messages << more_message
25
+ end
26
+
27
+ def add_title(another_title)
28
+ @titles << another_title
29
+ end
30
+
31
+ def title
32
+ @titles.join("\n")
33
+ end
34
+
35
+ def important?
36
+ @important
37
+ end
38
+
39
+ def important!
40
+ @important = true
41
+ end
42
+
43
+ def error!
44
+ @error = true
45
+ end
46
+
47
+ def error?
48
+ @error
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,27 @@
1
+ require 'growl'
2
+ module CampfireChat
3
+ module Notifier
4
+ class Growl
5
+ include Singleton
6
+
7
+ def push(notification)
8
+ notify_ok notification
9
+ end
10
+
11
+ def growl
12
+ ::Growl
13
+ end
14
+
15
+ private
16
+
17
+ def notify_ok(notification)
18
+ growl.notify notification.body, :title => notification.title, :sticky => notification.important?, :image => image_path('sr')
19
+ end
20
+
21
+ def image_path(image)
22
+ File.join(File.expand_path(File.dirname(__FILE__)), '../', 'images', "#{image}.png")
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ module CampfireChat
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,7 @@
1
+ Given a list of names
2
+
3
+ Check campfire for new posts
4
+ if a new post then process:
5
+ If post contains a name in list make the notification sticky
6
+ send the notification to growl
7
+
@@ -0,0 +1,4 @@
1
+ ---
2
+ room: some room
3
+ token: the-token
4
+ subdomain: the-subdomain
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe CampfireChat::Checks::PairMessage do
4
+ let(:message) { double(:body => 'Fred you broke the build') }
5
+ let(:notification) { double(:message => message, :important! => true, :<< => nil, :add_title => nil)}
6
+ let(:config) { double(:pairs => [double(:name => 'Bob')]) }
7
+ before do
8
+ CampfireChat.stub(:config => config)
9
+ end
10
+
11
+ describe '.process_notification' do
12
+ context 'when the notification contains a name in the pairs' do
13
+ before do
14
+ config.pairs << double(:name => 'Fred')
15
+ end
16
+ it 'flags the notification as important' do
17
+ notification.should_receive(:important!)
18
+ CampfireChat::Checks::PairMessage.process_notification(notification)
19
+ end
20
+
21
+ it 'adds additional titles to the notification' do
22
+ notification.should_receive(:add_title).with("Fred:")
23
+ CampfireChat::Checks::PairMessage.process_notification(notification)
24
+ end
25
+ end
26
+
27
+ context 'when the notification does not contain a name in the pairs' do
28
+ it 'does not flag the notification as important' do
29
+ notification.should_not_receive(:important!)
30
+ CampfireChat::Checks::PairMessage.process_notification(notification)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe CampfireChat::Checks do
4
+ let(:notification) { double }
5
+ describe '.process' do
6
+ module AwesomeCheck
7
+ extend CampfireChat::Checks
8
+
9
+ def self.process_notification(notification)
10
+
11
+ end
12
+ end
13
+
14
+ it 'sends the notification to all known Check objects' do
15
+ AwesomeCheck.should_receive(:process_notification).with(notification)
16
+ CampfireChat::Checks.process(notification)
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ describe CampfireChat::Client do
4
+ let(:room) { double(:recent => []) }
5
+ let(:config) { double(:room => 'room', :subdomain => 'sub', :token => 'token') }
6
+ let(:tinder_double) { double(:find_room_by_name => room) }
7
+ let(:client) { described_class.new(config) }
8
+
9
+ before do
10
+ Tinder::Campfire.stub(:new => tinder_double)
11
+ end
12
+
13
+ describe '#tinder' do
14
+ it 'builds a new tender box object' do
15
+ Tinder::Campfire.should_receive(:new).with(config.subdomain, :token => config.token)
16
+ client.tinder
17
+ end
18
+ end
19
+
20
+ describe '#messages' do
21
+
22
+ it 'returns message objects' do
23
+ room.stub(:recent => [build_message("Bob", 'another')])
24
+ client.messages.first.should be_a(CampfireChat::Message)
25
+ end
26
+
27
+ it 'stores the last ID of the previous request and only returns the new messages' do
28
+ raw_messages = [
29
+ build_message("Bob", "something more"),
30
+ build_message("Fred", "something else"),
31
+ build_message("Pete", "something again")
32
+ ]
33
+ room.stub(:recent => raw_messages)
34
+ client.last_message_id = raw_messages.first.id
35
+ messages = client.messages
36
+ messages.should have(2).message
37
+ messages.first.id.should == raw_messages[1].id
38
+ client.last_message_id.should == raw_messages[2].id
39
+ end
40
+
41
+ it 'does not store a nil ID if there are no new messages' do
42
+ messages = [
43
+ build_message("Bob", "something more"),
44
+ ]
45
+ room.stub(:recent => messages)
46
+ client.last_message_id = messages.first.id
47
+ client.last_message_id.should == messages.first.id
48
+ end
49
+
50
+ it 'excludes non TextMessage messages' do
51
+ raw_messages = [
52
+ build_message("Bob", "something more"),
53
+ build_message("Fred", "something else", 'RoomEnter'),
54
+ ]
55
+ room.stub(:recent => raw_messages)
56
+ messages = client.messages
57
+ messages.should have(1).message
58
+ end
59
+ end
60
+
61
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe CampfireChat::Configuration do
4
+ let(:config_hash) { {:room => 'room', :token => 'token', :subdomain => 'subdomain'} }
5
+ let(:config) { described_class.new(config_hash) }
6
+
7
+ describe '#add_pair' do
8
+ it 'adds an engineer to the pairs' do
9
+ config.add_pair 'Fred'
10
+ config.pairs.should have(1).pair
11
+ config.pairs.first.name.should == 'Fred'
12
+ end
13
+ end
14
+
15
+ describe '#room' do
16
+ it 'returns the campfire room' do
17
+ config.room.should == config_hash[:room]
18
+ end
19
+ end
20
+
21
+ describe '#token' do
22
+ it 'returns the campfire token' do
23
+ config.token.should == config_hash[:token]
24
+ end
25
+ end
26
+
27
+ describe '#subdomain' do
28
+ it 'returns the campfire subdomain' do
29
+ config.subdomain.should == config_hash[:subdomain]
30
+ end
31
+ end
32
+
33
+ describe '.build' do
34
+ context 'when a valid config file is present' do
35
+ let(:path) { fixture_path('campfire.yml') }
36
+ it 'loads configurations from the YAML file' do
37
+ config = described_class.build(path)
38
+ config.room.should == 'some room'
39
+ config.token.should == 'the-token'
40
+ config.subdomain.should == 'the-subdomain'
41
+ end
42
+ end
43
+
44
+ end
45
+
46
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe CampfireChat::Engineer do
4
+ let(:attributes) { {:name => 'Bob'}}
5
+ let(:engineer) { described_class.new(attributes) }
6
+ describe '#name' do
7
+ it 'returns the name of the engineer' do
8
+ engineer.name.should == attributes[:name]
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe CampfireChat::Message do
4
+ let(:raw_message) { build_message("Pete", "something again") }
5
+ let(:message) { described_class.new(raw_message) }
6
+
7
+ describe '#body' do
8
+ it 'returns the content of the message' do
9
+ message.body.should == raw_message.body
10
+ end
11
+ end
12
+
13
+ describe '#author' do
14
+ it 'returns the author of the message' do
15
+ message.author.should == raw_message.user.name
16
+ end
17
+ end
18
+
19
+ describe '#id' do
20
+ it 'returns the id of the message' do
21
+ message.id.should == raw_message.id
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,85 @@
1
+ require 'spec_helper'
2
+
3
+ describe CampfireChat::Monitor do
4
+ let(:monitor) { described_class.instance }
5
+
6
+ describe '#run' do
7
+
8
+ end
9
+
10
+ describe '#set_last_run_time' do
11
+ it 'sets the last run time to now' do
12
+ Time.stub(:now => 1)
13
+ monitor.set_last_run_time
14
+ monitor.last_run_time.should == 1
15
+ end
16
+
17
+ end
18
+
19
+ describe '#check_client?' do
20
+ context 'when the last_run_time is nil' do
21
+ before { monitor.last_run_time = nil }
22
+ it 'returns true' do
23
+ monitor.should be_check_client
24
+ end
25
+ end
26
+
27
+ context 'when the last_run_time is less than time.now' do
28
+ before { monitor.last_run_time = Time.now - 1000 }
29
+ it 'returns true' do
30
+ monitor.should be_check_client
31
+ end
32
+ end
33
+
34
+ context 'when the last_run_time has not exceeded the retry' do
35
+ before { monitor.last_run_time = Time.now - described_class.retry_time + 1 }
36
+ it 'returns false' do
37
+ monitor.should_not be_check_client
38
+ end
39
+ end
40
+
41
+ context 'when the last_run_time is more than time.now' do
42
+ before { monitor.last_run_time = Time.now + 100 }
43
+ it 'returns false' do
44
+ monitor.should_not be_check_client
45
+ end
46
+ end
47
+
48
+ end
49
+
50
+ describe '#check_messages' do
51
+ let(:notifier) { double(:push) }
52
+ before do
53
+ monitor.stub(:notifier => notifier)
54
+ end
55
+
56
+ it 'loops over the messages and prepares the notification' do
57
+ notification = double
58
+ new_message = double
59
+ monitor.client.stub(:messages => [new_message])
60
+ monitor.should_receive(:prepare_notification).with(new_message).and_return(notification)
61
+ notifier.should_receive(:push).with(notification)
62
+ monitor.check_messages
63
+ end
64
+ end
65
+
66
+ describe '#prepare_notification' do
67
+ it 'builds a new notification object' do
68
+ message = double
69
+ CampfireChat::Notification.should_receive(:build).with(message)
70
+ monitor.prepare_notification(message)
71
+ end
72
+ end
73
+
74
+ describe '#notifier' do
75
+ it 'returns the notifier instance' do
76
+ monitor.notifier.should be_a(CampfireChat::Notifier::Growl)
77
+ end
78
+ end
79
+
80
+ describe '#client' do
81
+ it 'returns the client instance' do
82
+ monitor.client.should be_a(CampfireChat::Client)
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+
3
+ describe CampfireChat::Notification do
4
+ let(:message) { double(:body => 'the body') }
5
+ let(:notification) { described_class.new(message) }
6
+
7
+ describe '#important?' do
8
+ context 'when default' do
9
+ it 'returns false' do
10
+ notification.should_not be_important
11
+ end
12
+ end
13
+
14
+ context 'when marked as important' do
15
+ it 'returns true' do
16
+ notification.important!
17
+ notification.should be_important
18
+ end
19
+ end
20
+ end
21
+
22
+ describe '#error?' do
23
+ context 'when default' do
24
+ it 'returns false' do
25
+ notification.should_not be_error
26
+ end
27
+ end
28
+
29
+ context 'when marked as error' do
30
+ it 'returns true' do
31
+ notification.error!
32
+ notification.should be_error
33
+ end
34
+ end
35
+ end
36
+
37
+ describe '#<<' do
38
+ it 'prepends strings to the message body' do
39
+ notification << 'YO'
40
+ notification.body.should == "YO\n#{message.body}"
41
+ end
42
+ end
43
+
44
+ describe '#add_title' do
45
+ it 'adds the title to the list of titles' do
46
+ notification.add_title 'YO'
47
+ notification.add_title 'MA'
48
+ notification.title.should == "YO\nMA"
49
+ end
50
+ end
51
+
52
+ describe '#body' do
53
+ it 'returns the message body' do
54
+ notification.body.should == message.body
55
+ end
56
+ end
57
+
58
+ describe '.build' do
59
+ it 'instantiates a new notification from the message' do
60
+ notification = described_class.build(message)
61
+ notification.message.should == message
62
+ end
63
+
64
+ it 'passes the notification into the Checks.process method' do
65
+ notification = double
66
+ described_class.stub(:new => notification)
67
+ CampfireChat::Checks.should_receive(:process).with(notification)
68
+ described_class.build(message)
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe CampfireChat::Notifier::Growl do
4
+ let(:notification) { double(:body => 'some message', :title => 'some title', :important? => false, :error? => false) }
5
+
6
+ let(:notifier) { described_class.instance }
7
+
8
+ describe '#push' do
9
+ it 'delegates to Growl' do
10
+ ::Growl.should_receive(:notify).with(notification.body, :title => notification.title, :sticky => notification.important?, :image => anything)
11
+ notifier.push notification
12
+ end
13
+ end
14
+
15
+ end
@@ -0,0 +1,27 @@
1
+ require 'campfire_chat'
2
+ # This file was generated by the `rspec --init` command. Conventionally, all
3
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
4
+ # Require this file using `require "spec_helper"` to ensure that it is only
5
+ # loaded once.
6
+ #
7
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
8
+ RSpec.configure do |config|
9
+ config.treat_symbols_as_metadata_keys_with_true_values = true
10
+ config.run_all_when_everything_filtered = true
11
+ config.filter_run :focus
12
+
13
+ # Run specs in random order to surface order dependencies. If you find an
14
+ # order dependency and want to debug it, you can fix the order by providing
15
+ # the seed, which is printed after each run.
16
+ # --seed 1234
17
+ config.order = 'random'
18
+ end
19
+
20
+ def fixture_path(file_name)
21
+ Pathname.new(File.dirname(__FILE__)).join('fixtures', file_name)
22
+ end
23
+
24
+ def build_message(user, message, type='TextMessage')
25
+ @message_id ||= 0
26
+ double(:user => double(:name => user), :body=> message, :user_id=>"1", :id=> @message_id += 1, :type => type)
27
+ end
metadata ADDED
@@ -0,0 +1,157 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: campfire_chat
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Richard Luther
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-05-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: tinder
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: growl
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Monitor a campfire room for messages to notify via growl
84
+ email:
85
+ - richard.luther@gmail.com
86
+ executables:
87
+ - campfire_chat
88
+ extensions: []
89
+ extra_rdoc_files: []
90
+ files:
91
+ - .gitignore
92
+ - .rspec
93
+ - Gemfile
94
+ - LICENSE.txt
95
+ - README.md
96
+ - Rakefile
97
+ - bin/campfire_chat
98
+ - campfire_chat.gemspec
99
+ - lib/campfire_chat.rb
100
+ - lib/campfire_chat/checks.rb
101
+ - lib/campfire_chat/checks/pair_message.rb
102
+ - lib/campfire_chat/client.rb
103
+ - lib/campfire_chat/configuration.rb
104
+ - lib/campfire_chat/engineer.rb
105
+ - lib/campfire_chat/message.rb
106
+ - lib/campfire_chat/monitor.rb
107
+ - lib/campfire_chat/notification.rb
108
+ - lib/campfire_chat/notifier/growl.rb
109
+ - lib/campfire_chat/version.rb
110
+ - notes.txt
111
+ - spec/fixtures/campfire.yml
112
+ - spec/lib/campfire_chat/checks/pair_message_spec.rb
113
+ - spec/lib/campfire_chat/checks_spec.rb
114
+ - spec/lib/campfire_chat/client_spec.rb
115
+ - spec/lib/campfire_chat/configuration_spec.rb
116
+ - spec/lib/campfire_chat/engineer_spec.rb
117
+ - spec/lib/campfire_chat/message_spec.rb
118
+ - spec/lib/campfire_chat/monitor_spec.rb
119
+ - spec/lib/campfire_chat/notification_spec.rb
120
+ - spec/lib/campfire_chat/notifier/growl_spec.rb
121
+ - spec/spec_helper.rb
122
+ homepage: ''
123
+ licenses:
124
+ - MIT
125
+ metadata: {}
126
+ post_install_message:
127
+ rdoc_options: []
128
+ require_paths:
129
+ - lib
130
+ required_ruby_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - '>='
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ required_rubygems_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - '>='
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ requirements: []
141
+ rubyforge_project:
142
+ rubygems_version: 2.0.3
143
+ signing_key:
144
+ specification_version: 4
145
+ summary: Monitor a campfire room for messages to notify via growl
146
+ test_files:
147
+ - spec/fixtures/campfire.yml
148
+ - spec/lib/campfire_chat/checks/pair_message_spec.rb
149
+ - spec/lib/campfire_chat/checks_spec.rb
150
+ - spec/lib/campfire_chat/client_spec.rb
151
+ - spec/lib/campfire_chat/configuration_spec.rb
152
+ - spec/lib/campfire_chat/engineer_spec.rb
153
+ - spec/lib/campfire_chat/message_spec.rb
154
+ - spec/lib/campfire_chat/monitor_spec.rb
155
+ - spec/lib/campfire_chat/notification_spec.rb
156
+ - spec/lib/campfire_chat/notifier/growl_spec.rb
157
+ - spec/spec_helper.rb