KayakoClient 1.0.2 → 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.
Files changed (84) hide show
  1. data/lib/kayako_client.rb +31 -0
  2. data/lib/kayako_client/base.rb +23 -0
  3. data/lib/kayako_client/custom_field.rb +14 -0
  4. data/lib/kayako_client/department.rb +18 -3
  5. data/lib/kayako_client/http/http.rb +14 -0
  6. data/lib/kayako_client/http/http_backend.rb +14 -0
  7. data/lib/kayako_client/http/http_client.rb +14 -0
  8. data/lib/kayako_client/http/http_response.rb +14 -0
  9. data/lib/kayako_client/http/net_http.rb +14 -0
  10. data/lib/kayako_client/knowledgebase_article.rb +131 -0
  11. data/lib/kayako_client/knowledgebase_attachment.rb +59 -0
  12. data/lib/kayako_client/knowledgebase_category.rb +71 -0
  13. data/lib/kayako_client/knowledgebase_comment.rb +32 -0
  14. data/lib/kayako_client/mixins/api.rb +14 -0
  15. data/lib/kayako_client/mixins/article_client.rb +76 -0
  16. data/lib/kayako_client/mixins/attachment.rb +16 -1
  17. data/lib/kayako_client/mixins/authentication.rb +14 -0
  18. data/lib/kayako_client/mixins/client.rb +300 -0
  19. data/lib/kayako_client/mixins/comment_object.rb +102 -0
  20. data/lib/kayako_client/mixins/convert_api.rb +39 -0
  21. data/lib/kayako_client/mixins/creator_api.rb +44 -0
  22. data/lib/kayako_client/mixins/knowledgebase_article_api.rb +69 -0
  23. data/lib/kayako_client/mixins/knowledgebase_category_client.rb +51 -0
  24. data/lib/kayako_client/mixins/logger.rb +14 -0
  25. data/lib/kayako_client/mixins/news_category_client.rb +51 -0
  26. data/lib/kayako_client/mixins/news_client.rb +51 -0
  27. data/lib/kayako_client/mixins/object.rb +24 -7
  28. data/lib/kayako_client/mixins/post_client.rb +14 -0
  29. data/lib/kayako_client/mixins/staff_visibility_api.rb +14 -0
  30. data/lib/kayako_client/mixins/ticket_api.rb +14 -0
  31. data/lib/kayako_client/mixins/ticket_client.rb +14 -0
  32. data/lib/kayako_client/mixins/troubleshooter_step_api.rb +69 -0
  33. data/lib/kayako_client/mixins/troubleshooter_step_client.rb +76 -0
  34. data/lib/kayako_client/mixins/user_visibility_api.rb +14 -0
  35. data/lib/kayako_client/news_category.rb +29 -0
  36. data/lib/kayako_client/news_comment.rb +32 -0
  37. data/lib/kayako_client/news_item.rb +81 -0
  38. data/lib/kayako_client/news_subscriber.rb +33 -0
  39. data/lib/kayako_client/staff.rb +14 -0
  40. data/lib/kayako_client/staff_group.rb +14 -0
  41. data/lib/kayako_client/ticket.rb +24 -1
  42. data/lib/kayako_client/ticket_attachment.rb +18 -0
  43. data/lib/kayako_client/ticket_count.rb +14 -0
  44. data/lib/kayako_client/ticket_custom_field.rb +14 -0
  45. data/lib/kayako_client/ticket_note.rb +14 -1
  46. data/lib/kayako_client/ticket_post.rb +15 -0
  47. data/lib/kayako_client/ticket_priority.rb +14 -0
  48. data/lib/kayako_client/ticket_status.rb +14 -0
  49. data/lib/kayako_client/ticket_time_track.rb +14 -0
  50. data/lib/kayako_client/ticket_type.rb +14 -0
  51. data/lib/kayako_client/troubleshooter_attachment.rb +68 -0
  52. data/lib/kayako_client/troubleshooter_category.rb +51 -0
  53. data/lib/kayako_client/troubleshooter_comment.rb +32 -0
  54. data/lib/kayako_client/troubleshooter_step.rb +100 -0
  55. data/lib/kayako_client/user.rb +42 -0
  56. data/lib/kayako_client/user_group.rb +14 -0
  57. data/lib/kayako_client/user_organization.rb +14 -0
  58. data/lib/kayako_client/xml/lib_xml.rb +14 -0
  59. data/lib/kayako_client/xml/rexml_document.rb +14 -0
  60. data/lib/kayako_client/xml/xml.rb +14 -0
  61. data/lib/kayako_client/xml/xml_backend.rb +14 -0
  62. data/test/test_attachment.rb +77 -0
  63. data/test/test_client.rb +191 -0
  64. data/test/test_configuration.rb +110 -0
  65. data/test/test_count.rb +162 -0
  66. data/test/test_custom_field.rb +86 -0
  67. data/test/test_department.rb +136 -0
  68. data/test/test_http.rb +34 -0
  69. data/test/test_knowledgebase.rb +155 -0
  70. data/test/test_news.rb +117 -0
  71. data/test/test_note.rb +64 -0
  72. data/test/test_post.rb +64 -0
  73. data/test/test_priority.rb +46 -0
  74. data/test/test_properties.rb +114 -0
  75. data/test/test_staff.rb +77 -0
  76. data/test/test_status.rb +52 -0
  77. data/test/test_ticket.rb +152 -0
  78. data/test/test_ticket_custom_field.rb +193 -0
  79. data/test/test_time_track.rb +68 -0
  80. data/test/test_troubleshooter.rb +106 -0
  81. data/test/test_type.rb +65 -0
  82. data/test/test_user.rb +95 -0
  83. data/test/test_xml.rb +183 -0
  84. metadata +89 -42
