slack-ruby-bot 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rubocop_todo.yml +5 -9
  4. data/CHANGELOG.md +6 -0
  5. data/README.md +34 -5
  6. data/TUTORIAL.md +148 -0
  7. data/examples/minimal/Gemfile.lock +1 -1
  8. data/lib/slack-ruby-bot/app.rb +10 -0
  9. data/lib/slack-ruby-bot/commands/about.rb +3 -0
  10. data/lib/slack-ruby-bot/commands/base.rb +30 -1
  11. data/lib/slack-ruby-bot/hooks/message.rb +98 -16
  12. data/lib/slack-ruby-bot/rspec/support/fixtures/slack/auth_test.yml +1 -47
  13. data/lib/slack-ruby-bot/rspec/support/slack-ruby-bot/it_behaves_like_a_slack_bot.rb +5 -2
  14. data/lib/slack-ruby-bot/rspec/support/slack-ruby-bot/respond_with_error.rb +0 -1
  15. data/lib/slack-ruby-bot/rspec/support/slack-ruby-bot/respond_with_slack_message.rb +0 -1
  16. data/lib/slack-ruby-bot/rspec/support/slack_ruby_bot_configure.rb +7 -3
  17. data/lib/slack-ruby-bot/version.rb +1 -1
  18. data/screenshots/demo.gif +0 -0
  19. data/slack-ruby-bot.gemspec +1 -0
  20. data/spec/slack-ruby-bot/commands/about_spec.rb +4 -7
  21. data/spec/slack-ruby-bot/commands/commands_spec.rb +21 -0
  22. data/spec/slack-ruby-bot/commands/empty_text_spec.rb +21 -0
  23. data/spec/slack-ruby-bot/commands/help_spec.rb +1 -4
  24. data/spec/slack-ruby-bot/commands/hi_spec.rb +1 -4
  25. data/spec/slack-ruby-bot/commands/operators_spec.rb +20 -0
  26. data/spec/slack-ruby-bot/commands/unknown_spec.rb +2 -5
  27. data/spec/slack-ruby-bot/rspec/respond_with_error_spec.rb +19 -0
  28. metadata +52 -31
  29. data/Gemfile.lock +0 -107
  30. data/lib/slack-ruby-bot/fixtures/slack/auth_test.yml +0 -48
  31. data/lib/slack-ruby-bot/rspec/fixtures/slack/auth_test.yml +0 -48
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 579866b4a7f11a4724bba648eff1b7f47b062b6b
4
- data.tar.gz: f14a5617e66ee1b851ec2f9f083f874023fa7b80
3
+ metadata.gz: 83ecb7fe802af333ec3950f148959ce2c19095cc
4
+ data.tar.gz: da223c787bfe98e74543f1cc878ae04272c9b554
5
5
  SHA512:
6
- metadata.gz: 8571d406cb61c2b7ea7bd66a06cd6eeb7897be28c480e34441fc2530774cd4f053ca6d58b8261c42f3487e8e93a4eaecf3b27bdf7abc7c98b775e8a93450da63
7
- data.tar.gz: 12dd65f281d52c45f5af250aad0db8536cb878bd5f26c7e156cd4dbd4403d75371f2eefdd13f1d716107b9c95697e6b6209d30343f4ee3203439d619e71ea110
6
+ metadata.gz: 0a29f81647a5b1b1d4156f4d51668697ce44ac6c80cba4ac4feb2f375c2d3eb4c31ac9af952dbae030e0c9646e4ec59ac3818d9bbfb2d989cbe24f0796453080
7
+ data.tar.gz: bd3d763b1334da9ccc10712f5b26bfc7f2f6942cdea9f9013edfeb3304881eca2bf8ad12cfd1e154339cd683bc365a24bb51ce4b6f8027064d3dfbe5d5dbc1ab
data/.gitignore CHANGED
@@ -1 +1,3 @@
1
1
  .env
2
+ pkg
3
+ Gemfile.lock
data/.rubocop_todo.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  # This configuration was generated by `rubocop --auto-gen-config`
2
- # on 2015-07-02 14:33:13 -0400 using RuboCop version 0.32.1.
2
+ # on 2015-07-10 08:49:06 -0400 using RuboCop version 0.32.1.
3
3
  # The point is for the user to remove these configuration records
4
4
  # one by one as the offenses are removed from the code base.
5
5
  # Note that changes in the inspected code, or installation of new
@@ -9,25 +9,21 @@
9
9
  Lint/HandleExceptions:
10
10
  Enabled: false
11
11
 
12
- # Offense count: 2
12
+ # Offense count: 1
13
13
  Metrics/AbcSize:
14
14
  Max: 21
15
15
 
16
- # Offense count: 1
17
- Metrics/CyclomaticComplexity:
18
- Max: 7
19
-
20
- # Offense count: 18
16
+ # Offense count: 24
21
17
  # Configuration parameters: AllowURI, URISchemes.
22
18
  Metrics/LineLength:
23
- Max: 130
19
+ Max: 142
24
20
 
25
21
  # Offense count: 1
26
22
  # Configuration parameters: CountComments.
27
23
  Metrics/MethodLength:
28
24
  Max: 17
29
25
 
30
- # Offense count: 14
26
+ # Offense count: 15
31
27
  Style/Documentation:
32
28
  Enabled: false
