typetalk 0.0.1

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.
Files changed (89) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/.rspec +4 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +215 -0
  7. data/Rakefile +7 -0
  8. data/lib/typetalk.rb +36 -0
  9. data/lib/typetalk/api.rb +49 -0
  10. data/lib/typetalk/api/auth.rb +43 -0
  11. data/lib/typetalk/api/mention.rb +28 -0
  12. data/lib/typetalk/api/message.rb +105 -0
  13. data/lib/typetalk/api/notification.rb +77 -0
  14. data/lib/typetalk/api/topic.rb +56 -0
  15. data/lib/typetalk/api/user.rb +17 -0
  16. data/lib/typetalk/connection.rb +31 -0
  17. data/lib/typetalk/error.rb +7 -0
  18. data/lib/typetalk/version.rb +3 -0
  19. data/spec/cassettes/Typetalk_Api_Auth/_get_access_token/should_get_the_correct_resource_by_authorization_code.yml +40 -0
  20. data/spec/cassettes/Typetalk_Api_Auth/_get_access_token/should_get_the_correct_resource_by_client_credentials.yml +40 -0
  21. data/spec/cassettes/Typetalk_Api_Auth/_get_access_token/should_get_the_correct_resource_by_client_credentials_when_scope_changed.yml +40 -0
  22. data/spec/cassettes/Typetalk_Api_Auth/_get_access_token/should_raise_error_when_authorization_code_is_wrong.yml +40 -0
  23. data/spec/cassettes/Typetalk_Api_Auth/_get_access_token/should_raise_error_when_client_id_is_wrong.yml +40 -0
  24. data/spec/cassettes/Typetalk_Api_Auth/_get_access_token/should_raise_error_when_client_secret_is_wrong.yml +40 -0
  25. data/spec/cassettes/Typetalk_Api_Auth/_get_access_token/should_raise_error_when_redirect_uri_mismatch.yml +40 -0
  26. data/spec/cassettes/Typetalk_Api_Mention/_get_mentions/should_get_the_correct_resource.yml +85 -0
  27. data/spec/cassettes/Typetalk_Api_Mention/_get_mentions/should_get_the_correct_resource_till_mention.yml +83 -0
  28. data/spec/cassettes/Typetalk_Api_Mention/_get_mentions/should_get_the_unread_resource.yml +83 -0
  29. data/spec/cassettes/Typetalk_Api_Mention/_read_mention/should_get_the_correct_resource.yml +83 -0
  30. data/spec/cassettes/Typetalk_Api_Mention/_read_mention/should_raise_error_when_mention_id_is_wrong.yml +73 -0
  31. data/spec/cassettes/Typetalk_Api_Message/_get_message/should_get_the_correct_resource.yml +129 -0
  32. data/spec/cassettes/Typetalk_Api_Message/_get_message/should_raise_error_when_post_id_is_wrong.yml +71 -0
  33. data/spec/cassettes/Typetalk_Api_Message/_get_message/should_raise_error_when_topic_id_is_wrong.yml +71 -0
  34. data/spec/cassettes/Typetalk_Api_Message/_like_message/should_get_the_correct_resource.yml +161 -0
  35. data/spec/cassettes/Typetalk_Api_Message/_like_message/should_raise_error_when_post_id_is_wrong.yml +73 -0
  36. data/spec/cassettes/Typetalk_Api_Message/_post_message/should_get_the_correct_resource.yml +85 -0
  37. data/spec/cassettes/Typetalk_Api_Message/_post_message/should_get_the_correct_resource_for_attachments.yml +536 -0
  38. data/spec/cassettes/Typetalk_Api_Message/_post_message/should_get_the_correct_resource_for_reply.yml +130 -0
  39. data/spec/cassettes/Typetalk_Api_Message/_post_message/should_get_the_correct_resource_for_talks.yml +88 -0
  40. data/spec/cassettes/Typetalk_Api_Message/_post_message/should_raise_error_when_topic_id_is_wrong.yml +73 -0
  41. data/spec/cassettes/Typetalk_Api_Message/_read_message/should_get_the_correct_resource.yml +171 -0
  42. data/spec/cassettes/Typetalk_Api_Message/_read_message/should_get_the_correct_resource_till_post.yml +171 -0
  43. data/spec/cassettes/Typetalk_Api_Message/_read_message/should_raise_error_when_post_id_is_wrong.yml +73 -0
  44. data/spec/cassettes/Typetalk_Api_Message/_remove_message/should_get_the_correct_resource.yml +199 -0
  45. data/spec/cassettes/Typetalk_Api_Message/_remove_message/should_raise_error_when_post_id_is_wrong.yml +71 -0
  46. data/spec/cassettes/Typetalk_Api_Message/_unlike_message/should_get_the_correct_resource.yml +200 -0
  47. data/spec/cassettes/Typetalk_Api_Message/_unlike_message/should_raise_error_when_post_id_is_wrong.yml +71 -0
  48. data/spec/cassettes/Typetalk_Api_Message/_upload_attachment/should_get_the_correct_resource.yml +258 -0
  49. data/spec/cassettes/Typetalk_Api_Message/_upload_attachment/should_raise_error_when_topic_id_is_wrong.yml +250 -0
  50. data/spec/cassettes/Typetalk_Api_Notification/_accept_team/should_get_the_correct_resource.yml +119 -0
  51. data/spec/cassettes/Typetalk_Api_Notification/_accept_team/should_raise_error_when_invite_team_id_is_wrong.yml +73 -0
  52. data/spec/cassettes/Typetalk_Api_Notification/_accept_team/should_raise_error_when_team_id_is_wrong.yml +73 -0
  53. data/spec/cassettes/Typetalk_Api_Notification/_accept_topic/should_get_the_correct_resource.yml +120 -0
  54. data/spec/cassettes/Typetalk_Api_Notification/_accept_topic/should_raise_error_when_invite_topic_id_is_wrong.yml +73 -0
  55. data/spec/cassettes/Typetalk_Api_Notification/_accept_topic/should_raise_error_when_topic_id_is_wrong.yml +73 -0
  56. data/spec/cassettes/Typetalk_Api_Notification/_decline_team/should_get_the_correct_resource.yml +118 -0
  57. data/spec/cassettes/Typetalk_Api_Notification/_decline_team/should_raise_error_when_invite_team_id_is_wrong.yml +73 -0
  58. data/spec/cassettes/Typetalk_Api_Notification/_decline_team/should_raise_error_when_team_id_is_wrong.yml +73 -0
  59. data/spec/cassettes/Typetalk_Api_Notification/_decline_topic/should_get_the_correct_resource.yml +120 -0
  60. data/spec/cassettes/Typetalk_Api_Notification/_decline_topic/should_raise_error_when_invite_topic_id_is_wrong.yml +73 -0
  61. data/spec/cassettes/Typetalk_Api_Notification/_decline_topic/should_raise_error_when_topic_id_is_wrong.yml +73 -0
  62. data/spec/cassettes/Typetalk_Api_Notification/_get_notifications/should_get_the_correct_resource.yml +101 -0
  63. data/spec/cassettes/Typetalk_Api_Notification/_get_notifications_status/should_get_the_correct_resource.yml +79 -0
  64. data/spec/cassettes/Typetalk_Api_Notification/_read_notifications/should_get_the_correct_resource.yml +81 -0
  65. data/spec/cassettes/Typetalk_Api_Topic/_favorite_topic/should_get_the_correct_resource.yml +82 -0
  66. data/spec/cassettes/Typetalk_Api_Topic/_favorite_topic/should_raise_error_when_topic_id_is_wrong.yml +73 -0
  67. data/spec/cassettes/Typetalk_Api_Topic/_get_topic/should_get_the_correct_backward_resource.yml +85 -0
  68. data/spec/cassettes/Typetalk_Api_Topic/_get_topic/should_get_the_correct_forward_resource.yml +84 -0
  69. data/spec/cassettes/Typetalk_Api_Topic/_get_topic/should_get_the_correct_resource.yml +88 -0
  70. data/spec/cassettes/Typetalk_Api_Topic/_get_topic/should_raise_error_when_topic_id_is_wrong.yml +71 -0
  71. data/spec/cassettes/Typetalk_Api_Topic/_get_topic_members/should_get_the_correct_resource.yml +81 -0
  72. data/spec/cassettes/Typetalk_Api_Topic/_get_topic_members/should_raise_error_when_topic_id_is_wrong.yml +71 -0
  73. data/spec/cassettes/Typetalk_Api_Topic/_get_topics/should_get_the_correct_resource.yml +83 -0
  74. data/spec/cassettes/Typetalk_Api_Topic/_unfavorite_topic/should_get_the_correct_resource.yml +80 -0
  75. data/spec/cassettes/Typetalk_Api_Topic/_unfavorite_topic/should_raise_error_when_topic_id_is_wrong.yml +71 -0
  76. data/spec/cassettes/Typetalk_Api_User/_get_profile/should_get_the_correct_resource.yml +81 -0
  77. data/spec/cassettes/Typetalk_Api_User/_get_profile/should_raise_error_when_access_token_is_wrong.yml +73 -0
  78. data/spec/cassettes/Typetalk_Api_User/_get_profile/should_raise_error_when_scope_is_wrong.yml +73 -0
  79. data/spec/fixtures/attachments/logo_cacoo.jpg +0 -0
  80. data/spec/fixtures/attachments/logo_typetalk.jpg +0 -0
  81. data/spec/spec_helper.rb +36 -0
  82. data/spec/typetalk/api/auth_spec.rb +81 -0
  83. data/spec/typetalk/api/mention_spec.rb +73 -0
  84. data/spec/typetalk/api/message_spec.rb +232 -0
  85. data/spec/typetalk/api/notification_spec.rb +200 -0
  86. data/spec/typetalk/api/topic_spec.rb +150 -0
  87. data/spec/typetalk/api/user_spec.rb +27 -0
  88. data/typetalk.gemspec +33 -0
  89. metadata +326 -0
