slack-poster 1.0.1 → 2.0.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: f0a050b12a6ce8ae2c53036b2702123eca962fa4
4
- data.tar.gz: a896b337ec14ca27be143f8c730bc3c4309d48a5
3
+ metadata.gz: 6c7479325afff0e574ff8589b13fe01fd3229975
4
+ data.tar.gz: 442f9ee35a4f8e9e35c58836ae4162145f9efc8e
5
5
  SHA512:
6
- metadata.gz: eac18b2c2d966ab3887c72d64456a570c3275d9176d3c4c4b70fa6769dba148b57845363d93f748a9292337032442e9f20c86699e1e9cc652ea625961a87d5a7
7
- data.tar.gz: 93348ae808183956d5389e943b0f12990108363de88ac33f611dfbb40f28a631ea645895ffddc349c6cb945e893976b7162051540ae38b7f051a4c3755adf3e0
6
+ metadata.gz: fe8ecdbecc1287a776c3288633550e646f8560ea0be0823664f041ba35f9e49e7d389babf2fb4d47193fc3cb0263e7dc7c4f7b2faa31c1fe41cf0470241b0fd8
7
+ data.tar.gz: 2941acd2b4fd0dbdf07479fd449f562e4f702ef21445c681279c8463211a7c8db5cb405be2c5fff606821ac9b32081dc7416a323200734850c0a8cec195b3bec
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --require spec_helper
3
+ --format documentation
data/.rubocop.yml ADDED
@@ -0,0 +1,5 @@
1
+ Style/Documentation:
2
+ Enabled: false
3
+
4
+ Metrics/LineLength:
5
+ Max: 100
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.2.2
1
+ 2.2.3
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.6
6
+ - 2.2.2
7
+ before_install: gem install bundler -v 1.10.6
data/README.md CHANGED
@@ -1,9 +1,8 @@
1
1
  [![Dependency Status](https://gemnasium.com/rikas/slack-poster.svg)](https://gemnasium.com/rikas/slack-poster)
2
+ [![Build Status](https://travis-ci.org/rikas/slack-poster.svg?branch=master)](https://travis-ci.org/rikas/slack-poster)
2
3
 
3
4
  # Slack Poster
4
5
 
5
- [Slack](https://slack.com/) is a mashup of chatrooms and collaborative sharing tools that are meant to do away with redundant conversations in multiple places.
6
-
7
6
  slack-poster is a simple gem to make your integration with Slack easier. It supports only incoming communications (from you to Slack).
8
7
 
9
8
  ## Installation
@@ -26,21 +25,29 @@ Or install it yourself as:
26
25
  $ gem install slack-poster
27
26
  ```
28
27
 
29
- ## Usage
28
+ ## Slack setup
30
29
 
31
- First, you need to create an Incoming Webhook integration at https://team-name.slack.com/services/new/incoming-webhook and take note of the generated token.
30
+ This gem will use a Incoming WebHook integration on Slack. First, you need to create a new Incoming Webhook integration at `https://team-name.slack.com/services/new/incoming-webhook` (where "team-name" should be your own team name).
32
31
 
33
- Next, create a new poster and send the message:
32
+ ![](http://cl.ly/image/2D2Y0x2B2847/slack_setup1.png)
34
33
 
35
- ```ruby
36
- TEAM = 'team-name'
37
- TOKEN = 'hd7heoo2oijd0'
34
+ Hit "Add Incoming WebHooks Integration" and go to the next screen. Here you can add a name to your
35
+ integration, customize the username that will post and the icon.
38
36
 
39
- poster = Slack::Poster.new(TEAM, TOKEN)
40
- poster.send_message('Hello, world!')
37
+ ![](http://cl.ly/image/2s3r343K0w3T/slack_setup2.png)
38
+
39
+ Copy the Webhook URL, because you'll need it. Click "Save Settings" and you're done.
40
+
41
+ ## Usage
42
+
43
+ First you have to initialize your poster and then you can use `send_message` to send your message.
44
+
45
+ ```ruby
46
+ poster = Slack::Poster.new(YOUR_WEBHOOK_URL)
47
+ poster.send_message('Hello world!')
41
48
  ```
42
49
 
43
- You can use an options array if you don't want to use the settings configured directly on Slack:
50
+ You can use an options array if you don't want to use the default settings:
44
51
 
45
52
  ```ruby
46
53
  options = {
@@ -51,14 +58,109 @@ options = {
51
58
  }
52
59
  ```
53
60
 
54
- And then use it as a third parameter. Note that every option is optional (no pun intended!).
61
+ And then use it as a second parameter. Note that every option is optional (no pun intended!).
62
+
63
+ ```ruby
64
+ poster = Slack::Poster.new(YOUR_WEBHOOK_URL, options)
65
+ poster.send_message('Hello with options')
66
+ # posts message 'Hello with options' to #random with the username 'Tester'
67
+ ```
68
+
69
+ Or you can change the options whenever you want
70
+
71
+ ```ruby
72
+ poster = Slack::Poster.new(YOUR_WEBHOOK_URL)
73
+ poster.username = 'TestUser'
74
+ poster.icon_emoji = ':ghost:'
75
+ poster.send_message('Hello World') # => "ok"
76
+ # posts message 'Hello World' to #random with the username 'TestUser' and ghost emoji as avatar
77
+ ```
78
+
79
+ You can also send a `Slack::Message` object instead of `String`:
80
+
81
+ ```ruby
82
+ message = Slack::Message.new('hello slack')
83
+ poster.send_message(message)
84
+ ```
85
+
86
+ ### Message attachments
87
+
88
+ Slack Poster supports message attachments. To do so you have to create `Slack::Attachment` objects
89
+ and then attach them to a `Slack::Message` object. Read the [official documentation](https://api.slack.com/docs/attachments) to understand how attachments work and see different examples of attachments in practice.
90
+
91
+ You can build a basic attachment and them attach it to a message and use a poster to post that
92
+ message for you:
93
+
94
+ ```ruby
95
+ # As an alternative you could also initialize the attachment with all the fields
96
+ # Slack::Attachment.new(fallback: 'fallback', pretext: 'pretext', ....)
97
+ attachment = Slack::Attachment.new
98
+
99
+ # This text will be used in clients that don't show formatted text (eg. IRC, mobile notifications)
100
+ attachment.fallback = "You wouldn't believe who's a mighty pirate!"
101
+
102
+ attachment.pretext = 'Arrrgh'
103
+ attachment.color = 'danger' # good, warning, danger, or any hex color code (eg. #439FE0)
104
+
105
+ attachment.image_url = 'https://pbs.twimg.com/profile_images/446438045945180162/KH34Nkuq.jpeg'
106
+ # you can use thumb_url instead for a small thumb pulled to the right
107
+
108
+ attachment.text = 'To become a mighty pirate Guybrush had to go through the three trials.'
109
+ attachment.title = 'Mighty pirate'
110
+ attachment.title_link = 'http://scummbar.com/'
111
+
112
+ # If you want to include author information you can use the following methods:
113
+ # attachment.author_name
114
+ # attachment.author_icon
115
+ # attachment.author_link
116
+ # Check Slack documentation for more info.
117
+
118
+ message = Slack::Message.new('Monkey island news', attachment)
119
+
120
+ # You can also add the attachment after initializing the message:
121
+ # message = Slack::Message.new('Monkey island news')
122
+ # message.attachments << attachment
123
+
124
+ poster = Slack::Poster.new(YOUR_WEBHOOK_URL)
125
+ poster.username = 'Monkey Island Daily'
126
+ poster.icon_emoji = ':monkey_face:'
127
+ poster.send_message(message) # => "ok"
128
+ ```
129
+
130
+ This will produce a message like this one:
131
+
132
+ ![](http://f.cl.ly/items/2S0E03450f2d3h2Y2w26/guybrush1.png)
133
+
134
+ #### Fields
135
+
136
+ Slack attachment can contain fields that will be displayed in a table inside the message attachment.
137
+ You can add fields with `Slack::Attachment#add_field`:
138
+
139
+ ```ruby
140
+ attachment = Slack::Attachment.new
141
+ attachment.add_field('Name1', 'Value1')
142
+ attachment.add_field('Name2', 'Value2')
143
+ attachment.add_field('Name3', 'Value3')
144
+ attachment.add_field('Name4', 'Value4')
145
+
146
+ message = Slack::Message.new('What a beautiful table of names and values', attachment)
147
+
148
+ poster = Slack::Poster.new(YOUR_WEBHOOK_URL)
149
+ poster.send_message(message) # => "ok"
150
+ ```
151
+
152
+ You may notice that the message will display with a vertical list of fields. You can have them side
153
+ by side giving a third boolean parameter (is it a short field?).
55
154
 
56
155
  ```ruby
57
- poster = Slack::Poster.new(TEAM, TOKEN, options)
58
- poster.send_message('Hi!') # will send to #random with the username 'Tester'
156
+ attachment = Slack::Attachment.new
157
+ attachment.add_field('Name1', 'Value1', true)
158
+ attachment.add_field('Name2', 'Value2', true)
159
+ attachment.add_field('Name3', 'Value3')
160
+ attachment.add_field('Name4', 'Value4')
59
161
  ```
60
162
 
61
- That's it!
163
+ This way the first two field will be displayed in the same row.
62
164
 
63
165
  ## Contributing
64
166
 
data/Rakefile CHANGED
@@ -1 +1,6 @@
1
1
  require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
data/bin/console ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'slack_poster'
5
+
6
+ require 'pry'
7
+ Pry.start
@@ -1,28 +1,26 @@
1
1
  module Slack
2
2
  class Attachment
3
- ATTRIBUTES = %i(fallback text title title_link image_url color pretext)
3
+ ATTRIBUTES = [
4
+ :fallback, :text, :title, :title_link, :image_url, :thumb_url, :color, :pretext, :author,
5
+ :author_name, :author_link, :author_icon
6
+ ]
4
7
 
5
8
  ATTRIBUTES.each do |attribute|
6
9
  attr_accessor attribute
7
10
  end
8
11
 
9
- attr_reader :fields, :author
12
+ attr_reader :fields
10
13
 
11
14
  def initialize(options = {})
12
15
  @fields = []
13
16
 
14
17
  ATTRIBUTES.each do |attribute|
15
- self.send("#{attribute}=", options.delete(attribute))
18
+ send("#{attribute}=", options.delete(attribute))
16
19
  end
17
20
  end
18
21
 
19
22
  def add_field(title, value, short = false)
20
- self.fields << Field.new(title, value, short)
21
- end
22
-
23
-
24
- def author=(author)
25
- @author = author
23
+ fields << Field.new(title, value, short)
26
24
  end
27
25
 
28
26
  def as_json
@@ -4,7 +4,7 @@ module Slack
4
4
  class Poster
5
5
  include HTTParty
6
6
 
7
- attr_accessor :url, :options, :attachments
7
+ attr_accessor :options
8
8
 
9
9
  # The format of the response. This comes back as 'ok' from slack.
10
10
  format :plain
@@ -16,46 +16,59 @@ module Slack
16
16
  #
17
17
  # Would translate to this:
18
18
  # => /?selected_ids[]=1&selected_ids[]=2&selected_ids[]=3
19
- #
20
19
  disable_rails_query_string_format
21
20
 
22
- # Initializes a Poster instance to post messages. It uses the HTTParty.base_uri and
23
- # HTTParty.default_params to set parameters of POST request.
24
- # It also accepts a configuration hash.
21
+ # Define getters and setters for the options hash keys. This will make assign of the options
22
+ # more flexible.
23
+ [:username, :channel, :icon_url, :icon_emoji].each do |option_attr|
24
+ define_method(option_attr) { @options[option_attr] }
25
+ define_method("#{option_attr}=") { |value| @options[option_attr] = value }
26
+ end
27
+
28
+ # Initializes a Poster instance to post messages with an incoming webhook URL.
29
+ # It also accepts an options hash. If no options are given then the poster uses the default
30
+ # configuration from Slack integration.
25
31
  #
26
32
  # ==== Examples
27
33
  #
28
- # Without configuration hash
29
- # => Slack::Poster.new('myteam', 'eNmZHQY6f591ziHyZdzePFz8')
34
+ # # Without options
35
+ # Slack::Poster.new('https://hooks.slack.com/services/T044G6VBA//TCIzZQQd7IKhQzCKc6W310va')
30
36
  #
31
- # With configuration using username and icon avatar:
32
- # => Slack::Poster.new('myteam', 'eNmZHQY6f591ziHyZdzePFz8', username: 'Ricardo',
33
- # icon_url: 'http://www.gravatar.com/avatar/92e00fd27c64c94d04140cef88039468.png')
34
- #
35
- # You can also use an emoji as avatar:
36
- # => Slack::Poster.new('myteam', 'eNmZHQY6f591ziHyZdzePFz8', username: 'Ricardo',
37
- # icon_emoji: 'ghost')
37
+ # # With options using a custom username and icon avatar
38
+ # Slack::Poster.new('https://hooks.slack.com/services/T044G6VBA//TCIzZQQd7IKhQzCKc6W310va',
39
+ # username: 'Ricardo',
40
+ # icon_url: 'http://www.gravatar.com/avatar/92e00fd27c64c94d04140cef88039468.png')
38
41
  #
42
+ # # You can also use an emoji as avatar
43
+ # Slack::Poster.new('https://hooks.slack.com/services/T044G6VBA//TCIzZQQd7IKhQzCKc6W310va',
44
+ # username: 'Ricardo',
45
+ # icon_emoji: 'ghost')
39
46
  def initialize(webhook_url, options = {})
40
47
  self.class.base_uri(webhook_url)
41
48
 
42
- @attachments = []
43
-
44
49
  @options = options
45
50
 
46
- raise ArgumentError, 'Webhook URL is required' if webhook_url.nil?
51
+ fail ArgumentError, 'Webhook URL is required' if webhook_url.nil?
47
52
  end
48
53
 
54
+ # Sends a message to Slack. The message can be either plain text or a Slack::Message object.
55
+ #
56
+ # ==== Examples
57
+ #
58
+ # # Plain text message
59
+ # poster.send_message('hello world')
60
+ #
61
+ # # Using a message object
62
+ # poster.send_message(Slack::Message.new(text: 'hello world'))
63
+ #
64
+ # You can have messages with attachments if you build your message with a Slack::Message object
65
+ # and add Slack::Attachment objects.
49
66
  def send_message(message)
50
67
  body = message.is_a?(String) ? options.merge(text: message) : options.merge(message.as_json)
51
68
 
52
- attach_extras(body) unless attachments.empty?
53
-
54
- response = self.class.post('', { body: { payload: body.to_json }})
55
-
56
- puts body.to_json
69
+ response = self.class.post('', body: { payload: body.to_json })
57
70
 
58
- "#{response.body} (#{response.code})"
71
+ response
59
72
  end
60
73
  end
61
74
  end
@@ -1,3 +1,3 @@
1
1
  module Slack
2
- VERSION = '1.0.1'
2
+ VERSION = '2.0.0'
3
3
  end
@@ -1,9 +1,5 @@
1
1
  require 'slack-poster/version'
2
2
  require 'slack-poster/poster'
3
- require 'slack-poster/author'
4
3
  require 'slack-poster/field'
5
4
  require 'slack-poster/message'
6
5
  require 'slack-poster/attachment'
7
-
8
- module Slack
9
- end
data/slack-poster.gemspec CHANGED
@@ -1,6 +1,7 @@
1
1
  # coding: utf-8
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
4
5
  require 'slack-poster/version'
5
6
 
6
7
  Gem::Specification.new do |spec|
@@ -8,8 +9,8 @@ Gem::Specification.new do |spec|
8
9
  spec.version = Slack::VERSION
9
10
  spec.authors = ['Ricardo Otero']
10
11
  spec.email = ['oterosantos@gmail.com']
11
- spec.summary = %q{Slack wrapper for Incoming WebHooks integrations.}
12
- spec.description = %q{slack-poster is a gem to make your integration with Slack WebHooks easier.}
12
+ spec.summary = 'Slack wrapper for Incoming WebHooks integrations.'
13
+ spec.description = 'Slack Poster is a gem to make your integration with Slack WebHooks easier.'
13
14
  spec.homepage = 'https://github.com/rikas/slack-poster'
14
15
  spec.license = 'MIT'
15
16
 
@@ -18,9 +19,13 @@ Gem::Specification.new do |spec|
18
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
20
  spec.require_paths = ['lib']
20
21
 
21
- spec.add_development_dependency 'bundler', '~> 1.5'
22
- spec.add_development_dependency 'rake', '~> 10.1'
23
- spec.add_development_dependency 'pry'
22
+ spec.add_development_dependency 'bundler', '~> 1.10.6', '>= 1.10.6'
23
+ spec.add_development_dependency 'rake', '~> 10.4.2', '>= 10.4.2'
24
+ spec.add_development_dependency 'rspec', '~> 3.2.0', '>= 3.2.0'
25
+ spec.add_development_dependency 'pry', '~> 0.10.3'
26
+ spec.add_development_dependency 'webmock', '~> 1.22.3', '>= 1.22.3'
27
+ spec.add_development_dependency 'vcr', '~> 3.0.0', '>= 3.0.0'
28
+ spec.add_development_dependency 'rubocop', '~> 0.35.1'
24
29
 
25
- spec.add_dependency 'httparty', '~> 0.12'
30
+ spec.add_runtime_dependency 'httparty', '~> 0.13.7'
26
31
  end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe Slack::Attachment do
4
+ describe '.new' do
5
+ let(:options) do
6
+ {
7
+ fallback: 'fallback',
8
+ text: 'text',
9
+ title: 'title',
10
+ title_link: 'title_link',
11
+ image_url: 'image_url',
12
+ thumb_url: 'thumb_url',
13
+ color: 'color',
14
+ author_name: 'author_name',
15
+ author_link: 'author_link',
16
+ author_icon: 'author_icon',
17
+ pretext: 'pretext'
18
+ }
19
+ end
20
+
21
+ it 'accepts initialization with no attributes' do
22
+ att = described_class.new
23
+
24
+ expect(att).to_not be_nil
25
+ end
26
+
27
+ it 'initializes all possible option' do
28
+ att = described_class.new(options)
29
+
30
+ options.each do |key, value|
31
+ expect(att.send(key)).to eq(value)
32
+ end
33
+ end
34
+ end
35
+
36
+ describe '#add_field' do
37
+ context 'when short is set to true' do
38
+ end
39
+ end
40
+
41
+ describe '#as_json' do
42
+ end
43
+ end
@@ -0,0 +1,44 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://hooks.slack.com/services/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
6
+ body:
7
+ encoding: UTF-8
8
+ string: payload=%7B%22text%22%3A%22Hello%20world%22%7D
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Access-Control-Allow-Origin:
22
+ - "*"
23
+ Content-Type:
24
+ - text/html
25
+ Date:
26
+ - Sun, 24 May 2015 14:05:58 GMT
27
+ Server:
28
+ - Apache
29
+ Strict-Transport-Security:
30
+ - max-age=31536000; includeSubDomains; preload
31
+ Vary:
32
+ - Accept-Encoding
33
+ X-Frame-Options:
34
+ - SAMEORIGIN
35
+ Content-Length:
36
+ - '22'
37
+ Connection:
38
+ - keep-alive
39
+ body:
40
+ encoding: ASCII-8BIT
41
+ string: ok
42
+ http_version:
43
+ recorded_at: Sun, 24 May 2015 14:05:58 GMT
44
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,6 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Slack::Field do
4
+ describe '#as_json' do
5
+ end
6
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe Slack::Message do
4
+ let(:message) { described_class.new('hello') }
5
+
6
+ it 'can be initialized with an attachment' do
7
+ attachment = Slack::Attachment.new
8
+
9
+ message = described_class.new('hi', attachment)
10
+
11
+ expect(message.attachments).to eq([attachment])
12
+ end
13
+
14
+ describe '#add_attachment' do
15
+ it 'adds an attachment correctly' do
16
+ attachment = Slack::Attachment.new
17
+
18
+ message.add_attachment(attachment)
19
+
20
+ expect(message.attachments).to eq([attachment])
21
+ end
22
+
23
+ it 'adds multiple attachments correctly' do
24
+ att1 = Slack::Attachment.new
25
+ att2 = Slack::Attachment.new
26
+
27
+ message.add_attachment(att1)
28
+ message.add_attachment(att2)
29
+
30
+ expect(message.attachments).to eq([att1, att2])
31
+ end
32
+ end
33
+
34
+ describe '#as_json' do
35
+ context 'when no attachments were added' do
36
+ it 'returns the correct json' do
37
+ expect(message.as_json).to eq(text: 'hello')
38
+ end
39
+ end
40
+
41
+ context 'when attachments are added' do
42
+ it 'returns the correct json' do
43
+ att1 = Slack::Attachment.new(text: 'Att1')
44
+ att2 = Slack::Attachment.new(title: 'Att2')
45
+
46
+ message.add_attachment(att1)
47
+ message.add_attachment(att2)
48
+
49
+ json = { text: 'hello', attachments: [{ text: 'Att1' }, { title: 'Att2' }] }
50
+
51
+ expect(message.as_json).to eq(json)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+ describe Slack::Poster do
4
+ let(:hook) { ENV.fetch('SLACK_POSTER_TEST_WEBHOOK') }
5
+ let(:poster) { described_class.new(hook) }
6
+
7
+ let(:options) do
8
+ {
9
+ username: SecureRandom.hex[0..5],
10
+ channel: "##{SecureRandom.hex[0..5]}",
11
+ icon_url: SecureRandom.hex[0..5],
12
+ icon_emoji: SecureRandom.hex[0..5]
13
+ }
14
+ end
15
+
16
+ let(:with_options) { described_class.new(hook, options) }
17
+
18
+ describe '.new' do
19
+ it 'requires the webhook_url' do
20
+ expect { described_class.new(nil) }.to raise_error(ArgumentError)
21
+ expect { described_class.new }.to raise_error(ArgumentError)
22
+ end
23
+
24
+ it 'does not need options' do
25
+ expect { described_class.new('my_webhook') }.to_not raise_exception
26
+ end
27
+ end
28
+
29
+ [:username, :channel, :icon_url, :icon_emoji].each do |option_attr|
30
+ describe "#{option_attr}=" do
31
+ it "sets the #{option_attr} field in options hash" do
32
+ poster.send("#{option_attr}=", "test_#{option_attr}")
33
+
34
+ expect(poster.options[option_attr]).to eq("test_#{option_attr}")
35
+ end
36
+ end
37
+
38
+ describe "#{option_attr}" do
39
+ it "gets the #{option_attr} field in options hash" do
40
+ expect(with_options.send(option_attr)).to eq(with_options.options[option_attr])
41
+ end
42
+ end
43
+ end
44
+
45
+ describe '#send_message' do
46
+ context 'with no attachments' do
47
+ it 'accepts a message object' do
48
+ VCR.use_cassette('default_post') do
49
+ message = Slack::Message.new('Hello world')
50
+
51
+ response = poster.send_message(message)
52
+
53
+ expect(response).to_not be_nil
54
+ expect(response.code).to eq(200)
55
+ end
56
+ end
57
+
58
+ it 'accepts a string' do
59
+ VCR.use_cassette('default_post') do
60
+ response = poster.send_message('Hello world')
61
+
62
+ expect(response).to_not be_nil
63
+ expect(response.code).to eq(200)
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,108 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # The generated `.rspec` file contains `--require spec_helper` which will cause
4
+ # this file to always be loaded, without a need to explicitly require it in any
5
+ # files.
6
+ #
7
+ # Given that it is always loaded, you are encouraged to keep this file as
8
+ # light-weight as possible. Requiring heavyweight dependencies from this file
9
+ # will add to the boot time of your test suite on EVERY test run, even for an
10
+ # individual file that may not need all of that loaded. Instead, consider making
11
+ # a separate helper file that requires the additional dependencies and performs
12
+ # the additional setup, and require it from the spec files that actually need
13
+ # it.
14
+ #
15
+ # The `.rspec` file also contains a few flags that are not defaults but that
16
+ # users commonly want.
17
+ #
18
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
19
+ require 'bundler/setup'
20
+ Bundler.setup
21
+
22
+ require 'slack_poster'
23
+
24
+ # Use the poster test webhook from an env variable
25
+ ENV['SLACK_POSTER_TEST_WEBHOOK'] ||= 'https://hooks.slack.com/services/TEST'
26
+
27
+ require 'webmock/rspec'
28
+
29
+ WebMock.disable_net_connect!
30
+
31
+ require 'vcr'
32
+
33
+ VCR.configure do |config|
34
+ config.cassette_library_dir = 'spec/cassettes'
35
+ config.hook_into :webmock
36
+ end
37
+
38
+ RSpec.configure do |config|
39
+ # rspec-expectations config goes here. You can use an alternate
40
+ # assertion/expectation library such as wrong or the stdlib/minitest
41
+ # assertions if you prefer.
42
+ config.expect_with :rspec do |expectations|
43
+ # This option will default to `true` in RSpec 4. It makes the `description`
44
+ # and `failure_message` of custom matchers include text for helper methods
45
+ # defined using `chain`, e.g.:
46
+ # be_bigger_than(2).and_smaller_than(4).description
47
+ # # => "be bigger than 2 and smaller than 4"
48
+ # ...rather than:
49
+ # # => "be bigger than 2"
50
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
51
+ end
52
+
53
+ # rspec-mocks config goes here. You can use an alternate test double
54
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
55
+ config.mock_with :rspec do |mocks|
56
+ # Prevents you from mocking or stubbing a method that does not exist on
57
+ # a real object. This is generally recommended, and will default to
58
+ # `true` in RSpec 4.
59
+ mocks.verify_partial_doubles = true
60
+ end
61
+
62
+ # The settings below are suggested to provide a good initial experience
63
+ # with RSpec, but feel free to customize to your heart's content.
64
+
65
+ # These two settings work together to allow you to limit a spec run
66
+ # to individual examples or groups you care about by tagging them with
67
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
68
+ # get run.
69
+ config.filter_run :focus
70
+ config.run_all_when_everything_filtered = true
71
+
72
+ # Limits the available syntax to the non-monkey patched syntax that is
73
+ # recommended. For more details, see:
74
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
75
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
76
+ # config.disable_monkey_patching!
77
+
78
+ # This setting enables warnings. It's recommended, but in some cases may
79
+ # be too noisy due to issues in dependencies.
80
+ config.warnings = true
81
+
82
+ # Many RSpec users commonly either run the entire suite or an individual
83
+ # file, and it's useful to allow more verbose output when running an
84
+ # individual spec file.
85
+ # if config.files_to_run.one?
86
+ # # Use the documentation formatter for detailed output,
87
+ # # unless a formatter has already been configured
88
+ # # (e.g. via a command-line flag).
89
+ # config.default_formatter = 'doc'
90
+ # end
91
+
92
+ # Print the 10 slowest examples and example groups at the
93
+ # end of the spec run, to help surface which specs are running
94
+ # particularly slow.
95
+ # config.profile_examples = 10
96
+
97
+ # Run specs in random order to surface order dependencies. If you find an
98
+ # order dependency and want to debug it, you can fix the order by providing
99
+ # the seed, which is printed after each run.
100
+ # --seed 1234
101
+ config.order = :random
102
+
103
+ # Seed global randomization in this process using the `--seed` CLI option.
104
+ # Setting this allows you to use `--seed` to deterministically reproduce
105
+ # test failures related to randomization by passing the same `--seed` value
106
+ # as the one that triggered the failure.
107
+ Kernel.srand config.seed
108
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slack-poster
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ricardo Otero
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-22 00:00:00.000000000 Z
11
+ date: 2015-11-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,78 +16,173 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.5'
19
+ version: 1.10.6
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.10.6
20
23
  type: :development
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
27
  - - "~>"
25
28
  - !ruby/object:Gem::Version
26
- version: '1.5'
29
+ version: 1.10.6
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.10.6
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: rake
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
37
  - - "~>"
32
38
  - !ruby/object:Gem::Version
33
- version: '10.1'
39
+ version: 10.4.2
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 10.4.2
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: 10.4.2
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 10.4.2
53
+ - !ruby/object:Gem::Dependency
54
+ name: rspec
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: 3.2.0
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 3.2.0
34
63
  type: :development
35
64
  prerelease: false
36
65
  version_requirements: !ruby/object:Gem::Requirement
37
66
  requirements:
38
67
  - - "~>"
39
68
  - !ruby/object:Gem::Version
40
- version: '10.1'
69
+ version: 3.2.0
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 3.2.0
41
73
  - !ruby/object:Gem::Dependency
42
74
  name: pry
43
75
  requirement: !ruby/object:Gem::Requirement
44
76
  requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: 0.10.3
80
+ type: :development
81
+ prerelease: false
82
+ version_requirements: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - "~>"
85
+ - !ruby/object:Gem::Version
86
+ version: 0.10.3
87
+ - !ruby/object:Gem::Dependency
88
+ name: webmock
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: 1.22.3
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 1.22.3
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 1.22.3
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: 1.22.3
107
+ - !ruby/object:Gem::Dependency
108
+ name: vcr
109
+ requirement: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: 3.0.0
45
114
  - - ">="
46
115
  - !ruby/object:Gem::Version
47
- version: '0'
116
+ version: 3.0.0
48
117
  type: :development
49
118
  prerelease: false
50
119
  version_requirements: !ruby/object:Gem::Requirement
51
120
  requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: 3.0.0
52
124
  - - ">="
53
125
  - !ruby/object:Gem::Version
54
- version: '0'
126
+ version: 3.0.0
127
+ - !ruby/object:Gem::Dependency
128
+ name: rubocop
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: 0.35.1
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - "~>"
139
+ - !ruby/object:Gem::Version
140
+ version: 0.35.1
55
141
  - !ruby/object:Gem::Dependency
56
142
  name: httparty
57
143
  requirement: !ruby/object:Gem::Requirement
58
144
  requirements:
59
145
  - - "~>"
60
146
  - !ruby/object:Gem::Version
61
- version: '0.12'
147
+ version: 0.13.7
62
148
  type: :runtime
63
149
  prerelease: false
64
150
  version_requirements: !ruby/object:Gem::Requirement
65
151
  requirements:
66
152
  - - "~>"
67
153
  - !ruby/object:Gem::Version
68
- version: '0.12'
69
- description: slack-poster is a gem to make your integration with Slack WebHooks easier.
154
+ version: 0.13.7
155
+ description: Slack Poster is a gem to make your integration with Slack WebHooks easier.
70
156
  email:
71
157
  - oterosantos@gmail.com
72
- executables: []
158
+ executables:
159
+ - console
73
160
  extensions: []
74
161
  extra_rdoc_files: []
75
162
  files:
76
163
  - ".gitignore"
77
- - ".ruby-gemset"
164
+ - ".rspec"
165
+ - ".rubocop.yml"
78
166
  - ".ruby-version"
167
+ - ".travis.yml"
79
168
  - Gemfile
80
169
  - LICENSE.txt
81
170
  - README.md
82
171
  - Rakefile
83
- - lib/slack-poster.rb
172
+ - bin/console
84
173
  - lib/slack-poster/attachment.rb
85
- - lib/slack-poster/author.rb
86
174
  - lib/slack-poster/field.rb
87
175
  - lib/slack-poster/message.rb
88
176
  - lib/slack-poster/poster.rb
89
177
  - lib/slack-poster/version.rb
178
+ - lib/slack_poster.rb
90
179
  - slack-poster.gemspec
180
+ - spec/attachment_spec.rb
181
+ - spec/cassettes/default_post.yml
182
+ - spec/field_spec.rb
183
+ - spec/message_spec.rb
184
+ - spec/poster_spec.rb
185
+ - spec/spec_helper.rb
91
186
  homepage: https://github.com/rikas/slack-poster
92
187
  licenses:
93
188
  - MIT
@@ -108,8 +203,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
108
203
  version: '0'
109
204
  requirements: []
110
205
  rubyforge_project:
111
- rubygems_version: 2.4.6
206
+ rubygems_version: 2.4.5.1
112
207
  signing_key:
113
208
  specification_version: 4
114
209
  summary: Slack wrapper for Incoming WebHooks integrations.
115
- test_files: []
210
+ test_files:
211
+ - spec/attachment_spec.rb
212
+ - spec/cassettes/default_post.yml
213
+ - spec/field_spec.rb
214
+ - spec/message_spec.rb
215
+ - spec/poster_spec.rb
216
+ - spec/spec_helper.rb
217
+ has_rdoc:
data/.ruby-gemset DELETED
@@ -1 +0,0 @@
1
- slack-poster
@@ -1,25 +0,0 @@
1
- module Slack
2
- class Author
3
- ATTRIBUTES = %i(name link icon)
4
-
5
- ATTRIBUTES.each do |attribute|
6
- attr_accessor attribute
7
- end
8
-
9
- def initialize(options = {})
10
- ATTRIBUTES.each do |attribute|
11
- self.send("#{attribute}=", options.delete(attribute))
12
- end
13
- end
14
-
15
- def as_json
16
- hash = {}
17
-
18
- ATTRIBUTES.each do |attribute|
19
- hash[attribute] = send(attribute) if send(attribute)
20
- end
21
-
22
- hash
23
- end
24
- end
25
- end