33
29
 
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ### 0.2.0 (7/10/2015)
2
+
3
+ * Sending `send_message` with nil or empty text will yield `Nothing to see here.` with a GIF instead of `no_text` - [@dblock](https://github.com/dblock).
4
+ * Added support for operators with `operator [name]` - [@dblock](https://github.com/dblock).
5
+ * Added support for custom commands with `command [name]` - [@dblock](https://github.com/dblock).
6
+
1
7
  ### 0.1.0 (6/2/2015)
2
8
 
3
9
  * Initial public release - [@dblock](https://github.com/dblock).
data/README.md CHANGED
@@ -1,9 +1,10 @@
1
1
  Slack-Ruby-Bot
2
2
  ==============
3
3
 
4
+ [![Gem Version](https://badge.fury.io/rb/slack-ruby-bot.svg)](http://badge.fury.io/rb/slack-ruby-bot)
4
5
  [![Build Status](https://travis-ci.org/dblock/slack-ruby-bot.png)](https://travis-ci.org/dblock/slack-ruby-bot)
5
6
 
6
- A generic Slack bot framework written in Ruby. This library does all the heavy lifting so you can focus on implementing slack bot commands.
7
+ A generic Slack bot framework written in Ruby. This library does all the heavy lifting so you can focus on implementing slack bot commands, without introducing unnecessary requirements or limitations. It's a Slack bot boilerplate.
7
8
 
8
9
  ## Usage
9
10
 
@@ -36,19 +37,47 @@ end
36
37
  PongBot::App.instance.run
37
38
  ```
38
39
 
39
- After [registering the bot](DEPLOYMENT.md), run with `SLACK_API_KEY=... bundle exec ruby pongbot.rb`.
40
+ After [registering the bot](DEPLOYMENT.md), run with `SLACK_API_KEY=... bundle exec ruby pongbot.rb`. Have the bot join a channel and send it a ping.
41
+
42
+ ![](screenshots/demo.gif)
43
+
44
+ ### A Production Bot
45
+
46
+ A typical production Slack bot is a combination of a vanilla web server and a websocket application that talks to the Slack Real Time Messaging API. See our [Writing a Production Bot](TUTORIAL.md) tutorial for more information.
40
47
 
41
48
  ### More Involved Examples
42
49
 
43
- A Slack bot is commonly a combination of a vanilla web server and a websocket application that talks to the Slack RealTime API. The web server is optional, but most people will run their Slack bots on Heroku in which case a web server is required to prevent Heroku from shutting the bot down. It also makes it convenient to develop and test using `foreman`.
50
+ The following examples of production-grade bots based on slack-ruby-bot are listed in growing order of complexity.
51
+
52
+ * [slack-mathbot](https://github.com/dblock/slack-mathbot): Slack integration with math.
53
+ * [slack-gamebot](https://github.com/dblock/slack-gamebot): A generic game bot for ping-pong, chess, etc.
44
54
 
45
- * [slack-mathbot](https://github.com/dblock/slack-mathbot)
55
+ ### Commands and Operators
56
+
57
+ Bots are addressed by name and respond to commands and operators. By default a command class responds, case-insensitively, to its name. A class called `Phone` that inherits from `SlackRubyBot::Commands::Base` responds to `phone` and `Phone`. To respond to custom commands and to disable automatic class name matching, use the `command` keyword. The following command responds to `call` and `呼び出し` (call in Japanese).
58
+
59
+ ```ruby
60
+ class Phone < SlackRubyBot::Commands::Base
61
+ command 'call'
62
+ command '呼び出し'
63
+ end
64
+ ```
65
+
66
+ Operators are 1-letter long and are similar to commands. They don't require addressing a bot nor separating an operator from its arguments. The following class responds to `=2+2`.
67
+
68
+ ```ruby
69
+ class Calculator < SlackRubyBot::Commands::Base
70
+ operator '='
71
+ end
72
+ ```
46
73
 
47
74
  ### Built-In Commands
48
75
 
76
+ Slack-ruby-bot comes with several built-in commands. You can re-define built-in commands, normally, as described above.
77
+
49
78
  #### [bot name]
50
79
 
51
- Shows bot version and links.
80
+ This is also known as the `default` command. Shows bot version and links.
52
81
 
53
82
  #### [bot name] hi
54
83
 
data/TUTORIAL.md ADDED
@@ -0,0 +1,148 @@
1
+ ## Production Bot Tutorial
2
+
3
+ In this tutorial we'll implement [slack-mathbot](https://github.com/dblock/slack-mathbot).
4
+
5
+ ### Introduction
6
+
7
+ A typical production Slack bot is a combination of a vanilla web server and a websocket application that talks to the [Slack Real Time Messaging API](https://api.slack.com/rtm). The web server is optional, but most people will run their Slack bots on [Heroku](https://dashboard.heroku.com) in which case a web server is required to prevent Heroku from shutting the bot down. It also makes it convenient to develop a bot and test using `foreman`.
8
+
9
+ ### Getting Started
10
+
11
+ #### Gemfile
12
+
13
+ Create a `Gemfile` that uses [slack-ruby-bot](https://github.com/dblock/slack-ruby-bot), [sinatra](https://github.com/sinatra/sinatra) (a web framework) and [puma](https://github.com/puma/puma) (a web server). For development we'll also use [foreman](https://github.com/theforeman/foreman) and write tests with [rspec](https://github.com/rspec/rspec).
14
+
15
+ ```ruby
16
+ source 'http://rubygems.org'
17
+
18
+ gem 'slack-ruby-bot'
19
+ gem 'puma'
20
+ gem 'sinatra'
21
+
22
+ group :development, :test do
23
+ gem 'rake'
24
+ gem 'foreman'
25
+ end
26
+
27
+ group :test do
28
+ gem 'rspec'
29
+ gem 'rack-test'
30
+ end
31
+ ```
32
+
33
+ Run `bundle install` to get all the gems.
34
+
35
+ #### Application
36
+
37
+ Create a folder called `slack-mathbot` and inside of it create `app.rb`.
38
+
39
+ ```ruby
40
+ module SlackMathbot
41
+ class App < SlackRubyBot::App
42
+ end
43
+ end
44
+ ```
45
+
46
+ #### Commands
47
+
48
+ Create a folder called `slack-mathbot/commands` and inside of it create `calculate.rb`. For now this calculator will always return 4.
49
+
50
+ ```ruby
51
+ module SlackMathbot
52
+ module Commands
53
+ class Calculate < SlackRubyBot::Commands::Base
54
+ def self.call(data, command, arguments)
55
+ send_message data.channel, '4'
56
+ end
57
+ end
58
+ end
59
+ end
60
+ ```
61
+
62
+ #### Require Everything
63
+
64
+ Create a `slack-mathbot.rb` at the root and require the above files.
65
+
66
+ ```ruby
67
+ require 'slack-ruby-bot'
68
+ require 'slack-mathbot/commands/calculate'
69
+ require 'slack-mathbot/app'
70
+ ```
71
+
72
+ #### Web Server
73
+
74
+ We will need to keep the bot alive on Heroku, so create `web.rb`.
75
+
76
+ ```ruby
77
+ require 'sinatra/base'
78
+
79
+ module SlackMathbot
80
+ class Web < Sinatra::Base
81
+ get '/' do
82
+ 'Math is good for you.'
83
+ end
84
+ end
85
+ end
86
+ ```
87
+
88
+ #### Config.ru
89
+
90
+ Tie all the pieces togehter in `config.ru` which creates a thread for the bot and runs the web server on the main thread.
91
+
92
+ ```ruby
93
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
94
+
95
+ require 'slack-mathbot'
96
+ require 'web'
97
+
98
+ Thread.new do
99
+ begin
100
+ SlackMathbot::App.instance.run
101
+ rescue Exception => e
102
+ STDERR.puts "ERROR: #{e}"
103
+ STDERR.puts e.backtrace
104
+ raise e
105
+ end
106
+ end
107
+
108
+ run SlackMathbot::Web
109
+ ```
110
+
111
+ ### Create a Bot User
112
+
113
+ In Slack administration create a new Bot Integration under [services/new/bot](http://slack.com/services/new/bot).
114
+
115
+ ![](screenshots/register-bot.png)
116
+
117
+ On the next screen, note the API token.
118
+
119
+ #### .env
120
+
121
+ Create a `.env` file with the API token from above and make sure to add it to `.gitignore`.
122
+
123
+ ```
124
+ SLACK_API_TOKEN=...
125
+ ```
126
+
127
+ ### Run the Bot
128
+
129
+ Run `foreman start`. Your bot should be running.
130
+
131
+ ```
132
+ 14:32:32 web.1 | Puma starting in single mode...
133
+ 14:32:32 web.1 | * Version 2.11.3 (ruby 2.1.6-p336), codename: Intrepid Squirrel
134
+ 14:32:32 web.1 | * Min threads: 0, max threads: 16
135
+ 14:32:32 web.1 | * Environment: development
136
+ 14:32:35 web.1 | * Listening on tcp://0.0.0.0:5000
137
+ 14:32:35 web.1 | Use Ctrl-C to stop
138
+ 14:32:36 web.1 | I, [2015-07-10T14:32:36.216663 #98948] INFO -- : Welcome 'mathbot' to the 'xyz' team at https://xyz.slack.com/.
139
+ 14:32:36 web.1 | I, [2015-07-10T14:32:36.766955 #98948] INFO -- : Successfully connected to https://xyz.slack.com/.
140
+ ```
141
+
142
+ ### Test
143
+
144
+ Invite the bot to a channel via `/invite [bot name]` and send it a `calculate` command with `[bot name] calculate 2+2`. It will respond with `4` from the code above.
145
+
146
+ ### Deploy
147
+
148
+ See [DEPLOYMENT](DEPLOYMENT.md) for how to deploy your bot to production.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- slack-ruby-bot (0.1.0)
4
+ slack-ruby-bot (0.2.0)
5
5
  activesupport
6
6
  giphy (~> 2.0.2)
7
7
  hashie
@@ -79,5 +79,15 @@ module SlackRubyBot
79
79
  end
80
80
  logger.info "Welcome '#{SlackRubyBot.config.user}' to the '#{SlackRubyBot.config.team}' team at #{SlackRubyBot.config.url}."
81
81
  end
82
+
83
+ def reset!
84
+ SlackRubyBot.configure do |config|
85
+ config.url = nil
86
+ config.team = nil
87
+ config.user = nil
88
+ config.team_id = nil
89
+ config.user_id = nil
90
+ end
91
+ end
82
92
  end
83
93
  end
@@ -1,6 +1,9 @@
1
1
  module SlackRubyBot
2
2
  module Commands
3
3
  class Default < Base
4
+ command 'default'
5
+ command 'about'
6
+
4
7
  def self.call(data, _command, _arguments)
5
8
  send_message_with_gif data.channel, SlackRubyBot::ABOUT, 'selfie'
6
9
  end
@@ -1,8 +1,15 @@
1
1
  module SlackRubyBot
2
2
  module Commands
3
3
  class Base
4
+ class_attribute :operators
5
+ class_attribute :commands
6
+
4
7
  def self.send_message(channel, text)
5
- Slack.chat_postMessage(channel: channel, text: text)
8
+ if text && text.length > 0
9
+ Slack.chat_postMessage(channel: channel, text: text)
10
+ else
11
+ send_message_with_gif channel, 'Nothing to see here.', 'nothing'
12
+ end
6
13
  end
7
14
 
8
15
  def self.send_message_with_gif(channel, text, keywords)
@@ -22,6 +29,28 @@ module SlackRubyBot
22
29
  Logger.new(STDOUT)
23
30
  end
24
31
  end
32
+
33
+ def self.responds_to_command?(command)
34
+ commands ? commands.include?(command) : command == default_command_name
35
+ end
36
+
37
+ def self.default_command_name
38
+ name && name.split(':').last.downcase
39
+ end
40
+
41
+ def self.responds_to_operator?(operator)
42
+ operators && operators.include?(operator)
43
+ end
44
+
45
+ def self.operator(value)
46
+ self.operators ||= []
47
+ self.operators << value.to_s
48
+ end
49
+
50
+ def self.command(value)
51
+ self.commands ||= []
52
+ self.commands << value.to_s
53
+ end
25
54
  end
26
55
  end
27
56
  end
@@ -5,36 +5,118 @@ module SlackRubyBot
5
5
 
6
6
  def message(data)
7
7
  data = Hashie::Mash.new(data)
8
- bot_name, command, arguments = parse_command(data.text)
9
- return unless bot_name == SlackRubyBot.config.user
10
- klass = command_to_class(command || 'Default')
11
- klass.call data, command, arguments
8
+ klass, command, arguments = text_to_class(data.text)
9
+ return unless klass
10
+ klass.call(data, command, arguments)
12
11
  end
13
12
 
14
13
  private
15
14
 
15
+ #
16
+ # Lookup a class that can execute a command or an operator.
17
+ #
18
+ # @param [String] text Free-formed text from Slack.
19
+ #
20
+ # @return [SlackRubyBot::Commands::Base] A child class of SlackRubyBot::Commands::Base.
21
+ #
22
+ def text_to_class(text)
23
+ return unless text
24
+ command, arguments = parse_command(text)
25
+ if command
26
+ [command_to_class(command) || SlackRubyBot::Commands::Unknown, command, arguments]
27
+ else
28
+ command, arguments = parse_operator(text)
29
+ [operator_to_class(command), command, arguments]
30
+ end
31
+ end
32
+
33
+ #
34
+ # Split text into a command and its arguments.
35
+ #
36
+ # @param [String] text Free-formed text from Slack, eg. `bot do something`.
37
+ #
38
+ # @return [Array] An array of command and arguments or nil.
39
+ #
16
40
  def parse_command(text)
17
41
  return unless text
18
- text = '= ' + text[1..text.length] if text[0] == '='
19
42
  parts = text.split.reject(&:blank?)
20
- if parts && parts[0] == '='
21
- parts[0] = SlackRubyBot.config.user
22
- parts.insert 1, 'calculate'
43
+ return unless parts && parts.any?
44
+ # command is [bot] <command> (argument1, ...)
45
+ bot_or_operator = parts.first.downcase
46
+ return unless SlackRubyBot.config.user == bot_or_operator
47
+ command = parts[1].try(:downcase) || 'default'
48
+ arguments = parts[2..parts.length]
49
+ [command, arguments]
50
+ end
51
+
52
+ #
53
+ # Split text into an operator and its arguments.
54
+ #
55
+ # @param [String] text Free-formed text from Slack, eg. =2+2.
56
+ #
57
+ # @return [Array] An array and arguments or nil.
58
+ #
59
+ def parse_operator(text)
60
+ return unless text && text.length > 0
61
+ [text[0], text[1..text.length].split.reject(&:blank?)]
62
+ end
63
+
64
+ #
65
+ # All commands.
66
+ #
67
+ # @return [Array] Descendants of SlackRubyBot::Commands::Base.
68
+ #
69
+ def command_classes
70
+ SlackRubyBot::Commands::Base.descendants
71
+ end
72
+
73
+ #
74
+ # All non-built-in, ie. custom commands.
75
+ #
76
+ # @return [Array] Non-built-in descendants of SlackRubyBot::Commands::Base.
77
+ #
78
+ def child_command_classes
79
+ command_classes.reject do |k|
80
+ k.name && k.name.starts_with?('SlackRubyBot::Commands::')
23
81
  end
24
- [parts.first.downcase, parts[1].try(:downcase), parts[2..parts.length]] if parts && parts.any?
25
82
  end
26
83
 
27
- def command_classes(include_slack_ruby_bot = false)
28
- klasses = SlackRubyBot::Commands::Base.descendants
29
- klasses.reject! { |k| k.name.starts_with? 'SlackRubyBot::Commands::' } unless include_slack_ruby_bot
30
- klasses
84
+ #
85
+ # All built-in commands.
86
+ #
87
+ # @return [Array] Built-in descendants of SlackRubyBot::Commands::Base.
88
+ #
89
+ def built_in_command_classes
90
+ command_classes.select do |k|
91
+ k.name && k.name.starts_with?('SlackRubyBot::Commands::')
92
+ end
31
93
  end
32
94
 
95
+ #
96
+ # Converts a command to a class.
97
+ #
98
+ # @param [String] command Command tet.
99
+ #
100
+ # @return [SlackRubyBot::Commands::Base] A command implementation.
101
+ #
33
102
  def command_to_class(command)
34
103
  # prioritize implementations to built-in classes
35
- klass = command_classes.detect { |d| d.name.ends_with? "::#{command.titleize}" }
36
- klass ||= command_classes(true).detect { |d| d.name.ends_with? "::#{command.titleize}" }
37
- klass || SlackRubyBot::Commands::Unknown
104
+ klass = child_command_classes.detect { |d| d.responds_to_command?(command) }
105
+ klass ||= built_in_command_classes.detect { |d| d.responds_to_command?(command) }
106
+ klass
107
+ end
108
+
109
+ #
110
+ # Converts an operator to a class.
111
+ #
112
+ # @param [String] operator Operator text.
113
+ #
114
+ # @return [<type>] An operator implementation.
115
+ #
116
+ def operator_to_class(operator)
117
+ command_classes.detect do |k|
118
+ k.responds_to_operator?(operator)
119
+ end
38
120
  end
39
121
  end
40
122
  end
@@ -52,52 +52,6 @@ http_interactions:
52
52
  - keep-alive
53
53
  body:
54
54
  encoding: UTF-8
55
- string: '{"ok":true,"url":"https:\/\/rubybot.slack.com\/","team":"team","user":"user","team_id":"TDEADBEEF","user_id":"UBAADFOOD"}'
55
+ string: '{"ok":true,"url":"https:\/\/rubybot.slack.com\/","team":"team_name","user":"user_name","team_id":"TDEADBEEF","user_id":"UBAADFOOD"}'
56
56
  http_version:
57
57
  recorded_at: Tue, 28 Apr 2015 12:55:22 GMT
58
- - request:
59
- method: post
60
- uri: https://slack.com/api/rtm.start
61
- body:
62
- encoding: UTF-8
63
- string: token=token
64
- headers:
65
- Accept:
66
- - application/json; charset=utf-8
67
- User-Agent:
68
- - Slack Ruby Gem 1.1.1
69
- Content-Type:
70
- - application/x-www-form-urlencoded
71
- Accept-Encoding:
72
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
73
- response:
74
- status:
75
- code: 200
76
- message: OK
77
- headers:
78
- Access-Control-Allow-Origin:
79
- - '*'
80
- Content-Type:
81
- - application/json; charset=utf-8
82
- Date:
83
- - Tue, 28 Apr 2015 21:41:33 GMT
84
- Server:
85
- - Apache
86
- Strict-Transport-Security:
87
- - max-age=31536000; includeSubDomains; preload
88
- Vary:
89
- - Accept-Encoding
90
- X-Content-Type-Options:
91
- - nosniff
92
- X-Xss-Protection:
93
- - '0'
94
- Content-Length:
95
- - '55'
96
- Connection:
97
- - keep-alive
98
- body:
99
- encoding: UTF-8
100
- string: '{"ok":false,"error":"invalid_auth"}'
101
- http_version:
102
- recorded_at: Tue, 28 Apr 2015 21:41:33 GMT
103
- recorded_with: VCR 2.9.3
@@ -15,10 +15,13 @@ shared_examples 'a slack ruby bot' do
15
15
  before do
16
16
  subject.send(:auth!)
17
17
  end
18
+ after do
19
+ subject.send(:reset!)
20
+ end
18
21
  it 'succeeds auth' do
19
22
  expect(subject.config.url).to eq 'https://rubybot.slack.com/'
20
- expect(subject.config.team).to eq 'team'
21
- expect(subject.config.user).to eq 'user'
23
+ expect(subject.config.team).to eq 'team_name'
24
+ expect(subject.config.user).to eq 'user_name'
22
25
  expect(subject.config.team_id).to eq 'TDEADBEEF'
23
26
  expect(subject.config.user_id).to eq 'UBAADFOOD'
24
27
  end
@@ -4,7 +4,6 @@ RSpec::Matchers.define :respond_with_error do |expected|
4
4
  match do |actual|
5
5
  channel, user, message = parse(actual)
6
6
  app = SlackRubyBot::App.new
7
- SlackRubyBot.config.user = 'rubybot'
8
7
  allow(Giphy).to receive(:random)
9
8
  begin
10
9
  expect do
@@ -3,7 +3,6 @@ require 'rspec/expectations'
3
3
  RSpec::Matchers.define :respond_with_slack_message do |expected|
4
4
  match do |actual|
5
5
  channel, user, message = parse(actual)
6
- SlackRubyBot.config.user ||= 'rubybot'
7
6
  allow(Giphy).to receive(:random)
8
7
  expect(SlackRubyBot::Commands::Base).to receive(:send_message).with(channel, expected)
9
8
  app.send(:message, text: message, channel: channel, user: user)
@@ -1,4 +1,8 @@
1
- SlackRubyBot.configure do |config|
2
- config.token = 'testtoken'
3
- config.user = 'rubybot'
1
+ RSpec.configure do |config|
2
+ config.before :each do
3
+ SlackRubyBot.configure do |c|
4
+ c.token = 'testtoken'
5
+ c.user = 'rubybot'
6
+ end
7
+ end
4
8
  end
@@ -1,3 +1,3 @@
1
1
  module SlackRubyBot
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
Binary file
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
18
18
  s.add_dependency 'slack-api', '~> 1.1.6'
19
19
  s.add_dependency 'activesupport'
20
20
  s.add_dependency 'giphy', '~> 2.0.2'
21
+ s.add_dependency 'websocket-driver', '~> 0.5.4'
21
22
  s.add_development_dependency 'rake'
22
23
  s.add_development_dependency 'rspec'
23
24
  s.add_development_dependency 'rack-test'
@@ -4,13 +4,10 @@ describe SlackRubyBot::Commands::Default do
4
4
  def app
5
5
  SlackRubyBot::App.new
6
6
  end
7
- before do
8
- app.config.user = 'rubybot'
7
+ it 'lowercase' do
8
+ expect(message: SlackRubyBot.config.user).to respond_with_slack_message(SlackRubyBot::ABOUT)
9
9
  end
10
- it 'rubybot' do
11
- expect(message: 'rubybot').to respond_with_slack_message(SlackRubyBot::ABOUT)
12
- end
13
- it 'Rubybot' do
14
- expect(message: 'Rubybot').to respond_with_slack_message(SlackRubyBot::ABOUT)
10
+ it 'upcase' do
11
+ expect(message: SlackRubyBot.config.user.upcase).to respond_with_slack_message(SlackRubyBot::ABOUT)
15
12
  end
16
13
  end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe SlackRubyBot::Commands do
4
+ let! :command do
5
+ Class.new(SlackRubyBot::Commands::Base) do
6
+ command 'sayhi'
7
+ command 'saybye'
8
+
9
+ def self.call(data, command, arguments)
10
+ send_message data.channel, "#{command}: #{arguments}"
11
+ end
12
+ end
13
+ end
14
+ def app
15
+ SlackRubyBot::App.new
16
+ end
17
+ it 'supports multiple commands' do
18
+ expect(message: "#{SlackRubyBot.config.user} sayhi arg1 arg2").to respond_with_slack_message('sayhi: ["arg1", "arg2"]')
19
+ expect(message: "#{SlackRubyBot.config.user} saybye arg1 arg2").to respond_with_slack_message('saybye: ["arg1", "arg2"]')
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe SlackRubyBot::Commands do
4
+ let! :command do
5
+ Class.new(SlackRubyBot::Commands::Base) do
6
+ command 'test'
7
+
8
+ def self.call(data, _command, _arguments)
9
+ send_message data.channel, nil
10
+ end
11
+ end
12
+ end
13
+ def app
14
+ SlackRubyBot::App.new
15
+ end
16
+ it 'sends default text' do
17
+ allow(Giphy).to receive(:random)
18
+ expect(SlackRubyBot::Commands::Base).to receive(:send_message_with_gif).with('channel', 'Nothing to see here.', 'nothing')
19
+ app.send(:message, text: "#{SlackRubyBot.config.user} test", channel: 'channel', user: 'user')
20
+ end
21
+ end
@@ -4,10 +4,7 @@ describe SlackRubyBot::Commands::Help do
4
4
  def app
5
5
  SlackRubyBot::App.new
6
6
  end
7
- before do
8
- app.config.user = 'rubybot'
9
- end
10
7
  it 'help' do
11
- expect(message: 'rubybot help').to respond_with_slack_message('See https://github.com/dblock/slack-ruby-bot, please.')
8
+ expect(message: "#{SlackRubyBot.config.user} help").to respond_with_slack_message('See https://github.com/dblock/slack-ruby-bot, please.')
12
9
  end
13
10
  end
@@ -4,10 +4,7 @@ describe SlackRubyBot::Commands::Hi do
4
4
  def app
5
5
  SlackRubyBot::App.new
6
6
  end
7
- before do
8
- app.config.user = 'rubybot'
9
- end
10
7
  it 'says hi' do
11
- expect(message: 'rubybot hi').to respond_with_slack_message('Hi <@user>!')
8
+ expect(message: "#{SlackRubyBot.config.user} hi").to respond_with_slack_message('Hi <@user>!')
12
9
  end
13
10
  end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe SlackRubyBot::Commands do
4
+ let! :command do
5
+ Class.new(SlackRubyBot::Commands::Base) do
6
+ operator '='
7
+ operator '-'
8
+
9
+ def self.call(data, command, arguments)
10
+ send_message data.channel, "#{command}: #{arguments}"
11
+ end
12
+ end
13
+ end
14
+ def app
15
+ SlackRubyBot::App.new
16
+ end
17
+ it 'supports operators' do
18
+ expect(message: '=2+2').to respond_with_slack_message('=: ["2+2"]')
19
+ end
20
+ end
@@ -1,14 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe SlackRubyBot::Commands::Unknown, vcr: { cassette_name: 'user_info' } do
3
+ describe SlackRubyBot::Commands::Unknown do
4
4
  def app
5
5
  SlackRubyBot::App.new
6
6
  end
7
- before do
8
- app.config.user = 'rubybot'
9
- end
10
7
  it 'invalid command' do
11
- expect(message: 'rubybot foobar').to respond_with_slack_message("Sorry <@user>, I don't understand that command!")
8
+ expect(message: "#{SlackRubyBot.config.user} foobar").to respond_with_slack_message("Sorry <@user>, I don't understand that command!")
12
9
  end
13
10
  it 'does not respond to sad face' do
14
11
  expect(SlackRubyBot::Commands::Base).to_not receive(:send_message)
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe RSpec do
4
+ let! :command do
5
+ Class.new(SlackRubyBot::Commands::Base) do
6
+ command 'raise'
7
+
8
+ def self.call(_data, command, _arguments)
9
+ fail ArgumentError, command
10
+ end
11
+ end
12
+ end
13
+ def app
14
+ SlackRubyBot::App.new
15
+ end
16
+ it 'respond_with_error' do
17
+ expect(message: "#{SlackRubyBot.config.user} raise").to respond_with_error('raise')
18
+ end
19
+ end
metadata CHANGED
@@ -1,139 +1,153 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slack-ruby-bot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Doubrovkine
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-02 00:00:00.000000000 Z
11
+ date: 2015-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashie
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: slack-api
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ~>
32
32
  - !ruby/object:Gem::Version
33
33
  version: 1.1.6
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ~>
39
39
  - !ruby/object:Gem::Version
40
40
  version: 1.1.6
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: activesupport
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - '>='
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: giphy
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ~>
60
60
  - !ruby/object:Gem::Version
61
61
  version: 2.0.2
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ~>
67
67
  - !ruby/object:Gem::Version
68
68
  version: 2.0.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: websocket-driver
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: 0.5.4
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: 0.5.4
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rake
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - ">="
87
+ - - '>='
74
88
  - !ruby/object:Gem::Version
75
89
  version: '0'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - ">="
94
+ - - '>='
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: rspec
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - ">="
101
+ - - '>='
88
102
  - !ruby/object:Gem::Version
89
103
  version: '0'
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - ">="
108
+ - - '>='
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: rack-test
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - ">="
115
+ - - '>='
102
116
  - !ruby/object:Gem::Version
103
117
  version: '0'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
- - - ">="
122
+ - - '>='
109
123
  - !ruby/object:Gem::Version
110
124
  version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: vcr
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
- - - ">="
129
+ - - '>='
116
130
  - !ruby/object:Gem::Version
117
131
  version: '0'
118
132
  type: :development
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
- - - ">="
136
+ - - '>='
123
137
  - !ruby/object:Gem::Version
124
138
  version: '0'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: webmock
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
- - - ">="
143
+ - - '>='
130
144
  - !ruby/object:Gem::Version
131
145
  version: '0'
132
146
  type: :development
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
- - - ">="
150
+ - - '>='
137
151
  - !ruby/object:Gem::Version
138
152
  version: '0'
139
153
  - !ruby/object:Gem::Dependency
@@ -156,19 +170,19 @@ executables: []
156
170
  extensions: []
157
171
  extra_rdoc_files: []
158
172
  files:
159
- - ".gitignore"
160
- - ".rspec"
161
- - ".rubocop.yml"
162
- - ".rubocop_todo.yml"
163
- - ".travis.yml"
173
+ - .gitignore
174
+ - .rspec
175
+ - .rubocop.yml
176
+ - .rubocop_todo.yml
177
+ - .travis.yml
164
178
  - CHANGELOG.md
165
179
  - CONTRIBUTING.md
166
180
  - DEPLOYMENT.md
167
181
  - Gemfile
168
- - Gemfile.lock
169
182
  - LICENSE.md
170
183
  - README.md
171
184
  - Rakefile
185
+ - TUTORIAL.md
172
186
  - examples/minimal/Gemfile
173
187
  - examples/minimal/Gemfile.lock
174
188
  - examples/minimal/pongbot.rb
@@ -187,13 +201,11 @@ files:
187
201
  - lib/slack-ruby-bot/commands/hi.rb
188
202
  - lib/slack-ruby-bot/commands/unknown.rb
189
203
  - lib/slack-ruby-bot/config.rb
190
- - lib/slack-ruby-bot/fixtures/slack/auth_test.yml
191
204
  - lib/slack-ruby-bot/hooks.rb
192
205
  - lib/slack-ruby-bot/hooks/base.rb
193
206
  - lib/slack-ruby-bot/hooks/hello.rb
194
207
  - lib/slack-ruby-bot/hooks/message.rb
195
208
  - lib/slack-ruby-bot/rspec.rb
196
- - lib/slack-ruby-bot/rspec/fixtures/slack/auth_test.yml
197
209
  - lib/slack-ruby-bot/rspec/support/fixtures/slack/auth_test.yml
198
210
  - lib/slack-ruby-bot/rspec/support/slack-ruby-bot/it_behaves_like_a_slack_bot.rb
199
211
  - lib/slack-ruby-bot/rspec/support/slack-ruby-bot/respond_with_error.rb
@@ -203,13 +215,18 @@ files:
203
215
  - lib/slack-ruby-bot/rspec/support/vcr.rb
204
216
  - lib/slack-ruby-bot/version.rb
205
217
  - lib/slack_ruby_bot.rb
218
+ - screenshots/demo.gif
206
219
  - screenshots/register-bot.png
207
220
  - slack-ruby-bot.gemspec
208
221
  - spec/slack-ruby-bot/app_spec.rb
209
222
  - spec/slack-ruby-bot/commands/about_spec.rb
223
+ - spec/slack-ruby-bot/commands/commands_spec.rb
224
+ - spec/slack-ruby-bot/commands/empty_text_spec.rb
210
225
  - spec/slack-ruby-bot/commands/help_spec.rb
211
226
  - spec/slack-ruby-bot/commands/hi_spec.rb
227
+ - spec/slack-ruby-bot/commands/operators_spec.rb
212
228
  - spec/slack-ruby-bot/commands/unknown_spec.rb
229
+ - spec/slack-ruby-bot/rspec/respond_with_error_spec.rb
213
230
  - spec/slack-ruby-bot/version_spec.rb
214
231
  - spec/spec_helper.rb
215
232
  homepage: http://github.com/dblock/slack-ruby-bot
@@ -222,25 +239,29 @@ require_paths:
222
239
  - lib
223
240
  required_ruby_version: !ruby/object:Gem::Requirement
224
241
  requirements:
225
- - - ">="
242
+ - - '>='
226
243
  - !ruby/object:Gem::Version
227
244
  version: '0'
228
245
  required_rubygems_version: !ruby/object:Gem::Requirement
229
246
  requirements:
230
- - - ">="
247
+ - - '>='
231
248
  - !ruby/object:Gem::Version
232
249
  version: 1.3.6
233
250
  requirements: []
234
251
  rubyforge_project:
235
- rubygems_version: 2.2.2
252
+ rubygems_version: 2.4.5
236
253
  signing_key:
237
254
  specification_version: 4
238
255
  summary: Generic bot framework written in Ruby.
239
256
  test_files:
240
257
  - spec/slack-ruby-bot/app_spec.rb
241
258
  - spec/slack-ruby-bot/commands/about_spec.rb
259
+ - spec/slack-ruby-bot/commands/commands_spec.rb
260
+ - spec/slack-ruby-bot/commands/empty_text_spec.rb
242
261
  - spec/slack-ruby-bot/commands/help_spec.rb
243
262
  - spec/slack-ruby-bot/commands/hi_spec.rb
263
+ - spec/slack-ruby-bot/commands/operators_spec.rb
244
264
  - spec/slack-ruby-bot/commands/unknown_spec.rb
265
+ - spec/slack-ruby-bot/rspec/respond_with_error_spec.rb
245
266
  - spec/slack-ruby-bot/version_spec.rb
246
267
  - spec/spec_helper.rb
data/Gemfile.lock DELETED
@@ -1,107 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- slack-ruby-bot (0.1.0)
5
- activesupport
6
- giphy (~> 2.0.2)
7
- hashie
8
- slack-api (~> 1.1.6)
9
-
10
- GEM
11
- remote: http://rubygems.org/
12
- specs:
13
- activesupport (4.2.3)
14
- i18n (~> 0.7)
15
- json (~> 1.7, >= 1.7.7)
16
- minitest (~> 5.1)
17
- thread_safe (~> 0.3, >= 0.3.4)
18
- tzinfo (~> 1.1)
19
- addressable (2.3.8)
20
- ast (2.0.0)
21
- astrolabe (1.3.0)
22
- parser (>= 2.2.0.pre.3, < 3.0)
23
- crack (0.4.2)
24
- safe_yaml (~> 1.0.0)
25
- diff-lcs (1.2.5)
26
- eventmachine (1.0.7)
27
- faraday (0.9.1)
28
- multipart-post (>= 1.2, < 3)
29
- faraday_middleware (0.9.1)
30
- faraday (>= 0.7.4, < 0.10)
31
- faraday_middleware-parse_oj (0.3.0)
32
- faraday (~> 0.9.0)
33
- faraday_middleware (~> 0.9.1)
34
- oj (~> 2.0)
35
- faye-websocket (0.9.2)
36
- eventmachine (>= 0.12.0)
37
- websocket-driver (>= 0.5.1)
38
- giphy (2.0.2)
39
- faraday (~> 0.9)
40
- faraday_middleware (~> 0.9)
41
- faraday_middleware-parse_oj (~> 0.3)
42
- launchy (~> 2.4)
43
- hashie (3.4.2)
44
- i18n (0.7.0)
45
- json (1.8.3)
46
- launchy (2.4.3)
47
- addressable (~> 2.3)
48
- minitest (5.7.0)
49
- multi_json (1.11.1)
50
- multipart-post (2.0.0)
51
- oj (2.12.9)
52
- parser (2.3.0.pre.2)
53
- ast (>= 1.1, < 3.0)
54
- powerpack (0.1.1)
55
- rack (1.6.4)
56
- rack-test (0.6.3)
57
- rack (>= 1.0)
58
- rainbow (2.0.0)
59
- rake (10.4.2)
60
- rspec (3.3.0)
61
- rspec-core (~> 3.3.0)
62
- rspec-expectations (~> 3.3.0)
63
- rspec-mocks (~> 3.3.0)
64
- rspec-core (3.3.1)
65
- rspec-support (~> 3.3.0)
66
- rspec-expectations (3.3.0)
67
- diff-lcs (>= 1.2.0, < 2.0)
68
- rspec-support (~> 3.3.0)
69
- rspec-mocks (3.3.1)
70
- diff-lcs (>= 1.2.0, < 2.0)
71
- rspec-support (~> 3.3.0)
72
- rspec-support (3.3.0)
73
- rubocop (0.32.1)
74
- astrolabe (~> 1.3)
75
- parser (>= 2.2.2.5, < 3.0)
76
- powerpack (~> 0.1)
77
- rainbow (>= 1.99.1, < 3.0)
78
- ruby-progressbar (~> 1.4)
79
- ruby-progressbar (1.7.5)
80
- safe_yaml (1.0.4)
81
- slack-api (1.1.6)
82
- faraday (>= 0.7, < 0.10)
83
- faraday_middleware (~> 0.8)
84
- faye-websocket (~> 0.9.2)
85
- multi_json (~> 1.0, >= 1.0.3)
86
- thread_safe (0.3.5)
87
- tzinfo (1.2.2)
88
- thread_safe (~> 0.1)
89
- vcr (2.9.3)
90
- webmock (1.21.0)
91
- addressable (>= 2.3.6)
92
- crack (>= 0.3.2)
93
- websocket-driver (0.5.4)
94
- websocket-extensions (>= 0.1.0)
95
- websocket-extensions (0.1.2)
96
-
97
- PLATFORMS
98
- ruby
99
-
100
- DEPENDENCIES
101
- rack-test
102
- rake
103
- rspec
104
- rubocop (= 0.32.1)
105
- slack-ruby-bot!
106
- vcr
107
- webmock
@@ -1,48 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: post
5
- uri: https://slack.com/api/auth.test
6
- body:
7
- encoding: UTF-8
8
- string: token=test
9
- headers:
10
- Accept:
11
- - application/json; charset=utf-8
12
- User-Agent:
13
- - Slack Ruby Gem 1.1.6
14
- Content-Type:
15
- - application/x-www-form-urlencoded
16
- Accept-Encoding:
17
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
18
- response:
19
- status:
20
- code: 200
21
- message: OK
22
- headers:
23
- Access-Control-Allow-Origin:
24
- - "*"
25
- Content-Type:
26
- - application/json; charset=utf-8
27
- Date:
28
- - Thu, 02 Jul 2015 17:55:20 GMT
29
- Server:
30
- - Apache
31
- Strict-Transport-Security:
32
- - max-age=31536000; includeSubDomains; preload
33
- Vary:
34
- - Accept-Encoding
35
- X-Content-Type-Options:
36
- - nosniff
37
- X-Xss-Protection:
38
- - '0'
39
- Content-Length:
40
- - '55'
41
- Connection:
42
- - keep-alive
43
- body:
44
- encoding: UTF-8
45
- string: '{"ok":false,"error":"invalid_auth"}'
46
- http_version:
47
- recorded_at: Thu, 02 Jul 2015 17:55:48 GMT
48
- recorded_with: VCR 2.9.3
@@ -1,48 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: post
5
- uri: https://slack.com/api/auth.test
6
- body:
7
- encoding: UTF-8
8
- string: token=test
9
- headers:
10
- Accept:
11
- - application/json; charset=utf-8
12
- User-Agent:
13
- - Slack Ruby Gem 1.1.6
14
- Content-Type:
15
- - application/x-www-form-urlencoded
16
- Accept-Encoding:
17
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
18
- response:
19
- status:
20
- code: 200
21
- message: OK
22
- headers:
23
- Access-Control-Allow-Origin:
24
- - "*"
25
- Content-Type:
26
- - application/json; charset=utf-8
27
- Date:
28
- - Thu, 02 Jul 2015 17:48:15 GMT
29
- Server:
30
- - Apache
31
- Strict-Transport-Security:
32
- - max-age=31536000; includeSubDomains; preload
33
- Vary:
34
- - Accept-Encoding
35
- X-Content-Type-Options:
36
- - nosniff
37
- X-Xss-Protection:
38
- - '0'
39
- Content-Length:
40
- - '55'
41
- Connection:
42
- - keep-alive
43
- body:
44
- encoding: UTF-8
45
- string: '{"ok":false,"error":"invalid_auth"}'
46
- http_version:
47
- recorded_at: Thu, 02 Jul 2015 17:48:42 GMT
48
- recorded_with: VCR 2.9.3