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
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 74840cf12e701b8563b21eaa8f5d1591927b3240
4
+ data.tar.gz: d063cf8f4dd14ec643076ef2f3b114dfaf0ecdb4
5
+ SHA512:
6
+ metadata.gz: afb34ca45f217a64655d63c2db9fe0e03f1496e249fce39bdda900986e2b8bdc17602a1abb972d36e3e1a7aa06187e57a7566395caf952c7135b078a175ee470
7
+ data.tar.gz: 7ae656a384fceb9a4e3e6880c327ee71f83ab18c1608a1b8a28fe233939d7b48af50d5cccfb1e732d450f0100a8ef984a032f5a7a4e441c814bb658c7aab6c50
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ .byebug_history
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
data/.rubocop.yml ADDED
@@ -0,0 +1,5 @@
1
+ Style/FileName:
2
+ Exclude: [ 'lib/lita-service.rb' ]
3
+
4
+ Metrics/LineLength:
5
+ Max: 90
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.3.0
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ cache: bundler
3
+ rvm:
4
+ - 2.3.0
5
+ script: bundle exec rake
6
+ before_install:
7
+ - gem update --system
8
+ services:
9
+ - redis-server
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+ source 'https://rubygems.org'
3
+
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,55 @@
1
+ # lita-service
2
+
3
+ [![Build Status](https://travis-ci.org/equintana/lita-service.png?branch=master)](https://travis-ci.org/equintana/lita-service)
4
+ [![Coverage Status](https://coveralls.io/builds/8637437/badge)](https://coveralls.io/builds/8637437)
5
+
6
+ Plugin to create a service with value or custom value per client and to manage how many times a customer use or consume this service.
7
+
8
+ ## Installation
9
+
10
+ Add lita-service to your Lita instance's Gemfile:
11
+
12
+ ``` ruby
13
+ gem "lita-service"
14
+ ```
15
+
16
+ ## Usage
17
+
18
+ ``` sh
19
+ lita service list
20
+ lita service create <NAME> <*VALUE> # Value will be set to 0 if empty.
21
+ lita service show <NAME>
22
+ lita service delete|remove <NAME>
23
+
24
+ lita service <NAME> inscribe <CUSTOMER> <*VALUE> # Value will be set to service's value if empty.
25
+ lita service <NAME> delete|remove <CUSTOMER>
26
+ lita service <NAME> add|sum <CUSTOMER> <*QUANTITY> # Quantity will be set to 1 if empty.
27
+ lita service <NAME> add|sum all <*QUANTITY> # Quantity will be set to 1 if empty.
28
+ lita service <NAME> value <CUSTOMER> <VALUE>
29
+ lita service <NAME> reset <CUSTOMER>
30
+ ```
31
+
32
+ To show the available commands
33
+ ```
34
+ lito help service
35
+ ```
36
+
37
+ ## Example
38
+
39
+ ``` sh
40
+ lita service list
41
+ lita service create awesome-service 200
42
+ lita service show awesome-service
43
+ lita service delete awesome-service
44
+ lita service remove awesome-service
45
+
46
+ lita service awesome-service inscribe erlinis
47
+ lita service awesome-service add erlinis 2
48
+ lita service awesome-service sum erlinis 2
49
+ lita service awesome-service add all 3
50
+ lita service awesome-service sum all 3
51
+ lita service awesome-service delete erlinis
52
+ lita service awesome-service remove erlinis
53
+ lita service awesome-service value erlinis 300
54
+ lita service awesome-service reset erlinis
55
+ ```
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+ require 'bundler/gem_tasks'
3
+ require 'rspec/core/rake_task'
4
+ require 'rubocop/rake_task'
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+ RuboCop::RakeTask.new
8
+
9
+ task default: [:spec, :rubocop]
data/dump.rdb ADDED
Binary file
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+ require 'lita'
3
+
4
+ Lita.load_locales Dir[File.expand_path(
5
+ File.join('..', '..', 'locales', '*.yml'), __FILE__
6
+ )]
7
+
8
+ require 'lita/handlers/service'
9
+ require 'lita/handlers/customer'
10
+ require 'lita/interactors/base_interactor'
11
+ require 'lita/interactors/list_services'
12
+ require 'lita/interactors/create_service'
13
+ require 'lita/interactors/show_service'
14
+ require 'lita/interactors/delete_service'
15
+ require 'lita/interactors/inscribe_customer'
16
+ require 'lita/interactors/change_value'
17
+ require 'lita/interactors/add_quantity'
18
+ require 'lita/interactors/reset_quantity'
19
+ require 'lita/interactors/add_all'
20
+ require 'lita/interactors/delete_customer'
21
+ require 'lita/helpers/messages_helper'
22
+
23
+ Lita::Handlers::Service.template_root File.expand_path(
24
+ File.join('..', '..', 'templates'),
25
+ __FILE__
26
+ )
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+ module Lita
3
+ module Handlers
4
+ # Handles all commands related to the customer
5
+ class Customer < Handler
6
+ namespace :service
7
+
8
+ def self.template_root
9
+ File.expand_path('../../../templates', __dir__)
10
+ end
11
+
12
+ # Routes
13
+ route(/service ([\w-]+) inscribe ([\@\w-]+)( [0-9]*)?/, :inscribe,
14
+ command: true,
15
+ help: { 'service _<name>_ inscribe _<user> <*value>_' =>
16
+ 'Registers to _<user>_ with value _<*value>_ on service _<name>_' })
17
+
18
+ route(/service ([\w-]+) (add|sum) ((?!(?:all))[\@\w-]+)( [0-9-]*)?/, :add,
19
+ command: true,
20
+ help: { 'service _<name>_ add|sum _<user> <*quantity>_' =>
21
+ 'Adds _<*quantity>_ or 1 to a _<user>_ ' })
22
+
23
+ route(/service ([\w-]+) (add|sum) all( [0-9-]*)?$/, :add_all,
24
+ command: true,
25
+ help: { 'service _<name>_ add|sum all _<*quantity>_' =>
26
+ 'Adds _<*quantity>_ or 1 to all users on service' })
27
+
28
+ route(/service ([\w-]+) reset ([\@\w-]+)/, :reset,
29
+ command: true,
30
+ help: { 'service _<name>_ reset _<user>_' =>
31
+ 'Sets the quantity of the _<user>_ to zero' })
32
+
33
+ route(/service ([\w-]+) value ([\@\w-]+) ([0-9-]*)$/, :change_value,
34
+ command: true,
35
+ help: { 'service _<name>_ value _<user> <value>_' =>
36
+ 'Sets the value _<value>_ to the _<user>_ on service' })
37
+
38
+ route(/service ([\w-]+) (delete|remove) ([\@\w-]+)/, :delete_customer,
39
+ command: true,
40
+ help: { 'service _<name>_ delete|remove _<user>_' =>
41
+ 'Deletes a _<user>_ from a service called _<name>_' })
42
+
43
+ # Callbacks
44
+ def inscribe(response)
45
+ interactor = Interactors::InscribeCustomer.new(self, response.match_data).perform
46
+ template = :message
47
+ message = { message: interactor.message }
48
+ reply(template, message, response, interactor)
49
+ end
50
+
51
+ def change_value(response)
52
+ interactor = Interactors::ChangeValue.new(self, response.match_data).perform
53
+ template = :message
54
+ message = { message: interactor.message }
55
+ reply(template, message, response, interactor)
56
+ end
57
+
58
+ def add(response)
59
+ interactor = Interactors::AddQuantity.new(self, response.match_data).perform
60
+ template = :message
61
+ message = { message: interactor.message }
62
+ reply(template, message, response, interactor)
63
+ end
64
+
65
+ def add_all(response)
66
+ interactor = Interactors::AddAll.new(self, response.match_data).perform
67
+ template = :message
68
+ message = { message: interactor.message }
69
+ reply(template, message, response, interactor)
70
+ end
71
+
72
+ def reset(response)
73
+ interactor = Interactors::ResetQuantity.new(self, response.match_data).perform
74
+ template = :message
75
+ message = { message: interactor.message }
76
+ reply(template, message, response, interactor)
77
+ end
78
+
79
+ def delete_customer(response)
80
+ interactor = Interactors::DeleteCustomer.new(self, response.match_data).perform
81
+ template = :message
82
+ message = { message: interactor.message }
83
+ reply(template, message, response, interactor)
84
+ end
85
+
86
+ def reply(template, message, response, interactor)
87
+ unless interactor.success?
88
+ template = :error
89
+ message = { error: interactor.error }
90
+ end
91
+ response.reply(render_template(template, message))
92
+ end
93
+
94
+ Lita.register_handler(self)
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+ module Lita
3
+ module Handlers
4
+ # Handles all commands relative to the service
5
+ class Service < Handler
6
+ namespace :service
7
+
8
+ # Routes
9
+ route(/service ping/, :pong,
10
+ command: true,
11
+ help: { 'service ping' =>
12
+ 'Replys _pong_ if the plugin is running' })
13
+
14
+ route(/service list/, :list,
15
+ command: true,
16
+ help: { 'service list' =>
17
+ 'List all services' })
18
+
19
+ route(/service create ([\w-]+)( [0-9]*)?/, :create,
20
+ command: true,
21
+ help: { 'service create _<name> <*value>_' =>
22
+ 'Create a new service called _<name>_ with value _<*value>_' })
23
+
24
+ route(/service show ([\w-]+)/, :show,
25
+ command: true,
26
+ help: { 'service show _<name>_' =>
27
+ 'Shows information on service called _<name>_' })
28
+
29
+ route(/service (delete|remove) ([\w-]+)/, :delete,
30
+ command: true,
31
+ help: { 'service delete|remove _<name>_' =>
32
+ 'Deletes a service called _<name>_' })
33
+
34
+ # Callbacks
35
+ def pong(response)
36
+ response.reply 'pong!'
37
+ end
38
+
39
+ def list(response)
40
+ interactor = Interactors::ListServices.new(self, response.match_data).perform
41
+ template = :list_services
42
+ message = { services: interactor.message }
43
+ reply(template, message, response, interactor)
44
+ end
45
+
46
+ def create(response)
47
+ interactor = Interactors::CreateService.new(self, response.match_data).perform
48
+ template = :service_created
49
+ message = { service: interactor.message }
50
+ reply(template, message, response, interactor)
51
+ end
52
+
53
+ def show(response)
54
+ interactor = Interactors::ShowService.new(self, response.match_data).perform
55
+ template = :service_show
56
+ message = { service: interactor.message }
57
+ reply(template, message, response, interactor)
58
+ end
59
+
60
+ def delete(response)
61
+ interactor = Interactors::DeleteService.new(self, response.match_data).perform
62
+ template = :message
63
+ message = { message: interactor.message }
64
+ reply(template, message, response, interactor)
65
+ end
66
+
67
+ def reply(template, message, response, interactor)
68
+ unless interactor.success?
69
+ template = :error
70
+ message = { error: interactor.error }
71
+ end
72
+ response.reply(render_template(template, message))
73
+ end
74
+
75
+ Lita.register_handler(self)
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+ module Lita
3
+ module Helpers
4
+ # Message Helper
5
+ module MessagesHelper
6
+ def msg_duplicated(service_name:)
7
+ I18n.t('lita.handlers.service.errors.duplicated',
8
+ service_name: service_name)
9
+ end
10
+
11
+ def msg_not_found(service_name:)
12
+ I18n.t('lita.handlers.service.errors.not_found',
13
+ service_name: service_name)
14
+ end
15
+
16
+ def msg_customer_not_found(service_name:, customer_name:)
17
+ I18n.t('lita.handlers.service.customer.not_found',
18
+ service_name: service_name, customer_name: customer_name)
19
+ end
20
+
21
+ def msg_customer_duplicated(service_name:, customer_name:)
22
+ I18n.t('lita.handlers.service.customer.duplicated',
23
+ service_name: service_name,
24
+ customer_name: customer_name)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+ require 'lita/helpers/messages_helper'
3
+
4
+ module Lita
5
+ module Interactors
6
+ # Increases all customers' quantity with the given value
7
+ # or with 1 if nothing is specified.
8
+ class AddAll < BaseInteractor
9
+ include Lita::Helpers::MessagesHelper
10
+
11
+ attr_reader :data
12
+ DEFAULT_QUANTITY = 1
13
+
14
+ def initialize(handler, data)
15
+ @handler = handler
16
+ @data = data
17
+ end
18
+
19
+ def perform
20
+ if service_exists?
21
+ update_all_quantities
22
+ else
23
+ @error = msg_not_found(service_name: name)
24
+ end
25
+ self
26
+ end
27
+
28
+ private
29
+
30
+ def name
31
+ @name ||= data[1]
32
+ end
33
+
34
+ def given_quantity
35
+ @customer_quantity ||= data[3].to_s
36
+ end
37
+
38
+ def service
39
+ @service ||= repository.find(name)
40
+ end
41
+
42
+ def service_exists?
43
+ repository.exists?(name)
44
+ end
45
+
46
+ def update_all_quantities
47
+ increment_quantities
48
+ repository.update(service)
49
+ @message = I18n.t('lita.handlers.service.add_all.success',
50
+ quantity: quantity_calculated)
51
+ end
52
+
53
+ def increment_quantities
54
+ quantity = quantity_calculated
55
+ service[:customers].map do |_key, customer_data|
56
+ customer_data[:quantity] += quantity
57
+ end
58
+ end
59
+
60
+ def quantity_calculated
61
+ return given_quantity.to_i unless given_quantity.empty?
62
+ DEFAULT_QUANTITY
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+ require 'lita/helpers/messages_helper'
3
+
4
+ module Lita
5
+ module Interactors
6
+ # Adds the given quantity to the customer's balance
7
+ class AddQuantity < BaseInteractor
8
+ include Lita::Helpers::MessagesHelper
9
+
10
+ attr_reader :data
11
+ DEFAULT_QUANTITY = 1
12
+
13
+ def initialize(handler, data)
14
+ @handler = handler
15
+ @data = data
16
+ end
17
+
18
+ def perform
19
+ if service_exists?
20
+ update_costumer_if_exist
21
+ else
22
+ @error = msg_not_found(service_name: name)
23
+ end
24
+ self
25
+ end
26
+
27
+ private
28
+
29
+ def name
30
+ @name ||= data[1]
31
+ end
32
+
33
+ def customer_name
34
+ @customer_name ||= data[3].delete('@')
35
+ end
36
+
37
+ def customer_quantity
38
+ @customer_quantity ||= data[4].to_s
39
+ end
40
+
41
+ def service
42
+ @service ||= repository.find(name)
43
+ end
44
+
45
+ def service_exists?
46
+ repository.exists?(name)
47
+ end
48
+
49
+ def customer_exists?
50
+ service[:customers].keys.include?(customer_name.to_sym)
51
+ end
52
+
53
+ def update_costumer_if_exist
54
+ if customer_exists?
55
+ update_customer_quantity
56
+ else
57
+ @error = msg_customer_not_found(service_name: name,
58
+ customer_name: customer_name)
59
+ end
60
+ end
61
+
62
+ def update_customer_quantity
63
+ new_quantity = increment_quantity
64
+ repository.update(service)
65
+ @message = I18n.t('lita.handlers.service.add.success',
66
+ quantity: quantity_calculated,
67
+ customer_name: customer_name,
68
+ customer_quantity: new_quantity)
69
+ end
70
+
71
+ def increment_quantity
72
+ service[:customers][customer_name.to_sym][:quantity] += quantity_calculated
73
+ end
74
+
75
+ def quantity_calculated
76
+ return customer_quantity.to_i unless customer_quantity.empty?
77
+ DEFAULT_QUANTITY
78
+ end
79
+ end
80
+ end
81
+ end