edi 0.2.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/edi.gemspec +1 -2
  3. data/lib/edi.rb +12 -2
  4. data/lib/edi/application.rb +4 -11
  5. data/lib/edi/core.rb +7 -0
  6. data/lib/edi/service_runner.rb +28 -0
  7. data/lib/edi/services/img_flip.rb +1 -1
  8. data/lib/edi/services/tweet_that.rb +1 -1
  9. data/lib/edi/slack.rb +2 -0
  10. data/lib/edi/slack/websocket_incoming_message.rb +32 -0
  11. data/lib/edi/slack/websocket_outgoing_message.rb +21 -0
  12. data/lib/edi/version.rb +1 -1
  13. data/lib/edi/websocket.rb +1 -0
  14. data/lib/edi/websocket/client.rb +47 -0
  15. data/spec/services/img_flip_spec.rb +14 -14
  16. data/spec/services/tweet_that_spec.rb +1 -1
  17. data/spec/spec_helper.rb +2 -2
  18. metadata +15 -86
  19. data/features/fact_service.feature +0 -7
  20. data/features/giphy_service.feature +0 -43
  21. data/features/i_heart_quotes_service.feature +0 -21
  22. data/features/img_flip_service.feature +0 -11
  23. data/features/step_definitions/fact_service_steps.rb +0 -7
  24. data/features/step_definitions/giphy_steps.rb +0 -3
  25. data/features/step_definitions/img_flip_steps.rb +0 -3
  26. data/features/step_definitions/server_steps.rb +0 -3
  27. data/features/step_definitions/tweet_that_steps.rb +0 -19
  28. data/features/step_definitions/weather_steps.rb +0 -3
  29. data/features/support/env.rb +0 -37
  30. data/features/support/hooks.rb +0 -1
  31. data/features/support/vcr_cassettes/Fact_Service/EDI_responds_with_a_random_fact.yml +0 -53
  32. data/features/support/vcr_cassettes/Fact_Service/Jarvis_responds_with_a_random_fact.yml +0 -52
  33. data/features/support/vcr_cassettes/Giphy_Service/Bacon.yml +0 -58
  34. data/features/support/vcr_cassettes/Giphy_Service/Cat_GIF_-_Cat_Wording.yml +0 -58
  35. data/features/support/vcr_cassettes/Giphy_Service/Cat_GIF_-_Kitty_Wording.yml +0 -58
  36. data/features/support/vcr_cassettes/Giphy_Service/Cat_GIF_-_Kitty_Wording_-_Case_Insensitive.yml +0 -58
  37. data/features/support/vcr_cassettes/Giphy_Service/Plain_old_GIF.yml +0 -58
  38. data/features/support/vcr_cassettes/Giphy_Service/Sloth.yml +0 -58
  39. data/features/support/vcr_cassettes/Giphy_Service/Trippy.yml +0 -58
  40. data/features/support/vcr_cassettes/I_Heart_Quotes/A_Random_Quote.yml +0 -44
  41. data/features/support/vcr_cassettes/I_Heart_Quotes/A_Simpsons_Quote.yml +0 -44
  42. data/features/support/vcr_cassettes/I_Heart_Quotes/A_Star_Wars_Quote.yml +0 -44
  43. data/features/support/vcr_cassettes/ImgFlip/Success_Kid.yml +0 -54
  44. data/features/support/vcr_cassettes/Tweet_that/Post_the_last_message_to_twitter.yml +0 -211
  45. data/features/support/vcr_cassettes/Weather_Service/Use_a_specified_location.yml +0 -86
  46. data/features/support/vcr_cassettes/Weather_Service/Use_default_location.yml +0 -86
  47. data/features/tweet_that_service.feature +0 -14
  48. data/features/weather_service.feature +0 -21
  49. data/lib/edi/server.rb +0 -45
  50. data/spec/edi/server_spec.rb +0 -20
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ecd3dd31e032bf701c0ebb2286f741cfb7564543
4
- data.tar.gz: 23fa94814aa472f717dee1a7c70212a08cb3de97
3
+ metadata.gz: 77cd1ecd1dfe2276c05383418944154c354e38c5
4
+ data.tar.gz: f6ce67c78c00bfb147301ac1a517827aa36753e9
5
5
  SHA512:
