zendesk2 1.9.0 → 1.10.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 (222) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +30 -0
  3. data/.travis.yml +3 -1
  4. data/Gemfile +4 -5
  5. data/Guardfile +4 -3
  6. data/Rakefile +4 -3
  7. data/lib/zendesk2.rb +9 -6
  8. data/lib/zendesk2/attributes.rb +11 -8
  9. data/lib/zendesk2/audit_event.rb +5 -3
  10. data/lib/zendesk2/categories.rb +4 -3
  11. data/lib/zendesk2/category.rb +10 -5
  12. data/lib/zendesk2/client.rb +3 -3
  13. data/lib/zendesk2/collection.rb +35 -21
  14. data/lib/zendesk2/create_category.rb +10 -9
  15. data/lib/zendesk2/create_forum.rb +11 -10
  16. data/lib/zendesk2/create_group.rb +13 -12
  17. data/lib/zendesk2/create_membership.rb +21 -20
  18. data/lib/zendesk2/create_organization.rb +24 -18
  19. data/lib/zendesk2/create_ticket.rb +60 -56
  20. data/lib/zendesk2/create_ticket_field.rb +24 -22
  21. data/lib/zendesk2/create_topic.rb +11 -10
  22. data/lib/zendesk2/create_topic_comment.rb +12 -11
  23. data/lib/zendesk2/create_user.rb +54 -41
  24. data/lib/zendesk2/create_user_field.rb +22 -21
  25. data/lib/zendesk2/create_user_identity.rb +18 -15
  26. data/lib/zendesk2/create_view.rb +62 -62
  27. data/lib/zendesk2/destroy_category.rb +2 -1
  28. data/lib/zendesk2/destroy_forum.rb +2 -1
  29. data/lib/zendesk2/destroy_group.rb +3 -2
  30. data/lib/zendesk2/destroy_membership.rb +7 -5
  31. data/lib/zendesk2/destroy_organization.rb +3 -2
  32. data/lib/zendesk2/destroy_ticket.rb +3 -2
  33. data/lib/zendesk2/destroy_ticket_field.rb +3 -2
  34. data/lib/zendesk2/destroy_topic.rb +3 -2
  35. data/lib/zendesk2/destroy_topic_comment.rb +4 -3
  36. data/lib/zendesk2/destroy_user.rb +11 -10
  37. data/lib/zendesk2/destroy_user_field.rb +3 -2
  38. data/lib/zendesk2/destroy_user_identity.rb +4 -3
  39. data/lib/zendesk2/destroy_view.rb +3 -2
  40. data/lib/zendesk2/error.rb +1 -1
  41. data/lib/zendesk2/forum.rb +36 -18
  42. data/lib/zendesk2/forums.rb +4 -3
  43. data/lib/zendesk2/get_assignable_groups.rb +3 -2
  44. data/lib/zendesk2/get_categories.rb +2 -1
  45. data/lib/zendesk2/get_category.rb +3 -2
  46. data/lib/zendesk2/get_ccd_tickets.rb +4 -3
  47. data/lib/zendesk2/get_current_user.rb +3 -2
  48. data/lib/zendesk2/get_forum.rb +3 -2
  49. data/lib/zendesk2/get_forums.rb +2 -1
  50. data/lib/zendesk2/get_group.rb +3 -2
  51. data/lib/zendesk2/get_groups.rb +2 -1
  52. data/lib/zendesk2/get_membership.rb +3 -2
  53. data/lib/zendesk2/get_memberships.rb +3 -2
  54. data/lib/zendesk2/get_organization.rb +3 -2
  55. data/lib/zendesk2/get_organization_by_external_id.rb +8 -5
  56. data/lib/zendesk2/get_organization_memberships.rb +5 -2
  57. data/lib/zendesk2/get_organization_tickets.rb +7 -5
  58. data/lib/zendesk2/get_organization_users.rb +6 -5
  59. data/lib/zendesk2/get_organizations.rb +2 -1
  60. data/lib/zendesk2/get_requested_tickets.rb +5 -4
  61. data/lib/zendesk2/get_ticket.rb +3 -2
  62. data/lib/zendesk2/get_ticket_audit.rb +5 -4
  63. data/lib/zendesk2/get_ticket_audits.rb +4 -3
  64. data/lib/zendesk2/get_ticket_comments.rb +6 -5
  65. data/lib/zendesk2/get_ticket_field.rb +3 -2
  66. data/lib/zendesk2/get_ticket_fields.rb +2 -1
  67. data/lib/zendesk2/get_ticket_metric.rb +4 -3
  68. data/lib/zendesk2/get_ticket_metrics.rb +3 -2
  69. data/lib/zendesk2/get_tickets.rb +2 -1
  70. data/lib/zendesk2/get_topic.rb +3 -2
  71. data/lib/zendesk2/get_topic_comment.rb +4 -3
  72. data/lib/zendesk2/get_topic_comments.rb +5 -4
  73. data/lib/zendesk2/get_topics.rb +2 -1
  74. data/lib/zendesk2/get_user.rb +7 -7
  75. data/lib/zendesk2/get_user_field.rb +3 -2
  76. data/lib/zendesk2/get_user_fields.rb +3 -2
  77. data/lib/zendesk2/get_user_identities.rb +4 -3
  78. data/lib/zendesk2/get_user_identity.rb +4 -3
  79. data/lib/zendesk2/get_user_memberships.rb +4 -3
  80. data/lib/zendesk2/get_user_organizations.rb +5 -4
  81. data/lib/zendesk2/get_users.rb +3 -2
  82. data/lib/zendesk2/get_view.rb +3 -2
  83. data/lib/zendesk2/get_view_tickets.rb +19 -16
  84. data/lib/zendesk2/get_views.rb +2 -1
  85. data/lib/zendesk2/group.rb +6 -5
  86. data/lib/zendesk2/groups.rb +7 -6
  87. data/lib/zendesk2/help_center.rb +15 -0
  88. data/lib/zendesk2/help_center/access_policy.rb +3 -2
  89. data/lib/zendesk2/help_center/article.rb +10 -7
  90. data/lib/zendesk2/help_center/articles.rb +7 -7
  91. data/lib/zendesk2/help_center/categories.rb +3 -2
  92. data/lib/zendesk2/help_center/category.rb +8 -7
  93. data/lib/zendesk2/help_center/create_help_center_article.rb +31 -29
  94. data/lib/zendesk2/help_center/create_help_center_category.rb +17 -16
  95. data/lib/zendesk2/help_center/create_help_center_post.rb +37 -0
  96. data/lib/zendesk2/help_center/create_help_center_section.rb +32 -31
  97. data/lib/zendesk2/help_center/create_help_center_topic.rb +36 -0
  98. data/lib/zendesk2/help_center/create_help_center_translation.rb +15 -14
  99. data/lib/zendesk2/help_center/destroy_help_center_article.rb +3 -2
  100. data/lib/zendesk2/help_center/destroy_help_center_category.rb +3 -2
  101. data/lib/zendesk2/help_center/destroy_help_center_post.rb +15 -0
  102. data/lib/zendesk2/help_center/destroy_help_center_section.rb +3 -2
  103. data/lib/zendesk2/help_center/destroy_help_center_topic.rb +15 -0
  104. data/lib/zendesk2/help_center/destroy_help_center_translation.rb +2 -1
  105. data/lib/zendesk2/help_center/get_help_center_access_policy.rb +6 -5
  106. data/lib/zendesk2/help_center/get_help_center_article.rb +7 -9
  107. data/lib/zendesk2/help_center/get_help_center_articles.rb +3 -2
  108. data/lib/zendesk2/help_center/get_help_center_categories.rb +6 -2
  109. data/lib/zendesk2/help_center/get_help_center_categories_articles.rb +8 -7
  110. data/lib/zendesk2/help_center/get_help_center_categories_sections.rb +6 -5
  111. data/lib/zendesk2/help_center/get_help_center_category.rb +7 -9
  112. data/lib/zendesk2/help_center/get_help_center_post.rb +19 -0
  113. data/lib/zendesk2/help_center/get_help_center_posts.rb +28 -0
  114. data/lib/zendesk2/help_center/get_help_center_section.rb +8 -10
  115. data/lib/zendesk2/help_center/get_help_center_sections.rb +3 -2
  116. data/lib/zendesk2/help_center/get_help_center_sections_articles.rb +9 -8
  117. data/lib/zendesk2/help_center/get_help_center_topic.rb +14 -0
  118. data/lib/zendesk2/help_center/get_help_center_topics.rb +10 -0
  119. data/lib/zendesk2/help_center/get_help_center_translation.rb +5 -4
  120. data/lib/zendesk2/help_center/get_help_center_translations.rb +7 -6
  121. data/lib/zendesk2/help_center/post.rb +72 -0
  122. data/lib/zendesk2/help_center/posts.rb +18 -0
  123. data/lib/zendesk2/help_center/search_help_center_articles.rb +8 -7
  124. data/lib/zendesk2/help_center/section.rb +11 -11
  125. data/lib/zendesk2/help_center/sections.rb +7 -6
  126. data/lib/zendesk2/help_center/topic.rb +52 -0
  127. data/lib/zendesk2/help_center/topics.rb +13 -0
  128. data/lib/zendesk2/help_center/translation.rb +8 -5
  129. data/lib/zendesk2/help_center/translation_source.rb +16 -13
  130. data/lib/zendesk2/help_center/translations.rb +3 -2
  131. data/lib/zendesk2/help_center/update_help_center_access_policy.rb +8 -7
  132. data/lib/zendesk2/help_center/update_help_center_article.rb +9 -11
  133. data/lib/zendesk2/help_center/update_help_center_category.rb +9 -11
  134. data/lib/zendesk2/help_center/update_help_center_post.rb +20 -0
  135. data/lib/zendesk2/help_center/update_help_center_section.rb +9 -11
  136. data/lib/zendesk2/help_center/update_help_center_topic.rb +20 -0
  137. data/lib/zendesk2/help_center/update_help_center_translation.rb +4 -3
  138. data/lib/zendesk2/logger.rb +3 -2
  139. data/lib/zendesk2/mark_membership_default.rb +7 -6
  140. data/lib/zendesk2/mark_user_identity_primary.rb +7 -6
  141. data/lib/zendesk2/membership.rb +10 -8
  142. data/lib/zendesk2/memberships.rb +18 -12
  143. data/lib/zendesk2/mock.rb +39 -34
  144. data/lib/zendesk2/model.rb +14 -3
  145. data/lib/zendesk2/organization.rb +7 -7
  146. data/lib/zendesk2/organizations.rb +14 -12
  147. data/lib/zendesk2/paged_collection.rb +40 -36
  148. data/lib/zendesk2/rate_limit.rb +4 -3
  149. data/lib/zendesk2/real.rb +25 -22
  150. data/lib/zendesk2/request.rb +78 -82
  151. data/lib/zendesk2/search.rb +8 -7
  152. data/lib/zendesk2/search_organization.rb +14 -14
  153. data/lib/zendesk2/search_user.rb +41 -37
  154. data/lib/zendesk2/searchable.rb +36 -26
  155. data/lib/zendesk2/ticket.rb +20 -18
  156. data/lib/zendesk2/ticket_audit.rb +5 -4
  157. data/lib/zendesk2/ticket_audits.rb +10 -11
  158. data/lib/zendesk2/ticket_change.rb +10 -11
  159. data/lib/zendesk2/ticket_comment.rb +2 -1
  160. data/lib/zendesk2/ticket_comment_privacy_change.rb +12 -14
  161. data/lib/zendesk2/ticket_comments.rb +7 -6
  162. data/lib/zendesk2/ticket_create.rb +8 -9
  163. data/lib/zendesk2/ticket_field.rb +5 -4
  164. data/lib/zendesk2/ticket_fields.rb +4 -3
  165. data/lib/zendesk2/ticket_metric.rb +2 -2
  166. data/lib/zendesk2/ticket_metrics.rb +3 -2
  167. data/lib/zendesk2/ticket_notification.rb +12 -13
  168. data/lib/zendesk2/ticket_voice_comment.rb +28 -29
  169. data/lib/zendesk2/tickets.rb +8 -7
  170. data/lib/zendesk2/topic.rb +49 -22
  171. data/lib/zendesk2/topic_comment.rb +12 -9
  172. data/lib/zendesk2/topic_comments.rb +4 -3
  173. data/lib/zendesk2/topics.rb +4 -3
  174. data/lib/zendesk2/update_category.rb +8 -6
  175. data/lib/zendesk2/update_forum.rb +5 -4
  176. data/lib/zendesk2/update_group.rb +5 -4
  177. data/lib/zendesk2/update_organization.rb +18 -9
  178. data/lib/zendesk2/update_request.rb +6 -5
  179. data/lib/zendesk2/update_ticket.rb +39 -38
  180. data/lib/zendesk2/update_ticket_field.rb +5 -4
  181. data/lib/zendesk2/update_topic.rb +5 -4
  182. data/lib/zendesk2/update_user.rb +39 -31
  183. data/lib/zendesk2/update_user_field.rb +4 -3
  184. data/lib/zendesk2/update_user_identity.rb +7 -6
  185. data/lib/zendesk2/update_view.rb +38 -34
  186. data/lib/zendesk2/user.rb +41 -37
  187. data/lib/zendesk2/user_field.rb +9 -6
  188. data/lib/zendesk2/user_fields.rb +4 -3
  189. data/lib/zendesk2/user_identities.rb +4 -3
  190. data/lib/zendesk2/user_identity.rb +12 -9
  191. data/lib/zendesk2/users.rb +5 -4
  192. data/lib/zendesk2/version.rb +2 -1
  193. data/lib/zendesk2/view.rb +24 -13
  194. data/lib/zendesk2/views.rb +3 -2
  195. data/spec/categories_spec.rb +63 -60
  196. data/spec/client_spec.rb +6 -5
  197. data/spec/forums_spec.rb +64 -61
  198. data/spec/groups_spec.rb +7 -8
  199. data/spec/help_center/articles_spec.rb +22 -26
  200. data/spec/help_center/categories_spec.rb +26 -27
  201. data/spec/help_center/posts_spec.rb +39 -0
  202. data/spec/help_center/sections_spec.rb +32 -33
  203. data/spec/help_center/topics_spec.rb +13 -0
  204. data/spec/lib/paged_collection_spec.rb +11 -11
  205. data/spec/lib/rate_limit_spec.rb +9 -8
  206. data/spec/memberships_spec.rb +38 -27
  207. data/spec/organizations_spec.rb +92 -87
  208. data/spec/shared/zendesk_resource.rb +40 -25
  209. data/spec/spec_helper.rb +8 -13
  210. data/spec/support/client_helper.rb +5 -4
  211. data/spec/support/data_helper.rb +1 -0
  212. data/spec/ticket_fields_spec.rb +6 -7
  213. data/spec/tickets_spec.rb +69 -58
  214. data/spec/topic_comments_spec.rb +7 -8
  215. data/spec/topics_spec.rb +5 -6
  216. data/spec/user_fields_spec.rb +7 -7
  217. data/spec/user_identities_spec.rb +29 -25
  218. data/spec/users_spec.rb +88 -78
  219. data/spec/views_spec.rb +45 -34
  220. data/spec/zendesk2_spec.rb +3 -2
  221. data/zendesk2.gemspec +15 -14
  222. metadata +21 -2
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Zendesk2::Model
2
3
  include Cistern::Model
