zendesk_api 1.0.7 → 1.1.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.
- data/Gemfile.lock +1 -1
- data/{Readme.md → README.md} +105 -0
- data/lib/zendesk_api/actions.rb +7 -3
- data/lib/zendesk_api/association.rb +3 -1
- data/lib/zendesk_api/resources.rb +83 -0
- data/lib/zendesk_api/track_changes.rb +3 -6
- data/lib/zendesk_api/version.rb +1 -1
- data/spec/core/association_spec.rb +21 -0
- data/spec/core/trackie_spec.rb +18 -0
- data/spec/fixtures/sample_app.zip +0 -0
- data/spec/live/app_spec.rb +40 -0
- data/spec/live/audit_spec.rb +10 -0
- data/spec/live/installation_spec.rb +57 -0
- metadata +9 -3
data/Gemfile.lock
CHANGED
data/{Readme.md → README.md}
RENAMED
@@ -269,6 +269,111 @@ ticket.comment.uploads << File.new("img.jpg")
|
|
269
269
|
ticket.save
|
270
270
|
```
|
271
271
|
|
272
|
+
### Apps API
|
273
|
+
|
274
|
+
v1.1.0 introduces support for the Zendesk [Apps API](http://developer.zendesk.com/documentation/apps/reference/api.html)
|
275
|
+
|
276
|
+
#### Creating Apps
|
277
|
+
|
278
|
+
```ruby
|
279
|
+
upload = client.apps.uploads.create!(:file => "path/to/app.zip")
|
280
|
+
client.apps.create!(:name => "test", :short_description => "My test app", :upload_id => upload.id)
|
281
|
+
|
282
|
+
# Or
|
283
|
+
|
284
|
+
app = ZendeskAPI::App.new(client, :name => "test", :short_description => "My test app")
|
285
|
+
app.upload = "path/to/app.zip"
|
286
|
+
app.save!
|
287
|
+
|
288
|
+
# Or
|
289
|
+
|
290
|
+
upload = ZendeskAPI::App::Upload.new(client, :file => "path/to/app.zip")
|
291
|
+
upload.save!
|
292
|
+
|
293
|
+
app = ZendeskAPI::App.new(client, :name => "test")
|
294
|
+
app.short_description = "My test app"
|
295
|
+
app.upload_id = upload.id
|
296
|
+
app.save!
|
297
|
+
|
298
|
+
# Not supported!
|
299
|
+
client.apps.create!(:name => "test", :short_description => "My test app", :upload => "app.zip")
|
300
|
+
```
|
301
|
+
|
302
|
+
*Note: job statuses are currently not supported, so you must manually poll the job status API for app creation.*
|
303
|
+
```ruby
|
304
|
+
body = {}
|
305
|
+
until %w{failed completed}.include?(body["status"])
|
306
|
+
response = client.connection.get(app.response.headers["Location"])
|
307
|
+
body = response.body
|
308
|
+
|
309
|
+
sleep(body["retry_in"])
|
310
|
+
end
|
311
|
+
```
|
312
|
+
|
313
|
+
#### Updating Apps
|
314
|
+
|
315
|
+
```ruby
|
316
|
+
client.apps.update!(:id => 123, :short_description => "New Description")
|
317
|
+
|
318
|
+
app = ZendeskAPI::App.new(client, :id => 123, :short_description => "New Description")
|
319
|
+
app.save!
|
320
|
+
|
321
|
+
ZendeskAPI::App.update!(client, :id => 123, :short_description => "New Description")
|
322
|
+
```
|
323
|
+
|
324
|
+
#### Deleting Apps
|
325
|
+
|
326
|
+
```ruby
|
327
|
+
client.apps.destroy!(:id => 123)
|
328
|
+
|
329
|
+
app = ZendeskAPI::App.new(client, :id => 123)
|
330
|
+
app.destroy!
|
331
|
+
|
332
|
+
ZendeskAPI::App.destroy!(client, :id => 123)
|
333
|
+
```
|
334
|
+
|
335
|
+
#### Installing an App
|
336
|
+
|
337
|
+
```ruby
|
338
|
+
install = ZendeskAPI::App::Installation.new(client, :app_id => 123)
|
339
|
+
install.save!
|
340
|
+
|
341
|
+
client.apps.installations.create!(:app_id => 123)
|
342
|
+
|
343
|
+
ZendeskAPI::App::Installation.create!(client, :app_id => 123)
|
344
|
+
```
|
345
|
+
|
346
|
+
#### List Installations
|
347
|
+
|
348
|
+
```ruby
|
349
|
+
apps = client.app.installations
|
350
|
+
apps.fetch!
|
351
|
+
```
|
352
|
+
|
353
|
+
#### Update Installation
|
354
|
+
|
355
|
+
```ruby
|
356
|
+
client.app.installations.update!(:id => 123, :settings => { :title => "My New Name" })
|
357
|
+
|
358
|
+
install = ZendeskAPI::App::Installation.new(client, :id => 123)
|
359
|
+
install.settings = { :title => "My New Name" }
|
360
|
+
install.save!
|
361
|
+
|
362
|
+
ZendeskAPI::App::Installation.update!(client, :id => 123, :settings => { :title => "My New Name" })
|
363
|
+
```
|
364
|
+
|
365
|
+
#### Delete Installation
|
366
|
+
|
367
|
+
```ruby
|
368
|
+
client.app.installations.destroy!(:id => 123)
|
369
|
+
|
370
|
+
install = ZendeskAPI::App::Installation.new(client, :id => 123)
|
371
|
+
install.destroy!
|
372
|
+
|
373
|
+
ZendeskAPI::App::Installation.destroy!(client, :id => 123)
|
374
|
+
```
|
375
|
+
|
376
|
+
|
272
377
|
## Note on Patches/Pull Requests
|
273
378
|
1. Fork the project.
|
274
379
|
2. Make your feature addition or bug fix.
|
data/lib/zendesk_api/actions.rb
CHANGED
@@ -25,9 +25,7 @@ module ZendeskAPI
|
|
25
25
|
yield req if block_given?
|
26
26
|
end
|
27
27
|
|
28
|
-
|
29
|
-
@attributes.replace @attributes.deep_merge(@response.body[self.class.singular_resource_name] || {})
|
30
|
-
end
|
28
|
+
handle_response
|
31
29
|
|
32
30
|
@attributes.clear_changes
|
33
31
|
clear_associations
|
@@ -71,6 +69,12 @@ module ZendeskAPI
|
|
71
69
|
end
|
72
70
|
end
|
73
71
|
end
|
72
|
+
|
73
|
+
def handle_response
|
74
|
+
if @response.body && @response.body[self.class.singular_resource_name]
|
75
|
+
@attributes.replace @attributes.deep_merge(@response.body[self.class.singular_resource_name] || {})
|
76
|
+
end
|
77
|
+
end
|
74
78
|
end
|
75
79
|
|
76
80
|
module Read
|
@@ -32,6 +32,8 @@ module ZendeskAPI
|
|
32
32
|
instance = args.first
|
33
33
|
|
34
34
|
namespace = @options[:class].to_s.split("::")
|
35
|
+
namespace[-1] = @options[:class].resource_path
|
36
|
+
|
35
37
|
%w(ZendeskAPI Voice).each { |ns| namespace.delete(ns) }
|
36
38
|
has_parent = namespace.size > 1 || (options[:with_parent] && @options.parent)
|
37
39
|
|
@@ -118,7 +120,7 @@ module ZendeskAPI
|
|
118
120
|
return unless association_on_parent = parent_class.associations.detect {|a| a[:class] == @options[:class] }
|
119
121
|
[
|
120
122
|
extract_parent_id(parent_class, instance, options, original_options),
|
121
|
-
@options.path || association_on_parent[:name].to_s
|
123
|
+
@options.path || association_on_parent[:path] || association_on_parent[:name].to_s
|
122
124
|
]
|
123
125
|
end
|
124
126
|
|
@@ -263,8 +263,14 @@ module ZendeskAPI
|
|
263
263
|
|
264
264
|
class Ticket < Resource
|
265
265
|
class Audit < DataResource
|
266
|
+
class Event < Data
|
267
|
+
has :author, :class => User
|
268
|
+
end
|
269
|
+
|
266
270
|
# need this to support SideLoading
|
267
271
|
has :author, :class => User
|
272
|
+
|
273
|
+
has_many Event
|
268
274
|
end
|
269
275
|
|
270
276
|
class Comment < Data
|
@@ -451,6 +457,8 @@ module ZendeskAPI
|
|
451
457
|
has_many TopicSubscription
|
452
458
|
has_many :topic_comments, :class => TopicComment
|
453
459
|
has_many :topic_votes, :class => Topic::TopicVote
|
460
|
+
|
461
|
+
has_many Setting
|
454
462
|
end
|
455
463
|
|
456
464
|
class UserField < Resource; end
|
@@ -485,4 +493,79 @@ module ZendeskAPI
|
|
485
493
|
# TODO
|
486
494
|
# post :clone
|
487
495
|
end
|
496
|
+
|
497
|
+
class App < DataResource
|
498
|
+
include Create
|
499
|
+
include Update
|
500
|
+
include Destroy
|
501
|
+
|
502
|
+
def initialize(client, attributes = {})
|
503
|
+
attributes[:upload_id] ||= nil
|
504
|
+
|
505
|
+
super
|
506
|
+
end
|
507
|
+
|
508
|
+
class Upload < Data
|
509
|
+
class << self
|
510
|
+
def resource_path
|
511
|
+
"uploads"
|
512
|
+
end
|
513
|
+
end
|
514
|
+
|
515
|
+
include Create
|
516
|
+
|
517
|
+
def initialize(client, attributes)
|
518
|
+
attributes[:file] ||= attributes.delete(:id)
|
519
|
+
|
520
|
+
super
|
521
|
+
end
|
522
|
+
|
523
|
+
# Not nested under :upload, just returns :id
|
524
|
+
def save!(*)
|
525
|
+
super.tap do
|
526
|
+
attributes.id = @response.body["id"]
|
527
|
+
end
|
528
|
+
end
|
529
|
+
|
530
|
+
# Always save
|
531
|
+
def changed?
|
532
|
+
true
|
533
|
+
end
|
534
|
+
|
535
|
+
# Don't nest attributes
|
536
|
+
def attributes_for_save
|
537
|
+
attributes
|
538
|
+
end
|
539
|
+
end
|
540
|
+
|
541
|
+
class Installation < Resource
|
542
|
+
# Don't nest attributes
|
543
|
+
def attributes_for_save
|
544
|
+
attributes.changes
|
545
|
+
end
|
546
|
+
|
547
|
+
def handle_response
|
548
|
+
@attributes.replace(@response.body) if @response.body
|
549
|
+
end
|
550
|
+
end
|
551
|
+
|
552
|
+
def self.uploads(client, *args, &block)
|
553
|
+
ZendeskAPI::Collection.new(client, Upload, *args, &block)
|
554
|
+
end
|
555
|
+
|
556
|
+
def self.installations(client, *args, &block)
|
557
|
+
ZendeskAPI::Collection.new(client, Installation, *args, &block)
|
558
|
+
end
|
559
|
+
|
560
|
+
has Upload, :path => "uploads"
|
561
|
+
|
562
|
+
# Don't nest attributes
|
563
|
+
def attributes_for_save
|
564
|
+
attributes.changes
|
565
|
+
end
|
566
|
+
|
567
|
+
def handle_response
|
568
|
+
@attributes.replace(@response.body) if @response.body
|
569
|
+
end
|
570
|
+
end
|
488
571
|
end
|
@@ -44,10 +44,6 @@ module ZendeskAPI
|
|
44
44
|
keys.each{|key| delete key}
|
45
45
|
end
|
46
46
|
|
47
|
-
def [](key)
|
48
|
-
super(key)
|
49
|
-
end
|
50
|
-
|
51
47
|
def regular_writer(key, value)
|
52
48
|
if self.has_key?(key) && self[key] == value
|
53
49
|
value
|
@@ -58,8 +54,9 @@ module ZendeskAPI
|
|
58
54
|
end
|
59
55
|
|
60
56
|
def delete(key)
|
61
|
-
|
62
|
-
|
57
|
+
super.tap do |value|
|
58
|
+
changes[key] = nil
|
59
|
+
end
|
63
60
|
end
|
64
61
|
|
65
62
|
def changes
|
data/lib/zendesk_api/version.rb
CHANGED
@@ -180,6 +180,27 @@ describe ZendeskAPI::Association do
|
|
180
180
|
subject.generate_path.should == "test_resources/1/blergh"
|
181
181
|
end
|
182
182
|
end
|
183
|
+
|
184
|
+
context "with a path on the association" do
|
185
|
+
before(:each) do
|
186
|
+
association = ZendeskAPI::TestResource.associations.detect {|a| a[:name] == :children}
|
187
|
+
association[:path] = "blergh"
|
188
|
+
end
|
189
|
+
|
190
|
+
it "should generate nested resource path" do
|
191
|
+
subject.generate_path.should == "test_resources/1/blergh"
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
context "with no association" do
|
196
|
+
before(:each) do
|
197
|
+
ZendeskAPI::TestResource.associations.clear
|
198
|
+
end
|
199
|
+
|
200
|
+
it "should generate nested resource path" do
|
201
|
+
subject.generate_path.should == "test_resources/test_children"
|
202
|
+
end
|
203
|
+
end
|
183
204
|
end
|
184
205
|
|
185
206
|
context "class with a parent id" do
|
data/spec/core/trackie_spec.rb
CHANGED
@@ -21,6 +21,24 @@ describe ZendeskAPI::Trackie do
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
+
context "deleting keys" do
|
25
|
+
before(:each) do
|
26
|
+
subject[:key] = true
|
27
|
+
end
|
28
|
+
|
29
|
+
it "returns key on deletion" do
|
30
|
+
subject.delete(:key).should be_true
|
31
|
+
end
|
32
|
+
|
33
|
+
context "after deletion" do
|
34
|
+
before(:each) { subject.delete(:key) }
|
35
|
+
|
36
|
+
it "keeps the changes" do
|
37
|
+
subject.changed?(:key).should be_true
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
24
42
|
context "adding identical keys" do
|
25
43
|
before(:each) do
|
26
44
|
subject[:key] = "foo"
|
Binary file
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'core/spec_helper'
|
2
|
+
|
3
|
+
describe ZendeskAPI::App do
|
4
|
+
it "should work "do
|
5
|
+
upload = VCR.use_cassette("app_upload_create") do
|
6
|
+
ZendeskAPI::App::Upload.new(client, :id => "spec/fixtures/sample_app.zip").tap(&:save!)
|
7
|
+
end
|
8
|
+
|
9
|
+
attributes = { :upload_id => upload.id, :name => "My App", :short_description => "Testing" }
|
10
|
+
|
11
|
+
app = ZendeskAPI::App.new(client, attributes)
|
12
|
+
|
13
|
+
VCR.use_cassette("app_create") { app.save! }
|
14
|
+
|
15
|
+
body = {}
|
16
|
+
|
17
|
+
VCR.use_cassette("app_create_job_status") do
|
18
|
+
until %w{failed completed}.include?(body["status"])
|
19
|
+
response = client.connection.get(app.response.headers["Location"])
|
20
|
+
body = response.body
|
21
|
+
|
22
|
+
sleep(3)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
if body["status"] == "failed"
|
27
|
+
fail "Could not create app: #{body.inspect}"
|
28
|
+
end
|
29
|
+
|
30
|
+
app.id = body["app_id"]
|
31
|
+
app.short_description = "My Test App"
|
32
|
+
|
33
|
+
VCR.use_cassette("app_save") { app.save! }
|
34
|
+
|
35
|
+
app.short_description.should == "My Test App"
|
36
|
+
app.author_name.should == "Skip Moore"
|
37
|
+
|
38
|
+
VCR.use_cassette("app_destroy") { app.destroy! }
|
39
|
+
end
|
40
|
+
end
|
data/spec/live/audit_spec.rb
CHANGED
@@ -2,4 +2,14 @@ require 'core/spec_helper'
|
|
2
2
|
|
3
3
|
describe ZendeskAPI::Ticket::Audit do
|
4
4
|
it_should_be_readable ticket, :audits
|
5
|
+
|
6
|
+
describe ZendeskAPI::Ticket::Audit::Event, :vcr do
|
7
|
+
it "should side-load events" do
|
8
|
+
audit = ticket.audits(include: :users).first
|
9
|
+
event = audit.events.first
|
10
|
+
|
11
|
+
event.should be_instance_of(ZendeskAPI::Ticket::Audit::Event)
|
12
|
+
event.author.should be_instance_of(ZendeskAPI::User)
|
13
|
+
end
|
14
|
+
end
|
5
15
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'core/spec_helper'
|
2
|
+
|
3
|
+
describe ZendeskAPI::App::Installation do
|
4
|
+
it "should work "do
|
5
|
+
upload = VCR.use_cassette("app_installations_upload_create") do
|
6
|
+
ZendeskAPI::App::Upload.new(client, :id => "spec/fixtures/sample_app.zip").tap(&:save!)
|
7
|
+
end
|
8
|
+
|
9
|
+
attributes = { :upload_id => upload.id, :name => "My App", :short_description => "Testing" }
|
10
|
+
|
11
|
+
app = ZendeskAPI::App.new(client, attributes)
|
12
|
+
|
13
|
+
VCR.use_cassette("app_installations_create") { app.save! }
|
14
|
+
|
15
|
+
body = {}
|
16
|
+
|
17
|
+
VCR.use_cassette("app_installations_create_job_status") do
|
18
|
+
until %w{failed completed}.include?(body["status"])
|
19
|
+
response = client.connection.get(app.response.headers["Location"])
|
20
|
+
body = response.body
|
21
|
+
|
22
|
+
sleep(3)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
if body["status"] == "failed"
|
27
|
+
fail "Could not create app: #{body.inspect}"
|
28
|
+
end
|
29
|
+
|
30
|
+
app.id = body["app_id"]
|
31
|
+
|
32
|
+
attributes = { :app_id => app.id, :settings => {
|
33
|
+
:name => "My App",
|
34
|
+
"Custom_Field_ID" => "123",
|
35
|
+
"Custom_Field_Default" => "Default"
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
install = ZendeskAPI::App::Installation.new(client, attributes)
|
40
|
+
|
41
|
+
VCR.use_cassette("app_install_create") { install.save! }
|
42
|
+
|
43
|
+
installations = client.app.installations
|
44
|
+
VCR.use_cassette("app_install_fetch") { installations.fetch! }
|
45
|
+
|
46
|
+
installations.should include(install)
|
47
|
+
|
48
|
+
install.settings.name = "My New Name"
|
49
|
+
VCR.use_cassette("app_install_update") { install.save! }
|
50
|
+
|
51
|
+
install.settings.title.should == "My New Name"
|
52
|
+
|
53
|
+
VCR.use_cassette("app_install_destroy") { install.destroy! }
|
54
|
+
|
55
|
+
VCR.use_cassette("app_installations_destroy") { app.destroy! }
|
56
|
+
end
|
57
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zendesk_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-10-
|
13
|
+
date: 2013-10-23 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bump
|
@@ -236,8 +236,8 @@ files:
|
|
236
236
|
- Gemfile.lock
|
237
237
|
- LICENSE
|
238
238
|
- Procfile
|
239
|
+
- README.md
|
239
240
|
- Rakefile
|
240
|
-
- Readme.md
|
241
241
|
- bin/zendesk
|
242
242
|
- config.ru
|
243
243
|
- config/mongoid.yml
|
@@ -477,10 +477,12 @@ files:
|
|
477
477
|
- spec/fixtures/cassettes/ZendeskAPI_Voice_PhoneNumber_update_create.json
|
478
478
|
- spec/fixtures/cassettes/ZendeskAPI_Voice_PhoneNumber_update_delete.json
|
479
479
|
- spec/fixtures/credentials.yml.example
|
480
|
+
- spec/fixtures/sample_app.zip
|
480
481
|
- spec/fixtures/test_resources.rb
|
481
482
|
- spec/fixtures/zendesk.rb
|
482
483
|
- spec/live/Readme.md
|
483
484
|
- spec/live/activity_spec.rb
|
485
|
+
- spec/live/app_spec.rb
|
484
486
|
- spec/live/audit_spec.rb
|
485
487
|
- spec/live/automation_spec.rb
|
486
488
|
- spec/live/bookmark_spec.rb
|
@@ -492,6 +494,7 @@ files:
|
|
492
494
|
- spec/live/group_membership_spec.rb
|
493
495
|
- spec/live/group_spec.rb
|
494
496
|
- spec/live/identity_spec.rb
|
497
|
+
- spec/live/installation_spec.rb
|
495
498
|
- spec/live/locale_spec.rb
|
496
499
|
- spec/live/macro_spec.rb
|
497
500
|
- spec/live/mobile_device_spec.rb
|
@@ -586,10 +589,12 @@ test_files:
|
|
586
589
|
- spec/fixtures/cassettes/ZendeskAPI_Voice_PhoneNumber_update_create.json
|
587
590
|
- spec/fixtures/cassettes/ZendeskAPI_Voice_PhoneNumber_update_delete.json
|
588
591
|
- spec/fixtures/credentials.yml.example
|
592
|
+
- spec/fixtures/sample_app.zip
|
589
593
|
- spec/fixtures/test_resources.rb
|
590
594
|
- spec/fixtures/zendesk.rb
|
591
595
|
- spec/live/Readme.md
|
592
596
|
- spec/live/activity_spec.rb
|
597
|
+
- spec/live/app_spec.rb
|
593
598
|
- spec/live/audit_spec.rb
|
594
599
|
- spec/live/automation_spec.rb
|
595
600
|
- spec/live/bookmark_spec.rb
|
@@ -601,6 +606,7 @@ test_files:
|
|
601
606
|
- spec/live/group_membership_spec.rb
|
602
607
|
- spec/live/group_spec.rb
|
603
608
|
- spec/live/identity_spec.rb
|
609
|
+
- spec/live/installation_spec.rb
|
604
610
|
- spec/live/locale_spec.rb
|
605
611
|
- spec/live/macro_spec.rb
|
606
612
|
- spec/live/mobile_device_spec.rb
|