6
- metadata.gz: 18ce005e3db14d775ee4f70b7132b4e9d0e4116a2211a4731d8aee275f3022a1d89c78c1cf2fdb20716182033e7b2a8364909c9465d1341f9674ec53d08a41f9
7
- data.tar.gz: 0c30fab5038c3311267f052e237f4f15ef8195fec12698ec692d685c0767792b60a894327e167f3da866de5f4bb50ee282bf74af913c05e703ef7dd2e1ae5991
6
+ metadata.gz: 7c4992e4f5a69eb983c8d6bf2fdf010b875380868aceb7b67806866782f4a4b0eae58b86c3b12f0f01d5e13b1e928e0b6af3eb07b4dcc6c9d464f2e4bd82f98e
7
+ data.tar.gz: a297db943b8d07203a9310d4894923db6d5ac6af38a5dd338dd82e39993bbf0ba08274aff9111640089453877e125902963de4563cdf1a2684c5df20c6e4b373
@@ -29,12 +29,11 @@ Gem::Specification.new do |spec|
29
29
  spec.add_development_dependency "guard-rspec"
30
30
  spec.add_development_dependency "guard-cucumber"
31
31
  spec.add_development_dependency "terminal-notifier-guard"
32
- spec.add_dependency "sinatra"
33
- spec.add_dependency "sinatra-contrib"
34
32
  spec.add_dependency "httparty"
35
33
  spec.add_dependency "thor"
36
34
  spec.add_dependency "activesupport"
37
35
  spec.add_dependency "hooks"
38
36
  spec.add_dependency "twitter"
39
37
  spec.add_dependency "rufus-scheduler"
38
+ spec.add_dependency "faye-websocket"
40
39
  end
data/lib/edi.rb CHANGED
@@ -2,7 +2,7 @@ require 'active_support'
2
2
  require 'active_support/string_inquirer'
3
3
  require 'edi/core_ext'
4
4
  require "edi/version"
5
- require 'edi/server'
5
+ require 'edi/core'
6
6
  require 'edi/dsl'
7
7
  require 'edi/postable'
8
8
  require 'edi/environment'
@@ -11,6 +11,7 @@ require 'edi/exceptions'
11
11
  require 'edi/interpreter'
12
12
  require 'edi/refinements'
13
13
  require 'edi/services'
14
+ require 'edi/service_runner'
14
15
  require 'edi/slack'
15
16
  require 'edi/api/response'
16
17
  require 'edi/configuration'
@@ -19,9 +20,10 @@ require 'edi/application'
19
20
  require 'edi/utilities/array_responder'
20
21
  require 'edi/schedule'
21
22
  require 'edi/job'
23
+ require 'edi/websocket'
22
24
  module EDI
23
25
  class << self
24
- attr_accessor :services
26
+ attr_accessor :services, :websocket
25
27
  def services
26
28
  @services ||= []
27
29
  end
@@ -52,6 +54,14 @@ module EDI
52
54
  self.config.environment = ActiveSupport::StringInquirer.new(environment)
53
55
  end
54
56
 
57
+ def websocket
58
+ @websocket ||= Websocket::Client.new
59
+ end
60
+
61
+ def runner
62
+ ServiceRunner
63
+ end
64
+
55
65
  end
56
66
  include EDI::HTTPUtilities
57
67
  include EDI::Configuration
@@ -7,15 +7,7 @@ module EDI
7
7
  autoload_paths
8
8
  require File.join EDI.root, "bot/server"
9
9
  require_initializers
10
- initialize_hostname_and_port
11
- start_keepalive
12
- end
13
-
14
- def self.initialize_hostname_and_port
15
- if EDI.env.development?
16
- EDI.config.host = "http://127.0.0.1"
17
- EDI.config.port ||= ENV["JARVIS_PORT"]
18
- end
10
+ connect_websocket
19
11
  end
20
12
 
21
13
  def self.require_initializers
@@ -32,8 +24,9 @@ module EDI
32
24
  $: << EDI.root
33
25
  end
34
26
 
35
- def self.start_keepalive
36
- EDI.keepalive if EDI.config.attempt_keepalive
27
+ def self.connect_websocket
28
+ EDI.websocket.connect
37
29
  end