3
4
 
@@ -14,12 +15,12 @@ module Zendesk2::Model
14
15
  def save
15
16
  save!
16
17
  rescue Zendesk2::Error => exception
17
- self.errors = exception.response[:body]["details"].inject({}){|r,(k,v)| r.merge(k => v.map{|e| e["type"] || e["description"]})} rescue nil
18
+ self.errors = error_details(exception)
18
19
  self
19
20
  end
20
21
 
21
22
  def destroyed?
22
- !self.reload
23
+ !reload
23
24
  end
24
25
 
25
26
  def destroy
@@ -31,7 +32,7 @@ module Zendesk2::Model
31
32
  # re-define Cistern::Attributes#missing_attributes to require non-blank
32
33
  def missing_attributes(args)
33
34
  missing, required = super(args)
34
- blank, still_required = required.partition { |_,v| "" == v }
35
+ blank, still_required = required.partition { |_, v| '' == v }
35
36
  missing.merge!(Hash[blank])
36
37
 
37
38
  [missing, Hash[still_required]]
@@ -41,4 +42,14 @@ module Zendesk2::Model
41
42
  merge_attributes(attributes)
42
43
  save!
43
44
  end
45
+
46
+ private
47
+
48
+ def error_details(exception)
49
+ exception.response[:body]['details'].inject({}) do |a, (k, v)|
50
+ a.merge(k => v.map { |e| e['type'] || e['description'] })
51
+ end
52
+ rescue
53
+ nil
54
+ end
44
55
  end
