desk_api 0.1.3 → 0.5.0
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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -2
- data/Gemfile +0 -6
- data/README.md +38 -31
- data/desk_api.gemspec +1 -4
- data/lib/desk_api.rb +5 -7
- data/lib/desk_api/client.rb +44 -57
- data/lib/desk_api/configuration.rb +89 -95
- data/lib/desk_api/default.rb +51 -55
- data/lib/desk_api/error.rb +42 -44
- data/lib/desk_api/rate_limit.rb +20 -22
- data/lib/desk_api/resource.rb +142 -65
- data/lib/desk_api/version.rb +1 -1
- data/spec/cassettes/DeskApi_Client/using_Basic_Authentication/_delete/deletes_a_resource.yml +22 -22
- data/spec/cassettes/DeskApi_Client/using_Basic_Authentication/_get/fetches_resources.yml +26 -26
- data/spec/cassettes/DeskApi_Client/using_Basic_Authentication/_patch/updates_a_resource.yml +30 -30
- data/spec/cassettes/DeskApi_Client/using_Basic_Authentication/_post/creates_a_resource.yml +27 -27
- data/spec/cassettes/DeskApi_Client/using_OAuth/_delete/deletes_a_resource.yml +22 -22
- data/spec/cassettes/DeskApi_Client/using_OAuth/_get/fetches_resources.yml +31 -286
- data/spec/cassettes/DeskApi_Client/using_OAuth/_patch/updates_a_resource.yml +35 -35
- data/spec/cassettes/DeskApi_Client/using_OAuth/_post/creates_a_resource.yml +28 -28
- data/spec/cassettes/DeskApi_Error/_from_response/can_be_created_from_a_faraday_response.yml +22 -22
- data/spec/cassettes/DeskApi_Error/_from_response/uses_the_body_message_if_present.yml +22 -22
- data/spec/cassettes/DeskApi_Error/on_validation_error/allows_access_to_error_hash.yml +22 -22
- data/spec/cassettes/DeskApi_Resource/_by_url/finds_resources_by_url.yml +37 -286
- data/spec/cassettes/DeskApi_Resource/_create/creates_a_new_topic.yml +27 -27
- data/spec/cassettes/DeskApi_Resource/_create/throws_an_error_creating_a_user.yml +54 -0
- data/spec/cassettes/DeskApi_Resource/_delete/deletes_a_resource.yml +83 -79
- data/spec/cassettes/DeskApi_Resource/_delete/throws_an_error_deleting_a_non_deletalbe_resource.yml +78 -28
- data/spec/cassettes/DeskApi_Resource/_exec_/can_be_forced_to_reload.yml +34 -285
- data/spec/cassettes/DeskApi_Resource/_exec_/loads_the_current_resource.yml +34 -285
- data/spec/cassettes/DeskApi_Resource/_find/has_an_alias_by_id.yml +54 -0
- data/spec/cassettes/DeskApi_Resource/_find/loads_the_requested_resource.yml +54 -0
- data/spec/cassettes/DeskApi_Resource/_get_linked_resource/returns_linked_resources.yml +113 -0
- data/spec/cassettes/DeskApi_Resource/_get_linked_resource/returns_nil_if_link_is_nil.yml +62 -0
- data/spec/cassettes/DeskApi_Resource/_get_linked_resource/saves_the_linked_resource_instead_of_the_url.yml +113 -0
- data/spec/cassettes/DeskApi_Resource/_method_missing/loads_the_resource_to_find_a_suitable_method.yml +34 -285
- data/spec/cassettes/DeskApi_Resource/_method_missing/raises_an_error_if_method_does_not_exist.yml +34 -285
- data/spec/cassettes/DeskApi_Resource/_page/keeps_the_resource_as_loaded.yml +113 -0
- data/spec/cassettes/DeskApi_Resource/_page/returns_the_current_page_and_loads_if_page_not_defined.yml +62 -0
- data/spec/cassettes/DeskApi_Resource/_page/sets_the_resource_to_not_loaded.yml +113 -0
- data/spec/cassettes/DeskApi_Resource/_search/allows_searching_on_search_enabled_resources.yml +23 -23
- data/spec/cassettes/DeskApi_Resource/_search/throws_an_error_if_search_is_not_enabled.yml +52 -0
- data/spec/cassettes/DeskApi_Resource/_update/can_update_without_a_hash.yml +178 -58
- data/spec/cassettes/DeskApi_Resource/_update/throws_an_error_updating_a_user.yml +86 -28
- data/spec/cassettes/DeskApi_Resource/_update/updates_a_topic.yml +61 -57
- data/spec/desk_api/client_spec.rb +9 -16
- data/spec/desk_api/resource_spec.rb +118 -43
- data/spec/spec_helper.rb +1 -1
- metadata +24 -102
- data/lib/desk_api/action/create.rb +0 -15
- data/lib/desk_api/action/delete.rb +0 -9
- data/lib/desk_api/action/embeddable.rb +0 -47
- data/lib/desk_api/action/field.rb +0 -33
- data/lib/desk_api/action/link.rb +0 -29
- data/lib/desk_api/action/resource.rb +0 -14
- data/lib/desk_api/action/search.rb +0 -15
- data/lib/desk_api/action/update.rb +0 -17
- data/lib/desk_api/error/method_not_supported.rb +0 -9
- data/lib/desk_api/error/not_embeddable.rb +0 -8
- data/lib/desk_api/error/not_updateable.rb +0 -10
- data/lib/desk_api/error/parse_error.rb +0 -9
- data/lib/desk_api/resource/article.rb +0 -10
- data/lib/desk_api/resource/article_translation.rb +0 -8
- data/lib/desk_api/resource/attachment.rb +0 -8
- data/lib/desk_api/resource/case.rb +0 -11
- data/lib/desk_api/resource/company.rb +0 -8
- data/lib/desk_api/resource/customer.rb +0 -9
- data/lib/desk_api/resource/filter.rb +0 -7
- data/lib/desk_api/resource/inbound_mailbox.rb +0 -7
- data/lib/desk_api/resource/integration_url.rb +0 -9
- data/lib/desk_api/resource/job.rb +0 -9
- data/lib/desk_api/resource/label.rb +0 -9
- data/lib/desk_api/resource/macro.rb +0 -9
- data/lib/desk_api/resource/macro_action.rb +0 -7
- data/lib/desk_api/resource/note.rb +0 -7
- data/lib/desk_api/resource/page.rb +0 -64
- data/lib/desk_api/resource/reply.rb +0 -10
- data/lib/desk_api/resource/topic.rb +0 -9
- data/lib/desk_api/resource/topic_translation.rb +0 -9
- data/lib/desk_api/resource/user_preference.rb +0 -7
- data/lib/desk_api/resources.json +0 -76
- data/spec/cassettes/DeskApi_Client/_delete/deletes_a_resource.yml +0 -48
- data/spec/cassettes/DeskApi_Client/_get/fetches_resources.yml +0 -55
- data/spec/cassettes/DeskApi_Client/_patch/updates_a_resource.yml +0 -62
- data/spec/cassettes/DeskApi_Client/_post/creates_a_resource.yml +0 -58
- data/spec/cassettes/DeskApi_Resource_Case/once_closed/can_not_be_updated.yml +0 -124
- data/spec/cassettes/DeskApi_Resource_Page/_find/has_an_alias_by_id.yml +0 -54
- data/spec/cassettes/DeskApi_Resource_Page/_find/loads_the_requested_resource.yml +0 -54
- data/spec/cassettes/DeskApi_Resource_Page/_page/keeps_the_resource_as_loaded.yml +0 -113
- data/spec/cassettes/DeskApi_Resource_Page/_page/returns_the_current_page_and_loads_if_page_not_defined.yml +0 -313
- data/spec/cassettes/DeskApi_Resource_Page/_page/sets_the_resource_to_not_loaded.yml +0 -113
- data/spec/desk_api/resource/case_spec.rb +0 -28
- data/spec/desk_api/resource/page_spec.rb +0 -68
data/lib/desk_api/default.rb
CHANGED
|
@@ -1,67 +1,63 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
def options
|
|
19
|
-
Hash[DeskApi::Configuration.keys.map{|key| [key, send(key)]}]
|
|
20
|
-
end
|
|
1
|
+
module DeskApi::Default
|
|
2
|
+
CONNECTION_OPTIONS = {
|
|
3
|
+
headers: {
|
|
4
|
+
accept: 'application/json',
|
|
5
|
+
user_agent: "desk.com Ruby Gem v#{DeskApi::VERSION}"
|
|
6
|
+
},
|
|
7
|
+
request: {
|
|
8
|
+
open_timeout: 5,
|
|
9
|
+
timeout: 10
|
|
10
|
+
}
|
|
11
|
+
} unless defined? DeskApi::Default::CONNECTION_OPTIONS
|
|
12
|
+
|
|
13
|
+
class << self
|
|
14
|
+
# @return [Hash]
|
|
15
|
+
def options
|
|
16
|
+
Hash[DeskApi::Configuration.keys.map{|key| [key, send(key)]}]
|
|
17
|
+
end
|
|
21
18
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
19
|
+
# @return [String]
|
|
20
|
+
def username
|
|
21
|
+
ENV['DESK_USERNAME']
|
|
22
|
+
end
|
|
26
23
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
24
|
+
# @return [String]
|
|
25
|
+
def password
|
|
26
|
+
ENV['DESK_PASSWORD']
|
|
27
|
+
end
|
|
31
28
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
# @return [String]
|
|
30
|
+
def consumer_key
|
|
31
|
+
ENV['DESK_CONSUMER_KEY']
|
|
32
|
+
end
|
|
36
33
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
34
|
+
# @return [String]
|
|
35
|
+
def consumer_secret
|
|
36
|
+
ENV['DESK_CONSUMER_SECRET']
|
|
37
|
+
end
|
|
41
38
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
39
|
+
# @return [String]
|
|
40
|
+
def token
|
|
41
|
+
ENV['DESK_TOKEN']
|
|
42
|
+
end
|
|
46
43
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
44
|
+
# @return [String]
|
|
45
|
+
def token_secret
|
|
46
|
+
ENV['DESK_TOKEN_SECRET']
|
|
47
|
+
end
|
|
51
48
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
49
|
+
# @return [String]
|
|
50
|
+
def subdomain
|
|
51
|
+
ENV['DESK_SUBDOMAIN']
|
|
52
|
+
end
|
|
56
53
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
54
|
+
# @return [String]
|
|
55
|
+
def endpoint
|
|
56
|
+
ENV['DESK_ENDPOINT']
|
|
57
|
+
end
|
|
61
58
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
end
|
|
59
|
+
def connection_options
|
|
60
|
+
CONNECTION_OPTIONS
|
|
65
61
|
end
|
|
66
62
|
end
|
|
67
63
|
end
|
data/lib/desk_api/error.rb
CHANGED
|
@@ -1,59 +1,57 @@
|
|
|
1
1
|
require 'desk_api/rate_limit'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
# Custom error class for rescuing from all desk.com errors
|
|
4
|
+
class DeskApi::Error < StandardError
|
|
5
|
+
attr_reader :rate_limit
|
|
6
|
+
|
|
7
|
+
# Initializes a new Error object
|
|
8
|
+
#
|
|
9
|
+
# @param exception [Exception, String]
|
|
10
|
+
# @param response_headers [Hash]
|
|
11
|
+
# @param code [Integer]
|
|
12
|
+
# @return [DeskApi::Error]
|
|
13
|
+
def initialize(exception=$!, response_headers={}, code = nil, err_hash = nil)
|
|
14
|
+
@rate_limit = DeskApi::RateLimit.new(response_headers)
|
|
15
|
+
@wrapped_exception, @code, @errors = exception, code, err_hash
|
|
16
|
+
exception.respond_to?(:backtrace) ? super(exception.message) : super(exception.to_s)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def backtrace
|
|
20
|
+
@wrapped_exception.respond_to?(:backtrace) ? @wrapped_exception.backtrace : super
|
|
21
|
+
end
|
|
7
22
|
|
|
8
|
-
|
|
23
|
+
class << self
|
|
24
|
+
# Create a new error from an HTTP response
|
|
9
25
|
#
|
|
10
|
-
# @param
|
|
11
|
-
# @param response_headers [Hash]
|
|
12
|
-
# @param code [Integer]
|
|
26
|
+
# @param response [Hash]
|
|
13
27
|
# @return [DeskApi::Error]
|
|
14
|
-
def
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
exception.respond_to?(:backtrace) ? super(exception.message) : super(exception.to_s)
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def backtrace
|
|
21
|
-
@wrapped_exception.respond_to?(:backtrace) ? @wrapped_exception.backtrace : super
|
|
28
|
+
def from_response(response = {})
|
|
29
|
+
err_hash, error, code = parse_body(response[:body]).push(response[:status])
|
|
30
|
+
new(error, response[:response_headers], code, err_hash)
|
|
22
31
|
end
|
|
23
32
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
# @return [DeskApi::Error]
|
|
29
|
-
def from_response(response = {})
|
|
30
|
-
err_hash, error, code = parse_body(response[:body]).push(response[:status])
|
|
31
|
-
new(error, response[:response_headers], code, err_hash)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# @return [Hash]
|
|
35
|
-
def errors
|
|
36
|
-
@errors ||= descendants.each_with_object({}) do |klass, hash|
|
|
37
|
-
hash[klass::HTTP_STATUS_CODE] = klass
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
# @return [Array]
|
|
42
|
-
def descendants
|
|
43
|
-
@descendants ||= []
|
|
33
|
+
# @return [Hash]
|
|
34
|
+
def errors
|
|
35
|
+
@errors ||= descendants.each_with_object({}) do |klass, hash|
|
|
36
|
+
hash[klass::HTTP_STATUS_CODE] = klass
|
|
44
37
|
end
|
|
38
|
+
end
|
|
45
39
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
40
|
+
# @return [Array]
|
|
41
|
+
def descendants
|
|
42
|
+
@descendants ||= []
|
|
43
|
+
end
|
|
50
44
|
|
|
51
|
-
|
|
45
|
+
# @return [Array]
|
|
46
|
+
def inherited(descendant)
|
|
47
|
+
descendants << descendant
|
|
48
|
+
end
|
|
52
49
|
|
|
53
|
-
|
|
54
|
-
[body['errors'] || nil, body['message'] || nil]
|
|
55
|
-
end
|
|
50
|
+
private
|
|
56
51
|
|
|
52
|
+
def parse_body(body = {})
|
|
53
|
+
[body['errors'] || nil, body['message'] || nil]
|
|
57
54
|
end
|
|
55
|
+
|
|
58
56
|
end
|
|
59
57
|
end
|
data/lib/desk_api/rate_limit.rb
CHANGED
|
@@ -1,26 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
end
|
|
1
|
+
class DeskApi::RateLimit
|
|
2
|
+
def initialize(attrs = {})
|
|
3
|
+
@attrs = attrs
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
# @return [Integer]
|
|
7
|
+
def limit
|
|
8
|
+
limit = @attrs['x-rate-limit-limit']
|
|
9
|
+
limit.to_i if limit
|
|
10
|
+
end
|
|
12
11
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
# @return [Integer]
|
|
13
|
+
def remaining
|
|
14
|
+
remaining = @attrs['x-rate-limit-remaining']
|
|
15
|
+
remaining.to_i if remaining
|
|
16
|
+
end
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
end
|
|
24
|
-
alias retry_after reset_in
|
|
18
|
+
# @return [Integer]
|
|
19
|
+
def reset_in
|
|
20
|
+
reset_in = @attrs['x-rate-limit-reset']
|
|
21
|
+
reset_in.to_i if reset_in
|
|
25
22
|
end
|
|
23
|
+
alias retry_after reset_in
|
|
26
24
|
end
|
data/lib/desk_api/resource.rb
CHANGED
|
@@ -1,86 +1,163 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
require 'desk_api/action/resource'
|
|
7
|
-
require 'desk_api/action/search'
|
|
8
|
-
require 'desk_api/action/update'
|
|
9
|
-
|
|
10
|
-
require 'desk_api/error/method_not_supported'
|
|
11
|
-
|
|
12
|
-
module DeskApi
|
|
13
|
-
class Resource
|
|
14
|
-
include DeskApi::Action::Resource
|
|
15
|
-
include DeskApi::Action::Link
|
|
16
|
-
include DeskApi::Action::Field
|
|
17
|
-
include DeskApi::Action::Embeddable
|
|
18
|
-
|
|
19
|
-
def initialize(client, definition = {}, loaded = false)
|
|
20
|
-
@client, @loaded, @_changed = client, loaded, {}
|
|
21
|
-
setup(definition)
|
|
1
|
+
class DeskApi::Resource
|
|
2
|
+
class << self
|
|
3
|
+
def build_self_link(link)
|
|
4
|
+
link = {'href'=>link} if link.kind_of?(String)
|
|
5
|
+
{'_links'=>{'self'=>link}}
|
|
22
6
|
end
|
|
7
|
+
end
|
|
23
8
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
end
|
|
9
|
+
def initialize(client, definition = {}, loaded = false)
|
|
10
|
+
@_client, @_definition, @_loaded, @_changed = client, definition, loaded, {}
|
|
11
|
+
end
|
|
28
12
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
13
|
+
def create(params = {})
|
|
14
|
+
self.class.new(@_client, @_client.post(clean_base_url, params).body, true)
|
|
15
|
+
end
|
|
32
16
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
17
|
+
def update(params = {})
|
|
18
|
+
params.each_pair{ |key, value| send("#{key}=", value) }
|
|
19
|
+
changes = @_changed.clone
|
|
20
|
+
@_changed = {}
|
|
21
|
+
@_definition = @_client.patch(href, changes).body
|
|
22
|
+
end
|
|
36
23
|
|
|
37
|
-
|
|
24
|
+
def delete
|
|
25
|
+
@_client.delete(href).status === 204
|
|
26
|
+
end
|
|
38
27
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
28
|
+
def search(params = {})
|
|
29
|
+
params = { q: params } if params.kind_of?(String)
|
|
30
|
+
url = Addressable::URI.parse(clean_base_url + '/search')
|
|
31
|
+
url.query_values = params
|
|
32
|
+
self.class.new(@_client, self.class.build_self_link(url.to_s))
|
|
33
|
+
end
|
|
44
34
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
35
|
+
def find(id, options = {})
|
|
36
|
+
res = self.class.new(@_client, self.class.build_self_link("#{clean_base_url}/#{id}"))
|
|
37
|
+
res.embed(*(options[:embed].kind_of?(Array) ? options[:embed] : [options[:embed]])) if options[:embed]
|
|
38
|
+
res.exec!
|
|
39
|
+
end
|
|
40
|
+
alias_method :by_id, :find
|
|
48
41
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
42
|
+
def embed(*embedds)
|
|
43
|
+
# make sure we don't try to embed anything that's not defined
|
|
44
|
+
# add it to the query
|
|
45
|
+
self.tap{ |res| res.query_params = { embed: embedds.join(',') } }
|
|
46
|
+
end
|
|
52
47
|
|
|
53
|
-
|
|
54
|
-
|
|
48
|
+
def by_url(url)
|
|
49
|
+
self.class.new(@_client, self.class.build_self_link(url))
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def get_self
|
|
53
|
+
@_definition['_links']['self']
|
|
54
|
+
end
|
|
55
55
|
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
def href
|
|
57
|
+
get_self['href']
|
|
58
|
+
end
|
|
59
|
+
alias_method :get_href, :href
|
|
58
60
|
|
|
59
|
-
|
|
61
|
+
def href=(value)
|
|
62
|
+
@_definition['_links']['self']['href'] = value
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def type
|
|
66
|
+
get_self['class']
|
|
67
|
+
end
|
|
60
68
|
|
|
61
|
-
|
|
62
|
-
|
|
69
|
+
[:page, :per_page].each do |method|
|
|
70
|
+
define_method(method) do |value = nil|
|
|
71
|
+
unless value
|
|
72
|
+
self.exec! if self.query_params_include?(method.to_s) == nil
|
|
73
|
+
return self.query_params_include?(method.to_s).to_i
|
|
74
|
+
end
|
|
75
|
+
self.tap{ |res| res.query_params = Hash[method.to_s, value.to_s] }
|
|
63
76
|
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
protected
|
|
80
|
+
|
|
81
|
+
def clean_base_url
|
|
82
|
+
Addressable::URI.parse(href).path.gsub(/\/(search|\d+)$/, '')
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def exec!(reload = false)
|
|
86
|
+
return self if @_loaded and !reload
|
|
87
|
+
@_definition, @_loaded = @_client.get(href).body, true
|
|
88
|
+
self
|
|
89
|
+
end
|
|
64
90
|
|
|
65
|
-
|
|
66
|
-
|
|
91
|
+
def query_params
|
|
92
|
+
Addressable::URI.parse(href).query_values || {}
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def query_params_include?(param)
|
|
96
|
+
query_params.include?(param) ? query_params[param] : nil
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def query_params=(params = {})
|
|
100
|
+
return href if params.empty?
|
|
101
|
+
|
|
102
|
+
uri = Addressable::URI.parse(href)
|
|
103
|
+
params = (uri.query_values || {}).merge(params)
|
|
104
|
+
|
|
105
|
+
@_loaded = false unless params == uri.query_values
|
|
106
|
+
|
|
107
|
+
uri.query_values = params
|
|
108
|
+
self.href = uri.to_s
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
private
|
|
112
|
+
attr_accessor :_client, :_loaded, :_changed, :_definition
|
|
113
|
+
|
|
114
|
+
def is_field?(method)
|
|
115
|
+
@_definition.key?(method)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def is_link?(method)
|
|
119
|
+
@_definition.key?('_links') and @_definition['_links'].key?(method)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def is_embedded?(method)
|
|
123
|
+
@_definition.key?('_embedded') and @_definition['_embedded'].key?(method)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def get_field_value(method)
|
|
127
|
+
@_changed.key?(method) ? @_changed[method] : @_definition[method]
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def get_embedded_resource(method)
|
|
131
|
+
embedds = @_definition['_embedded']
|
|
132
|
+
|
|
133
|
+
if embedds[method].kind_of?(Array) and not embedds[method].first.kind_of?(self.class)
|
|
134
|
+
embedds[method].map!{ |definition| self.class.new(@_client, definition, true) }
|
|
135
|
+
elsif not embedds[method].kind_of?(self.class)
|
|
136
|
+
embedds[method] = self.class.new(@_client, embedds[method], true)
|
|
137
|
+
else
|
|
138
|
+
embedds[method]
|
|
67
139
|
end
|
|
140
|
+
end
|
|
68
141
|
|
|
69
|
-
|
|
142
|
+
def get_linked_resource(method)
|
|
143
|
+
links = @_definition['_links']
|
|
144
|
+
|
|
145
|
+
return nil if links[method].nil?
|
|
146
|
+
return links[method] if links[method].kind_of?(self.class)
|
|
70
147
|
|
|
71
|
-
|
|
148
|
+
links[method] = self.class.new(@_client, self.class.build_self_link(links[method]))
|
|
149
|
+
end
|
|
72
150
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
setup_embedded(definition._embedded) if definition._embedded?
|
|
76
|
-
setup_fields(definition)
|
|
77
|
-
self
|
|
78
|
-
end
|
|
151
|
+
def method_missing(method, *args, &block)
|
|
152
|
+
self.exec! unless @_loaded
|
|
79
153
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
154
|
+
meth = method.to_s
|
|
155
|
+
|
|
156
|
+
return @_changed[meth[0...-1]] = args.first if meth.end_with?('=') and is_field?(meth[0...-1])
|
|
157
|
+
return get_field_value(meth) if is_field?(meth)
|
|
158
|
+
return get_embedded_resource(meth) if is_embedded?(meth)
|
|
159
|
+
return get_linked_resource(meth) if is_link?(meth)
|
|
160
|
+
|
|
161
|
+
super(method, *args, &block)
|
|
85
162
|
end
|
|
86
163
|
end
|