lita-flowdock 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/GETTING_STARTED.md +1 -1
- data/README.md +6 -0
- data/lib/lita/adapters/flowdock.rb +6 -6
- data/lib/lita/adapters/flowdock/connector.rb +16 -7
- data/lib/lita/adapters/flowdock/message_handler.rb +6 -1
- data/lib/lita/source/flowdock_source.rb +10 -0
- data/lita-flowdock.gemspec +1 -1
- data/spec/lita/adapters/flowdock/connector_spec.rb +33 -6
- data/spec/lita/adapters/flowdock/message_handler_spec.rb +7 -3
- data/spec/lita/adapters/flowdock_spec.rb +15 -2
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da12f1db04490cd7aae9b115c0279377ca28adee
|
4
|
+
data.tar.gz: 2939919dbfc81e1f5d52f4d04f2cb3644b158ae9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d5836b2e3558a090f8f71976874ae0825f32566510b4658837cb3ffe8c04dd6e4e30bda07f4e54865d12af114ebb6d6bbe89711246ab619bc9f392e7b004776f
|
7
|
+
data.tar.gz: d2d4f7094d1dc4610a3ba72f554f9775e9ddea01e90af6eca6c4e95f1c6bd3f4f905728439012c9aa622b6953d5923cad83c98628c489c7fcf90e39c1cc5dffd
|
data/CHANGELOG.md
ADDED
data/GETTING_STARTED.md
CHANGED
@@ -41,7 +41,7 @@ Lita.configure do |config|
|
|
41
41
|
config.robot.mention_name = "!"
|
42
42
|
config.robot.log_level = :debug
|
43
43
|
config.robot.adapter = :flowdock
|
44
|
-
config.adapters.flowdock.
|
44
|
+
config.adapters.flowdock.api_token = "$FLOWDOCK_API_TOKEN"
|
45
45
|
config.adapters.flowdock.organization = "$ORG"
|
46
46
|
config.adapters.flowdock.flows = ["$FLOW_NAME"]
|
47
47
|
end
|
data/README.md
CHANGED
@@ -33,6 +33,12 @@ For quick setup, see the [Getting Started](https://github.com/bhouse/lita-flowdo
|
|
33
33
|
* `organization` (String) - The organization for the flowdock account
|
34
34
|
* `flows` (Array) - Array of flows the bot should connect to, i.e. `main`
|
35
35
|
|
36
|
+
### Optional Attributes
|
37
|
+
* `thread_responses` (Symbol) - Respond to the original message in a Flowdock
|
38
|
+
thread
|
39
|
+
* default: `:enabled`
|
40
|
+
* other values: `:disabled`
|
41
|
+
|
36
42
|
### Example
|
37
43
|
|
38
44
|
#### lita_config.rb
|
@@ -9,6 +9,7 @@ module Lita
|
|
9
9
|
config :api_token, type: String, required: true
|
10
10
|
config :organization, type: String, required: true
|
11
11
|
config :flows, type: Array, required: true
|
12
|
+
config :thread_responses, type: Symbol, required: false, default: :enabled
|
12
13
|
|
13
14
|
|
14
15
|
def mention_format(name)
|
@@ -25,20 +26,19 @@ module Lita
|
|
25
26
|
)
|
26
27
|
|
27
28
|
connector.run
|
28
|
-
rescue Interrupt
|
29
|
-
shut_down
|
30
29
|
end
|
31
30
|
|
32
31
|
def shut_down
|
33
32
|
return unless connector
|
34
33
|
connector.shut_down
|
35
|
-
rescue RuntimeError
|
36
|
-
robot.trigger(:disconnected)
|
37
|
-
log.info('Disconnected')
|
38
34
|
end
|
39
35
|
|
40
36
|
def send_messages(target, messages)
|
41
|
-
|
37
|
+
if config.thread_responses.eql?(:enabled)
|
38
|
+
connector.send_messages(target.room, messages, target.message_id)
|
39
|
+
else
|
40
|
+
connector.send_messages(target.room, messages)
|
41
|
+
end
|
42
42
|
end
|
43
43
|
|
44
44
|
private
|
@@ -16,14 +16,16 @@ module Lita
|
|
16
16
|
@flows = flows
|
17
17
|
@client =
|
18
18
|
flowdock_client || ::Flowdock::Client.new(api_token: api_token)
|
19
|
+
@stream_url =
|
20
|
+
"https://#{api_token}@stream.flowdock.com/flows?filter=#{request_flows}"
|
19
21
|
|
20
22
|
UsersCreator.create_users(client.get('/users'))
|
21
23
|
end
|
22
24
|
|
23
|
-
def run
|
25
|
+
def run(url=stream_url, queue=nil)
|
24
26
|
EM.run do
|
25
27
|
@source = EventMachine::EventSource.new(
|
26
|
-
|
28
|
+
url,
|
27
29
|
{query: 'text/event-stream'},
|
28
30
|
{'Accept' => 'text/event-stream'}
|
29
31
|
)
|
@@ -39,27 +41,34 @@ module Lita
|
|
39
41
|
end
|
40
42
|
|
41
43
|
source.error do |error|
|
42
|
-
log.error(error
|
43
|
-
|
44
|
+
log.error(error)
|
45
|
+
robot.trigger(:disconnected)
|
46
|
+
log.info('Disconnected')
|
44
47
|
end
|
45
48
|
|
46
49
|
source.start
|
50
|
+
queue << source if queue
|
47
51
|
end
|
48
52
|
end
|
49
53
|
|
50
|
-
def send_messages(target, messages)
|
54
|
+
def send_messages(target, messages, message_id = nil)
|
51
55
|
messages.each do |message|
|
52
|
-
client.chat_message(
|
56
|
+
client.chat_message(
|
57
|
+
flow: target,
|
58
|
+
content: message,
|
59
|
+
message: message_id
|
60
|
+
)
|
53
61
|
end
|
54
62
|
end
|
55
63
|
|
56
64
|
def shut_down
|
57
65
|
source.close
|
66
|
+
EM.stop if EM.reactor_running?
|
58
67
|
end
|
59
68
|
|
60
69
|
private
|
61
70
|
attr_reader :robot, :api_token, :organization, :flows, :source,
|
62
|
-
:client
|
71
|
+
:client, :stream_url
|
63
72
|
|
64
73
|
def log
|
65
74
|
Lita.logger
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'lita/adapters/flowdock/users_creator'
|
2
|
+
require 'lita/source/flowdock_source'
|
2
3
|
|
3
4
|
module Lita
|
4
5
|
module Adapters
|
@@ -33,7 +34,7 @@ module Lita
|
|
33
34
|
end
|
34
35
|
|
35
36
|
def dispatch_message(user)
|
36
|
-
source =
|
37
|
+
source = FlowdockSource.new(user: user, room: flow, message_id: id)
|
37
38
|
message = Message.new(robot, body, source)
|
38
39
|
robot.receive(message)
|
39
40
|
end
|
@@ -42,6 +43,10 @@ module Lita
|
|
42
43
|
data['flow']
|
43
44
|
end
|
44
45
|
|
46
|
+
def id
|
47
|
+
data['id']
|
48
|
+
end
|
49
|
+
|
45
50
|
def from_self?(user)
|
46
51
|
user.id.to_i == robot_id
|
47
52
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module Lita
|
2
|
+
class FlowdockSource < Source
|
3
|
+
attr_reader :message_id
|
4
|
+
|
5
|
+
def initialize(user: nil, room: nil, private_message: false, message_id: nil)
|
6
|
+
super(user: user, room: room, private_message: private_message)
|
7
|
+
@message_id = message_id
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
data/lita-flowdock.gemspec
CHANGED
@@ -1,7 +1,17 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Lita::Adapters::Flowdock::Connector, lita: true do
|
4
|
-
subject
|
4
|
+
def with_eventsource(subject, queue)
|
5
|
+
thread = Thread.new { subject.run(url, queue) }
|
6
|
+
thread.abort_on_exception = true
|
7
|
+
yield queue.pop
|
8
|
+
subject.shut_down
|
9
|
+
thread.join
|
10
|
+
end
|
11
|
+
|
12
|
+
subject {
|
13
|
+
described_class.new(robot, api_token, organization, flows, fd_client)
|
14
|
+
}
|
5
15
|
|
6
16
|
let(:registry) { Lita::Registry.new }
|
7
17
|
let(:robot) { Lita::Robot.new(registry) }
|
@@ -10,8 +20,12 @@ describe Lita::Adapters::Flowdock::Connector, lita: true do
|
|
10
20
|
let(:flows) { ['testing'] }
|
11
21
|
let(:fd_client) { instance_double('Flowdock::Client') }
|
12
22
|
let(:users) { [ user_hash(1), user_hash(2) ] }
|
23
|
+
let(:queue) { Queue.new }
|
24
|
+
let(:url) { "http://example.com" }
|
13
25
|
|
14
26
|
describe "#new" do
|
27
|
+
subject { described_class }
|
28
|
+
|
15
29
|
it "creates users" do
|
16
30
|
expect(fd_client).to receive(:get).with('/users').and_return(users)
|
17
31
|
expect(Lita::Adapters::Flowdock::UsersCreator).to receive(
|
@@ -22,22 +36,35 @@ describe Lita::Adapters::Flowdock::Connector, lita: true do
|
|
22
36
|
end
|
23
37
|
|
24
38
|
describe "#run" do
|
39
|
+
before do
|
40
|
+
allow(fd_client).to receive(:get).with('/users').and_return([])
|
41
|
+
end
|
42
|
+
|
43
|
+
it "starts the reactor" do
|
44
|
+
with_eventsource(subject, queue) do
|
45
|
+
expect(EM.reactor_running?).to be_truthy
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
it "creates the event source" do
|
50
|
+
with_eventsource(subject, queue) do |source|
|
51
|
+
expect(source).to be_an_instance_of(EventMachine::EventSource)
|
52
|
+
end
|
53
|
+
end
|
25
54
|
end
|
26
55
|
|
27
56
|
describe "#send_messages" do
|
28
57
|
let(:target) { 'testing:lita-test' }
|
29
58
|
let(:message) { 'foo' }
|
30
|
-
|
31
|
-
described_class.new(robot, api_token, organization, flows, fd_client)
|
32
|
-
}
|
59
|
+
let(:message_id) { 1234 }
|
33
60
|
|
34
61
|
before do
|
35
62
|
allow(fd_client).to receive(:get).with('/users').and_return(users)
|
36
63
|
end
|
37
64
|
|
38
65
|
it "sends messages" do
|
39
|
-
expect(fd_client).to receive(:chat_message).with(flow: target, content: message)
|
40
|
-
subject.send_messages(target, [message])
|
66
|
+
expect(fd_client).to receive(:chat_message).with(flow: target, content: message, message: message_id)
|
67
|
+
subject.send_messages(target, [message], message_id)
|
41
68
|
end
|
42
69
|
end
|
43
70
|
end
|
@@ -25,23 +25,26 @@ describe Lita::Adapters::Flowdock::MessageHandler, lita: true do
|
|
25
25
|
|
26
26
|
describe "#handle" do
|
27
27
|
context "a normal message" do
|
28
|
+
let(:id) { 2345 }
|
28
29
|
let(:data) do
|
29
30
|
{
|
30
31
|
'content' => 'Hello World!',
|
31
32
|
'event' => 'message',
|
32
33
|
'flow' => test_flow,
|
34
|
+
'id' => id,
|
33
35
|
'user' => test_user_id
|
34
36
|
}
|
35
37
|
end
|
36
38
|
let(:message) { instance_double('Lita::Message', command!: false) }
|
37
|
-
let(:source) { instance_double('Lita::
|
39
|
+
let(:source) { instance_double('Lita::FlowdockSource', private_message?: false, message_id: id) }
|
38
40
|
let(:user) { user_double(test_user_id) }
|
39
41
|
|
40
42
|
before do
|
41
43
|
allow(Lita::User).to receive(:find_by_id).and_return(user)
|
42
|
-
allow(Lita::
|
44
|
+
allow(Lita::FlowdockSource).to receive(:new).with(
|
43
45
|
user: user,
|
44
|
-
room: test_flow
|
46
|
+
room: test_flow,
|
47
|
+
message_id: id
|
45
48
|
).and_return(source)
|
46
49
|
allow(Lita::Message).to receive(:new).with(
|
47
50
|
robot, 'Hello World!', source).and_return(message)
|
@@ -60,6 +63,7 @@ describe Lita::Adapters::Flowdock::MessageHandler, lita: true do
|
|
60
63
|
'event' => 'message',
|
61
64
|
'flow' => test_flow,
|
62
65
|
'user' => test_user_id,
|
66
|
+
'id' => id
|
63
67
|
}
|
64
68
|
end
|
65
69
|
|
@@ -45,17 +45,30 @@ describe Lita::Adapters::Flowdock, lita: true do
|
|
45
45
|
end
|
46
46
|
|
47
47
|
describe "#send_messages" do
|
48
|
-
let(:
|
48
|
+
let(:id) { 8888 }
|
49
|
+
let(:room_source) { Lita::FlowdockSource.new(room: '1234abcd', message_id: id) }
|
49
50
|
let(:user) { Lita::User.new('987654') }
|
50
51
|
let(:user_source) { Lita::Source.new(user: user) }
|
51
52
|
|
52
53
|
it "sends messages to flows" do
|
53
|
-
expect(connector).to receive(:send_messages).with(room_source.room, ['foo'])
|
54
|
+
expect(connector).to receive(:send_messages).with(room_source.room, ['foo'], room_source.message_id)
|
54
55
|
|
55
56
|
subject.run
|
56
57
|
|
57
58
|
subject.send_messages(room_source, ['foo'])
|
58
59
|
end
|
60
|
+
|
61
|
+
context "with thread_responses disabled" do
|
62
|
+
before do
|
63
|
+
registry.config.adapters.flowdock.thread_responses = :disabled
|
64
|
+
end
|
65
|
+
|
66
|
+
it "sends messages to flow without the original message id" do
|
67
|
+
expect(connector).to receive(:send_messages).with(room_source.room, ['foo'])
|
68
|
+
subject.run
|
69
|
+
subject.send_messages(room_source, ['foo'])
|
70
|
+
end
|
71
|
+
end
|
59
72
|
end
|
60
73
|
|
61
74
|
describe "#shut_down" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lita-flowdock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben House
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: lita
|
@@ -173,6 +173,7 @@ extra_rdoc_files: []
|
|
173
173
|
files:
|
174
174
|
- ".gitignore"
|
175
175
|
- ".travis.yml"
|
176
|
+
- CHANGELOG.md
|
176
177
|
- GETTING_STARTED.md
|
177
178
|
- Gemfile
|
178
179
|
- LICENSE
|
@@ -183,6 +184,7 @@ files:
|
|
183
184
|
- lib/lita/adapters/flowdock/connector.rb
|
184
185
|
- lib/lita/adapters/flowdock/message_handler.rb
|
185
186
|
- lib/lita/adapters/flowdock/users_creator.rb
|
187
|
+
- lib/lita/source/flowdock_source.rb
|
186
188
|
- lita-flowdock.gemspec
|
187
189
|
- locales/en.yml
|
188
190
|
- spec/lita/adapters/flowdock/connector_spec.rb
|