@@ -1,7 +1,7 @@
1
+ # frozen_string_literal: true
1
2
  class Zendesk2::Organization
2
3
  include Zendesk2::Model
3
4
 
4
-
5
5
  # @return [integer] Automatically assigned when creating organization
6
6
  identity :id, type: :integer # ro[yes] required[no]
7
7
 
@@ -35,19 +35,19 @@ class Zendesk2::Organization
35
35
  def destroy!
36
36
  requires :identity
37
37
 
38
- cistern.destroy_organization("organization" => {"id" => self.identity})
38
+ cistern.destroy_organization('organization' => { 'id' => identity })
39
39
  end
40
40
 
41
41
  def save!
42
42
  data = if new_record?
43
43
  requires :name
44
44
 
45
- cistern.create_organization("organization" => self.attributes)
45
+ cistern.create_organization('organization' => attributes)
46
46
  else
47
47
  requires :identity
48
48
 
49
- cistern.update_organization("organization" => self.attributes)
50
- end.body["organization"]
49
+ cistern.update_organization('organization' => attributes)
50
+ end.body['organization']
51
51
 
52
52
  merge_attributes(data)
53
53
  end
@@ -57,7 +57,7 @@ class Zendesk2::Organization
57
57
  requires :identity
58
58
 
59
59
  cistern.users.load(
60
- cistern.get_organization_users("organization" => {"id" => self.identity}).body["users"]
60
+ cistern.get_organization_users('organization' => { 'id' => identity }).body['users']
61
61
  )
