robit 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.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/Gemfile +17 -0
- data/Rakefile +33 -0
- data/Readme.md +3 -0
- data/VERSION +1 -0
- data/bin/robit +95 -0
- data/lib/robit.rb +3 -0
- data/lib/robit/metadata.rb +28 -0
- data/lib/robit/plugins/alias_nick.rb +190 -0
- data/lib/robit/plugins/status.rb +75 -0
- data/robit.gemspec +29 -0
- data/start.sh +20 -0
- data/test.sh +8 -0
- metadata +197 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 02d1b158b2bc49358abeacbeedc00010bc121c48
|
4
|
+
data.tar.gz: 23507548cd768c1f65617c2f7833737b902f0997
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7fa9e47a7bba52f516857e402ed05b15fe51882adcfc4bec3732f16ec5e79a60ce9838e8c1f02230f38b23e6b4475b35adee882fe5a98684a8741a5ae9b84a51
|
7
|
+
data.tar.gz: b57810f74891d858fe399bc7432c9b773a2aebb4e71995db2d84d96c8084166b4eeb40f63c74b9b1db1c7f7a935c17035c93b252dc78d0b6db640d4215138e98
|
data/.gitignore
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gemspec
|
4
|
+
|
5
|
+
gem 'robut', git: 'git://git/inf/robut.git'
|
6
|
+
|
7
|
+
group :development do
|
8
|
+
gem 'pry'
|
9
|
+
gem 'rake'
|
10
|
+
gem 'yard'
|
11
|
+
gem 'version'
|
12
|
+
gem 'rubygems-tasks'
|
13
|
+
end
|
14
|
+
|
15
|
+
group :test do
|
16
|
+
gem 'minitest'
|
17
|
+
end
|
data/Rakefile
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
require 'rake'
|
4
|
+
|
5
|
+
|
6
|
+
require 'rake/testtask'
|
7
|
+
Rake::TestTask.new(:test) do |test|
|
8
|
+
test.libs << 'lib' << 'test'
|
9
|
+
test.test_files = FileList['test/test*.rb']
|
10
|
+
test.verbose = true
|
11
|
+
end
|
12
|
+
|
13
|
+
task :default => :test
|
14
|
+
|
15
|
+
|
16
|
+
require 'yard'
|
17
|
+
YARD::Rake::YardocTask.new do |t|
|
18
|
+
t.files = %w[ --readme Readme.md lib/**/*.rb - VERSION ]
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
require 'rubygems/tasks'
|
23
|
+
Gem::Tasks.new({
|
24
|
+
push: false,
|
25
|
+
sign: {}
|
26
|
+
}) do |tasks|
|
27
|
+
tasks.console.command = 'pry'
|
28
|
+
end
|
29
|
+
Gem::Tasks::Sign::Checksum.new sha2: true
|
30
|
+
|
31
|
+
|
32
|
+
require 'rake/version_task'
|
33
|
+
Rake::VersionTask.new
|
data/Readme.md
ADDED
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
data/bin/robit
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'robut'
|
3
|
+
require 'robut/storage/hash_store'
|
4
|
+
require 'robut/storage/yaml_store'
|
5
|
+
require 'robut/plugin/calc'
|
6
|
+
require 'robut/plugin/pick'
|
7
|
+
require 'robut/plugin/quips'
|
8
|
+
require 'robut/plugin/lunch'
|
9
|
+
require 'robut/plugin/later'
|
10
|
+
require 'robut/plugin/help'
|
11
|
+
require 'robut/plugin/ping'
|
12
|
+
require 'robut/plugin/echo'
|
13
|
+
require 'robut/plugin/alias'
|
14
|
+
require 'robut_quiz'
|
15
|
+
require 'ostruct'
|
16
|
+
require 'logger'
|
17
|
+
require 'trollop'
|
18
|
+
require 'hipchat'
|
19
|
+
|
20
|
+
require_relative '../lib/robit'
|
21
|
+
|
22
|
+
|
23
|
+
Opts = Trollop::options do
|
24
|
+
version Robit::VERSION
|
25
|
+
banner Robit::ART + "\n\n" + <<-EOS.gsub(/^ /, '')
|
26
|
+
#{Robit::SUMMARY}
|
27
|
+
|
28
|
+
Usage: robit [<options>]
|
29
|
+
|
30
|
+
Options:
|
31
|
+
EOS
|
32
|
+
opt :jid, "Jabber ID", type: :string, required: true, short: 'j'
|
33
|
+
opt :pass, "Jabber password", type: :string, required: true, short: 'p'
|
34
|
+
opt :nick, "HipChat @mention name", type: :string, required: true, short: 'n'
|
35
|
+
opt :name, "HipChat full name", type: :string, required: true, short: 'N'
|
36
|
+
opt :rooms, "Hipchat rooms", type: :string, required: true, short: 'r'
|
37
|
+
opt :api_key, "HipChat v1 API key", type: :string, required: true, short: 'k'
|
38
|
+
end
|
39
|
+
|
40
|
+
short_room_names = Opts[:rooms].split(',')
|
41
|
+
|
42
|
+
|
43
|
+
Robut::Connection.configure do |config|
|
44
|
+
config.jid = Opts[:jid]
|
45
|
+
config.password = Opts[:pass]
|
46
|
+
config.mention_name = Opts[:nick]
|
47
|
+
config.nick = Opts[:name]
|
48
|
+
config.rooms = Opts[:rooms].split(',')
|
49
|
+
Robut::Storage::YamlStore.file = ".robut_store"
|
50
|
+
config.store = Robut::Storage::YamlStore
|
51
|
+
config.logger = Logger.new(STDOUT)
|
52
|
+
|
53
|
+
config.nick_db = Daybreak::DB.new '.nick.db', default: []
|
54
|
+
|
55
|
+
config.hipchat = HipChat::Client.new Opts[:api_key]
|
56
|
+
|
57
|
+
config.hipchat_rooms = []
|
58
|
+
hipchat_rooms = config.hipchat.rooms
|
59
|
+
|
60
|
+
raise 'No rooms!' if hipchat_rooms.length.zero?
|
61
|
+
|
62
|
+
hipchat_rooms.each_with_index do |r, i|
|
63
|
+
next unless short_room_names.include? r.xmpp_jid
|
64
|
+
puts 'room_name: %s, room: %s' % [
|
65
|
+
r.name.downcase_and_snakify, r.inspect
|
66
|
+
]
|
67
|
+
config.hipchat_rooms << {
|
68
|
+
'xmpp_jid' => r.xmpp_jid,
|
69
|
+
'name' => r.name,
|
70
|
+
'raw' => r
|
71
|
+
}
|
72
|
+
short_room_names.delete r.xmpp_jid
|
73
|
+
sleep 3 # So we don't blow the API rate limit
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
raise short_room_names.inspect unless short_room_names.empty?
|
78
|
+
|
79
|
+
|
80
|
+
Robut::Plugin.plugins = [
|
81
|
+
Robut::Plugin::Alias,
|
82
|
+
Robut::Plugin::Quiz,
|
83
|
+
Robut::Plugin::Ping,
|
84
|
+
Robut::Plugin::Echo,
|
85
|
+
Robut::Plugin::Calc,
|
86
|
+
Robut::Plugin::Pick,
|
87
|
+
Robut::Plugin::Quips,
|
88
|
+
Robut::Plugin::Lunch,
|
89
|
+
Robut::Plugin::Later,
|
90
|
+
Robut::Plugin::Help,
|
91
|
+
Robut::Plugin::AliasNick
|
92
|
+
]
|
93
|
+
|
94
|
+
Robut::Web.set :connection, Robut::Connection.new.connect
|
95
|
+
loop { sleep 1 }
|
data/lib/robit.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
module Robit
|
2
|
+
|
3
|
+
# We use a VERSION file to tie into our build pipeline
|
4
|
+
VERSION = File.read(File.join(File.dirname(__FILE__), '..', '..', 'VERSION')).strip
|
5
|
+
|
6
|
+
# We don't really do all that much, be humble
|
7
|
+
SUMMARY = 'Like Robut, but better and pronounced correctly'
|
8
|
+
|
9
|
+
# Your benevolent dictator for life
|
10
|
+
AUTHOR = 'Sean Clemmer'
|
11
|
+
|
12
|
+
# Turn here to strangle your dictator
|
13
|
+
EMAIL = 'sclemmer@bluejeans.com'
|
14
|
+
|
15
|
+
# Every project deserves its own ASCII art
|
16
|
+
ART = <<-'EOART' % VERSION
|
17
|
+
|
18
|
+
_ .-') .-. .-') .-') _
|
19
|
+
( \( -O ) \ ( OO ) ( OO) )
|
20
|
+
,------. .-'),-----. ;-----.\ ,-.-') / '._
|
21
|
+
| /`. '( OO' .-. '| .-. | | |OO)|'--...__)
|
22
|
+
| / | |/ | | | || '-' /_) | | \'--. .--'
|
23
|
+
| |_.' |\_) | |\| || .-. `. | |(_/ | |
|
24
|
+
| . '.' \ | | | || | \ | ,| |_.' | |
|
25
|
+
| |\ \ `' '-' '| '--' /(_| | | |
|
26
|
+
`--' '--' `-----' `------' `--' `--' v%s
|
27
|
+
EOART
|
28
|
+
end
|
@@ -0,0 +1,190 @@
|
|
1
|
+
require 'hipchat'
|
2
|
+
require 'daybreak'
|
3
|
+
require 'shellwords'
|
4
|
+
|
5
|
+
class String
|
6
|
+
# Like a downcase, de-camelcaser:
|
7
|
+
# test => test
|
8
|
+
# Test => test
|
9
|
+
# OpsOnly => ops_only
|
10
|
+
def downcase_and_snakify
|
11
|
+
self.gsub(/\s+/,'').gsub(/([A-Z])/, '_\1').delete('@').sub(/^_/, '').downcase
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
class Robut::Plugin::AliasNick
|
18
|
+
include Robut::Plugin
|
19
|
+
|
20
|
+
|
21
|
+
def usage
|
22
|
+
'#alias <nick> <rooms> - When mentioning <nick>, <rooms> will be notified'
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def handle time, sender_nick, message
|
27
|
+
if message =~ /^#aliases\s+@??(.+)/
|
28
|
+
handle_aliases "@#{$1}"
|
29
|
+
elsif message =~ /^#alias\s+@??(.+?)\s+(@.*+)/
|
30
|
+
handle_alias "@#{$1}", $2.split(' ')
|
31
|
+
elsif sent_to_me?(message)
|
32
|
+
# nop
|
33
|
+
else
|
34
|
+
mentions = message.scan /@\S+/
|
35
|
+
handle_notification sender_nick, mentions, message
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def handle_aliases nick
|
43
|
+
puts 'handle_aliases nick=%s' % nick.inspect
|
44
|
+
rooms = db[nick]
|
45
|
+
if rooms.empty?
|
46
|
+
reply "Couldn't find any aliases."
|
47
|
+
else
|
48
|
+
reply rooms.join(', ')
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
def handle_alias nick, rooms
|
54
|
+
puts 'handle_alias nick=%s rooms=%s' % [ nick.inspect, rooms.inspect ]
|
55
|
+
db.lock { db[nick] = rooms }
|
56
|
+
db.flush
|
57
|
+
reply affirmation
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
def handle_notification from, mentions, message
|
62
|
+
puts 'handle_notification from=%s mentions=%s message=%s' % [
|
63
|
+
from.inspect, mentions.inspect, message.inspect
|
64
|
+
]
|
65
|
+
|
66
|
+
tos = mentions.select { |m| db.keys.include? m }
|
67
|
+
|
68
|
+
|
69
|
+
tos.each do |to|
|
70
|
+
|
71
|
+
db[to].each do |name|
|
72
|
+
rroom, hroom = nil, nil
|
73
|
+
|
74
|
+
if name =~ /^@/
|
75
|
+
rroom = robut_room name
|
76
|
+
raise if rroom.nil?
|
77
|
+
hroom = hipchat_room rroom.name
|
78
|
+
raise if hroom.nil?
|
79
|
+
end
|
80
|
+
|
81
|
+
subject = '%s mentioned "%s" in "%s"' % [
|
82
|
+
from, name, current_room
|
83
|
+
]
|
84
|
+
|
85
|
+
notification = "<i>%s</i> writes in <b>%s</b>: <i>%s</i>" % [
|
86
|
+
from, current_room, highlight(message, to)
|
87
|
+
]
|
88
|
+
|
89
|
+
if name =~ /^@/
|
90
|
+
handle_hipchat_notification notification, hroom
|
91
|
+
else
|
92
|
+
handle_email_notification subject, notification, name
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
reply "Notified #{to_sentence db[to]}."
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
|
101
|
+
def handle_hipchat_notification notification, hroom
|
102
|
+
puts 'handle_hipchat_notification notification=%s hroom=%s' % [
|
103
|
+
notification.inspect, hroom.inspect
|
104
|
+
]
|
105
|
+
|
106
|
+
hipchat[hroom['name']].send \
|
107
|
+
reply_to.connection.config.nick, notification, \
|
108
|
+
message_format: :html, notify: true
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
def handle_email_notification subject, notification, email_alias
|
113
|
+
puts 'handle_email_notification subject=%s notification=%s email_alias=%s' % [
|
114
|
+
subject.inspect, notification.inspect, email_alias.inspect
|
115
|
+
]
|
116
|
+
|
117
|
+
send_email = 'echo %s | mail -a %s -a %s -s %s %s' % [
|
118
|
+
Shellwords::escape(notification),
|
119
|
+
Shellwords::escape('From: noreply@bluejeansnet.com'),
|
120
|
+
Shellwords::escape('Content-Type: text/html'),
|
121
|
+
Shellwords::escape(subject),
|
122
|
+
"#{email_alias}@bluejeansnet.com"
|
123
|
+
]
|
124
|
+
|
125
|
+
system send_email
|
126
|
+
end
|
127
|
+
|
128
|
+
|
129
|
+
################################################################################
|
130
|
+
|
131
|
+
|
132
|
+
def to_sentence array
|
133
|
+
return if array.empty?
|
134
|
+
return array.first.to_s if array.length == 1
|
135
|
+
array = array.dup
|
136
|
+
array[-1] = "and #{array[-1]}"
|
137
|
+
array.join(', ').sub(', and', ' and')
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
def hipchat
|
142
|
+
reply_to.connection.config.hipchat
|
143
|
+
end
|
144
|
+
|
145
|
+
|
146
|
+
def hipchat_rooms
|
147
|
+
reply_to.connection.config.hipchat_rooms
|
148
|
+
end
|
149
|
+
|
150
|
+
|
151
|
+
def db
|
152
|
+
reply_to.connection.config.nick_db
|
153
|
+
end
|
154
|
+
|
155
|
+
|
156
|
+
def affirmation
|
157
|
+
[ 'Aight, then',
|
158
|
+
'Sure thing',
|
159
|
+
'No problemo',
|
160
|
+
'You got it, bud'
|
161
|
+
].sample(1).shift
|
162
|
+
end
|
163
|
+
|
164
|
+
|
165
|
+
def robut_room name
|
166
|
+
robut_room = reply_to.connection.rooms.select do |r|
|
167
|
+
r.name =~ /^\d+_#{name.downcase_and_snakify}@/
|
168
|
+
end.shift
|
169
|
+
end
|
170
|
+
|
171
|
+
|
172
|
+
def hipchat_room name
|
173
|
+
hipchat_room = hipchat_rooms.select do |r|
|
174
|
+
r['xmpp_jid'] == name
|
175
|
+
end.shift
|
176
|
+
end
|
177
|
+
|
178
|
+
|
179
|
+
def current_room
|
180
|
+
hipchat_room = hipchat_rooms.select do |r|
|
181
|
+
r['xmpp_jid'] == reply_to.name
|
182
|
+
end.shift['name']
|
183
|
+
end
|
184
|
+
|
185
|
+
|
186
|
+
def highlight message, nick
|
187
|
+
message.gsub nick, "<b>#{nick}</b>"
|
188
|
+
end
|
189
|
+
|
190
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'nokogiri'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
def partitions
|
6
|
+
endpoint = 'http://floorplan.bluejeansnet.com:8080/partitionmagick/'
|
7
|
+
html = Nokogiri::HTML open(endpoint) { |f| f.read }
|
8
|
+
partitions = {}
|
9
|
+
|
10
|
+
html.css('.partition').each do |partition|
|
11
|
+
name = partition.css('.name').text
|
12
|
+
next if name.empty?
|
13
|
+
partitions[name] = {
|
14
|
+
name: name,
|
15
|
+
environment: partition.css('.environment').text,
|
16
|
+
release: partition.css('.release').text,
|
17
|
+
color: partition.css('.release')[0]['class'].sub(/release +/, ''),
|
18
|
+
branch: partition.css('.branch').text
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
return partitions
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
class Robut::Plugin::Status
|
27
|
+
include Robut::Plugin
|
28
|
+
|
29
|
+
def usage
|
30
|
+
[
|
31
|
+
"#{at_nick} partition - Return the configuration for all partitions",
|
32
|
+
"#{at_nick} partition <name> - Return the configuration for the given partition",
|
33
|
+
"#{at_nick} color - Return the plugin color for all paritions",
|
34
|
+
"#{at_nick} color <name> - Return the plugin color for the given partition"
|
35
|
+
].join("\n")
|
36
|
+
end
|
37
|
+
|
38
|
+
def handle_partition time, sender, message
|
39
|
+
pname = words(message)[1]
|
40
|
+
if pname.nil? or pname.empty?
|
41
|
+
partitions.each do |_, partition|
|
42
|
+
reply "%{name} %{environment} - %{release} %{branch}" % partition
|
43
|
+
end
|
44
|
+
else
|
45
|
+
begin
|
46
|
+
reply "%{name} %{environment} - %{release} %{branch}" % partitions[pname.downcase]
|
47
|
+
rescue
|
48
|
+
reply "Sorry, I don't know of any partition named '#{pname}'"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def handle_color time, sender, message
|
54
|
+
pname = words(message)[1]
|
55
|
+
if pname.nil? || pname.empty?
|
56
|
+
partitions.each do |_, partition|
|
57
|
+
reply "%{name} %{environment} - %{color}" % partition
|
58
|
+
end
|
59
|
+
else
|
60
|
+
begin
|
61
|
+
reply "%{name} %{environment} - %{color}" % partitions[pname.downcase]
|
62
|
+
rescue
|
63
|
+
reply "Sorry, I don't know of any partition named '#{pname}'"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def handle time, sender, message
|
69
|
+
if sent_to_me?(message) && words(message)[0] =~ /^partitions?$/i
|
70
|
+
handle_partition time, sender, message
|
71
|
+
elsif sent_to_me?(message) && words(message)[0] =~ /^colors?$/i
|
72
|
+
handle_color time, sender, message
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/robit.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path(File.join('..', 'lib'), __FILE__)
|
3
|
+
require 'robit/metadata'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'robit'
|
7
|
+
s.version = Robit::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.author = Robit::AUTHOR
|
10
|
+
s.email = Robit::EMAIL
|
11
|
+
s.summary = Robit::SUMMARY
|
12
|
+
s.description = Robit::SUMMARY + '.'
|
13
|
+
|
14
|
+
s.add_runtime_dependency 'twss-classifier', '~> 0'
|
15
|
+
s.add_runtime_dependency 'calc', '~> 1'
|
16
|
+
s.add_runtime_dependency 'nokogiri', '~> 1.5'
|
17
|
+
s.add_runtime_dependency 'robut-quiz', '~> 0'
|
18
|
+
s.add_runtime_dependency 'rubypress', '~> 1'
|
19
|
+
s.add_runtime_dependency 'robut', '~> 0'
|
20
|
+
s.add_runtime_dependency 'trollop', '~> 2'
|
21
|
+
s.add_runtime_dependency 'awesome_print', '~> 1'
|
22
|
+
s.add_runtime_dependency 'daybreak', '~> 0'
|
23
|
+
s.add_runtime_dependency 'hipchat', '~> 1'
|
24
|
+
|
25
|
+
s.files = `git ls-files`.split("\n")
|
26
|
+
s.test_files = `git ls-files -- test/*`.split("\n")
|
27
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File::basename(f) }
|
28
|
+
s.require_paths = %w[ lib ]
|
29
|
+
end
|
data/start.sh
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env sh
|
2
|
+
set -x
|
3
|
+
set -e
|
4
|
+
rm -rf nohup.out nohup.pid
|
5
|
+
|
6
|
+
rooms=9455_test@conf.hipchat.com
|
7
|
+
for r in ops_only all_engr lunch_room qoe \
|
8
|
+
a2m project_easyfit non_functional_test_team \
|
9
|
+
sawmill_feedback indigo_feedback media_team \
|
10
|
+
support_and_ops bitcouncil hangouts_project ; do
|
11
|
+
rooms="9455_$r@conf.hipchat.com,$rooms"
|
12
|
+
done
|
13
|
+
|
14
|
+
bundle exec bin/robit \
|
15
|
+
-j 9455_468553@chat.hipchat.com \
|
16
|
+
-p "$1" \
|
17
|
+
-n 'robit' \
|
18
|
+
-N 'Robit (bot)' \
|
19
|
+
-k "$2" \
|
20
|
+
-r "$rooms"
|
data/test.sh
ADDED
metadata
ADDED
@@ -0,0 +1,197 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: robit
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sean Clemmer
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-12-23 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: twss-classifier
|
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: calc
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: nokogiri
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.5'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.5'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: robut-quiz
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
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: rubypress
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: robut
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: trollop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '2'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '2'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: awesome_print
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: daybreak
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: hipchat
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '1'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '1'
|
153
|
+
description: Like Robut, but better and pronounced correctly.
|
154
|
+
email: sclemmer@bluejeans.com
|
155
|
+
executables:
|
156
|
+
- robit
|
157
|
+
extensions: []
|
158
|
+
extra_rdoc_files: []
|
159
|
+
files:
|
160
|
+
- ".gitignore"
|
161
|
+
- Gemfile
|
162
|
+
- Gemfile.lock
|
163
|
+
- Rakefile
|
164
|
+
- Readme.md
|
165
|
+
- VERSION
|
166
|
+
- bin/robit
|
167
|
+
- lib/robit.rb
|
168
|
+
- lib/robit/metadata.rb
|
169
|
+
- lib/robit/plugins/alias_nick.rb
|
170
|
+
- lib/robit/plugins/status.rb
|
171
|
+
- robit.gemspec
|
172
|
+
- start.sh
|
173
|
+
- test.sh
|
174
|
+
homepage:
|
175
|
+
licenses: []
|
176
|
+
metadata: {}
|
177
|
+
post_install_message:
|
178
|
+
rdoc_options: []
|
179
|
+
require_paths:
|
180
|
+
- lib
|
181
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
182
|
+
requirements:
|
183
|
+
- - ">="
|
184
|
+
- !ruby/object:Gem::Version
|
185
|
+
version: '0'
|
186
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
187
|
+
requirements:
|
188
|
+
- - ">="
|
189
|
+
- !ruby/object:Gem::Version
|
190
|
+
version: '0'
|
191
|
+
requirements: []
|
192
|
+
rubyforge_project:
|
193
|
+
rubygems_version: 2.2.2
|
194
|
+
signing_key:
|
195
|
+
specification_version: 4
|
196
|
+
summary: Like Robut, but better and pronounced correctly
|
197
|
+
test_files: []
|