desk_api 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +49 -34
- data/config.rb +1 -1
- data/desk_api.gemspec +3 -3
- data/lib/desk.rb +1 -35
- data/lib/desk_api.rb +35 -0
- data/lib/{desk → desk_api}/action/create.rb +1 -1
- data/lib/{desk → desk_api}/action/delete.rb +1 -1
- data/lib/{desk → desk_api}/action/embedded.rb +1 -1
- data/lib/{desk → desk_api}/action/field.rb +3 -3
- data/lib/{desk → desk_api}/action/link.rb +2 -2
- data/lib/desk_api/action/resource.rb +14 -0
- data/lib/{desk → desk_api}/action/search.rb +1 -1
- data/lib/{desk → desk_api}/action/update.rb +2 -2
- data/lib/{desk → desk_api}/client.rb +15 -15
- data/lib/{desk → desk_api}/configuration.rb +13 -13
- data/lib/{desk → desk_api}/default.rb +5 -5
- data/lib/{desk → desk_api}/error.rb +5 -5
- data/lib/{desk → desk_api}/error/bad_gateway.rb +3 -3
- data/lib/{desk → desk_api}/error/bad_request.rb +3 -3
- data/lib/{desk → desk_api}/error/client_error.rb +3 -3
- data/lib/{desk → desk_api}/error/configuration_error.rb +2 -2
- data/lib/{desk → desk_api}/error/conflict.rb +3 -3
- data/lib/{desk → desk_api}/error/forbidden.rb +3 -3
- data/lib/{desk → desk_api}/error/gateway_timeout.rb +3 -3
- data/lib/desk_api/error/internal_server_error.rb +10 -0
- data/lib/{desk → desk_api}/error/method_not_allowed.rb +3 -3
- data/lib/{desk → desk_api}/error/method_not_supported.rb +3 -3
- data/lib/{desk → desk_api}/error/not_acceptable.rb +3 -3
- data/lib/{desk → desk_api}/error/not_found.rb +3 -3
- data/lib/desk_api/error/parse_error.rb +9 -0
- data/lib/desk_api/error/parser_error.rb +9 -0
- data/lib/{desk → desk_api}/error/server_error.rb +3 -3
- data/lib/desk_api/error/service_unavailable.rb +10 -0
- data/lib/{desk → desk_api}/error/too_many_requests.rb +3 -3
- data/lib/{desk → desk_api}/error/unauthorized.rb +3 -3
- data/lib/{desk → desk_api}/error/unprocessable_entity.rb +3 -3
- data/lib/{desk → desk_api}/error/unsupported_media_type.rb +3 -3
- data/lib/{desk → desk_api}/rate_limit.rb +1 -1
- data/lib/{desk → desk_api}/request/retry.rb +2 -2
- data/lib/{desk → desk_api}/resource.rb +16 -16
- data/lib/desk_api/resource/article.rb +10 -0
- data/lib/desk_api/resource/article_translation.rb +8 -0
- data/lib/desk_api/resource/attachment.rb +8 -0
- data/lib/desk_api/resource/case.rb +9 -0
- data/lib/desk_api/resource/company.rb +8 -0
- data/lib/desk_api/resource/customer.rb +9 -0
- data/lib/desk_api/resource/integration_url.rb +9 -0
- data/lib/desk_api/resource/job.rb +7 -0
- data/lib/desk_api/resource/label.rb +9 -0
- data/lib/desk_api/resource/macro.rb +9 -0
- data/lib/desk_api/resource/macro_action.rb +7 -0
- data/lib/desk_api/resource/note.rb +7 -0
- data/lib/{desk → desk_api}/resource/page.rb +5 -5
- data/lib/desk_api/resource/reply.rb +8 -0
- data/lib/desk_api/resource/topic.rb +9 -0
- data/lib/desk_api/resource/topic_translation.rb +9 -0
- data/lib/desk_api/resource/user_preference.rb +7 -0
- data/lib/{desk → desk_api}/resources.json +0 -0
- data/lib/desk_api/response/raise_error.rb +34 -0
- data/lib/desk_api/version.rb +3 -0
- data/spec/cassettes/{Desk_Client → DeskApi_Client}/_delete/deletes_a_resource.yml +5 -5
- data/spec/cassettes/{Desk_Client → DeskApi_Client}/_get/fetches_resources.yml +5 -5
- data/spec/cassettes/{Desk_Client → DeskApi_Client}/_patch/updates_a_resource.yml +6 -6
- data/spec/cassettes/{Desk_Client → DeskApi_Client}/_post/creates_a_resource.yml +8 -8
- data/spec/cassettes/{Desk_Error → DeskApi_Error}/_from_response/can_be_created_from_a_faraday_response.yml +5 -5
- data/spec/cassettes/{Desk_Error → DeskApi_Error}/_from_response/uses_the_body_message_if_present.yml +5 -5
- data/spec/cassettes/{Desk_Resource → DeskApi_Resource}/_by_url/finds_resources_by_url.yml +7 -7
- data/spec/cassettes/{Desk_Resource → DeskApi_Resource}/_create/creates_a_new_topic.yml +8 -8
- data/spec/cassettes/{Desk_Resource → DeskApi_Resource}/_delete/deletes_a_resource.yml +25 -26
- data/spec/cassettes/{Desk_Resource → DeskApi_Resource}/_delete/throws_an_error_deleting_a_non_deletalbe_resource.yml +6 -6
- data/spec/cassettes/{Desk_Resource_Page/_page/returns_the_current_page_and_loads_if_page_not_defined.yml → DeskApi_Resource/_exec_/can_be_forced_to_reload.yml} +6 -6
- data/spec/cassettes/{Desk_Resource → DeskApi_Resource}/_exec_/loads_the_current_resource.yml +7 -7
- data/spec/cassettes/{Desk_Resource/_exec_/can_be_forced_to_reload.yml → DeskApi_Resource/_method_missing/loads_the_resource_to_find_a_suitable_method.yml} +6 -6
- data/spec/cassettes/{Desk_Resource/_method_missing/loads_the_resource_to_find_a_suitable_method.yml → DeskApi_Resource/_method_missing/raises_an_error_if_method_does_not_exist.yml} +7 -7
- data/spec/cassettes/{Desk_Resource → DeskApi_Resource}/_search/allows_searching_on_search_enabled_resources.yml +5 -5
- data/spec/cassettes/DeskApi_Resource/_update/can_update_without_a_hash.yml +116 -0
- data/spec/cassettes/{Desk_Resource → DeskApi_Resource}/_update/throws_an_error_updating_a_user.yml +5 -5
- data/spec/cassettes/{Desk_Resource → DeskApi_Resource}/_update/updates_a_topic.yml +18 -20
- data/spec/cassettes/{Desk_Resource_Page → DeskApi_Resource_Page}/_by_id/loads_the_requested_resource.yml +5 -5
- data/spec/cassettes/{Desk_Resource_Page → DeskApi_Resource_Page}/_page/keeps_the_resource_as_loaded.yml +5 -5
- data/spec/cassettes/{Desk_Resource/_method_missing/raises_an_error_if_method_does_not_exist.yml → DeskApi_Resource_Page/_page/returns_the_current_page_and_loads_if_page_not_defined.yml} +6 -6
- data/spec/cassettes/{Desk_Resource_Page → DeskApi_Resource_Page}/_page/sets_the_resource_to_not_loaded.yml +5 -5
- data/spec/{desk → desk_api}/client_spec.rb +14 -14
- data/spec/{desk → desk_api}/configuration_spec.rb +23 -23
- data/spec/{desk → desk_api}/default_spec.rb +5 -5
- data/spec/{desk → desk_api}/error_spec.rb +4 -4
- data/spec/{desk → desk_api}/rate_limit_spec.rb +7 -7
- data/spec/{desk → desk_api}/request/retry_spec.rb +3 -3
- data/spec/{desk → desk_api}/resource_spec.rb +17 -10
- data/spec/{desk → desk_api}/resources/page_spec.rb +5 -5
- data/spec/{desk_spec.rb → desk_api_spec.rb} +10 -10
- data/spec/spec_helper.rb +1 -1
- metadata +121 -118
- data/lib/desk/action/resource.rb +0 -14
- data/lib/desk/error/internal_server_error.rb +0 -10
- data/lib/desk/error/parse_error.rb +0 -9
- data/lib/desk/error/parser_error.rb +0 -9
- data/lib/desk/error/service_unavailable.rb +0 -10
- data/lib/desk/resource/article.rb +0 -10
- data/lib/desk/resource/article_translation.rb +0 -8
- data/lib/desk/resource/attachment.rb +0 -8
- data/lib/desk/resource/case.rb +0 -9
- data/lib/desk/resource/company.rb +0 -8
- data/lib/desk/resource/customer.rb +0 -9
- data/lib/desk/resource/integration_url.rb +0 -9
- data/lib/desk/resource/job.rb +0 -7
- data/lib/desk/resource/label.rb +0 -9
- data/lib/desk/resource/macro.rb +0 -9
- data/lib/desk/resource/macro_action.rb +0 -7
- data/lib/desk/resource/note.rb +0 -7
- data/lib/desk/resource/reply.rb +0 -8
- data/lib/desk/resource/topic.rb +0 -9
- data/lib/desk/resource/topic_translation.rb +0 -9
- data/lib/desk/resource/user_preference.rb +0 -7
- data/lib/desk/response/raise_error.rb +0 -34
- data/lib/desk/version.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 707504b6574f986733536a110fcb6e62d9e21fdc
|
4
|
+
data.tar.gz: 83018510d73d59c23fc2e867729a9317939d1ab0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc4d3a9536f1e49d1d0ff7d9d860e8e9a897bc718f663682bd103fd1dc3db06ed52a1637ada19431af765160fa40c03cdf19bcf68184cb37aee8348a1a20a3bd
|
7
|
+
data.tar.gz: de81f51bc700975c8ed46394fa47b13a69e420a1f2c86e6665fa48d201fa1e139ee94f93f6ec9c76b643efbdd2dbf0230924b1b4cf20964ef8edf46a5b3bb24a
|
data/README.md
CHANGED
@@ -1,12 +1,27 @@
|
|
1
|
-
# desk.com APIv2 [![Build Status](https://secure.travis-ci.org/tstachl/desk.png)](http://travis-ci.org/tstachl/desk) [![Coverage Status](https://coveralls.io/repos/tstachl/desk/badge.png)](https://coveralls.io/r/tstachl/desk) [![Dependency Status](https://gemnasium.com/tstachl/desk.png)](https://gemnasium.com/tstachl/desk)
|
1
|
+
# desk.com APIv2 [![Build Status](https://secure.travis-ci.org/tstachl/desk.png)](http://travis-ci.org/tstachl/desk) [![Coverage Status](https://coveralls.io/repos/tstachl/desk/badge.png?branch=develop)](https://coveralls.io/r/tstachl/desk?branch=develop) [![Dependency Status](https://gemnasium.com/tstachl/desk.png)](https://gemnasium.com/tstachl/desk)
|
2
2
|
|
3
3
|
desk.com has released v2 of their REST API a few months ago and provides a lot more functionality. You should read up on the current progress of the [API](http://dev.desk.com/API/changelog). This library wraps all of it into an easy to use ruby module. We'll try to keep up with the changes of the API but things might still break unexpectedly.
|
4
4
|
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
gem install desk_api
|
9
|
+
```
|
10
|
+
|
5
11
|
## Example
|
6
12
|
This example shows you how to create a new client and establish a connection to the API. It shows the four request methods supported by the desk.com API (`GET`, `POST`, `PATCH` and `DELETE`).
|
7
13
|
|
8
14
|
```ruby
|
9
|
-
|
15
|
+
# Basic Auth
|
16
|
+
client = DeskApi::Client.new username: 'thomas@example.com', password: 'somepassword', subdomain: 'devel'
|
17
|
+
# OAuth
|
18
|
+
client = DeskApi::Client.new({
|
19
|
+
token: 'TOKEN',
|
20
|
+
token_secret: 'TOKEN_SECRET',
|
21
|
+
consumer_key: 'CONSUMER_KEY',
|
22
|
+
consumer_secret: 'CONSUMER_SECRET',
|
23
|
+
subdomain: 'devel'
|
24
|
+
})
|
10
25
|
|
11
26
|
response = client.get '/api/v2/topics'
|
12
27
|
response = client.post '/api/v2/topics', name: 'My new Topic', allow_questions: true
|
@@ -17,16 +32,16 @@ response = client.delete '/api/v2/topics/1'
|
|
17
32
|
For ease of use and if you only create one connection to the desk.com API you can use `Desk` directly:
|
18
33
|
|
19
34
|
```ruby
|
20
|
-
|
35
|
+
DeskApi.configure do |config|
|
21
36
|
config.username = 'thomas@example.com'
|
22
37
|
config.password = 'somepassword'
|
23
38
|
config.subdomain = 'devel'
|
24
39
|
end
|
25
40
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
41
|
+
DeskApi.get '/api/v2/topics'
|
42
|
+
DeskApi.post '/api/v2/topics', name: 'My new Topic', allow_questions: true
|
43
|
+
DeskApi.patch '/api/v2/topics/1', name: 'Changed the Topic Name'
|
44
|
+
DeskApi.delete '/api/v2/topics/1'
|
30
45
|
```
|
31
46
|
|
32
47
|
## Working with Resources and Collections
|
@@ -36,10 +51,10 @@ The API supports RESTful resources and so does this wrapper. Those resources are
|
|
36
51
|
### Finders
|
37
52
|
```ruby
|
38
53
|
# get the first user and find a case by url.
|
39
|
-
found_case =
|
54
|
+
found_case = DeskApi.users.first.by_url '/api/v2/cases/1'
|
40
55
|
|
41
56
|
# find a case by case number
|
42
|
-
found_case =
|
57
|
+
found_case = DeskApi.cases.by_id 1
|
43
58
|
```
|
44
59
|
|
45
60
|
### Pagination
|
@@ -47,7 +62,7 @@ found_case = Desk.cases.by_id 1
|
|
47
62
|
As mentioned above you can also navigate between resources and mainly pages of collections.
|
48
63
|
|
49
64
|
```ruby
|
50
|
-
cases =
|
65
|
+
cases = DeskApi.cases
|
51
66
|
cases.each do |my_case|
|
52
67
|
# do something with the case
|
53
68
|
end
|
@@ -70,9 +85,9 @@ Pagination is pretty obvious but the cool part about pagination or rather resour
|
|
70
85
|
|
71
86
|
```ruby
|
72
87
|
# get the customer of the first case of the first page
|
73
|
-
customer =
|
88
|
+
customer = DeskApi.cases.first.customer
|
74
89
|
# who sent the first outbound reply of the first email
|
75
|
-
user_name =
|
90
|
+
user_name = DeskApi.cases.select{ |my_case|
|
76
91
|
my_case.type == 'email'
|
77
92
|
}.first.replies.select{ |reply|
|
78
93
|
reply.direction == 'out'
|
@@ -81,29 +96,29 @@ user_name = Desk.cases.select{ |my_case|
|
|
81
96
|
|
82
97
|
### Lazy loading
|
83
98
|
|
84
|
-
Collections and resources in general are lazily loaded, meaning if you request the cases `
|
99
|
+
Collections and resources in general are lazily loaded, meaning if you request the cases `DeskApi.cases` no actual request will be set off until you actually request data. This makes sure only necessary requests are fired and which keeps the overall requests low and spares the [desk.com rate limit](http://dev.desk.com/API/using-the-api/#rate-limits).
|
85
100
|
|
86
101
|
```ruby
|
87
|
-
|
102
|
+
DeskApi.cases.page(10).per_page(50).each do |my_case|
|
88
103
|
# in this method chain `.each' is the first method that acutally sends a request
|
89
104
|
end
|
90
105
|
|
91
106
|
# however if you request the current page numer and the resource is not loaded
|
92
107
|
# it'll send a request
|
93
|
-
|
108
|
+
DeskApi.cases.page == 1
|
94
109
|
```
|
95
110
|
|
96
111
|
### Create, Update and Delete
|
97
112
|
|
98
|
-
Of course we support creating, updating and deleting resources but not all resources can be deleted or updated or created, if that's the case for the resource you're trying to update, it'll throw a `
|
113
|
+
Of course we support creating, updating and deleting resources but not all resources can be deleted or updated or created, if that's the case for the resource you're trying to update, it'll throw a `DeskApi::Error::MethodNotSupported` error. The specific method won't be defined on the resource either `DeskApi.cases.first.respond_to?(:delete) == false`.
|
99
114
|
|
100
115
|
```ruby
|
101
116
|
# let's create an article
|
102
|
-
new_article =
|
117
|
+
new_article = DeskApi.articles.create({
|
103
118
|
subject: 'Some Subject',
|
104
119
|
body: 'Some Body',
|
105
120
|
_links: {
|
106
|
-
topic:
|
121
|
+
topic: DeskApi.topics.first.get_self
|
107
122
|
}
|
108
123
|
})
|
109
124
|
|
@@ -120,8 +135,8 @@ end
|
|
120
135
|
|
121
136
|
# ATTENTION: Cases can not be deleted!
|
122
137
|
begin
|
123
|
-
|
124
|
-
rescue
|
138
|
+
DeskApi.cases.first.delete
|
139
|
+
rescue DeskApi::Error::MethodNotSupported => e
|
125
140
|
# too bad
|
126
141
|
end
|
127
142
|
```
|
@@ -131,7 +146,7 @@ end
|
|
131
146
|
As you have seen in prior examples for each field on the resource we create a getter and setter. Be careful if a resource is not updatable it won't have a setter specified.
|
132
147
|
|
133
148
|
```ruby
|
134
|
-
customer =
|
149
|
+
customer = DeskApi.customers.by_id(1)
|
135
150
|
|
136
151
|
puts customer.first_name
|
137
152
|
puts customer.last_name
|
@@ -146,28 +161,28 @@ updated_customer = customer.update title: 'Master of the Universe'
|
|
146
161
|
|
147
162
|
# users are not updatable
|
148
163
|
begin
|
149
|
-
user =
|
164
|
+
user = DeskApi.users.first
|
150
165
|
user.name = 'Not updateable'
|
151
|
-
rescue
|
166
|
+
rescue DeskApi::Error::MethodNotSupported
|
152
167
|
# too bad
|
153
168
|
end
|
154
169
|
```
|
155
170
|
|
156
171
|
### API Errors
|
157
172
|
|
158
|
-
Sometimes the API is going to return errors, eg. Validation Error. In these cases we wrap the API error into a `
|
173
|
+
Sometimes the API is going to return errors, eg. Validation Error. In these cases we wrap the API error into a `DeskApi::Error`. Here are the common errors:
|
159
174
|
|
160
175
|
```ruby
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
176
|
+
DeskApi::Error::BadRequest #=> 400 Status
|
177
|
+
DeskApi::Error::Unauthorized #=> 401 Status
|
178
|
+
DeskApi::Error::Forbidden #=> 403 Status
|
179
|
+
DeskApi::Error::NotFound #=> 404 Status
|
180
|
+
DeskApi::Error::MethodNotAllowed #=> 405 Status
|
181
|
+
DeskApi::Error::NotAcceptable #=> 406 Status
|
182
|
+
DeskApi::Error::Conflict #=> 409 Status
|
183
|
+
DeskApi::Error::UnsupportedMediaType #=> 415 Status
|
184
|
+
DeskApi::Error::UnprocessableEntity #=> 422 Status
|
185
|
+
DeskApi::Error::TooManyRequests #=> 429 Status
|
171
186
|
```
|
172
187
|
|
173
188
|
Please also have a look at all [desk.com API errors](http://dev.desk.com/API/using-the-api/#status-codes) and their respective meanings.
|
data/config.rb
CHANGED
data/desk_api.gemspec
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
$LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
3
|
-
require '
|
3
|
+
require 'desk_api/version'
|
4
4
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
6
|
gem.name = 'desk_api'
|
7
7
|
gem.summary = 'A lightweight, flexible wrapper for the desk.com REST API.'
|
8
8
|
gem.description = 'This is a lightweight, flexible ruby gem to interact with the desk.com REST API. It allows to create, read and delete resources available through the API endpoints. It can be used either with OAuth or HTTP Basic Authentication.'
|
9
|
-
gem.homepage = 'http://github.com/tstachl/desk
|
10
|
-
gem.version =
|
9
|
+
gem.homepage = 'http://github.com/tstachl/desk'
|
10
|
+
gem.version = DeskApi::VERSION
|
11
11
|
|
12
12
|
gem.authors = ['Thomas Stachl']
|
13
13
|
gem.email = 'tom@desk.com'
|
data/lib/desk.rb
CHANGED
@@ -1,35 +1 @@
|
|
1
|
-
require '
|
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
|
1
|
+
require File.dirname(__FILE__) + '/desk_api'
|
data/lib/desk_api.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_api/configuration'
|
10
|
+
require 'desk_api/client'
|
11
|
+
require 'desk_api/version'
|
12
|
+
|
13
|
+
module DeskApi
|
14
|
+
class << self
|
15
|
+
include DeskApi::Configuration
|
16
|
+
|
17
|
+
# Delegate to a DeskApi::Client
|
18
|
+
#
|
19
|
+
# @return [DeskApi::Client]
|
20
|
+
def client
|
21
|
+
return @client if instance_variable_defined?(:@client) && @client.hash == options.hash
|
22
|
+
@client = DeskApi::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
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module DeskApi
|
2
2
|
module Action
|
3
3
|
module Field
|
4
4
|
protected
|
@@ -14,11 +14,11 @@ module Desk
|
|
14
14
|
instance_variable_set(:"@#{key}", value)
|
15
15
|
# create getter
|
16
16
|
(class << self; self; end).send(:define_method, "#{key}") do
|
17
|
-
return @_changed[key] if kind_of?(
|
17
|
+
return @_changed[key] if kind_of?(DeskApi::Action::Update) and @_changed[key]
|
18
18
|
instance_variable_get(:"@#{key}")
|
19
19
|
end
|
20
20
|
# create setter
|
21
|
-
if kind_of?(
|
21
|
+
if kind_of?(DeskApi::Action::Update)
|
22
22
|
(class << self; self; end).send(:define_method, "#{key}=") do |value|
|
23
23
|
if instance_variable_get(:"@#{key}") != value
|
24
24
|
@_changed[key] = value
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module DeskApi
|
2
2
|
module Action
|
3
3
|
module Link
|
4
4
|
protected
|
@@ -18,7 +18,7 @@ module Desk
|
|
18
18
|
# this is a really ugly hack but necessary for sub resources which aren't declared consistently
|
19
19
|
definition['class'] = 'page' if method.pluralize == method
|
20
20
|
# get the client
|
21
|
-
client = self.instance_of?(
|
21
|
+
client = self.instance_of?(DeskApi::Client) ? self : self.client
|
22
22
|
# create the new resource
|
23
23
|
@_links[method]['resource'] = resource(definition['class']).new client, Hashie::Mash.new({ _links: { self: definition } })
|
24
24
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module DeskApi
|
2
|
+
module Action
|
3
|
+
module Resource
|
4
|
+
protected
|
5
|
+
def resource(name)
|
6
|
+
require "desk_api/resource/#{name}"
|
7
|
+
"DeskApi::Resource::#{name.classify}".constantize
|
8
|
+
rescue NameError
|
9
|
+
rescue LoadError
|
10
|
+
DeskApi::Resource
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -1,26 +1,26 @@
|
|
1
1
|
require 'faraday'
|
2
2
|
|
3
|
-
require '
|
4
|
-
require '
|
5
|
-
require '
|
6
|
-
require '
|
7
|
-
require '
|
3
|
+
require 'desk_api/configuration'
|
4
|
+
require 'desk_api/action/link'
|
5
|
+
require 'desk_api/action/resource'
|
6
|
+
require 'desk_api/error/client_error'
|
7
|
+
require 'desk_api/error/parse_error'
|
8
8
|
|
9
|
-
require '
|
9
|
+
require 'desk_api/resource'
|
10
10
|
|
11
|
-
module
|
11
|
+
module DeskApi
|
12
12
|
class Client
|
13
|
-
include
|
14
|
-
include
|
15
|
-
include
|
13
|
+
include DeskApi::Configuration
|
14
|
+
include DeskApi::Action::Link
|
15
|
+
include DeskApi::Action::Resource
|
16
16
|
|
17
17
|
# Initializes a new Client object
|
18
18
|
#
|
19
19
|
# @param options [Hash]
|
20
|
-
# @return [
|
20
|
+
# @return [DeskApi::Client]
|
21
21
|
def initialize(options = {})
|
22
|
-
|
23
|
-
instance_variable_set(:"@#{key}", options[key] ||
|
22
|
+
DeskApi::Configuration.keys.each do |key|
|
23
|
+
instance_variable_set(:"@#{key}", options[key] || DeskApi.instance_variable_get(:"@#{key}"))
|
24
24
|
end
|
25
25
|
|
26
26
|
# load the initial resources (should actually be a call to /api/v2 but not yet)
|
@@ -55,9 +55,9 @@ module Desk
|
|
55
55
|
def request(method, path, params = {})
|
56
56
|
connection.send(method, path, params)
|
57
57
|
rescue Faraday::Error::ClientError
|
58
|
-
raise
|
58
|
+
raise DeskApi::Error::ClientError
|
59
59
|
rescue JSON::ParserError
|
60
|
-
raise
|
60
|
+
raise DeskApi::Error::ParserError
|
61
61
|
end
|
62
62
|
|
63
63
|
def connection
|
@@ -4,14 +4,14 @@ require 'faraday_middleware'
|
|
4
4
|
require 'typhoeus'
|
5
5
|
require 'typhoeus/adapters/faraday'
|
6
6
|
|
7
|
-
require '
|
8
|
-
require '
|
9
|
-
require '
|
10
|
-
require '
|
11
|
-
require '
|
12
|
-
require '
|
13
|
-
|
14
|
-
module
|
7
|
+
require 'desk_api/default'
|
8
|
+
require 'desk_api/request/retry'
|
9
|
+
require 'desk_api/response/raise_error'
|
10
|
+
require 'desk_api/error/configuration_error'
|
11
|
+
require 'desk_api/error/client_error'
|
12
|
+
require 'desk_api/error/server_error'
|
13
|
+
|
14
|
+
module DeskApi
|
15
15
|
module Configuration
|
16
16
|
extend Forwardable
|
17
17
|
attr_writer :consumer_secret, :token, :token_secret, :password
|
@@ -48,8 +48,8 @@ module Desk
|
|
48
48
|
|
49
49
|
builder.response :mashify
|
50
50
|
builder.response :dates
|
51
|
-
builder.response :raise_error,
|
52
|
-
builder.response :raise_error,
|
51
|
+
builder.response :raise_error, DeskApi::Error::ClientError
|
52
|
+
builder.response :raise_error, DeskApi::Error::ServerError
|
53
53
|
builder.response :json, content_type: /application\/json/
|
54
54
|
|
55
55
|
builder.adapter :typhoeus
|
@@ -64,8 +64,8 @@ module Desk
|
|
64
64
|
end
|
65
65
|
|
66
66
|
def reset!
|
67
|
-
|
68
|
-
send("#{key}=",
|
67
|
+
DeskApi::Configuration.keys.each do |key|
|
68
|
+
send("#{key}=", DeskApi::Default.options[key])
|
69
69
|
end
|
70
70
|
self
|
71
71
|
end
|
@@ -78,7 +78,7 @@ module Desk
|
|
78
78
|
private
|
79
79
|
# @return [Hash]
|
80
80
|
def options
|
81
|
-
Hash[
|
81
|
+
Hash[DeskApi::Configuration.keys.map{|key| [key, instance_variable_get(:"@#{key}")]}]
|
82
82
|
end
|
83
83
|
|
84
84
|
def oauth
|