62
62
  end
63
63
 
@@ -73,7 +73,7 @@ class Zendesk2::Organization
73
73
  requires :identity
74
74
 
75
75
  cistern.tickets.load(
76
- cistern.get_organization_tickets("organization_id" => self.identity).body["tickets"]
76
+ cistern.get_organization_tickets('organization_id' => identity).body['tickets']
77
77
  )
78
78
  end
79
79
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  class Zendesk2::Organizations
2
3
  include Zendesk2::Collection
3
4
 
@@ -12,32 +13,33 @@ class Zendesk2::Organizations
12
13
  assoc_accessor :user
13
14
 
14
15
  def find_by_external_id(external_id)
15
- body = cistern.get_organization_by_external_id("external_id" => external_id).body
16
- if data = body.delete("organizations")
17
- collection = self.clone.load(data)
18
- collection.merge_attributes(Cistern::Hash.slice(body, "count", "next_page", "previous_page"))
16
+ body = cistern.get_organization_by_external_id('external_id' => external_id).body
17
+ data = body.delete('organizations')
18
+ if data
19
+ collection = clone.load(data)
20
+ collection.merge_attributes(Cistern::Hash.slice(body, 'count', 'next_page', 'previous_page'))
19
21
  collection
20
22
  end
21
23
  end
22
24
 
23
25
  self.collection_method = :get_organizations
24
- self.collection_root = "organizations"
26
+ self.collection_root = 'organizations'
25
27
  self.model_method = :get_organization
26
- self.model_root = "organization"
27
- self.search_type = "organization"
28
+ self.model_root = 'organization'
29
+ self.search_type = 'organization'
28
30
  self.search_request = :search_organization
29
31
 
30
- def collection_page(params={})
31
- collection_method = if self.user_id
32
+ def collection_page(params = {})
33
+ collection_method = if user_id
32
34
  :get_user_organizations
33
35
  else
34
36
  :get_organizations
35
37
  end
36
38
 
37
- body = cistern.send(collection_method, Cistern::Hash.stringify_keys(self.attributes.merge(params))).body
39
+ body = cistern.send(collection_method, Cistern::Hash.stringify_keys(attributes.merge(params))).body
38
40
 
39
- self.load(body[collection_root])
40
- self.merge_attributes(Cistern::Hash.slice(body, "count", "next_page", "previous_page"))
41
+ load(body[collection_root])
42
+ merge_attributes(Cistern::Hash.slice(body, 'count', 'next_page', 'previous_page'))
41
43
  self
42
44
  end
43
45
  end
@@ -1,12 +1,14 @@
1
+ # frozen_string_literal: true
1
2
  # adds {#create!} method to {Cistern::Collection}.
2
3
  module Zendesk2::PagedCollection
3
4
  def self.included(klass)
4
5
  klass.send(:attribute, :count)
5
- klass.send(:attribute, :next_page_link, {:aliases => "next_page"})
6
- klass.send(:attribute, :previous_page_link, {:aliases => "previous_page"})
6
+ klass.send(:attribute, :next_page_link, aliases: 'next_page')
7
+ klass.send(:attribute, :previous_page_link, aliases: 'previous_page')
7
8
  klass.send(:extend, ClassMethods)
8
9
  end
9
10
 
11
+ # add methods for explicitly defining constants within the collection response
10
12
  module ClassMethods
11
13
  attr_accessor :collection_method, :collection_root, :model_method, :model_root
12
14
 
