zendesk2 1.11.0 → 1.12.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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/CHANGELOG.md +2 -3
  4. data/Gemfile +1 -3
  5. data/README.md +2 -0
  6. data/lib/zendesk2.rb +1 -1
  7. data/lib/zendesk2/client.rb +11 -11
  8. data/lib/zendesk2/create_category.rb +2 -2
  9. data/lib/zendesk2/create_forum.rb +2 -2
  10. data/lib/zendesk2/create_group.rb +2 -2
  11. data/lib/zendesk2/create_organization.rb +2 -2
  12. data/lib/zendesk2/create_ticket.rb +36 -9
  13. data/lib/zendesk2/create_ticket_field.rb +2 -2
  14. data/lib/zendesk2/create_topic.rb +2 -2
  15. data/lib/zendesk2/create_topic_comment.rb +2 -2
  16. data/lib/zendesk2/create_user.rb +4 -4
  17. data/lib/zendesk2/create_user_field.rb +2 -2
  18. data/lib/zendesk2/create_user_identity.rb +2 -2
  19. data/lib/zendesk2/create_view.rb +2 -2
  20. data/lib/zendesk2/get_view_tickets.rb +2 -2
  21. data/lib/zendesk2/help_center/create_help_center_article.rb +2 -2
  22. data/lib/zendesk2/help_center/create_help_center_category.rb +2 -2
  23. data/lib/zendesk2/help_center/create_help_center_post.rb +2 -2
  24. data/lib/zendesk2/help_center/create_help_center_section.rb +2 -2
  25. data/lib/zendesk2/help_center/create_help_center_subscription.rb +2 -3
  26. data/lib/zendesk2/help_center/create_help_center_topic.rb +2 -2
  27. data/lib/zendesk2/help_center/create_help_center_translation.rb +2 -2
  28. data/lib/zendesk2/help_center/destroy_help_center_article.rb +3 -1
  29. data/lib/zendesk2/help_center/search_help_center_articles.rb +2 -9
  30. data/lib/zendesk2/help_center/subscription_request.rb +0 -1
  31. data/lib/zendesk2/help_center/update_help_center_subscription.rb +1 -1
  32. data/lib/zendesk2/mock.rb +1 -0
  33. data/lib/zendesk2/organizations.rb +6 -5
  34. data/lib/zendesk2/paged_collection.rb +10 -10
  35. data/lib/zendesk2/request.rb +7 -10
  36. data/lib/zendesk2/search.rb +2 -9
  37. data/lib/zendesk2/search_organization.rb +2 -9
  38. data/lib/zendesk2/search_user.rb +2 -9
  39. data/lib/zendesk2/searchable.rb +6 -6
  40. data/lib/zendesk2/ticket.rb +20 -11
  41. data/lib/zendesk2/update_user.rb +2 -2
  42. data/lib/zendesk2/update_view.rb +1 -1
  43. data/lib/zendesk2/version.rb +1 -1
  44. data/spec/tickets_spec.rb +41 -0
  45. data/zendesk2.gemspec +1 -0
  46. metadata +22 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9e80f873dd170c7aa2f3a62268d1e2580228f5c5
4
- data.tar.gz: 4eca8baf6dd0b2f4be9d2b2a4879dd77c78cec69
3
+ metadata.gz: a61d3d90ed074ac942698a76c6032da01d98dc49
4
+ data.tar.gz: c7c9d087bc7d353345a15e02455b679c745d3a91
5
5
  SHA512:
6
- metadata.gz: 717c640ad7636fefe296d93c3c75f317fb83e758bc08c2fda527abbf2c917adb364d484cbdf75753d92a966442d6eabf58c5deb6224f0bc34474d064bfb35e21
7
- data.tar.gz: 5a635a1179e896ab3cfcc00aa1b6751310afb29f803d8775ab3cd65c0e3ab004c6d69257db0e617eedfdfc95e682890fe8c1461c54e8f567b6164966199007c7
6
+ metadata.gz: 68410198ef99c316d62bb865a3f2d29e9975848972ee8b706d37bd0acb84ba547209efecbff793afdee1d85edccda4fdfc93f0a069675f0a5968472c922b6cd1
7
+ data.tar.gz: bf5cc95b1b2e4dc8e616112aabc0ade9419a1b68ef1223ff136209f470b3f1b0e986dc2c154fa69f898a73347eee04f17728a3d89a43f63999ab6a0c7f357b1c
@@ -1,5 +1,5 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.3
2
+ TargetRubyVersion: 2.2
3
3
  DisplayCopNames: true
