firebot 0.0.1.pre

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ .rvmrc
4
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in firebot.gemspec
4
+ gemspec
@@ -0,0 +1,46 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ firebot (0.0.1)
5
+ daemons (~> 1.1.0)
6
+ faraday (~> 0.5.7)
7
+ thor (~> 0.14.6)
8
+ twitter-stream (~> 0.1.10)
9
+ yajl-ruby (~> 0.8.1)
10
+
11
+ GEM
12
+ remote: http://rubygems.org/
13
+ specs:
14
+ addressable (2.2.4)
15
+ daemons (1.1.0)
16
+ diff-lcs (1.1.2)
17
+ eventmachine (0.12.10)
18
+ fakeweb (1.3.0)
19
+ faraday (0.5.7)
20
+ addressable (~> 2.2.4)
21
+ multipart-post (~> 1.1.0)
22
+ rack (< 2, >= 1.1.0)
23
+ multipart-post (1.1.0)
24
+ rack (1.2.2)
25
+ roauth (0.0.3)
26
+ rspec (2.5.0)
27
+ rspec-core (~> 2.5.0)
28
+ rspec-expectations (~> 2.5.0)
29
+ rspec-mocks (~> 2.5.0)
30
+ rspec-core (2.5.1)
31
+ rspec-expectations (2.5.0)
32
+ diff-lcs (~> 1.1.2)
33
+ rspec-mocks (2.5.0)
34
+ thor (0.14.6)
35
+ twitter-stream (0.1.12)
36
+ eventmachine (>= 0.12.8)
37
+ roauth (>= 0.0.2)
38
+ yajl-ruby (0.8.1)
39
+
40
+ PLATFORMS
41
+ ruby
42
+
43
+ DEPENDENCIES
44
+ fakeweb (~> 1.3.0)
45
+ firebot!
46
+ rspec (~> 2.5.0)
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2011 Marcelo Silveira
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
@@ -0,0 +1,48 @@
1
+ Firebot
2
+ =========
3
+
4
+ Firebot is a bot for Campfire, the chat application from 37Signals, that offers an extensible
5
+ interface to programmatically integrate it with other applications/services.
6
+
7
+ WARNING
8
+ -------
9
+
10
+ FIREBOT IS UNDER DEVELOPMENT. NO STABLE RELEASE IS AVAILABLE.
11
+
12
+ Usage
13
+ -----
14
+
15
+ Firebot comes with its own executable. `firebot` in the terminal
16
+ gives you its options:
17
+
18
+ Tasks:
19
+ firebot create_config # Create a sample config file in ~/.firebot
20
+ firebot help [TASK] # Describe available tasks or one specific task
21
+ firebot start # Startup the Firebot daemon
22
+ firebot stop # Stop the Firebot daemon
23
+
24
+ The steps to get it up and running are:
25
+
26
+ 1. Run `firebot create_config`
27
+ 2. Tweak the config file in `~/.firebot`
28
+ 3. Run `firebot start`
29
+
30
+ Supported Applications/Services
31
+ -------------------------------
32
+
33
+ PingPong: dummy plugin to check the plugins interface.
34
+
35
+ Meta
36
+ ----
37
+
38
+ * Home: <https://github.com/mhfs/firebot/>
39
+
40
+ Author
41
+ ------
42
+
43
+ Marcelo Silveira :: marcelo@mhfs.com.br :: @mhfsilveira
44
+
45
+ License
46
+ -------
47
+
48
+ Firebot is released under the MIT Licence. Copyright &copy; 2011 Marcelo Silveira.
@@ -0,0 +1,13 @@
1
+ $LOAD_PATH.unshift 'lib'
2
+
3
+ require "bundler"
4
+ require "rspec/core/rake_task"
5
+
6
+ require "firebot/tasks"
7
+
8
+ Bundler::GemHelper.install_tasks
9
+
10
+ desc "Run specs"
11
+ RSpec::Core::RakeTask.new do |t|
12
+ t.pattern = "./spec/**/*_spec.rb"
13
+ end
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "rubygems"
4
+ require "firebot"
5
+
6
+ Firebot::CLI.start
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "firebot/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "firebot"
7
+ s.version = Firebot::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Marcelo Silveira"]
10
+ s.email = "marcelo@mhfs.com.br"
11
+ s.homepage = "https://github.com/mhfs/firebot"
12
+ s.summary = "Extensible Campfire bot to integrate with other applications/services"
13
+ s.description = "Extensible Campfire bot to integrate with other applications/services"
14
+
15
+ s.rubyforge_project = "firebot"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_dependency "twitter-stream", "~> 0.1.10"
23
+ s.add_dependency "faraday", "~> 0.5.7"
24
+ s.add_dependency "yajl-ruby", "~> 0.8.1"
25
+ s.add_dependency "daemons", "~> 1.1.0"
26
+ s.add_dependency "thor", "~> 0.14.6"
27
+
28
+ s.add_development_dependency "rspec", "~> 2.5.0"
29
+ s.add_development_dependency "fakeweb", "~> 1.3.0"
30
+ end
@@ -0,0 +1,33 @@
1
+ require "twitter/json_stream"
2
+ require "faraday"
3
+ require "daemons"
4
+ require "thor"
5
+ require "json"
6
+
7
+ require "firebot/settings"
8
+ require "firebot/exceptions"
9
+ require "firebot/campfire"
10
+ require "firebot/runner"
11
+ require "firebot/listener"
12
+ require "firebot/cli"
13
+ require "firebot/version"
14
+ require "firebot/plugin"
15
+
16
+ module Firebot
17
+ def self.run
18
+ EventMachine.run do
19
+ Listener.connect(Settings.stream_settings)
20
+ end
21
+ end
22
+
23
+ def self.register_plugin(identifier, handler)
24
+ @plugins ||= {}
25
+ @plugins[identifier.to_s] = handler.new
26
+ end
27
+
28
+ def self.plugins
29
+ @plugins
30
+ end
31
+ end
32
+
33
+ require "firebot/plugins/ping_pong"
@@ -0,0 +1,36 @@
1
+ module Firebot
2
+ module Campfire
3
+ def self.join_room
4
+ post :join
5
+ end
6
+
7
+ def self.leave_room
8
+ post :leave
9
+ end
10
+
11
+ def self.speak(message)
12
+ post :speak, {:message => {:body => message, :type => "TextMessage"}}
13
+ end
14
+
15
+ private
16
+
17
+ def self.connection
18
+ @connection ||= Faraday.new(:url => account_host) do |builder|
19
+ builder.use Faraday::Request::Yajl
20
+ builder.adapter Faraday.default_adapter
21
+ builder.headers['Content-Type'] = 'application/json'
22
+ builder.basic_auth Settings[:token], "x"
23
+ end
24
+ end
25
+
26
+ def self.post(action, body = nil)
27
+ res = connection.post "/room/#{Settings[:room_id]}/#{action}.json", body
28
+ raise UnauthorizedException if res.status == 401
29
+ res
30
+ end
31
+
32
+ def self.account_host
33
+ "https://#{Settings[:account]}.#{Settings[:host]}"
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,48 @@
1
+ module Firebot
2
+ class CLI < Thor
3
+ include Thor::Actions
4
+
5
+ desc "start", "Startup the Firebot daemon"
6
+ method_option :daemonize, :aliases => "-d",
7
+ :default => true, :type => :boolean, :banner => "true|false",
8
+ :desc => "Defines if the bot will run as a daemon or attached to the terminal"
9
+ def start
10
+ sanity_check!
11
+ command = options[:daemonize] ? "start" : "run"
12
+ daemon_exec(command)
13
+ end
14
+
15
+ desc "stop", "Stop the Firebot daemon"
16
+ def stop
17
+ daemon_exec("stop")
18
+ end
19
+
20
+ desc "create_config", "Create a sample config file in ~/.firebot"
21
+ def create_config
22
+ template("cli/config.tt", "~/.firebot")
23
+ say "Go tweak ~/.firebot"
24
+ end
25
+
26
+ def self.source_root
27
+ File.dirname(__FILE__)
28
+ end
29
+
30
+ no_tasks do
31
+ def sanity_check!
32
+ unless File.exist?(File.expand_path(Settings.config_path))
33
+ abort "No configuration file found in #{Settings.config_path}. Create one with `firebot create_config` and try again."
34
+ end
35
+ end
36
+
37
+ def daemon_exec(command)
38
+ Daemons.run_proc("firebot", { :ARGV => [command] }, &daemon_proc)
39
+ end
40
+
41
+ def daemon_proc
42
+ lambda do
43
+ Firebot.run
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,3 @@
1
+ account: "your_subdomain"
2
+ path: "/room/your_room_id/live.json"
3
+ token: "your_api_token"
@@ -0,0 +1,3 @@
1
+ module Firebot
2
+ UnauthorizedException = Class.new(StandardError)
3
+ end
@@ -0,0 +1,29 @@
1
+ module Firebot
2
+ class Listener < Twitter::JSONStream
3
+ def self.connect(options = {})
4
+ Campfire.join_room
5
+ conn = super(options)
6
+
7
+ conn.each_item do |message|
8
+ Runner.execute(message)
9
+ end
10
+
11
+ conn.on_error do |message|
12
+ #TODO improve error handling
13
+ Campfire.leave_room
14
+ EventMachine.stop
15
+ end
16
+
17
+ conn.on_max_reconnects do |timeout, retries|
18
+ #TODO improve error handling
19
+ EventMachine.stop
20
+ end
21
+
22
+ conn
23
+ end
24
+
25
+ def unbind
26
+ Campfire.leave_room
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,36 @@
1
+ module Firebot
2
+ class Plugin
3
+ class << self
4
+ attr_accessor :commands
5
+ end
6
+
7
+ def self.trigger(identifier)
8
+ Firebot.register_plugin(identifier, self)
9
+ end
10
+
11
+ def self.command(command, regex)
12
+ @commands ||= {}
13
+ @commands[regex] = command
14
+ end
15
+
16
+ def run(cmd)
17
+ cmd.strip!
18
+ matched = false
19
+ self.class.commands.each do |regex, method|
20
+ if cmd =~ regex
21
+ send(method)
22
+ matched = true
23
+ end
24
+ end
25
+ reply(help) unless matched
26
+ end
27
+
28
+ def help
29
+ raise NotImplementedError
30
+ end
31
+
32
+ def reply(message)
33
+ Campfire.speak(message)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,19 @@
1
+ module Firebot
2
+ class PingPong < Plugin
3
+ trigger :pp
4
+ command :ping, /ping/
5
+ command :pong, /pong/
6
+
7
+ def help
8
+ "Usage: !pp ping or !pp pong"
9
+ end
10
+
11
+ def ping
12
+ reply("pong")
13
+ end
14
+
15
+ def pong
16
+ reply("ping")
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,32 @@
1
+ module Firebot
2
+ class Runner
3
+ COMMAND_MATCHER = /^!(\w+)/
4
+
5
+ attr_accessor :message
6
+
7
+ def self.execute(json_message)
8
+ msg = JSON.parse(json_message)
9
+ new(msg).run if msg["type"] == "TextMessage"
10
+ end
11
+
12
+ def initialize(message)
13
+ @message = message
14
+ end
15
+
16
+ def run
17
+ if message["body"] =~ COMMAND_MATCHER
18
+ if Firebot.plugins[$1]
19
+ Firebot.plugins[$1].run(plugin_message(message["body"], $1))
20
+ else
21
+ Campfire.speak("No plugin respond to #{$1}.")
22
+ end
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def plugin_message(full_message, prefix)
29
+ full_message.gsub(/^!#{prefix}/, "")
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,38 @@
1
+ module Firebot
2
+ module Settings
3
+ def self.all
4
+ @settings ||= begin
5
+ options = {
6
+ "stream_host" => "streaming.campfirenow.com",
7
+ "stream_port" => "80",
8
+ "host" => "campfirenow.com"
9
+ }
10
+ user_options = YAML.load(File.read(File.expand_path(config_path))).to_hash
11
+ options.merge!(user_options)
12
+ options["path"] = "/room/#{options["room_id"]}/live.json"
13
+ options
14
+ end
15
+ end
16
+
17
+ def self.[](key)
18
+ all[key.to_s]
19
+ end
20
+
21
+ def self.config_path
22
+ @config_path ||= "~/.firebot"
23
+ end
24
+
25
+ def self.config_path=(path)
26
+ @config_path = path
27
+ end
28
+
29
+ def self.stream_settings
30
+ {
31
+ :path => "/room/#{self[:room_id]}/live.json",
32
+ :host => self[:stream_host],
33
+ :port => self[:stream_port],
34
+ :auth => "#{self[:token]}:x"
35
+ }
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,8 @@
1
+ require "firebot"
2
+
3
+ namespace :firebot do
4
+ desc "run the bot"
5
+ task :run do
6
+ Firebot::Daemon.run
7
+ end
8
+ end
@@ -0,0 +1,3 @@
1
+ module Firebot
2
+ VERSION = "0.0.1.pre"
3
+ end
@@ -0,0 +1,42 @@
1
+ require "spec_helper"
2
+
3
+ describe Firebot::Campfire do
4
+ before do
5
+ @join_uri = "https://12345:x@test.campfirenow.com/room/123/join.json"
6
+ @leave_uri = "https://12345:x@test.campfirenow.com/room/123/leave.json"
7
+ end
8
+
9
+ context ".join_room" do
10
+ it "should reach the join room endpoint" do
11
+ FakeWeb.register_uri(:post, @join_uri, :body => "", :status => ["200", "OK"])
12
+
13
+ res = Firebot::Campfire.join_room
14
+ res.status.should == 200
15
+ end
16
+
17
+ it "should raise an exception if connection doesn't succeed" do
18
+ FakeWeb.register_uri(:post, @join_uri, :body => "", :status => ["401", "Unauthorized"])
19
+
20
+ expect {
21
+ Firebot::Campfire.join_room
22
+ }.to raise_error(Firebot::UnauthorizedException)
23
+ end
24
+ end
25
+
26
+ context ".leave_room" do
27
+ it "should reach the leave room endpoint" do
28
+ FakeWeb.register_uri(:post, @leave_uri, :body => "", :status => ["200", "OK"])
29
+
30
+ res = Firebot::Campfire.leave_room
31
+ res.status.should == 200
32
+ end
33
+
34
+ it "should raise an exception if connection doesn't succeed" do
35
+ FakeWeb.register_uri(:post, @leave_uri, :body => "", :status => ["401", "Unauthorized"])
36
+
37
+ expect {
38
+ Firebot::Campfire.leave_room
39
+ }.to raise_error(Firebot::UnauthorizedException)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,21 @@
1
+ require "spec_helper"
2
+
3
+ describe Firebot::CLI do
4
+ context "#sanity_check!" do
5
+ it "should complain if config file is not in place" do
6
+ swap Firebot::Settings, :config_path => "path/to/nowhere" do
7
+ lambda do
8
+ cli = Firebot::CLI.new
9
+ cli.sanity_check!
10
+ end.should raise_error(SystemExit)
11
+ end
12
+ end
13
+
14
+ it "should let execution if settings path is correct" do
15
+ lambda do
16
+ cli = Firebot::CLI.new
17
+ cli.sanity_check!
18
+ end.should_not raise_error
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,7 @@
1
+ account: "test"
2
+ room_id: "123"
3
+ path: "/room/123/live.json"
4
+ token: "12345"
5
+ stream_host: "127.0.0.1"
6
+ stream_port: 4321
7
+ host: "campfirenow.com"
@@ -0,0 +1,8 @@
1
+ HTTP/1.1 200 OK
2
+ Content-Type: application/json
3
+ Transfer-Encoding: chunked
4
+ Server: Jetty(6.1.17)
5
+
6
+ {"room_id":123,"created_at":"2011/03/10 03:07:51 +0000","body":"nice message","id":322347135,"user_id":321,"type":"TextMessage"}
7
+
8
+ {"room_id":123,"created_at":"2011/03/10 03:07:51 +0000","body":"nice message","id":322347135,"user_id":321,"type":"TextMessage"}
@@ -0,0 +1,18 @@
1
+ require "spec_helper"
2
+
3
+ describe Firebot::Listener do
4
+ before do
5
+ @join_uri = "https://12345:x@test.campfirenow.com/room/123/join.json"
6
+ @leave_uri = "https://12345:x@test.campfirenow.com/room/123/leave.json"
7
+
8
+ FakeWeb.register_uri(:post, @join_uri, :body => "", :status => ["200", "OK"])
9
+ FakeWeb.register_uri(:post, @leave_uri, :body => "", :status => ["200", "OK"])
10
+ end
11
+
12
+ it "should listen do stream and trigger command execution" do
13
+ message_content = '{"room_id":123,"created_at":"2011/03/10 03:07:51 +0000","body":"nice message","id":322347135,"user_id":321,"type":"TextMessage"}'
14
+ Firebot::Runner.should_receive(:execute).with(message_content).twice
15
+
16
+ consume_stream
17
+ end
18
+ end
@@ -0,0 +1,7 @@
1
+ require "spec_helper"
2
+
3
+ describe Firebot::Runner do
4
+ it "should respond to execute" do
5
+ Firebot::Runner.should respond_to(:execute)
6
+ end
7
+ end
@@ -0,0 +1,16 @@
1
+ require "spec_helper"
2
+
3
+ describe Firebot::Settings do
4
+ context ".all" do
5
+ it "should return hash" do
6
+ Firebot::Settings.all.should be_instance_of(Hash)
7
+ end
8
+ end
9
+
10
+ context ".[]" do
11
+ it "should return setting key" do
12
+ Firebot::Settings[:host].should == "campfirenow.com"
13
+ Firebot::Settings[:room_id].should == "123"
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ require "fakeweb"
2
+ require "firebot"
3
+ require "rspec/mocks"
4
+
5
+ Dir[File.expand_path('../support/**/*.rb', __FILE__)].each { |f| require f }
6
+
7
+ FakeWeb.allow_net_connect = false
8
+
9
+ Firebot::Settings.config_path = File.expand_path("spec/fixtures/config.yml")
10
+
11
+ RSpec.configure do |config|
12
+ config.before(:each) { FakeWeb.clean_registry }
13
+ end
@@ -0,0 +1,12 @@
1
+ def swap(object, attrs = {})
2
+ old_values = {}
3
+ attrs.each do |key, value|
4
+ old_values[key] = object.send key
5
+ object.send "#{key}=", value
6
+ end
7
+ yield
8
+ ensure
9
+ old_values.each do |key, value|
10
+ object.send :"#{key}=", value
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+ class JSONServer < EM::Connection
2
+ SAMPLE_DATA = File.read(File.expand_path("../../fixtures/sample_response.txt", __FILE__))
3
+
4
+ def receive_data(data)
5
+ send_data(SAMPLE_DATA)
6
+ end
7
+ end
8
+
9
+ def consume_stream
10
+ host = "127.0.0.1"
11
+ port = 4321
12
+ EM.run {
13
+ EM.start_server host, port, JSONServer
14
+ Firebot::Listener.connect(Firebot::Settings.stream_settings)
15
+ EM.add_timer(0.01){ EM.stop }
16
+ }
17
+ end
metadata ADDED
@@ -0,0 +1,171 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: firebot
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: 6
5
+ version: 0.0.1.pre
6
+ platform: ruby
7
+ authors:
8
+ - Marcelo Silveira
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-04-28 00:00:00 -03:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: twitter-stream
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ~>
23
+ - !ruby/object:Gem::Version
24
+ version: 0.1.10
25
+ type: :runtime
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday
29
+ prerelease: false
30
+ requirement: &id002 !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ~>
34
+ - !ruby/object:Gem::Version
35
+ version: 0.5.7
36
+ type: :runtime
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
39
+ name: yajl-ruby
40
+ prerelease: false
41
+ requirement: &id003 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: 0.8.1
47
+ type: :runtime
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
50
+ name: daemons
51
+ prerelease: false
52
+ requirement: &id004 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ~>
56
+ - !ruby/object:Gem::Version
57
+ version: 1.1.0
58
+ type: :runtime
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
61
+ name: thor
62
+ prerelease: false
63
+ requirement: &id005 !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 0.14.6
69
+ type: :runtime
70
+ version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
72
+ name: rspec
73
+ prerelease: false
74
+ requirement: &id006 !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ~>
78
+ - !ruby/object:Gem::Version
79
+ version: 2.5.0
80
+ type: :development
81
+ version_requirements: *id006
82
+ - !ruby/object:Gem::Dependency
83
+ name: fakeweb
84
+ prerelease: false
85
+ requirement: &id007 !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ~>
89
+ - !ruby/object:Gem::Version
90
+ version: 1.3.0
91
+ type: :development
92
+ version_requirements: *id007
93
+ description: Extensible Campfire bot to integrate with other applications/services
94
+ email: marcelo@mhfs.com.br
95
+ executables:
96
+ - firebot
97
+ extensions: []
98
+
99
+ extra_rdoc_files: []
100
+
101
+ files:
102
+ - .gitignore
103
+ - .rspec
104
+ - Gemfile
105
+ - Gemfile.lock
106
+ - MIT-LICENSE
107
+ - README.md
108
+ - Rakefile
109
+ - bin/firebot
110
+ - firebot.gemspec
111
+ - lib/firebot.rb
112
+ - lib/firebot/campfire.rb
113
+ - lib/firebot/cli.rb
114
+ - lib/firebot/cli/config.tt
115
+ - lib/firebot/exceptions.rb
116
+ - lib/firebot/listener.rb
117
+ - lib/firebot/plugin.rb
118
+ - lib/firebot/plugins/ping_pong.rb
119
+ - lib/firebot/runner.rb
120
+ - lib/firebot/settings.rb
121
+ - lib/firebot/tasks.rb
122
+ - lib/firebot/version.rb
123
+ - spec/campfire_spec.rb
124
+ - spec/cli_spec.rb
125
+ - spec/fixtures/config.yml
126
+ - spec/fixtures/sample_response.txt
127
+ - spec/listener_spec.rb
128
+ - spec/runner_spec.rb
129
+ - spec/settings_spec.rb
130
+ - spec/spec_helper.rb
131
+ - spec/support/attr_switcher.rb
132
+ - spec/support/em_helpers.rb
133
+ has_rdoc: true
134
+ homepage: https://github.com/mhfs/firebot
135
+ licenses: []
136
+
137
+ post_install_message:
138
+ rdoc_options: []
139
+
140
+ require_paths:
141
+ - lib
142
+ required_ruby_version: !ruby/object:Gem::Requirement
143
+ none: false
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: "0"
148
+ required_rubygems_version: !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ">"
152
+ - !ruby/object:Gem::Version
153
+ version: 1.3.1
154
+ requirements: []
155
+
156
+ rubyforge_project: firebot
157
+ rubygems_version: 1.6.2
158
+ signing_key:
159
+ specification_version: 3
160
+ summary: Extensible Campfire bot to integrate with other applications/services
161
+ test_files:
162
+ - spec/campfire_spec.rb
163
+ - spec/cli_spec.rb
164
+ - spec/fixtures/config.yml
165
+ - spec/fixtures/sample_response.txt
166
+ - spec/listener_spec.rb
167
+ - spec/runner_spec.rb
168
+ - spec/settings_spec.rb
169
+ - spec/spec_helper.rb
170
+ - spec/support/attr_switcher.rb
171
+ - spec/support/em_helpers.rb