30
+
38
31
  end
39
32
  end
@@ -0,0 +1,7 @@
1
+ module EDI
2
+ class Core
3
+ def self.register_services(*args)
4
+ EDI.register_services *args
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,28 @@
1
+ class ServiceRunner
2
+
3
+ attr_accessor :message, :service
4
+ def initialize(message:)
5
+ @message = message
6
+ end
7
+
8
+ def execute
9
+ self.service = EDI::Interpreter.new(message).determine_service.new(message)
10
+ begin
11
+ _run_service
12
+ rescue EDI::UnfitEnvironmentException => e
13
+ EDI::ArrayResponder.new(EDI.config.unfit_environment_response).respond
14
+ rescue EDI::ThirdPartyAPIFailure
15
+ EDI::ArrayResponder.new(EDI.config.third_party_api_failure_respone).respond
16
+ rescue => e
17
+ EDI::ArrayResponder.new(EDI.config.standard_error_response).respond
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def _run_service
24
+ service.validate_environment
25
+ service.invoke
26
+ end
27
+
28
+ end
@@ -11,7 +11,7 @@ class ImgFlip < EDI::Service
11
11
  attr_accessor :meme_link
12
12
 
13
13
  def run
14
- "Here you go, #{user_name}\n\n#{meme_link}"
14
+ "#{meme_link}"
15
15
  end
16
16
 
17
17
  private
@@ -16,7 +16,7 @@ class TweetThat < EDI::Service
16
16
 
17
17
  def run
18
18
  self.tweet = post_tweet
19
- "Here you are, #{user_name}, #{link}"
19
+ "#{link}"
20
20
  end
21
21
 
22
22
  private
@@ -1 +1,3 @@
1
1
  require 'edi/slack/message'
2
+ require 'edi/slack/websocket_incoming_message'
3
+ require 'edi/slack/websocket_outgoing_message'
@@ -0,0 +1,32 @@
1
+ module Slack
2
+ class WebsocketIncomingMessage
3
+ attr_accessor :channel, :user, :text, :type
4
+ def initialize(params)
5
+ params = JSON.parse(params)
6
+ @channel = params["channel"]
7
+ @user = params["user"]
8
+ @text = params["text"]
9
+ @type = params["type"]
10
+ end
11
+
12
+ def to_s
13
+ "Slack::WebsocketMessage text: #{self.text}"
14
+ end
15
+
16
+ def should_respond?
17
+ message_type? && mentions_edi?
18
+ end
19
+
20
+ def message_type?
21
+ type == "message"
22
+ end
23
+
24
+ def mentions_edi?
25
+ if text
26
+ text.match /edi/i
27
+ else
28
+ false
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,21 @@
1
+ require 'json'
2
+ module Slack
3
+ class WebsocketOutgoingMessage
4
+ attr_accessor :text, :channel, :type, :id
5
+ def initialize(id: ,text:, channel:)
6
+ @text = text
7
+ @channel = channel
8
+ @type = "message"
9
+ @id = id
10
+ end
11
+
12
+ def to_json
13
+ {
14
+ text: text,
15
+ channel: channel,
16
+ type: type,
17
+ id: id
18
+ }.to_json
19
+ end
20
+ end
21
+ end
@@ -1,3 +1,3 @@
1
1
  module EDI
