desk_api 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +5 -0
  5. data/.yardopts +3 -0
  6. data/Gemfile +15 -0
  7. data/Guardfile +5 -0
  8. data/LICENSE +7 -0
  9. data/README.md +185 -0
  10. data/Rakefile +15 -0
  11. data/config.rb +7 -0
  12. data/desk_api.gemspec +36 -0
  13. data/lib/desk/action/create.rb +15 -0
  14. data/lib/desk/action/delete.rb +9 -0
  15. data/lib/desk/action/embedded.rb +12 -0
  16. data/lib/desk/action/field.rb +33 -0
  17. data/lib/desk/action/link.rb +29 -0
  18. data/lib/desk/action/resource.rb +14 -0
  19. data/lib/desk/action/search.rb +15 -0
  20. data/lib/desk/action/update.rb +12 -0
  21. data/lib/desk/client.rb +67 -0
  22. data/lib/desk/configuration.rb +132 -0
  23. data/lib/desk/default.rb +67 -0
  24. data/lib/desk/error/bad_gateway.rb +10 -0
  25. data/lib/desk/error/bad_request.rb +10 -0
  26. data/lib/desk/error/client_error.rb +9 -0
  27. data/lib/desk/error/configuration_error.rb +8 -0
  28. data/lib/desk/error/conflict.rb +10 -0
  29. data/lib/desk/error/forbidden.rb +10 -0
  30. data/lib/desk/error/gateway_timeout.rb +10 -0
  31. data/lib/desk/error/internal_server_error.rb +10 -0
  32. data/lib/desk/error/method_not_allowed.rb +10 -0
  33. data/lib/desk/error/method_not_supported.rb +9 -0
  34. data/lib/desk/error/not_acceptable.rb +10 -0
  35. data/lib/desk/error/not_found.rb +10 -0
  36. data/lib/desk/error/parse_error.rb +9 -0
  37. data/lib/desk/error/parser_error.rb +9 -0
  38. data/lib/desk/error/server_error.rb +9 -0
  39. data/lib/desk/error/service_unavailable.rb +10 -0
  40. data/lib/desk/error/too_many_requests.rb +10 -0
  41. data/lib/desk/error/unauthorized.rb +10 -0
  42. data/lib/desk/error/unprocessable_entity.rb +10 -0
  43. data/lib/desk/error/unsupported_media_type.rb +10 -0
  44. data/lib/desk/error.rb +61 -0
  45. data/lib/desk/rate_limit.rb +26 -0
  46. data/lib/desk/request/retry.rb +51 -0
  47. data/lib/desk/resource/article.rb +10 -0
  48. data/lib/desk/resource/article_translation.rb +8 -0
  49. data/lib/desk/resource/attachment.rb +8 -0
  50. data/lib/desk/resource/case.rb +9 -0
  51. data/lib/desk/resource/company.rb +8 -0
  52. data/lib/desk/resource/customer.rb +9 -0
  53. data/lib/desk/resource/integration_url.rb +9 -0
  54. data/lib/desk/resource/job.rb +7 -0
  55. data/lib/desk/resource/label.rb +9 -0
  56. data/lib/desk/resource/macro.rb +9 -0
  57. data/lib/desk/resource/macro_action.rb +7 -0
  58. data/lib/desk/resource/note.rb +7 -0
  59. data/lib/desk/resource/page.rb +81 -0
  60. data/lib/desk/resource/reply.rb +8 -0
  61. data/lib/desk/resource/topic.rb +9 -0
  62. data/lib/desk/resource/topic_translation.rb +9 -0
  63. data/lib/desk/resource/user_preference.rb +7 -0
  64. data/lib/desk/resource.rb +53 -0
  65. data/lib/desk/resources.json +76 -0
  66. data/lib/desk/response/raise_error.rb +34 -0
  67. data/lib/desk/version.rb +3 -0
  68. data/lib/desk.rb +35 -0
  69. data/spec/cassettes/Desk_Client/_delete/deletes_a_resource.yml +48 -0
  70. data/spec/cassettes/Desk_Client/_get/fetches_resources.yml +55 -0
  71. data/spec/cassettes/Desk_Client/_patch/updates_a_resource.yml +62 -0
  72. data/spec/cassettes/Desk_Client/_post/creates_a_resource.yml +58 -0
  73. data/spec/cassettes/Desk_Error/_from_response/can_be_created_from_a_faraday_response.yml +54 -0
  74. data/spec/cassettes/Desk_Error/_from_response/uses_the_body_message_if_present.yml +54 -0
  75. data/spec/cassettes/Desk_Resource/_by_url/finds_resources_by_url.yml +313 -0
  76. data/spec/cassettes/Desk_Resource/_create/creates_a_new_topic.yml +58 -0
  77. data/spec/cassettes/Desk_Resource/_delete/deletes_a_resource.yml +164 -0
  78. data/spec/cassettes/Desk_Resource/_delete/throws_an_error_deleting_a_non_deletalbe_resource.yml +56 -0
  79. data/spec/cassettes/Desk_Resource/_exec_/can_be_forced_to_reload.yml +313 -0
  80. data/spec/cassettes/Desk_Resource/_exec_/loads_the_current_resource.yml +313 -0
  81. data/spec/cassettes/Desk_Resource/_method_missing/loads_the_resource_to_find_a_suitable_method.yml +313 -0
  82. data/spec/cassettes/Desk_Resource/_method_missing/raises_an_error_if_method_does_not_exist.yml +313 -0
  83. data/spec/cassettes/Desk_Resource/_search/allows_searching_on_search_enabled_resources.yml +54 -0
  84. data/spec/cassettes/Desk_Resource/_update/throws_an_error_updating_a_user.yml +56 -0
  85. data/spec/cassettes/Desk_Resource/_update/updates_a_topic.yml +118 -0
  86. data/spec/cassettes/Desk_Resource_Page/_by_id/loads_the_requested_resource.yml +54 -0
  87. data/spec/cassettes/Desk_Resource_Page/_page/keeps_the_resource_as_loaded.yml +113 -0
  88. data/spec/cassettes/Desk_Resource_Page/_page/returns_the_current_page_and_loads_if_page_not_defined.yml +313 -0
  89. data/spec/cassettes/Desk_Resource_Page/_page/sets_the_resource_to_not_loaded.yml +113 -0
  90. data/spec/desk/client_spec.rb +133 -0
  91. data/spec/desk/configuration_spec.rb +183 -0
  92. data/spec/desk/default_spec.rb +69 -0
  93. data/spec/desk/error_spec.rb +23 -0
  94. data/spec/desk/rate_limit_spec.rb +42 -0
  95. data/spec/desk/request/retry_spec.rb +46 -0
  96. data/spec/desk/resource_spec.rb +119 -0
  97. data/spec/desk/resources/page_spec.rb +64 -0
  98. data/spec/desk_spec.rb +43 -0
  99. data/spec/spec_helper.rb +39 -0
  100. metadata +347 -0
