slacking 0.0.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 +7 -0
- data/.gitignore +21 -0
- data/Gemfile +9 -0
- data/LICENSE.txt +22 -0
- data/README.md +51 -0
- data/Rakefile +11 -0
- data/bin/slacking +11 -0
- data/lib/slacking.rb +36 -0
- data/lib/slacking/config.rb +22 -0
- data/lib/slacking/file_management.rb +72 -0
- data/lib/slacking/help.rb +11 -0
- data/lib/slacking/http_client.rb +60 -0
- data/lib/slacking/io.rb +11 -0
- data/lib/slacking/profile.rb +72 -0
- data/lib/slacking/version.rb +3 -0
- data/slacking.gemspec +23 -0
- data/test/slacking/slacking_test.rb +20 -0
- data/test/support/.slacking/xhibit.yml +4 -0
- data/test/support/.slacking_config/config.yml +2 -0
- data/test/test_helper.rb +13 -0
- metadata +96 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 226004f4bac0af53510170e39010e56cb75707d2
|
4
|
+
data.tar.gz: 736175a5789aaee2f9721f706e0c0d83fca149eb
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7b6830b6546003af331d4657184a6c81740ad75c9e2289bc9e5d3726c23df627f5d609e9507cd6d3f8a3fe05ad54c6b3b67e1047cd367960aabc60e6c82be22d
|
7
|
+
data.tar.gz: 131036821066f0c5dd17a56aad90b6005e22323ccb73335faab21e05ae7f3ce374aca49290d1e144e39a53d7ca64eed99e12a03373097cd41164a5cc3e8d8405
|
data/.gitignore
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
lib/config
|
19
|
+
lib/profiles
|
20
|
+
*.DS_Store
|
21
|
+
lib/user_profiles
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Adam Ryan
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# Slacking
|
2
|
+
|
3
|
+
Slacking is a small Ruby CLI to post to slack chat room with different various profiles (impersonating other users, i.e. Tim Lincecum)
|
4
|
+
|
5
|
+
## Dependencies
|
6
|
+
|
7
|
+
- Ruby 1.9 or better
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
Install with RubyGems.
|
12
|
+
|
13
|
+
```
|
14
|
+
$ gem install slacking
|
15
|
+
```
|
16
|
+
|
17
|
+
## Usage
|
18
|
+
|
19
|
+
### Post messages to Slack
|
20
|
+
|
21
|
+
```
|
22
|
+
$ slacking
|
23
|
+
```
|
24
|
+
|
25
|
+
This will create a session that will allow you to use and reuse multiple profiles to post messages to slack. You will need your slack api token.
|
26
|
+
|
27
|
+
### Profiles
|
28
|
+
|
29
|
+
Profiles are stored in `~/.slacking_profiles`
|
30
|
+
|
31
|
+
Config (slack api token) is stored in `~/.slacking_config`
|
32
|
+
|
33
|
+
You can change these locations by running Slacking using Environment Variables
|
34
|
+
|
35
|
+
`PROFILES_DIR, CONFIG_DIR, HOME`
|
36
|
+
|
37
|
+
### Editing Profiles
|
38
|
+
|
39
|
+
Profiles can be edited by using either a `--image` or `--channel` tag when specifying the username
|
40
|
+
|
41
|
+
## License
|
42
|
+
|
43
|
+
Slacking is MIT licensed (see LICENSE.txt)
|
44
|
+
|
45
|
+
## Contributing
|
46
|
+
|
47
|
+
1. Fork it ( http://github.com/<my-github-username>/slacking/fork )
|
48
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
49
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
50
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
51
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
data/bin/slacking
ADDED
data/lib/slacking.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'slacking/http_client'
|
2
|
+
require 'slacking/config'
|
3
|
+
require 'slacking/help'
|
4
|
+
require 'slacking/io'
|
5
|
+
require 'slacking/profile'
|
6
|
+
require 'slacking/version'
|
7
|
+
|
8
|
+
module Slacking
|
9
|
+
class << self
|
10
|
+
include IO
|
11
|
+
include Config
|
12
|
+
include Profile
|
13
|
+
include Help
|
14
|
+
|
15
|
+
def run
|
16
|
+
@token = get_slack_token
|
17
|
+
listen
|
18
|
+
end
|
19
|
+
|
20
|
+
protected
|
21
|
+
|
22
|
+
def client
|
23
|
+
@client ||= Slacking::HttpClient.new(@token)
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def listen
|
29
|
+
profile = initialize_profile
|
30
|
+
client.post_to_slack(profile) if profile
|
31
|
+
|
32
|
+
return if ENV['TEST']
|
33
|
+
listen
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'slacking/file_management'
|
2
|
+
|
3
|
+
module Slacking
|
4
|
+
module Config
|
5
|
+
include FileManagement
|
6
|
+
|
7
|
+
protected
|
8
|
+
|
9
|
+
def get_slack_token(write_options = 'a+')
|
10
|
+
create_config_dir
|
11
|
+
config = read_config_from_disk || {}
|
12
|
+
|
13
|
+
unless config[:token]
|
14
|
+
puts "Please enter your slack api token:\n"
|
15
|
+
config.merge!(token: get_action)
|
16
|
+
write_config_to_disk(config)
|
17
|
+
end
|
18
|
+
|
19
|
+
config[:token]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Slacking
|
5
|
+
module FileManagement
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def write_config_to_disk(data)
|
10
|
+
File.open("#{config_dir}/config.yml", 'w+') do |f|
|
11
|
+
f.write YAML.dump(data)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def read_config_from_disk
|
16
|
+
files = File.open("#{config_dir}/config.yml", 'a+') do |f|
|
17
|
+
YAML.load f
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def write_profile_to_disk(data)
|
22
|
+
File.open("#{profiles_dir}/#{@profile_name}.yml", 'w+') do |f|
|
23
|
+
f.write YAML.dump(data)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def read_profile_from_disk
|
28
|
+
files = File.open("#{profiles_dir}/#{@profile_name}.yml", 'a+') do |f|
|
29
|
+
YAML.load f
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def create_config_dir
|
34
|
+
return if File.directory? config_dir
|
35
|
+
if File.exist? config_dir
|
36
|
+
raise "Not a directory: #{config_dir}"
|
37
|
+
else
|
38
|
+
Dir.mkdir config_dir
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def create_profiles_dir
|
43
|
+
return if File.directory? profiles_dir
|
44
|
+
if File.exist? profiles_dir
|
45
|
+
raise "Not a directory: #{profiles_dir}"
|
46
|
+
else
|
47
|
+
Dir.mkdir profiles_dir
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def profiles_dir
|
52
|
+
@profiles_dir ||= ENV['PROFILES_DIR'] || File.join(home_dir, '.slacking')
|
53
|
+
end
|
54
|
+
|
55
|
+
def config_dir
|
56
|
+
@config_dir ||= ENV['CONFIG_DIR'] || File.join(home_dir, '.slacking_config')
|
57
|
+
end
|
58
|
+
|
59
|
+
def home_dir
|
60
|
+
@home_dir ||= begin
|
61
|
+
home = ENV['HOME']
|
62
|
+
home = ENV['USERPROFILE'] unless home
|
63
|
+
if !home && (ENV['HOMEDRIVE'] && ENV['HOMEPATH'])
|
64
|
+
home = File.join(ENV['HOMEDRIVE'], ENV['HOMEPATH'])
|
65
|
+
end
|
66
|
+
home = File.expand_path('~') unless home
|
67
|
+
home = 'C:/' if !home && RUBY_PLATFORM =~ /mswin|mingw/
|
68
|
+
home
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Slacking
|
2
|
+
module Help
|
3
|
+
def display_help
|
4
|
+
puts "----"
|
5
|
+
puts "Type [username] to create a new profile, or use an existing one"
|
6
|
+
puts "Type [username] --image to change an existing profile's image"
|
7
|
+
puts "Type [username] --channel to change an existing profile's slack channel"
|
8
|
+
puts '----'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'slacking/config'
|
2
|
+
require 'slacking/io'
|
3
|
+
require "net/http"
|
4
|
+
require "uri"
|
5
|
+
require 'json'
|
6
|
+
|
7
|
+
module Slacking
|
8
|
+
class HttpClient
|
9
|
+
include IO
|
10
|
+
include Config
|
11
|
+
|
12
|
+
def initialize(token)
|
13
|
+
@token = token
|
14
|
+
end
|
15
|
+
|
16
|
+
def post_to_slack(profile)
|
17
|
+
@profile = profile
|
18
|
+
url = URI.parse(slack_url)
|
19
|
+
|
20
|
+
request = Net::HTTP::Post.new("#{url.path}?#{url.query}")
|
21
|
+
request.body = request_body
|
22
|
+
request.add_field 'Content-Type', 'application/json'
|
23
|
+
|
24
|
+
http = Net::HTTP.new(url.host, url.port)
|
25
|
+
http.use_ssl = true
|
26
|
+
|
27
|
+
handle_response http.request(request)
|
28
|
+
end
|
29
|
+
|
30
|
+
protected
|
31
|
+
|
32
|
+
def request_body
|
33
|
+
{
|
34
|
+
text: message,
|
35
|
+
channel: "##{@profile[:channel]}".sub('##', '#'),
|
36
|
+
icon_url: @profile[:icon_url],
|
37
|
+
username: @profile[:username],
|
38
|
+
}.to_json
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def message
|
44
|
+
puts "What would you like to say to #{@profile[:channel]}, #{@profile[:username]}?"
|
45
|
+
get_action
|
46
|
+
end
|
47
|
+
|
48
|
+
def handle_response(response)
|
49
|
+
if response.body == 'No hooks'
|
50
|
+
@token = get_slack_token('w+')
|
51
|
+
else
|
52
|
+
puts response.body
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def slack_url
|
57
|
+
"https://byliner.slack.com/services/hooks/incoming-webhook?token=#{@token}"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/slacking/io.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'slacking/file_management'
|
2
|
+
|
3
|
+
module Slacking
|
4
|
+
module Profile
|
5
|
+
include FileManagement
|
6
|
+
|
7
|
+
PROFILES_PATH = "#{File.expand_path(File.dirname(__FILE__))}/user_profiles".freeze
|
8
|
+
VALID_ATTRIBUTES = %w(image channel)
|
9
|
+
|
10
|
+
protected
|
11
|
+
|
12
|
+
def initialize_profile
|
13
|
+
puts "Which profile would you like to use? (type 'help' for help, or 'quit' to quit)"
|
14
|
+
@profile_name, options = get_action.split('--').map(&:strip)
|
15
|
+
|
16
|
+
profile = if @profile_name == 'help'
|
17
|
+
display_help
|
18
|
+
options = 'help'
|
19
|
+
nil
|
20
|
+
elsif @profile_name == 'quit'
|
21
|
+
exit
|
22
|
+
else
|
23
|
+
fetch_profile
|
24
|
+
end
|
25
|
+
|
26
|
+
if options && VALID_ATTRIBUTES.include?(options)
|
27
|
+
profile = change_profile_attribute(profile, options)
|
28
|
+
end
|
29
|
+
|
30
|
+
if profile
|
31
|
+
profile.delete(:is_new)
|
32
|
+
write_profile_to_disk profile
|
33
|
+
end
|
34
|
+
|
35
|
+
profile if options.nil?
|
36
|
+
end
|
37
|
+
|
38
|
+
def fetch_profile
|
39
|
+
create_profiles_dir
|
40
|
+
|
41
|
+
profile = read_profile_from_disk
|
42
|
+
|
43
|
+
if !profile
|
44
|
+
puts "Creating a new profile, #{@profile_name}."
|
45
|
+
profile = generate_profile(username: @profile_name)
|
46
|
+
end
|
47
|
+
|
48
|
+
profile
|
49
|
+
end
|
50
|
+
|
51
|
+
def generate_profile(profile)
|
52
|
+
puts "Please enter an icon url:"
|
53
|
+
profile[:icon_url] = get_action
|
54
|
+
|
55
|
+
puts "Please enter the slack channel you would like to post to:"
|
56
|
+
profile[:channel] = get_action
|
57
|
+
|
58
|
+
profile[:is_new] = true
|
59
|
+
|
60
|
+
profile
|
61
|
+
end
|
62
|
+
|
63
|
+
def change_profile_attribute(profile, attribute)
|
64
|
+
if !profile.delete(:is_new)
|
65
|
+
puts "Please enter a new #{attribute}:"
|
66
|
+
profile[attribute.to_sym] = get_action
|
67
|
+
end
|
68
|
+
|
69
|
+
profile
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/slacking.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'slacking/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "slacking"
|
8
|
+
spec.version = Slacking::VERSION
|
9
|
+
spec.authors = ["Adam Ryan"]
|
10
|
+
spec.email = ["adam.g.ryan@gmail.com"]
|
11
|
+
spec.summary = %q{Post comments to slack as different users}
|
12
|
+
spec.description = %q{Create profiles you can use to post messages to slack}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = ['slacking']
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.5"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class SlackingTest < Minitest::Test
|
4
|
+
|
5
|
+
def setup
|
6
|
+
ENV['TEST'] = 'true'
|
7
|
+
ENV['HOME'] = File.dirname(__FILE__).split('/')[0..-2].join('/') + '/support'
|
8
|
+
Slacking.stubs(:get_action).returns('xhibit')
|
9
|
+
Slacking::HttpClient.any_instance.stubs(:get_action).returns('message')
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_profile
|
13
|
+
stub_request(:post, "https://byliner.slack.com/services/hooks/incoming-webhook?token=xhibit").
|
14
|
+
with(:body => "{\"text\":\"message\",\"channel\":\"#xhibit\",\"icon_url\":\"xhibit\",\"username\":\"xhibit\"}",
|
15
|
+
:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type'=>'application/json', 'User-Agent'=>'Ruby'}).
|
16
|
+
to_return(:status => 200, :body => "", :headers => {})
|
17
|
+
|
18
|
+
Slacking.run
|
19
|
+
end
|
20
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
Bundler.require :test
|
4
|
+
|
5
|
+
require 'minitest/autorun'
|
6
|
+
require 'webmock/minitest'
|
7
|
+
require 'mocha/setup'
|
8
|
+
require 'slacking'
|
9
|
+
|
10
|
+
# Support files
|
11
|
+
Dir["#{File.expand_path(File.dirname(__FILE__))}/support/*.rb"].each do |file|
|
12
|
+
require file
|
13
|
+
end
|
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: slacking
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Adam Ryan
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-04-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.5'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.5'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: Create profiles you can use to post messages to slack
|
42
|
+
email:
|
43
|
+
- adam.g.ryan@gmail.com
|
44
|
+
executables:
|
45
|
+
- slacking
|
46
|
+
extensions: []
|
47
|
+
extra_rdoc_files: []
|
48
|
+
files:
|
49
|
+
- ".gitignore"
|
50
|
+
- Gemfile
|
51
|
+
- LICENSE.txt
|
52
|
+
- README.md
|
53
|
+
- Rakefile
|
54
|
+
- bin/slacking
|
55
|
+
- lib/slacking.rb
|
56
|
+
- lib/slacking/config.rb
|
57
|
+
- lib/slacking/file_management.rb
|
58
|
+
- lib/slacking/help.rb
|
59
|
+
- lib/slacking/http_client.rb
|
60
|
+
- lib/slacking/io.rb
|
61
|
+
- lib/slacking/profile.rb
|
62
|
+
- lib/slacking/version.rb
|
63
|
+
- slacking.gemspec
|
64
|
+
- test/slacking/slacking_test.rb
|
65
|
+
- test/support/.slacking/xhibit.yml
|
66
|
+
- test/support/.slacking_config/config.yml
|
67
|
+
- test/test_helper.rb
|
68
|
+
homepage: ''
|
69
|
+
licenses:
|
70
|
+
- MIT
|
71
|
+
metadata: {}
|
72
|
+
post_install_message:
|
73
|
+
rdoc_options: []
|
74
|
+
require_paths:
|
75
|
+
- lib
|
76
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
81
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
requirements: []
|
87
|
+
rubyforge_project:
|
88
|
+
rubygems_version: 2.2.0
|
89
|
+
signing_key:
|
90
|
+
specification_version: 4
|
91
|
+
summary: Post comments to slack as different users
|
92
|
+
test_files:
|
93
|
+
- test/slacking/slacking_test.rb
|
94
|
+
- test/support/.slacking/xhibit.yml
|
95
|
+
- test/support/.slacking_config/config.yml
|
96
|
+
- test/test_helper.rb
|