2
- VERSION = "0.2.3"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -0,0 +1 @@
1
+ require 'edi/websocket/client'
@@ -0,0 +1,47 @@
1
+ require 'faye/websocket'
2
+ require 'eventmachine'
3
+
4
+ module Websocket
5
+ class Client
6
+ attr_accessor :ws_url, :client, :id
7
+
8
+ def initialize
9
+ self.id = 1
10
+ end
11
+
12
+ def connect
13
+ self.ws_url = EDI.get("https://slack.com/api/rtm.start?token=#{ENV["SLACK_TOKEN"]}").response["url"]
14
+ EM.run {
15
+
16
+ self.client = Faye::WebSocket::Client.new(ws_url)
17
+
18
+ client.on :open do |event|
19
+ puts "EDI is now online"
20
+ end
21
+
22
+ # Respond to Messages
23
+ client.on :message do |event|
24
+ incoming_message = Slack::WebsocketIncomingMessage.new(event.data).message
25
+ if incoming_message.should_respond?
26
+ response_text = ""
27
+ service = Proc.new { response_text = EDI.runner.new(message: incoming_message).execute }
28
+ response = Proc.new { client.send Slack::WebsocketOutgoingMessage.new(text: response_text, channel: incoming_message.channel, id: id).to_json }
29
+ EM.defer service, response
30
+ increment_id
31
+ end
32
+ end
33
+
34
+ # Kepp Websocket Connection Alive
35
+ EM.add_periodic_timer(1) do
36
+ client.ping
37
+ end
38
+ }
39
+ end
40
+
41
+ private
42
+
43
+ def increment_id
44
+ self.id += 1
45
+ end
46
+ end
47
+ end
@@ -6,84 +6,84 @@ RSpec.describe ImgFlip do
6
6
  let(:message) { Slack::Message.new(slack_outgoing_message(user_name: "DVG", text: "EDI, success kid hello, world")) }
7
7
  subject { described_class.new message }
8
8
  let(:meme_link) { "http://i.imgflip.com/hz9zo.jpg" }
9
- it { expect(subject.invoke).to eq "Here you go, DVG\n\n#{meme_link}" }
9
+ it { expect(subject.invoke).to eq "#{meme_link}" }
10
10
  end
11
11
  describe "Afraid to Ask Andy", vcr: { cassette_name: 'img_flip_afraid_to_ask', :record => :new_episodes} do
12
12
  let(:message) { Slack::Message.new(slack_outgoing_message(user_name: "DVG", text: "EDI, I'm not sure how to mock third party apis, and at this point, I'm afraid to ask")) }
13
13
  subject { described_class.new message }
14
14
  let(:meme_link) { "http://i.imgflip.com/hza6u.jpg" }
15
- it { expect(subject.invoke).to eq "Here you go, DVG\n\n#{meme_link}" }
15
+ it { expect(subject.invoke).to eq "#{meme_link}" }
16
16
  end
17
17
  describe "And It's Gone", vcr: { cassette_name: 'img_flip_and_its_gone', :record => :new_episodes} do
18
18
  let(:message) { Slack::Message.new(slack_outgoing_message(user_name: "DVG", text: "EDI, you have some services here, and it's gone")) }
19
19
  subject { described_class.new message }
20
20
  let(:meme_link) { "http://i.imgflip.com/hzqv7.jpg" }
21
- it { expect(subject.invoke).to eq "Here you go, DVG\n\n#{meme_link}" }
21
+ it { expect(subject.invoke).to eq "#{meme_link}" }
22
22
  end
23
23
  describe "Everywhere", vcr: { cassette_name: 'img_flip_everywhere', :record => :new_episodes} do
24
24
  let(:message) { Slack::Message.new(slack_outgoing_message(user_name: "DVG", text: "EDI, tests, tests everywhere")) }
25
25
  subject { described_class.new message }
26
26
  let(:meme_link) { "http://i.imgflip.com/hzr5m.jpg" }
27
- it { expect(subject.invoke).to eq "Here you go, DVG\n\n#{meme_link}" }
27
+ it { expect(subject.invoke).to eq "#{meme_link}" }
28
28
  end
29
29
  describe "Everywhere", vcr: { cassette_name: 'img_flip_gonna_have_a_bad_time', :record => :new_episodes} do
30
30
  let(:message) { Slack::Message.new(slack_outgoing_message(user_name: "DVG", text: "EDI, if you mock when you should use a real object, you're gonna have a bad time")) }
31
31
  subject { described_class.new message }
32
32
  let(:meme_link) { "http://i.imgflip.com/hzrd1.jpg" }
33
- it { expect(subject.invoke).to eq "Here you go, DVG\n\n#{meme_link}" }
33
+ it { expect(subject.invoke).to eq "#{meme_link}" }
34
34
  end
35
35
  describe "Most Interesting Man", vcr: { cassette_name: 'img_flip_most_interesting_man', :record => :new_episodes} do
36
36
  let(:message) { Slack::Message.new(slack_outgoing_message(user_name: "DVG", text: "EDI, I don't always ci my code, but when I do, I do it on Travis")) }
37
37
  subject { described_class.new message }
