robit 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,15 @@
1
+ *~
2
+ *.db
3
+ *.gem
4
+ *.log
5
+ *.out
6
+ *.pid
7
+ *.swp
8
+ .DS_Store
9
+ .robit
10
+ .robut_store
11
+ .vagrant
12
+ .yardoc
13
+ Gemfile.lock
14
+ doc
15
+ pkg
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
@@ -0,0 +1,3 @@
1
+ # Robit
2
+
3
+ See `start.sh` and `test.sh` for examples.
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,3 @@
1
+ require_relative 'robit/metadata'
2
+ require_relative 'robit/plugins/status'
3
+ require_relative 'robit/plugins/alias_nick'
@@ -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
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env sh
2
+ bundle exec bin/robit \
3
+ -j 9455_468553@chat.hipchat.com \
4
+ -p "$1" \
5
+ -n 'robit' \
6
+ -N 'Robit (bot)' \
7
+ -k "$2" \
8
+ -r 9455_test@conf.hipchat.com,9455_ops_only@conf.hipchat.com
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: []