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 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: []