@@ -0,0 +1,105 @@
1
+ require 'mime/types'
2
+
3
+ module Typetalk
4
+ class Api
5
+
6
+ module Message
7
+
8
+ def post_message(topic_id, message, token:nil, reply_to:nil, file_keys:nil, talk_ids:nil)
9
+ response = connection.post do |req|
10
+ req.url "#{endpoint}/topics/#{topic_id}"
11
+ req.params[:access_token] = token || access_token
12
+ body = {}
13
+ body[:message] = message
14
+ body[:replyTo] = reply_to unless reply_to.nil?
15
+ body.merge! to_request_params('fileKeys', file_keys)
16
+ body.merge! to_request_params('talkIds', talk_ids)
17
+ req.body = body
18
+ end
19
+ parse_response(response)
20
+ end
21
+
22
+
23
+ def upload_attachment(topic_id, file, token:nil)
24
+ raise InvalidFileSize if File.size(file) > 10485760 # > 10MB
25
+
26
+ response = connection(multipart:true).post do |req|
27
+ req.url "#{endpoint}/topics/#{topic_id}/attachments"
28
+ req.params[:access_token] = token || access_token
29
+ req.body = { file: Faraday::UploadIO.new(file, MIME::Types.type_for(file).first.to_s) }
30
+ end
31
+ parse_response(response)
32
+ end
33
+
34
+
35
+ def get_message(topic_id, post_id, token:nil)
36
+ response = connection.get do |req|
37
+ req.url "#{endpoint}/topics/#{topic_id}/posts/#{post_id}"
38
+ req.params[:access_token] = token || access_token
39
+ end
40
+ parse_response(response)
41
+ end
42
+
43
+
44
+ def remove_message(topic_id, post_id, token:nil)
45
+ response = connection.delete do |req|
46
+ req.url "#{endpoint}/topics/#{topic_id}/posts/#{post_id}"
47
+ req.params[:access_token] = token || access_token
48
+ end
49
+ parse_response(response)
50
+ response.status == 200
51
+ end
52
+
53
+
54
+ def like_message(topic_id, post_id, token:nil)
55
+ response = connection.post do |req|
56
+ req.url "#{endpoint}/topics/#{topic_id}/posts/#{post_id}/like"
57
+ req.params[:access_token] = token || access_token
58
+ end
59
+ parse_response(response)
60
+ end
61
+
62
+
63
+ def unlike_message(topic_id, post_id, token:nil)
64
+ response = connection.delete do |req|
65
+ req.url "#{endpoint}/topics/#{topic_id}/posts/#{post_id}/like"
66
+ req.params[:access_token] = token || access_token
67
+ end
68
+ parse_response(response)
69
+ end
70
+
71
+
72
+ def read_message(topic_id, post_id=nil, token:nil)
73
+ response = connection.post do |req|
74
+ req.url "#{endpoint}/bookmark/save"
75
+ req.params[:access_token] = token || access_token
76
+ body = {}
77
+ body[:topicId] = topic_id
78
+ body[:postId] = post_id unless post_id.nil?
79
+ req.body = body
80
+ end
81
+ parse_response(response)
82
+ end
83
+
84
+
85
+
86
+ private
87
+ def to_request_params(key, values)
88
+ params = {}
89
+ unless values.nil?
90
+ if values.is_a?(Array)
91
+ values.each_with_index do |k, i|
92
+ break if i > 4
93
+ params["#{key}[#{i}]"] = k.to_s
94
+ end
95
+ else
96
+ params["#{key}[0]"] = values.to_s
97
+ end
98
+ end
99
+ params
100
+ end
101
+
102
+ end
103
+
104
+ end
105
+ end
@@ -0,0 +1,77 @@
1
+ module Typetalk
2
+ class Api
3
+
4
+ module Notification
5
+
6
+ def get_notifications(token:nil)
7
+ response = connection.get do |req|
8
+ req.url "#{endpoint}/notifications"
9
+ req.params[:access_token] = token || access_token
10
+ end
11
+ parse_response(response)
12
+ end
13
+
14
+
15
+ def get_notifications_status(token:nil)
16
+ response = connection.get do |req|
17
+ req.url "#{endpoint}/notifications/status"
18
+ req.params[:access_token] = token || access_token
19
+ end
20
+ parse_response(response)
21
+ end
22
+
23
+
24
+ def read_notifications(token:nil)
25
+ response = connection.put do |req|
26
+ req.url "#{endpoint}/notifications/open"
27
+ req.params[:access_token] = token || access_token
28
+ end
29
+ parse_response(response)
30
+ end
31
+
32
+
33
+
34
+
35
+
36
+ def accept_team(team_id, invite_team_id, token:nil)
37
+ response = connection.post do |req|
38
+ req.url "#{endpoint}/teams/#{team_id}/members/invite/#{invite_team_id}/accept"
39
+ req.params[:access_token] = token || access_token
40
+ end
41
+ parse_response(response)
42
+ end
43
+
44
+
45
+ def decline_team(team_id, invite_team_id, token:nil)
46
+ response = connection.post do |req|
47
+ req.url "#{endpoint}/teams/#{team_id}/members/invite/#{invite_team_id}/decline"
48
+ req.params[:access_token] = token || access_token
49
+ end
50
+ parse_response(response)
51
+ end
52
+
53
+
54
+
55
+
56
+
57
+ def accept_topic(topic_id, invite_topic_id, token:nil)
58
+ response = connection.post do |req|
59
+ req.url "#{endpoint}/topics/#{topic_id}/members/invite/#{invite_topic_id}/accept"
60
+ req.params[:access_token] = token || access_token
61
+ end
62
+ parse_response(response)
63
+ end
64
+
65
+
66
+ def decline_topic(topic_id, invite_topic_id, token:nil)
67
+ response = connection.post do |req|
68
+ req.url "#{endpoint}/topics/#{topic_id}/members/invite/#{invite_topic_id}/decline"
69
+ req.params[:access_token] = token || access_token
70
+ end
71
+ parse_response(response)
72
+ end
73
+
74
+ end
75
+
76
+ end
77
+ end
@@ -0,0 +1,56 @@
1
+ module Typetalk
2
+ class Api
3
+
4
+ module Topic
5
+
6
+ def get_topics(token:nil)
7
+ response = connection.get do |req|
8
+ req.url "#{endpoint}/topics"
9
+ req.params[:access_token] = token || access_token
10
+ end
11
+ parse_response(response)
12
+ end
13
+
14
+
15
+ def get_topic(topic_id, token:nil, count:nil, from:nil, direction:nil)
16
+ response = connection.get do |req|
17
+ req.url "#{endpoint}/topics/#{topic_id}"
18
+ req.params[:access_token] = token || access_token
19
+ req.params[:count] = count unless count.nil?
20
+ req.params[:from] = from unless from.nil?
21
+ req.params[:direction] = direction unless direction.nil?
22
+ end
23
+ parse_response(response)
24
+ end
25
+
26
+
27
+ def get_topic_members(topic_id, token:nil)
28
+ response = connection.get do |req|
29
+ req.url "#{endpoint}/topics/#{topic_id}/members/status"
30
+ req.params[:access_token] = token || access_token
31
+ end
32
+ parse_response(response)
33
+ end
34
+
35
+
36
+ def favorite_topic(topic_id, token:nil)
37
+ response = connection.post do |req|
38
+ req.url "#{endpoint}/topics/#{topic_id}/favorite"
39
+ req.params[:access_token] = token || access_token
40
+ end
41
+ parse_response(response)
42
+ end
43
+
44
+
45
+ def unfavorite_topic(topic_id, token:nil)
46
+ response = connection.delete do |req|
47
+ req.url "#{endpoint}/topics/#{topic_id}/favorite"
48
+ req.params[:access_token] = token || access_token
49
+ end
50
+ parse_response(response)
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+ end
@@ -0,0 +1,17 @@
1
+ module Typetalk
2
+ class Api
3
+
4
+ module User
5
+
6
+ def get_profile(token:nil)
7
+ response = connection.get do |req|
8
+ req.url "#{endpoint}/profile"
9
+ req.params[:access_token] = token || access_token
10
+ end
11
+ parse_response(response)
12
+ end
13
+
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,31 @@
1
+ require 'faraday'
2
+
3
+ module Typetalk
4
+
5
+ module Connection
6
+ private
7
+
8
+ def endpoint
9
+ Typetalk.config.endpoint
10
+ end
11
+
12
+ def connection_options
13
+ {
14
+ :headers => {'Accept' => 'application/json; charset=utf-8', 'User-Agent' => "Typetalk Rubygem #{Typetalk::VERSION}"},
15
+ :proxy => Typetalk.config.proxy,
16
+ }
17
+ end
18
+
19
+ def connection(multipart:false)
20
+ Faraday.new(connection_options) do |conn|
21
+ conn.request :multipart if multipart
22
+ conn.use Faraday::Request::UrlEncoded
23
+ conn.use Faraday::Adapter::NetHttp
24
+ # conn.use Faraday::Response::ParseJson
25
+ # conn.use Faraday::Response::Logger
26
+ end
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -0,0 +1,7 @@
1
+ module Typetalk
2
+ class Unauthorized < StandardError; end
3
+ class InvalidToken < StandardError; end
4
+ class InvalidRequest < StandardError; end
5
+ class InvalidFileSize < StandardError; end
6
+ class NotFound < StandardError; end
7
+ end
@@ -0,0 +1,3 @@
1
+ module Typetalk
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,40 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://typetalk.in/oauth2/access_token
6
+ body:
7
+ encoding: UTF-8
8
+ string: client_id=(CLIENT_ID)&client_secret=(CLIENT_SECRET)&code=(AUTHORIZATION_CODE)&grant_type=authorization_code&redirect_uri=http%3A%2F%2Fdummy%2F&scope=topic.read%2Ctopic.post%2Cmy
9
+ headers:
10
+ Accept:
11
+ - application/json; charset=utf-8
12
+ User-Agent:
13
+ - Typetalk Rubygem 0.0.1
14
+ Content-Type:
15
+ - application/x-www-form-urlencoded
16
+ Accept-Encoding:
17
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
18
+ response:
19
+ status:
20
+ code: 200
21
+ message: OK
22
+ headers:
23
+ Server:
24
+ - nginx
25
+ Date:
26
+ - Thu, 15 May 2014 05:41:51 GMT
27
+ Content-Type:
28
+ - application/json; charset=utf-8
29
+ Transfer-Encoding:
30
+ - chunked
31
+ Connection:
32
+ - keep-alive
33
+ Strict-Transport-Security:
34
+ - max-age=2592000
35
+ body:
36
+ encoding: UTF-8
37
+ string: '{"access_token":"(ACCESS_TOKEN)","expires_in":3600,"scope":"topic.read,topic.post,my","refresh_token":"(REFRESH_TOKEN)","token_type":"Bearer"}'
38
+ http_version:
39
+ recorded_at: Thu, 15 May 2014 05:41:51 GMT
40
+ recorded_with: VCR 2.9.0
@@ -0,0 +1,40 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://typetalk.in/oauth2/access_token
6
+ body:
7
+ encoding: UTF-8
8
+ string: client_id=(CLIENT_ID)&client_secret=(CLIENT_SECRET)&grant_type=client_credentials&scope=topic.read%2Ctopic.post%2Cmy
9
+ headers:
10
+ Accept:
11
+ - application/json; charset=utf-8
12
+ User-Agent:
13
+ - Typetalk Rubygem 0.0.1
14
+ Content-Type:
15
+ - application/x-www-form-urlencoded
16
+ Accept-Encoding:
17
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
18
+ response:
19
+ status:
20
+ code: 200
21
+ message: OK
22
+ headers:
23
+ Server:
24
+ - nginx
25
+ Date:
26
+ - Thu, 15 May 2014 05:27:29 GMT
27
+ Content-Type:
28
+ - application/json; charset=utf-8
29
+ Transfer-Encoding:
30
+ - chunked
31
+ Connection:
32
+ - keep-alive
33
+ Strict-Transport-Security:
34
+ - max-age=2592000
35
+ body:
36
+ encoding: UTF-8
37
+ string: '{"access_token":"(ACCESS_TOKEN)","expires_in":3600,"scope":"topic.read,topic.post,my","refresh_token":"(REFRESH_TOKEN)","token_type":"Bearer"}'
38
+ http_version:
39
+ recorded_at: Thu, 15 May 2014 05:27:29 GMT
40
+ recorded_with: VCR 2.9.0
@@ -0,0 +1,40 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://typetalk.in/oauth2/access_token
6
+ body:
7
+ encoding: UTF-8
8
+ string: client_id=(CLIENT_ID)&client_secret=(CLIENT_SECRET)&grant_type=client_credentials&scope=my
9
+ headers:
10
+ Accept:
11
+ - application/json; charset=utf-8
12
+ User-Agent:
13
+ - Typetalk Rubygem 0.0.1
14
+ Content-Type:
15
+ - application/x-www-form-urlencoded
16
+ Accept-Encoding:
17
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
18
+ response:
19
+ status:
20
+ code: 200
21
+ message: OK
22
+ headers:
23
+ Server:
24
+ - nginx
25
+ Date:
26
+ - Thu, 15 May 2014 05:27:30 GMT
27
+ Content-Type:
28
+ - application/json; charset=utf-8
29
+ Transfer-Encoding:
30
+ - chunked
31
+ Connection:
32
+ - keep-alive
33
+ Strict-Transport-Security:
34
+ - max-age=2592000
35
+ body:
36
+ encoding: UTF-8
37
+ string: '{"access_token":"(ACCESS_TOKEN)","expires_in":3600,"scope":"my","refresh_token":"(REFRESH_TOKEN)","token_type":"Bearer"}'
38
+ http_version:
39
+ recorded_at: Thu, 15 May 2014 05:27:30 GMT
40
+ recorded_with: VCR 2.9.0
@@ -0,0 +1,40 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://typetalk.in/oauth2/access_token
6
+ body:
7
+ encoding: UTF-8
8
+ string: client_id=(CLIENT_ID)&client_secret=(CLIENT_SECRET)&code=(AUTHORIZATION_CODE)&grant_type=authorization_code&redirect_uri=http%3A%2F%2Fdummy%2F&scope=topic.read%2Ctopic.post%2Cmy
9
+ headers:
10
+ Accept:
11
+ - application/json; charset=utf-8
12
+ User-Agent:
13
+ - Typetalk Rubygem 0.0.1
14
+ Content-Type:
15
+ - application/x-www-form-urlencoded
16
+ Accept-Encoding:
17
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
18
+ response:
19
+ status:
20
+ code: 401
21
+ message: Unauthorized
22
+ headers:
23
+ Server:
24
+ - nginx
25
+ Date:
26
+ - Thu, 15 May 2014 05:56:36 GMT
27
+ Content-Type:
28
+ - application/json; charset=utf-8
29
+ Content-Length:
30
+ - '48'
31
+ Connection:
32
+ - keep-alive
33
+ Www-Authenticate:
34
+ - Bearer error="invalid_grant"
35
+ body:
36
+ encoding: UTF-8
37
+ string: '{"error":"invalid_grant","error_description":""}'
38
+ http_version:
39
+ recorded_at: Thu, 15 May 2014 05:56:36 GMT
40
+ recorded_with: VCR 2.9.0