@@ -15,14 +17,25 @@ module Zendesk2::PagedCollection
15
17
  end
16
18
  end
17
19
 
18
- def collection_method; self.class.collection_method; end
19
- def collection_root; self.class.collection_root; end
20
- def model_method; self.class.model_method; end
21
- def model_root; self.class.model_root; end
20
+ def collection_method
21
+ self.class.collection_method
22
+ end
23
+
24
+ def collection_root
25
+ self.class.collection_root
26
+ end
27
+
28
+ def model_method
29
+ self.class.model_method
30
+ end
31
+
32
+ def model_root
33
+ self.class.model_root
34
+ end
22
35
 
23
36
  def new_page
24
- page = self.class.new(cistern: self.cistern)
25
- page.merge_attributes(self.class.scopes.inject({}){|r,k| r.merge(k.to_s => send(k))})
37
+ page = self.class.new(cistern: cistern)
38
+ page.merge_attributes(self.class.scopes.inject({}) { |a, e| a.merge(e.to_s => public_send(e)) })
26
39
  page
27
40
  end
28
41
 
@@ -44,26 +57,18 @@ module Zendesk2::PagedCollection
44
57
  end
45
58
  end
46
59
 
47
- def all_entries
48
- each_entry.to_a
49
- end
50
-
51
60
  def next_page
52
61
  if next_page_link
53
- options = {"url" => next_page_link}
54
- if self.respond_to?(:filtered) # searchable
55
- options.merge!("filtered" => self.filtered)
56
- end
62
+ options = { 'url' => next_page_link }
63
+ options['filtered'] = filtered if respond_to?(:filtered) # searchable
57
64
  new_page.all(options)
58
65
  end
59
66
  end
60
67
 
61
68
  def previous_page
62
69
  if previous_page_link
63
- options = {"url" => previous_page_link}
64
- if self.respond_to?(:filtered) # searchable
65
- options.merge!("filtered" => self.filtered)
66
- end
70
+ options = { 'url' => previous_page_link }
71
+ options['filtered'] = filtered if respond_to?(:filtered) # searchable
67
72
  new_page.all(options)
68
73
  end
69
74
  end
@@ -72,8 +77,8 @@ module Zendesk2::PagedCollection
72
77
  #
73
78
  # @raise [Zendesk2::Error] if creation was unsuccessful
74
79
  # @return [Zendesk::Model]
75
- def create!(attributes={})
76
- model = self.new(Zendesk2.stringify_keys(attributes).merge(Zendesk2.stringify_keys(self.attributes)))
80
+ def create!(attributes = {})
81
+ model = new(Zendesk2.stringify_keys(attributes).merge(Zendesk2.stringify_keys(self.attributes)))
77
82
  model.save!
78
83
  end
79
84
 
@@ -81,8 +86,8 @@ module Zendesk2::PagedCollection
81
86
  #
82
87
  # @see {#create!} to raise an exception on failure
83
88
  # @return [Zendesk::Model, FalseClass]
84
- def create(attributes={})
85
- model = self.new(attributes.merge(Zendesk2.stringify_keys(self.attributes)))
89
+ def create(attributes = {})
90
+ model = new(attributes.merge(Zendesk2.stringify_keys(self.attributes)))
86
91
  model.save
87
92
  end
88
93
 
@@ -94,7 +99,7 @@ module Zendesk2::PagedCollection
94
99
  end
95
100
 
96
101
  # Fetch a collection of resources
97
- def all(params={})
102
+ def all(params = {})
98
103
  if search_query?(params)
99
104
  search_page(params)
100
105
  else
@@ -119,19 +124,18 @@ module Zendesk2::PagedCollection
119
124
  # @raise [Zendesk2::Error] if the record cannot be found or other request error
120
125
  # @return [Zendesk2::Model] fetched resource corresponding to value of {Zendesk2::Collection#model}
121
126
  def get!(identity_or_hash)
122
- scoped_attributes = self.class.scopes.inject({}){|r,k| r.merge(k.to_s => send(k))}
127
+ scoped_attributes = self.class.scopes.inject({}) { |a, e| a.merge(e.to_s => send(e)) }
123
128
 
124
129
  if identity_or_hash.is_a?(Hash)
125
130
  scoped_attributes.merge!(identity_or_hash)
126
131
  else
127
- scoped_attributes.merge!("id" => identity_or_hash)
132
+ scoped_attributes['id'] = identity_or_hash
128
133
  end
129
134
 
130
135
  scoped_attributes = { model_root => scoped_attributes }
131
136
 
132
- if data = self.cistern.send(model_method, scoped_attributes).body[self.model_root]
133
- new(data)
134
- end
137
+ data = cistern.send(model_method, scoped_attributes).body[model_root]
138
+ new(data) if data
135
139
  end
136
140
 
137
141
  # Quiet version of {#get!}
@@ -148,20 +152,20 @@ module Zendesk2::PagedCollection
148
152
  protected
149
153
 
150
154
  def search_query?(params)
151
- !!params["filtered"] && !!params["url"]
155
+ params['filtered'] && params['url']
152
156
  end
153
157
 
154
158
  def search_page(params)
155
- query = Faraday::NestedParamsEncoder.decode(URI.parse(params.fetch("url")).query)
159
+ query = Faraday::NestedParamsEncoder.decode(URI.parse(params.fetch('url')).query)
156
160
 
157
- search(query.delete("query"), query)
161
+ search(query.delete('query'), query)
158
162
  end
159
163
 
160
164
  def collection_page(params)
