zendesk_api 0.1.11 → 0.2.1
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 +3 -0
- data/.travis.yml +1 -3
- data/Gemfile +24 -0
- data/Gemfile.lock +75 -10
- data/Procfile +1 -0
- data/Rakefile +10 -3
- data/Readme.md +65 -0
- data/bin/zendesk +26 -0
- data/config.ru +6 -0
- data/config/mongoid.yml +81 -0
- data/lib/zendesk_api/actions.rb +2 -2
- data/lib/zendesk_api/collection.rb +15 -4
- data/lib/zendesk_api/console/base.rb +12 -0
- data/lib/zendesk_api/console/console.rb +144 -0
- data/lib/zendesk_api/console/extensions.rb +183 -0
- data/lib/zendesk_api/console/options.rb +41 -0
- data/lib/zendesk_api/resource.rb +12 -1
- data/lib/zendesk_api/resources.rb +28 -8
- data/lib/zendesk_api/server/base.rb +119 -0
- data/lib/zendesk_api/server/docs/account_settings.md +145 -0
- data/lib/zendesk_api/server/docs/activity_stream.md +121 -0
- data/lib/zendesk_api/server/docs/attachments.md +73 -0
- data/lib/zendesk_api/server/docs/autocomplete.md +29 -0
- data/lib/zendesk_api/server/docs/categories.md +193 -0
- data/lib/zendesk_api/server/docs/custom_roles.md +88 -0
- data/lib/zendesk_api/server/docs/forum_subscriptions.md +139 -0
- data/lib/zendesk_api/server/docs/forums.md +229 -0
- data/lib/zendesk_api/server/docs/group_memberships.md +229 -0
- data/lib/zendesk_api/server/docs/groups.md +212 -0
- data/lib/zendesk_api/server/docs/introduction.md +159 -0
- data/lib/zendesk_api/server/docs/job_statuses.md +86 -0
- data/lib/zendesk_api/server/docs/locales.md +124 -0
- data/lib/zendesk_api/server/docs/macros.md +287 -0
- data/lib/zendesk_api/server/docs/organizations.md +253 -0
- data/lib/zendesk_api/server/docs/problems.md +117 -0
- data/lib/zendesk_api/server/docs/requests.md +256 -0
- data/lib/zendesk_api/server/docs/satisfaction_ratings.md +136 -0
- data/lib/zendesk_api/server/docs/search.md +106 -0
- data/lib/zendesk_api/server/docs/sharing_agreements.md +57 -0
- data/lib/zendesk_api/server/docs/side_loading.md +125 -0
- data/lib/zendesk_api/server/docs/suspended_tickets.md +182 -0
- data/lib/zendesk_api/server/docs/tags.md +36 -0
- data/lib/zendesk_api/server/docs/ticket_audits.md +657 -0
- data/lib/zendesk_api/server/docs/ticket_export.md +121 -0
- data/lib/zendesk_api/server/docs/ticket_fields.md +277 -0
- data/lib/zendesk_api/server/docs/ticket_import.md +65 -0
- data/lib/zendesk_api/server/docs/ticket_metrics.md +125 -0
- data/lib/zendesk_api/server/docs/tickets.md +622 -0
- data/lib/zendesk_api/server/docs/topic_comments.md +221 -0
- data/lib/zendesk_api/server/docs/topic_subscriptions.md +140 -0
- data/lib/zendesk_api/server/docs/topic_votes.md +154 -0
- data/lib/zendesk_api/server/docs/topics.md +335 -0
- data/lib/zendesk_api/server/docs/triggers.md +199 -0
- data/lib/zendesk_api/server/docs/user_identities.md +279 -0
- data/lib/zendesk_api/server/docs/users.md +400 -0
- data/lib/zendesk_api/server/docs/views.md +505 -0
- data/lib/zendesk_api/server/helper.rb +104 -0
- data/lib/zendesk_api/server/html_renderer.rb +98 -0
- data/lib/zendesk_api/server/models/user_request.rb +16 -0
- data/lib/zendesk_api/server/models/zlib_json.rb +13 -0
- data/lib/zendesk_api/server/public/config.rb +26 -0
- data/lib/zendesk_api/server/public/favicon.ico +0 -0
- data/lib/zendesk_api/server/public/images/glyphicons-halflings-white.png +0 -0
- data/lib/zendesk_api/server/public/images/glyphicons-halflings.png +0 -0
- data/lib/zendesk_api/server/public/images/spinner.gif +0 -0
- data/lib/zendesk_api/server/public/images/zendesk_developers_bg.png +0 -0
- data/lib/zendesk_api/server/public/images/zendesk_developers_header.png +0 -0
- data/lib/zendesk_api/server/public/javascripts/application.js +186 -0
- data/lib/zendesk_api/server/public/javascripts/bootstrap-alert.js +90 -0
- data/lib/zendesk_api/server/public/javascripts/bootstrap-button.js +96 -0
- data/lib/zendesk_api/server/public/javascripts/bootstrap-carousel.js +169 -0
- data/lib/zendesk_api/server/public/javascripts/bootstrap-collapse.js +157 -0
- data/lib/zendesk_api/server/public/javascripts/bootstrap-dropdown.js +100 -0
- data/lib/zendesk_api/server/public/javascripts/bootstrap-modal.js +218 -0
- data/lib/zendesk_api/server/public/javascripts/bootstrap-popover.js +98 -0
- data/lib/zendesk_api/server/public/javascripts/bootstrap-scrollspy.js +151 -0
- data/lib/zendesk_api/server/public/javascripts/bootstrap-tab.js +135 -0
- data/lib/zendesk_api/server/public/javascripts/bootstrap-tooltip.js +275 -0
- data/lib/zendesk_api/server/public/javascripts/bootstrap-transition.js +61 -0
- data/lib/zendesk_api/server/public/javascripts/bootstrap-typeahead.js +285 -0
- data/lib/zendesk_api/server/public/sass/screen.scss +102 -0
- data/lib/zendesk_api/server/public/sass/styles.scss +5 -0
- data/lib/zendesk_api/server/public/stylesheets/developer.screen.css +836 -0
- data/lib/zendesk_api/server/public/stylesheets/screen.css +129 -0
- data/lib/zendesk_api/server/public/stylesheets/styles.css +6208 -0
- data/lib/zendesk_api/server/templates/footer.haml +13 -0
- data/lib/zendesk_api/server/templates/header.haml +20 -0
- data/lib/zendesk_api/server/templates/index.haml +68 -0
- data/lib/zendesk_api/server/templates/layout.haml +44 -0
- data/lib/zendesk_api/server/templates/param.haml +4 -0
- data/lib/zendesk_api/server/templates/search.haml +23 -0
- data/lib/zendesk_api/server/templates/sidebar.haml +7 -0
- data/lib/zendesk_api/version.rb +1 -1
- data/spec/{association_spec.rb → core/association_spec.rb} +1 -1
- data/spec/{client_spec.rb → core/client_spec.rb} +1 -1
- data/spec/{collection_spec.rb → core/collection_spec.rb} +1 -1
- data/spec/{configuration_spec.rb → core/configuration_spec.rb} +1 -1
- data/spec/{create_resource_spec.rb → core/create_resource_spec.rb} +1 -1
- data/spec/{data_resource_spec.rb → core/data_resource_spec.rb} +1 -1
- data/spec/{inflection_spec.rb → core/inflection_spec.rb} +1 -1
- data/spec/{lru_cache_spec.rb → core/lru_cache_spec.rb} +1 -1
- data/spec/{middleware → core/middleware}/request/etag_cache_spec.rb +1 -1
- data/spec/{middleware → core/middleware}/request/retry_spec.rb +1 -1
- data/spec/{middleware → core/middleware}/request/test.jpg +0 -0
- data/spec/{middleware → core/middleware}/request/upload_spec.rb +1 -1
- data/spec/{middleware → core/middleware}/response/callback_spec.rb +1 -1
- data/spec/{middleware → core/middleware}/response/deflate_spec.rb +1 -1
- data/spec/{middleware → core/middleware}/response/gzip_spec.rb +1 -1
- data/spec/{middleware → core/middleware}/response/parse_iso_dates_spec.rb +1 -1
- data/spec/{read_resource_spec.rb → core/read_resource_spec.rb} +1 -1
- data/spec/{rescue_spec.rb → core/rescue_spec.rb} +1 -1
- data/spec/{resource_spec.rb → core/resource_spec.rb} +1 -1
- data/spec/{search_spec.rb → core/search_spec.rb} +1 -1
- data/spec/{spec_helper.rb → core/spec_helper.rb} +5 -5
- data/spec/{trackie_spec.rb → core/trackie_spec.rb} +1 -1
- data/{live → spec/live}/Readme.md +0 -0
- data/{live → spec/live}/activity_spec.rb +1 -1
- data/{live → spec/live}/audit_spec.rb +1 -1
- data/{live → spec/live}/bookmark_spec.rb +1 -1
- data/{live → spec/live}/category_spec.rb +1 -1
- data/{live → spec/live}/collection_spec.rb +1 -1
- data/{live → spec/live}/crm_spec.rb +1 -1
- data/{live → spec/live}/custom_role_spec.rb +1 -1
- data/{live → spec/live}/forum_spec.rb +1 -1
- data/{live → spec/live}/forum_subscription_spec.rb +1 -1
- data/{live → spec/live}/group_membership_spec.rb +1 -1
- data/{live → spec/live}/group_spec.rb +1 -1
- data/{live → spec/live}/identity_spec.rb +1 -1
- data/{live → spec/live}/locale_spec.rb +1 -1
- data/{live → spec/live}/macro_spec.rb +1 -1
- data/{live → spec/live}/mobile_device_spec.rb +1 -1
- data/{live → spec/live}/organization_spec.rb +1 -1
- data/{live → spec/live}/request_spec.rb +1 -1
- data/{live → spec/live}/satisfaction_rating_spec.rb +1 -1
- data/{live → spec/live}/setting_spec.rb +1 -1
- data/{live → spec/live}/suspended_ticket_spec.rb +1 -1
- data/{live → spec/live}/ticket_field_spec.rb +1 -1
- data/{live → spec/live}/ticket_metrics_spec.rb +1 -1
- data/{live → spec/live}/ticket_spec.rb +1 -1
- data/spec/live/topic_comment_spec.rb +24 -0
- data/{live → spec/live}/topic_spec.rb +1 -1
- data/{live → spec/live}/topic_subscription_spec.rb +1 -1
- data/{live → spec/live}/topic_vote_spec.rb +1 -1
- data/{live → spec/live}/upload_spec.rb +1 -1
- data/{live → spec/live}/user_spec.rb +1 -1
- data/{live → spec/live}/view_spec.rb +1 -1
- data/spec/macros/resource_macros.rb +1 -1
- data/spec/server/app_spec.rb +140 -0
- data/spec/server/helper_spec.rb +97 -0
- data/spec/server/html_renderer_spec.rb +130 -0
- data/spec/server/spec_helper.rb +43 -0
- metadata +198 -77
- data/live/topic_comment_spec.rb +0 -13
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require 'zendesk_api/console/extensions'
|
|
2
|
+
require 'zendesk_api/console/console'
|
|
3
|
+
|
|
4
|
+
extend ZendeskAPI::Console
|
|
5
|
+
|
|
6
|
+
require 'zendesk_api/console/options'
|
|
7
|
+
require 'ripl'
|
|
8
|
+
|
|
9
|
+
ARGV.clear
|
|
10
|
+
Ripl.shell.prompt = lambda { "#{cwd.respond_to?(:path) ? '/' + cwd.path : cwd} > " }
|
|
11
|
+
Ripl.shell.extend ZendeskAPI::Console::Eval
|
|
12
|
+
Ripl.start
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
module ZendeskAPI::Console
|
|
2
|
+
ZD_DIRUP = Object.new.tap do |dir|
|
|
3
|
+
dir.instance_eval do
|
|
4
|
+
def /(stuff = nil)
|
|
5
|
+
puts stuff
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
module Eval
|
|
11
|
+
def loop_eval(str)
|
|
12
|
+
split = str.split(/\s*\/\s*/)
|
|
13
|
+
split[1..-1] = split[1..-1].map do |s|
|
|
14
|
+
s =~ /\d+/ ? s : "\"#{s}\""
|
|
15
|
+
end
|
|
16
|
+
split = split.join('/')
|
|
17
|
+
split += '/' if str[-1] == '/'
|
|
18
|
+
# puts ZendeskAPI::Console::ZD_DIRUP
|
|
19
|
+
split.gsub!(/\.\./, "ZendeskAPI::Console::ZD_DIRUP")
|
|
20
|
+
super(split)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def client(&blk)
|
|
25
|
+
return @client if @client && blk.nil?
|
|
26
|
+
|
|
27
|
+
@client = ZendeskAPI::Client.new do |cfg|
|
|
28
|
+
config.each do |k,v|
|
|
29
|
+
cfg.send("#{k}=", v)
|
|
30
|
+
end if config.keys.any?
|
|
31
|
+
blk.call(cfg) unless blk.nil?
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def help
|
|
36
|
+
<<-END
|
|
37
|
+
This is help.
|
|
38
|
+
END
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def username(username)
|
|
42
|
+
client.config.username = username
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def password(password)
|
|
46
|
+
client.config.password = password
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def basic_auth(username, password)
|
|
50
|
+
username(username)
|
|
51
|
+
password(password)
|
|
52
|
+
true
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def url(url)
|
|
56
|
+
client.config.url = url
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
%w(get post put delete).each do |verb|
|
|
60
|
+
define_method verb do |*args|
|
|
61
|
+
client.connection.send(verb, *args)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def cd(new_path = nil)
|
|
66
|
+
if new_path.class.to_s =~ /^Zendesk/
|
|
67
|
+
@path = new_path
|
|
68
|
+
elsif new_path.is_a?(Fixnum) && @path
|
|
69
|
+
@path /= new_path
|
|
70
|
+
else
|
|
71
|
+
@path = nil
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
@path
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def cwd
|
|
78
|
+
begin
|
|
79
|
+
path
|
|
80
|
+
rescue ArgumentError
|
|
81
|
+
"unconfigured"
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def ls(*args)
|
|
86
|
+
if args.any?
|
|
87
|
+
args.inject(path) do |obj, arg|
|
|
88
|
+
obj.send(:/, arg)
|
|
89
|
+
end
|
|
90
|
+
elsif path.respond_to?(:to_a)
|
|
91
|
+
format = to_a.map do |elem|
|
|
92
|
+
if elem.method(:format).arity == 1
|
|
93
|
+
elem.format(client)
|
|
94
|
+
else
|
|
95
|
+
elem.format
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
lengths = format.inject([]) do |lengths, object|
|
|
100
|
+
object.each_with_index do |field, i|
|
|
101
|
+
lengths[i] = [field.to_s.length, lengths[i] || 0].max
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
lengths
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
format_headers.each_with_index do |header, i|
|
|
108
|
+
printf("%-#{lengths[i] + 2}s", header)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
puts
|
|
112
|
+
puts "---"
|
|
113
|
+
|
|
114
|
+
format.each do |object|
|
|
115
|
+
object.each_with_index do |field, i|
|
|
116
|
+
printf("%-#{lengths[i] + 2}s", field)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
puts
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
nil
|
|
123
|
+
else
|
|
124
|
+
methods = path.public_methods.reject do |method|
|
|
125
|
+
method =~ /^orig_/ || method.to_sym == :method_missing ||
|
|
126
|
+
Object.public_methods.include?(method)
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def method_missing(*args)
|
|
132
|
+
path.send(*args)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def config
|
|
136
|
+
@options ||= {}
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
private
|
|
140
|
+
|
|
141
|
+
def path
|
|
142
|
+
@path || client
|
|
143
|
+
end
|
|
144
|
+
end
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
class ZendeskAPI::FormatError < ArgumentError; end
|
|
2
|
+
|
|
3
|
+
class ZendeskAPI::Collection
|
|
4
|
+
def /(id)
|
|
5
|
+
if id == ZendeskAPI::Console::ZD_DIRUP
|
|
6
|
+
if @collection_path.length == 1
|
|
7
|
+
@client
|
|
8
|
+
else
|
|
9
|
+
@collection_path.shift
|
|
10
|
+
self
|
|
11
|
+
end
|
|
12
|
+
elsif id.is_a?(Fixnum)
|
|
13
|
+
if loaded?
|
|
14
|
+
detect {|obj| obj.id == id}
|
|
15
|
+
else
|
|
16
|
+
find(:id => id)
|
|
17
|
+
end
|
|
18
|
+
elsif !id.is_a?(ZendeskAPI::Collection)
|
|
19
|
+
send(id)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
alias :orig_log_error :log_error
|
|
24
|
+
|
|
25
|
+
def log_error(e, _)
|
|
26
|
+
raise e
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def loaded?
|
|
30
|
+
@resources && @resources.any?
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def to_s
|
|
34
|
+
path
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def format_headers
|
|
38
|
+
@resource_class.format_headers
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
class ZendeskAPI::Client
|
|
43
|
+
GET_SUBCLASSES = lambda do |ary|
|
|
44
|
+
ary.map! do |klass|
|
|
45
|
+
if klass.name =~ /Resource$/
|
|
46
|
+
GET_SUBCLASSES.call(klass.subclasses)
|
|
47
|
+
else
|
|
48
|
+
klass
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
ary.tap(&:flatten!)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def to_s
|
|
56
|
+
"/"
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def self.resources
|
|
60
|
+
@resources ||= begin
|
|
61
|
+
subclasses = GET_SUBCLASSES.call(ZendeskAPI::Data.subclasses)
|
|
62
|
+
subclasses.delete_if do |resource|
|
|
63
|
+
resource.name =~ /ZendeskAPI(::.*){2,}/
|
|
64
|
+
end
|
|
65
|
+
subclasses.sort_by(&:resource_name)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def to_a
|
|
70
|
+
self.class.resources
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def format_headers
|
|
74
|
+
["resource name"]
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
class ZendeskAPI::Data
|
|
79
|
+
def /(method)
|
|
80
|
+
if method == ZendeskAPI::Console::ZD_DIRUP
|
|
81
|
+
if association.options.parent
|
|
82
|
+
association.options.parent
|
|
83
|
+
elsif (res = @client.send(self.class.resource_name)).loaded?
|
|
84
|
+
res
|
|
85
|
+
else
|
|
86
|
+
ZendeskAPI::Collection.new(@client, self.class)
|
|
87
|
+
end
|
|
88
|
+
else
|
|
89
|
+
send(method)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
class << self
|
|
94
|
+
attr_accessor :format_headers
|
|
95
|
+
|
|
96
|
+
def format(client = nil, &block)
|
|
97
|
+
if block_given?
|
|
98
|
+
class_eval do
|
|
99
|
+
define_method :format do
|
|
100
|
+
instance_eval &block
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
elsif client && client.send(resource_name).loaded?
|
|
104
|
+
["@#{resource_name}"]
|
|
105
|
+
else
|
|
106
|
+
[resource_name]
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
class ZendeskAPI::DataResource
|
|
113
|
+
format_headers = %w{id created_at}
|
|
114
|
+
|
|
115
|
+
format do
|
|
116
|
+
if self.format_headers
|
|
117
|
+
self.format_headers.map {|attr| send(attr.to_s.downcase)}
|
|
118
|
+
else
|
|
119
|
+
raise ZendeskAPI::FormatError.new("#{self.class.name} hasn't defined an ouput format")
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
module ZendeskAPI
|
|
125
|
+
ForumSubscription.format_headers = %w{id forum_id user_id created_at}
|
|
126
|
+
GroupMembership.format_headers = %w{id group_id user_id created_at}
|
|
127
|
+
TopicSubscription.format_headers = %w{id topic_id user_id created_at}
|
|
128
|
+
Locale.format_headers = %w{Id Locale Name}
|
|
129
|
+
TicketField.format_headers = %w{Id Type Title Description}
|
|
130
|
+
Macro.format_headers = %w{Id Title}
|
|
131
|
+
|
|
132
|
+
Forum.format_headers = %w{Id Name Description Created Updated}
|
|
133
|
+
Forum.format do
|
|
134
|
+
[id, name, description, created_at, updated_at]
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
Category.format_headers = %w{Id Name Description Position Created Updated}
|
|
138
|
+
Category.format do
|
|
139
|
+
[id, name, description, position, created_at, updated_at]
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
Topic.format_headers = %w{Id Title Type}
|
|
143
|
+
Topic.format do
|
|
144
|
+
[id, title, topic_type]
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Topic::*, MobileDevice, TicketMetric, SuspendedTicket, customRole, CrmData...
|
|
148
|
+
|
|
149
|
+
Activity.format_headers = %w{Id Title User Actor Ticket}
|
|
150
|
+
Activity.format do
|
|
151
|
+
[id, title, user.name, actor.name, target.ticket.subject]
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
SatisfactionRating.format_headers = %w{Id Ticket Score Comment}
|
|
155
|
+
SatisfactionRating.format do
|
|
156
|
+
[id, ticket_id, score, comment]
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
Bookmark.format_headers = %w{Id Ticket Created}
|
|
160
|
+
Bookmark.format do
|
|
161
|
+
[id, ticket.id, created_at]
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
User.format_headers = %w{Id Name Email Created Updated}
|
|
165
|
+
User.format do
|
|
166
|
+
[id, name, email, created_at, updated_at]
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
Ticket.format_headers = %w{Id Type Subject Description Status Created Updated}
|
|
170
|
+
Ticket.format do
|
|
171
|
+
[id, type, subject, description, status, created_at, updated_at]
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
Organization.format_headers = %w{Id Name Created Updated}
|
|
175
|
+
Organization.format do
|
|
176
|
+
[id, name, created_at, updated_at]
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
View.format_headers = %w{Id Title Created Updated}
|
|
180
|
+
View.format do
|
|
181
|
+
[id, title, created_at, updated_at]
|
|
182
|
+
end
|
|
183
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'optparse'
|
|
2
|
+
require 'logger'
|
|
3
|
+
|
|
4
|
+
begin
|
|
5
|
+
OptionParser.new do |opts|
|
|
6
|
+
opts.banner = "Usage: zendesk c[onsole] [options]"
|
|
7
|
+
|
|
8
|
+
opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
|
|
9
|
+
config["logger.level"] = v ? Logger::INFO : Logger::WARN
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
opts.on("-c", "--config FILE", "Load a config file") do |c|
|
|
13
|
+
config.replace(YAML.load_file(c))
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
opts.on("-u", "--username USER", "Sets basic auth username") do |u|
|
|
17
|
+
config["username"] = u
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
opts.on("-p", "--password PASS", "Sets basic auth password") do |p|
|
|
21
|
+
config["password"] = p
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
opts.on("-a", "--api URL", "Sets api url") do |a|
|
|
25
|
+
config["url"] = a
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
|
29
|
+
puts opts
|
|
30
|
+
exit
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
opts.on_tail("--version", "Show version") do
|
|
34
|
+
puts Zendesk::VERSION
|
|
35
|
+
exit
|
|
36
|
+
end
|
|
37
|
+
end.parse!
|
|
38
|
+
rescue OptionParser::MissingArgument => e
|
|
39
|
+
puts e.message
|
|
40
|
+
exit
|
|
41
|
+
end
|
data/lib/zendesk_api/resource.rb
CHANGED
|
@@ -11,6 +11,14 @@ module ZendeskAPI
|
|
|
11
11
|
include Rescue
|
|
12
12
|
|
|
13
13
|
class << self
|
|
14
|
+
def inherited(klass)
|
|
15
|
+
subclasses.push(klass)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def subclasses
|
|
19
|
+
@subclasses ||= []
|
|
20
|
+
end
|
|
21
|
+
|
|
14
22
|
# The singular resource name taken from the class name (e.g. ZendeskAPI::Ticket -> ticket)
|
|
15
23
|
def singular_resource_name
|
|
16
24
|
@singular_resource_name ||= ZendeskAPI::Helpers.snakecase_string(to_s.split("::").last)
|
|
@@ -39,6 +47,9 @@ module ZendeskAPI
|
|
|
39
47
|
# @return [ZendeskAPI::Association] The association
|
|
40
48
|
attr_accessor :association
|
|
41
49
|
|
|
50
|
+
# Place to dump the last response
|
|
51
|
+
attr_accessor :response
|
|
52
|
+
|
|
42
53
|
# Create a new resource instance.
|
|
43
54
|
# @param [Client] client The client to use
|
|
44
55
|
# @param [Hash] attributes The optional attributes that describe the resource
|
|
@@ -98,7 +109,7 @@ module ZendeskAPI
|
|
|
98
109
|
|
|
99
110
|
# Compares resources by class and id. If id is nil, then by object_id
|
|
100
111
|
def ==(other)
|
|
101
|
-
warn "Trying to compare #{other.class} to a Resource" if other && !other.is_a?(Data)
|
|
112
|
+
warn "Trying to compare #{other.class} to a Resource from #{caller.first}" if other && !other.is_a?(Data)
|
|
102
113
|
other.is_a?(self.class) && ((other.id && other.id == id) || (other.object_id == self.object_id))
|
|
103
114
|
end
|
|
104
115
|
alias :eql :==
|
|
@@ -10,7 +10,13 @@ module ZendeskAPI
|
|
|
10
10
|
# @internal Begin actual Resource definitions
|
|
11
11
|
|
|
12
12
|
class Locale < ReadResource; end
|
|
13
|
-
|
|
13
|
+
|
|
14
|
+
class CRMData < DataResource
|
|
15
|
+
class << self
|
|
16
|
+
alias :resource_name :singular_resource_name
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
14
20
|
class CRMDataStatus < DataResource; end
|
|
15
21
|
class CustomRole < DataResource; end
|
|
16
22
|
class Role < DataResource; end
|
|
@@ -88,11 +94,19 @@ module ZendeskAPI
|
|
|
88
94
|
has User
|
|
89
95
|
end
|
|
90
96
|
|
|
97
|
+
class TopicComment < Data
|
|
98
|
+
has Topic
|
|
99
|
+
has User
|
|
100
|
+
has_many Attachment
|
|
101
|
+
end
|
|
102
|
+
|
|
91
103
|
class Topic < Resource
|
|
92
|
-
class TopicComment <
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
104
|
+
class TopicComment < TopicComment
|
|
105
|
+
extend Read
|
|
106
|
+
|
|
107
|
+
include Create
|
|
108
|
+
include Update
|
|
109
|
+
include Destroy
|
|
96
110
|
end
|
|
97
111
|
|
|
98
112
|
class TopicVote < SingularResource
|
|
@@ -194,7 +208,7 @@ module ZendeskAPI
|
|
|
194
208
|
end
|
|
195
209
|
|
|
196
210
|
class TicketMetric < DataResource
|
|
197
|
-
|
|
211
|
+
extend Read
|
|
198
212
|
end
|
|
199
213
|
|
|
200
214
|
class Ticket < Resource
|
|
@@ -262,23 +276,29 @@ module ZendeskAPI
|
|
|
262
276
|
has_many :custom_fields, :class => TicketField
|
|
263
277
|
end
|
|
264
278
|
|
|
279
|
+
class ViewCount < DataResource; end
|
|
280
|
+
|
|
265
281
|
class View < ReadResource
|
|
266
282
|
has_many :tickets, :class => Ticket
|
|
267
283
|
has_many :rows, :class => ViewRow, :path => "execute"
|
|
268
284
|
has :execution, :class => ViewExecution
|
|
285
|
+
has ViewCount, :path => "count"
|
|
269
286
|
|
|
270
287
|
def self.preview(client, options = {})
|
|
271
288
|
Collection.new(client, ViewRow, options.merge(:path => "views/preview", :verb => :post))
|
|
272
289
|
end
|
|
273
290
|
end
|
|
274
291
|
|
|
275
|
-
|
|
276
292
|
class GroupMembership < Resource
|
|
277
293
|
has User
|
|
278
294
|
has Group
|
|
279
295
|
end
|
|
280
296
|
|
|
281
297
|
class User < Resource
|
|
298
|
+
class TopicComment < TopicComment
|
|
299
|
+
extend Read
|
|
300
|
+
end
|
|
301
|
+
|
|
282
302
|
class Identity < Resource
|
|
283
303
|
# Makes this identity the primary one bumping all other identities down one
|
|
284
304
|
put :make_primary
|
|
@@ -315,7 +335,7 @@ module ZendeskAPI
|
|
|
315
335
|
|
|
316
336
|
has_many ForumSubscription
|
|
317
337
|
has_many TopicSubscription
|
|
318
|
-
has_many :topic_comments, :class =>
|
|
338
|
+
has_many :topic_comments, :class => TopicComment
|
|
319
339
|
has_many :topic_votes, :class => Topic::TopicVote
|
|
320
340
|
|
|
321
341
|
has CRMData
|