laziness 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0d1f36acf80cdc40517d0ac06da0ac25d22b7d3a
4
+ data.tar.gz: c785e7e7379b5b859d9e9dfae0a8fe5e1edf953e
5
+ SHA512:
6
+ metadata.gz: 2e91075ad319f1ef40640283609e33b873495a147692b97b95434edd954556f514e462c8e1ac845e00de41c55542d09fbe30433403f6377e5a4527d96580cf4a
7
+ data.tar.gz: 5331629668c4ee42cafb4f70d087d7c3cafd25ccc6a81e2b798cd02a920fc33df0135c9fdcd15ef9a3a2e13aef99417a0232569f396d4e2ac68d9f4a836d38cb
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## RUBYGEMS
5
+ *.gem
6
+ .bundle
7
+ vendor/bundle
8
+
9
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.4
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+ ruby '2.1.4'
3
+
4
+ gemspec
5
+
6
+ group :development, :test do
7
+ gem 'rspec'
8
+ end
9
+
10
+ group :test do
11
+ gem 'webmock'
12
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,44 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ laziness (0.1.0)
5
+ hashie
6
+ httparty
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ addressable (2.3.6)
12
+ crack (0.4.2)
13
+ safe_yaml (~> 1.0.0)
14
+ diff-lcs (1.2.5)
15
+ hashie (3.3.1)
16
+ httparty (0.13.3)
17
+ json (~> 1.8)
18
+ multi_xml (>= 0.5.2)
19
+ json (1.8.1)
20
+ multi_xml (0.5.5)
21
+ rspec (3.1.0)
22
+ rspec-core (~> 3.1.0)
23
+ rspec-expectations (~> 3.1.0)
24
+ rspec-mocks (~> 3.1.0)
25
+ rspec-core (3.1.7)
26
+ rspec-support (~> 3.1.0)
27
+ rspec-expectations (3.1.2)
28
+ diff-lcs (>= 1.2.0, < 2.0)
29
+ rspec-support (~> 3.1.0)
30
+ rspec-mocks (3.1.3)
31
+ rspec-support (~> 3.1.0)
32
+ rspec-support (3.1.2)
33
+ safe_yaml (1.0.3)
34
+ webmock (1.18.0)
35
+ addressable (>= 2.3.6)
36
+ crack (>= 0.3.2)
37
+
38
+ PLATFORMS
39
+ ruby
40
+
41
+ DEPENDENCIES
42
+ laziness!
43
+ rspec
44
+ webmock
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2014 Jamie Wright
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,93 @@
1
+ laziness
2
+ ========
3
+
4
+ ## DESCRIPTION
5
+
6
+ A [Slack](http://slack.com) [API](http://api.slack.com) wrapper written in Ruby.
7
+
8
+ ## INSTALLATION
9
+
10
+ Add this line to your Gemfile:
11
+
12
+ ```
13
+ gem 'laziness'
14
+ ```
15
+
16
+ And then execute:
17
+
18
+ ```
19
+ bundle install
20
+ ```
21
+
22
+ Or install it yourself:
23
+
24
+ ```
25
+ gem install laziness
26
+ ```
27
+
28
+ ## USAGE
29
+
30
+ ```
31
+ client = Slack.client(access_token: "your-access-token")
32
+ ```
33
+
34
+ ### Channels
35
+
36
+ ```
37
+ client.channels.all # lists out all the channels
38
+ client.channels.find(channel_id) # get info about a specific channel
39
+ client.channels.archive!(channel_id) # archives the specific channel
40
+
41
+ channel = Slack::Channel.new(name: "testing")
42
+ client.channels.create(channel) # creates the new channel
43
+
44
+ client.channels.history(channel_id, latest: DateTime.now, oldest: 2.weeks.ago, count: 1000) # lists out the messages for the specific channels
45
+ client.channels.invite(channel_id, user_id) # invites the specific user to the specific channel
46
+ ```
47
+
48
+ #### TODO:
49
+
50
+ - [ ] [channels.history](https://api.slack.com/methods/channels.history)
51
+ - [ ] [channels.invite](https://api.slack.com/methods/channels.invite)
52
+ - [ ] [channels.join](https://api.slack.com/methods/channels.join)
53
+ - [ ] [channels.kick](https://api.slack.com/methods/channels.kick)
54
+ - [ ] [channels.leave](https://api.slack.com/methods/channels.leave)
55
+ - [ ] [channels.mark](https://api.slack.com/methods/channels.mark)
56
+ - [ ] [channels.rename](https://api.slack.com/methods/channels.rename)
57
+ - [ ] [channels.setPurpose](https://api.slack.com/methods/channels.setPurpose)
58
+ - [ ] [channels.setTopic](https://api.slack.com/methods/channels.setTopic)
59
+
60
+ ### Chat
61
+
62
+ ### Emoji
63
+
64
+ ### Files
65
+
66
+ ### Groups
67
+
68
+ ### IM
69
+
70
+ ### OAuth
71
+
72
+ ### Presence
73
+
74
+ ### Search
75
+
76
+ ### Stars
77
+
78
+ ### Users
79
+
80
+ ```
81
+ client.users.all # lists out all the users
82
+ client.users.find(user_id) # get info about a specific user
83
+ client.users.set_active # sets the current user (defined by the access_token) as active
84
+ ```
85
+
86
+ ## CONTRIBUTING
87
+
88
+ 1. Clone the repository `git clone https://github.com/brilliantfantastic/laziness`
89
+ 1. Create a feature branch `git checkout -b my-awesome-feature`
90
+ 1. Codez!
91
+ 1. Commit your changes (small commits please)
92
+ 1. Push your new branch `git push origin my-awesome-feature`
93
+ 1. Create a pull request `hub pull-request -b brilliantfantastic:master -h brilliantfantastic:my-awesome-feature`
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ require 'rspec/core/rake_task'
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/laziness.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'laziness/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "laziness"
8
+ spec.version = Slack::VERSION
9
+ spec.authors = ["Jamie Wright"]
10
+ spec.email = ["jamie@brilliantfantastic.com"]
11
+ spec.summary = "A Slack API wrapper written in Ruby."
12
+ spec.description = "Laziness wraps the Slack API in a Ruby gem so Ruby programs can easily communicate with the Slack API (http://api.slack.com)."
13
+ spec.homepage = "http://github.com/brilliantfantastic/laziness"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.required_ruby_version = '>= 2.0'
22
+
23
+ spec.add_runtime_dependency('httparty')
24
+ spec.add_runtime_dependency('hashie')
25
+ end
@@ -0,0 +1,43 @@
1
+ module Slack
2
+ module API
3
+ class Base
4
+ attr_reader :access_token
5
+
6
+ def initialize(access_token)
7
+ @access_token = access_token
8
+ end
9
+
10
+ protected
11
+
12
+ def base_path
13
+ "https://slack.com/api/"
14
+ end
15
+
16
+ def request(method, access_token, path, arguments={})
17
+ full_path = "#{base_path}#{path}?token=#{access_token}"
18
+ arguments.each_pair { |key, value| full_path = "#{full_path}&#{key}=#{value}" }
19
+ options = {
20
+ headers: {
21
+ "Accept" => "application/json",
22
+ "Content-Type" => "application/json; charset=utf-8"
23
+ }
24
+ }
25
+ response = HTTParty.send method, full_path, options
26
+ handle_exceptions response
27
+ response
28
+ end
29
+
30
+ def handle_exceptions(response)
31
+ parsed = JSON.parse(response)
32
+ if !parsed['ok']
33
+ klass = "#{parsed['error'].gsub(/(^|_)(.)/) { $2.upcase }}Error"
34
+ if Slack.const_defined? klass
35
+ raise Slack.const_get(klass)
36
+ else
37
+ raise Slack::APIError.new parsed['error']
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,30 @@
1
+ module Slack
2
+ module API
3
+ class Channels < Base
4
+ def all(exclude_archived=false)
5
+ response = request :get, access_token, 'channels.list', exclude_archived: exclude_archived ? 1 : 0
6
+ Slack::Channel.parse response, 'channels'
7
+ end
8
+
9
+ def find(id)
10
+ response = request :get, access_token, 'channels.info', channel: id
11
+ Slack::Channel.parse response, 'channel'
12
+ end
13
+
14
+ def create(name)
15
+ response = request :post, access_token, 'channels.create', name: name
16
+ Slack::Channel.parse response, 'channel'
17
+ end
18
+
19
+ def archive(id)
20
+ request :post, access_token, 'channels.archive', channel: id
21
+ nil
22
+ end
23
+
24
+ def unarchive(id)
25
+ request :post, access_token, 'channels.unarchive', channel: id
26
+ nil
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,20 @@
1
+ module Slack
2
+ module API
3
+ class Users < Base
4
+ def all
5
+ response = request :get, access_token, 'users.list'
6
+ Slack::User.parse response, 'members'
7
+ end
8
+
9
+ def find(id)
10
+ response = request :get, access_token, 'users.info', user: id
11
+ Slack::User.parse response, 'user'
12
+ end
13
+
14
+ def set_active
15
+ request :post, access_token, 'users.setActive'
16
+ nil
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,5 @@
1
+ require 'httparty'
2
+
3
+ require 'laziness/api/base'
4
+ require 'laziness/api/channels'
5
+ require 'laziness/api/users'
@@ -0,0 +1,19 @@
1
+ require 'hashie'
2
+
3
+ module Slack
4
+ class Base < Hashie::Mash
5
+ class << self
6
+ def parse(request, key=nil)
7
+ parsed = JSON.parse(request)
8
+ parsed = parsed[key] if key && parsed[key]
9
+ if parsed.is_a? Array
10
+ models = []
11
+ parsed.each { |attributes| models << new(attributes) }
12
+ models
13
+ else
14
+ new parsed
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,4 @@
1
+ module Slack
2
+ class Channel < Base
3
+ end
4
+ end
@@ -0,0 +1,17 @@
1
+ module Slack
2
+ class Client
3
+ attr_reader :access_token
4
+
5
+ def initialize(access_token)
6
+ @access_token = access_token
7
+ end
8
+
9
+ def users
10
+ @users ||= Slack::API::Users.new(access_token)
11
+ end
12
+
13
+ def channels
14
+ @channels ||= Slack::API::Channels.new(access_token)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,97 @@
1
+ module Slack
2
+ class APIError < StandardError
3
+ def initialize(message)
4
+ super message
5
+ end
6
+ end
7
+
8
+ class NotAuthedError < APIError
9
+ def initialize
10
+ super "No authentication token provided."
11
+ end
12
+ end
13
+
14
+ class InvalidAuthError < APIError
15
+ def initialize
16
+ super "Invalid authentication token."
17
+ end
18
+ end
19
+
20
+ class AccountInactiveError < APIError
21
+ def initialize
22
+ super "Authentication token is for a deleted user or team."
23
+ end
24
+ end
25
+
26
+ class RestrictedActionError < APIError
27
+ def initialize
28
+ super "A team preference prevents authenticated user from archiving."
29
+ end
30
+ end
31
+
32
+ class UserNotFoundError < APIError
33
+ def initialize
34
+ super "User value is invalid."
35
+ end
36
+ end
37
+
38
+ class UserNotVisibleError < APIError
39
+ def initialize
40
+ super "Not authorized to view the requested user."
41
+ end
42
+ end
43
+
44
+ class UserIsBotError < APIError
45
+ def initialize
46
+ super "This method cannot be called by a bot user."
47
+ end
48
+ end
49
+
50
+ class UserIsRestrictedError < APIError
51
+ def initialize
52
+ super "This method cannot be called by a restricted user or single channel guest."
53
+ end
54
+ end
55
+
56
+ class ChannelNotFoundError < APIError
57
+ def initialize
58
+ super "Channel value is invalid."
59
+ end
60
+ end
61
+
62
+ class AlreadyArchivedError < APIError
63
+ def initialize
64
+ super "Channel has already been archived."
65
+ end
66
+ end
67
+
68
+ class NotArchivedError < APIError
69
+ def initialize
70
+ super "Channel is not archived."
71
+ end
72
+ end
73
+
74
+ class NameTakenError < APIError
75
+ def initialize
76
+ super "A channel cannot be created with the given name."
77
+ end
78
+ end
79
+
80
+ class NoChannelError < APIError
81
+ def initialize
82
+ super "Value passed for name was empty."
83
+ end
84
+ end
85
+
86
+ class CantArchiveGeneralError < APIError
87
+ def initialize
88
+ super "You cannot archive the general channel."
89
+ end
90
+ end
91
+
92
+ class LastRaChannelError < APIError
93
+ def initialize
94
+ super "You cannot archive the last channel for a restricted account."
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,4 @@
1
+ module Slack
2
+ class User < Base
3
+ end
4
+ end
@@ -0,0 +1,3 @@
1
+ module Slack
2
+ VERSION = "0.1.0"
3
+ end
data/lib/laziness.rb ADDED
@@ -0,0 +1,15 @@
1
+ require 'laziness/version'
2
+ require 'laziness/api'
3
+ require 'laziness/base'
4
+ require 'laziness/channel'
5
+ require 'laziness/client'
6
+ require 'laziness/errors'
7
+ require 'laziness/user'
8
+
9
+ module Slack
10
+ class << self
11
+ def client(attributes={})
12
+ Slack::Client.new(attributes[:access_token])
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,52 @@
1
+ describe Slack::API:: Channels do
2
+ let(:access_token) { "12345" }
3
+ subject { Slack::API::Channels.new access_token }
4
+
5
+ describe '.all' do
6
+ it 'returns all the channels for an account' do
7
+ stub_slack_request :get, "channels.list?exclude_archived=0&token=#{access_token}", 'channels_list.json'
8
+
9
+ channels = subject.all
10
+ expect(channels.length).to eq 1
11
+ expect(channels[0].id).to eq "C02BLAH"
12
+ end
13
+ end
14
+
15
+ describe '.find' do
16
+ it 'returns the specific channel with the specified id' do
17
+ stub_slack_request :get, "channels.info?channel=C02BLAH&token=#{access_token}", 'channels_info.json'
18
+
19
+ channel = subject.find("C02BLAH")
20
+ expect(channel.id).to eq "C02BLAH"
21
+ expect(channel.name).to eq "tour"
22
+ end
23
+ end
24
+
25
+ describe '.create' do
26
+ it 'creates a new channel and returns the specified channel' do
27
+ stub_slack_request :post, "channels.create?name=tour&token=#{access_token}", 'channels_info.json'
28
+
29
+ channel = subject.create("tour")
30
+ expect(channel.id).to eq "C02BLAH"
31
+ expect(channel.name).to eq "tour"
32
+ end
33
+ end
34
+
35
+ describe '.archive' do
36
+ it 'marks the channel as archived' do
37
+ stub = stub_slack_request :post, "channels.archive?channel=C02BLAH&token=#{access_token}", 'successful_response.json'
38
+
39
+ expect(subject.archive("C02BLAH")).to be_nil
40
+ expect(stub).to have_been_requested
41
+ end
42
+ end
43
+
44
+ describe '.unarchive' do
45
+ it 'marks the channel as unarchived' do
46
+ stub = stub_slack_request :post, "channels.unarchive?channel=C02BLAH&token=#{access_token}", 'successful_response.json'
47
+
48
+ expect(subject.unarchive("C02BLAH")).to be_nil
49
+ expect(stub).to have_been_requested
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,34 @@
1
+ describe Slack::API::Users do
2
+ let(:access_token) { "12345" }
3
+ subject { Slack::API::Users.new access_token }
4
+
5
+ describe '.all' do
6
+ it 'returns all the users for an account' do
7
+ stub_slack_request :get, "users.list?token=#{access_token}", 'users_list.json'
8
+
9
+ users = subject.all
10
+ expect(users.length).to eq 2
11
+ expect(users[0].id).to eq "U024BLAH"
12
+ expect(users[1].id).to eq "U024BLAH2"
13
+ end
14
+ end
15
+
16
+ describe '.find' do
17
+ it 'returns the specific user with the specified id' do
18
+ stub_slack_request :get, "users.info?user=U024BLAH&token=#{access_token}", 'users_info.json'
19
+
20
+ user = subject.find("U024BLAH")
21
+ expect(user.id).to eq "U024BLAH"
22
+ expect(user.name).to eq "jimmy"
23
+ end
24
+ end
25
+
26
+ describe '.set_active' do
27
+ it 'marks the user as active' do
28
+ stub = stub_slack_request :post, "users.setActive?token=#{access_token}", 'successful_response.json'
29
+
30
+ expect(subject.set_active).to be_nil
31
+ expect(stub).to have_been_requested
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,9 @@
1
+ describe Slack::Client do
2
+ it "returns a new client" do
3
+ expect(Slack.client(access_token: "blah")).to be_instance_of Slack::Client
4
+ end
5
+
6
+ it "assigns the access token" do
7
+ expect(Slack.client(access_token: "blah").access_token).to eq "blah"
8
+ end
9
+ end
@@ -0,0 +1,166 @@
1
+ describe 'API errors' do
2
+ let(:access_token) { "12345" }
3
+ subject { Slack::Client.new access_token }
4
+
5
+ # user_not_visible - The requested user is not visible to the calling user
6
+
7
+ it 'raises an not authed error if a no authentication token was provided' do
8
+ response = {
9
+ ok: false,
10
+ error: "not_authed"
11
+ }
12
+ stub_request(:get, "https://slack.com/api/users.list?token=#{access_token}").
13
+ to_return(status: 200, body: response.to_json)
14
+ expect { subject.users.all }.to raise_error Slack::NotAuthedError
15
+ end
16
+
17
+ it 'raises an invalid auth error if an invalid authentication token was provided' do
18
+ response = {
19
+ ok: false,
20
+ error: "invalid_auth"
21
+ }
22
+ stub_request(:get, "https://slack.com/api/users.list?token=#{access_token}").
23
+ to_return(status: 200, body: response.to_json)
24
+ expect { subject.users.all }.to raise_error Slack::InvalidAuthError
25
+ end
26
+
27
+ it 'raises an account inactive error if the authentication token is for a deleted user' do
28
+ response = {
29
+ ok: false,
30
+ error: "account_inactive"
31
+ }
32
+ stub_request(:get, "https://slack.com/api/users.list?token=#{access_token}").
33
+ to_return(status: 200, body: response.to_json)
34
+ expect { subject.users.all }.to raise_error Slack::AccountInactiveError
35
+ end
36
+
37
+ it 'raises a user not found error if the user id was invalid' do
38
+ response = {
39
+ ok: false,
40
+ error: "user_not_found"
41
+ }
42
+ stub_request(:get, "https://slack.com/api/users.list?token=#{access_token}").
43
+ to_return(status: 200, body: response.to_json)
44
+ expect { subject.users.all }.to raise_error Slack::UserNotFoundError
45
+ end
46
+
47
+ it 'raises a user not visible error if the user does not have permission to see the requested user' do
48
+ response = {
49
+ ok: false,
50
+ error: "user_not_visible"
51
+ }
52
+ stub_request(:get, "https://slack.com/api/users.list?token=#{access_token}").
53
+ to_return(status: 200, body: response.to_json)
54
+ expect { subject.users.all }.to raise_error Slack::UserNotVisibleError
55
+ end
56
+
57
+ it 'raises a user is bot error if the user is a bot user' do
58
+ response = {
59
+ ok: false,
60
+ error: "user_is_bot"
61
+ }
62
+ stub_request(:get, "https://slack.com/api/users.list?token=#{access_token}").
63
+ to_return(status: 200, body: response.to_json)
64
+ expect { subject.users.all }.to raise_error Slack::UserIsBotError
65
+ end
66
+
67
+ it 'raises a user is restricted error if the user is not allowed to perform the action' do
68
+ response = {
69
+ ok: false,
70
+ error: "user_is_restricted"
71
+ }
72
+ stub_request(:get, "https://slack.com/api/users.list?token=#{access_token}").
73
+ to_return(status: 200, body: response.to_json)
74
+ expect { subject.users.all }.to raise_error Slack::UserIsRestrictedError
75
+ end
76
+
77
+ it 'raises a channel not found error if the channel id was invalid' do
78
+ response = {
79
+ ok: false,
80
+ error: "channel_not_found"
81
+ }
82
+ stub_request(:get, "https://slack.com/api/channels.list?exclude_archived=0&token=#{access_token}").
83
+ to_return(status: 200, body: response.to_json)
84
+ expect { subject.channels.all }.to raise_error Slack::ChannelNotFoundError
85
+ end
86
+
87
+ it 'raises a channel already archived error if the channel id was already archived' do
88
+ response = {
89
+ ok: false,
90
+ error: "already_archived"
91
+ }
92
+ stub_request(:get, "https://slack.com/api/channels.list?exclude_archived=0&token=#{access_token}").
93
+ to_return(status: 200, body: response.to_json)
94
+ expect { subject.channels.all }.to raise_error Slack::AlreadyArchivedError
95
+ end
96
+
97
+ it 'raises a channel not archived error if the channel id is not archived' do
98
+ response = {
99
+ ok: false,
100
+ error: "not_archived"
101
+ }
102
+ stub_request(:get, "https://slack.com/api/channels.list?exclude_archived=0&token=#{access_token}").
103
+ to_return(status: 200, body: response.to_json)
104
+ expect { subject.channels.all }.to raise_error Slack::NotArchivedError
105
+ end
106
+
107
+ it 'raises a general channel archived error if the channel is the general channel' do
108
+ response = {
109
+ ok: false,
110
+ error: "cant_archive_general"
111
+ }
112
+ stub_request(:get, "https://slack.com/api/channels.list?exclude_archived=0&token=#{access_token}").
113
+ to_return(status: 200, body: response.to_json)
114
+ expect { subject.channels.all }.to raise_error Slack::CantArchiveGeneralError
115
+ end
116
+
117
+ it 'raises a last restricted account error if the channel is restricted' do
118
+ response = {
119
+ ok: false,
120
+ error: "last_ra_channel"
121
+ }
122
+ stub_request(:get, "https://slack.com/api/channels.list?exclude_archived=0&token=#{access_token}").
123
+ to_return(status: 200, body: response.to_json)
124
+ expect { subject.channels.all }.to raise_error Slack::LastRaChannelError
125
+ end
126
+
127
+ it 'raises a restricted action error if the user does not have the correct permissions' do
128
+ response = {
129
+ ok: false,
130
+ error: "restricted_action"
131
+ }
132
+ stub_request(:get, "https://slack.com/api/channels.list?exclude_archived=0&token=#{access_token}").
133
+ to_return(status: 200, body: response.to_json)
134
+ expect { subject.channels.all }.to raise_error Slack::RestrictedActionError
135
+ end
136
+
137
+ it 'raises a name taken error if the channel name already exists' do
138
+ response = {
139
+ ok: false,
140
+ error: "name_taken"
141
+ }
142
+ stub_request(:get, "https://slack.com/api/channels.list?exclude_archived=0&token=#{access_token}").
143
+ to_return(status: 200, body: response.to_json)
144
+ expect { subject.channels.all }.to raise_error Slack::NameTakenError
145
+ end
146
+
147
+ it 'raises a no channel error if the channel name was not provided' do
148
+ response = {
149
+ ok: false,
150
+ error: "no_channel"
151
+ }
152
+ stub_request(:get, "https://slack.com/api/channels.list?exclude_archived=0&token=#{access_token}").
153
+ to_return(status: 200, body: response.to_json)
154
+ expect { subject.channels.all }.to raise_error Slack::NoChannelError
155
+ end
156
+
157
+ it 'raises an http error if the error is not known' do
158
+ response = {
159
+ ok: false,
160
+ error: "blah"
161
+ }
162
+ stub_request(:get, "https://slack.com/api/users.list?token=#{access_token}").
163
+ to_return(status: 200, body: response.to_json)
164
+ expect { subject.users.all }.to raise_error Slack::APIError
165
+ end
166
+ end
@@ -0,0 +1,16 @@
1
+ require 'webmock/rspec'
2
+ require 'support/slack_stub_factory'
3
+
4
+ require 'laziness'
5
+
6
+ RSpec.configure do |config|
7
+ config.expect_with :rspec do |expectations|
8
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
9
+ end
10
+
11
+ config.mock_with :rspec do |mocks|
12
+ mocks.verify_partial_doubles = true
13
+ end
14
+
15
+ config.include SlackStubFactory
16
+ end
@@ -0,0 +1,28 @@
1
+ {
2
+ "ok": true,
3
+ "channel": {
4
+ "id": "C02BLAH",
5
+ "name": "tour",
6
+ "is_channel": true,
7
+ "created": 1403798029,
8
+ "creator": "U024BLAH",
9
+ "is_archived": false,
10
+ "is_general": false,
11
+ "is_member": true,
12
+ "members": [
13
+ "U024BLAH",
14
+ "U024BLAH2"
15
+ ],
16
+ "topic": {
17
+ "value": "",
18
+ "creator": "",
19
+ "last_set": 0
20
+ },
21
+ "purpose": {
22
+ "value": "A place to discuss the upcoming tour",
23
+ "creator": "U024BLAH",
24
+ "last_set": 1403798029
25
+ },
26
+ "num_members": 2
27
+ }
28
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "ok": true,
3
+ "channels": [
4
+ {
5
+ "id": "C02BLAH",
6
+ "name": "tour",
7
+ "is_channel": true,
8
+ "created": 1403798029,
9
+ "creator": "U024BLAH",
10
+ "is_archived": false,
11
+ "is_general": false,
12
+ "is_member": true,
13
+ "members": [
14
+ "U024BLAH",
15
+ "U024BLAH2"
16
+ ],
17
+ "topic": {
18
+ "value": "",
19
+ "creator": "",
20
+ "last_set": 0
21
+ },
22
+ "purpose": {
23
+ "value": "A place to discuss the upcoming tour",
24
+ "creator": "U024BLAH",
25
+ "last_set": 1403798029
26
+ },
27
+ "num_members": 2
28
+ }
29
+ ]
30
+ }
@@ -0,0 +1 @@
1
+ { "ok": true }
@@ -0,0 +1,10 @@
1
+ {
2
+ "ok": true,
3
+ "user": {
4
+ "id": "U024BLAH",
5
+ "name": "jimmy",
6
+ "deleted": false,
7
+ "status": "null",
8
+ "real_name": "Jimmy Page"
9
+ }
10
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "ok": true,
3
+ "members": [
4
+ {
5
+ "id": "U024BLAH",
6
+ "name": "jimmy",
7
+ "deleted": false,
8
+ "status": "null",
9
+ "real_name": "Jimmy Page"
10
+ },
11
+ {
12
+ "id": "U024BLAH2",
13
+ "name": "robert",
14
+ "deleted": false,
15
+ "status": "null",
16
+ "real_name": "Robert Plant"
17
+ }
18
+ ]
19
+ }
@@ -0,0 +1,10 @@
1
+ module SlackStubFactory
2
+ def stub_slack_request(method, path, fixture)
3
+ full_path = "https://slack.com/api/#{path}"
4
+ stub_request(method, full_path).to_return(status: 200, body: slack_json_fixture(fixture))
5
+ end
6
+
7
+ def slack_json_fixture(fixture)
8
+ File.read(File.join('spec', 'support', 'fixtures', fixture)).strip.gsub(/\n\s*/, "")
9
+ end
10
+ end
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: laziness
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jamie Wright
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-12-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httparty
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: hashie
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Laziness wraps the Slack API in a Ruby gem so Ruby programs can easily
42
+ communicate with the Slack API (http://api.slack.com).
43
+ email:
44
+ - jamie@brilliantfantastic.com
45
+ executables: []
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - ".gitignore"
50
+ - ".rspec"
51
+ - ".ruby-version"
52
+ - Gemfile
53
+ - Gemfile.lock
54
+ - LICENSE
55
+ - README.md
56
+ - Rakefile
57
+ - laziness.gemspec
58
+ - lib/laziness.rb
59
+ - lib/laziness/api.rb
60
+ - lib/laziness/api/base.rb
61
+ - lib/laziness/api/channels.rb
62
+ - lib/laziness/api/users.rb
63
+ - lib/laziness/base.rb
64
+ - lib/laziness/channel.rb
65
+ - lib/laziness/client.rb
66
+ - lib/laziness/errors.rb
67
+ - lib/laziness/user.rb
68
+ - lib/laziness/version.rb
69
+ - spec/laziness/api/channels_spec.rb
70
+ - spec/laziness/api/users_spec.rb
71
+ - spec/laziness/client_spec.rb
72
+ - spec/laziness/errors_spec.rb
73
+ - spec/spec_helper.rb
74
+ - spec/support/fixtures/channels_info.json
75
+ - spec/support/fixtures/channels_list.json
76
+ - spec/support/fixtures/successful_response.json
77
+ - spec/support/fixtures/users_info.json
78
+ - spec/support/fixtures/users_list.json
79
+ - spec/support/slack_stub_factory.rb
80
+ homepage: http://github.com/brilliantfantastic/laziness
81
+ licenses:
82
+ - MIT
83
+ metadata: {}
84
+ post_install_message:
85
+ rdoc_options: []
86
+ require_paths:
87
+ - lib
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '2.0'
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ requirements: []
99
+ rubyforge_project:
100
+ rubygems_version: 2.2.2
101
+ signing_key:
102
+ specification_version: 4
103
+ summary: A Slack API wrapper written in Ruby.
104
+ test_files:
105
+ - spec/laziness/api/channels_spec.rb
106
+ - spec/laziness/api/users_spec.rb
107
+ - spec/laziness/client_spec.rb
108
+ - spec/laziness/errors_spec.rb
109
+ - spec/spec_helper.rb
110
+ - spec/support/fixtures/channels_info.json
111
+ - spec/support/fixtures/channels_list.json
112
+ - spec/support/fixtures/successful_response.json
113
+ - spec/support/fixtures/users_info.json
114
+ - spec/support/fixtures/users_list.json
115
+ - spec/support/slack_stub_factory.rb