lita 2.2.0 → 2.2.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 +4 -4
- data/.travis.yml +1 -1
- data/README.md +1 -1
- data/Rakefile +7 -0
- data/lib/lita.rb +1 -1
- data/lib/lita/adapters/shell.rb +9 -3
- data/lib/lita/authorization.rb +3 -1
- data/lib/lita/config.rb +2 -3
- data/lib/lita/handler.rb +39 -21
- data/lib/lita/handlers/authorization.rb +32 -17
- data/lib/lita/handlers/help.rb +32 -7
- data/lib/lita/{rack_app_builder.rb → rack_app.rb} +35 -31
- data/lib/lita/robot.rb +1 -1
- data/lib/lita/rspec.rb +30 -14
- data/lib/lita/rspec/handler.rb +48 -22
- data/lib/lita/version.rb +1 -1
- data/lita.gemspec +1 -0
- data/spec/lita/authorization_spec.rb +5 -0
- data/spec/lita/handlers/authorization_spec.rb +6 -13
- data/spec/lita/handlers/help_spec.rb +16 -0
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ffbba6c703174e7a6984339b41e1b6b3ce01e617
|
4
|
+
data.tar.gz: 5d30f8db3d352fd2dacf9e3fb752d434ab6230d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e5d699a894adf21dd032822f4b3e03b1271e4f49d1330abe1cef0a99d4af9f710aa2934277474ae6a72700b16fc48abee34777f6ca9bec34fc19a7fb6c421009
|
7
|
+
data.tar.gz: 62e5a1586f950a4385d40c0cab802d7e9eef5dd07900657ef8640dc59ad9c4a9a3972b402c327f6cff2c83be9ad933ce2f4adc7ef4a5699093fb3b9ffcb2870d
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
data/Rakefile
CHANGED
data/lib/lita.rb
CHANGED
@@ -100,7 +100,7 @@ require "lita/authorization"
|
|
100
100
|
require "lita/message"
|
101
101
|
require "lita/response"
|
102
102
|
require "lita/http_route"
|
103
|
-
require "lita/
|
103
|
+
require "lita/rack_app"
|
104
104
|
require "lita/robot"
|
105
105
|
require "lita/adapter"
|
106
106
|
require "lita/adapters/shell"
|
data/lib/lita/adapters/shell.rb
CHANGED
@@ -14,9 +14,7 @@ module Lita
|
|
14
14
|
print "#{robot.name} > "
|
15
15
|
input = $stdin.gets.chomp.strip
|
16
16
|
break if input == "exit" || input == "quit"
|
17
|
-
|
18
|
-
message.command! if Lita.config.adapter.private_chat
|
19
|
-
robot.receive(message)
|
17
|
+
robot.receive(build_message(robot, input, source))
|
20
18
|
end
|
21
19
|
end
|
22
20
|
|
@@ -34,6 +32,14 @@ module Lita
|
|
34
32
|
def shut_down
|
35
33
|
puts
|
36
34
|
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def build_message(robot, input, source)
|
39
|
+
message = Message.new(robot, input, source)
|
40
|
+
message.command! if Lita.config.adapter.private_chat
|
41
|
+
message
|
42
|
+
end
|
37
43
|
end
|
38
44
|
|
39
45
|
Lita.register_adapter(:shell, Shell)
|
data/lib/lita/authorization.rb
CHANGED
@@ -31,7 +31,9 @@ module Lita
|
|
31
31
|
# @param group [Symbol, String] The name of the group.
|
32
32
|
# @return [Boolean] Whether or not the user is in the group.
|
33
33
|
def user_in_group?(user, group)
|
34
|
-
|
34
|
+
group = normalize_group(group)
|
35
|
+
return user_is_admin?(user) if group == "admins"
|
36
|
+
redis.sismember(group, user.id)
|
35
37
|
end
|
36
38
|
|
37
39
|
# Checks if a user is an administrator.
|
data/lib/lita/config.rb
CHANGED
@@ -5,7 +5,7 @@ module Lita
|
|
5
5
|
# Initializes a new Config object with the default settings.
|
6
6
|
# @return [Lita::Config] The default configuration.
|
7
7
|
def default_config
|
8
|
-
|
8
|
+
new.tap do |c|
|
9
9
|
c.robot = new
|
10
10
|
c.robot.name = "Lita"
|
11
11
|
c.robot.adapter = :shell
|
@@ -17,9 +17,8 @@ module Lita
|
|
17
17
|
c.http.debug = false
|
18
18
|
c.adapter = new
|
19
19
|
c.handlers = new
|
20
|
+
load_handler_configs(c)
|
20
21
|
end
|
21
|
-
load_handler_configs(config)
|
22
|
-
config
|
23
22
|
end
|
24
23
|
|
25
24
|
# Loads configuration from a user configuration file.
|
data/lib/lita/handler.rb
CHANGED
@@ -51,24 +51,17 @@ module Lita
|
|
51
51
|
# @param message [Lita::Message] The incoming message.
|
52
52
|
# @return [void]
|
53
53
|
def dispatch(robot, message)
|
54
|
-
routes.each do |route|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
Lita.logger.error <<-ERROR.chomp
|
66
|
-
#{name} crashed. The exception was:
|
67
|
-
#{e.message}
|
68
|
-
#{e.backtrace.join("\n")}
|
69
|
-
ERROR
|
70
|
-
raise e if rspec_loaded?
|
71
|
-
end
|
54
|
+
routes.select { |r| route_applies?(r, message, robot) }.each do |route|
|
55
|
+
log_dispatch(route)
|
56
|
+
|
57
|
+
begin
|
58
|
+
new(robot).public_send(
|
59
|
+
route.method_name,
|
60
|
+
build_response(message, route)
|
61
|
+
)
|
62
|
+
rescue Exception => e
|
63
|
+
log_dispatch_error(e)
|
64
|
+
raise e if rspec_loaded?
|
72
65
|
end
|
73
66
|
end
|
74
67
|
end
|
@@ -102,6 +95,11 @@ ERROR
|
|
102
95
|
|
103
96
|
private
|
104
97
|
|
98
|
+
# Builds a response object for an incoming message.
|
99
|
+
def build_response(message, route)
|
100
|
+
Response.new(message, matches: message.match(route.pattern))
|
101
|
+
end
|
102
|
+
|
105
103
|
# Determines whether or not an incoming messages should trigger a route.
|
106
104
|
def route_applies?(route, message, robot)
|
107
105
|
# Message must match the pattern
|
@@ -114,9 +112,7 @@ ERROR
|
|
114
112
|
return if message.user.name == robot.name
|
115
113
|
|
116
114
|
# User must be in auth group if route is restricted
|
117
|
-
return
|
118
|
-
Authorization.user_in_group?(message.user, group)
|
119
|
-
end
|
115
|
+
return unless authorized?(message.user, route.required_groups)
|
120
116
|
|
121
117
|
true
|
122
118
|
end
|
@@ -126,6 +122,28 @@ ERROR
|
|
126
122
|
def rspec_loaded?
|
127
123
|
defined?(::RSpec)
|
128
124
|
end
|
125
|
+
|
126
|
+
# Checks if the user is authorized to at least one of the given groups.
|
127
|
+
def authorized?(user, required_groups)
|
128
|
+
required_groups.nil? || required_groups.any? do |group|
|
129
|
+
Authorization.user_in_group?(user, group)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
# Logs the dispatch of message.
|
134
|
+
def log_dispatch(route)
|
135
|
+
Lita.logger.debug <<-LOG.chomp
|
136
|
+
Dispatching message to #{self}##{route.method_name}.
|
137
|
+
LOG
|
138
|
+
end
|
139
|
+
|
140
|
+
def log_dispatch_error(e)
|
141
|
+
Lita.logger.error <<-ERROR.chomp
|
142
|
+
#{name} crashed. The exception was:
|
143
|
+
#{e.message}
|
144
|
+
#{e.backtrace.join("\n")}
|
145
|
+
ERROR
|
146
|
+
end
|
129
147
|
end
|
130
148
|
|
131
149
|
# @param robot [Lita::Robot] The currently running robot.
|
@@ -2,16 +2,32 @@ module Lita
|
|
2
2
|
module Handlers
|
3
3
|
# Provides a chat interface for administering authorization groups.
|
4
4
|
class Authorization < Handler
|
5
|
-
route(
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
5
|
+
route(
|
6
|
+
/^auth\s+add/,
|
7
|
+
:add,
|
8
|
+
command: true,
|
9
|
+
restrict_to: :admins,
|
10
|
+
help: {
|
11
|
+
"auth add USER GROUP" => <<-HELP.chomp
|
12
|
+
Add USER to authorization group GROUP. Requires admin privileges.
|
13
|
+
HELP
|
14
|
+
}
|
15
|
+
)
|
16
|
+
route(
|
17
|
+
/^auth\s+remove/,
|
18
|
+
:remove,
|
19
|
+
command: true,
|
20
|
+
restrict_to: :admins,
|
21
|
+
help: {
|
22
|
+
"auth remove USER GROUP" => <<-HELP.chomp
|
23
|
+
Remove USER from authorization group GROUP. Requires admin privileges.
|
24
|
+
HELP
|
25
|
+
}
|
26
|
+
)
|
27
|
+
route(/^auth\s+list/, :list, command: true, restrict_to: :admins, help: {
|
28
|
+
"auth list [GROUP]" => <<-HELP.chomp
|
13
29
|
List authorization groups and the users in them. If GROUP is supplied, only \
|
14
|
-
lists that group.
|
30
|
+
lists that group.
|
15
31
|
HELP
|
16
32
|
})
|
17
33
|
|
@@ -21,10 +37,7 @@ HELP
|
|
21
37
|
def add(response)
|
22
38
|
return unless valid_message?(response)
|
23
39
|
|
24
|
-
|
25
|
-
when :unauthorized
|
26
|
-
response.reply "Only administrators can add users to groups."
|
27
|
-
when true
|
40
|
+
if Lita::Authorization.add_user_to_group(response.user, @user, @group)
|
28
41
|
response.reply "#{@user.name} was added to #{@group}."
|
29
42
|
else
|
30
43
|
response.reply "#{@user.name} was already in #{@group}."
|
@@ -37,14 +50,11 @@ HELP
|
|
37
50
|
def remove(response)
|
38
51
|
return unless valid_message?(response)
|
39
52
|
|
40
|
-
|
53
|
+
if Lita::Authorization.remove_user_from_group(
|
41
54
|
response.user,
|
42
55
|
@user,
|
43
56
|
@group
|
44
57
|
)
|
45
|
-
when :unauthorized
|
46
|
-
response.reply "Only administrators can remove users from groups."
|
47
|
-
when true
|
48
58
|
response.reply "#{@user.name} was removed from #{@group}."
|
49
59
|
else
|
50
60
|
response.reply "#{@user.name} was not in #{@group}."
|
@@ -96,6 +106,11 @@ HELP
|
|
96
106
|
return
|
97
107
|
end
|
98
108
|
|
109
|
+
if @group.downcase.strip == "admins"
|
110
|
+
response.reply "Administrators can only be managed via Lita config."
|
111
|
+
return
|
112
|
+
end
|
113
|
+
|
99
114
|
@user = User.find_by_id(identifier)
|
100
115
|
@user = User.find_by_name(identifier) unless @user
|
101
116
|
|
data/lib/lita/handlers/help.rb
CHANGED
@@ -3,35 +3,60 @@ module Lita
|
|
3
3
|
# Provides online help about Lita commands for users.
|
4
4
|
class Help < Handler
|
5
5
|
route(/^help\s*(.+)?/, :help, command: true, help: {
|
6
|
-
"help" =>
|
7
|
-
|
6
|
+
"help" => %{
|
7
|
+
Lists help information for terms and command the robot will respond to.
|
8
|
+
}.gsub(/\n/, ""),
|
9
|
+
"help COMMAND" => %{
|
10
|
+
Lists help information for terms or commands that begin with COMMAND.
|
11
|
+
}.gsub(/\n/, "")
|
8
12
|
})
|
9
13
|
|
10
14
|
# Outputs help information about Lita commands.
|
11
15
|
# @param response [Lita::Response] The response object.
|
12
16
|
# @return [void]
|
13
17
|
def help(response)
|
18
|
+
output = build_help(response)
|
19
|
+
output = filter_help(output, response)
|
20
|
+
response.reply output.join("\n")
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
# Checks if the user is authorized to at least one of the given groups.
|
26
|
+
def authorized?(user, required_groups)
|
27
|
+
required_groups.nil? || required_groups.any? do |group|
|
28
|
+
Lita::Authorization.user_in_group?(user, group)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Creates an array of help info for all registered routes.
|
33
|
+
def build_help(response)
|
14
34
|
output = []
|
15
35
|
|
16
36
|
Lita.handlers.each do |handler|
|
17
37
|
handler.routes.each do |route|
|
18
38
|
route.help.each do |command, description|
|
39
|
+
next unless authorized?(response.user, route.required_groups)
|
19
40
|
command = "#{name}: #{command}" if route.command?
|
20
41
|
output << "#{command} - #{description}"
|
21
42
|
end
|
22
43
|
end
|
23
44
|
end
|
24
45
|
|
46
|
+
output
|
47
|
+
end
|
48
|
+
|
49
|
+
# Filters the help output by an optional command.
|
50
|
+
def filter_help(output, response)
|
25
51
|
filter = response.matches[0][0]
|
52
|
+
|
26
53
|
if filter
|
27
|
-
output.select
|
54
|
+
output.select { |line| /(?:@?#{name}[:,]?)?#{filter}/i === line }
|
55
|
+
else
|
56
|
+
output
|
28
57
|
end
|
29
|
-
|
30
|
-
response.reply output.join("\n")
|
31
58
|
end
|
32
59
|
|
33
|
-
private
|
34
|
-
|
35
60
|
# The way the bot should be addressed in order to trigger a command.
|
36
61
|
def name
|
37
62
|
Lita.config.robot.mention_name || Lita.config.robot.name
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Lita
|
2
|
-
#
|
3
|
-
class
|
2
|
+
# A +Rack+ application to serve routes registered by handlers.
|
3
|
+
class RackApp
|
4
4
|
# The character that separates the pieces of a URL's path component.
|
5
5
|
PATH_SEPARATOR = "/"
|
6
6
|
|
@@ -26,44 +26,33 @@ module Lita
|
|
26
26
|
compile
|
27
27
|
end
|
28
28
|
|
29
|
+
def call(env)
|
30
|
+
request = Rack::Request.new(env)
|
31
|
+
mapping = get_mapping(request)
|
32
|
+
|
33
|
+
if mapping
|
34
|
+
serve(mapping, request)
|
35
|
+
elsif request.head? && all_paths.include?(request.path)
|
36
|
+
Lita.logger.info "HTTP HEAD #{request.path} was a 204."
|
37
|
+
[204, {}, []]
|
38
|
+
else
|
39
|
+
Lita.logger.info <<-LOG.chomp
|
40
|
+
HTTP #{request.request_method} #{request.path} was a 404.
|
41
|
+
LOG
|
42
|
+
[404, {}, ["Route not found."]]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
29
46
|
# Creates a +Rack+ application from the compiled routes.
|
30
47
|
# @return [Rack::Builder] The +Rack+ application.
|
31
48
|
def to_app
|
32
49
|
app = Rack::Builder.new
|
33
|
-
app.run(
|
50
|
+
app.run(self)
|
34
51
|
app
|
35
52
|
end
|
36
53
|
|
37
54
|
private
|
38
55
|
|
39
|
-
# The proc that serves as the +Rack+ application.
|
40
|
-
def app_proc
|
41
|
-
-> (env) do
|
42
|
-
request = Rack::Request.new(env)
|
43
|
-
|
44
|
-
mapping = routes[request.request_method][request.path]
|
45
|
-
|
46
|
-
if mapping
|
47
|
-
Lita.logger.info <<-LOG.chomp
|
48
|
-
Routing HTTP #{request.request_method} #{request.path} to \
|
49
|
-
#{mapping.handler}##{mapping.method_name}.
|
50
|
-
LOG
|
51
|
-
response = Rack::Response.new
|
52
|
-
instance = mapping.handler.new(robot)
|
53
|
-
instance.public_send(mapping.method_name, request, response)
|
54
|
-
response.finish
|
55
|
-
elsif request.head? && all_paths.include?(request.path)
|
56
|
-
Lita.logger.info "HTTP HEAD #{request.path} was a 204."
|
57
|
-
[204, {}, []]
|
58
|
-
else
|
59
|
-
Lita.logger.info <<-LOG.chomp
|
60
|
-
HTTP #{request.request_method} #{request.path} was a 404.
|
61
|
-
LOG
|
62
|
-
[404, {}, ["Route not found."]]
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
56
|
# Collect all registered paths. Used for responding to HEAD requests.
|
68
57
|
def collect_paths
|
69
58
|
@all_paths = routes.values.map { |hash| hash.keys.first }.uniq
|
@@ -77,6 +66,10 @@ LOG
|
|
77
66
|
collect_paths
|
78
67
|
end
|
79
68
|
|
69
|
+
def get_mapping(request)
|
70
|
+
routes[request.request_method][request.path]
|
71
|
+
end
|
72
|
+
|
80
73
|
# Registers a route.
|
81
74
|
def register_route(handler, route)
|
82
75
|
cleaned_path = clean_path(route.path)
|
@@ -99,6 +92,17 @@ LOG
|
|
99
92
|
)
|
100
93
|
end
|
101
94
|
|
95
|
+
def serve(mapping, request)
|
96
|
+
Lita.logger.info <<-LOG.chomp
|
97
|
+
Routing HTTP #{request.request_method} #{request.path} to \
|
98
|
+
#{mapping.handler}##{mapping.method_name}.
|
99
|
+
LOG
|
100
|
+
response = Rack::Response.new
|
101
|
+
instance = mapping.handler.new(robot)
|
102
|
+
instance.public_send(mapping.method_name, request, response)
|
103
|
+
response.finish
|
104
|
+
end
|
105
|
+
|
102
106
|
# Ensures that paths begin with one slash and do not end with one.
|
103
107
|
def clean_path(path)
|
104
108
|
path.strip!
|
data/lib/lita/robot.rb
CHANGED
data/lib/lita/rspec.rb
CHANGED
@@ -16,20 +16,36 @@ require "lita/rspec/handler"
|
|
16
16
|
module Lita
|
17
17
|
# Extras for +RSpec+ that facilitate the testing of Lita code.
|
18
18
|
module RSpec
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
19
|
+
class << self
|
20
|
+
# Causes all interaction with Redis to use a test-specific namespace.
|
21
|
+
# Clears Redis before each example. Stubs the logger to prevent log
|
22
|
+
# messages from cluttering test output. Clears Lita's global
|
23
|
+
# configuration.
|
24
|
+
# @param base [Object] The class including the module.
|
25
|
+
# @return [void]
|
26
|
+
def included(base)
|
27
|
+
base.class_eval do
|
28
|
+
before do
|
29
|
+
logger = double("Logger").as_null_object
|
30
|
+
allow(Lita).to receive(:logger).and_return(logger)
|
31
|
+
Lita.clear_config
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
set_up_redis(base)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
# Set up Redis to use the test namespace and clear out before each
|
41
|
+
# example.
|
42
|
+
def set_up_redis(base)
|
43
|
+
base.class_eval do
|
44
|
+
before do
|
45
|
+
stub_const("Lita::REDIS_NAMESPACE", "lita.test")
|
46
|
+
keys = Lita.redis.keys("*")
|
47
|
+
Lita.redis.del(keys) unless keys.empty?
|
48
|
+
end
|
33
49
|
end
|
34
50
|
end
|
35
51
|
end
|
data/lib/lita/rspec/handler.rb
CHANGED
@@ -2,28 +2,50 @@ module Lita
|
|
2
2
|
module RSpec
|
3
3
|
# Extras for +RSpec+ to facilitate testing Lita handlers.
|
4
4
|
module Handler
|
5
|
-
|
6
|
-
|
7
|
-
base
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
5
|
+
class << self
|
6
|
+
# Sets up the RSpec environment to easily test Lita handlers.
|
7
|
+
def included(base)
|
8
|
+
base.class_eval do
|
9
|
+
include Lita::RSpec
|
10
|
+
end
|
11
|
+
|
12
|
+
set_up_let_blocks(base)
|
13
|
+
set_up_subject(base)
|
14
|
+
set_up_before_block(base)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
# Stub Lita.handlers and Lita::Robot#send_messages.
|
20
|
+
def set_up_before_block(base)
|
21
|
+
base.class_eval do
|
22
|
+
before do
|
23
|
+
allow(Lita).to receive(:handlers).and_return([described_class])
|
24
|
+
[:send_messages, :send_message].each do |message|
|
25
|
+
allow(robot).to receive(message) do |target, *strings|
|
26
|
+
replies.concat(strings)
|
27
|
+
end
|
28
|
+
end
|
24
29
|
end
|
25
30
|
end
|
26
31
|
end
|
32
|
+
|
33
|
+
# Create common test objects.
|
34
|
+
def set_up_let_blocks(base)
|
35
|
+
base.class_eval do
|
36
|
+
let(:robot) { Robot.new }
|
37
|
+
let(:source) { Source.new(user) }
|
38
|
+
let(:user) { User.create("1", name: "Test User") }
|
39
|
+
let(:replies) { [] }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Set up a working test subject.
|
44
|
+
def set_up_subject(base)
|
45
|
+
base.class_eval do
|
46
|
+
subject { described_class.new(robot) }
|
47
|
+
end
|
48
|
+
end
|
27
49
|
end
|
28
50
|
|
29
51
|
# Sends a message to the robot.
|
@@ -48,8 +70,8 @@ module Lita
|
|
48
70
|
send_message("#{robot.mention_name}: #{body}", as: as)
|
49
71
|
end
|
50
72
|
|
51
|
-
# Starts a chat routing test chain, asserting that a message should
|
52
|
-
# a route.
|
73
|
+
# Starts a chat routing test chain, asserting that a message should
|
74
|
+
# trigger a route.
|
53
75
|
# @param message [String] The message that should trigger the route.
|
54
76
|
# @return [RouteMatcher] A {RouteMatcher} that should have +to+ called on
|
55
77
|
# it to complete the test.
|
@@ -82,7 +104,11 @@ module Lita
|
|
82
104
|
# @return [RouteMatcher] A {RouteMatcher} that should have +to+ called on
|
83
105
|
# it to complete the test.
|
84
106
|
def does_not_route_command(message)
|
85
|
-
RouteMatcher.new(
|
107
|
+
RouteMatcher.new(
|
108
|
+
self,
|
109
|
+
"#{robot.mention_name}: #{message}",
|
110
|
+
invert: true
|
111
|
+
)
|
86
112
|
end
|
87
113
|
alias_method :doesnt_route_command, :does_not_route_command
|
88
114
|
|
data/lib/lita/version.rb
CHANGED
data/lita.gemspec
CHANGED
@@ -61,6 +61,11 @@ describe Lita::Authorization, lita: true do
|
|
61
61
|
it "returns false if the user is in the group" do
|
62
62
|
expect(described_class.user_in_group?(user, "employees")).to be_false
|
63
63
|
end
|
64
|
+
|
65
|
+
it "delegates to .user_is_admin? if the group is admins" do
|
66
|
+
expect(described_class).to receive(:user_is_admin?)
|
67
|
+
described_class.user_in_group?(user, "admins")
|
68
|
+
end
|
64
69
|
end
|
65
70
|
|
66
71
|
describe ".user_is_admin?" do
|
@@ -40,13 +40,9 @@ describe Lita::Handlers::Authorization, lita_handler: true do
|
|
40
40
|
expect(replies.last).to eq("#{target_user.name} was already in bar.")
|
41
41
|
end
|
42
42
|
|
43
|
-
it
|
44
|
-
|
45
|
-
|
46
|
-
user
|
47
|
-
).and_return(false)
|
48
|
-
send_command("auth add foo bar")
|
49
|
-
expect(replies.last).to match(/Only administrators can add/)
|
43
|
+
it %{replies with a warning if the group was "admins"} do
|
44
|
+
send_command("auth add foo admins")
|
45
|
+
expect(replies.last).to match(/Administrators can only be managed/)
|
50
46
|
end
|
51
47
|
end
|
52
48
|
|
@@ -67,12 +63,9 @@ describe Lita::Handlers::Authorization, lita_handler: true do
|
|
67
63
|
expect(replies.last).to eq("#{target_user.name} was not in bar.")
|
68
64
|
end
|
69
65
|
|
70
|
-
it
|
71
|
-
|
72
|
-
|
73
|
-
).and_return(false)
|
74
|
-
send_command("auth remove foo bar")
|
75
|
-
expect(replies.last).to match(/Only administrators can remove/)
|
66
|
+
it %{replies with a warning if the group was "admins"} do
|
67
|
+
send_command("auth add foo admins")
|
68
|
+
expect(replies.last).to match(/Administrators can only be managed/)
|
76
69
|
end
|
77
70
|
end
|
78
71
|
|
@@ -5,6 +5,13 @@ describe Lita::Handlers::Help, lita_handler: true do
|
|
5
5
|
it { routes_command("help foo").to(:help) }
|
6
6
|
|
7
7
|
describe "#help" do
|
8
|
+
let(:secret_handler_class) do
|
9
|
+
Class.new(Lita::Handler) do
|
10
|
+
route(/secret/, :secret, restrict_to: :the_nobodies, help: {
|
11
|
+
"secret" => "no one should ever see this help message"
|
12
|
+
})
|
13
|
+
end
|
14
|
+
end
|
8
15
|
it "sends help information for all commands" do
|
9
16
|
send_command("help")
|
10
17
|
expect(replies.last).to match(
|
@@ -17,5 +24,14 @@ describe Lita::Handlers::Help, lita_handler: true do
|
|
17
24
|
expect(replies.last).to match(/help COMMAND - Lists/)
|
18
25
|
expect(replies.last).not_to match(/help - Lists/)
|
19
26
|
end
|
27
|
+
|
28
|
+
it "doesn't show help for commands the user doesn't have access to" do
|
29
|
+
allow(Lita).to receive(:handlers).and_return([
|
30
|
+
described_class,
|
31
|
+
secret_handler_class
|
32
|
+
])
|
33
|
+
send_command("help")
|
34
|
+
expect(replies.last).not_to include("secret")
|
35
|
+
end
|
20
36
|
end
|
21
37
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lita
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.2.
|
4
|
+
version: 2.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jimmy Cuadra
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-08-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -178,6 +178,20 @@ dependencies:
|
|
178
178
|
- - '>='
|
179
179
|
- !ruby/object:Gem::Version
|
180
180
|
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: cane
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - '>='
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - '>='
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
181
195
|
description: A multi-service chat bot with extendable behavior.
|
182
196
|
email:
|
183
197
|
- jimmy@jimmycuadra.com
|
@@ -207,7 +221,7 @@ files:
|
|
207
221
|
- lib/lita/http_route.rb
|
208
222
|
- lib/lita/logger.rb
|
209
223
|
- lib/lita/message.rb
|
210
|
-
- lib/lita/
|
224
|
+
- lib/lita/rack_app.rb
|
211
225
|
- lib/lita/response.rb
|
212
226
|
- lib/lita/robot.rb
|
213
227
|
- lib/lita/rspec.rb
|