lita-locker 1.0.3 → 1.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/lib/lita/handlers/locker.rb +32 -0
- data/lib/lita/handlers/locker_misc.rb +1 -5
- data/lib/locker/label.rb +16 -0
- data/lita-locker.gemspec +1 -1
- data/locales/en.yml +7 -0
- data/spec/lita/handlers/locker_misc_spec.rb +4 -4
- data/spec/lita/handlers/locker_spec.rb +66 -8
- 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: f96bd48a3cc828d528cce0186e9f06b17eb00447
|
4
|
+
data.tar.gz: 1f7497cce3183e0e76c330a75515da10871b13d5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a24977fe218e05da74fc7c153fb3f01034a57286f38c2440bb1c9be16952d306e4fb4dcb910d066c12bca99c39d02740b5984524db841e94244d8c305708eb53
|
7
|
+
data.tar.gz: f815885ce041b6fafd846bc052a458c920fc3765093de89ec8d26c31e144793e637ae8e43ab620af979bc7d313bf639dec81720faece20822f72c88940f7b2b6
|
data/lib/lita/handlers/locker.rb
CHANGED
@@ -41,6 +41,13 @@ module Lita
|
|
41
41
|
help: { t('help.steal.syntax') => t('help.steal.desc') }
|
42
42
|
)
|
43
43
|
|
44
|
+
route(
|
45
|
+
/^locker\sgive\s#{LABEL_REGEX}\sto\s#{USER_REGEX}#{COMMENT_REGEX}$/,
|
46
|
+
:give,
|
47
|
+
command: true,
|
48
|
+
help: { t('help.give.syntax') => t('help.give.desc') }
|
49
|
+
)
|
50
|
+
|
44
51
|
route(
|
45
52
|
/^locker\sobserve\s#{LABEL_REGEX}#{COMMENT_REGEX}$/,
|
46
53
|
:observe,
|
@@ -118,8 +125,33 @@ module Lita
|
|
118
125
|
response.reply(attempt_steal(name, response.user))
|
119
126
|
end
|
120
127
|
|
128
|
+
def give(response)
|
129
|
+
name = response.match_data['label'].rstrip
|
130
|
+
|
131
|
+
return response.reply(failed(t('subject.does_not_exist', name: name))) unless Label.exists?(name)
|
132
|
+
l = Label.new(name)
|
133
|
+
owner_mention = l.owner.mention_name ? "(@#{l.owner.mention_name})" : ''
|
134
|
+
return response.reply(t('give.not_owner',
|
135
|
+
label: name,
|
136
|
+
owner: l.owner.name,
|
137
|
+
mention: owner_mention)) unless l.owner == response.user
|
138
|
+
recipient = Lita::User.fuzzy_find(response.match_data['username'].rstrip)
|
139
|
+
return response.reply(t('user.unknown')) unless recipient
|
140
|
+
|
141
|
+
response.reply(attempt_give(name, response.user, recipient))
|
142
|
+
end
|
143
|
+
|
121
144
|
private
|
122
145
|
|
146
|
+
def attempt_give(name, giver, recipient)
|
147
|
+
label = Label.new(name)
|
148
|
+
return t('give.self') if recipient == giver
|
149
|
+
old_owner = label.owner
|
150
|
+
label.give!(recipient.id)
|
151
|
+
mention = recipient.mention_name ? "(@#{recipient.mention_name})" : ''
|
152
|
+
success(t('give.given', label: name, giver: old_owner.name, recipient: recipient.name, mention: mention))
|
153
|
+
end
|
154
|
+
|
123
155
|
def attempt_steal(name, user)
|
124
156
|
label = Label.new(name)
|
125
157
|
return t('steal.self') if label.owner == user
|
@@ -58,11 +58,7 @@ module Lita
|
|
58
58
|
return response.reply(t('subject.does_not_exist', name: name)) unless Label.exists?(name)
|
59
59
|
l = Label.new(name)
|
60
60
|
l.wait_queue.delete(response.user.id)
|
61
|
-
|
62
|
-
l.wait_queue.clear
|
63
|
-
queued.chunk { |x| x }.map(&:first).each do |user|
|
64
|
-
l.wait_queue << user
|
65
|
-
end
|
61
|
+
l.dedupe!
|
66
62
|
response.reply(t('label.removed_from_queue', name: name))
|
67
63
|
end
|
68
64
|
|
data/lib/locker/label.rb
CHANGED
@@ -103,9 +103,25 @@ module Locker
|
|
103
103
|
def steal!(owner_id)
|
104
104
|
log("Stolen from #{owner.id} to #{owner_id}")
|
105
105
|
wait_queue.unshift(owner_id)
|
106
|
+
self.dedupe!
|
106
107
|
self.unlock!
|
107
108
|
end
|
108
109
|
|
110
|
+
def give!(recipient_id)
|
111
|
+
log("Given from #{owner.id} to #{recipient_id}")
|
112
|
+
wait_queue.unshift(recipient_id)
|
113
|
+
self.dedupe!
|
114
|
+
self.unlock!
|
115
|
+
end
|
116
|
+
|
117
|
+
def dedupe!
|
118
|
+
queued = wait_queue.to_a
|
119
|
+
wait_queue.clear
|
120
|
+
queued.chunk { |x| x }.map(&:first).each do |user|
|
121
|
+
wait_queue << user
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
109
125
|
def add_observer!(observer_id)
|
110
126
|
observer_ids.add(observer_id)
|
111
127
|
end
|
data/lita-locker.gemspec
CHANGED
data/locales/en.yml
CHANGED
@@ -6,6 +6,10 @@ en:
|
|
6
6
|
stolen: "%{label} stolen from %{old_owner} %{mention}"
|
7
7
|
already_unlocked: "%{label} was already unlocked"
|
8
8
|
self: Why are you stealing the lock from yourself?
|
9
|
+
give:
|
10
|
+
not_owner: "The lock on %{label} can only be given by its current owner: %{owner} %{mention}"
|
11
|
+
given: "%{giver} gave %{label} to %{recipient} %{mention}"
|
12
|
+
self: Why are you giving the lock to yourself?
|
9
13
|
observe:
|
10
14
|
now_observing: "Now observing %{name}"
|
11
15
|
already_observing: "You are already observing %{name}"
|
@@ -33,6 +37,9 @@ en:
|
|
33
37
|
steal:
|
34
38
|
syntax: steal <subject>
|
35
39
|
desc: Force removal of a reservation. Can have # comments afterwards.
|
40
|
+
give:
|
41
|
+
syntax: give <subject> to <username>
|
42
|
+
desc: Transfer ownership of a lock to another user. Can have # comments afterwards.
|
36
43
|
status:
|
37
44
|
syntax: locker status <label or resource>
|
38
45
|
desc: Show the current state of <label or resource>
|
@@ -80,7 +80,7 @@ describe Lita::Handlers::LockerMisc, lita_handler: true do
|
|
80
80
|
send_command('lock foo', as: bob)
|
81
81
|
send_command('locker dequeue foo', as: doris)
|
82
82
|
send_command('locker status foo')
|
83
|
-
expect(replies.last).to
|
83
|
+
expect(replies.last).to match(/^foo is locked by Alice \(taken \d seconds? ago\)\. Next up: Bob$/)
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
@@ -93,13 +93,13 @@ describe Lita::Handlers::LockerMisc, lita_handler: true do
|
|
93
93
|
expect(replies.last).to eq('foo is unlocked')
|
94
94
|
send_command('lock foo')
|
95
95
|
send_command('locker status foo')
|
96
|
-
expect(replies.last).to
|
96
|
+
expect(replies.last).to match(/^foo is locked by Test User \(taken \d seconds? ago\)$/)
|
97
97
|
send_command('lock foo', as: alice)
|
98
98
|
send_command('locker status foo')
|
99
|
-
expect(replies.last).to
|
99
|
+
expect(replies.last).to match(/^foo is locked by Test User \(taken \d seconds? ago\)\. Next up: Alice$/)
|
100
100
|
send_command('lock foo', as: bob)
|
101
101
|
send_command('locker status foo')
|
102
|
-
expect(replies.last).to
|
102
|
+
expect(replies.last).to match(/^foo is locked by Test User \(taken \d seconds? ago\)\. Next up: Alice, Bob$/)
|
103
103
|
end
|
104
104
|
|
105
105
|
it 'shows the status of a resource' do
|
@@ -30,6 +30,8 @@ describe Lita::Handlers::Locker, lita_handler: true do
|
|
30
30
|
is_expected.to route_command("steal #{l}").to(:steal)
|
31
31
|
is_expected.to route_command("steal #{l} ").to(:steal)
|
32
32
|
is_expected.to route_command("steal #{l} #this is a comment").to(:steal)
|
33
|
+
is_expected.to route_command("locker give #{l} to alice").to(:give)
|
34
|
+
is_expected.to route_command("locker give #{l} to alice #this is a comment").to(:give)
|
33
35
|
is_expected.to route_command("locker observe #{l}").to(:observe)
|
34
36
|
is_expected.to route_command("locker observe #{l} #this is a comment").to(:observe)
|
35
37
|
is_expected.to route_command("locker unobserve #{l}").to(:unobserve)
|
@@ -37,15 +39,15 @@ describe Lita::Handlers::Locker, lita_handler: true do
|
|
37
39
|
end
|
38
40
|
end
|
39
41
|
|
40
|
-
let(:alice) do
|
42
|
+
let!(:alice) do
|
41
43
|
Lita::User.create('9001@hipchat', name: 'Alice', mention_name: 'alice')
|
42
44
|
end
|
43
45
|
|
44
|
-
let(:bob) do
|
46
|
+
let!(:bob) do
|
45
47
|
Lita::User.create('9002@hipchat', name: 'Bob', mention_name: 'bob')
|
46
48
|
end
|
47
49
|
|
48
|
-
let(:charlie) do
|
50
|
+
let!(:charlie) do
|
49
51
|
Lita::User.create('9003@hipchat', name: 'Charlie', mention_name: 'charlie')
|
50
52
|
end
|
51
53
|
|
@@ -85,7 +87,7 @@ describe Lita::Handlers::Locker, lita_handler: true do
|
|
85
87
|
send_command('lock bazbat', as: bob)
|
86
88
|
send_command('lock bazbat', as: bob)
|
87
89
|
send_command('locker status bazbat')
|
88
|
-
expect(replies.last).to
|
90
|
+
expect(replies.last).to match(/^bazbat is locked by Alice \(taken \d seconds? ago\)\. Next up: Bob$/)
|
89
91
|
end
|
90
92
|
|
91
93
|
it 'shows a warning when a label has no resources' do
|
@@ -125,8 +127,9 @@ describe Lita::Handlers::Locker, lita_handler: true do
|
|
125
127
|
send_command('locker label add foobar to bazbat')
|
126
128
|
send_command('lock bazbat', as: alice)
|
127
129
|
send_command('lock bazbat', as: bob)
|
128
|
-
|
129
|
-
|
130
|
+
# rubocop:disable Metrics/LineLength
|
131
|
+
expect(replies.last).to match(/^bazbat is locked by Alice \(@alice\) \(taken \d seconds? ago\), you have been added to the queue \(currently: Bob\), type 'locker dequeue bazbat' to be removed$/)
|
132
|
+
# rubocop:enable Metrics/LineLength
|
130
133
|
end
|
131
134
|
|
132
135
|
it 'shows an error when a label does not exist' do
|
@@ -208,7 +211,7 @@ describe Lita::Handlers::Locker, lita_handler: true do
|
|
208
211
|
send_command('locker label add foobar to bazbat')
|
209
212
|
send_command('lock bazbat', as: alice)
|
210
213
|
send_command('unlock bazbat', as: bob)
|
211
|
-
expect(replies.last).to
|
214
|
+
expect(replies.last).to match(/^bazbat is locked by Alice \(@alice\) \(taken \d seconds? ago\)$/)
|
212
215
|
end
|
213
216
|
|
214
217
|
it 'shows a warning when a label is already unlocked' do
|
@@ -244,7 +247,7 @@ describe Lita::Handlers::Locker, lita_handler: true do
|
|
244
247
|
send_command('lock bazbat', as: bob)
|
245
248
|
send_command('steal bazbat', as: charlie)
|
246
249
|
send_command('locker status bazbat')
|
247
|
-
expect(replies.last).to
|
250
|
+
expect(replies.last).to match(/^bazbat is locked by Charlie \(taken \d seconds? ago\)\. Next up: Bob$/)
|
248
251
|
end
|
249
252
|
|
250
253
|
it 'shows a warning when the label is already unlocked' do
|
@@ -270,6 +273,61 @@ describe Lita::Handlers::Locker, lita_handler: true do
|
|
270
273
|
end
|
271
274
|
end
|
272
275
|
|
276
|
+
describe '#give' do
|
277
|
+
it 'transfers a lock from the owner to a recipient' do
|
278
|
+
send_command('locker resource create foobar')
|
279
|
+
send_command('locker label create bazbat')
|
280
|
+
send_command('locker label add foobar to bazbat')
|
281
|
+
send_command('lock bazbat', as: alice)
|
282
|
+
send_command('locker give bazbat to @bob # with a comment', as: alice)
|
283
|
+
expect(replies.last).to eq('Alice gave bazbat to Bob (@bob)')
|
284
|
+
end
|
285
|
+
|
286
|
+
it 'preserves the state of the queue when there is one' do
|
287
|
+
send_command('locker resource create foobar')
|
288
|
+
send_command('locker label create bazbat')
|
289
|
+
send_command('locker label add foobar to bazbat')
|
290
|
+
send_command('lock bazbat', as: alice)
|
291
|
+
send_command('lock bazbat', as: bob)
|
292
|
+
send_command('lock bazbat', as: charlie)
|
293
|
+
send_command('locker give bazbat to @charlie # with a comment', as: alice)
|
294
|
+
send_command('locker status bazbat')
|
295
|
+
expect(replies.last).to match(/^bazbat is locked by Charlie \(taken \d seconds? ago\)\. Next up: Bob, Charlie$/)
|
296
|
+
end
|
297
|
+
|
298
|
+
it 'shows a warning when the owner attempts to give the label to herself' do
|
299
|
+
send_command('locker resource create foobar')
|
300
|
+
send_command('locker label create bazbat')
|
301
|
+
send_command('locker label add foobar to bazbat')
|
302
|
+
send_command('lock bazbat', as: alice)
|
303
|
+
send_command('locker give bazbat to @alice # with a comment', as: alice)
|
304
|
+
expect(replies.last).to eq('Why are you giving the lock to yourself?')
|
305
|
+
end
|
306
|
+
|
307
|
+
it 'shows an error when the attempted giver is not the owner' do
|
308
|
+
send_command('locker resource create foobar')
|
309
|
+
send_command('locker label create bazbat')
|
310
|
+
send_command('locker label add foobar to bazbat')
|
311
|
+
send_command('lock bazbat', as: alice)
|
312
|
+
send_command('locker give bazbat to @charlie # with a comment', as: bob)
|
313
|
+
expect(replies.last).to eq('The lock on bazbat can only be given by its current owner: Alice (@alice)')
|
314
|
+
end
|
315
|
+
|
316
|
+
it 'shows an error when the label does not exist' do
|
317
|
+
send_command('locker give foobar to @bob', as: alice)
|
318
|
+
expect(replies.last).to eq('Sorry, that does not exist')
|
319
|
+
end
|
320
|
+
|
321
|
+
it 'shows an error when the recipient does not exist' do
|
322
|
+
send_command('locker resource create foobar')
|
323
|
+
send_command('locker label create bazbat')
|
324
|
+
send_command('locker label add foobar to bazbat')
|
325
|
+
send_command('lock bazbat', as: alice)
|
326
|
+
send_command('locker give bazbat to @doris', as: alice)
|
327
|
+
expect(replies.last).to eq('Unknown user')
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
273
331
|
describe '#observe' do
|
274
332
|
it 'adds a user as observer of a label' do
|
275
333
|
send_command('locker resource create foobar')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lita-locker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Sigler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: lita
|