slack-poster 1.0.1 → 2.2.2

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
- SHA1:
3
- metadata.gz: f0a050b12a6ce8ae2c53036b2702123eca962fa4
4
- data.tar.gz: a896b337ec14ca27be143f8c730bc3c4309d48a5
2
+ SHA256:
3
+ metadata.gz: 041fb7e0aaa80515a521a7383b58ebc983e9eb2d7338bc6e17a0a465272cbcef
4
+ data.tar.gz: 7eb17386a6a4e44a9c3ac049fc48cb6382b9232a2e7a2a07d2501cd3a0606ef4
5
5
  SHA512:
6
- metadata.gz: eac18b2c2d966ab3887c72d64456a570c3275d9176d3c4c4b70fa6769dba148b57845363d93f748a9292337032442e9f20c86699e1e9cc652ea625961a87d5a7
7
- data.tar.gz: 93348ae808183956d5389e943b0f12990108363de88ac33f611dfbb40f28a631ea645895ffddc349c6cb945e893976b7162051540ae38b7f051a4c3755adf3e0
6
+ metadata.gz: 5b780b40dc2a3492b1bceeffecfe00f4372e1a6c834fadebf5b4e735ef3919d7f5718829901dd08d7d5cbdd374535f4eea0a1b11be16d13580eff4e07ede2338
7
+ data.tar.gz: cf7d90028bbeba198109c7fdfdf634cea4af58693154e91a0012b31b322a54c0fb09ecd740ac0b61d36742964f0fd6193a75648771bd5c3a48d26e396a1922bb
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --require spec_helper
3
+ --format documentation
data/.rubocop.yml ADDED
@@ -0,0 +1,33 @@
1
+ Style/Documentation:
2
+ Enabled: false
3
+
4
+ Layout/LineLength:
5
+ Max: 100
6
+
7
+ Metrics/BlockLength:
8
+ Exclude:
9
+ - 'spec/**/*_spec.rb'
10
+
11
+ Style/ExpandPathArguments:
12
+ Enabled: false
13
+
14
+ Layout/SpaceAroundMethodCallOperator:
15
+ Enabled: true
16
+
17
+ Lint/RaiseException:
18
+ Enabled: true
19
+
20
+ Lint/StructNewOverride:
21
+ Enabled: true
22
+
23
+ Style/ExponentialNotation:
24
+ Enabled: true
25
+
26
+ Style/HashEachMethods:
27
+ Enabled: true
28
+
29
+ Style/HashTransformKeys:
30
+ Enabled: true
31
+
32
+ Style/HashTransformValues:
33
+ Enabled: true
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.2.2
1
+ 2.5.8
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.5.8
4
+ - 2.7.2
5
+ before_install: gem install bundler
6
+ script:
7
+ - bundle exec rspec --fail-fast
8
+ - bundle exec rubocop
data/Gemfile CHANGED
@@ -1,2 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
4
+
2
5
  gemspec
