lita-who_has 0.2.0 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b641dd28ceee6d94ec4a6e59444b9c4d3c3a366b
4
- data.tar.gz: d8106e4e2ac59dfc0a9ef58cc608bd4076c82fb6
3
+ metadata.gz: c99be336dde9c2950bd9d3ad523818b1a14cfbba
4
+ data.tar.gz: 28bae1cdaba8e069113355ce4187589cc164c5a1
5
5
  SHA512:
6
- metadata.gz: 7ef8fb5e3b24242db232b1a989c2c0b30defc4c9e14f81ba85f81262b51bd54b1bf2c2b0724de1b3db73d67b60a93377cea674d5c6b11955d08ef934215b48c4
7
- data.tar.gz: fd19f91356ae134e0188f99a28c5becd11a9cc1ebd779f5c0df457ea93999d7bb2a0dc57158613cb6fa8633b893f9ce65b8773a7dc56ef4b4443e71a2ed4cda7
6
+ metadata.gz: bde6f282575f4eaf20a29b9c9eb7e48659f184e6d62b8a7eeb09df63bb7d114179e12b1bebbb26b01c1b747962cf0de4478579c0952a893c6a0c849f2ddfd493
7
+ data.tar.gz: 0faa35bd1e21722f520bf8afd232612d65a5ed2a156e981aa41ec08e7cef41311f8183584b73f97df7065f8a95ba3d415a4520f58b9bc55d9fae89e8ee4fbc9a
@@ -10,7 +10,13 @@ Metrics/LineLength:
10
10
  Max: 100
11
11
 
12
12
  Metrics/AbcSize:
13
- Max: 26
13
+ Max: 27
14
+
15
+ Metrics/CyclomaticComplexity:
16
+ Max: 7
17
+
18
+ Metrics/PerceivedComplexity:
19
+ Max: 10
14
20
 
15
21
  Metrics/MethodLength:
16
22
  Max: 30
data/README.md CHANGED
@@ -1,9 +1,9 @@
1
1
  # lita-who_has
2
2
 