@@ -0,0 +1,102 @@
1
+ #######################################################################
2
+ #
3
+ # Kayako Ruby REST API library
4
+ # _____________________________________________________________________
5
+ #
6
+ # @author Andriy Lesyuk
7
+ #
8
+ # @package KayakoClient
9
+ # @copyright Copyright (c) 2011-2013, Kayako
10
+ # @license FreeBSD
11
+ # @link http://forge.kayako.com/projects/kayako-ruby-api-library
12
+ #
13
+ #######################################################################
14
+
15
+ require 'kayako_client/mixins/creator_api'
16
+
17
+ require 'kayako_client/staff'
18
+ require 'kayako_client/user'
19
+
20
+ module KayakoClient
21
+ module CommentObject
22
+
23
+ CREATOR_STAFF = 1
24
+ CREATOR_USER = 2
25
+
26
+ STATUS_PENDING = 1
27
+ STATUS_APPROVED = 2
28
+ STATUS_SPAM = 3
29
+
30
+ def self.included(base)
31
+ base.extend(ClassMethods)
32
+ base.class_eval do
33
+
34
+ supports :all, :get, :post, :delete
35
+
36
+ property :id, :integer, :readonly => true
37
+ property :creator_type, :integer, :required => :post, :range => 1..2
38
+ property :creator_id, :integer
39
+ property :full_name, :string
40
+ property :email, :string
41
+ property :ip_address, :string, :readonly => true
42
+ property :date_line, :date, :readonly => true
43
+ property :parent_comment_id, :integer
44
+ property :comment_status, :integer, :range => 1..3
45
+ property :user_agent, :string, :readonly => true
46
+ property :referrer, :string, :readonly => true
47
+ property :parent_url, :string, :readonly => true
48
+ property :contents, :string, :required => :post
49
+
50
+ associate :parent_comment, :parent_comment_id, base
51
+
52
+ end
53
+ end
54
+
55
+ def creator=(creator)
56
+ if creator.is_a?(Staff)
57
+ self.creator_type = self.class::CREATOR_STAFF
58
+ self.creator_id = creator.id
59
+ self.full_name = creator.full_name
60
+ self.email = creator.email
61
+ elsif creator.is_a?(User)
62
+ self.creator_type = self.class::CREATOR_USER
63
+ self.creator_id = creator.id
64
+ self.full_name = creator.full_name
65
+ self.email = creator.emails.first
66
+ else
67
+ raise ArgumentError, "creator must be a User or Staff"
68
+ end
69
+ end
70
+
71
+ def has_parent_comment?
72
+ !parent_comment_id.nil? && parent_comment_id > 0
73
+ end
74
+
75
+ alias_method :is_reply?, :has_parent_comment?
76
+
77
+ module ClassMethods
78
+
79
+ def all(object, options = {})
80
+ unless object.to_i > 0
81
+ logger.error "invalid commented object :id - #{object}" if logger
82
+ raise ArgumentError, "invalid commented object ID"
83
+ end
84
+ super(options.merge(:e => "#{path}/ListAll/#{object.to_i}"))
85
+ end
86
+
87
+ end
88
+
89
+ private
90
+
91
+ def validate(method, params)
92
+ if method == :post
93
+ if params[:creator_type] == self.class::CREATOR_STAFF
94
+ raise ArgumentError, ":creator_id is required for staff" unless params[:creator_id]
95
+ elsif params[:creator_type] == self.class::CREATOR_USER
96
+ raise ArgumentError, ":full_name is required for user" unless params[:full_name]
97
+ end
98
+ end
99
+ end
100
+
101
+ end
102
+ end
@@ -0,0 +1,39 @@
1
+ #######################################################################
2
+ #
3
+ # Kayako Ruby REST API library
4
+ # _____________________________________________________________________
5
+ #
6
+ # @author Andriy Lesyuk
7
+ #
8
+ # @package KayakoClient
9
+ # @copyright Copyright (c) 2011-2013, Kayako
10
+ # @license FreeBSD
11
+ # @link http://forge.kayako.com/projects/kayako-ruby-api-library
12
+ #
13
+ #######################################################################
14
+
15
+ module KayakoClient
16
+ module ConvertAPI
17
+
18
+ def self.included(base)
19
+ base.extend(ClassMethods)
20
+ end
21
+
22
+ module ClassMethods
23
+
24
+ def convert(type, value, options = {})
25
+ value = super(type, value, options)
26
+ value = value.join(',') if type.is_a?(Array)
27
+ value
28
+ end
29
+
30
+ def convert_value(type, value, options = {})
31
+ result = super(type, value, options = {})
32
+ result = Time.at(value).strftime('%m/%d/%Y') if type == :date
33
+ result
34
+ end
35
+
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,44 @@
1
+ #######################################################################
2
+ #
3
+ # Kayako Ruby REST API library
4
+ # _____________________________________________________________________
5
+ #
6
+ # @author Andriy Lesyuk
7
+ #
8
+ # @package KayakoClient
9
+ # @copyright Copyright (c) 2011-2013, Kayako
10
+ # @license FreeBSD
11
+ # @link http://forge.kayako.com/projects/kayako-ruby-api-library
12
+ #
13
+ #######################################################################
14
+
15
+ module KayakoClient
16
+ module CreatorAPI
17
+
18
+ def created_by_staff?
19
+ !creator_type.nil? && creator_type == self.class::CREATOR_STAFF
20
+ end
21
+
22
+ def created_by_user?
23
+ !creator_type.nil? && creator_type == self.class::CREATOR_USER
24
+ end
25
+
26
+ def creator
27
+ if @associated.has_key?(:creator)
28
+ @associated[:creator]
29
+ elsif instance_variable_defined?(:@creator_id)
30
+ creator_id = instance_variable_get(:@creator_id)
31
+ if created_by_staff?
32
+ @associated[:creator] = Staff.get(creator_id.to_i, inherited_options)
33
+ elsif created_by_user?
34
+ @associated[:creator] = User.get(creator_id.to_i, inherited_options)
35
+ else
36
+ @associated[:creator] = nil
37
+ end
38
+ else
39
+ @associated[:creator] = nil
40
+ end
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,69 @@
1
+ #######################################################################
2
+ #
3
+ # Kayako Ruby REST API library
4
+ # _____________________________________________________________________
5
+ #
6
+ # @author Andriy Lesyuk
7
+ #
8
+ # @package KayakoClient
9
+ # @copyright Copyright (c) 2011-2013, Kayako
10
+ # @license FreeBSD
11
+ # @link http://forge.kayako.com/projects/kayako-ruby-api-library
12
+ #
13
+ #######################################################################
14
+
15
+ module KayakoClient
16
+ module KnowledgebaseArticleAPI
17
+
18
+ def self.included(base)
19
+ base.extend(ClassMethods)
20
+ end
21
+
22
+ def delete_request(options = {})
23
+ raise RuntimeError, "undefined article ID" unless kb_article_id
24
+ raise RuntimeError, "undefined ID" unless id
25
+ super(options.merge(:e => "#{self.class.path}/#{kb_article_id}/#{id}"))
26
+ end
27
+
28
+ module ClassMethods
29
+
30
+ def all(article, options = {})
31
+ unless article.to_i > 0
32
+ logger.error "invalid :kb_article_id - #{article}" if logger
33
+ raise ArgumentError, "invalid article ID"
34
+ end
35
+ super(options.merge(:e => "#{path}/ListAll/#{article.to_i}"))
36
+ end
37
+
38
+ def get(article, id, options = {})
39
+ unless article.to_i > 0
40
+ logger.error "invalid :kb_article_id - #{article}" if logger
41
+ raise ArgumentError, "invalid article ID"
42
+ end
43
+ if id == :all
44
+ all(article, options)
45
+ else
46
+ unless id.to_i > 0
47
+ logger.error "invalid :id - #{id}" if logger
48
+ raise ArgumentError, "invalid ID"
49
+ end
50
+ super(id, options.merge(:e => "#{path}/#{article.to_i}/#{id.to_i}"))
51
+ end
52
+ end
53
+
54
+ def delete(article, id, options = {})
55
+ unless article.to_i > 0
56
+ logger.error "invalid :kb_article_id - #{article}" if logger
57
+ raise ArgumentError, "invalid article ID"
58
+ end
59
+ unless id.to_i > 0
60
+ logger.error "invalid :id - #{id}" if logger
61
+ raise ArgumentError, "invalid ID"
62
+ end
63
+ super(id, options.merge(:e => "#{path}/#{article.to_i}/#{id.to_i}"))
64
+ end
65
+
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,51 @@
1
+ #######################################################################
2
+ #
3
+ # Kayako Ruby REST API library
4
+ # _____________________________________________________________________
5
+ #
6
+ # @author Andriy Lesyuk
7
+ #
8
+ # @package KayakoClient
9
+ # @copyright Copyright (c) 2011-2013, Kayako
10
+ # @license FreeBSD
11
+ # @link http://forge.kayako.com/projects/kayako-ruby-api-library
12
+ #
13
+ #######################################################################
14
+
15
+ module KayakoClient
16
+ module KnowledgebaseCategoryClient
17
+
18
+ def articles(options = {})
19
+ KayakoClient::KnowledgebaseArticle.all(id, options.merge(inherited_options)) if id
20
+ end
21
+
22
+ def get_article(article, options = {})
23
+ if id
24
+ value = KayakoClient::KnowledgebaseArticle.get(article, options.merge(inherited_options))
25
+ value && value.in_category?(id) ? value : nil
26
+ end
27
+ end
28
+
29
+ alias_method :find_article, :get_article
30
+
31
+ def post_article(options = {})
32
+ if id
33
+ if logger && options[:id] && options[:id].to_i != id
34
+ logger.warn "overwriting :id"
35
+ end
36
+ options[:id] = id
37
+ KayakoClient::KnowledgebaseArticle.post(options.merge(inherited_options))
38
+ end
39
+ end
40
+
41
+ alias_method :create_article, :post_article
42
+
43
+ def delete_article(article, options = {})
44
+ category_article = get_article(article, options.merge(inherited_options))
45
+ category_article.delete if category_article
46
+ end
47
+
48
+ alias_method :destroy_article, :delete_article
49
+
50
+ end
51
+ end
@@ -1,3 +1,17 @@
1
+ #######################################################################
2
+ #
3
+ # Kayako Ruby REST API library
4
+ # _____________________________________________________________________
5
+ #
6
+ # @author Andriy Lesyuk
7
+ #
8
+ # @package KayakoClient
9
+ # @copyright Copyright (c) 2011-2013, Kayako
10
+ # @license FreeBSD
11
+ # @link http://forge.kayako.com/projects/kayako-ruby-api-library
12
+ #
13
+ #######################################################################
14
+
1
15
  module KayakoClient
