lita-kegbot 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2d74d86f47568b6cb26fcf32d1b250235c3c44bf
4
+ data.tar.gz: 1d7dd6489c04d0c019c7afeea3d51e00a1cc0a57
5
+ SHA512:
6
+ metadata.gz: 9515ff91fa64205be86cb7034b91f93d8ef26b0e8b648cbf3840237742da40d2cd250dba87eadba053078b91d85a2d48c7cb8bc83b3326cd4f2a13d4bb0f444b
7
+ data.tar.gz: 91f8be5a3e132ba2c9c90e0a3cfa37d1a80bd093e6ce3750081f6ee7473696ea376525a4dc3ab221eb2a73a29f9f7fe75bb4d3889d21da1a24def886e81ee214
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
@@ -0,0 +1,11 @@
1
+ ClassLength:
2
+ Max: 300
3
+
4
+ Documentation:
5
+ Enabled: false
6
+
7
+ FileName:
8
+ Enabled: false
9
+
10
+ MethodLength:
11
+ Max: 20
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ script: bundle exec rake
5
+ before_install:
6
+ - gem update --system
7
+ services:
8
+ - redis-server
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2014 Eric Sigler
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,55 @@
1
+ # lita-kegbot
2
+
3
+ [![Build Status](https://img.shields.io/travis/esigler/lita-kegbot/master.svg)](https://travis-ci.org/esigler/lita-kegbot)
4
+ [![MIT License](https://img.shields.io/badge/license-MIT-brightgreen.svg)](https://tldrlegal.com/license/mit-license)
5
+ [![RubyGems :: RMuh Gem Version](http://img.shields.io/gem/v/lita-kegbot.svg)](https://rubygems.org/gems/lita-kegbot)
6
+ [![Coveralls Coverage](https://img.shields.io/coveralls/esigler/lita-kegbot/master.svg)](https://coveralls.io/r/esigler/lita-kegbot)
7
+ [![Code Climate](https://img.shields.io/codeclimate/github/esigler/lita-kegbot.svg)](https://codeclimate.com/github/esigler/lita-kegbot)
8
+ [![Gemnasium](https://img.shields.io/gemnasium/esigler/lita-kegbot.svg)](https://gemnasium.com/esigler/lita-kegbot)
9
+
10
+ A Kegbot (https://kegbot.org) handler for checking what's on tap, how much is left, etc.
11
+
12
+ ## Installation
13
+
14
+ Add lita-kegbot to your Lita instance's Gemfile:
15
+
16
+ ``` ruby
17
+ gem "lita-kegbot"
18
+ ```
19
+
20
+ ## Configuration
21
+
22
+ Add the following variables to your Lita config file:
23
+
24
+ ``` ruby
25
+ config.handlers.kegbot.api_key = '_your_key_here_'
26
+ config.handlers.kegbot.api_url = 'https://kegbot.example.com'
27
+ ```
28
+
29
+ ## Usage
30
+
31
+ ### Drinks
32
+
33
+ ```
34
+ kegbot drink list - List last 5 drinks poured
35
+ kegbot drink list <N> - List last <N> drinks poured
36
+ ```
37
+
38
+ ### Taps
39
+
40
+ ```
41
+ kegbot tap status - Shows status of all taps
42
+ kegbot tap status <id> - Shows status of tap <id>
43
+ ```
44
+
45
+ ### Kegs
46
+
47
+ ```
48
+ kegbot keg status - Shows status of all kegs
49
+ kegbot keg status <id> - Shows status of keg <id>
50
+ ```
51
+
52
+ ## License
53
+
54
+ [MIT](http://opensource.org/licenses/MIT)
55
+
@@ -0,0 +1,8 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+ require 'rubocop/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+ Rubocop::RakeTask.new(:rubocop)
7
+
8
+ task default: [ :spec, :rubocop ]
@@ -0,0 +1,7 @@
1
+ require 'lita'
2
+
3
+ Lita.load_locales Dir[File.expand_path(
4
+ File.join('..', '..', 'locales', '*.yml'), __FILE__
5
+ )]
6
+
7
+ require 'lita/handlers/kegbot'
@@ -0,0 +1,190 @@
1
+ module Lita
2
+ module Handlers
3
+ class Kegbot < Handler
4
+ route(
5
+ /^(?:kegbot|kb)\sdrink\slist$/,
6
+ :drink_list_all,
7
+ command: true,
8
+ help: {
9
+ t('help.drink_list.syntax') => t('help.drink_list.desc')
10
+ }
11
+ )
12
+
13
+ route(
14
+ /^(?:kegbot|kb)\sdrink\slist\s(\d+)$/,
15
+ :drink_list,
16
+ command: true,
17
+ help: {
18
+ t('help.drink_list_N.syntax') => t('help.drink_list_N.desc')
19
+ }
20
+ )
21
+
22
+ route(
23
+ /^(?:kegbot|kb)\stap\sstatus$/,
24
+ :tap_status_all,
25
+ command: true,
26
+ help: {
27
+ t('help.tap_status.syntax') => t('help.tap_status.desc')
28
+ }
29
+ )
30
+
31
+ route(
32
+ /^(?:kegbot|kb)\stap\sstatus\s(\d+)$/,
33
+ :tap_status_id,
34
+ command: true,
35
+ help: {
36
+ t('help.tap_status_id.syntax') => t('help.tap_status_id.desc')
37
+ }
38
+ )
39
+
40
+ route(
41
+ /^(?:kegbot|kb)\skeg\sstatus$/,
42
+ :keg_status_all,
43
+ command: true,
44
+ help: {
45
+ t('help.keg_status.syntax') => t('help.keg_status.desc')
46
+ }
47
+ )
48
+
49
+ route(
50
+ /^(?:kegbot|kb)\skeg\sstatus\s(\d+)$/,
51
+ :keg_status_id,
52
+ command: true,
53
+ help: {
54
+ t('help.keg_status_id.syntax') => t('help.keg_status_id.desc')
55
+ }
56
+ )
57
+
58
+ def self.default_config(config)
59
+ config.api_key = nil
60
+ config.api_url = nil
61
+ end
62
+
63
+ def drink_list_all(response)
64
+ result = api_request('get', 'drinks/')
65
+ if result && result['result'] && result['result']['drinks']
66
+ drinks = result['result']['drinks']
67
+ response.reply(t('drinks.none')) unless drinks.count > 0
68
+ drinks.each do |drink|
69
+ response.reply(t('drinks.info', user: drink['user_id'],
70
+ date: drink['pour_time']))
71
+ end
72
+ else
73
+ response.reply(t('error.request'))
74
+ end
75
+ end
76
+
77
+ def drink_list(response)
78
+ count = response.matches[0][0].to_i
79
+ current = 0
80
+ result = api_request('get', 'drinks')
81
+ if result && result['result'] && result['result']['drinks']
82
+ drinks = result['result']['drinks']
83
+ response.reply(t('drinks.none')) unless drinks.count > 0
84
+ drinks.each do |drink|
85
+ if current < count
86
+ response.reply(t('drinks.info', user: drink['user_id'],
87
+ date: drink['pour_time']))
88
+ current += 1
89
+ end
90
+ end
91
+ else
92
+ response.reply(t('error.request'))
93
+ end
94
+ end
95
+
96
+ def tap_status_all(response)
97
+ result = api_request('get', 'taps/')
98
+ if result && result['result'] && result['result']['taps']
99
+ taps = result['result']['taps']
100
+ response.reply(t('taps.none')) unless taps.count > 0
101
+ taps.each do |tap|
102
+ pct = format('%3.2f', (tap['keg']['percent_full'] * 100))
103
+ response.reply(t('taps.info', id: tap['tap']['id'],
104
+ desc: tap['keg']['description'],
105
+ pct: pct))
106
+ end
107
+ else
108
+ response.reply(t('error.request'))
109
+ end
110
+ end
111
+
112
+ def tap_status_id(response)
113
+ id = response.matches[0][0].to_i
114
+ result = api_request('get', "taps/#{id}")
115
+ if result && result['result'] && result['result']['tap']
116
+ tap = result['result']['tap']
117
+ keg = result['result']['keg']
118
+ pct = format('%3.2f', (keg['percent_full'] * 100))
119
+ response.reply(t('taps.info', id: tap['id'],
120
+ desc: keg['description'],
121
+ pct: pct))
122
+ else
123
+ response.reply(t('error.request'))
124
+ end
125
+ end
126
+
127
+ def keg_status_all(response)
128
+ result = api_request('get', 'kegs/')
129
+ if result && result['result'] && result['result']['kegs']
130
+ kegs = result['result']['kegs']
131
+ response.reply(t('kegs.none')) unless kegs.count > 0
132
+ kegs.each do |keg|
133
+ pct = format('%3.2f', (keg['percent_full'] * 100))
134
+ response.reply(t('kegs.info', id: keg['id'],
135
+ desc: keg['description'],
136
+ status: keg['status'],
137
+ pct: pct))
138
+ end
139
+ else
140
+ response.reply(t('error.request'))
141
+ end
142
+ end
143
+
144
+ def keg_status_id(response)
145
+ id = response.matches[0][0].to_i
146
+ result = api_request('get', "kegs/#{id}")
147
+ if result && result['result'] && result['result']['keg']
148
+ keg = result['result']['keg']
149
+ pct = format('%3.2f', (keg['percent_full'] * 100))
150
+ response.reply(t('kegs.info', id: keg['id'],
151
+ desc: keg['description'],
152
+ status: keg['status'],
153
+ pct: pct))
154
+ else
155
+ response.reply(t('error.request'))
156
+ end
157
+ end
158
+
159
+ private
160
+
161
+ def api_request(method, path, args = {})
162
+ if Lita.config.handlers.kegbot.api_key.nil? ||
163
+ Lita.config.handlers.kegbot.api_url.nil?
164
+ Lita.logger.error('Missing API key or Page ID for Kegbot')
165
+ fail 'Missing config'
166
+ end
167
+
168
+ url = "#{Lita.config.handlers.kegbot.api_url}/api/#{path}"
169
+
170
+ http_response = http.send(method) do |req|
171
+ req.url url, args
172
+ req.headers['X-Kegbot-Api-Key'] = \
173
+ Lita.config.handlers.kegbot.api_key
174
+ end
175
+
176
+ if http_response.status == 200 ||
177
+ http_response.status == 201
178
+ MultiJson.load(http_response.body)
179
+ else
180
+ Lita.logger.error("HTTP #{method} for #{url} with #{args} " \
181
+ "returned #{http_response.status}")
182
+ Lita.logger.error(http_response.body)
183
+ nil
184
+ end
185
+ end
186
+ end
187
+
188
+ Lita.register_handler(Kegbot)
189
+ end
190
+ end
@@ -0,0 +1,25 @@
1
+ Gem::Specification.new do |spec|
2
+ spec.name = 'lita-kegbot'
3
+ spec.version = '0.1.0'
4
+ spec.authors = ['Eric Sigler']
5
+ spec.email = ['me@esigler.com']
6
+ spec.description = %q{A Kegbot handler for Lita.io}
7
+ spec.summary = %q{A Kegbot handler for Lita.io}
8
+ spec.homepage = 'https://github.com/esigler/lita-kegbot'
9
+ spec.license = 'MIT'
10
+ spec.metadata = { 'lita_plugin_type' => 'handler' }
11
+
12
+ spec.files = `git ls-files`.split($/)
13
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
14
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
15
+ spec.require_paths = ['lib']
16
+
17
+ spec.add_runtime_dependency 'lita', '>= 3.0'
18
+
19
+ spec.add_development_dependency 'bundler', '~> 1.3'
20
+ spec.add_development_dependency 'rake'
21
+ spec.add_development_dependency 'rspec', '>= 3.0.0.beta2'
22
+ spec.add_development_dependency 'rubocop'
23
+ spec.add_development_dependency 'simplecov'
24
+ spec.add_development_dependency 'coveralls'
25
+ end
@@ -0,0 +1,41 @@
1
+ en:
2
+ lita:
3
+ handlers:
4
+ kegbot:
5
+ drinks:
6
+ info: "%{user} poured a glass at %{date}"
7
+ none: No drinks have been poured
8
+ error:
9
+ not_implemented: Not implemented yet.
10
+ request: There was a problem with the Kegbot request
11
+ help:
12
+ drink_list:
13
+ syntax: (kegbot|kb) drink list
14
+ desc: List last 5 drinks poured
15
+ drink_list_N:
16
+ syntax: (kegbot|kb) drink list <N>
17
+ desc: List last <N> drinks poured
18
+ tap_list:
19
+ syntax: (kegbot|kb) tap list
20
+ desc: Lists taps
21
+ tap_status:
22
+ syntax: (kegbot|kb) tap status
23
+ desc: Shows status of all taps
24
+ tap_status_id:
25
+ syntax: (kegbot|kb) tap status <id>
26
+ desc: Shows status of tap <id>
27
+ keg_list:
28
+ syntax: (kegbot|kb) keg list
29
+ desc: Lists kegs (this includes kegs that are no longer connected)
30
+ keg_status:
31
+ syntax: (kegbot|kb) keg status
32
+ desc: Shows status of all kegs
33
+ keg_status_id:
34
+ syntax: (kegbot|kb) keg status <id>
35
+ desc: Shows status of keg <id>
36
+ kegs:
37
+ info: "Keg #%{id}: %{desc}, status: %{status}, %{pct}% remaining"
38
+ none: No kegs have been configured
39
+ taps:
40
+ info: "Tap #%{id}: %{desc}, %{pct}% remaining"
41
+ none: No taps have been configured
@@ -0,0 +1,33 @@
1
+ {
2
+ "result": {
3
+ "paging": {
4
+ "total": 2716,
5
+ "limit": 100,
6
+ "pos": 2000
7
+ },
8
+ "drinks": [
9
+ {
10
+ "volume_ml": 490.24793744200002,
11
+ "user_id": "capn",
12
+ "ticks": 1321,
13
+ "session_id": "386",
14
+ "is_valid": true,
15
+ "pour_time": "2009-10-03T17:13:16",
16
+ "duration": 15,
17
+ "keg_id": 13,
18
+ "id": 2000
19
+ },
20
+ {
21
+ "volume_ml": 451.651582034,
22
+ "user_id": "boysdontcall",
23
+ "ticks": 1217,
24
+ "session_id": "386",
25
+ "is_valid": true,
26
+ "pour_time": "2009-10-03T17:12:27",
27
+ "duration": 14,
28
+ "keg_id": 13,
29
+ "id": 1999
30
+ }
31
+ ]
32
+ }
33
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "result": {
3
+ "paging": {
4
+ "total": 2716,
5
+ "limit": 100,
6
+ "pos": 2000
7
+ },
8
+ "drinks": []
9
+ }
10
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "result": {
3
+ "keg": {
4
+ "status": "offline",
5
+ "volume_ml_remain": 590.74554188041657,
6
+ "finished_time": "2009-10-17T19:34:06",
7
+ "description": "Racer 5",
8
+ "type_id": "50ad52bc-35fb-4441-a5bf-f56a55608057",
9
+ "started_time": "2009-09-06T14:46:00",
10
+ "size_id": 1,
11
+ "percent_full": 0.010068330147789123,
12
+ "id": 13
13
+ },
14
+ "type": {
15
+ "name": "Racer 5",
16
+ "style_id": "8afc60f5-2ee0-40a2-a53a-39c6f43ed4bf",
17
+ "calories_oz": 12.5,
18
+ "abv": 7.2000000000000002,
19
+ "brewer_id": "4360bae4-5522-4fca-8e3a-0edebfc457a5",
20
+ "id": "50ad52bc-35fb-4441-a5bf-f56a55608057"
21
+ },
22
+ "size": {
23
+ "volume_ml": 58673.636363636397,
24
+ "id": 1,
25
+ "name": "15.5 gallon keg"
26
+ },
27
+ "drinks": [
28
+ {
29
+ "volume_ml": 55.667820300000002,
30
+ "user_id": "scarfjerk",
31
+ "ticks": 150,
32
+ "session_id": "390",
33
+ "is_valid": true,
34
+ "pour_time": "2009-10-17T19:34:06",
35
+ "duration": 7,
36
+ "keg_id": 13,
37
+ "id": 2054
38
+ },
39
+ {
40
+ "volume_ml": 441.63137438000001,
41
+ "user_id": null,
42
+ "ticks": 1190,
43
+ "session_id": "390",
44
+ "is_valid": true,
45
+ "user": null,
46
+ "pour_time": "2009-10-17T19:02:55",
47
+ "duration": 11,
48
+ "keg_id": 13,
49
+ "id": 2053
50
+ }
51
+ ]
52
+ }
53
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "result": {
3
+ "kegs": [
4
+ {
5
+ "status": "online",
6
+ "volume_ml_remain": 299.24664065039542,
7
+ "finished_time": "2010-06-11T23:25:16",
8
+ "description": "Celebrating the World Cup, and international relations, with a beer that's part Austria / part Berkeley.",
9
+ "type_id": "20bd3f32-75eb-11df-80f2-00304833977c",
10
+ "started_time": "2010-06-11T23:25:16",
11
+ "size_id": 1,
12
+ "percent_full": 0.0051001891001911156,
13
+ "id": 17
14
+ },
15
+ {
16
+ "status": "offline",
17
+ "volume_ml_remain": -13363.120936177656,
18
+ "finished_time": "2010-05-29T13:01:20",
19
+ "description": "Racer 5",
20
+ "type_id": "e29a5d90-6b5c-11df-bcbc-00304833977c",
21
+ "started_time": "2010-05-29T13:01:20",
22
+ "size_id": 1,
23
+ "percent_full": -0.22775341302110927,
24
+ "id": 16
25
+ }
26
+ ]
27
+ }
28
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "result": {
3
+ "kegs": []
4
+ }
5
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "result": {
3
+ "keg": {
4
+ "status": "online",
5
+ "volume_ml_remain": 299.24664065039542,
6
+ "finished_time": "2010-06-11T23:25:16",
7
+ "description": "Racer 5",
8
+ "type_id": "20bd3f32-75eb-11df-80f2-00304833977c",
9
+ "started_time": "2010-06-11T23:25:16",
10
+ "size_id": 1,
11
+ "percent_full": 0.0051001891001911156,
12
+ "id": 17
13
+ },
14
+ "tap": {
15
+ "meter_name": "kegboard.flow0",
16
+ "name": "main tap",
17
+ "ml_per_tick": 0.37111880200000003,
18
+ "thermo_sensor_id": "1",
19
+ "current_keg_id": 17,
20
+ "id": "1"
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "result": {
3
+ "taps": [
4
+ {
5
+ "keg": {
6
+ "status": "online",
7
+ "volume_ml_remain": 299.24664065039542,
8
+ "finished_time": "2010-06-11T23:25:16",
9
+ "description": "Racer 5",
10
+ "type_id": "20bd3f32-75eb-11df-80f2-00304833977c",
11
+ "started_time": "2010-06-11T23:25:16",
12
+ "size_id": 1,
13
+ "percent_full": 0.0051001891001911156,
14
+ "id": 17
15
+ },
16
+ "tap": {
17
+ "meter_name": "kegboard.flow0",
18
+ "name": "main tap",
19
+ "ml_per_tick": 0.37111880200000003,
20
+ "thermo_sensor_id": "1",
21
+ "current_keg_id": 17,
22
+ "id": "1"
23
+ }
24
+ }
25
+ ]
26
+ }
27
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "result": {
3
+ "taps": [
4
+ ]
5
+ }
6
+ }
@@ -0,0 +1,198 @@
1
+ require 'spec_helper'
2
+
3
+ describe Lita::Handlers::Kegbot, lita_handler: true do
4
+ let(:drinks) do
5
+ File.read('spec/files/drinks.json')
6
+ end
7
+
8
+ let(:drinks_empty) do
9
+ File.read('spec/files/drinks_empty.json')
10
+ end
11
+
12
+ let(:taps) do
13
+ File.read('spec/files/taps.json')
14
+ end
15
+
16
+ let(:taps_empty) do
17
+ File.read('spec/files/taps_empty.json')
18
+ end
19
+
20
+ let(:tap) do
21
+ File.read('spec/files/tap.json')
22
+ end
23
+
24
+ let(:kegs) do
25
+ File.read('spec/files/kegs.json')
26
+ end
27
+
28
+ let(:kegs_empty) do
29
+ File.read('spec/files/kegs_empty.json')
30
+ end
31
+
32
+ let(:keg) do
33
+ File.read('spec/files/keg.json')
34
+ end
35
+
36
+ it { routes_command('kegbot drink list').to(:drink_list_all) }
37
+ it { routes_command('kegbot drink list 10').to(:drink_list) }
38
+ it { routes_command('kegbot tap status').to(:tap_status_all) }
39
+ it { routes_command('kegbot tap status 1').to(:tap_status_id) }
40
+ it { routes_command('kegbot keg status').to(:keg_status_all) }
41
+ it { routes_command('kegbot keg status 1').to(:keg_status_id) }
42
+
43
+ it { routes_command('kb drink list').to(:drink_list_all) }
44
+ it { routes_command('kb drink list 10').to(:drink_list) }
45
+ it { routes_command('kb tap status').to(:tap_status_all) }
46
+ it { routes_command('kb tap status 1').to(:tap_status_id) }
47
+ it { routes_command('kb keg status').to(:keg_status_all) }
48
+ it { routes_command('kb keg status 1').to(:keg_status_id) }
49
+
50
+ def grab_request(method, status, body)
51
+ response = double('Faraday::Response', status: status, body: body)
52
+ expect_any_instance_of(Faraday::Connection).to \
53
+ receive(method.to_sym).and_return(response)
54
+ end
55
+
56
+ describe 'without valid config' do
57
+ before do
58
+ Lita.config.handlers.kegbot.api_key = nil
59
+ Lita.config.handlers.kegbot.api_url = nil
60
+ end
61
+
62
+ describe '.default_config' do
63
+ it 'sets api_key to nil' do
64
+ expect(Lita.config.handlers.kegbot.api_key).to be_nil
65
+ end
66
+
67
+ it 'sets api_url to nil' do
68
+ expect(Lita.config.handlers.kegbot.api_url).to be_nil
69
+ end
70
+ end
71
+
72
+ it 'should error out on any command' do
73
+ expect { send_command('kb tap status') }.to raise_error('Missing config')
74
+ end
75
+ end
76
+
77
+ before do
78
+ Lita.config.handlers.kegbot.api_key = 'foo'
79
+ Lita.config.handlers.kegbot.api_url = 'https://example.com'
80
+ end
81
+
82
+ describe '#drink_list_all' do
83
+ it 'shows a list of drinks if there are any' do
84
+ grab_request('get', 200, drinks)
85
+ send_command('kegbot drink list')
86
+ expect(replies.last).to eq('boysdontcall poured a glass at ' \
87
+ '2009-10-03T17:12:27')
88
+ end
89
+
90
+ it 'shows an empty list if there arent any' do
91
+ grab_request('get', 200, drinks_empty)
92
+ send_command('kegbot drink list')
93
+ expect(replies.last).to eq('No drinks have been poured')
94
+ end
95
+
96
+ it 'shows an error if there was a problem with the request' do
97
+ grab_request('get', 500, nil)
98
+ send_command('kegbot drink list')
99
+ expect(replies.last).to eq('There was a problem with the Kegbot request')
100
+ end
101
+ end
102
+
103
+ describe '#drink_list' do
104
+ it 'shows the correct number of drinks if there are that many' do
105
+ grab_request('get', 200, drinks)
106
+ send_command('kegbot drink list 1')
107
+ expect(replies.count).to eq(1)
108
+ end
109
+
110
+ it 'shows an error if there was a problem with the request' do
111
+ grab_request('get', 500, nil)
112
+ send_command('kegbot drink list 2')
113
+ expect(replies.last).to eq('There was a problem with the Kegbot request')
114
+ end
115
+ end
116
+
117
+ describe '#tap_status_all' do
118
+ it 'shows the status of all of the taps if there are any' do
119
+ grab_request('get', 200, taps)
120
+ send_command('kegbot tap status')
121
+ expect(replies.last).to eq('Tap #1: Racer 5, 0.51% remaining')
122
+ end
123
+
124
+ it 'shows an empty list if there arent any' do
125
+ grab_request('get', 200, taps_empty)
126
+ send_command('kegbot tap status')
127
+ expect(replies.last).to eq('No taps have been configured')
128
+ end
129
+
130
+ it 'shows an error if there was a problem with the request' do
131
+ grab_request('get', 500, nil)
132
+ send_command('kegbot tap status')
133
+ expect(replies.last).to eq('There was a problem with the Kegbot request')
134
+ end
135
+ end
136
+
137
+ describe '#tap_status_id' do
138
+ it 'shows the status of a specific tap' do
139
+ grab_request('get', 200, tap)
140
+ send_command('kegbot tap status 1')
141
+ expect(replies.last).to eq('Tap #1: Racer 5, 0.51% remaining')
142
+ end
143
+
144
+ it 'shows a warning if that tap does not exist' do
145
+ grab_request('get', 404, nil)
146
+ send_command('kegbot tap status 1')
147
+ expect(replies.last).to eq('There was a problem with the Kegbot request')
148
+ end
149
+
150
+ it 'shows an error if there was a problem with the request' do
151
+ grab_request('get', 500, nil)
152
+ send_command('kegbot tap status 1')
153
+ expect(replies.last).to eq('There was a problem with the Kegbot request')
154
+ end
155
+ end
156
+
157
+ describe '#keg_status_all' do
158
+ it 'shows the status of all of the kegs if there are any' do
159
+ grab_request('get', 200, kegs)
160
+ send_command('kegbot keg status')
161
+ expect(replies.last).to eq('Keg #16: Racer 5, status: offline, ' \
162
+ '-22.78% remaining')
163
+ end
164
+
165
+ it 'shows an empty list if there arent any' do
166
+ grab_request('get', 200, kegs_empty)
167
+ send_command('kegbot keg status')
168
+ expect(replies.last).to eq('No kegs have been configured')
169
+ end
170
+
171
+ it 'shows an error if there was a problem with the request' do
172
+ grab_request('get', 500, nil)
173
+ send_command('kegbot keg status')
174
+ expect(replies.last).to eq('There was a problem with the Kegbot request')
175
+ end
176
+ end
177
+
178
+ describe '#keg_status_id' do
179
+ it 'shows the status of a specific keg' do
180
+ grab_request('get', 200, keg)
181
+ send_command('kegbot keg status 1')
182
+ expect(replies.last).to eq('Keg #13: Racer 5, status: offline, ' \
183
+ '1.01% remaining')
184
+ end
185
+
186
+ it 'shows a warning if that keg does not exist' do
187
+ grab_request('get', 404, nil)
188
+ send_command('kegbot keg status 1')
189
+ expect(replies.last).to eq('There was a problem with the Kegbot request')
190
+ end
191
+
192
+ it 'shows an error if there was a problem with the request' do
193
+ grab_request('get', 500, nil)
194
+ send_command('kegbot keg status 1')
195
+ expect(replies.last).to eq('There was a problem with the Kegbot request')
196
+ end
197
+ end
198
+ end
@@ -0,0 +1,10 @@
1
+ require 'simplecov'
2
+ require 'coveralls'
3
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
4
+ SimpleCov::Formatter::HTMLFormatter,
5
+ Coveralls::SimpleCov::Formatter
6
+ ]
7
+ SimpleCov.start { add_filter '/spec/' }
8
+
9
+ require 'lita-kegbot'
10
+ require 'lita/rspec'
metadata ADDED
@@ -0,0 +1,174 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lita-kegbot
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Eric Sigler
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-04-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: lita
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 3.0.0.beta2
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 3.0.0.beta2
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
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: coveralls
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: A Kegbot handler for Lita.io
112
+ email:
113
+ - me@esigler.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - ".rubocop.yml"
120
+ - ".travis.yml"
121
+ - Gemfile
122
+ - LICENSE
123
+ - README.md
124
+ - Rakefile
125
+ - lib/lita-kegbot.rb
126
+ - lib/lita/handlers/kegbot.rb
127
+ - lita-kegbot.gemspec
128
+ - locales/en.yml
129
+ - spec/files/drinks.json
130
+ - spec/files/drinks_empty.json
131
+ - spec/files/keg.json
132
+ - spec/files/kegs.json
133
+ - spec/files/kegs_empty.json
134
+ - spec/files/tap.json
135
+ - spec/files/taps.json
136
+ - spec/files/taps_empty.json
137
+ - spec/lita/handlers/kegbot_spec.rb
138
+ - spec/spec_helper.rb
139
+ homepage: https://github.com/esigler/lita-kegbot
140
+ licenses:
141
+ - MIT
142
+ metadata:
143
+ lita_plugin_type: handler
144
+ post_install_message:
145
+ rdoc_options: []
146
+ require_paths:
147
+ - lib
148
+ required_ruby_version: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ required_rubygems_version: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ requirements: []
159
+ rubyforge_project:
160
+ rubygems_version: 2.2.2
161
+ signing_key:
162
+ specification_version: 4
163
+ summary: A Kegbot handler for Lita.io
164
+ test_files:
165
+ - spec/files/drinks.json
166
+ - spec/files/drinks_empty.json
167
+ - spec/files/keg.json
168
+ - spec/files/kegs.json
169
+ - spec/files/kegs_empty.json
170
+ - spec/files/tap.json
171
+ - spec/files/taps.json
172
+ - spec/files/taps_empty.json
173
+ - spec/lita/handlers/kegbot_spec.rb
174
+ - spec/spec_helper.rb