3
3
  [![Build Status](https://travis-ci.org/knuedge/lita-who_has.png?branch=master)](https://travis-ci.org/knuedge/lita-who_has)
4
- [![Coverage Status](https://coveralls.io/repos/knuedge/lita-who_has/badge.png)](https://coveralls.io/r/knuedge/lita-who_has)
4
+ [![Coverage Status](https://coveralls.io/repos/github/knuedge/lita-who_has/badge.svg)](https://coveralls.io/github/knuedge/lita-who_has)
5
5
 
6
- Record and retrieve information about environment usage
6
+ Still using (and need to keep track of) physical things? This plugin helps record and retrieve information about those things.
7
7
 
8
8
  ## Installation
9
9
 
@@ -26,6 +26,15 @@ config.handlers.who_has.namespace = 'my_project'
26
26
  @bot release thing1
27
27
  @bot forget thing1
28
28
  @bot claimables
29
+ @bot claim thing2
29
30
  @bot claimables thing.*
31
+ # => thing2 (user)
30
32
  @bot wrestle thing2 from Jon Doe
33
+ @bot describe thing2 location the moon
34
+ @bot describe thing2
35
+ # => Here's what I know about thing2
36
+ # => {
37
+ # "in use by": "user",
38
+ # "location": "the moon"
39
+ # }
31
40
  ```
@@ -1,9 +1,11 @@
1
+ require 'json'
1
2
  require 'lita'
2
3
 
3
4
  Lita.load_locales Dir[File.expand_path(
4
5
  File.join('..', '..', 'locales', '*.yml'), __FILE__
5
6
  )]
6
7
 
8
+ require 'utils/lita_who_has/persistence'
7
9
  require 'lita/handlers/who_has'
8
10
 
9
11
  Lita::Handlers::WhoHas.template_root File.expand_path(
@@ -2,6 +2,8 @@ module Lita
2
2
  module Handlers
3
3
  # The main handler for the WhoHas plugin
4
4
  class WhoHas < Handler
5
+ include Utils::LitaWhoHas::Persistence
6
+
5
7
  route(
6
8
  /\Aclaim ([A-Za-z0-9_]+)\Z/,
7
9
  :claim_thing,
@@ -30,6 +32,16 @@ module Lita
30
32
  command: true
31
33
  )
32
34
 
35
+ route(
36
+ /\Adescribe ([A-Za-z0-9_]+)(\s+([A-Za-z0-9_]+)\s+(.+))?\Z/,
37
+ :describe_thing,
38
+ help: {
39
+ 'describe [THING ID]' => 'Report on any details for thing',
40
+ 'describe [THING ID] [KEY] [VALUE]' => 'Describe the KEY attribute as VALUE for a thing'
41
+ },
42
+ command: true
43
+ )
44
+
33
45
  route(
34
46
  /\Awrestle ([A-Za-z0-9_]+) from (.*)\Z/,
35
47
  :claim_used_thing,
@@ -166,14 +178,37 @@ module Lita
166
178
  end
167
179
  end
168
180
 
169
- private
170
-
171
- def key(thing_id)
172
- ['whohas_things', config.namespace, thing_id].join(':')
173
- end
174
-
175
- def current_user(thing_id)
176
- redis.hget(key(thing_id), 'user')
181
+ def describe_thing(response)
182
+ thing_id, _, attribute, value = response.matches.first
183
+ owner = current_user(thing_id)
184
+ case owner
185
+ when nil
186
+ response.reply t(
187
+ 'describe_thing.failure.thing_unknown',
188
+ thing_id: thing_id
189
+ )
190
+ when '', response.user.name
191
+ if attribute && value
192
+ describe(thing_id, attribute, value)
193
+ response.reply t(
194
+ 'describe_thing.success', key: attribute, thing_id: thing_id
195
+ )
196
+ else
197
+ response.reply t('describe_thing.description', thing_id: thing_id)
198
+ response.reply('/code ' + full_description_json(thing_id))
199
+ end
200
+ else
201
+ if attribute && value
202
+ response.reply t(
203
+ 'describe_thing.failure.thing_in_use_by_other_user',
204
+ thing_id: thing_id,
205
+ user: owner
206
+ )
207
+ else
208
+ response.reply t('describe_thing.description', thing_id: thing_id)
209
+ response.reply('/code ' + full_description_json(thing_id))
210
+ end
211
+ end
177
212
  end
178
213
 
179
214
  Lita.register_handler(self)
@@ -0,0 +1,37 @@
1
+ module Utils
2
+ module LitaWhoHas
3
+ # Utility methods for working with Lita's Redis
4
+ module Persistence
5
+ private
6
+
7
+ def key(thing_id)
8
+ ['whohas_things', config.namespace, thing_id].join(':')
9
+ end
10
+
11
+ def description(thing_id)
12
+ value = redis.hget(key(thing_id), 'description')
13
+ value && !value.empty? ? JSON.parse(value) : {}
14
+ end
15
+
16
+ def describe(thing_id, dkey, dvalue)
17
+ new_desc = description(thing_id).merge(dkey => dvalue)
18
+ redis.hset(key(thing_id), 'description', new_desc.to_json)
19
+ end
20
+
21
+ def current_user(thing_id)
22
+ redis.hget(key(thing_id), 'user')
23
+ end
24
+
25
+ def full_description_json(thing_id)
26
+ owner = current_user(thing_id)
27
+ JSON.pretty_generate(
28
+ if owner && !owner.empty?
29
+ { 'in use by' => owner }
30
+ else
31
+ {}
32
+ end.merge(description(thing_id))
33
+ )
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = 'lita-who_has'
3
- spec.version = '0.2.0'
3
+ spec.version = '0.3.0'
4
4
  spec.authors = ['Jonathan Gnagy']
5
5
  spec.email = ['jgnagy@knuedge.com']
6
6
  spec.description = 'A more generic lita-envy for who owns things via lita'
@@ -29,3 +29,9 @@ en:
29
29
  list_things:
30
30
  failure:
31
31
  no_things: "Hmm, I'm not tracking anything that matches your query"
32
+ describe_thing:
33
+ success: Description '%{key}' set for %{thing_id}
34
+ failure:
35
+ thing_unknown: "Hmm, I do not know about %{thing_id}"
36
+ thing_in_use_by_other_user: "I can't change the description for %{thing_id} while it's in use by %{user}"
37
+ description: "Here's what I know about %{thing_id}"
@@ -11,6 +11,8 @@ describe Lita::Handlers::WhoHas, lita_handler: true do
11
11
  it { is_expected.to route_command('claimables').to(:list_things) }
12
12
  it { is_expected.to route_command('forget ENV123').to(:forget_thing) }
13
13
  it { is_expected.to route_command('wrestle ENV123 from Alicia').to(:claim_used_thing) }
14
+ it { is_expected.to route_command('describe ENV123').to(:describe_thing) }
15
+ it { is_expected.to route_command('describe ENV123 key value').to(:describe_thing) }
14
16
  end
15
17
 
16
18
  describe 'User claiming thing' do
@@ -333,4 +335,116 @@ describe Lita::Handlers::WhoHas, lita_handler: true do
333
335
  end
334
336
  end
335
337
  end
338
+
339
+ describe 'User describing a thing' do
340
+ context 'when thing is currently in use by specified user' do
341
+ before(:each) do
342
+ subject.redis.hset('whohas_things:my_project:ENV123', 'user', 'Alicia')
343
+ end
344
+
345
+ it 'adds a description key' do
346
+ alicia = Lita::User.create(123, name: 'Alicia')
347
+ send_command('describe ENV123 location the moon', as: alicia)
348
+ expect(subject.redis.hget('whohas_things:my_project:ENV123', 'description'))
349
+ .to eq({ 'location' => 'the moon' }.to_json)
350
+ expect(replies.first).to eq('Description \'location\' set for ENV123')
351
+ end
352
+
353
+ it 'allows retrieving a description' do
354
+ alicia = Lita::User.create(123, name: 'Alicia')
355
+ subject.redis.hset(
356
+ 'whohas_things:my_project:ENV123',
357
+ 'description',
358
+ { 'location' => 'the moon' }.to_json
359
+ )
360
+ send_command('describe ENV123', as: alicia)
361
+ expect(replies.first).to eq('Here\'s what I know about ENV123')
362
+ expect(replies.last).to eq(
363
+ '/code ' + JSON.pretty_generate(
364
+ 'in use by' => 'Alicia',
365
+ 'location' => 'the moon'
366
+ )
367
+ )
368
+ end
369
+ end
370
+
371
+ context 'when thing is available' do
372
+ before(:each) do
373
+ subject.redis.hset('whohas_things:my_project:ENV345', 'user', '')
374
+ end
375
+
376
+ it 'adds a description key' do
377
+ alicia = Lita::User.create(123, name: 'Alicia')
378
+ send_command('describe ENV345 location mars', as: alicia)
379
+ expect(subject.redis.hget('whohas_things:my_project:ENV345', 'description'))
380
+ .to eq({ 'location' => 'mars' }.to_json)
381
+ expect(replies.first).to eq('Description \'location\' set for ENV345')
382
+ end
383
+
384
+ it 'allows retrieving a description' do
385
+ alicia = Lita::User.create(123, name: 'Alicia')
386
+ subject.redis.hset(
387
+ 'whohas_things:my_project:ENV345',
388
+ 'description',
389
+ { 'location' => 'mars' }.to_json
390
+ )
391
+ send_command('describe ENV345', as: alicia)
392
+ expect(replies.first).to eq('Here\'s what I know about ENV345')
393
+ expect(replies.last).to eq(
394
+ '/code ' + JSON.pretty_generate(
395
+ 'location' => 'mars'
396
+ )
397
+ )
398
+ end
399
+ end
400
+
401
+ context 'when thing is unknown to bot' do
402
+ before(:each) do
403
+ subject.redis.del('whohas_things:my_project:ENV123')
404
+ end
405
+
406
+ it 'replies with a notification' do
407
+ alicia = Lita::User.create(123, name: 'Alicia')
408
+ send_command('describe ENV123', as: alicia)
409
+ expect(replies.first).to eq('Hmm, I do not know about ENV123')
410
+ end
411
+ end
412
+
413
+ context 'when thing is in use by another user' do
414
+ before(:each) do
415
+ subject.redis.hset('whohas_things:my_project:ENV234', 'user', 'Carl')
416
+ end
417
+
418
+ it 'leaves the thing untouched' do
419
+ alicia = Lita::User.create(123, name: 'Alicia')
420
+ send_command('describe ENV234 disposition sunny', as: alicia)
421
+ expect(subject.redis.hget('whohas_things:my_project:ENV234', 'user')).to eq('Carl')
422
+ end
423
+
424
+ it 'replies with a notification' do
425
+ alicia = Lita::User.create(123, name: 'Alicia')
426
+ send_command('describe ENV234 disposition sunny', as: alicia)
427
+ expect(replies.first).to eq(
428
+ 'I can\'t change the description for ENV234 while it\'s in use by Carl'
429
+ )
430
+ end
431
+
432
+ it 'allows retrieving a description' do
433
+ alicia = Lita::User.create(123, name: 'Alicia')
434
+ subject.redis.hset(
435
+ 'whohas_things:my_project:ENV234',
436
+ 'description',
437
+ { 'disposition' => 'cloudy' }.to_json
438
+ )
439
+ send_command('describe ENV234', as: alicia)
440
+ expect(replies.first).to eq('Here\'s what I know about ENV234')
441
+ expect(replies.last).to eq(
442
+ '/code ' + JSON.pretty_generate(
443
+ 'in use by' => 'Carl',
444
+ 'disposition' => 'cloudy'
445
+ )
446
+ )
447
+ end
448
+ end
449
+ end
336
450
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lita-who_has
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Gnagy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-07 00:00:00.000000000 Z
11
+ date: 2017-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lita
@@ -179,9 +179,10 @@ files:
179
179
  - Rakefile
180
180
  - lib/lita-who_has.rb
181
181
  - lib/lita/handlers/who_has.rb
182
+ - lib/utils/lita_who_has/persistence.rb
182
183
  - lita-who_has.gemspec
183
184
  - locales/en.yml
184
- - spec/lita/handlers/envy_spec.rb
185
+ - spec/lita/handlers/who_has_spec.rb
185
186
  - spec/spec_helper.rb
186
187
  - templates/.gitkeep
187
188
  homepage: https://github.com/knuedge/lita-who_has
@@ -205,10 +206,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
205
206
  version: '0'
206
207
  requirements: []
207
208
  rubyforge_project:
208
- rubygems_version: 2.5.2
209
+ rubygems_version: 2.6.8
209
210
  signing_key:
210
211
  specification_version: 4
211
212
  summary: Record and retrieve information about things
212
213
  test_files:
213
- - spec/lita/handlers/envy_spec.rb
214
+ - spec/lita/handlers/who_has_spec.rb
214
215
  - spec/spec_helper.rb