161
- scoped_attributes = self.class.scopes.inject({}) { |r, k| r.merge(k.to_s => send(k)) }.merge(params)
165
+ scoped_attributes = self.class.scopes.inject({}) { |a, e| a.merge(e.to_s => send(e)) }.merge(params)
162
166
  body = cistern.send(collection_method, scoped_attributes).body
163
167
 
164
- self.load(body[collection_root]) # 'results' is the key for paged seraches
165
- self.merge_attributes(Cistern::Hash.slice(body, "count", "next_page", "previous_page"))
168
+ load(body[collection_root]) # 'results' is the key for paged seraches
169
+ merge_attributes(Cistern::Hash.slice(body, 'count', 'next_page', 'previous_page'))
166
170
  end
167
171
  end
@@ -1,10 +1,11 @@
1
- require "logger"
1
+ # frozen_string_literal: true
2
+ require 'logger'
2
3
 
4
+ # Faraday middleware to block and sleep on rate limit events
3
5
  class Zendesk2::RateLimit
4
-
5
6
  attr_reader :logger
6
7
 
7
- def initialize(app, options={})
8
+ def initialize(app, options = {})
8
9
  @app = app
9
10
  @logger = options[:logger] || ::Logger.new(nil)
10
11
  end
data/lib/zendesk2/real.rb CHANGED
@@ -1,29 +1,32 @@
1
+ # frozen_string_literal: true
1
2
  class Zendesk2::Real
2
-
3
3
  attr_accessor :username, :url, :token, :logger, :jwt_token, :last_request
4
4
 
5
- def initialize(options={})
6
- @url = if url = options[:url] || Zendesk2.defaults[:url]
7
- URI.parse(url).to_s
8
- end
5
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
6
+ def initialize(options = {})
7
+ url = options[:url] || Zendesk2.defaults[:url]
8
+
9
+ @url = (URI.parse(url).to_s if url)
9
10
 
10
11
  @logger = options[:logger] || Logger.new(nil)
11
- adapter = options[:adapter] || Faraday.default_adapter
12
+ @adapter = options[:adapter] || Faraday.default_adapter
12
13
  @username = options[:username] || Zendesk2.defaults[:username]
13
14
  @token = options.fetch(:token, Zendesk2.defaults[:token])
14
15
  password = options[:password] || Zendesk2.defaults[:password]
15
16
 
16
- cistern_options = options[:cistern_options] || {}
17
-
18
17
  @auth_token = password || @token
19
18
  @auth_id = "#{@username}/token" if @auth_token == @token
20
19
  @jwt_token = options[:jwt_token]
21
20
 
22
- raise "Missing required options: :url" unless @url
23
- raise "Missing required options: :username" unless @auth_id
24
- raise "Missing required options: :password or :token" unless password || @token
21
+ raise 'Missing required options: :url' unless @url
22
+ raise 'Missing required options: :username' unless @auth_id
23
+ raise 'Missing required options: :password or :token' unless password || @token
24
+
25
+ connection
26
+ end
25
27
 
26
- @cistern = Faraday.new({url: @url}.merge(cistern_options)) do |connection|
28
+ def connection
29
+ @connection ||= Faraday.new(url: @url) do |connection|
27
30
  # response
28
31
  connection.use Faraday::Request::BasicAuthentication, @auth_id, @auth_token
29
32
  connection.use Faraday::Response::RaiseError
@@ -35,27 +38,27 @@ class Zendesk2::Real
35
38
 
36
39
  # idempotency
37
40
  connection.request :retry,
38
- :max => 30,
39
- :interval => 1,
40
- :interval_randomness => 0.2,
41
- :backoff_factor => 2
41
+ max: 30,
42
+ interval: 1,
43
+ interval_randomness: 0.2,
44
+ backoff_factor: 2
42
45
 
43
46
  # rate limit
44
47
  connection.use Zendesk2::RateLimit, logger: @logger
45
48
 
46
49
  connection.use Zendesk2::Logger, @logger
47
- connection.adapter(*adapter)
50
+ connection.adapter(*@adapter)
48
51
  end
49
52
  end
50
53
 
51
- def request(options={})
54
+ def request(options = {})
52
55
  method = options[:method] || :get
53
- url = options[:url] || File.join(@url, "/api/v2", options[:path])
56
+ url = options[:url] || File.join(@url, '/api/v2', options[:path])
54
57
  params = options[:params] || {}
55
58
  body = options[:body]
56
- headers = { "User-Agent" => Zendesk2::USER_AGENT }.merge(options[:headers] || {})
59
+ headers = { 'User-Agent' => Zendesk2::USER_AGENT }.merge(options[:headers] || {})
57
60
 
58
- @cistern.send(method) do |req|
61
+ connection.send(method) do |req|
59
62
  req.url(url)
60
63
  req.headers.merge!(headers)
61
64
  req.params.merge!(params)
@@ -64,6 +67,6 @@ class Zendesk2::Real
64
67
  rescue Faraday::ConnectionFailed
65
68
  raise
66
69
  rescue Faraday::Error::ClientError => e
67
- raise Zendesk2::Error.new(e)
70
+ raise Zendesk2::Error, e
68
71
  end
69
72
  end
@@ -1,5 +1,5 @@
1
+ # frozen_string_literal: true
1
2
  module Zendesk2::Request
2
-
3
3
  class << self
4
4
  alias cistern_included included
5
5
 
@@ -10,8 +10,9 @@ module Zendesk2::Request
10
10
  end
11
11
  end
12
12
 
13
+ # provide class-level request information
13
14
  module ClassMethods
