lita-coffee 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: 64b6fd18a9681ae1c31cb6fdb0f752a566205c18
4
+ data.tar.gz: 951b84eec9c661714d019e08b78ee19c2cabe202
5
+ SHA512:
6
+ metadata.gz: e218834fae3471c72221e1b59982c865edb6a888610e1ad14cf70e31aad5a8822a4afcc91e5ed5dc8ea47c3a13718b0318993e7169eb2eabac4e788c75b67a3d
7
+ data.tar.gz: 12c67a729d5126d23e985885554568ed1e51ef54e873fce086ba1b38d8992dc41fa50cbc29038ee8cbce20e3295d33113e72839e0452b94cdf20c8a6228f48e4
data/.gitignore ADDED
@@ -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
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) 2015 COzero Pty Ltd
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.
data/README.md ADDED
@@ -0,0 +1,44 @@
1
+ # lita-coffee
2
+
3
+ Manage your office coffee orders with ease!
4
+
5
+ ## Installation
6
+
7
+ Add lita-coffee to your Lita instance's Gemfile:
8
+
9
+ ``` ruby
10
+ gem "lita-coffee"
11
+ ```
12
+
13
+ ## Configuration
14
+
15
+ Set the default settings in your lita_config.rb (if you like)
16
+
17
+ ``` ruby
18
+ config.handlers.lita-coffee.default_group = "Cool Kids"
19
+ config.handlers.lita-coffee.default_coffee = "Single origin espresso"
20
+ ```
21
+
22
+ ## Usage
23
+
24
+ ``` ruby
25
+ route(
26
+ /^\(coffee\)(\s+\-[bcdgist]?|\s+\+)?(.*)/i,
27
+ :coffee,
28
+ help: {
29
+ '(coffee)' => "List the (coffee) orders for your group",
30
+ '(coffee) -i' => "Display your (coffee) profile",
31
+ '(coffee) -s Colombian Filter' => "Set your (coffee) preference",
32
+ '(coffee) -g Cool Kids' => "Change your (coffee) group",
33
+ '(coffee) +' => "Order a (coffee)",
34
+ '(coffee) -c' => "Cancel your (coffee) order",
35
+ '(coffee) -b You owe me one!' => "Buy (coffee) for your group, clear the orders and send a message",
36
+ '(coffee) -t' => "Display (coffee) system settings",
37
+ '(coffee) -d' => "Delete you from the (coffee) system",
38
+ }
39
+ )
40
+ ```
41
+
42
+ ## License
43
+
44
+ [MIT](http://opensource.org/licenses/MIT)
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
@@ -0,0 +1,12 @@
1
+ require 'lita'
2
+
3
+ Lita.load_locales Dir[File.expand_path(
4
+ File.join("..", "..", "locales", "*.yml"), __FILE__
5
+ )]
6
+
7
+ require_relative "lita/handlers/coffee"
8
+
9
+ Lita::Handlers::Coffee.template_root File.expand_path(
10
+ File.join("..", "..", "templates"),
11
+ __FILE__
12
+ )
@@ -0,0 +1,206 @@
1
+ module Lita
2
+ module Handlers
3
+ class Coffee < Handler
4
+ # TODO: money - probably in a separate handler and maybe it already exists??
5
+
6
+ # Dependencies
7
+ require 'json'
8
+
9
+ # Configuration
10
+ # default_group - the name of the default group in which users will order a coffee
11
+ # default_coffee - the coffee we will order if users don't specify what they would like
12
+ config :default_group, type: String, default: 'coffee-lovers'
13
+ config :default_coffee, type: String, default: 'Single origin espresso'
14
+ on :loaded, :set_constants
15
+
16
+ def set_constants(payload)
17
+ @@DEFAULT_GROUP = config.default_group
18
+ @@DEFAULT_COFFEE = config.default_coffee
19
+ end
20
+
21
+ route(
22
+ /^\(coffee\)(\s+\-[bcdgist]?|\s+\+)?(.*)/i,
23
+ :coffee,
24
+ help: {
25
+ '(coffee)' => "List the (coffee) orders for your group",
26
+ '(coffee) -i' => "Display your (coffee) profile",
27
+ '(coffee) -s Colombian Filter' => "Set your (coffee) preference",
28
+ '(coffee) -g Cool Kids' => "Change your (coffee) group",
29
+ '(coffee) +' => "Order a (coffee)",
30
+ '(coffee) -c' => "Cancel your (coffee) order",
31
+ '(coffee) -b You owe me one!' => "Buy (coffee) for your group, clear the orders and send a message",
32
+ '(coffee) -t' => "Display (coffee) system settings",
33
+ '(coffee) -d' => "Delete you from the (coffee) system",
34
+ }
35
+ )
36
+
37
+ def coffee(response)
38
+ get_settings = response.matches[0][0].strip == "-i" rescue false
39
+ set_coffee = response.matches[0][0].strip == "-s" rescue false
40
+ change_group = response.matches[0][0].strip == "-g" rescue false
41
+ order = response.matches[0][0].strip == "+" rescue false
42
+ cancel = response.matches[0][0].strip == "-c" rescue false
43
+ buy_coffee = response.matches[0][0].strip == "-b" rescue false
44
+ system_settings = response.matches[0][0].strip == "-t" rescue false
45
+ delete_me = response.matches[0][0].strip == "-d" rescue false
46
+
47
+ preference = response.matches[0][1].strip rescue nil
48
+
49
+ my_user = response.user.name
50
+ group = get_group(my_user)
51
+
52
+ # Setup new users
53
+ response.reply("Welcome to (coffee)! You have been setup in the #{@@DEFAULT_GROUP} group with an order of #{@@DEFAULT_COFFEE}. Type help (coffee) for help.") if initialize_user_redis(my_user) == :new_user
54
+
55
+ # Retrieve my preference
56
+ if get_settings
57
+ settings = get_settings(my_user)
58
+ response.reply("Your current (coffee) is #{settings['coffee']}. You are in the #{settings['group']} group.")
59
+ # Set my coffee
60
+ elsif set_coffee
61
+ result = set_coffee(my_user,preference)
62
+ if result == "OK"
63
+ response.reply("(coffee) set to #{preference}")
64
+ else
65
+ response.reply("(sadpanda) Failed to set your (coffee) for some reason: #{result.inspect}")
66
+ end
67
+ # Delete me altogether
68
+ elsif delete_me
69
+ result = delete_user(my_user)
70
+ if result == 1
71
+ response.reply("You have been deleted from (coffee)")
72
+ else
73
+ response.reply("(sadpanda) Failed to delete you from (coffee) for some reason: #{result.inspect}")
74
+ end
75
+ # Change my coffee group
76
+ elsif change_group
77
+ result = set_coffee_group(my_user,preference)
78
+ if result == "OK"
79
+ response.reply("(coffee) group set to #{preference}")
80
+ else
81
+ response.reply("(sadpanda) Failed to set your (coffee) group for some reason: #{result.inspect}")
82
+ end
83
+ # Order a coffee
84
+ elsif order
85
+ result = order_coffee(my_user)
86
+ if result == "OK"
87
+ response.reply("Ordered you a (coffee)")
88
+ else
89
+ response.reply("(sadpanda) Failed to order your (coffee) for some reason: #{result.inspect}")
90
+ end
91
+ # Cancel a coffee
92
+ elsif cancel
93
+ result = cancel_coffee(my_user)
94
+ if result == "OK"
95
+ response.reply("Cancelled your (coffee)")
96
+ else
97
+ response.reply("(sadpanda) Failed to cancel your (coffee) for some reason: #{result.inspect}")
98
+ end
99
+ # Buy the coffees and clear the orders
100
+ elsif buy_coffee
101
+ response.reply("Thanks for ordering the (coffee) for #{group}!\n--")
102
+ get_orders(group).each do |order|
103
+ response.reply("#{order}: #{get_coffee(order)}")
104
+ send_coffee_message(order,my_user,preference) unless order == my_user
105
+ end
106
+ result = clear_orders(group)
107
+ if result == "OK"
108
+ response.reply("Cleared all (coffee) orders for #{group}")
109
+ else
110
+ response.reply("(sadpanda) Failed to clear the (coffee) orders for some reason: #{result.inspect}")
111
+ end
112
+ # tests
113
+ elsif system_settings
114
+ response.reply("Default coffee: #{@@DEFAULT_COFFEE}, Default group: #{@@DEFAULT_GROUP}")
115
+ # List the orders
116
+ else
117
+ response.reply("Current (coffee) orders for #{group}:-\n--")
118
+ get_orders(group).each do |order|
119
+ response.reply("#{order}: #{get_coffee(order)}")
120
+ end
121
+ end
122
+
123
+ end
124
+
125
+ #######
126
+ private
127
+ #######
128
+
129
+ def initialize_user_redis(user)
130
+ if redis.get("settings-#{user}").nil?
131
+ redis.set("settings-#{user}",{group: @@DEFAULT_GROUP, coffee: @@DEFAULT_COFFEE}.to_json)
132
+ return :new_user
133
+ else
134
+ return :existing_user
135
+ end
136
+ end
137
+
138
+ def delete_user(user)
139
+ redis.del("settings-#{user}")
140
+ end
141
+
142
+ def get_settings(user)
143
+ JSON.parse(redis.get("settings-#{user}")) rescue {group: @@DEFAULT_GROUP, coffee: @@DEFAULT_COFFEE}
144
+ end
145
+
146
+ def get_orders(group)
147
+ JSON.parse(redis.get("#{group}-orders")) rescue []
148
+ end
149
+
150
+ def get_coffee(user)
151
+ JSON.parse(redis.get("settings-#{user}"))['coffee'] rescue @@DEFAULT_COFFEE
152
+ end
153
+
154
+ def get_group(user)
155
+ JSON.parse(redis.get("settings-#{user}"))['group'] rescue @@DEFAULT_GROUP
156
+ end
157
+
158
+ def set_coffee(user,coffee)
159
+ my_settings = get_settings(user)
160
+ my_settings[:coffee] = coffee
161
+ redis.set("settings-#{user}",my_settings.to_json)
162
+ end
163
+
164
+ def set_coffee_group(user,group)
165
+ my_settings = get_settings(user)
166
+ my_settings[:group] = group
167
+ redis.set("settings-#{user}",my_settings.to_json)
168
+ end
169
+
170
+ def order_coffee(user)
171
+ group = get_group(user)
172
+ Lita.logger.debug("Group: #{group}")
173
+ orders = get_orders(group)
174
+ Lita.logger.debug("Orders: #{orders}")
175
+ orders << user
176
+ orders.uniq!
177
+ Lita.logger.debug("New orders: #{orders}")
178
+ redis.set("#{group}-orders",orders.to_json)
179
+ end
180
+
181
+ def cancel_coffee(user)
182
+ group = get_group(user)
183
+ orders = get_orders(group)
184
+ orders.delete(user)
185
+ redis.set("#{group}-orders",orders.to_json)
186
+ end
187
+
188
+ def clear_orders(group)
189
+ redis.set("#{group}-orders",[])
190
+ end
191
+
192
+ def send_coffee_message(user,purchaser,message)
193
+ myuser = Lita::User.find_by_name(user)
194
+ msg = Lita::Message.new(robot,'',Lita::Source.new(user: myuser))
195
+ msg.reply("#{purchaser} has bought you a (coffee)!")
196
+ msg.reply(message) # what happens if message is nil?
197
+ rescue => e
198
+ Lita.logger.error("Coffee#send_coffee_message raised #{e.class}: #{e.message}\n#{e.backtrace}")
199
+ end
200
+
201
+
202
+ end
203
+
204
+ Lita.register_handler(Coffee)
205
+ end
206
+ end
@@ -0,0 +1,25 @@
1
+ Gem::Specification.new do |spec|
2
+ spec.name = 'lita-coffee'
3
+ spec.version = '0.0.1'
4
+ spec.authors = ['Stuart Auld']
5
+ spec.email = ['sja@marsupialmusic.net']
6
+ spec.description = %q{Lita integration to manage office coffee orders}
7
+ spec.summary = %q{Coffee order managemnet, made easy!}
8
+ spec.homepage = 'https://github.com/sjauld/lita-coffee'
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', '>= 4.2'
18
+ spec.add_runtime_dependency 'json'
19
+ spec.add_development_dependency 'bundler', '~> 1.3'
20
+ spec.add_development_dependency 'rake'
21
+ spec.add_development_dependency 'rack-test'
22
+ spec.add_development_dependency 'rspec', '>= 3.0.0'
23
+ spec.add_development_dependency 'simplecov'
24
+ spec.add_development_dependency 'coveralls'
25
+ end
data/locales/en.yml ADDED
@@ -0,0 +1,4 @@
1
+ en:
2
+ lita:
3
+ handlers:
4
+ coffee:
@@ -0,0 +1,73 @@
1
+ require "spec_helper"
2
+ #TODO: write this stuff
3
+
4
+ describe Lita::Handlers::Coffee, lita_handler: true do
5
+
6
+ it { is_expected.to route('(coffee).to(:coffee)')}
7
+
8
+ describe '#coffee' do
9
+ before{robot.trigger(:loaded)}
10
+
11
+ it 'sets up a user if they do not exist already' do
12
+ send_message("(coffee)")
13
+ expect(replies.first).to start_with("Welcome to (coffee)!") #TODO: test for defaults here?
14
+ end
15
+
16
+ it 'lists the current coffee orders if no options received' do
17
+ send_message("(coffee)")
18
+ expect(replies.last).to start_with("Current (coffee) orders")
19
+ end
20
+
21
+ it 'orders me a coffee if I ask it!' do
22
+ send_message("(coffee) +")
23
+ expect(replies.last).to eq("Ordered you a (coffee)") #TODO: test that it has been added to the queue?
24
+ end
25
+
26
+ it 'displays my profile settings' do
27
+ send_message("(coffee) -i")
28
+ expect(replies.last).to start_with("Your current (coffee) is")
29
+ end
30
+
31
+ it 'sets my coffee preference' do
32
+ send_message("(coffee) -s decaf soy cappuccino")
33
+ expect(replies.last).to eq("(coffee) set to decaf soy cappuccino")
34
+ send_message("(coffee) -i")
35
+ expect(replies.last).to start_with("Your current (coffee) is decaf soy cappuccino")
36
+ end
37
+
38
+ it 'changes my coffee group' do
39
+ send_message("(coffee) -g testing team")
40
+ expect(replies.last).to eq("(coffee) group set to testing team")
41
+ send_message("(coffee) -i")
42
+ expect(replies.last).to end_with("You are in the testing team group.")
43
+ end
44
+
45
+ it 'cancels my order' do
46
+ send_message("(coffee) -c")
47
+ expect(replies.last).to eq("Cancelled your (coffee)") #TODO: check that my name has been removed from the queue
48
+ end
49
+
50
+ it 'deletes me from the system' do
51
+ send_message("(coffee) -d")
52
+ expect(replies.last).to eq("You have been deleted from (coffee)")
53
+ end
54
+
55
+ it 'displays default settings' do
56
+ send_message("(coffee) -t")
57
+ expect(replies.last).to start_with("Default coffee:")
58
+ end
59
+
60
+ it 'buys the coffees and clears the queue' do
61
+ send_message("(coffee) +")
62
+ send_message("(coffee) -b")
63
+ expect(replies.last).to start_with("Cleared all (coffee) orders")
64
+ send_message("(coffee)")
65
+ expect(replies.last).to end_with("--")
66
+ end
67
+
68
+
69
+
70
+
71
+
72
+ end
73
+ end
@@ -0,0 +1,14 @@
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-coffee"
10
+ require "lita/rspec"
11
+
12
+ # A compatibility mode is provided for older plugins upgrading from Lita 3. Since this plugin
13
+ # was generated with Lita 4, the compatibility mode should be left disabled.
14
+ Lita.version_3_compatibility_mode = false
File without changes
metadata ADDED
@@ -0,0 +1,172 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lita-coffee
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Stuart Auld
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-07-20 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: '4.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '4.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
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: rack-test
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: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 3.0.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 3.0.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
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
+ - !ruby/object:Gem::Dependency
112
+ name: coveralls
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: Lita integration to manage office coffee orders
126
+ email:
127
+ - sja@marsupialmusic.net
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".gitignore"
133
+ - Gemfile
134
+ - LICENSE
135
+ - README.md
136
+ - Rakefile
137
+ - lib/lita-coffee.rb
138
+ - lib/lita/handlers/coffee.rb
139
+ - lita-coffee.gemspec
140
+ - locales/en.yml
141
+ - spec/lita/handlers/coffee_spec.rb
142
+ - spec/spec_helper.rb
143
+ - templates/.gitkeep
144
+ homepage: https://github.com/sjauld/lita-coffee
145
+ licenses:
146
+ - MIT
147
+ metadata:
148
+ lita_plugin_type: handler
149
+ post_install_message:
150
+ rdoc_options: []
151
+ require_paths:
152
+ - lib
153
+ required_ruby_version: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ required_rubygems_version: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ requirements: []
164
+ rubyforge_project:
165
+ rubygems_version: 2.4.6
166
+ signing_key:
167
+ specification_version: 4
168
+ summary: Coffee order managemnet, made easy!
169
+ test_files:
170
+ - spec/lita/handlers/coffee_spec.rb
171
+ - spec/spec_helper.rb
172
+ has_rdoc: