layabout 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/Gemfile +8 -0
  6. data/Gemfile.lock +63 -0
  7. data/LICENSE +22 -0
  8. data/README.md +18 -0
  9. data/layabout.gemspec +26 -0
  10. data/lib/layabout/auth_test.rb +35 -0
  11. data/lib/layabout/channels.rb +82 -0
  12. data/lib/layabout/chat.rb +67 -0
  13. data/lib/layabout/delete_chat.rb +48 -0
  14. data/lib/layabout/file_list.rb +58 -0
  15. data/lib/layabout/file_upload.rb +73 -0
  16. data/lib/layabout/helpers.rb +21 -0
  17. data/lib/layabout/incoming_webhook.rb +41 -0
  18. data/lib/layabout/slack/channel.rb +32 -0
  19. data/lib/layabout/slack/file.rb +56 -0
  20. data/lib/layabout/slack_response.rb +37 -0
  21. data/lib/layabout/version.rb +3 -0
  22. data/lib/layabout.rb +29 -0
  23. data/spec/fixtures/upload_test.txt +1 -0
  24. data/spec/fixtures/vcr_cassettes/Layabout/_channels/returns_a_list_of_channels.yml +125 -0
  25. data/spec/fixtures/vcr_cassettes/Layabout/_say/posts_a_message.yml +54 -0
  26. data/spec/fixtures/vcr_cassettes/Layabout/_upload/uploads_a_file.yml +65 -0
  27. data/spec/fixtures/vcr_cassettes/Layabout_AuthTest/_get/tests_auth.yml +146 -0
  28. data/spec/fixtures/vcr_cassettes/Layabout_Channels/_info/returns_a_Layabout_Slack_Channel.yml +96 -0
  29. data/spec/fixtures/vcr_cassettes/Layabout_Channels/_join/returns_a_success_response.yml +95 -0
  30. data/spec/fixtures/vcr_cassettes/Layabout_Channels/_leave/returns_a_success_response.yml +95 -0
  31. data/spec/fixtures/vcr_cassettes/Layabout_Channels/_list/returns_a_list_of_Layabout_Slack_Channel.yml +105 -0
  32. data/spec/fixtures/vcr_cassettes/Layabout_Chat/_post/submits_a_message.yml +95 -0
  33. data/spec/fixtures/vcr_cassettes/Layabout_DeleteChat/_delete/deletes_the_message.yml +146 -0
  34. data/spec/fixtures/vcr_cassettes/Layabout_FileList/_list/returns_a_list_of_Layabout_Slack_File.yml +57 -0
  35. data/spec/fixtures/vcr_cassettes/Layabout_FileUpload/_upload/uploads_a_file.yml +65 -0
  36. data/spec/fixtures/vcr_cassettes/Layabout_IncomingWebhook/_post/submits_a_message.yml +44 -0
  37. data/spec/layabout/auth_test_spec.rb +12 -0
  38. data/spec/layabout/channels_spec.rb +29 -0
  39. data/spec/layabout/chat_spec.rb +12 -0
  40. data/spec/layabout/configuration_spec.rb +15 -0
  41. data/spec/layabout/delete_chat_spec.rb +13 -0
  42. data/spec/layabout/file_list_spec.rb +11 -0
  43. data/spec/layabout/file_upload_spec.rb +12 -0
  44. data/spec/layabout/incoming_webhook_spec.rb +18 -0
  45. data/spec/layabout/layabout_spec.rb +23 -0
  46. data/spec/spec_helper.rb +95 -0
  47. metadata +217 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 616e412288a6c1cc8efb6adcf371f23d636ae4b2
4
+ data.tar.gz: 42c701ea50fb420e3e72b427cbcc6340d919683f
5
+ SHA512:
6
+ metadata.gz: 55db5b1f883b75f510f29f81869411d074daeefad222952d8dd2c265ca1f31d9578f3888cc94be2d422597749a745a3fcf0341afdc642ad71910f8cbd75a22b8
7
+ data.tar.gz: 0f43ac974b215764863f5eb0e74300ebd61fd5aa4d254f936105f0a4cbbbd9a99233410e445d7b0c3c02173c60e958096990de0aed62f64f1c88c48bcc62189b
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ .ruby-version
2
+ coverage/*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - "2.0.0"
4
+ script: bundle exec rspec spec
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :test, :development do
6
+ gem 'pry'
7
+ gem 'simplecov'
8
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,63 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ layabout (0.0.1)
5
+ httpi (~> 2.1.1)
6
+ multipart-post (~> 1.1.0)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ addressable (2.3.6)
12
+ coderay (1.1.0)
13
+ crack (0.4.2)
14
+ safe_yaml (~> 1.0.0)
15
+ diff-lcs (1.2.5)
16
+ docile (1.1.5)
17
+ httpi (2.1.1)
18
+ rack
19
+ rubyntlm (~> 0.3.2)
20
+ method_source (0.8.2)
21
+ multi_json (1.10.1)
22
+ multipart-post (1.1.5)
23
+ pry (0.10.1)
24
+ coderay (~> 1.1.0)
25
+ method_source (~> 0.8.1)
26
+ slop (~> 3.4)
27
+ rack (1.5.2)
28
+ rspec (3.1.0)
29
+ rspec-core (~> 3.1.0)
30
+ rspec-expectations (~> 3.1.0)
31
+ rspec-mocks (~> 3.1.0)
32
+ rspec-core (3.1.4)
33
+ rspec-support (~> 3.1.0)
34
+ rspec-expectations (3.1.1)
35
+ diff-lcs (>= 1.2.0, < 2.0)
36
+ rspec-support (~> 3.1.0)
37
+ rspec-mocks (3.1.1)
38
+ rspec-support (~> 3.1.0)
39
+ rspec-support (3.1.0)
40
+ rubyntlm (0.3.4)
41
+ safe_yaml (1.0.3)
42
+ simplecov (0.9.0)
43
+ docile (~> 1.1.0)
44
+ multi_json
45
+ simplecov-html (~> 0.8.0)
46
+ simplecov-html (0.8.0)
47
+ slop (3.6.0)
48
+ vcr (2.9.3)
49
+ webmock (1.18.0)
50
+ addressable (>= 2.3.6)
51
+ crack (>= 0.3.2)
52
+
53
+ PLATFORMS
54
+ ruby
55
+
56
+ DEPENDENCIES
57
+ bundler (~> 1.3)
58
+ layabout!
59
+ pry
60
+ rspec (~> 3.1.0, >= 3.1.0)
61
+ simplecov
62
+ vcr (~> 2.9.0, >= 2.9.0)
63
+ webmock (~> 1.18.0, >= 1.18.0)
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 James Cook
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,18 @@
1
+ # Layabout - Slack API Toolbelt
2
+
3
+
4
+ ### Configuration
5
+ ```
6
+ Layabout.configure do |config|
7
+ config.team = 'isotope11'
8
+ config.token = 'your-api-token'
9
+ end
10
+ ```
11
+
12
+ ### Usage
13
+
14
+ ```
15
+ Layabout.say('hello world', '#random') # Posts a message
16
+ Layabout.upload('/path/to/a/silly.gif', 'C234546') # You must specify the channel ID ...
17
+ Layabout.channels # Return a list of channels
18
+ ```
data/layabout.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'layabout/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "layabout"
7
+ spec.version = Layabout::VERSION
8
+ spec.authors = ["James Cook"]
9
+ spec.email = ["jcook.rubyist@gmail.com"]
10
+ spec.description = %q{slack.com API toolbelt}
11
+ spec.summary = %q{Chat, upload files, set channel topics, send direct messages, and more via the Slack API}
12
+ spec.homepage = "https://github.com/jamescook/layabout"
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files`.split($/)
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(spec)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_dependency "httpi", "~> 2.1.1"
21
+ spec.add_dependency "multipart-post", "~> 1.1.0"
22
+ spec.add_development_dependency "bundler", "~> 1.3"
23
+ spec.add_development_dependency "rspec", "~> 3.1.0", ">= 3.1.0"
24
+ spec.add_development_dependency "vcr", "~> 2.9.0", ">= 2.9.0"
25
+ spec.add_development_dependency "webmock", "~> 1.18.0", ">= 1.18.0"
26
+ end
@@ -0,0 +1,35 @@
1
+ require 'uri'
2
+ require 'net/http'
3
+ require 'openssl'
4
+ require 'forwardable'
5
+
6
+ module Layabout
7
+ class AuthTest
8
+ extend Forwardable
9
+
10
+ def_delegators :@configuration, :domain, :team, :token
11
+
12
+ def initialize(options={})
13
+ @configuration = ::Layabout.configuration
14
+ end
15
+
16
+ def get
17
+ SlackResponse.new(HTTPI.get(http_request))
18
+ end
19
+
20
+ private
21
+
22
+ def http_request
23
+ HTTPI::Request.new(endpoint.to_s).tap do |httpi|
24
+ httpi.auth.ssl.verify_mode = :peer
25
+ end
26
+ end
27
+
28
+ def endpoint
29
+ domain.tap do |uri|
30
+ uri.path = '/api/auth.test'
31
+ uri.query = "token=#{token}"
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,82 @@
1
+ require 'uri'
2
+ require 'httpi'
3
+ require 'forwardable'
4
+ require_relative '../layabout/slack/channel.rb'
5
+
6
+ # TODO This code was originally using Net::HTTP instead of HTTPI
7
+ # Needs some refactoring
8
+ module Layabout
9
+
10
+ class Channels
11
+ extend Forwardable
12
+
13
+ def_delegators :@configuration, :domain, :team, :token
14
+
15
+ def initialize(options={})
16
+ @configuration = ::Layabout.configuration
17
+ end
18
+
19
+ def list
20
+ process 'channels', SlackResponse.new(HTTPI.get(http_request(list_endpoint)))
21
+ end
22
+
23
+ def info(channel_id)
24
+ process('channel', SlackResponse.new(HTTPI.get(http_request(info_endpoint(channel_id)))))
25
+ end
26
+
27
+ def leave(channel_id)
28
+ SlackResponse.new(HTTPI.get(http_request(leave_endpoint(channel_id))))
29
+ end
30
+
31
+ def join(channel_name)
32
+ SlackResponse.new(HTTPI.get(http_request(join_endpoint(channel_name))))
33
+ end
34
+
35
+ private
36
+
37
+ def process(key, slack_response)
38
+ data = slack_response.body.fetch(key)
39
+ if data.kind_of?(Array)
40
+ return data.map{|json| ::Layabout::Slack::Channel.new(json) }
41
+ else
42
+ return ::Layabout::Slack::Channel.new(data)
43
+ end
44
+ end
45
+
46
+ def http_request(endpoint)
47
+ @http_request ||= HTTPI::Request.new(endpoint.to_s).tap do |httpi|
48
+ httpi.auth.ssl.verify_mode = :peer
49
+ end
50
+ end
51
+
52
+ def join_endpoint(channel_name)
53
+ build_channel_endpoint('join').tap do |uri|
54
+ channel_name.sub!('#', '%23')
55
+ uri.query = uri.query + "&name=#{channel_name}"
56
+ end
57
+ end
58
+
59
+ def leave_endpoint(channel_id)
60
+ build_channel_endpoint('leave').tap do |uri|
61
+ uri.query = uri.query + "&channel=#{channel_id}"
62
+ end
63
+ end
64
+
65
+ def list_endpoint
66
+ build_channel_endpoint 'list'
67
+ end
68
+
69
+ def info_endpoint(channel_id)
70
+ build_channel_endpoint('info').tap do |uri|
71
+ uri.query = uri.query + "&channel=#{channel_id}"
72
+ end
73
+ end
74
+
75
+ def build_channel_endpoint(action)
76
+ domain.tap do |uri|
77
+ uri.path = "/api/channels.#{action}"
78
+ uri.query = "token=#{token}"
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,67 @@
1
+ require 'uri'
2
+ require 'httpi'
3
+ require 'forwardable'
4
+ require 'json'
5
+
6
+ module Layabout
7
+ class Chat
8
+ extend Forwardable
9
+
10
+ def_delegators :@configuration, :domain, :team, :token
11
+
12
+ attr_reader :text, :channel
13
+
14
+ def initialize(options={})
15
+ @text = options.fetch(:text)
16
+ @channel = options.fetch(:channel)
17
+ @username = options[:username]
18
+ @parse = options[:parse]
19
+ @link_names = options[:link_names]
20
+ @attachments = options[:attachments]
21
+ @unfurl_links = options[:unfurl_links]
22
+ @icon_url = options[:icon_url]
23
+ @icon_emoji = options[:icon_emoji]
24
+ @configuration = ::Layabout.configuration
25
+ end
26
+
27
+ def post_message
28
+ http_request.query = build_query
29
+
30
+ SlackResponse.new(HTTPI.get(http_request))
31
+ end
32
+
33
+ private
34
+
35
+ def http_request
36
+ @http_request ||= HTTPI::Request.new(endpoint.to_s).tap do |httpi|
37
+ httpi.auth.ssl.verify_mode = :peer
38
+ end
39
+ end
40
+
41
+ def build_query
42
+ {
43
+ 'channel' => channel,
44
+ 'text' => text,
45
+ 'token' => token
46
+ }.merge(optional_params)
47
+ end
48
+
49
+ def optional_params
50
+ {}.tap do |hash|
51
+ hash['username'] = @username if @username
52
+ hash['parse'] = @parse if @parse
53
+ hash['link_names'] = @link_names if @link_names
54
+ hash['attachments'] = @attachments if @attachments
55
+ hash['unfurl_links'] = @unfurl_links if @unfurl_links
56
+ hash['icon_url'] = @icon_url if @icon_url
57
+ hash['icon_emoji'] = @icon_emoji if @icon_emoji
58
+ end
59
+ end
60
+
61
+ def endpoint
62
+ domain.tap do |uri|
63
+ uri.path = '/api/chat.postMessage'
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,48 @@
1
+ require 'uri'
2
+ require 'httpi'
3
+ require 'forwardable'
4
+ require 'json'
5
+
6
+ module Layabout
7
+ class DeleteChat
8
+ extend Forwardable
9
+
10
+ def_delegators :@configuration, :domain, :team, :token
11
+
12
+ attr_reader :timestamp, :channel
13
+
14
+ def initialize(options={})
15
+ @channel = options.fetch(:channel)
16
+ @timestamp = options.fetch(:timestamp)
17
+ @configuration = ::Layabout.configuration
18
+ end
19
+
20
+ def delete
21
+ http_request.query = build_query
22
+
23
+ SlackResponse.new(HTTPI.get(http_request))
24
+ end
25
+
26
+ private
27
+
28
+ def http_request
29
+ @http_request ||= HTTPI::Request.new(endpoint.to_s).tap do |httpi|
30
+ httpi.auth.ssl.verify_mode = :peer
31
+ end
32
+ end
33
+
34
+ def build_query
35
+ {
36
+ 'channel' => channel,
37
+ 'ts' => timestamp,
38
+ 'token' => token
39
+ }
40
+ end
41
+
42
+ def endpoint
43
+ domain.tap do |uri|
44
+ uri.path = '/api/chat.delete'
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,58 @@
1
+ require 'uri'
2
+ require 'httpi'
3
+ require 'forwardable'
4
+ require_relative '../layabout/slack/file.rb'
5
+
6
+ module Layabout
7
+ class FileList
8
+ extend Forwardable
9
+
10
+ def_delegators :@configuration, :domain, :team, :token
11
+
12
+ def initialize(options={})
13
+ @configuration = ::Layabout.configuration
14
+ @user = options[:user]
15
+ @ts_from = options[:ts_from]
16
+ @ts_to = options[:ts_to]
17
+ @types = options[:types]
18
+ @count = options[:count]
19
+ @page = options[:page]
20
+ end
21
+
22
+ def list
23
+ process 'files', SlackResponse.new(HTTPI.get(http_request(endpoint)))
24
+ end
25
+
26
+ private
27
+
28
+ def process(key, slack_response)
29
+ data = slack_response.body.fetch(key)
30
+ # TODO Wrap this in an object that can be paginated
31
+ return data.map{|json| ::Layabout::Slack::File.new(json) }
32
+ end
33
+
34
+ def http_request(endpoint)
35
+ @http_request ||= HTTPI::Request.new(endpoint.to_s).tap do |httpi|
36
+ httpi.auth.ssl.verify_mode = :peer
37
+ httpi.query = build_query.merge('token' => token)
38
+ end
39
+ end
40
+
41
+ def build_query
42
+ {}.tap do |hash|
43
+ hash['user'] = @user if @user
44
+ hash['ts_from'] = @ts_from if @ts_from
45
+ hash['ts_to'] = @ts_to if @ts_to
46
+ hash['types'] = @types if @types
47
+ hash['count'] = @count if @count
48
+ hash['page'] = @page if @page
49
+ end
50
+ end
51
+
52
+ def endpoint
53
+ domain.tap do |uri|
54
+ uri.path = "/api/files.list"
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,73 @@
1
+ require 'net/http/post/multipart'
2
+ require 'ostruct'
3
+
4
+ module Layabout
5
+ class FileUpload
6
+ extend Forwardable
7
+
8
+ def_delegators :@configuration, :domain, :token
9
+
10
+ attr_reader :filepath, :channels
11
+
12
+ def initialize(options={})
13
+ @configuration = ::Layabout.configuration
14
+ @filepath = options.fetch(:filepath)
15
+ @channels = options.fetch(:channels)
16
+ @filetype = options[:filetype]
17
+ @filename = options[:filename]
18
+ @title = options[:title]
19
+ @initial_comment = options[:initial_comment]
20
+ end
21
+
22
+ def upload
23
+ SlackResponse.new(wrap(http_response))
24
+ end
25
+
26
+ private
27
+
28
+ # HTTPI doesn't support multipart posts. We can work around it by using another gem
29
+ # and handing off something that looks like a HTTPI response
30
+ def wrap(http_response)
31
+ OpenStruct.new.tap do |obj|
32
+ obj.code = http_response.code.to_i
33
+ obj.body = http_response.body
34
+ obj.headers = {}
35
+ http_response.each_header{|k,v| obj.headers[k] = v }
36
+ end
37
+ end
38
+
39
+ def http_response
40
+ req = Net::HTTP::Post::Multipart.new(endpoint.path, params)
41
+ res = Net::HTTP.new(endpoint.host, endpoint.port)
42
+ res.use_ssl = true
43
+ res.request(req)
44
+ end
45
+
46
+ def required_params
47
+ {
48
+ "file" => UploadIO.new(File.new(filepath), "text/plain", "Gemfile"),
49
+ "token" => token,
50
+ "channels" => channels
51
+ }
52
+ end
53
+
54
+ def optional_params
55
+ {}.tap do |hash|
56
+ hash['filetype'] = @filetype if @filetype
57
+ hash['filename'] = @filename if @filename
58
+ hash['title'] = @title if @title
59
+ hash['initial_comment'] = @initial_comment if @initial_comment
60
+ end
61
+ end
62
+
63
+ def params
64
+ required_params.merge(optional_params)
65
+ end
66
+
67
+ def endpoint
68
+ domain.tap do |uri|
69
+ uri.path = '/api/files.upload'
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,21 @@
1
+ require_relative './chat.rb'
2
+ require_relative './channels.rb'
3
+ require_relative './file_upload.rb'
4
+
5
+ module Layabout
6
+ module Helpers
7
+ def say(message, channel, options={})
8
+ options = options.dup.merge(text: message, channel: channel)
9
+ Chat.new(options).post_message
10
+ end
11
+
12
+ def channels(options={})
13
+ Channels.new.list
14
+ end
15
+
16
+ def upload(filepath, channels, options={})
17
+ options = options.dup.merge(filepath: filepath, channels: channels)
18
+ FileUpload.new(options).upload
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,41 @@
1
+ require 'uri'
2
+ require 'httpi'
3
+ require 'forwardable'
4
+ require 'json'
5
+
6
+ module Layabout
7
+ class IncomingWebhook
8
+ extend Forwardable
9
+
10
+ def_delegators :@configuration, :domain, :team
11
+
12
+ attr_reader :token, :message
13
+
14
+ def initialize(options={})
15
+ @token = options.fetch(:token) # The token for Webhooks is not the same as your API token
16
+ @message = options.fetch(:message)
17
+ @configuration = ::Layabout.configuration
18
+ end
19
+
20
+ def post
21
+ http_request.body = {'text' => message}.to_json.to_s
22
+
23
+ SlackResponse.new(HTTPI.post(http_request))
24
+ end
25
+
26
+ private
27
+
28
+ def http_request
29
+ @http_request ||= HTTPI::Request.new(endpoint.to_s).tap do |httpi|
30
+ httpi.auth.ssl.verify_mode = :peer
31
+ end
32
+ end
33
+
34
+ def endpoint
35
+ domain.tap do |uri|
36
+ uri.path = '/services/hooks/incoming-webhook'
37
+ uri.query = "token=#{token}"
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,32 @@
1
+ require 'forwardable'
2
+ require 'ostruct'
3
+
4
+ module Layabout
5
+ module Slack
6
+ class Channel
7
+ extend Forwardable
8
+
9
+ def_delegators :@attributes, :id,
10
+ :name,
11
+ :created,
12
+ :creator,
13
+ :is_archived,
14
+ :is_member,
15
+ :num_members,
16
+ :topic,
17
+ :purpose,
18
+ :members,
19
+ :last_read,
20
+ :latest,
21
+ :unread_count
22
+
23
+ def initialize(attributes={})
24
+ @attributes = OpenStruct.new(attributes)
25
+ end
26
+
27
+ def inspect
28
+ "<Layabout::Slack::Channel id='#{id}' name='#{name}'>"
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,56 @@
1
+ require 'forwardable'
2
+ require 'ostruct'
3
+
4
+ module Layabout
5
+ module Slack
6
+ class File
7
+ extend Forwardable
8
+
9
+ def_delegators :@attributes,
10
+ :id,
11
+ :timestamp,
12
+ :name,
13
+ :title,
14
+ :mimetype,
15
+ :filetype,
16
+ :pretty_type,
17
+ :user,
18
+ :mode,
19
+ :editable,
20
+ :is_external,
21
+ :external_type,
22
+ :size,
23
+ :url,
24
+ :url_download,
25
+ :url_private,
26
+ :url_private_download,
27
+ :thumb_64,
28
+ :thumb_80,
29
+ :thumb_360,
30
+ :thumb_360_gif,
31
+ :thumb_360_w,
32
+ :thumb_360_h,
33
+ :permalink,
34
+ :edit_link,
35
+ :preview,
36
+ :preview_highlight,
37
+ :lines,
38
+ :lines_more,
39
+ :is_public,
40
+ :public_url_shared,
41
+ :channels,
42
+ :groups,
43
+ :initial_comment,
44
+ :num_stars,
45
+ :is_starred
46
+
47
+ def initialize(attributes={})
48
+ @attributes = OpenStruct.new(attributes)
49
+ end
50
+
51
+ def inspect
52
+ "<Layabout::Slack::File id='#{id}' name='#{name}'>"
53
+ end
54
+ end
55
+ end
56
+ end