38
38
  let(:meme_link) { "http://i.imgflip.com/hzrnq.jpg" }
39
- it { expect(subject.invoke).to eq "Here you go, DVG\n\n#{meme_link}" }
39
+ it { expect(subject.invoke).to eq "#{meme_link}" }
40
40
  end
41
41
  describe "Not Sure If", vcr: { cassette_name: 'img_flip_not_sure_if', :record => :new_episodes} do
42
42
  let(:message) { Slack::Message.new(slack_outgoing_message(user_name: "DVG", text: "EDI, Not sure if this test is going to pass, or if it's gonna break the build")) }
43
43
  subject { described_class.new message }
44
44
  let(:meme_link) { "http://i.imgflip.com/hzrz0.jpg" }
45
- it { expect(subject.invoke).to eq "Here you go, DVG\n\n#{meme_link}" }
45
+ it { expect(subject.invoke).to eq "#{meme_link}" }
46
46
  end
47
47
  describe "One Does Not Simply", vcr: { cassette_name: 'img_flip_one_does_not_simply', :record => :new_episodes} do
48
48
  let(:message) { Slack::Message.new(slack_outgoing_message(user_name: "DVG", text: "EDI, one does not simply write rspecs")) }
49
49
  subject { described_class.new message }
50
50
  let(:meme_link) { "http://i.imgflip.com/hzs4e.jpg" }
51
- it { expect(subject.invoke).to eq "Here you go, DVG\n\n#{meme_link}" }
51
+ it { expect(subject.invoke).to eq "#{meme_link}" }
52
52
  end
53
53
  describe "Overly Attached Girlfriend", vcr: { cassette_name: 'img_flip_overly_attached_girlfriend', :record => :new_episodes} do
54
54
  let(:message) { Slack::Message.new(slack_outgoing_message(user_name: "DVG", text: "EDI, overly attached girlfriend I looked at your slack channel, who is this jarvis you keep talking to?")) }
55
55
  subject { described_class.new message }
56
56
  let(:meme_link) { "http://i.imgflip.com/hzsbu.jpg" }
57
- it { expect(subject.invoke).to eq "Here you go, DVG\n\n#{meme_link}" }
57
+ it { expect(subject.invoke).to eq "#{meme_link}" }
58
58
  end
59
59
  describe "Picard", vcr: { cassette_name: 'img_flip_picard', :record => :new_episodes} do
60
60
  let(:message) { Slack::Message.new(slack_outgoing_message(user_name: "DVG", text: "EDI, picard why the fuck, did you make so many memes?")) }
61
61
  subject { described_class.new message }
62
62
  let(:meme_link) { "http://i.imgflip.com/hzsgd.jpg" }
63
- it { expect(subject.invoke).to eq "Here you go, DVG\n\n#{meme_link}" }
63
+ it { expect(subject.invoke).to eq "#{meme_link}" }
64
64
  end
65
65
  describe "Sudden Clarity", vcr: { cassette_name: 'img_flip_sudden_clarity', :record => :new_episodes} do
66
66
  let(:message) { Slack::Message.new(slack_outgoing_message(user_name: "DVG", text: "EDI, sudden clarity can't think of, anything clever right now")) }
67
67
  subject { described_class.new message }
68
68
  let(:meme_link) { "http://i.imgflip.com/hzspk.jpg" }
69
- it { expect(subject.invoke).to eq "Here you go, DVG\n\n#{meme_link}" }
69
+ it { expect(subject.invoke).to eq "#{meme_link}" }
70
70
  end
71
71
  describe "What if I Told You", vcr: { cassette_name: 'img_flip_what_if_I_told_you', :record => :new_episodes} do
72
72
  let(:message) { Slack::Message.new(slack_outgoing_message(user_name: "DVG", text: "EDI, what if I told you EDI is the best bot ever?")) }
73
73
  subject { described_class.new message }
74
74
  let(:meme_link) { "http://i.imgflip.com/hzsv9.jpg" }
75
- it { expect(subject.invoke).to eq "Here you go, DVG\n\n#{meme_link}" }
75
+ it { expect(subject.invoke).to eq "#{meme_link}" }
76
76
  end
