zendesk_api 0.0.9
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.
- data/.gitignore +7 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/.yardopts +1 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +59 -0
- data/LICENSE +19 -0
- data/Rakefile +49 -0
- data/Readme.md +178 -0
- data/lib/zendesk_api.rb +10 -0
- data/lib/zendesk_api/actions.rb +176 -0
- data/lib/zendesk_api/association.rb +267 -0
- data/lib/zendesk_api/client.rb +150 -0
- data/lib/zendesk_api/collection.rb +233 -0
- data/lib/zendesk_api/configuration.rb +52 -0
- data/lib/zendesk_api/core_ext/inflection.rb +13 -0
- data/lib/zendesk_api/core_ext/modulize.rb +10 -0
- data/lib/zendesk_api/core_ext/snakecase.rb +12 -0
- data/lib/zendesk_api/lru_cache.rb +38 -0
- data/lib/zendesk_api/middleware/request/etag_cache.rb +38 -0
- data/lib/zendesk_api/middleware/request/retry.rb +39 -0
- data/lib/zendesk_api/middleware/request/upload.rb +32 -0
- data/lib/zendesk_api/middleware/response/callback.rb +19 -0
- data/lib/zendesk_api/middleware/response/deflate.rb +18 -0
- data/lib/zendesk_api/middleware/response/gzip.rb +18 -0
- data/lib/zendesk_api/middleware/response/parse_iso_dates.rb +29 -0
- data/lib/zendesk_api/rescue.rb +44 -0
- data/lib/zendesk_api/resource.rb +133 -0
- data/lib/zendesk_api/resources/forum.rb +51 -0
- data/lib/zendesk_api/resources/misc.rb +66 -0
- data/lib/zendesk_api/resources/playlist.rb +64 -0
- data/lib/zendesk_api/resources/ticket.rb +76 -0
- data/lib/zendesk_api/resources/user.rb +44 -0
- data/lib/zendesk_api/track_changes.rb +72 -0
- data/lib/zendesk_api/trackie.rb +8 -0
- data/lib/zendesk_api/verbs.rb +43 -0
- data/lib/zendesk_api/version.rb +3 -0
- data/live/Readme.md +4 -0
- data/live/activity_spec.rb +5 -0
- data/live/audit_spec.rb +5 -0
- data/live/bookmark_spec.rb +11 -0
- data/live/category_spec.rb +12 -0
- data/live/collection_spec.rb +68 -0
- data/live/crm_spec.rb +11 -0
- data/live/custom_role_spec.rb +5 -0
- data/live/forum_spec.rb +14 -0
- data/live/forum_subscription_spec.rb +12 -0
- data/live/group_membership_spec.rb +18 -0
- data/live/group_spec.rb +14 -0
- data/live/identity_spec.rb +14 -0
- data/live/locale_spec.rb +11 -0
- data/live/macro_spec.rb +5 -0
- data/live/mobile_device_spec.rb +11 -0
- data/live/organization_spec.rb +12 -0
- data/live/satisfaction_rating_spec.rb +6 -0
- data/live/setting_spec.rb +5 -0
- data/live/suspended_ticket_spec.rb +8 -0
- data/live/ticket_field_spec.rb +12 -0
- data/live/ticket_metrics_spec.rb +6 -0
- data/live/ticket_spec.rb +88 -0
- data/live/topic_comment_spec.rb +13 -0
- data/live/topic_spec.rb +18 -0
- data/live/topic_subscription_spec.rb +12 -0
- data/live/topic_vote_spec.rb +13 -0
- data/live/upload_spec.rb +9 -0
- data/live/user_spec.rb +13 -0
- data/live/view_spec.rb +6 -0
- data/spec/association_spec.rb +210 -0
- data/spec/client_spec.rb +149 -0
- data/spec/collection_spec.rb +302 -0
- data/spec/configuration_spec.rb +24 -0
- data/spec/create_resource_spec.rb +39 -0
- data/spec/data_resource_spec.rb +229 -0
- data/spec/fixtures/Argentina.gif +0 -0
- data/spec/fixtures/Argentina2.gif +0 -0
- data/spec/fixtures/credentials.yml.example +3 -0
- data/spec/fixtures/test_resources.rb +8 -0
- data/spec/fixtures/zendesk.rb +88 -0
- data/spec/lru_cache_spec.rb +26 -0
- data/spec/macros/resource_macros.rb +157 -0
- data/spec/middleware/request/etag_cache_spec.rb +17 -0
- data/spec/middleware/request/retry_spec.rb +47 -0
- data/spec/middleware/request/test.jpg +0 -0
- data/spec/middleware/request/upload_spec.rb +74 -0
- data/spec/middleware/response/callback_spec.rb +17 -0
- data/spec/middleware/response/deflate_spec.rb +15 -0
- data/spec/middleware/response/gzip_spec.rb +19 -0
- data/spec/middleware/response/parse_iso_dates_spec.rb +44 -0
- data/spec/playlist_spec.rb +95 -0
- data/spec/read_resource_spec.rb +37 -0
- data/spec/rescue_spec.rb +94 -0
- data/spec/resource_spec.rb +332 -0
- data/spec/spec_helper.rb +120 -0
- data/spec/string_spec.rb +7 -0
- data/spec/trackie_spec.rb +39 -0
- data/zendesk_api.gemspec +38 -0
- metadata +364 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/.yardopts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--no-private --protected lib/**/*.rb - Readme.md
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
zendesk_api (0.0.9)
|
5
|
+
faraday (>= 0.8.0)
|
6
|
+
faraday_middleware (>= 0.8.7)
|
7
|
+
hashie
|
8
|
+
inflection
|
9
|
+
json
|
10
|
+
mime-types
|
11
|
+
multipart-post
|
12
|
+
|
13
|
+
GEM
|
14
|
+
remote: https://rubygems.org/
|
15
|
+
specs:
|
16
|
+
addressable (2.2.8)
|
17
|
+
crack (0.3.1)
|
18
|
+
diff-lcs (1.1.3)
|
19
|
+
faraday (0.8.1)
|
20
|
+
multipart-post (~> 1.1)
|
21
|
+
faraday_middleware (0.8.7)
|
22
|
+
faraday (>= 0.7.4, < 0.9)
|
23
|
+
hashie (1.2.0)
|
24
|
+
inflection (1.0.0)
|
25
|
+
json (1.7.3)
|
26
|
+
mime-types (1.19)
|
27
|
+
multi_json (1.3.6)
|
28
|
+
multipart-post (1.1.5)
|
29
|
+
rake (0.9.2.2)
|
30
|
+
rspec (2.10.0)
|
31
|
+
rspec-core (~> 2.10.0)
|
32
|
+
rspec-expectations (~> 2.10.0)
|
33
|
+
rspec-mocks (~> 2.10.0)
|
34
|
+
rspec-core (2.10.1)
|
35
|
+
rspec-expectations (2.10.0)
|
36
|
+
diff-lcs (~> 1.1.3)
|
37
|
+
rspec-mocks (2.10.1)
|
38
|
+
simplecov (0.6.4)
|
39
|
+
multi_json (~> 1.0)
|
40
|
+
simplecov-html (~> 0.5.3)
|
41
|
+
simplecov-html (0.5.3)
|
42
|
+
vcr (2.2.2)
|
43
|
+
webmock (1.8.7)
|
44
|
+
addressable (>= 2.2.7)
|
45
|
+
crack (>= 0.1.7)
|
46
|
+
yard (0.8.2.1)
|
47
|
+
|
48
|
+
PLATFORMS
|
49
|
+
ruby
|
50
|
+
|
51
|
+
DEPENDENCIES
|
52
|
+
jruby-openssl
|
53
|
+
rake
|
54
|
+
rspec (>= 2.0.0)
|
55
|
+
simplecov
|
56
|
+
vcr
|
57
|
+
webmock
|
58
|
+
yard
|
59
|
+
zendesk_api!
|
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2012 Zendesk
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'rake/testtask'
|
2
|
+
require 'bundler/gem_tasks'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
rescue LoadError
|
7
|
+
end
|
8
|
+
|
9
|
+
if defined?(RSpec)
|
10
|
+
desc "Run specs"
|
11
|
+
RSpec::Core::RakeTask.new(:spec)
|
12
|
+
|
13
|
+
desc "Run live specs"
|
14
|
+
RSpec::Core::RakeTask.new("spec:live") do |t|
|
15
|
+
t.pattern = "live/*_spec.rb"
|
16
|
+
end
|
17
|
+
|
18
|
+
task :clean_live do
|
19
|
+
sh "rm -rf spec/fixtures/cassettes"
|
20
|
+
end
|
21
|
+
|
22
|
+
if RUBY_VERSION =~ /1.9/
|
23
|
+
desc "Find coverage"
|
24
|
+
task "spec:coverage" do
|
25
|
+
ENV["COVERAGE"] = "yes"
|
26
|
+
Rake::Task["spec"].invoke
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
desc 'Default: run specs.'
|
31
|
+
task :default => :spec
|
32
|
+
end
|
33
|
+
|
34
|
+
# extracted from https://github.com/grosser/project_template
|
35
|
+
rule /^version:bump:.*/ do |t|
|
36
|
+
sh "git status | grep 'nothing to commit'" # ensure we are not dirty
|
37
|
+
index = ['major', 'minor','patch'].index(t.name.split(':').last)
|
38
|
+
file = 'lib/zendesk_api/version.rb'
|
39
|
+
|
40
|
+
version_file = File.read(file)
|
41
|
+
old_version, *version_parts = version_file.match(/(\d+)\.(\d+)\.(\d+)/).to_a
|
42
|
+
version_parts[index] = version_parts[index].to_i + 1
|
43
|
+
version_parts[2] = 0 if index < 2 # remove patch for minor
|
44
|
+
version_parts[1] = 0 if index < 1 # remove minor for major
|
45
|
+
new_version = version_parts * '.'
|
46
|
+
File.open(file,'w'){|f| f.write(version_file.sub(old_version, new_version)) }
|
47
|
+
|
48
|
+
sh "bundle && git add #{file} Gemfile.lock && git commit -m 'bump version to #{new_version}'"
|
49
|
+
end
|
data/Readme.md
ADDED
@@ -0,0 +1,178 @@
|
|
1
|
+
# Zendesk API Client
|
2
|
+
|
3
|
+
## API version support
|
4
|
+
|
5
|
+
This client **only** supports Zendesk's v2 API. Please see our [API documentation](http://developer.zendesk.com) for more information.
|
6
|
+
|
7
|
+
## Important Notice
|
8
|
+
|
9
|
+
Version 0.0.5 brings with it a change to the top-level namespace. All references to Zendesk should now use ZendeskAPI.
|
10
|
+
|
11
|
+
## Installation
|
12
|
+
|
13
|
+
Currently
|
14
|
+
|
15
|
+
gem install zendesk_api
|
16
|
+
|
17
|
+
will not install this version of the API client. To install this client, either clone this repository and run
|
18
|
+
|
19
|
+
rake install
|
20
|
+
|
21
|
+
or add it to a Gemfile like so:
|
22
|
+
|
23
|
+
gem "zendesk_api", :git => "git://github.com/zendesk/zendesk_api_client_rb.git" #, :tag => "vX.X.X"
|
24
|
+
|
25
|
+
## Configuration
|
26
|
+
|
27
|
+
Configuration is done through a block returning an instance of ZendeskAPI::Client.
|
28
|
+
The block is mandatory and if not passed, an ArgumentError will be thrown.
|
29
|
+
|
30
|
+
```
|
31
|
+
ZendeskAPI::Client.new do |config|
|
32
|
+
# Mandatory:
|
33
|
+
|
34
|
+
config.url = "https://mydesk.zendesk.com/api/v2"
|
35
|
+
|
36
|
+
config.username = "test.user"
|
37
|
+
config.password = "test.password"
|
38
|
+
|
39
|
+
# Optional:
|
40
|
+
|
41
|
+
# Retry uses middleware to notify the user
|
42
|
+
# when hitting the rate limit, sleep automatically,
|
43
|
+
# then retry the request.
|
44
|
+
config.retry = true
|
45
|
+
|
46
|
+
# Logger prints to STDERR by default, to e.g. print to stdout:
|
47
|
+
require 'logger'
|
48
|
+
config.logger = Logger.new(STDOUT)
|
49
|
+
|
50
|
+
# Changes Faraday adapter
|
51
|
+
config.adapter = :patron
|
52
|
+
|
53
|
+
# Merged with the default client options hash
|
54
|
+
config.client_options = { :ssl => false }
|
55
|
+
|
56
|
+
# When getting the error 'hostname does not match the server certificate'
|
57
|
+
# use the API at https://yoursubdomain.zendesk.com/api/v2
|
58
|
+
end
|
59
|
+
```
|
60
|
+
|
61
|
+
Note: This ZendeskAPI API client only supports basic authentication at the moment.
|
62
|
+
|
63
|
+
## Usage
|
64
|
+
|
65
|
+
The result of configuration is an instance of ZendeskAPI::Client which can then be used in two different methods.
|
66
|
+
|
67
|
+
One way to use the client is to pass it in as an argument to individual classes.
|
68
|
+
|
69
|
+
```
|
70
|
+
ZendeskAPI::Ticket.new(client, :id => 1, :priority => "urgent") # doesn't actually send a request, must explicitly call #save
|
71
|
+
ZendeskAPI::Ticket.create(client, :subject => "Test Ticket", :description => "This is a test", :submitter_id => client.current_user.id, :priority => "urgent")
|
72
|
+
ZendeskAPI::Ticket.find(client, :id => 1)
|
73
|
+
ZendeskAPI::Ticket.delete(client, :id => 1)
|
74
|
+
```
|
75
|
+
|
76
|
+
Another way is to use the instance methods under client.
|
77
|
+
|
78
|
+
```
|
79
|
+
client.tickets.first
|
80
|
+
client.tickets.find(:id => 1)
|
81
|
+
client.tickets.create(:subject => "Test Ticket", :description => "This is a test", :submitter_id => client.current_user.id, :priority => "urgent")
|
82
|
+
client.tickets.delete(:id => 1)
|
83
|
+
```
|
84
|
+
|
85
|
+
The methods under ZendeskAPI::Client (such as .tickets) return an instance of ZendeskAPI::Collection a lazy-loaded list of that resource.
|
86
|
+
Actual requests may not be sent until an explicit ZendeskAPI::Collection#fetch, ZendeskAPI::Collection#to_a, or an applicable methods such
|
87
|
+
as #each.
|
88
|
+
|
89
|
+
### Pagination
|
90
|
+
|
91
|
+
ZendeskAPI::Collections can be paginated:
|
92
|
+
|
93
|
+
```
|
94
|
+
tickets = client.tickets.page(2).per_page(3)
|
95
|
+
next_page = tickets.next
|
96
|
+
previous_page = tickets.prev
|
97
|
+
```
|
98
|
+
|
99
|
+
### Callbacks
|
100
|
+
|
101
|
+
Callbacks can be added to the ZendeskAPI::Client instance and will be called (with the response env) after all response middleware on a successful request.
|
102
|
+
|
103
|
+
```
|
104
|
+
client.insert_callback do |env|
|
105
|
+
puts env[:response_headers]
|
106
|
+
end
|
107
|
+
```
|
108
|
+
|
109
|
+
### Resource management
|
110
|
+
|
111
|
+
Individual resources can be created, modified, saved, and destroyed.
|
112
|
+
|
113
|
+
```
|
114
|
+
ticket = client.tickets[0] # ZendeskAPI::Ticket.find(client, :id => 1)
|
115
|
+
ticket.priority = "urgent"
|
116
|
+
ticket.attributes # => { "priority" => "urgent" }
|
117
|
+
ticket.save # Will PUT => true
|
118
|
+
ticket.destroy # => true
|
119
|
+
|
120
|
+
ZendeskAPI::Ticket.new(client, { :priority => "urgent" })
|
121
|
+
ticket.new_record? # => true
|
122
|
+
ticket.save # Will POST
|
123
|
+
```
|
124
|
+
|
125
|
+
### Special case: Custom resources paths
|
126
|
+
|
127
|
+
API endpoints such as tickets/recent or topics/show_many can be accessed through chaining.
|
128
|
+
They will too return an instance of ZendeskAPI::Collection.
|
129
|
+
|
130
|
+
```
|
131
|
+
client.tickets.recent
|
132
|
+
client.topics.show_many(:verb => :post, :ids => [1, 2, 3])
|
133
|
+
```
|
134
|
+
|
135
|
+
### Special Case: Current user
|
136
|
+
|
137
|
+
Use either of the following to obtain the current user instance:
|
138
|
+
|
139
|
+
```
|
140
|
+
client.users.find(:id => 'me')
|
141
|
+
client.current_user
|
142
|
+
```
|
143
|
+
|
144
|
+
### Attaching files
|
145
|
+
|
146
|
+
Files can be attached to tickets using either a path or the File class and will
|
147
|
+
be automatically uploaded and attached.
|
148
|
+
|
149
|
+
```
|
150
|
+
ticket = Ticket.new(...)
|
151
|
+
ticket.uploads << "img.jpg"
|
152
|
+
ticket.uploads << File.new("img.jpg")
|
153
|
+
ticket.save
|
154
|
+
```
|
155
|
+
|
156
|
+
## TODO
|
157
|
+
|
158
|
+
* Search class detection
|
159
|
+
* Live Testing
|
160
|
+
|
161
|
+
## Note on Patches/Pull Requests
|
162
|
+
1. Fork the project.
|
163
|
+
2. Make your feature addition or bug fix.
|
164
|
+
3. Add tests for it. This is important so I don't break it in a future version
|
165
|
+
unintentionally.
|
166
|
+
4. Commit, do not mess with rakefile, version, or history. (if you want to have
|
167
|
+
your own version, that is fine but bump version in a commit by itself I can
|
168
|
+
ignore when I pull)
|
169
|
+
5. Send me a pull request. Bonus points for topic branches.
|
170
|
+
|
171
|
+
## Supported Ruby Versions
|
172
|
+
|
173
|
+
Tested with Ruby 1.8.7 and 1.9.3
|
174
|
+
[](http://travis-ci.org/zendesk/zendesk_api_client_rb)
|
175
|
+
|
176
|
+
## Copyright
|
177
|
+
|
178
|
+
See [LICENSE](https://github.com/zendesk/zendesk_api_client_rb/blob/master/LICENSE)
|
data/lib/zendesk_api.rb
ADDED
@@ -0,0 +1,176 @@
|
|
1
|
+
module ZendeskAPI
|
2
|
+
module Save
|
3
|
+
# If this resource hasn't been deleted, then create or save it.
|
4
|
+
# Executes a POST if it is a {#new_record?}, otherwise a PUT.
|
5
|
+
# Merges returned attributes on success.
|
6
|
+
# @return [Boolean] Success?
|
7
|
+
def save(options={})
|
8
|
+
return false if respond_to?(:destroyed?) && destroyed?
|
9
|
+
|
10
|
+
if new_record?
|
11
|
+
method = :post
|
12
|
+
req_path = path
|
13
|
+
else
|
14
|
+
method = :put
|
15
|
+
req_path = url || path
|
16
|
+
end
|
17
|
+
|
18
|
+
req_path = options[:path] if options[:path]
|
19
|
+
|
20
|
+
save_associations
|
21
|
+
|
22
|
+
response = @client.connection.send(method, req_path) do |req|
|
23
|
+
req.body = if self.class.unnested_params
|
24
|
+
attributes.changes
|
25
|
+
else
|
26
|
+
{self.class.singular_resource_name.to_sym => attributes.changes}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
@attributes.replace @attributes.deep_merge(response.body[self.class.singular_resource_name] || {})
|
31
|
+
@attributes.clear_changes
|
32
|
+
true
|
33
|
+
end
|
34
|
+
|
35
|
+
def save!(options={})
|
36
|
+
save(options) || raise("Save failed")
|
37
|
+
end
|
38
|
+
|
39
|
+
def save_associations
|
40
|
+
self.class.associations.each do |association_data|
|
41
|
+
association_name = association_data[:name]
|
42
|
+
next unless send("#{association_name}_used?") && association = send(association_name)
|
43
|
+
|
44
|
+
if association.respond_to?(:save) && (association.is_a?(Collection) || !association.changes.empty?)
|
45
|
+
association.save
|
46
|
+
self.send("#{association_name}=", association) # set id/ids columns
|
47
|
+
end
|
48
|
+
|
49
|
+
if association_data[:inline]
|
50
|
+
attributes[association_name] = (association.is_a?(Collection) ? association.map(&:to_param) : association.to_param)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
module Read
|
57
|
+
include Rescue
|
58
|
+
|
59
|
+
# Finds a resource by an id and any options passed in.
|
60
|
+
# A custom path to search at can be passed into opts. It defaults to the {DataResource.resource_name} of the class.
|
61
|
+
# @param [Client] client The {Client} object to be used
|
62
|
+
# @param [Hash] options Any additional GET parameters to be added
|
63
|
+
def find(client, options = {})
|
64
|
+
@client = client # so we can use client.logger in rescue
|
65
|
+
|
66
|
+
raise "No :id given" unless options[:id] || options["id"]
|
67
|
+
association = options.delete(:association) || Association.new(:class => self)
|
68
|
+
|
69
|
+
response = client.connection.get(association.generate_path(options)) do |req|
|
70
|
+
req.params = options
|
71
|
+
end
|
72
|
+
|
73
|
+
new(client, response.body[singular_resource_name])
|
74
|
+
end
|
75
|
+
|
76
|
+
rescue_client_error :find
|
77
|
+
end
|
78
|
+
|
79
|
+
module Create
|
80
|
+
include Save
|
81
|
+
|
82
|
+
def self.included(base)
|
83
|
+
base.extend(ClassMethods)
|
84
|
+
end
|
85
|
+
|
86
|
+
module ClassMethods
|
87
|
+
include Rescue
|
88
|
+
|
89
|
+
# Create a resource given the attributes passed in.
|
90
|
+
# @param [Client] client The {Client} object to be used
|
91
|
+
# @param [Hash] attributes The attributes to create.
|
92
|
+
def create(client, attributes = {})
|
93
|
+
ZendeskAPI::Client.check_deprecated_namespace_usage attributes, singular_resource_name
|
94
|
+
resource = new(client, attributes)
|
95
|
+
return unless resource.save
|
96
|
+
resource
|
97
|
+
end
|
98
|
+
|
99
|
+
def create!(client, attributes={})
|
100
|
+
c = create(client, attributes)
|
101
|
+
c || raise("Create failed #{self} #{attributes}")
|
102
|
+
end
|
103
|
+
|
104
|
+
rescue_client_error :create
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
module Destroy
|
109
|
+
include Rescue
|
110
|
+
|
111
|
+
def self.included(klass)
|
112
|
+
klass.extend(ClassMethod)
|
113
|
+
end
|
114
|
+
|
115
|
+
# Has this object been deleted?
|
116
|
+
def destroyed?
|
117
|
+
@destroyed ||= false
|
118
|
+
end
|
119
|
+
|
120
|
+
# If this resource hasn't already been deleted, then do so.
|
121
|
+
# @return [Boolean] Successful?
|
122
|
+
def destroy
|
123
|
+
return false if destroyed? || new_record?
|
124
|
+
@client.connection.delete(url || path)
|
125
|
+
@destroyed = true
|
126
|
+
end
|
127
|
+
|
128
|
+
rescue_client_error :destroy, :with => false
|
129
|
+
|
130
|
+
module ClassMethod
|
131
|
+
include Rescue
|
132
|
+
|
133
|
+
# Deletes a resource given the id passed in.
|
134
|
+
# @param [Client] client The {Client} object to be used
|
135
|
+
# @param [Hash] opts The optional parameters to pass. Defaults to {}
|
136
|
+
def destroy(client, opts = {})
|
137
|
+
@client = client # so we can use client.logger in rescue
|
138
|
+
association = opts.delete(:association) || Association.new(:class => self)
|
139
|
+
|
140
|
+
client.connection.delete(association.generate_path(opts)) do |req|
|
141
|
+
req.params = opts
|
142
|
+
end
|
143
|
+
|
144
|
+
true
|
145
|
+
end
|
146
|
+
|
147
|
+
rescue_client_error :destroy, :with => false
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
module Update
|
152
|
+
include Rescue
|
153
|
+
include Save
|
154
|
+
|
155
|
+
def self.included(klass)
|
156
|
+
klass.extend(ClassMethod)
|
157
|
+
end
|
158
|
+
|
159
|
+
rescue_client_error :save, :with => false
|
160
|
+
|
161
|
+
module ClassMethod
|
162
|
+
include Rescue
|
163
|
+
|
164
|
+
# Updates a resource given the id passed in.
|
165
|
+
# @param [Client] client The {Client} object to be used
|
166
|
+
# @param [Hash] attributes The attributes to update. Default to {}
|
167
|
+
def update(client, attributes = {})
|
168
|
+
ZendeskAPI::Client.check_deprecated_namespace_usage attributes, singular_resource_name
|
169
|
+
resource = new(client, attributes)
|
170
|
+
resource.save
|
171
|
+
end
|
172
|
+
|
173
|
+
rescue_client_error :update, :with => false
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|