2
16
  module Logger
3
17
 
@@ -0,0 +1,51 @@
1
+ #######################################################################
2
+ #
3
+ # Kayako Ruby REST API library
4
+ # _____________________________________________________________________
5
+ #
6
+ # @author Andriy Lesyuk
7
+ #
8
+ # @package KayakoClient
9
+ # @copyright Copyright (c) 2011-2013, Kayako
10
+ # @license FreeBSD
11
+ # @link http://forge.kayako.com/projects/kayako-ruby-api-library
12
+ #
13
+ #######################################################################
14
+
15
+ module KayakoClient
16
+ module NewsCategoryClient
17
+
18
+ def news(options = {})
19
+ KayakoClient::NewsItem.all(id, options.merge(inherited_options)) if id
20
+ end
21
+
22
+ def get_news(news, options = {})
23
+ if id
24
+ value = KayakoClient::NewsItem.get(news, options.merge(inherited_options))
25
+ value && value.in_category?(id) ? value : nil
26
+ end
27
+ end
28
+
29
+ alias_method :find_news, :get_news
30
+
31
+ def post_news(options = {})
32
+ if id
33
+ if logger && options[:id] && options[:id].to_i != id
34
+ logger.warn "overwriting :id"
35
+ end
36
+ options[:id] = id
37
+ KayakoClient::NewsItem.post(options.merge(inherited_options))
38
+ end
39
+ end
40
+
41
+ alias_method :create_news, :post_news
42
+
43
+ def delete_news(news, options = {})
44
+ category_news = get_news(news, options.merge(inherited_options))
45
+ category_news.delete if category_news
46
+ end
47
+
48
+ alias_method :destroy_news, :delete_news
49
+
50
+ end
51
+ end
@@ -0,0 +1,51 @@
1
+ #######################################################################
2
+ #
3
+ # Kayako Ruby REST API library
4
+ # _____________________________________________________________________
5
+ #
6
+ # @author Andriy Lesyuk
7
+ #
8
+ # @package KayakoClient
9
+ # @copyright Copyright (c) 2011-2013, Kayako
10
+ # @license FreeBSD
11
+ # @link http://forge.kayako.com/projects/kayako-ruby-api-library
12
+ #
13
+ #######################################################################
14
+
15
+ module KayakoClient
16
+ module NewsClient
17
+
18
+ def comments(options = {})
19
+ KayakoClient::NewsComment.all(id, options.merge(inherited_options)) if id
20
+ end
21
+
22
+ def get_comment(comment, options = {})
23
+ if id
24
+ value = KayakoClient::NewsComment.get(comment, options.merge(inherited_options))
25
+ value && value.news_item_id == id ? value : nil
26
+ end
27
+ end
28
+
29
+ alias_method :find_comment, :get_comment
30
+
31
+ def post_comment(options = {})
32
+ if id
33
+ if logger && options[:news_item_id] && options[:news_item_id].to_i != id
34
+ logger.warn "overwriting :news_item_id"
35
+ end
36
+ options[:news_item_id] = id
37
+ KayakoClient::NewsComment.post(options.merge(inherited_options))
38
+ end
39
+ end
40
+
41
+ alias_method :create_comment, :post_comment
42
+
43
+ def delete_comment(comment, options = {})
44
+ news_comment = get_comment(comment, options.merge(inherited_options))
45
+ news_comment.delete if news_comment
46
+ end
47
+
48
+ alias_method :destroy_comment, :delete_comment
49
+
50
+ end
51
+ end
@@ -1,9 +1,24 @@
1
+ #######################################################################
2
+ #
3
+ # Kayako Ruby REST API library
4
+ # _____________________________________________________________________
5
+ #
6
+ # @author Andriy Lesyuk
7
+ #
8
+ # @package KayakoClient
9
+ # @copyright Copyright (c) 2011-2013, Kayako
10
+ # @license FreeBSD
11
+ # @link http://forge.kayako.com/projects/kayako-ruby-api-library
12
+ #
13
+ #######################################################################
14
+
1
15
  require 'base64'