4
4
  Metrics/LineLength:
5
5
  Max: 120
@@ -1,8 +1,7 @@
1
1
  # Change Log
2
2
 
3
- ## [Unreleased](https://github.com/lanej/zendesk2/tree/HEAD)
4
-
5
- [Full Changelog](https://github.com/lanej/zendesk2/compare/v1.10.0...HEAD)
3
+ ## [v1.11.0](https://github.com/lanej/zendesk2/tree/v1.11.0) (2016-07-05)
4
+ [Full Changelog](https://github.com/lanej/zendesk2/compare/v1.10.0...v1.11.0)
6
5
 
7
6
  **Implemented enhancements:**
8
7
 
data/Gemfile CHANGED
@@ -5,9 +5,7 @@ source 'https://rubygems.org'
5
5
  gemspec
6
6
 
7
7
  gem 'rake'
8
- # To avoid warnings from JWT
9
- gem 'json', '~> 1.8'
10
- gem 'rubocop', '~> 0.41', require: false
8
+ gem 'rubocop', '~> 0.44.1', require: false
11
9
 
12
10
  group :test do
13
11
  gem 'pry-nav'
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Zendesk2
2
2
 
3
+ [![Join the chat at https://gitter.im/lanej/zendesk2](https://badges.gitter.im/lanej/zendesk2.svg)](https://gitter.im/lanej/zendesk2?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
4
+
3
5
  [![Build Status](https://travis-ci.org/lanej/zendesk2.svg?branch=master)](http://travis-ci.org/lanej/zendesk2)
4
6
  [![Gem Version](https://fury-badge.herokuapp.com/rb/zendesk2.png)](http://badge.fury.io/rb/zendesk2)
5
7
  [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/lanej/zendesk2)
@@ -19,7 +19,7 @@ require 'securerandom'
19
19
  module Zendesk2
20
20
  include Cistern::Client.with(interface: :module)
21
21
 
22
- USER_AGENT = <<-UA
22
+ USER_AGENT = <<-UA.freeze
23
23
  Ruby/#{RUBY_VERSION} (#{RUBY_PLATFORM}; #{RUBY_ENGINE}) Zendesk2/#{Zendesk2::VERSION} Faraday/#{Faraday::VERSION}
24
24
  UA
25
25
 
@@ -1,19 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
  # @deprecated use {#Zendesk2}
3
3
  module Zendesk2::Client
4
- def self.method_missing(message, *args, &block)
5
- Cistern.deprecation('Zendesk2::Client is deprecated, use Zendesk2', caller[1])
6
-
7
- if Zendesk2.respond_to?(message)
8
- Zendesk2.public_send(message, *args, &block)
9
- else
10
- super
4
+ class << self
5
+ def respond_to_missing?(method, *)
6
+ Zendesk2.respond_to?(method) || super
11
7
  end
12
- end
13
8
 
14
- def self.respond_to?(message)
15
- Cistern.deprecation('Zendesk2::Client is deprecated, use Zendesk2', caller[1])
9
+ def method_missing(message, *args, &block)
10
+ Cistern.deprecation('Zendesk2::Client is deprecated, use Zendesk2', caller[1])
16
11
 
17
- Zendesk2.respond_to?(message) || super
12
+ if Zendesk2.respond_to?(message)
13
+ Zendesk2.public_send(message, *args, &block)
14
+ else
15
+ super
16
+ end
17
+ end
18
18
  end
19
19
  end
@@ -16,8 +16,8 @@ class Zendesk2::CreateCategory
16
16
  record = {
17
17
  'id' => identity,
18
18
  'url' => url_for("/categories/#{identity}.json"),
19
- 'created_at' => Time.now.iso8601,
20
- 'updated_at' => Time.now.iso8601,
19
+ 'created_at' => timestamp,
20
+ 'updated_at' => timestamp,
21
21
  }.merge(Cistern::Hash.slice(params.fetch('category'), *self.class.accepted_attributes))
22
22
 
23
23
  cistern.data[:categories][identity] = record
@@ -20,8 +20,8 @@ class Zendesk2::CreateForum
20
20
  record = {
21
21
  'id' => identity,
22
22
  'url' => url_for("/forums/#{identity}.json"),
23
- 'created_at' => Time.now.iso8601,
24
- 'updated_at' => Time.now.iso8601,
23
+ 'created_at' => timestamp,
24
+ 'updated_at' => timestamp,
25
25
  }.merge(Cistern::Hash.slice(params.fetch('forum'), *self.class.accepted_attributes))
26
26
 
27
27
  cistern.data[:forums][identity] = record
@@ -20,8 +20,8 @@ class Zendesk2::CreateGroup
20
20
  record = {
21
21
  'id' => identity,
22
22
  'url' => url_for("/groups/#{identity}.json"),
23
- 'created_at' => Time.now.iso8601,
24
- 'updated_at' => Time.now.iso8601,
23
+ 'created_at' => timestamp,
24
+ 'updated_at' => timestamp,
25
25
  'deleted' => false,
26
26
  }.merge(group_params)
27
27
 
@@ -20,8 +20,8 @@ class Zendesk2::CreateOrganization
20
20
  record = {
21
21
  'id' => identity,
22
22
  'url' => url_for("/organizations/#{identity}.json"),
23
- 'created_at' => Time.now.iso8601,
24
- 'updated_at' => Time.now.iso8601,
23
+ 'created_at' => timestamp,
24
+ 'updated_at' => timestamp,
25
25
  }.merge(organization_params)
26
26
 
27
27
  unless record['name']
@@ -8,7 +8,7 @@ class Zendesk2::CreateTicket
8
8
 
9
9
  def self.accepted_attributes
10
10
  %w(external_id via priority requester requester_id submitter_id assignee_id organization_id subject description
11
- custom_fields recipient status collaborator_ids tags)
11
+ custom_fields recipient status collaborator_ids collaborators tags)
12
12
  end
13
13
 
14
14
  def ticket_params
@@ -24,6 +24,7 @@ class Zendesk2::CreateTicket
24
24
  requester_id = create_params.delete('requester_id')
25
25
 
26
26
  set_requester(create_params.delete('requester'), create_params)
27
+ set_collaborators(create_params)
27
28
  custom_fields = get_custom_fields(create_params.delete('custom_fields') || [])
28
29
 
29
30
  identity = cistern.serial_id
@@ -31,10 +32,9 @@ class Zendesk2::CreateTicket
31
32
  record = {
32
33
  'id' => identity,
33
34
  'url' => url_for("/tickets/#{identity}.json"),
34
- 'created_at' => Time.now.iso8601,
35
- 'updated_at' => Time.now.iso8601,
35
+ 'created_at' => timestamp,
36
+ 'updated_at' => timestamp,
36
37
  'priority' => nil,
37
- 'collaborator_ids' => [],
38
38
  'custom_fields' => custom_fields,
39
39
  }.merge(create_params)
40
40
 
@@ -64,11 +64,7 @@ class Zendesk2::CreateTicket
64
64
  ],
65
65
  })
66
66
 
67
- known_user = cistern.users.search(email: requester['email']).first
68
-
69
- user_id = (known_user && known_user.identity) || cistern.create_user('user' => requester).body['user']['id']
70
-
71
- create_params['requester_id'] = user_id.to_i
67
+ create_params['requester_id'] = find_or_create_user(requester)
72
68
  end
73
69
 
74
70
  def get_custom_fields(requested_custom_fields)
@@ -87,4 +83,35 @@ class Zendesk2::CreateTicket
87
83
 
88
84
  custom_fields
89
85
  end
86
+
87
+ # rubocop:disable Style/AccessorMethodName
88
+ def set_collaborators(create_params)
89
+ ids = create_params.delete('collaborator_ids') || []
90
+ collaborator_specs = create_params.delete('collaborators') || []
91
+
92
+ ids += collaborator_specs.map do |spec|
93
+ case spec
94
+ when Hash
95
+ find_or_create_user(spec)
96
+ when Integer, String
97
+ cistern.users.get!(spec).identity
98
+ else
99
+ raise ArgumentError, "Unprocessable collaborator: #{spec}"
100
+ end
101
+ end.compact
102
+
103
+ create_params.merge!('collaborator_ids' => ids)
104
+ end
105
+
106
+ def find_or_create_user(user)
107
+ return nil unless user['email']
108
+ user['name'] ||= user['email'].split('@').first.capitalize
109
+
110
+ known_user = cistern.users.search(email: user['email']).first
111
+
112
+ user_id = (known_user && known_user.identity) ||
113
+ cistern.create_user('user' => user).body['user']['id']
114
+
115
+ user_id.to_i
116
+ end
90
117
  end
@@ -21,7 +21,7 @@ class Zendesk2::CreateTicketField
21
21
  record = {
22
22
  'active' => true,
23
23
  'collapsed_for_agents' => false,
24
- 'created_at' => Time.now.iso8601,
24
+ 'created_at' => timestamp,
25
25
  'description' => params['title'],
26
26
  'editable_in_portal' => false,
27
27
  'id' => identity,
@@ -32,7 +32,7 @@ class Zendesk2::CreateTicketField
32
32
  'required_in_portal' => false,
33
33
  'tag' => '',
34
34
  'title_in_portal' => params['title'],
35
- 'updated_at' => Time.now.iso8601,
35
+ 'updated_at' => timestamp,
36
36
  'url' => url_for("/ticket_fields/#{identity}.json"),
37
37
  'visible_in_portal' => false,
38
38
  }.merge(ticket_field_params)
@@ -20,8 +20,8 @@ class Zendesk2::CreateTopic
20
20
  record = {
21
21
  'id' => identity,
22
22
  'url' => url_for("/topics/#{identity}.json"),
23
- 'created_at' => Time.now.iso8601,
24
- 'updated_at' => Time.now.iso8601,
23
+ 'created_at' => timestamp,
24
+ 'updated_at' => timestamp,
25
25
  }.merge(topic_params)
26
26
 
27
27
  data[:topics][identity] = record
@@ -24,8 +24,8 @@ class Zendesk2::CreateTopicComment
24
24
  record = {
25
25
  'id' => identity,
26
26
  'url' => url_for("/topics/#{topic_id}/comments/#{identity}.json"),
27
- 'created_at' => Time.now.iso8601,
28
- 'updated_at' => Time.now.iso8601,
27
+ 'created_at' => timestamp,
28
+ 'updated_at' => timestamp,
29
29
  'topic_id' => topic_id,
30
30
  }.merge(topic_comment_params)
31
31
 
@@ -25,8 +25,8 @@ class Zendesk2::CreateUser
25
25
  record = {
26
26
  'id' => user_id,
27
27
  'url' => url_for("/users/#{user_id}.json"),
28
- 'created_at' => Time.now.iso8601,
29
- 'updated_at' => Time.now.iso8601,
28
+ 'created_at' => timestamp,
29
+ 'updated_at' => timestamp,
30
30
  'role' => 'end-user',
31
31
  'active' => true,
32
32
  }.merge(user_params)
@@ -58,8 +58,8 @@ class Zendesk2::CreateUser
58
58
  user_identity = {
59
59
  'id' => user_identity_id,
60
60
  'url' => url_for("/users/#{user_id}/identities/#{user_identity_id}.json"),
61
- 'created_at' => Time.now.iso8601,
62
- 'updated_at' => Time.now.iso8601,
61
+ 'created_at' => timestamp,
62
+ 'updated_at' => timestamp,
63
63
  'type' => 'email',
64
64
  'value' => record['email'],
65
65
  'verified' => false,
@@ -20,7 +20,7 @@ class Zendesk2::CreateUserField
20
20
  record = {
21
21
  'active' => true,
22
22
  'collapsed_for_agents' => false,
23
- 'created_at' => Time.now.iso8601,
23
+ 'created_at' => timestamp,
24
24
  'description' => params['title'],
25
25
  'editable_in_portal' => false,
26
26
  'id' => identity,
@@ -31,7 +31,7 @@ class Zendesk2::CreateUserField
31
31
  'required_in_portal' => false,
32
32
  'tag' => '',
33
33
  'title_in_portal' => params['title'],
34
- 'updated_at' => Time.now.iso8601,
34
+ 'updated_at' => timestamp,
35
35
  'url' => url_for("/user_fields/#{identity}.json"),
36
36
  'visible_in_portal' => false,
37
37
  }.merge(user_field_params)
@@ -24,8 +24,8 @@ class Zendesk2::CreateUserIdentity
24
24
  record = {
25
25
  'id' => identity,
26
26
  'url' => url_for("/user/#{user_id}/identities/#{identity}.json"),
27
- 'created_at' => Time.now.iso8601,
28
- 'updated_at' => Time.now.iso8601,
27
+ 'created_at' => timestamp,
28
+ 'updated_at' => timestamp,
29
29
  'verified' => false,
30
30
  'primary' => false,
31
31
  'user_id' => user_id,
@@ -63,8 +63,8 @@ class Zendesk2::CreateView
63
63
  record = {
64
64
  'id' => identity,
65
65
  'url' => url_for("/views/#{identity}.json"),
66
- 'created_at' => Time.now.iso8601,
67
- 'updated_at' => Time.now.iso8601,
66
+ 'created_at' => timestamp,
67
+ 'updated_at' => timestamp,
68
68
  'active' => true,
69
69
  'execution' => {
70
70
  'columns' => columns,
@@ -15,7 +15,7 @@ class Zendesk2::GetViewTickets
15
15
  view = find!(:views, view_id)
16
16
 
17
17
  operators = Array(view['conditions']['all']).map do |c|
18
- operator = ('is' == c.fetch('operator')) ? :eql? : :!=
18
+ operator = 'is' == c.fetch('operator') ? :eql? : :!=
19
19
  key = c.fetch('field')
20
20
  value = c.fetch('value').to_s
21
21
 
@@ -27,7 +27,7 @@ class Zendesk2::GetViewTickets
27
27
  end
28
28
 
29
29
  any_operators = Array(view['conditions']['any']).map do |c|
30
- operator = ('is' == c.fetch('operator')) ? :eql? : :!=
30
+ operator = 'is' == c.fetch('operator') ? :eql? : :!=
31
31
  key = c.fetch('field')
32
32
  value = c.fetch('value').to_s
33
33
 
@@ -44,8 +44,8 @@ class Zendesk2::CreateHelpCenterArticle
44
44
  'vote_sum' => 0,
45
45
  'vote_count' => 0,
46
46
  'section_id' => section_id,
47
- 'created_at' => Time.now.iso8601,
48
- 'updated_at' => Time.now.iso8601,
47
+ 'created_at' => timestamp,
48
+ 'updated_at' => timestamp,
49
49
  'title' => '',
50
50
  'body' => '',
51
51
  'source_locale' => locale,
@@ -26,8 +26,8 @@ class Zendesk2::CreateHelpCenterCategory
26
26
  'html_url' => html_url_for("/hc/#{locale}/categories/#{identity}.json"),
27
27
  'author_id' => cistern.current_user['id'],
28
28
  'position' => position,
29
- 'created_at' => Time.now.iso8601,
30
- 'updated_at' => Time.now.iso8601,
29
+ 'created_at' => timestamp,
30
+ 'updated_at' => timestamp,
31
31
  'description' => '',
32
32
  }.merge(category_params)
33
33
 
@@ -21,8 +21,8 @@ class Zendesk2::CreateHelpCenterPost
21
21
  'id' => identity,
22
22
  'url' => url_for("/community/posts/#{identity}.json"),
23
23
  'html_url' => html_url_for("/hc/posts/#{identity}.json"),
24
- 'created_at' => Time.now.iso8601,
25
- 'updated_at' => Time.now.iso8601,
24
+ 'created_at' => timestamp,
25
+ 'updated_at' => timestamp,
26
26
  'vote_count' => 0,
27
27
  'vote_sum' => 0,
28
28
  'comment_count' => 0,
@@ -37,8 +37,8 @@ class Zendesk2::CreateHelpCenterSection
37
37
  'vote_sum' => 0,
38
38
  'vote_count' => 0,
39
39
  'category_id' => category_id,
40
- 'created_at' => Time.now.iso8601,
41
- 'updated_at' => Time.now.iso8601,
40
+ 'created_at' => timestamp,
41
+ 'updated_at' => timestamp,
42
42
  'name' => '',
43
43
  'body' => '',
44
44
  'source_locale' => locale,
@@ -28,12 +28,11 @@ class Zendesk2::CreateHelpCenterSubscription
28
28
  mock_response('Required parameter missing: subscription', status: 400)
29
29
  end
30
30
 
31
-
32
31
  record = subscription_params.merge(
33
32
  'id' => identity,
34
33
  'url' => url,
35
- 'created_at' => Time.now.iso8601, # @todo create #timestamp helper
36
- 'updated_at' => Time.now.iso8601,
34
+ 'created_at' => timestamp, # @todo create #timestamp helper
35
+ 'updated_at' => timestamp,
37
36
  'content_id' => content_id,
38
37
  'content_type' => content_type,
39
38
  )
@@ -24,8 +24,8 @@ class Zendesk2::CreateHelpCenterTopic
24
24
  'url' => url_for("/communit/topics/#{identity}.json"),
25
25
  'html_url' => html_url_for("/hc/topics/#{identity}.json"),
26
26
  'position' => position,
27
- 'created_at' => Time.now.iso8601,
28
- 'updated_at' => Time.now.iso8601,
27
+ 'created_at' => timestamp,
28
+ 'updated_at' => timestamp,
29
29
  'description' => '',
30
30
  }.merge(topic_params)
31
31
 
@@ -22,8 +22,8 @@ class Zendesk2::CreateHelpCenterTranslation
22
22
  'id' => identity,
23
23
  'url' => url_for("/help_center/#{source_type_url}/#{source_id}/translation/#{locale}.json"),
24
24
  'html_url' => html_url_for("/hc/#{locale}/#{source_type_url}/#{source_id}"),
25
- 'created_at' => Time.now.iso8601,
26
- 'updated_at' => Time.now.iso8601,
25
+ 'created_at' => timestamp,
26
+ 'updated_at' => timestamp,
27
27
  'title' => params.fetch('translation').fetch('title'),
28
28
  'body' => (params.fetch('translation')['body'] || ''),
29
29
  'outdated' => false,
@@ -10,6 +10,8 @@ class Zendesk2::DestroyHelpCenterArticle
10
10
  end
11
11
 
12
12
  def mock
13
- mock_response('article' => find!(:help_center_articles, article_id))
13
+ delete!(:help_center_articles, article_id)
14
+
15
+ mock_response(nil)
14
16
  end
15
17
  end
@@ -6,16 +6,9 @@ class Zendesk2::SearchHelpCenterArticles
6
6
 
7
7
  attr_reader :query
8
8
 
9
- def _mock(query, params = {})
9
+ def call(query, params)
10
10
  @query = query
11
- setup(params)
12
- mock
13
- end
14
-
15
- def _real(query, params = {})
16
- @query = query
17
- setup(params)
18
- real
11
+ super(params)
19
12
  end
20
13
 
21
14
  def mock
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
  module Zendesk2::HelpCenter::SubscriptionRequest
3
-
4
3
  def self.included(klass)
5
4
  super
6
5
  klass.extend(ClassMethods)
@@ -25,7 +25,7 @@ class Zendesk2::UpdateHelpCenterSubscription
25
25
 
26
26
  updated = subscription_params
27
27
  updated['locale'] = updated.delete('source_locale') if updated['source_locale']
28
- updated['updated_at'] = Time.now.iso8601
28
+ updated['updated_at'] = timestamp
29
29
 
30
30
  subscription.merge!(updated)
31
31
 
@@ -3,6 +3,7 @@ class Zendesk2::Mock
3
3
  attr_reader :username, :url, :token, :jwt_token
4
4
  attr_accessor :last_request
5
5
 
6
+ # rubocop:disable Metrics/BlockLength
6
7
  def self.data
7
8
  @data ||= Hash.new do |h, k|
8
9
  h[k] = {
@@ -15,11 +15,12 @@ class Zendesk2::Organizations
15
15
  def find_by_external_id(external_id)
16
16
  body = cistern.get_organization_by_external_id('external_id' => external_id).body
17
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'))
21
- collection
22
- end
18
+
19
+ return unless data
20
+
21
+ collection = clone.load(data)
22
+ collection.merge_attributes(Cistern::Hash.slice(body, 'count', 'next_page', 'previous_page'))
23
+ collection
23
24
  end
24
25
 
25
26
  self.collection_method = :get_organizations
@@ -58,19 +58,19 @@ module Zendesk2::PagedCollection
58
58
  end
59
59
 
60
60
  def next_page
61
- if next_page_link
62
- options = { 'url' => next_page_link }
63
- options['filtered'] = filtered if respond_to?(:filtered) # searchable
64
- new_page.all(options)
65
- end
61
+ return nil unless next_page_link
62
+
63
+ options = { 'url' => next_page_link }
64
+ options['filtered'] = filtered if respond_to?(:filtered) # searchable
65
+ new_page.all(options)
66
66
  end
67
67
 
68
68
  def previous_page
69
- if previous_page_link
70
- options = { 'url' => previous_page_link }
71
- options['filtered'] = filtered if respond_to?(:filtered) # searchable
72
- new_page.all(options)
73
- end
69
+ return nil unless previous_page_link
70
+
71
+ options = { 'url' => previous_page_link }
72
+ options['filtered'] = filtered if respond_to?(:filtered) # searchable
73
+ new_page.all(options)
74
74
  end
75
75
 
76
76
  # Attempt creation of resource and explode if unsuccessful
@@ -52,18 +52,11 @@ module Zendesk2::Request
52
52
 
53
53
  attr_reader :params
54
54
 
55
- def setup(params)
55
+ def call(*args)
56
+ params = args.last.is_a?(Hash) ? args.pop : {}
56
57
  @params = Cistern::Hash.stringify_keys(params)
57
- end
58
-
59
- def _mock(params = {})
60
- setup(params)
61
- mock
62
- end
63
58
 
64
- def _real(params = {})
65
- setup(params)
66
- real
59
+ dispatch
67
60
  end
68
61
 
69
62
  def page_params!(options)
@@ -147,6 +140,10 @@ module Zendesk2::Request
147
140
  }.merge(cistern.hash.slice(params, :method, :path, :body, :headers),),)
148
141
  end
149
142
 
143
+ def timestamp
144
+ Time.now.iso8601
145
+ end
146
+
150
147
  def mock_response(body, options = {})
151
148
  response(
152
149
  method: self.class.request_method,
@@ -10,16 +10,9 @@ class Zendesk2::Search
10
10
 
11
11
  attr_reader :query
12
12
 
13
- def _mock(query, params = {})
13
+ def call(query, params)
14
14
  @query = query
15
- setup(params)
16
- mock
17
- end
18
-
19
- def _real(query, params = {})
20
- @query = query
21
- setup(params)
22
- real
15
+ super(params)
23
16
  end
24
17
 
25
18
  def mock
@@ -10,16 +10,9 @@ class Zendesk2::SearchOrganization
10
10
 
11
11
  page_params!
12
12
 
13
- def _mock(query, params = {})
13
+ def call(query, params = {})
14
14
  @query = query
15
- setup(params)
16
- mock
17
- end
18
-
19
- def _real(query, params = {})
20
- @query = query
21
- setup(params)
22
- real
15
+ super(params)
23
16
  end
24
17
 
25
18
  def mock
@@ -10,16 +10,9 @@ class Zendesk2::SearchUser
10
10
 
11
11
  page_params!
12
12
 
13
- def _mock(query, params = {})
13
+ def call(query, params)
14
14
  @query = query
15
- setup(params)
16
- mock
17
- end
18
-
19
- def _real(query, params = {})
20
- @query = query
21
- setup(params)
22
- real
15
+ super(params)
23
16
  end
24
17
 
25
18
  def mock
@@ -21,15 +21,15 @@ module Zendesk2::Searchable
21
21
  # @see http://developer.zendesk.com/documentation/rest_api/search.html
22
22
  def search(terms, params = {})
23
23
  query = (terms.is_a?(Hash) ? search_by_hash(terms) : search_by_string(terms))
24
-
25
24
  body = cistern.send(self.class.search_request, query, params).body
26
25
  data = body.delete('results')
27
26
 
28
- if data
29
- load(data)
30
- merge_attributes(Cistern::Hash.slice(body, 'count', 'next_page', 'previous_page').merge('filtered' => true))
31
- self
32
- end
27
+ return nil unless data
28
+
29
+ load(data)
30
+
31
+ merge_attributes(Cistern::Hash.slice(body, 'count', 'next_page', 'previous_page').merge('filtered' => true))
32
+ self
33
33
  end
34
34
 
35
35
  private
@@ -115,17 +115,6 @@ class Zendesk2::Ticket
115
115
  )
116
116
  end
117
117
 
118
- # @return [Array<Zendesk2::User>] All users CCD on this ticket
119
- def collaborators
120
- collaborator_ids.map { |cid| cistern.users.get(cid) }
121
- end
122
-
123
- # Update list of users to be CCD on this ticket
124
- # @param [Array<Zendesk2::User>] collaborators list of users
125
- def collaborators=(collaborators)
126
- self.collaborator_ids = collaborators.map(&:identity)
127
- end
128
-
129
118
  # @return [Zendesk2::TicketAudits] all audits for this ticket
130
119
  def audits
131
120
  cistern.ticket_audits(ticket_id: identity).all
@@ -140,4 +129,24 @@ class Zendesk2::Ticket
140
129
  def comments
141
130
  cistern.ticket_comments(ticket_id: identity).all
142
131
  end
132
+
133
+ # @return [Array<Zendesk2::User>] All users CCD on this ticket
134
+ def collaborators
135
+ (collaborator_ids || []).map { |id| cistern.users.get(id) }
136
+ end
137
+
138
+ def collaborators=(collaborators)
139
+ collaborators = [collaborators] unless collaborators.is_a?(Array)
140
+
141
+ value = collaborators.map do |collaborator|
142
+ case collaborator
143
+ when Zendesk2::User
144
+ collaborator.identity
145
+ else
146
+ collaborator
147
+ end
148
+ end
149
+
150
+ attributes[:collaborators] = value
151
+ end
143
152
  end
@@ -54,8 +54,8 @@ class Zendesk2::UpdateUser
54
54
  user_identity = {
55
55
  'id' => user_identity_id,
56
56
  'url' => url_for("/users/#{user_id}/identities/#{user_identity_id}.json"),
57
- 'created_at' => Time.now.iso8601,
58
- 'updated_at' => Time.now.iso8601,
57
+ 'created_at' => timestamp,
58
+ 'updated_at' => timestamp,
59
59
  'type' => 'email',
60
60
  'value' => email,
61
61
  'verified' => false,
@@ -28,7 +28,7 @@ class Zendesk2::UpdateView
28
28
  a + [{ 'id' => e, 'name' => Zendesk2::CreateView.view_columns.fetch(c) }]
29
29
  end
30
30
 
31
- body['updated_at'] = Time.now.iso8601
31
+ body['updated_at'] = timestamp
32
32
 
33
33
  if columns.any?
34
34
  body['execution'] = {
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Zendesk2
3
- VERSION = '1.11.0'
3
+ VERSION = '1.12.0'.freeze
4
4
  end
@@ -39,6 +39,47 @@ describe 'Zendesk2' do
39
39
  end
40
40
  end
41
41
 
42
+ it 'should create collaborators' do
43
+ name = 'Josh Lane'
44
+ email = mock_email
45
+ collaborating_user = client.users.create!(email: mock_email, name: mock_uuid)
46
+ collaborating_user_id = client.users.create!(email: mock_email, name: mock_uuid).identity
47
+
48
+ ticket = client.tickets.create!(
49
+ subject: mock_uuid,
50
+ description: mock_uuid,
51
+ collaborators: [{ name: name, email: email }, collaborating_user_id, collaborating_user],
52
+ )
53
+
54
+ collaborators = [collaborating_user]
55
+ collaborators << client.users.get(collaborating_user_id)
56
+ collaborators << client.users.search(email: email).first if Zendesk2.mocking?
57
+
58
+ expect(ticket.collaborators).to include(*collaborators)
59
+ end
60
+
61
+ it 'fails to create collaborators with missing collaborators[email]' do
62
+ ticket = client.tickets.create!(
63
+ subject: mock_uuid,
64
+ description: mock_uuid,
65
+ collaborators: { name: 'josh', email: nil },
66
+ )
67
+
68
+ expect(ticket.collaborators).to be_empty
69
+ end
70
+
71
+ it 'fails to create collaborators with missing collaborators[name]' do
72
+ email = mock_email
73
+
74
+ ticket = client.tickets.create!(
75
+ subject: mock_uuid,
76
+ description: mock_uuid,
77
+ collaborators: { name: nil, email: email },
78
+ )
79
+
80
+ expect(ticket.collaborators.map(&:email)).to contain_exactly(email)
81
+ end
82
+
42
83
  context 'valid requester exists' do
43
84
  it 'sets organization id' do
44
85
  ticket = client.tickets.create!(subject: mock_uuid, description: mock_uuid, requester_id: 11_111_111_111_199)
@@ -23,4 +23,5 @@ Gem::Specification.new do |gem|
23
23
  gem.add_dependency 'faraday', '~> 0.9'
24
24
  gem.add_dependency 'faraday_middleware', '~> 0.9'
25
25
  gem.add_dependency 'jwt', '~> 1.0'
26
+ gem.add_dependency 'json', '> 1.7', '< 3.0'
26
27
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zendesk2
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.11.0
4
+ version: 1.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Lane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-05 00:00:00.000000000 Z
11
+ date: 2016-10-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cistern
@@ -66,6 +66,26 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: json
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.7'
76
+ - - "<"
77
+ - !ruby/object:Gem::Version
78
+ version: '3.0'
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">"
84
+ - !ruby/object:Gem::Version
85
+ version: '1.7'
86
+ - - "<"
87
+ - !ruby/object:Gem::Version
88
+ version: '3.0'
69
89
  description: Zendesk V2 API client
70
90
  email:
71
91
  - me@joshualane.com