lita 3.0.3 → 3.0.4
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/.rubocop.yml +4 -0
- data/lib/lita/daemon.rb +3 -3
- data/lib/lita/handler.rb +4 -2
- data/lib/lita/rspec/matchers/event_subscription_matcher.rb +1 -1
- data/lib/lita/rspec/matchers/route_matcher.rb +1 -1
- data/lib/lita/timer.rb +5 -3
- data/lib/lita/user.rb +9 -10
- data/lib/lita/util.rb +9 -0
- data/lib/lita/version.rb +1 -1
- data/spec/lita/authorization_spec.rb +4 -4
- data/spec/lita/daemon_spec.rb +3 -3
- data/spec/lita/handler_spec.rb +14 -0
- data/spec/lita/handlers/authorization_spec.rb +3 -3
- data/spec/lita/handlers/info_spec.rb +1 -3
- data/spec/lita/user_spec.rb +9 -2
- data/spec/lita/util_spec.rb +7 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72bfc92024ae2bb828d19ddaa51b6234465522d8
|
4
|
+
data.tar.gz: 6849ff7eb590365266e4fa89c8f17a5c4c075e52
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bd119e2dfff11a6e2bdaafe556c03fd8ab9ce2d89f760474a96588dde7c0bc6316f6fd37de78df4fc9a1bd40ce4f7ea9208cb682d3ea65bead748f843d0f44c3
|
7
|
+
data.tar.gz: 3d3b9be32bca1ed13a2dcf9b4ad3b85df51530532f4e1e89fd10749fd7b7a56bd4cda1fda1a461125c953b11ede6d864159d33325c9281fad5a3d155704171ac
|
data/.rubocop.yml
CHANGED
data/lib/lita/daemon.rb
CHANGED
@@ -19,19 +19,19 @@ module Lita
|
|
19
19
|
Process.daemon(true)
|
20
20
|
File.open(@pid_path, "w") { |f| f.write(Process.pid) }
|
21
21
|
set_up_logs
|
22
|
-
at_exit { FileUtils.rm(@pid_path) if File.
|
22
|
+
at_exit { FileUtils.rm(@pid_path) if File.exist?(@pid_path) }
|
23
23
|
end
|
24
24
|
|
25
25
|
private
|
26
26
|
|
27
27
|
# Abort if Lita is already running.
|
28
28
|
def ensure_not_running
|
29
|
-
abort I18n.t("lita.daemon.pid_exists", path: @pid_path) if File.
|
29
|
+
abort I18n.t("lita.daemon.pid_exists", path: @pid_path) if File.exist?(@pid_path)
|
30
30
|
end
|
31
31
|
|
32
32
|
# Call the appropriate method depending on kill mode.
|
33
33
|
def handle_existing_process
|
34
|
-
if @kill_existing && File.
|
34
|
+
if @kill_existing && File.exist?(@pid_path)
|
35
35
|
kill_existing_process
|
36
36
|
else
|
37
37
|
ensure_not_running
|
data/lib/lita/handler.rb
CHANGED
@@ -200,20 +200,22 @@ module Lita
|
|
200
200
|
# Invokes the given block after the given number of seconds.
|
201
201
|
# @param interval [Integer] The number of seconds to wait before invoking the block.
|
202
202
|
# @yieldparam timer [Lita::Timer] The current {Lita::Timer} instance.
|
203
|
+
# @return [void]
|
203
204
|
# @since 3.0.0
|
204
205
|
def after(interval, &block)
|
205
|
-
Timer.new(interval: interval, &block).start
|
206
|
+
Thread.new { Timer.new(interval: interval, &block).start }
|
206
207
|
end
|
207
208
|
|
208
209
|
# Invokes the given block repeatedly, waiting the given number of seconds between each
|
209
210
|
# invocation.
|
210
211
|
# @param interval [Integer] The number of seconds to wait before each invocation of the block.
|
211
212
|
# @yieldparam timer [Lita::Timer] The current {Lita::Timer} instance.
|
213
|
+
# @return [void]
|
212
214
|
# @note The block should call {Lita::Timer#stop} at a terminating condition to avoid infinite
|
213
215
|
# recursion.
|
214
216
|
# @since 3.0.0
|
215
217
|
def every(interval, &block)
|
216
|
-
Timer.new(interval: interval, recurring: true, &block).start
|
218
|
+
Thread.new { Timer.new(interval: interval, recurring: true, &block).start }
|
217
219
|
end
|
218
220
|
|
219
221
|
# Creates a new +Faraday::Connection+ for making HTTP requests.
|
@@ -57,7 +57,7 @@ module Lita
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def set_description
|
60
|
-
description = %
|
60
|
+
description = %(#{description_prefix} "#{event_name}")
|
61
61
|
description << " to :#{expected_route}" if expected_route
|
62
62
|
::RSpec.current_example.metadata[:description] = description
|
63
63
|
end
|
@@ -59,7 +59,7 @@ module Lita
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def set_description
|
62
|
-
description = %
|
62
|
+
description = %(#{description_prefix} "#{message_body}")
|
63
63
|
description << " to :#{expected_route}" if expected_route
|
64
64
|
::RSpec.current_example.metadata[:description] = description
|
65
65
|
end
|
data/lib/lita/timer.rb
CHANGED
@@ -32,9 +32,11 @@ module Lita
|
|
32
32
|
|
33
33
|
# Sleep for the given interval, call the block, then run again if it's a recurring timer.
|
34
34
|
def run
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
loop do
|
36
|
+
sleep @interval
|
37
|
+
@block.call(self) if running? && @block
|
38
|
+
break unless running? && recurring?
|
39
|
+
end
|
38
40
|
end
|
39
41
|
|
40
42
|
# Is the timer currently running?
|
data/lib/lita/user.rb
CHANGED
@@ -8,18 +8,18 @@ module Lita
|
|
8
8
|
@redis ||= Redis::Namespace.new("users", redis: Lita.redis)
|
9
9
|
end
|
10
10
|
|
11
|
-
#
|
12
|
-
#
|
11
|
+
# Creates a new user with the given ID, or merges and saves supplied
|
12
|
+
# metadata to an existing user with the given ID.
|
13
13
|
# @param id [Integer, String] A unique identifier for the user.
|
14
14
|
# @param metadata [Hash] An optional hash of metadata about the user.
|
15
15
|
# @option metadata [String] name (id) The display name of the user.
|
16
16
|
# @return [Lita::User] The user.
|
17
17
|
def create(id, metadata = {})
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
existing_user = find_by_id(id)
|
19
|
+
metadata = Util.stringify_keys(metadata)
|
20
|
+
metadata = existing_user.metadata.merge(metadata) if existing_user
|
21
|
+
user = new(id, metadata)
|
22
|
+
user.save
|
23
23
|
user
|
24
24
|
end
|
25
25
|
|
@@ -94,8 +94,8 @@ module Lita
|
|
94
94
|
# @option metadata [String] name (id) The user's display name.
|
95
95
|
def initialize(id, metadata = {})
|
96
96
|
@id = id.to_s
|
97
|
-
@metadata = metadata
|
98
|
-
@name = @metadata[
|
97
|
+
@metadata = Util.stringify_keys(metadata)
|
98
|
+
@name = @metadata["name"] || @id
|
99
99
|
ensure_name_metadata_set
|
100
100
|
end
|
101
101
|
|
@@ -126,7 +126,6 @@ module Lita
|
|
126
126
|
# one value. It's not possible to store an empty hash key in Redis.
|
127
127
|
def ensure_name_metadata_set
|
128
128
|
username = metadata.delete("name")
|
129
|
-
username = metadata.delete(:name) unless username
|
130
129
|
metadata["name"] = username || id
|
131
130
|
end
|
132
131
|
|
data/lib/lita/util.rb
CHANGED
@@ -5,6 +5,15 @@ module Lita
|
|
5
5
|
ACRONYM_REGEX = /(?=a)b/
|
6
6
|
|
7
7
|
class << self
|
8
|
+
# Returns a hash with any symbol keys converted to strings.
|
9
|
+
# @param hash [Hash] The hash to convert.
|
10
|
+
# @return [Hash] The converted hash.
|
11
|
+
def stringify_keys(hash)
|
12
|
+
result = {}
|
13
|
+
hash.each_key { |key| result[key.to_s] = hash[key] }
|
14
|
+
result
|
15
|
+
end
|
16
|
+
|
8
17
|
# Transforms a camel-cased string into a snaked-cased string. Taken from
|
9
18
|
# +ActiveSupport.+
|
10
19
|
# @param camel_cased_word [String] The word to transform.
|
data/lib/lita/version.rb
CHANGED
@@ -81,19 +81,19 @@ describe Lita::Authorization, lita: true do
|
|
81
81
|
|
82
82
|
describe ".groups" do
|
83
83
|
before do
|
84
|
-
%i
|
84
|
+
%i(foo bar baz).each do |group|
|
85
85
|
described_class.add_user_to_group(requesting_user, user, group)
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
89
|
it "returns a list of all authorization groups" do
|
90
|
-
expect(described_class.groups).to match_array(%i
|
90
|
+
expect(described_class.groups).to match_array(%i(foo bar baz))
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
94
|
describe ".groups_with_users" do
|
95
95
|
before do
|
96
|
-
%i
|
96
|
+
%i(foo bar baz).each do |group|
|
97
97
|
described_class.add_user_to_group(requesting_user, user, group)
|
98
98
|
described_class.add_user_to_group(
|
99
99
|
requesting_user,
|
@@ -108,7 +108,7 @@ describe Lita::Authorization, lita: true do
|
|
108
108
|
end
|
109
109
|
|
110
110
|
it "returns a hash of all authorization groups and their members" do
|
111
|
-
groups = %i
|
111
|
+
groups = %i(foo bar baz)
|
112
112
|
groups_with_users = described_class.groups_with_users
|
113
113
|
expect(groups_with_users.keys).to match_array(groups)
|
114
114
|
groups.each do |group|
|
data/spec/lita/daemon_spec.rb
CHANGED
@@ -25,7 +25,7 @@ describe Lita::Daemon do
|
|
25
25
|
|
26
26
|
context "when the user has not requested that existing processes should be killed" do
|
27
27
|
it "aborts if a Lita process is already running" do
|
28
|
-
allow(File).to receive(:
|
28
|
+
allow(File).to receive(:exist?).and_return(true)
|
29
29
|
expect(subject).to receive(:abort)
|
30
30
|
subject.daemonize
|
31
31
|
end
|
@@ -35,13 +35,13 @@ describe Lita::Daemon do
|
|
35
35
|
subject { described_class.new("/tmp/lita_pid", "/tmp/lita_log", true) }
|
36
36
|
|
37
37
|
it "kills existing processes" do
|
38
|
-
allow(File).to receive(:
|
38
|
+
allow(File).to receive(:exist?).and_return(true)
|
39
39
|
expect(Process).to receive(:kill)
|
40
40
|
subject.daemonize
|
41
41
|
end
|
42
42
|
|
43
43
|
it "aborts if it can't kill an existing process" do
|
44
|
-
allow(File).to receive(:
|
44
|
+
allow(File).to receive(:exist?).and_return(true)
|
45
45
|
allow(Process).to receive(:kill).and_raise(Errno::ESRCH)
|
46
46
|
expect(subject).to receive(:abort)
|
47
47
|
subject.daemonize
|
data/spec/lita/handler_spec.rb
CHANGED
@@ -57,6 +57,12 @@ describe Lita::Handler, lita: true do
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
+
def infinite_every_test(response)
|
61
|
+
thread = every(5) { "Looping forever!" }
|
62
|
+
response.reply("Replying after timer!")
|
63
|
+
thread
|
64
|
+
end
|
65
|
+
|
60
66
|
def self.name
|
61
67
|
"Lita::Handlers::Test"
|
62
68
|
end
|
@@ -212,5 +218,13 @@ describe Lita::Handler, lita: true do
|
|
212
218
|
expect { queue.pop(true) }.to raise_error(ThreadError)
|
213
219
|
end
|
214
220
|
end
|
221
|
+
|
222
|
+
context "with an infinite timer" do
|
223
|
+
it "doesn't block the handler's thread" do
|
224
|
+
expect(response).to receive(:reply)
|
225
|
+
thread = subject.infinite_every_test(response)
|
226
|
+
thread.kill
|
227
|
+
end
|
228
|
+
end
|
215
229
|
end
|
216
230
|
end
|
@@ -40,7 +40,7 @@ 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
|
43
|
+
it 'replies with a warning if the group was "admins"' do
|
44
44
|
send_command("auth add foo admins")
|
45
45
|
expect(replies.last).to match(/Administrators can only be managed/)
|
46
46
|
end
|
@@ -63,7 +63,7 @@ describe Lita::Handlers::Authorization, lita_handler: true do
|
|
63
63
|
expect(replies.last).to eq("#{target_user.name} was not in bar.")
|
64
64
|
end
|
65
65
|
|
66
|
-
it
|
66
|
+
it 'replies with a warning if the group was "admins"' do
|
67
67
|
send_command("auth add foo admins")
|
68
68
|
expect(replies.last).to match(/Administrators can only be managed/)
|
69
69
|
end
|
@@ -71,7 +71,7 @@ describe Lita::Handlers::Authorization, lita_handler: true do
|
|
71
71
|
|
72
72
|
describe "#list" do
|
73
73
|
context "when there are populated groups" do
|
74
|
-
let(:groups) { %i
|
74
|
+
let(:groups) { %i(foo bar) }
|
75
75
|
let(:user1) { Lita::User.create(3, name: "Bongo") }
|
76
76
|
let(:user2) { Lita::User.create(4, name: "Carl") }
|
77
77
|
|
@@ -23,9 +23,7 @@ describe Lita::Handlers::Info, lita_handler: true do
|
|
23
23
|
it "returns JSON with info about the running robot" do
|
24
24
|
subject.web(request, response)
|
25
25
|
expect(response.headers["Content-Type"]).to eq("application/json")
|
26
|
-
expect(response.body.join).to include(
|
27
|
-
%{"lita_version":"#{Lita::VERSION}"}
|
28
|
-
)
|
26
|
+
expect(response.body.join).to include(%("lita_version":"#{Lita::VERSION}"))
|
29
27
|
end
|
30
28
|
end
|
31
29
|
end
|
data/spec/lita/user_spec.rb
CHANGED
@@ -12,11 +12,18 @@ describe Lita::User, lita: true do
|
|
12
12
|
|
13
13
|
it "returns existing users" do
|
14
14
|
described_class.create(1, name: "Carl")
|
15
|
-
|
16
|
-
user = described_class.find(1, name: "Carl")
|
15
|
+
user = described_class.find(1)
|
17
16
|
expect(user.id).to eq("1")
|
18
17
|
expect(user.name).to eq("Carl")
|
19
18
|
end
|
19
|
+
|
20
|
+
it "merges and saves new metadata for existing users" do
|
21
|
+
described_class.create(1, name: "Carl")
|
22
|
+
described_class.create(1, name: "Mr. Carl", foo: "bar")
|
23
|
+
user = described_class.find_by_id(1)
|
24
|
+
expect(user.name).to eq("Mr. Carl")
|
25
|
+
expect(user.metadata["foo"]).to eq("bar")
|
26
|
+
end
|
20
27
|
end
|
21
28
|
|
22
29
|
describe ".find_by_id" do
|
data/spec/lita/util_spec.rb
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe Lita::Util do
|
4
|
+
describe ".stringify_keys" do
|
5
|
+
it "converts symbol hash keys to strings" do
|
6
|
+
stringified = described_class.stringify_keys(foo: "bar")
|
7
|
+
expect(stringified).to eq("foo" => "bar")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
4
11
|
describe ".underscore" do
|
5
12
|
it "converts camel cased strings into snake case" do
|
6
13
|
expect(described_class.underscore("FooBarBaz")).to eq("foo_bar_baz")
|
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: 3.0.
|
4
|
+
version: 3.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jimmy Cuadra
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|