14
- def request_method(request_method=nil)
15
+ def request_method(request_method = nil)
15
16
  @request_method ||= request_method
16
17
  end
17
18
 
@@ -36,15 +37,15 @@ module Zendesk2::Request
36
37
  end
37
38
 
38
39
  def error_map
39
- @@error_map ||= {
40
- :invalid => [422, {
41
- "error" => "RecordInvalid",
42
- "description" => "Record validation errors",
43
- }],
44
- :not_found => [404, {
45
- "error" => "RecordNotFound",
46
- "description" => "Not found",
47
- }],
40
+ @error_map ||= {
41
+ invalid: [422, {
42
+ 'error' => 'RecordInvalid',
43
+ 'description' => 'Record validation errors',
44
+ },],
45
+ not_found: [404, {
46
+ 'error' => 'RecordNotFound',
47
+ 'description' => 'Not found',
48
+ },],
48
49
  }
49
50
  end
50
51
  end
@@ -55,23 +56,25 @@ module Zendesk2::Request
55
56
  @params = Cistern::Hash.stringify_keys(params)
56
57
  end
57
58
 
58
- def _mock(params={})
59
+ def _mock(params = {})
59
60
  setup(params)
60
61
  mock
61
62
  end
62
63
 
63
- def _real(params={})
64
+ def _real(params = {})
64
65
  setup(params)
65
66
  real
66
67
  end
67
68
 
68
69
  def page_params!(options)
69
- page_params = if url = options.delete("url")
70
+ url = options.delete('url')
71
+
72
+ page_params = if url
70
73
  Faraday::NestedParamsEncoder.decode(URI.parse(url).query)
71
74
  else
72
75
  Cistern::Hash.stringify_keys(options)
73
76
  end
74
- Cistern::Hash.slice(page_params, "per_page", "page", "query")
77
+ Cistern::Hash.slice(page_params, 'per_page', 'page', 'query')
75
78
  end
76
79
 
77
80
  def page_params?
@@ -79,9 +82,7 @@ module Zendesk2::Request
79
82
  end
80
83
 
81
84
  def request_params
82
- page_params = if page_params?
83
- page_params!(self.params)
84
- end
85
+ page_params = (page_params!(params) if page_params?)
85
86
 
86
87
  if self.class.request_params
87
88
  self.class.request_params.call(self)
@@ -94,7 +95,7 @@ module Zendesk2::Request
94
95
  case (generator = self.class.request_path)
95
96
  when Proc then
96
97
  generator.call(self)
97
- else raise ArgumentError.new("Couldn't generate request_path from #{generator.inspect}")
98
+ else raise ArgumentError, "Couldn't generate request_path from #{generator.inspect}"
98
99
  end
99
100
  end
100
101
 
@@ -109,97 +110,92 @@ module Zendesk2::Request
109
110
 
110
111
  def pluralize(word)
111
112
  pluralized = word.dup
112
- [[/y$/, 'ies'], [/$/, 's']].find{|regex, replace| pluralized.gsub!(regex, replace) if pluralized.match(regex)}
113
+ [[/y$/, 'ies'], [/$/, 's']].find { |regex, replace| pluralized.gsub!(regex, replace) if pluralized.match(regex) }
113
114
  pluralized
114
115
  end
115
116
 
116
117
  def data
117
- self.cistern.data
118
+ cistern.data
118
119
  end
119
120
 
120
121
  def html_url_for(path)
121
122
  File.join(cistern.url, path.to_s)
122
123
  end
123
124
 
124
- def url_for(path, options={})
125
+ def url_for(path, options = {})
125
126
  URI.parse(
126
- File.join(cistern.url, "/api/v2", path.to_s)
127
+ File.join(cistern.url, '/api/v2', path.to_s),
127
128
  ).tap do |uri|
128
- if query = options[:query]
129
- uri.query = Faraday::NestedParamsEncoder.encode(query)
130
- end
129
+ query = options[:query]
130
+ query && (uri.query = Faraday::NestedParamsEncoder.encode(query))
131
131
  end.to_s
132
132
  end
133
133
 
134
- def real(params={})
135
- cistern.request(:method => self.class.request_method,
136
- :path => self.request_path,
137
- :body => self.request_body,
138
- :url => params["url"],
139
- :params => self.request_params,
140
- )
134
+ def real(params = {})
135
+ cistern.request(method: self.class.request_method,
136
+ path: request_path,
137
+ body: request_body,
138
+ url: params['url'],
139
+ params: request_params,)
141
140
  end
142
141
 
143
- def real_request(params={})
142
+ def real_request(params = {})
144
143
  request({
145
- :method => self.class.request_method,
146
- :path => self.request_path(params),
147
- :body => self.request_body(params),
148
- }.merge(cistern::hash.slice(params, :method, :path, :body, :headers)))
144
+ method: self.class.request_method,
145
+ path: request_path(params),
146
+ body: request_body(params),
147
+ }.merge(cistern.hash.slice(params, :method, :path, :body, :headers),),)
149
148
  end
150
149
 
151
- def mock_response(body, options={})
150
+ def mock_response(body, options = {})
152
151
  response(
153
- :method => self.class.request_method,
154
- :path => options[:path] || self.request_path,
155
- :request_body => self.request_body,
156
- :response_body => body,
157
- :headers => options[:headers] || {},
158
- :status => options[:status] || 200,
159
- :params => options[:params] || self.request_params,
152
+ method: self.class.request_method,
153
+ path: options[:path] || request_path,
154
+ request_body: request_body,
155
+ response_body: body,
156
+ headers: options[:headers] || {},
157
+ status: options[:status] || 200,
158
+ params: options[:params] || request_params,
160
159
  )