2
16
 
3
17
  module KayakoClient
4
18
  module Object
5
19
 
6
20
  PROPERTY_TYPES = [ :integer,
21
+ :float,
7
22
  :string,
8
23
  :symbol,
9
24
  :boolean,
@@ -52,7 +67,7 @@ module KayakoClient
52
67
  end
53
68
 
54
69
  def [](name)
55
- if self.class.properties.include?(name.to_sym)
70
+ if name.respond_to?(:to_sym) && self.class.properties.include?(name.to_sym)
56
71
  send("#{name}")
57
72
  else
58
73
  nil
@@ -197,7 +212,7 @@ module KayakoClient
197
212
  array << klass.get(i.to_i, inherited_options)
198
213
  array
199
214
  end
200
- elsif id.respond_to?('to_i') && id.to_i > 0
215
+ elsif id.respond_to?(:to_i) && id.to_i > 0
201
216
  @associated[property] = klass.get(id.to_i, inherited_options)
202
217
  else
203
218
  @associated[property] = nil
@@ -295,19 +310,19 @@ module KayakoClient
295
310
  end
296
311
 
297
312
  def properties
298
- @properties
313
+ @properties ||= {}
299
314
  end
300
315
 
301
316
  def aliases
302
- @aliases
317
+ @aliases ||= {}
303
318
  end
304
319
 
305
320
  def options
306
- @options
321
+ @options ||= {}
307
322
  end
308
323
 
309
324
  def map
310
- @map
325
+ @map ||= {}
311
326
  end
312
327
 
313
328
  private
@@ -416,12 +431,14 @@ module KayakoClient
416
431
  case type
417
432
  when :integer
418
433
  value.to_i
434
+ when :float
435
+ value.to_f
419
436
  when :string
420
437
  value.to_s
421
438
  when :symbol
422
439
  value.to_sym
423
440
  when :boolean
424
- if value.respond_to?('to_i')
441
+ if value.respond_to?(:to_i)
425
442
  value.to_i == 0 ? false : true
426
443
  else
427
444
  case value