data/README.md CHANGED
@@ -1,9 +1,7 @@
1
- [![Dependency Status](https://gemnasium.com/rikas/slack-poster.svg)](https://gemnasium.com/rikas/slack-poster)
1
+ [![Build Status](https://travis-ci.org/rikas/slack-poster.svg?branch=master)](https://travis-ci.org/rikas/slack-poster)
2
2
 
3
3
  # Slack Poster
4
4
 
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
5
  slack-poster is a simple gem to make your integration with Slack easier. It supports only incoming communications (from you to Slack).
8
6
 
9
7
  ## Installation
@@ -26,21 +24,29 @@ Or install it yourself as:
26
24
  $ gem install slack-poster
27
25
  ```
28
26
 
29
- ## Usage
27
+ ## Slack setup
30
28
 
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.
29
+ 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
30
 
33
- Next, create a new poster and send the message:
31
+ ![](http://cl.ly/image/2D2Y0x2B2847/slack_setup1.png)
34
32
 
35
- ```ruby
36
- TEAM = 'team-name'
37
- TOKEN = 'hd7heoo2oijd0'
33
+ Hit "Add Incoming WebHooks Integration" and go to the next screen. Here you can add a name to your
34
+ integration, customize the username that will post and the icon.
38
35
 
39
- poster = Slack::Poster.new(TEAM, TOKEN)
40
- poster.send_message('Hello, world!')
36
+ ![](http://cl.ly/image/2s3r343K0w3T/slack_setup2.png)
37
+
38
+ Copy the Webhook URL, because you'll need it. Click "Save Settings" and you're done.
39
+
40
+ ## Usage
41
+
42
+ First you have to initialize your poster and then you can use `send_message` to send your message.
43
+
44
+ ```ruby
45
+ poster = Slack::Poster.new(YOUR_WEBHOOK_URL)
46
+ poster.send_message('Hello world!')
41
47
  ```
42
48
 
43
- You can use an options array if you don't want to use the settings configured directly on Slack:
49
+ You can use an options array if you don't want to use the default settings:
44
50
 
45
51
  ```ruby
46
52
  options = {
@@ -51,14 +57,109 @@ options = {
51
57
  }
52
58
  ```
53
59
 
54
- And then use it as a third parameter. Note that every option is optional (no pun intended!).
60
+ And then use it as a second parameter. Note that every option is optional (no pun intended!).
61
+
62
+ ```ruby
63
+ poster = Slack::Poster.new(YOUR_WEBHOOK_URL, options)
64
+ poster.send_message('Hello with options')
65
+ # posts message 'Hello with options' to #random with the username 'Tester'
66
+ ```
67
+
68
+ Or you can change the options whenever you want
69
+
70
+ ```ruby
71
+ poster = Slack::Poster.new(YOUR_WEBHOOK_URL)
72
+ poster.username = 'TestUser'
73
+ poster.icon_emoji = ':ghost:'
74
+ poster.send_message('Hello World') # => "ok"
75
+ # posts message 'Hello World' to #random with the username 'TestUser' and ghost emoji as avatar
76
+ ```
77
+
78
+ You can also send a `Slack::Message` object instead of `String`:
79
+
80
+ ```ruby
81
+ message = Slack::Message.new('hello slack')
82
+ poster.send_message(message)
83
+ ```
84
+
85
+ ### Message attachments
86
+
87
+ Slack Poster supports message attachments. To do so you have to create `Slack::Attachment` objects
88
+ 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.
89
+
90
+ You can build a basic attachment and them attach it to a message and use a poster to post that
91
+ message for you:
92
+
93
+ ```ruby
94
+ # As an alternative you could also initialize the attachment with all the fields
95
+ # Slack::Attachment.new(fallback: 'fallback', pretext: 'pretext', ....)
96
+ attachment = Slack::Attachment.new
97
+
98
+ # This text will be used in clients that don't show formatted text (eg. IRC, mobile notifications)
99
+ attachment.fallback = "You wouldn't believe who's a mighty pirate!"
100
+
101
+ attachment.pretext = 'Arrrgh'
102
+ attachment.color = 'danger' # good, warning, danger, or any hex color code (eg. #439FE0)
103
+
104
+ attachment.image_url = 'https://pbs.twimg.com/profile_images/446438045945180162/KH34Nkuq.jpeg'
105
+ # you can use thumb_url instead for a small thumb pulled to the right
106
+
107
+ attachment.text = 'To become a mighty pirate Guybrush had to go through the three trials.'
108
+ attachment.title = 'Mighty pirate'
109
+ attachment.title_link = 'http://scummbar.com/'
110
+
111
+ # If you want to include author information you can use the following methods:
112
+ # attachment.author_name
113
+ # attachment.author_icon
114
+ # attachment.author_link
115
+ # Check Slack documentation for more info.
116
+
117
+ message = Slack::Message.new('Monkey island news', attachment)
118
+
119
+ # You can also add the attachment after initializing the message:
120
+ # message = Slack::Message.new('Monkey island news')
121
+ # message.attachments << attachment
122
+
123
+ poster = Slack::Poster.new(YOUR_WEBHOOK_URL)
124
+ poster.username = 'Monkey Island Daily'
125
+ poster.icon_emoji = ':monkey_face:'
126
+ poster.send_message(message) # => "ok"
127
+ ```
128
+
129
+ This will create a message like this one:
130
+
131
+ ![](http://f.cl.ly/items/2S0E03450f2d3h2Y2w26/guybrush1.png)
132
+
133
+ #### Fields
134
+
135
+ Slack attachment can contain fields that will be displayed in a table inside the message attachment.
136
+ You can add fields with `Slack::Attachment#add_field`:
137
+
138
+ ```ruby
139
+ attachment = Slack::Attachment.new
140
+ attachment.add_field('Name1', 'Value1')
141
+ attachment.add_field('Name2', 'Value2')
142
+ attachment.add_field('Name3', 'Value3')
143
+ attachment.add_field('Name4', 'Value4')
144
+
145
+ message = Slack::Message.new('What a beautiful table of names and values', attachment)
146
+
147
+ poster = Slack::Poster.new(YOUR_WEBHOOK_URL)
148
+ poster.send_message(message) # => "ok"
149
+ ```
150
+
151
+ You may notice that the message will display with a vertical list of fields. You can have them side
152
+ by side giving a third boolean parameter (is it a short field?).
55
153
 
56
154
  ```ruby
57
- poster = Slack::Poster.new(TEAM, TOKEN, options)
58
- poster.send_message('Hi!') # will send to #random with the username 'Tester'
155
+ attachment = Slack::Attachment.new
156
+ attachment.add_field('Name1', 'Value1', true)
157
+ attachment.add_field('Name2', 'Value2', true)
158
+ attachment.add_field('Name3', 'Value3')
159
+ attachment.add_field('Name4', 'Value4')
59
160
  ```
60
161
 
61
- That's it!
162
+ This way the first two field will be displayed in the same row.
62
163
 
63
164
  ## Contributing
64
165
 
data/Rakefile CHANGED
@@ -1 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ task default: :spec
data/bin/console ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+
6
+ Bundler.require
7
+
8
+ require 'pry'
9
+ Pry.start
@@ -1,28 +1,28 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Slack
2
4
  class Attachment
3
- ATTRIBUTES = %i(fallback text title title_link image_url color pretext)
5
+ ATTRIBUTES = %i[
6
+ fallback text title title_link image_url thumb_url color pretext author
7
+ author_name author_link author_icon
8
+ ].freeze
4
9
 
5
10
  ATTRIBUTES.each do |attribute|
6
11
  attr_accessor attribute
7
12
  end
8
13
 
9
- attr_reader :fields, :author
14
+ attr_reader :fields
10
15
 
11
16
  def initialize(options = {})
12
17
  @fields = []
13
18
 
14
19
  ATTRIBUTES.each do |attribute|
15
- self.send("#{attribute}=", options.delete(attribute))
20
+ send("#{attribute}=", options.delete(attribute))
16
21
  end
17
22
  end
18
23
 
19
24
  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
25
+ fields << Field.new(title, value, short)
26
26
  end
27
27
 
28
28
  def as_json
@@ -32,8 +32,8 @@ module Slack
32
32
  hash[attribute] = send(attribute) if send(attribute)
33
33
  end
34
34
 
35
- hash.merge!(fields: fields.map(&:as_json)) unless fields.empty?
36
- hash.merge!(author: author.as_json) if author
35
+ hash[:fields] = fields.map(&:as_json) unless fields.empty?
36
+ hash[:author] = author.as_json if author
37
37
 
38
38
  hash
39
39
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Slack
2
4
  class Field
3
5
  attr_accessor :title, :value, :short
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Slack
2
4
  class Message
3
5
  attr_accessor :text
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'slack/version'
4
+ require 'slack/field'
5
+ require 'slack/message'
6
+ require 'slack/attachment'
7
+ require 'json'
8
+ require 'faraday'
9
+
10
+ module Slack
11
+ class Poster
12
+ attr_accessor :options
13
+
14
+ # Define getters and setters for the options hash keys. This will make assign of the options
15
+ # more flexible.
16
+ %i[username channel icon_url icon_emoji].each do |option_attr|
17
+ define_method(option_attr) { @options[option_attr] }
18
+ define_method("#{option_attr}=") { |value| @options[option_attr] = value }
19
+ end
20
+
21
+ # Initializes a Poster instance to post messages with an incoming webhook URL.
22
+ # It also accepts an options hash. If no options are given then the poster uses the default
23
+ # configuration from Slack integration.
24
+ #
25
+ # ==== Examples
26
+ #
27
+ # # Without options
28
+ # Slack::Poster.new('https://hooks.slack.com/services/T044G6VBA//TCIzZQQd7IKhQzCKc6W310va')
29
+ #
30
+ # # With options using a custom username and icon avatar
31
+ # Slack::Poster.new('https://hooks.slack.com/services/T044G6VBA//TCIzZQQd7IKhQzCKc6W310va',
32
+ # 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('https://hooks.slack.com/services/T044G6VBA//TCIzZQQd7IKhQzCKc6W310va',
37
+ # username: 'Ricardo',
38
+ # icon_emoji: 'ghost')
39
+ def initialize(webhook_url, options = {})
40
+ @base_uri = webhook_url
41
+
42
+ @options = options
43
+
44
+ raise ArgumentError, 'Webhook URL is required' if webhook_url.nil?
45
+ end
46
+
47
+ # Sends a message to Slack. The message can be either plain text or a Slack::Message object.
48
+ #
49
+ # ==== Examples
50
+ #
51
+ # # Plain text message
52
+ # poster.send_message('hello world')
53
+ #
54
+ # # Using a message object
55
+ # poster.send_message(Slack::Message.new(text: 'hello world'))
56
+ #
57
+ # You can have messages with attachments if you build your message with a Slack::Message object
58
+ # and add Slack::Attachment objects.
59
+ def send_message(message)
60
+ body = message.is_a?(String) ? options.merge(text: message) : options.merge(message.as_json)
61
+
62
+ conn = Faraday.new(url: @base_uri)
63
+
64
+ response = conn.post('', payload: body.to_json)
65
+
66
+ response
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Slack
4
+ VERSION = '2.2.2'
5
+ end
data/slack-poster.gemspec CHANGED
@@ -1,26 +1,32 @@
1
- # coding: utf-8
1
+ # frozen_string_literal: true
2
+
2
3
  lib = File.expand_path('../lib', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'slack-poster/version'
5
+
6
+ require 'slack/version'
5
7
 
6
8
  Gem::Specification.new do |spec|
7
9
  spec.name = 'slack-poster'
8
- spec.version = Slack::VERSION
10
+ spec.version = Slack::VERSION.dup
9
11
  spec.authors = ['Ricardo Otero']
10
12
  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.}
13
+ spec.summary = 'Slack wrapper for Incoming WebHooks integrations.'
14
+ spec.description = 'Slack Poster is a gem to make your integration with Slack WebHooks easier.'
13
15
  spec.homepage = 'https://github.com/rikas/slack-poster'
14
16
  spec.license = 'MIT'
15
17
 
16
18
  spec.files = `git ls-files -z`.split("\x0")
17
19
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.test_files = spec.files.grep(%r{^(spec)/})
19
21
  spec.require_paths = ['lib']
20
22
 
21
- spec.add_development_dependency 'bundler', '~> 1.5'
22
- spec.add_development_dependency 'rake', '~> 10.1'
23
- spec.add_development_dependency 'pry'
23
+ spec.add_development_dependency 'bundler', '> 1.10.0'
24
+ spec.add_development_dependency 'pry', '~> 0.10'
25
+ spec.add_development_dependency 'rake', '>= 12.3.3'
26
+ spec.add_development_dependency 'rspec', '~> 3.4'
27
+ spec.add_development_dependency 'rubocop', '~> 0.49', '> 0.35'
28
+ spec.add_development_dependency 'vcr', '~> 3.0'
29
+ spec.add_development_dependency 'webmock', '~> 3.8.3'
24
30
 
25
- spec.add_dependency 'httparty', '~> 0.12'
31
+ spec.add_runtime_dependency 'faraday', '>= 1.0.0'
26
32
  end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Slack::Attachment do
6
+ describe '.new' do
7
+ let(:options) do
8
+ {
9
+ fallback: 'fallback',
10
+ text: 'text',
11
+ title: 'title',
12
+ title_link: 'title_link',
13
+ image_url: 'image_url',
14
+ thumb_url: 'thumb_url',
15
+ color: 'color',
16
+ author_name: 'author_name',
17
+ author_link: 'author_link',
18
+ author_icon: 'author_icon',
19
+ pretext: 'pretext'
20
+ }
21
+ end
22
+
23
+ it 'accepts initialization with no attributes' do
24
+ att = described_class.new
25
+
26
+ expect(att).to_not be_nil
27
+ end
28
+
29
+ it 'initializes all possible option' do
30
+ att = described_class.new(options)
31
+
32
+ options.each do |key, value|
33
+ expect(att.send(key)).to eq(value)
34
+ end
35
+ end
36
+ end
37
+
38
+ describe '#add_field' do
39
+ context 'when short is set to true' do
40
+ end
41
+ end
42
+
43
+ describe '#as_json' do
44
+ end
45
+ 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,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Slack::Field do
6
+ describe '#as_json' do
7
+ end
8
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Slack::Message do
6
+ let(:message) { described_class.new('hello') }
7
+
8
+ it 'can be initialized with an attachment' do
9
+ attachment = Slack::Attachment.new
10
+
11
+ message = described_class.new('hi', attachment)
12
+
13
+ expect(message.attachments).to eq([attachment])
14
+ end
15
+
16
+ describe '#add_attachment' do
17
+ it 'adds an attachment correctly' do
18
+ attachment = Slack::Attachment.new
19
+
20
+ message.add_attachment(attachment)
21
+
22
+ expect(message.attachments).to eq([attachment])
23
+ end
24
+
25
+ it 'adds multiple attachments correctly' do
26
+ att1 = Slack::Attachment.new
27
+ att2 = Slack::Attachment.new
28
+
29
+ message.add_attachment(att1)
30
+ message.add_attachment(att2)
31
+
32
+ expect(message.attachments).to eq([att1, att2])
33
+ end
34
+ end
35
+
36
+ describe '#as_json' do
37
+ context 'when no attachments were added' do
38
+ it 'returns the correct json' do
39
+ expect(message.as_json).to eq(text: 'hello')
40
+ end
41
+ end
42
+
43
+ context 'when attachments are added' do
44
+ it 'returns the correct json' do
45
+ att1 = Slack::Attachment.new(text: 'Att1')
46
+ att2 = Slack::Attachment.new(title: 'Att2')
47
+
48
+ message.add_attachment(att1)
49
+ message.add_attachment(att2)
50
+
51
+ json = { text: 'hello', attachments: [{ text: 'Att1' }, { title: 'Att2' }] }
52
+
53
+ expect(message.as_json).to eq(json)
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'securerandom'
5
+
6
+ describe Slack::Poster do
7
+ let(:hook) { ENV.fetch('SLACK_POSTER_TEST_WEBHOOK') }
8
+ let(:poster) { described_class.new(hook) }
9
+
10
+ let(:options) do
11
+ {
12
+ username: SecureRandom.hex[0..5],
13
+ channel: "##{SecureRandom.hex[0..5]}",
14
+ icon_url: SecureRandom.hex[0..5],
15
+ icon_emoji: SecureRandom.hex[0..5]
16
+ }
17
+ end
18
+
19
+ let(:with_options) { described_class.new(hook, options) }
20
+
21
+ describe '.new' do
22
+ it 'requires the webhook_url' do
23
+ expect { described_class.new(nil) }.to raise_error(ArgumentError)
24
+ expect { described_class.new }.to raise_error(ArgumentError)
25
+ end
26
+
27
+ it 'does not need options' do
28
+ expect { described_class.new('my_webhook') }.to_not raise_exception
29
+ end
30
+ end
31
+
32
+ %i[username channel icon_url icon_emoji].each do |option_attr|
33
+ describe "#{option_attr}=" do
34
+ it "sets the #{option_attr} field in options hash" do
35
+ poster.send("#{option_attr}=", "test_#{option_attr}")
36
+
37
+ expect(poster.options[option_attr]).to eq("test_#{option_attr}")
38
+ end
39
+ end
40
+
41
+ describe option_attr.to_s do
42
+ it "gets the #{option_attr} field in options hash" do
43
+ expect(with_options.send(option_attr)).to eq(with_options.options[option_attr])
44
+ end
45
+ end
46
+ end
47
+
48
+ describe '#send_message' do
49
+ context 'with no attachments' do
50
+ it 'accepts a message object' do
51
+ VCR.use_cassette('default_post') do
52
+ message = Slack::Message.new('Hello world')
53
+
54
+ response = poster.send_message(message)
55
+
56
+ expect(response).to_not be_nil
57
+ expect(response.env.status).to eq(200)
58
+ end
59
+ end
60
+
61
+ it 'accepts a string' do
62
+ VCR.use_cassette('default_post') do
63
+ response = poster.send_message('Hello world')
64
+
65
+ expect(response).to_not be_nil
66
+ expect(response.env.status).to eq(200)
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/setup'
4
+
5
+ Bundler.require
6
+
7
+ # Use the poster test webhook from an env variable
8
+ ENV['SLACK_POSTER_TEST_WEBHOOK'] ||= 'https://hooks.slack.com/services/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'
9
+
10
+ require 'vcr'
11
+ require 'webmock/rspec'
12
+
13
+ WebMock.disable_net_connect!
14
+
15
+ VCR.configure do |config|
16
+ config.cassette_library_dir = 'spec/cassettes'
17
+ config.hook_into :webmock
18
+ end
19
+
20
+ RSpec.configure do |config|
21
+ # This setting enables warnings. It's recommended, but in some cases may
22
+ # be too noisy due to issues in dependencies.
23
+ config.warnings = true
24
+
25
+ # Run specs in random order to surface order dependencies. If you find an
26
+ # order dependency and want to debug it, you can fix the order by providing
27
+ # the seed, which is printed after each run.
28
+ # --seed 1234
29
+ config.order = :random
30
+
31
+ # Seed global randomization in this process using the `--seed` CLI option.
32
+ # Setting this allows you to use `--seed` to deterministically reproduce
33
+ # test failures related to randomization by passing the same `--seed` value
34
+ # as the one that triggered the failure.
35
+ Kernel.srand config.seed
36
+ end
metadata CHANGED
@@ -1,98 +1,168 @@
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.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ricardo Otero
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-22 00:00:00.000000000 Z
11
+ date: 2021-06-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.10.0
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.10.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - "~>"
18
32
  - !ruby/object:Gem::Version
19
- version: '1.5'
33
+ version: '0.10'
20
34
  type: :development
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - "~>"
25
39
  - !ruby/object:Gem::Version
26
- version: '1.5'
40
+ version: '0.10'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 12.3.3
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 12.3.3
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
29
57
  requirement: !ruby/object:Gem::Requirement
30
58
  requirements:
31
59
  - - "~>"
32
60
  - !ruby/object:Gem::Version
33
- version: '10.1'
61
+ version: '3.4'
34
62
  type: :development
35
63
  prerelease: false
36
64
  version_requirements: !ruby/object:Gem::Requirement
37
65
  requirements:
38
66
  - - "~>"
39
67
  - !ruby/object:Gem::Version
40
- version: '10.1'
68
+ version: '3.4'
41
69
  - !ruby/object:Gem::Dependency
42
- name: pry
70
+ name: rubocop
43
71
  requirement: !ruby/object:Gem::Requirement
44
72
  requirements:
45
- - - ">="
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.49'
76
+ - - ">"
46
77
  - !ruby/object:Gem::Version
47
- version: '0'
78
+ version: '0.35'
48
79
  type: :development
49
80
  prerelease: false
50
81
  version_requirements: !ruby/object:Gem::Requirement
51
82
  requirements:
52
- - - ">="
83
+ - - "~>"
84
+ - !ruby/object:Gem::Version
85
+ version: '0.49'
86
+ - - ">"
53
87
  - !ruby/object:Gem::Version
54
- version: '0'
88
+ version: '0.35'
55
89
  - !ruby/object:Gem::Dependency
56
- name: httparty
90
+ name: vcr
57
91
  requirement: !ruby/object:Gem::Requirement
58
92
  requirements:
59
93
  - - "~>"
60
94
  - !ruby/object:Gem::Version
61
- version: '0.12'
62
- type: :runtime
95
+ version: '3.0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '3.0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: webmock
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: 3.8.3
110
+ type: :development
63
111
  prerelease: false
64
112
  version_requirements: !ruby/object:Gem::Requirement
65
113
  requirements:
66
114
  - - "~>"
67
115
  - !ruby/object:Gem::Version
68
- version: '0.12'
69
- description: slack-poster is a gem to make your integration with Slack WebHooks easier.
116
+ version: 3.8.3
117
+ - !ruby/object:Gem::Dependency
118
+ name: faraday
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: 1.0.0
124
+ type: :runtime
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: 1.0.0
131
+ description: Slack Poster is a gem to make your integration with Slack WebHooks easier.
70
132
  email:
71
133
  - oterosantos@gmail.com
72
- executables: []
134
+ executables:
135
+ - console
73
136
  extensions: []
74
137
  extra_rdoc_files: []
75
138
  files:
76
139
  - ".gitignore"
77
- - ".ruby-gemset"
140
+ - ".rspec"
141
+ - ".rubocop.yml"
78
142
  - ".ruby-version"
143
+ - ".travis.yml"
79
144
  - Gemfile
80
145
  - LICENSE.txt
81
146
  - README.md
82
147
  - Rakefile
83
- - lib/slack-poster.rb
84
- - lib/slack-poster/attachment.rb
85
- - lib/slack-poster/author.rb
86
- - lib/slack-poster/field.rb
87
- - lib/slack-poster/message.rb
88
- - lib/slack-poster/poster.rb
89
- - lib/slack-poster/version.rb
148
+ - bin/console
149
+ - lib/slack/attachment.rb
150
+ - lib/slack/field.rb
151
+ - lib/slack/message.rb
152
+ - lib/slack/poster.rb
153
+ - lib/slack/version.rb
90
154
  - slack-poster.gemspec
155
+ - spec/attachment_spec.rb
156
+ - spec/cassettes/default_post.yml
157
+ - spec/field_spec.rb
158
+ - spec/message_spec.rb
159
+ - spec/poster_spec.rb
160
+ - spec/spec_helper.rb
91
161
  homepage: https://github.com/rikas/slack-poster
92
162
  licenses:
93
163
  - MIT
94
164
  metadata: {}
95
- post_install_message:
165
+ post_install_message:
96
166
  rdoc_options: []
97
167
  require_paths:
98
168
  - lib
@@ -107,9 +177,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
177
  - !ruby/object:Gem::Version
108
178
  version: '0'
109
179
  requirements: []
110
- rubyforge_project:
111
- rubygems_version: 2.4.6
112
- signing_key:
180
+ rubyforge_project:
181
+ rubygems_version: 2.7.6.2
182
+ signing_key:
113
183
  specification_version: 4
114
184
  summary: Slack wrapper for Incoming WebHooks integrations.
115
- test_files: []
185
+ test_files:
186
+ - spec/attachment_spec.rb
187
+ - spec/cassettes/default_post.yml
188
+ - spec/field_spec.rb
189
+ - spec/message_spec.rb
190
+ - spec/poster_spec.rb
191
+ - spec/spec_helper.rb
data/.ruby-gemset DELETED
@@ -1 +0,0 @@
1
- slack-poster
data/lib/slack-poster.rb DELETED
@@ -1,9 +0,0 @@
1
- require 'slack-poster/version'
2
- require 'slack-poster/poster'
3
- require 'slack-poster/author'
4
- require 'slack-poster/field'
5
- require 'slack-poster/message'
6
- require 'slack-poster/attachment'
7
-
8
- module Slack
9
- end
@@ -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
@@ -1,61 +0,0 @@
1
- require 'httparty'
2
-
3
- module Slack
4
- class Poster
5
- include HTTParty
6
-
7
- attr_accessor :url, :options, :attachments
8
-
9
- # The format of the response. This comes back as 'ok' from slack.
10
- format :plain
11
-
12
- # Disable the use of rails query string format.
13
- #
14
- # With rails query string format enabled:
15
- # => get '/', :query => {:selected_ids => [1,2,3]}
16
- #
17
- # Would translate to this:
18
- # => /?selected_ids[]=1&selected_ids[]=2&selected_ids[]=3
19
- #
20
- disable_rails_query_string_format
21
-
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.
25
- #
26
- # ==== Examples
27
- #
28
- # Without configuration hash
29
- # => Slack::Poster.new('myteam', 'eNmZHQY6f591ziHyZdzePFz8')
30
- #
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')
38
- #
39
- def initialize(webhook_url, options = {})
40
- self.class.base_uri(webhook_url)
41
-
42
- @attachments = []
43
-
44
- @options = options
45
-
46
- raise ArgumentError, 'Webhook URL is required' if webhook_url.nil?
47
- end
48
-
49
- def send_message(message)
50
- body = message.is_a?(String) ? options.merge(text: message) : options.merge(message.as_json)
51
-
52
- attach_extras(body) unless attachments.empty?
53
-
54
- response = self.class.post('', { body: { payload: body.to_json }})
55
-
56
- puts body.to_json
57
-
58
- "#{response.body} (#{response.code})"
59
- end
60
- end
61
- end
@@ -1,3 +0,0 @@
1
- module Slack
2
- VERSION = '1.0.1'
3
- end