161
160
  end
162
161
 
163
- def find!(collection, identity, options={})
164
- if resource = self.cistern.data[collection][identity.to_i]
165
- resource
166
- else
167
- error!(options[:error] || :not_found, options)
168
- end
162
+ def find!(collection, identity, options = {})
163
+ resource = cistern.data[collection][identity.to_i]
164
+ resource || error!(options[:error] || :not_found, options)
169
165
  end
170
166
 
171
- def delete!(collection, identity, options={})
172
- self.cistern.data[collection].delete(identity.to_i) ||
167
+ def delete!(collection, identity, options = {})
168
+ cistern.data[collection].delete(identity.to_i) ||
173
169
  error!(options[:error] || :not_found, options)
174
170
  end
175
171
 
176
- def error!(type, options={})
172
+ def error!(type, options = {})
177
173
  status, body = self.class.error_map[type]
178
- body.merge!("details" => options[:details]) if options[:details]
174
+ body['details'] = options[:details] if options[:details]
179
175
 
180
176
  response(
181
- :path => self.request_path,
182
- :status => status,
183
- :body => body,
177
+ path: request_path,
178
+ status: status,
179
+ body: body,
184
180
  )
185
181
  end
186
182
 
187
- def resources(collection, options={})
183
+ def resources(collection, options = {})
188
184
  page = collection.is_a?(Array) ? collection : cistern.data[collection.to_sym].values
189
185
  root = options.fetch(:root) { !collection.is_a?(Array) && collection.to_s }
190
186
 
191
187
  mock_response(
192
188
  root => page,
193
- "count" => page.size,
189
+ 'count' => page.size,
194
190
  )
195
191
  end
196
192
 
197
- def page(collection, options={})
193
+ def page(collection, options = {})
198
194
  url_params = options[:params] || params
199
195
  page_params = page_params!(params)
200
196
 
201
- page_size = (page_params.delete("per_page") || 50).to_i
202
- page_index = (page_params.delete("page") || 1).to_i
197
+ page_size = (page_params.delete('per_page') || 50).to_i
198
+ page_index = (page_params.delete('page') || 1).to_i
203
199
  root = options.fetch(:root) { !collection.is_a?(Array) && collection.to_s }
204
200
  path = options[:path] || request_path
205
201
 
@@ -210,24 +206,24 @@ module Zendesk2::Request
210
206
  total_pages = (count / page_size) + 1
211
207
 
212
208
  next_page = if page_index < total_pages
213
- url_for(path, query: {"page" => page_index + 1, "per_page" => page_size}.merge(url_params))
209
+ url_for(path, query: { 'page' => page_index + 1, 'per_page' => page_size }.merge(url_params))
214
210
  end
215
211
  previous_page = if page_index > 1
216
- url_for(path, query: {"page" => page_index - 1, "per_page" => page_size}.merge(url_params))
212
+ url_for(path, query: { 'page' => page_index - 1, 'per_page' => page_size }.merge(url_params))
217
213
  end
218
214
 
219
215
  resource_page = resources.slice(offset, page_size)
220
216
 
221
217
  body = {
222
218
  root => resource_page,
223
- "count" => count,
224
- "next_page" => next_page,
225
- "previous_page" => previous_page,
219
+ 'count' => count,
220
+ 'next_page' => next_page,
221
+ 'previous_page' => previous_page,
226
222
  }
227
223
 
228
224
  response(
229
- :body => body,
230
- :path => path
225
+ body: body,
226
+ path: path,
231
227
  )
232
228
  end
233
229
 
@@ -245,18 +241,18 @@ module Zendesk2::Request
245
241
  # \@request_body is special because it's need for spec assertions but
246
242
  # {Faraday::Env} replaces the request body with the response body after
247
243
  # the request and the reference is lost
248
- def response(options={})
244
+ def response(options = {})
249
245
  body = options[:response_body] || options[:body]
250
246
  method = options[:method] || :get
251
247
  params = options[:params]
252
248
  cistern.last_request = options[:request_body]
253
- status = options[:status] || 200
249
+ status = options[:status] || 200
254
250
 
255
251
  path = options[:path]
256
252
  url = options[:url] || url_for(path, query: params)
257
253
 
258
- request_headers = {"Accept" => "application/json"}
259
- response_headers = {"Content-Type" => "application/json; charset=utf-8"}
254
+ request_headers = { 'Accept' => 'application/json' }
255
+ response_headers = { 'Content-Type' => 'application/json; charset=utf-8' }
260
256
 
261
257
  # request phase
262
258
  # * :method - :get, :post, ...
@@ -269,17 +265,17 @@ module Zendesk2::Request
269
265
  # * :body - the response body
270
266
  # * :response_headers
271
267
  env = Faraday::Env.from(
272
- :method => method,
273
- :url => URI.parse(url),
274
- :body => body,
275
- :request_headers => request_headers,
276
- :response_headers => response_headers,
277
- :status => status,
268
+ method: method,
269
+ url: URI.parse(url),
270
+ body: body,
271
+ request_headers: request_headers,
272
+ response_headers: response_headers,
273
+ status: status,
278
274
  )
279
275
 
280
276
  Faraday::Response::RaiseError.new.on_complete(env) ||
281
277
  Faraday::Response.new(env)
282
278
  rescue Faraday::Error::ClientError => e
283
- raise Zendesk2::Error.new(e)
279
+ raise Zendesk2::Error, e
284
280
  end
285
281
  end