@@ -0,0 +1,53 @@
1
+ require 'desk/action/create'
2
+ require 'desk/action/delete'
3
+ require 'desk/action/embedded'
4
+ require 'desk/action/field'
5
+ require 'desk/action/link'
6
+ require 'desk/action/resource'
7
+ require 'desk/action/search'
8
+ require 'desk/action/update'
9
+
10
+ require 'desk/error/method_not_supported'
11
+
12
+ module Desk
13
+ class Resource
14
+ include Desk::Action::Resource
15
+ include Desk::Action::Link
16
+ include Desk::Action::Field
17
+
18
+ def initialize(client, definition = {}, loaded = false)
19
+ @client, @loaded, @_changed = client, loaded, {}
20
+ setup(definition)
21
+ end
22
+
23
+ def by_url(url)
24
+ definition = client.get(url).body
25
+ resource(definition._links.self['class']).new(client, definition, true)
26
+ end
27
+
28
+ def get_self
29
+ @_links.self
30
+ end
31
+
32
+ protected
33
+ attr_accessor :client, :loaded, :_changed
34
+
35
+ def setup(definition)
36
+ setup_links(definition._links) if definition._links?
37
+ setup_fields(definition)
38
+ self
39
+ end
40
+
41
+ def exec!(reload = false)
42
+ return self if loaded and !reload
43
+ definition, @loaded = client.get(@_links.self.href).body, true
44
+ setup(definition)
45
+ end
46
+
47
+ def method_missing(method, *args, &block)
48
+ self.exec! if !loaded
49
+ raise Desk::Error::MethodNotSupported unless self.respond_to?(method.to_sym)
50
+ self.send(method, *args, &block)
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,76 @@
1
+ {
2
+ "_links": {
3
+ "articles": {
4
+ "href": "/api/v2/articles",
5
+ "class": "page"
6
+ },
7
+ "cases": {
8
+ "href": "/api/v2/cases",
9
+ "class": "page"
10
+ },
11
+ "companies": {
12
+ "href": "/api/v2/companies",
13
+ "class": "page"
14
+ },
15
+ "custom_fields": {
16
+ "href": "/api/v2/custom_fields",
17
+ "class": "page"
18
+ },
19
+ "customers": {
20
+ "href": "/api/v2/customers",
21
+ "class": "page"
22
+ },
23
+ "filters": {
24
+ "href": "/api/v2/filters",
25
+ "class": "page"
26
+ },
27
+ "groups": {
28
+ "href": "/api/v2/groups",
29
+ "class": "page"
30
+ },
31
+ "inbound_mailboxes": {
32
+ "href": "/api/v2/inbound_mailboxes",
33
+ "class": "page"
34
+ },
35
+ "integration_urls": {
36
+ "href": "/api/v2/integration_urls",
37
+ "class": "page"
38
+ },
39
+ "jobs": {
40
+ "href": "/api/v2/jobs",
41
+ "class": "page"
42
+ },
43
+ "labels": {
44
+ "href": "/api/v2/labels",
45
+ "class": "page"
46
+ },
47
+ "macros": {
48
+ "href": "/api/v2/macros",
49
+ "class": "page"
50
+ },
51
+ "rules": {
52
+ "href": "/api/v2/rules",
53
+ "class": "page"
54
+ },
55
+ "site_settings": {
56
+ "href": "/api/v2/site_settings",
57
+ "class": "page"
58
+ },
59
+ "system_message": {
60
+ "href": "/api/v2/system_message",
61
+ "class": "system_message"
62
+ },
63
+ "topics": {
64
+ "href": "/api/v2/topics",
65
+ "class": "page"
66
+ },
67
+ "twitter_accounts": {
68
+ "href": "/api/v2/twitter_accounts",
69
+ "class": "page"
70
+ },
71
+ "users": {
72
+ "href": "/api/v2/users",
73
+ "class": "page"
74
+ }
75
+ }
76
+ }
@@ -0,0 +1,34 @@
1
+ require 'faraday'
2
+ require 'desk/error/bad_gateway'
3
+ require 'desk/error/bad_request'
4
+ require 'desk/error/conflict'
5
+ require 'desk/error/forbidden'
6
+ require 'desk/error/gateway_timeout'
7
+ require 'desk/error/internal_server_error'
8
+ require 'desk/error/method_not_allowed'
9
+ require 'desk/error/not_acceptable'
10
+ require 'desk/error/not_found'
11
+ require 'desk/error/service_unavailable'
12
+ require 'desk/error/too_many_requests'
13
+ require 'desk/error/unauthorized'
14
+ require 'desk/error/unprocessable_entity'
15
+ require 'desk/error/unsupported_media_type'
16
+
17
+ module Desk
18
+ module Response
19
+ class RaiseError < Faraday::Response::Middleware
20
+ def on_complete(env)
21
+ status_code = env[:status].to_i
22
+ error_class = @klass.errors[status_code]
23
+ raise error_class.from_response(env) if error_class
24
+ end
25
+
26
+ def initialize(app, klass)
27
+ @klass = klass
28
+ super(app)
29
+ end
30
+ end
31
+
32
+ Faraday.register_middleware :response, raise_error: lambda { RaiseError}
33
+ end
34
+ end
@@ -0,0 +1,3 @@
1
+ module Desk
2
+ VERSION = '0.1.0'
3
+ end
data/lib/desk.rb ADDED
@@ -0,0 +1,35 @@
1
+ require 'uri'
2
+ require 'json'
3
+ require 'forwardable'
4
+ require 'addressable/uri'
5
+
6
+ require 'hashie/mash'
7
+ require 'active_support/inflector'
8
+
9
+ require 'desk/configuration'
10
+ require 'desk/client'
11
+ require 'desk/version'
12
+
13
+ module Desk
14
+ class << self
15
+ include Desk::Configuration
16
+
17
+ # Delegate to a Desk::Client
18
+ #
19
+ # @return [Desk::Client]
20
+ def client
21
+ return @client if instance_variable_defined?(:@client) && @client.hash == options.hash
22
+ @client = Desk::Client.new(options)
23
+ end
24
+
25
+ def method_missing(method_name, *args, &block)
26
+ return super unless respond_to_missing?(method_name)
27
+ client.send(method_name, *args, &block)
28
+ end
29
+
30
+ def respond_to_missing?(method_name, include_private = false)
31
+ client.respond_to?(method_name, include_private)
32
+ end
33
+ end
34
+ setup
35
+ end
@@ -0,0 +1,48 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: delete
5
+ uri: https://devel.desk.com/api/v2/topics/556401
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept:
11
+ - application/json
12
+ User-Agent:
13
+ - desk.com Ruby Gem v0.1.0
14
+ response:
15
+ status:
16
+ code: 204
17
+ message:
18
+ headers:
19
+ Accept-Ranges:
20
+ - bytes
21
+ Cache-Control:
22
+ - no-cache
23
+ Date:
24
+ - Thu, 15 Aug 2013 21:25:38 GMT
25
+ Status:
26
+ - 204 No Content
27
+ Vary:
28
+ - X-AppVersion
29
+ X-AppVersion:
30
+ - '7.9'
31
+ X-Frame-Options:
32
+ - SAMEORIGIN
33
+ X-Rate-Limit-Limit:
34
+ - '60'
35
+ X-Rate-Limit-Remaining:
36
+ - '59'
37
+ X-Rate-Limit-Reset:
38
+ - '22'
39
+ X-Request-Id:
40
+ - 207b551751f30fa3c1f74de6c8439d47
41
+ Connection:
42
+ - keep-alive
43
+ body:
44
+ encoding: UTF-8
45
+ string: ''
46
+ http_version:
47
+ recorded_at: Thu, 15 Aug 2013 21:25:38 GMT
48
+ recorded_with: VCR 2.5.0
@@ -0,0 +1,55 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://devel.desk.com/api/v2/cases/3014
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept:
11
+ - application/json
12
+ User-Agent:
13
+ - desk.com Ruby Gem v0.1.0
14
+ response:
15
+ status:
16
+ code: 200
17
+ message:
18
+ headers:
19
+ Accept-Ranges:
20
+ - bytes
21
+ Cache-Control:
22
+ - must-revalidate, private, max-age=0
23
+ Content-Type:
24
+ - application/json; charset=utf-8
25
+ Date:
26
+ - Thu, 15 Aug 2013 21:20:31 GMT
27
+ ETag:
28
+ - '"31cb249bf0be971be83b891b995e19f4"'
29
+ Status:
30
+ - 200 OK
31
+ Vary:
32
+ - X-AppVersion
33
+ X-AppVersion:
34
+ - '7.9'
35
+ X-Frame-Options:
36
+ - SAMEORIGIN
37
+ X-Rate-Limit-Limit:
38
+ - '60'
39
+ X-Rate-Limit-Remaining:
40
+ - '58'
41
+ X-Rate-Limit-Reset:
42
+ - '29'
43
+ X-Request-Id:
44
+ - 8b43d4f91183871f761bee73f9bca5a7
45
+ Content-Length:
46
+ - '942'
47
+ Connection:
48
+ - keep-alive
49
+ body:
50
+ encoding: UTF-8
51
+ string: '{"external_id":"","subject":"Testing Quick Case","priority":8,"locked_until":null,"description":"Some
52
+ additional Description regarding this email.","status":"resolved","type":"email","labels":[],"language":"de","active_at":"2013-05-10T19:08:27Z","created_at":"2013-05-10T19:08:10Z","updated_at":"2013-05-10T19:08:10Z","received_at":null,"custom_fields":{"my_new_custom_field":null,"my_new_number_field":null,"my_new_date_field":null,"my_new_boolean_field":null,"my_new_list_field":null},"_links":{"self":{"href":"/api/v2/cases/3014","class":"case"},"message":{"href":"/api/v2/cases/3014/message","class":"email"},"customer":{"href":"/api/v2/customers/37823480","class":"customer"},"assigned_user":null,"assigned_group":null,"locked_by":null,"replies":{"href":"/api/v2/cases/3014/replies","class":"reply"},"notes":{"href":"/api/v2/cases/3014/notes","class":"note"},"attachments":{"href":"/api/v2/cases/3014/attachments","class":"attachment"}}}'
53
+ http_version:
54
+ recorded_at: Thu, 15 Aug 2013 21:20:31 GMT
55
+ recorded_with: VCR 2.5.0
@@ -0,0 +1,62 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: patch
5
+ uri: https://devel.desk.com/api/v2/topics/556402
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"name":"Test Updated Topic"}'
9
+ headers:
10
+ Accept:
11
+ - application/json
12
+ User-Agent:
13
+ - desk.com Ruby Gem v0.1.0
14
+ Content-Type:
15
+ - application/json
16
+ response:
17
+ status:
18
+ code: 200
19
+ message:
20
+ headers:
21
+ Cache-Control:
22
+ - max-age=0, private, must-revalidate
23
+ Content-Type:
24
+ - application/json; charset=utf-8
25
+ Date:
26
+ - Thu, 15 Aug 2013 21:26:17 GMT
27
+ ETag:
28
+ - '"02ad91e6c4bff038228c0649f84e02f2"'
29
+ Server:
30
+ - nginx
31
+ Status:
32
+ - 200 OK
33
+ Vary:
34
+ - X-AppVersion
35
+ X-AppVersion:
36
+ - '7.9'
37
+ X-Frame-Options:
38
+ - SAMEORIGIN
39
+ X-Rack-Cache:
40
+ - invalidate, pass
41
+ X-Rate-Limit-Limit:
42
+ - '60'
43
+ X-Rate-Limit-Remaining:
44
+ - '59'
45
+ X-Rate-Limit-Reset:
46
+ - '43'
47
+ X-Request-Id:
48
+ - 7f096fa617be76a27a19e8681eb4ce1c
49
+ X-Runtime:
50
+ - '0.109308'
51
+ X-UA-Compatible:
52
+ - IE=Edge,chrome=1
53
+ Content-Length:
54
+ - '408'
55
+ Connection:
56
+ - keep-alive
57
+ body:
58
+ encoding: UTF-8
59
+ string: '{"name":"Test Updated Topic","description":null,"position":2,"allow_questions":true,"in_support_center":null,"created_at":"2013-08-14T19:37:08Z","updated_at":"2013-08-15T21:26:17Z","_links":{"self":{"href":"/api/v2/topics/556402","class":"topic"},"articles":{"href":"/api/v2/topics/556402/articles","class":"article"},"translations":{"href":"/api/v2/topics/556402/translations","class":"topic_translation"}}}'
60
+ http_version:
61
+ recorded_at: Thu, 15 Aug 2013 21:26:17 GMT
62
+ recorded_with: VCR 2.5.0
@@ -0,0 +1,58 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://devel.desk.com/api/v2/topics
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"name":"Test Topic"}'
9
+ headers:
10
+ Accept:
11
+ - application/json
12
+ User-Agent:
13
+ - desk.com Ruby Gem v0.1.0
14
+ Content-Type:
15
+ - application/json
16
+ response:
17
+ status:
18
+ code: 201
19
+ message:
20
+ headers:
21
+ Accept-Ranges:
22
+ - bytes
23
+ Cache-Control:
24
+ - max-age=0, private, must-revalidate
25
+ Content-Type:
26
+ - application/json; charset=utf-8
27
+ Date:
28
+ - Thu, 15 Aug 2013 21:20:31 GMT
29
+ ETag:
30
+ - '"3c4f0bfe1c766352a73767947ef10d16"'
31
+ Location:
32
+ - https://devel.desk.com/api/v2/topics/556907
33
+ Status:
34
+ - 201 Created
35
+ Vary:
36
+ - X-AppVersion
37
+ X-AppVersion:
38
+ - '7.9'
39
+ X-Frame-Options:
40
+ - SAMEORIGIN
41
+ X-Rate-Limit-Limit:
42
+ - '60'
43
+ X-Rate-Limit-Remaining:
44
+ - '57'
45
+ X-Rate-Limit-Reset:
46
+ - '29'
47
+ X-Request-Id:
48
+ - 5674ba3810d8890b8a42aee61fd07310
49
+ Content-Length:
50
+ - '400'
51
+ Connection:
52
+ - keep-alive
53
+ body:
54
+ encoding: UTF-8
55
+ string: '{"name":"Test Topic","description":null,"position":4,"allow_questions":true,"in_support_center":null,"created_at":"2013-08-15T21:20:31Z","updated_at":"2013-08-15T21:20:31Z","_links":{"self":{"href":"/api/v2/topics/556907","class":"topic"},"articles":{"href":"/api/v2/topics/556907/articles","class":"article"},"translations":{"href":"/api/v2/topics/556907/translations","class":"topic_translation"}}}'
56
+ http_version:
57
+ recorded_at: Thu, 15 Aug 2013 21:20:31 GMT
58
+ recorded_with: VCR 2.5.0
@@ -0,0 +1,54 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://devel.desk.com/api/v2/articles
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"subject":"Testing","body":"Testing"}'
9
+ headers:
10
+ Accept:
11
+ - application/json
12
+ User-Agent:
13
+ - desk.com Ruby Gem v0.1.0
14
+ Content-Type:
15
+ - application/json
16
+ response:
17
+ status:
18
+ code: 422
19
+ message:
20
+ headers:
21
+ Accept-Ranges:
22
+ - bytes
23
+ Cache-Control:
24
+ - no-cache
25
+ Content-Type:
26
+ - application/json; charset=utf-8
27
+ Date:
28
+ - Thu, 15 Aug 2013 21:20:33 GMT
29
+ Status:
30
+ - 422 Unprocessable Entity
31
+ Vary:
32
+ - X-AppVersion
33
+ X-AppVersion:
34
+ - '7.9'
35
+ X-Frame-Options:
36
+ - SAMEORIGIN
37
+ X-Rate-Limit-Limit:
38
+ - '60'
39
+ X-Rate-Limit-Remaining:
40
+ - '41'
41
+ X-Rate-Limit-Reset:
42
+ - '27'
43
+ X-Request-Id:
44
+ - ea7ad37529e40967a818f50ff549a92f
45
+ Content-Length:
46
+ - '71'
47
+ Connection:
48
+ - keep-alive
49
+ body:
50
+ encoding: UTF-8
51
+ string: '{"message":"Validation Failed","errors":{"_links":{"topic":["blank"]}}}'
52
+ http_version:
53
+ recorded_at: Thu, 15 Aug 2013 21:20:33 GMT
54
+ recorded_with: VCR 2.5.0
@@ -0,0 +1,54 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://devel.desk.com/api/v2/articles
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"subject":"Testing","body":"Testing"}'
9
+ headers:
10
+ Accept:
11
+ - application/json
12
+ User-Agent:
13
+ - desk.com Ruby Gem v0.1.0
14
+ Content-Type:
15
+ - application/json
16
+ response:
17
+ status:
18
+ code: 422
19
+ message:
20
+ headers:
21
+ Accept-Ranges:
22
+ - bytes
23
+ Cache-Control:
24
+ - no-cache
25
+ Content-Type:
26
+ - application/json; charset=utf-8
27
+ Date:
28
+ - Thu, 15 Aug 2013 21:20:34 GMT
29
+ Status:
30
+ - 422 Unprocessable Entity
31
+ Vary:
32
+ - X-AppVersion
33
+ X-AppVersion:
34
+ - '7.9'
35
+ X-Frame-Options:
36
+ - SAMEORIGIN
37
+ X-Rate-Limit-Limit:
38
+ - '60'
39
+ X-Rate-Limit-Remaining:
40
+ - '40'
41
+ X-Rate-Limit-Reset:
42
+ - '26'
43
+ X-Request-Id:
44
+ - 9329fb9e911477d8a2527a0fc833461a
45
+ Content-Length:
46
+ - '71'
47
+ Connection:
48
+ - keep-alive
49
+ body:
50
+ encoding: UTF-8
51
+ string: '{"message":"Validation Failed","errors":{"_links":{"topic":["blank"]}}}'
52
+ http_version:
53
+ recorded_at: Thu, 15 Aug 2013 21:20:34 GMT
54
+ recorded_with: VCR 2.5.0