lita-service 0.1.0

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.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.rubocop.yml +5 -0
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +9 -0
  6. data/Gemfile +4 -0
  7. data/README.md +55 -0
  8. data/Rakefile +9 -0
  9. data/dump.rdb +0 -0
  10. data/lib/lita-service.rb +26 -0
  11. data/lib/lita/handlers/customer.rb +97 -0
  12. data/lib/lita/handlers/service.rb +78 -0
  13. data/lib/lita/helpers/messages_helper.rb +28 -0
  14. data/lib/lita/interactors/add_all.rb +66 -0
  15. data/lib/lita/interactors/add_quantity.rb +81 -0
  16. data/lib/lita/interactors/base_interactor.rb +19 -0
  17. data/lib/lita/interactors/change_value.rb +81 -0
  18. data/lib/lita/interactors/create_service.rb +57 -0
  19. data/lib/lita/interactors/delete_customer.rb +65 -0
  20. data/lib/lita/interactors/delete_service.rb +43 -0
  21. data/lib/lita/interactors/inscribe_customer.rb +81 -0
  22. data/lib/lita/interactors/list_services.rb +25 -0
  23. data/lib/lita/interactors/reset_quantity.rb +74 -0
  24. data/lib/lita/interactors/show_service.rb +41 -0
  25. data/lib/lita/repositories/redis.rb +38 -0
  26. data/lita-service.gemspec +28 -0
  27. data/locales/en.yml +32 -0
  28. data/spec/lita/handlers/customer_spec.rb +215 -0
  29. data/spec/lita/handlers/service_spec.rb +150 -0
  30. data/spec/lita/helpers/messages_helper_spec.rb +34 -0
  31. data/spec/lita/interactors/add_all_spec.rb +100 -0
  32. data/spec/lita/interactors/add_quantity_spec.rb +129 -0
  33. data/spec/lita/interactors/change_value_spec.rb +99 -0
  34. data/spec/lita/interactors/create_service_spec.rb +52 -0
  35. data/spec/lita/interactors/delete_customer_spec.rb +87 -0
  36. data/spec/lita/interactors/delete_service_spec.rb +49 -0
  37. data/spec/lita/interactors/inscribe_customer_spec.rb +119 -0
  38. data/spec/lita/interactors/list_services_spec.rb +51 -0
  39. data/spec/lita/interactors/reset_quantity_spec.rb +96 -0
  40. data/spec/lita/interactors/show_service_spec.rb +52 -0
  41. data/spec/lita/repositories/redis_spec.rb +71 -0
  42. data/spec/spec_helper.rb +19 -0
  43. data/templates/.gitkeep +0 -0
  44. data/templates/error.erb +1 -0
  45. data/templates/list_services.erb +10 -0
  46. data/templates/message.erb +1 -0
  47. data/templates/service_created.erb +1 -0
  48. data/templates/service_show.erb +30 -0
  49. metadata +233 -0
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+ require 'lita/helpers/messages_helper'
3
+
4
+ module Lita
5
+ module Interactors
6
+ # Show service
7
+ class ShowService < BaseInteractor
8
+ include Lita::Helpers::MessagesHelper
9
+
10
+ attr_reader :data
11
+
12
+ def initialize(handler, data)
13
+ @handler = handler
14
+ @data = data
15
+ end
16
+
17
+ def perform
18
+ if service_exists?
19
+ @message = service
20
+ else
21
+ @error = msg_not_found(service_name: name)
22
+ end
23
+ self
24
+ end
25
+
26
+ private
27
+
28
+ def name
29
+ @name ||= data[1]
30
+ end
31
+
32
+ def service
33
+ @service ||= repository.find(name)
34
+ end
35
+
36
+ def service_exists?
37
+ repository.exists?(name)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+ module Lita
3
+ module Repositories
4
+ # Redis repository
5
+ class Redis
6
+ attr_reader :redis
7
+
8
+ def initialize(redis)
9
+ @redis = redis
10
+ end
11
+
12
+ def exists?(key)
13
+ redis.exists(key)
14
+ end
15
+
16
+ def find(key)
17
+ resource = redis.get(key)
18
+ MultiJson.load(resource, symbolize_keys: true)
19
+ end
20
+
21
+ def all
22
+ redis.keys
23
+ end
24
+
25
+ def add(resource)
26
+ redis.set(resource[:name], MultiJson.dump(resource))
27
+ end
28
+
29
+ def update(resource)
30
+ add(resource)
31
+ end
32
+
33
+ def delete(key)
34
+ redis.del(key)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+ Gem::Specification.new do |spec|
3
+ spec.name = 'lita-service'
4
+ spec.version = '0.1.0'
5
+ spec.authors = ['Erlinis Quintana']
6
+ spec.email = ['erlinis.quintana@gmail.com']
7
+ spec.description = 'Plugin to create a service'
8
+ spec.summary = 'Plugin to create a service'
9
+ spec.homepage = 'https://github.com/equintana/lita-service'
10
+ spec.license = 'Open-Source License'
11
+ spec.metadata = { 'lita_plugin_type' => 'handler' }
12
+
13
+ spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
14
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
15
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
16
+ spec.require_paths = ['lib']
17
+
18
+ spec.add_runtime_dependency 'lita', '>= 4.7'
19
+
20
+ spec.add_development_dependency 'bundler', '~> 1.3'
21
+ spec.add_development_dependency 'pry-byebug'
22
+ spec.add_development_dependency 'rake'
23
+ spec.add_development_dependency 'rack-test'
24
+ spec.add_development_dependency 'rspec', '>= 3.0.0'
25
+ spec.add_development_dependency 'simplecov', '>=0.9.2'
26
+ spec.add_development_dependency 'coveralls'
27
+ spec.add_development_dependency 'rubocop', '~> 0.44.1'
28
+ end
data/locales/en.yml ADDED
@@ -0,0 +1,32 @@
1
+ en:
2
+ lita:
3
+ handlers:
4
+ service:
5
+ list:
6
+ empty: "Nothing to see here."
7
+ title: "Services List"
8
+ create:
9
+ success: "Yay! *%{service_name}* service was created."
10
+ show:
11
+ empty: "No customers yet :("
12
+ delete:
13
+ success: "Service *%{service_name}* was deleted."
14
+ inscribe:
15
+ success: "*%{customer_name}* was inscribed to *%{service_name}*."
16
+ tip: "Add customers with:\nlita service *%{service_name}* inscribe < CUSTOMER > < *VALUE >"
17
+ set_value:
18
+ success: "*%{customer_name}* value was changed from *%{old_value}* to *%{customer_value}*."
19
+ reset:
20
+ success: "*%{customer_name}* quantity was changed to *0*."
21
+ add:
22
+ success: "*%{quantity}* was added to *%{customer_name}*, new quantity: *%{customer_quantity}*"
23
+ add_all:
24
+ success: "*%{quantity}* was added to all."
25
+ delete_customer:
26
+ success: "*%{customer_name}* was deleted from *%{service_name}*."
27
+ errors:
28
+ duplicated: "A service called *%{service_name}* exist already."
29
+ not_found: "There isn't a service called *%{service_name}* or it was deleted."
30
+ customer:
31
+ duplicated: "*%{customer_name}* is already in *%{service_name}*."
32
+ not_found: "There is no *%{customer_name}* in *%{service_name}*."
@@ -0,0 +1,215 @@
1
+ # frozen_string_literal: false
2
+ require 'spec_helper'
3
+ # require 'lita/handlers/service'
4
+
5
+ describe Lita::Handlers::Customer, lita_handler: true,
6
+ additional_lita_handlers: Lita::Handlers::Service do
7
+ describe 'routes' do
8
+ it { is_expected.to route_command('service XYZ inscribe @jhon').to(:inscribe) }
9
+ it { is_expected.to route_command('service XYZ inscribe @jhon 200').to(:inscribe) }
10
+ it { is_expected.to route_command('service XYZ value @jhon 200').to(:change_value) }
11
+ it { is_expected.to route_command('service XYZ add @jhon 2').to(:add) }
12
+ it { is_expected.to route_command('service XYZ add @jhon -2').to(:add) }
13
+ it { is_expected.to route_command('service XYZ add @jhon').to(:add) }
14
+ it { is_expected.to route_command('service XYZ sum @jhon 2').to(:add) }
15
+ it { is_expected.to route_command('service XYZ sum @jhon').to(:add) }
16
+ it { is_expected.to route_command('service XYZ add all').to(:add_all) }
17
+ it { is_expected.to route_command('service XYZ add all 2').to(:add_all) }
18
+ it { is_expected.to route_command('service XYZ sum all 2').to(:add_all) }
19
+ it { is_expected.to route_command('service XYZ reset @jhon').to(:reset) }
20
+ it { is_expected.to route_command('service XYZ delete jhon').to(:delete_customer) }
21
+ it { is_expected.to route_command('service XYZ remove jhon').to(:delete_customer) }
22
+ end
23
+
24
+ describe 'callbacks' do
25
+ let(:service_not_found_error) do
26
+ "_ERROR: There isn't a service called *TheService* or it was deleted._"
27
+ end
28
+
29
+ describe '#inscribe' do
30
+ describe 'when service exists' do
31
+ before do
32
+ send_command('service create TheService')
33
+ send_command('service TheService inscribe @erlinis 2000')
34
+ end
35
+
36
+ it 'inscribes the customer if not in service' do
37
+ success_message = '_*erlinis* was inscribed to *TheService*._'
38
+ expect(replies.last).to eq(success_message)
39
+ end
40
+
41
+ it 'returns an error is customer inscribed already' do
42
+ error = '_ERROR: *erlinis* is already in *TheService*._'
43
+ send_command('service TheService inscribe @erlinis 2000')
44
+ expect(replies.last).to eq(error)
45
+ end
46
+ end
47
+
48
+ describe 'when service does not exit' do
49
+ it 'replys with an error' do
50
+ send_command('service TheService inscribe @erlinis')
51
+ expect(replies.last).to eq(service_not_found_error)
52
+ end
53
+ end
54
+ end
55
+
56
+ describe '#value' do
57
+ describe 'when service exists' do
58
+ before do
59
+ send_command('service create TheService')
60
+ send_command('service TheService inscribe @erlinis 2000')
61
+ end
62
+
63
+ it 'changes the customer values if not in service' do
64
+ success_message = '_*erlinis* value was changed from *2000* to *1000*._'
65
+ send_command('service TheService value @erlinis 1000')
66
+ expect(replies.last).to eq(success_message)
67
+ end
68
+ end
69
+
70
+ describe 'when service does not exit' do
71
+ it 'replys with an error' do
72
+ send_command('service TheService value @erlinis 1000')
73
+ expect(replies.last).to eq(service_not_found_error)
74
+ end
75
+ end
76
+ end
77
+
78
+ describe '#delete_customer' do
79
+ describe 'when service exists' do
80
+ before do
81
+ send_command('service create TheService')
82
+ end
83
+
84
+ describe 'customer in service' do
85
+ before do
86
+ send_command('service TheService inscribe @erlinis 2000')
87
+ end
88
+
89
+ it 'removes the customer' do
90
+ success_message = '_*erlinis* was deleted from *TheService*._'
91
+ send_command('service TheService delete @erlinis')
92
+ expect(replies.last).to eq(success_message)
93
+ end
94
+ end
95
+
96
+ describe 'customer not in service' do
97
+ it 'returns an error' do
98
+ error = '_ERROR: There is no *erlinis* in *TheService*._'
99
+ send_command('service TheService delete @erlinis')
100
+ expect(replies.last).to eq(error)
101
+ end
102
+ end
103
+ end
104
+
105
+ describe 'when service does not exit' do
106
+ it 'replys with an error' do
107
+ send_command('service TheService delete @erlinis')
108
+ expect(replies.last).to eq(service_not_found_error)
109
+ end
110
+ end
111
+ end
112
+
113
+ describe '#reset' do
114
+ describe 'when service exists' do
115
+ before do
116
+ send_command('service create TheService')
117
+ send_command('service TheService inscribe @erlinis 2000')
118
+ end
119
+
120
+ it 'sets the customer quantity in zero' do
121
+ success_message = '_*2* was added to *erlinis*, new quantity: *2*_'
122
+ send_command('service TheService add @erlinis 2')
123
+ expect(replies.last).to eq(success_message)
124
+ end
125
+ end
126
+
127
+ describe ' when service does not exit' do
128
+ it 'replys with an error' do
129
+ send_command('service TheService reset @erlinis')
130
+ expect(replies.last).to eq(service_not_found_error)
131
+ end
132
+ end
133
+ end
134
+
135
+ describe '#add' do
136
+ describe 'when service exists' do
137
+ before do
138
+ send_command('service create TheService')
139
+ send_command('service TheService inscribe @erlinis 2000')
140
+ end
141
+
142
+ describe 'with positive quantity' do
143
+ it 'inscrease the customer quantity' do
144
+ success_message = '_*2* was added to *erlinis*, new quantity: *2*_'
145
+ send_command('service TheService add @erlinis 2')
146
+ expect(replies.last).to eq(success_message)
147
+ end
148
+ end
149
+
150
+ describe 'with negative quantity' do
151
+ it 'decrease the customer quantity' do
152
+ success_message = '_*-1* was added to *erlinis*, new quantity: *4*_'
153
+ send_command('service TheService add @erlinis 5')
154
+ send_command('service TheService add @erlinis -1')
155
+ expect(replies.last).to eq(success_message)
156
+ end
157
+ end
158
+ end
159
+
160
+ describe ' when service does not exit' do
161
+ it 'replys with an error' do
162
+ send_command('service TheService inscribe @erlinis')
163
+ expect(replies.last).to eq(service_not_found_error)
164
+ end
165
+ end
166
+ end
167
+
168
+ describe '#add_all' do
169
+ describe 'when service exists' do
170
+ let(:success_message) { "_*#{quantity}* was added to all._" }
171
+
172
+ before do
173
+ send_command('service create TheService')
174
+ send_command('service TheService inscribe @erlinis 2000')
175
+ send_command('service TheService inscribe @khal 2000')
176
+ send_command('service TheService add @erlinis 1')
177
+ end
178
+
179
+ describe 'with positive quantity' do
180
+ let(:quantity) { 2 }
181
+
182
+ it 'inscrease all customer quantity' do
183
+ send_command('service TheService add all 2')
184
+ expect(replies.last).to eq(success_message)
185
+ end
186
+ end
187
+
188
+ describe 'with negative quantity' do
189
+ let(:quantity) { -1 }
190
+
191
+ it 'decrease the customer quantity' do
192
+ send_command('service TheService add all -1')
193
+ expect(replies.last).to eq(success_message)
194
+ end
195
+ end
196
+
197
+ describe 'without a quantity' do
198
+ let(:quantity) { 1 }
199
+
200
+ it 'inscrease all customers quantity with default quantity' do
201
+ send_command('service TheService sum all 1')
202
+ expect(replies.last).to eq(success_message)
203
+ end
204
+ end
205
+ end
206
+
207
+ describe 'when service does not exit' do
208
+ it 'replys with an error' do
209
+ send_command('service TheService sum all')
210
+ expect(replies.last).to eq(service_not_found_error)
211
+ end
212
+ end
213
+ end
214
+ end
215
+ end
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: false
2
+ require 'spec_helper'
3
+ # require 'lita/handlers/customer'
4
+
5
+ describe Lita::Handlers::Service, lita_handler: true,
6
+ additional_lita_handlers: Lita::Handlers::Customer do
7
+ describe 'routes' do
8
+ it { is_expected.to route_command('service ping').to(:pong) }
9
+ it { is_expected.to route_command('service list').to(:list) }
10
+ it { is_expected.to route_command('service create XYZ').to(:create) }
11
+ it { is_expected.to route_command('service create XYZ 2000').to(:create) }
12
+ it { is_expected.to route_command('service show XYZ').to(:show) }
13
+ it { is_expected.to route_command('service service delete XYZ').to(:delete) }
14
+ it { is_expected.to route_command('service service remove XYZ').to(:delete) }
15
+ end
16
+
17
+ describe 'callbacks' do
18
+ let(:service_not_found_error) do
19
+ "_ERROR: There isn't a service called *TheService* or it was deleted._"
20
+ end
21
+
22
+ describe '#ping' do
23
+ it 'replies pong' do
24
+ send_command('service ping')
25
+ expect(replies.last).to eq 'pong!'
26
+ end
27
+ end
28
+
29
+ describe '#list' do
30
+ describe 'with services' do
31
+ before do
32
+ send_command('service create ABC')
33
+ send_command('service create XYZ')
34
+ end
35
+
36
+ it 'list all services' do
37
+ send_command('service list')
38
+ expect(replies.last).to include('XYZ', 'ABC')
39
+ end
40
+ end
41
+
42
+ describe 'without services' do
43
+ it 'shows an empty state message' do
44
+ empty_message = "Services List\n_Nothing to see here._\n"
45
+ send_command('service list')
46
+ expect(replies.last).to eq(empty_message)
47
+ end
48
+ end
49
+ end
50
+
51
+ describe '#create' do
52
+ describe 'name not taken' do
53
+ let(:success_message) do
54
+ '_Yay! *TheService* service was created._'
55
+ end
56
+
57
+ it 'creates a service with name' do
58
+ send_command('service create TheService')
59
+ expect(replies.last).to eq(success_message)
60
+ end
61
+
62
+ it 'creates a service with name and value' do
63
+ send_command('service create TheService 2000')
64
+ expect(replies.last).to eq(success_message)
65
+ end
66
+ end
67
+
68
+ describe 'name taken' do
69
+ it 'replys with an error' do
70
+ error_message = '_ERROR: A service called *TheService* exist already._'
71
+ send_command('service create TheService')
72
+ send_command('service create TheService')
73
+ expect(replies.last).to eq(error_message)
74
+ end
75
+ end
76
+ end
77
+
78
+ describe '#show' do
79
+ describe 'when the service exists' do
80
+ before do
81
+ send_command('service create TheService')
82
+ end
83
+
84
+ describe 'without customers' do
85
+ it 'shows an empty state message' do
86
+ empty_message = "\n*TheService*\n\n_No customers yet :(_\n"
87
+
88
+ send_command('service show TheService')
89
+ expect(replies.last).to eq(empty_message)
90
+ end
91
+ end
92
+
93
+ describe 'with customers' do
94
+ before do
95
+ send_command('service create TheService 2000')
96
+ send_command('service TheService inscribe erlinis 2000')
97
+ send_command('service TheService inscribe khal 2000')
98
+ send_command('service TheService add erlinis 1')
99
+ send_command('service TheService add khal 2')
100
+ end
101
+
102
+ it 'shows the service' do
103
+ service_data = "\n*TheService*\n\n" \
104
+ "```\n" \
105
+ "-------------------------------------------------------------\n" \
106
+ " # | Name | Quantity | Value | Total \n" \
107
+ "-----+----------------------+----------+----------+----------\n" \
108
+ " 1 | erlinis | 1 | 2000 | 2000 \n" \
109
+ " 2 | khal | 2 | 2000 | 4000 \n" \
110
+ "-----+----------------------+----------+----------+----------\n" \
111
+ " | Total | 3 | *** | 6000 \n" \
112
+ "-------------------------------------------------------------\n" \
113
+ '```'
114
+
115
+ send_command('service show TheService')
116
+ expect(replies.last).to eq(service_data)
117
+ end
118
+ end
119
+ end
120
+
121
+ describe 'when service does not exist' do
122
+ it 'replys with an error' do
123
+ send_command('service show TheService')
124
+ expect(replies.last).to eq(service_not_found_error)
125
+ end
126
+ end
127
+ end
128
+
129
+ describe '#delete' do
130
+ describe 'when the service exists' do
131
+ before do
132
+ send_command('service create TheService')
133
+ end
134
+
135
+ it 'deletes the service' do
136
+ success_message = '_Service *TheService* was deleted._'
137
+ send_command('service delete TheService')
138
+ expect(replies.last).to eq(success_message)
139
+ end
140
+ end
141
+
142
+ describe 'when service does not exist' do
143
+ it 'replys with an error' do
144
+ send_command('service delete TheService')
145
+ expect(replies.last).to eq(service_not_found_error)
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end