firebot 0.0.1.pre

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,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