77
77
  describe "Willy Wonka", vcr: { cassette_name: 'img_flip_willy_wonka', :record => :new_episodes} do
78
78
  let(:message) { Slack::Message.new(slack_outgoing_message(user_name: "DVG", text: "EDI willy wonka hello, world")) }
79
79
  subject { described_class.new message }
80
80
  let(:meme_link) { "http://i.imgflip.com/hzt18.jpg" }
81
- it { expect(subject.invoke).to eq "Here you go, DVG\n\n#{meme_link}" }
81
+ it { expect(subject.invoke).to eq "#{meme_link}" }
82
82
  end
83
83
  describe "Y U No", vcr: { cassette_name: 'img_flip_y_u_no', :record => :new_episodes} do
84
84
  let(:message) { Slack::Message.new(slack_outgoing_message(user_name: "DVG", text: "EDI y u no sql")) }
85
85
  subject { described_class.new message }
86
86
  let(:meme_link) { "http://i.imgflip.com/hzt5g.jpg" }
87
- it { expect(subject.invoke).to eq "Here you go, DVG\n\n#{meme_link}" }
87
+ it { expect(subject.invoke).to eq "#{meme_link}" }
88
88
  end
89
89
  end
@@ -13,6 +13,6 @@ RSpec.describe TweetThat, vcr: { cassette_name: 'tweet_that', :record => :new_ep
13
13
  end
14
14
  let(:message) { Slack::Message.new(slack_outgoing_message(text: "EDI, tweet that", channel_id: "C0000001", user_name: "DVG")) }
15
15
  subject { described_class.new message }
16
- it { expect(subject.invoke).to eq "Here you are, DVG, https://twitter.com/twitter_handle/status/569329768350380032" }
16
+ it { expect(subject.invoke).to eq "https://twitter.com/twitter_handle/status/569329768350380032" }
17
17
  end
18
18
  end
@@ -13,7 +13,7 @@ include Rack::Test::Methods
13
13
  include EDI::TestSupport
14
14
 
15
15
  def app
16
- EDI::Server
16
+ EDI::Core
17
17
  end
18
18
 
19
19
  RSpec.configure do |config|
@@ -29,7 +29,7 @@ RSpec.configure do |config|
29
29
 
30
30
  end
31
31
  end
32
- class TestServer < EDI::Server
32
+ class TestServer < EDI::Core
33
33
  end
34
34
 
35
35
  example.run
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: edi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - DVG
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-18 00:00:00.000000000 Z
11
+ date: 2015-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -179,21 +179,7 @@ dependencies:
179
179
  - !ruby/object:Gem::Version
180
180
  version: '0'
181
181
  - !ruby/object:Gem::Dependency
182
- name: sinatra
183
- requirement: !ruby/object:Gem::Requirement
184
- requirements:
185
- - - ">="
186
- - !ruby/object:Gem::Version
187
- version: '0'
188
- type: :runtime
189
- prerelease: false
190
- version_requirements: !ruby/object:Gem::Requirement
191
- requirements:
192
- - - ">="
193
- - !ruby/object:Gem::Version
194
- version: '0'
195
- - !ruby/object:Gem::Dependency
196
- name: sinatra-contrib
182
+ name: httparty
197
183
  requirement: !ruby/object:Gem::Requirement
198
184
  requirements:
199
185
  - - ">="
@@ -207,7 +193,7 @@ dependencies:
207
193
  - !ruby/object:Gem::Version
208
194
  version: '0'
209
195
  - !ruby/object:Gem::Dependency
210
- name: httparty
196
+ name: thor
211
197
  requirement: !ruby/object:Gem::Requirement
212
198
  requirements:
213
199
  - - ">="
@@ -221,7 +207,7 @@ dependencies:
221
207
  - !ruby/object:Gem::Version
222
208
  version: '0'
223
209
  - !ruby/object:Gem::Dependency
224
- name: thor
210
+ name: activesupport
225
211
  requirement: !ruby/object:Gem::Requirement
226
212
  requirements:
227
213
  - - ">="
@@ -235,7 +221,7 @@ dependencies:
235
221
  - !ruby/object:Gem::Version
236
222
  version: '0'
237
223
  - !ruby/object:Gem::Dependency
238
- name: activesupport
224
+ name: hooks
239
225
  requirement: !ruby/object:Gem::Requirement
240
226
  requirements:
241
227
  - - ">="
@@ -249,7 +235,7 @@ dependencies:
249
235
  - !ruby/object:Gem::Version
250
236
  version: '0'
251
237
  - !ruby/object:Gem::Dependency
252
- name: hooks
238
+ name: twitter
253
239
  requirement: !ruby/object:Gem::Requirement
254
240
  requirements:
255
241
  - - ">="
@@ -263,7 +249,7 @@ dependencies:
263
249
  - !ruby/object:Gem::Version
264
250
  version: '0'
265
251
  - !ruby/object:Gem::Dependency
266
- name: twitter
252
+ name: rufus-scheduler
267
253
  requirement: !ruby/object:Gem::Requirement
268
254
  requirements:
269
255
  - - ">="
@@ -277,7 +263,7 @@ dependencies:
277
263
  - !ruby/object:Gem::Version
278
264
  version: '0'
279
265
  - !ruby/object:Gem::Dependency
280
- name: rufus-scheduler
266
+ name: faye-websocket
281
267
  requirement: !ruby/object:Gem::Requirement
282
268
  requirements:
283
269
  - - ">="
@@ -310,41 +296,12 @@ files:
310
296
  - Vagrantfile
311
297
  - bin/edi
312
298
  - edi.gemspec
313
- - features/fact_service.feature
314
- - features/giphy_service.feature
315
- - features/i_heart_quotes_service.feature
316
- - features/img_flip_service.feature
317
- - features/step_definitions/fact_service_steps.rb
318
- - features/step_definitions/giphy_steps.rb
319
- - features/step_definitions/img_flip_steps.rb
320
- - features/step_definitions/server_steps.rb
321
- - features/step_definitions/tweet_that_steps.rb
322
- - features/step_definitions/weather_steps.rb
323
- - features/support/env.rb
324
- - features/support/hooks.rb
325
- - features/support/vcr_cassettes/Fact_Service/EDI_responds_with_a_random_fact.yml
326
- - features/support/vcr_cassettes/Fact_Service/Jarvis_responds_with_a_random_fact.yml
327
- - features/support/vcr_cassettes/Giphy_Service/Bacon.yml
328
- - features/support/vcr_cassettes/Giphy_Service/Cat_GIF_-_Cat_Wording.yml
329
- - features/support/vcr_cassettes/Giphy_Service/Cat_GIF_-_Kitty_Wording.yml
330
- - features/support/vcr_cassettes/Giphy_Service/Cat_GIF_-_Kitty_Wording_-_Case_Insensitive.yml
331
- - features/support/vcr_cassettes/Giphy_Service/Plain_old_GIF.yml
332
- - features/support/vcr_cassettes/Giphy_Service/Sloth.yml
333
- - features/support/vcr_cassettes/Giphy_Service/Trippy.yml
334
- - features/support/vcr_cassettes/I_Heart_Quotes/A_Random_Quote.yml
335
- - features/support/vcr_cassettes/I_Heart_Quotes/A_Simpsons_Quote.yml
336
- - features/support/vcr_cassettes/I_Heart_Quotes/A_Star_Wars_Quote.yml
337
- - features/support/vcr_cassettes/ImgFlip/Success_Kid.yml
338
- - features/support/vcr_cassettes/Tweet_that/Post_the_last_message_to_twitter.yml
339
- - features/support/vcr_cassettes/Weather_Service/Use_a_specified_location.yml
340
- - features/support/vcr_cassettes/Weather_Service/Use_default_location.yml
341
- - features/tweet_that_service.feature
342
- - features/weather_service.feature
343
299
  - lib/edi.rb
344
300
  - lib/edi/api/response.rb
345
301
  - lib/edi/application.rb
346
302
  - lib/edi/cli.rb
347
303
  - lib/edi/configuration.rb
304
+ - lib/edi/core.rb
348
305
  - lib/edi/core_ext.rb
349
306
  - lib/edi/core_ext/symbol.rb
350
307
  - lib/edi/dsl.rb
@@ -357,8 +314,8 @@ files:
357
314
  - lib/edi/refinements.rb
358
315
  - lib/edi/refinements/zip_refinement.rb
359
316
  - lib/edi/schedule.rb
360
- - lib/edi/server.rb
361
317
  - lib/edi/service.rb
318
+ - lib/edi/service_runner.rb
362
319
  - lib/edi/services.rb
363
320
  - lib/edi/services/dice.rb
364
321
  - lib/edi/services/eightball.rb
@@ -386,15 +343,18 @@ files:
386
343
  - lib/edi/services/weather.rb
387
344
  - lib/edi/slack.rb
388
345
  - lib/edi/slack/message.rb
346
+ - lib/edi/slack/websocket_incoming_message.rb
347
+ - lib/edi/slack/websocket_outgoing_message.rb
389
348
  - lib/edi/test_support/cucumber.rb
390
349
  - lib/edi/test_support/test_support.rb
391
350
  - lib/edi/utilities/array_responder.rb
392
351
  - lib/edi/version.rb
352
+ - lib/edi/websocket.rb
353
+ - lib/edi/websocket/client.rb
393
354
  - scripts/bootstrap_edi.sh
394
355
  - spec/edi/edi_spec.rb
395
356
  - spec/edi/interpreter_spec.rb
396
357
  - spec/edi/postable_spec.rb
397
- - spec/edi/server_spec.rb
398
358
  - spec/edi/service_spec.rb
399
359
  - spec/services/dice_spec.rb
400
360
  - spec/services/eightball_spec.rb
@@ -461,40 +421,9 @@ signing_key:
461
421
  specification_version: 4
462
422
  summary: Chatbot Application Framework for Slack Chat Rooms
463
423
  test_files:
464
- - features/fact_service.feature
465
- - features/giphy_service.feature
466
- - features/i_heart_quotes_service.feature
467
- - features/img_flip_service.feature
468
- - features/step_definitions/fact_service_steps.rb
469
- - features/step_definitions/giphy_steps.rb
470
- - features/step_definitions/img_flip_steps.rb
471
- - features/step_definitions/server_steps.rb
472
- - features/step_definitions/tweet_that_steps.rb
473
- - features/step_definitions/weather_steps.rb
474
- - features/support/env.rb
475
- - features/support/hooks.rb
476
- - features/support/vcr_cassettes/Fact_Service/EDI_responds_with_a_random_fact.yml
477
- - features/support/vcr_cassettes/Fact_Service/Jarvis_responds_with_a_random_fact.yml
478
- - features/support/vcr_cassettes/Giphy_Service/Bacon.yml
479
- - features/support/vcr_cassettes/Giphy_Service/Cat_GIF_-_Cat_Wording.yml
480
- - features/support/vcr_cassettes/Giphy_Service/Cat_GIF_-_Kitty_Wording.yml
481
- - features/support/vcr_cassettes/Giphy_Service/Cat_GIF_-_Kitty_Wording_-_Case_Insensitive.yml
482
- - features/support/vcr_cassettes/Giphy_Service/Plain_old_GIF.yml
483
- - features/support/vcr_cassettes/Giphy_Service/Sloth.yml
484
- - features/support/vcr_cassettes/Giphy_Service/Trippy.yml
485
- - features/support/vcr_cassettes/I_Heart_Quotes/A_Random_Quote.yml
486
- - features/support/vcr_cassettes/I_Heart_Quotes/A_Simpsons_Quote.yml
487
- - features/support/vcr_cassettes/I_Heart_Quotes/A_Star_Wars_Quote.yml
488
- - features/support/vcr_cassettes/ImgFlip/Success_Kid.yml
489
- - features/support/vcr_cassettes/Tweet_that/Post_the_last_message_to_twitter.yml
490
- - features/support/vcr_cassettes/Weather_Service/Use_a_specified_location.yml
491
- - features/support/vcr_cassettes/Weather_Service/Use_default_location.yml
492
- - features/tweet_that_service.feature
493
- - features/weather_service.feature
494
424
  - spec/edi/edi_spec.rb
495
425
  - spec/edi/interpreter_spec.rb
496
426
  - spec/edi/postable_spec.rb
497
- - spec/edi/server_spec.rb
498
427
  - spec/edi/service_spec.rb
499
428
  - spec/services/dice_spec.rb
500
429
  - spec/services/eightball_spec.rb