zendesk2 0.1.2 → 0.1.3
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 +1 -0
- data/Guardfile +1 -0
- data/README.md +5 -3
- data/TODO.md +3 -1
- data/lib/zendesk2/client/models/categories.rb +5 -6
- data/lib/zendesk2/client/models/category.rb +18 -8
- data/lib/zendesk2/client/models/forums.rb +5 -6
- data/lib/zendesk2/client/models/group.rb +48 -0
- data/lib/zendesk2/client/models/groups.rb +17 -0
- data/lib/zendesk2/client/models/organizations.rb +5 -6
- data/lib/zendesk2/client/models/ticket_audits.rb +0 -1
- data/lib/zendesk2/client/models/tickets.rb +5 -6
- data/lib/zendesk2/client/models/topic_comment.rb +1 -1
- data/lib/zendesk2/client/models/topic_comments.rb +1 -16
- data/lib/zendesk2/client/models/topics.rb +5 -6
- data/lib/zendesk2/client/models/user.rb +1 -0
- data/lib/zendesk2/client/models/user_identities.rb +1 -16
- data/lib/zendesk2/client/models/user_identity.rb +1 -1
- data/lib/zendesk2/client/models/users.rb +0 -1
- data/lib/zendesk2/client/requests/create_group.rb +33 -0
- data/lib/zendesk2/client/requests/destroy_group.rb +28 -0
- data/lib/zendesk2/client/requests/get_assignable_groups.rb +20 -0
- data/lib/zendesk2/client/requests/get_group.rb +34 -0
- data/lib/zendesk2/client/requests/get_groups.rb +18 -0
- data/lib/zendesk2/client/requests/update_group.rb +35 -0
- data/lib/zendesk2/client.rb +15 -3
- data/lib/zendesk2/collection.rb +76 -1
- data/lib/zendesk2/logger.rb +3 -8
- data/lib/zendesk2/version.rb +1 -1
- data/lib/zendesk2.rb +1 -1
- data/spec/groups_spec.rb +14 -0
- data/spec/shared/resource.rb +1 -1
- data/spec/topic_comments_spec.rb +2 -3
- data/spec/user_identities_spec.rb +1 -1
- data/zendesk2.gemspec +1 -1
- metadata +14 -5
- data/lib/zendesk2/paged_collection.rb +0 -41
data/.gitignore
CHANGED
data/Guardfile
CHANGED
data/README.md
CHANGED
@@ -28,11 +28,12 @@ Default credentials will be read in from `~/.zendesk2` file in YAML format.
|
|
28
28
|
:subdomain: zendeskdev
|
29
29
|
:username: zendeskedge@example.com
|
30
30
|
:password: wickedsecurepassword
|
31
|
+
:token: reallylongrandomstringprovidedbyzendesk
|
31
32
|
```
|
32
33
|
|
33
34
|
### Creating the client
|
34
35
|
|
35
|
-
Either the absolute url or the subdomain is required.
|
36
|
+
Either the absolute url or the subdomain is required. Username and either password or token are always required.
|
36
37
|
|
37
38
|
```ruby
|
38
39
|
Zendesk2::Client.new(subdomain: "engineyard", username: "orchestra", password: "gwoo")
|
@@ -42,8 +43,8 @@ Zendesk2::Client.new(subdomain: "engineyard", username: "orchestra", password: "
|
|
42
43
|
or
|
43
44
|
|
44
45
|
```ruby
|
45
|
-
Zendesk2::Client.new(url: "http://support.cloud.engineyard.com", username: "mate",
|
46
|
-
=> #<Zendesk2::Client::Real:0x007fd1bae486b0 @url="http://support.cloud.engineyard.com", @username="mate", @
|
46
|
+
Zendesk2::Client.new(url: "http://support.cloud.engineyard.com", username: "mate", token: "asdfghjkl1qwertyuiop5zxcvbnm3")
|
47
|
+
=> #<Zendesk2::Client::Real:0x007fd1bae486b0 @url="http://support.cloud.engineyard.com", @username="mate", @token="asdfghjkl1qwertyuiop5zxcvbnm3", …>
|
47
48
|
```
|
48
49
|
|
49
50
|
### Resources
|
@@ -55,6 +56,7 @@ Currently support resources
|
|
55
56
|
* Audit Events
|
56
57
|
* Categories
|
57
58
|
* Forums
|
59
|
+
* Groups
|
58
60
|
* Organization
|
59
61
|
* Ticket Audits
|
60
62
|
* Tickets
|
data/TODO.md
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
class Zendesk2::Client::Categories < Zendesk2::Collection
|
2
|
-
include Zendesk2::PagedCollection
|
3
2
|
include Zendesk2::Searchable
|
4
3
|
|
5
4
|
model Zendesk2::Client::Category
|
6
5
|
|
7
|
-
self.collection_method= :get_categories
|
8
|
-
self.collection_root= "categories"
|
9
|
-
self.model_method= :get_category
|
10
|
-
self.model_root= "category"
|
11
|
-
self.search_type= "category"
|
6
|
+
self.collection_method = :get_categories
|
7
|
+
self.collection_root = "categories"
|
8
|
+
self.model_method = :get_category
|
9
|
+
self.model_root = "category"
|
10
|
+
self.search_type = "category"
|
12
11
|
end
|
@@ -1,13 +1,21 @@
|
|
1
1
|
class Zendesk2::Client::Category < Zendesk2::Model
|
2
2
|
PARAMS = %w[id name description position]
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
attribute :
|
9
|
-
|
10
|
-
attribute :
|
4
|
+
# @return [Integer] Automatically assigned during creation
|
5
|
+
identity :id, type: :integer
|
6
|
+
|
7
|
+
# @return [Time] The time the category was created
|
8
|
+
attribute :created_at, type: :time
|
9
|
+
# @return [String] The description of the category
|
10
|
+
attribute :description, type: :string
|
11
|
+
# @return [String] The name of the category
|
12
|
+
attribute :name, type: :string
|
13
|
+
# @return [Integer] The position of this category relative to other categories
|
14
|
+
attribute :position, type: :integer
|
15
|
+
# @return [Time] The time of the last update of the category
|
16
|
+
attribute :updated_at, type: :time
|
17
|
+
# @return [String] The API url of this category
|
18
|
+
attribute :url, type: :string
|
11
19
|
|
12
20
|
def destroy
|
13
21
|
requires :id
|
@@ -22,9 +30,11 @@ class Zendesk2::Client::Category < Zendesk2::Model
|
|
22
30
|
def save!
|
23
31
|
data = if new_record?
|
24
32
|
requires :name
|
33
|
+
|
25
34
|
connection.create_category(params).body["category"]
|
26
35
|
else
|
27
|
-
requires :
|
36
|
+
requires :identity
|
37
|
+
|
28
38
|
connection.update_category(params).body["category"]
|
29
39
|
end
|
30
40
|
merge_attributes(data)
|
@@ -1,12 +1,11 @@
|
|
1
1
|
class Zendesk2::Client::Forums < Zendesk2::Collection
|
2
|
-
include Zendesk2::PagedCollection
|
3
2
|
include Zendesk2::Searchable
|
4
3
|
|
5
4
|
model Zendesk2::Client::Forum
|
6
5
|
|
7
|
-
self.collection_method= :get_forums
|
8
|
-
self.collection_root= "forums"
|
9
|
-
self.model_method= :get_forum
|
10
|
-
self.model_root= "forum"
|
11
|
-
self.search_type= "forum"
|
6
|
+
self.collection_method = :get_forums
|
7
|
+
self.collection_root = "forums"
|
8
|
+
self.model_method = :get_forum
|
9
|
+
self.model_root = "forum"
|
10
|
+
self.search_type = "forum"
|
12
11
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
class Zendesk2::Client::Group < Zendesk2::Model
|
2
|
+
extend Zendesk2::Attributes
|
3
|
+
|
4
|
+
PARAMS = %w[name]
|
5
|
+
|
6
|
+
# @return [Integer] Automatically assigned when creating groups
|
7
|
+
identity :id, type: :integer
|
8
|
+
|
9
|
+
# @return [Time] The time the group was created
|
10
|
+
attribute :created_at, type: :time
|
11
|
+
# @return [Boolean] Deleted groups get marked as such
|
12
|
+
attribute :deleted, type: :boolean
|
13
|
+
# @return [String] The name of the group
|
14
|
+
attribute :name, type: :string
|
15
|
+
# @return [Time] The time of the last update of the group
|
16
|
+
attribute :updated_at, type: :time
|
17
|
+
# @return [String] The API url of this group
|
18
|
+
attribute :url, type: :string
|
19
|
+
|
20
|
+
def save!
|
21
|
+
data = if new_record?
|
22
|
+
requires :name
|
23
|
+
connection.create_group(params).body["group"]
|
24
|
+
else
|
25
|
+
requires :identity
|
26
|
+
connection.update_group(params.merge("id" => self.identity)).body["group"]
|
27
|
+
end
|
28
|
+
|
29
|
+
merge_attributes(data)
|
30
|
+
end
|
31
|
+
|
32
|
+
def destroy
|
33
|
+
requires :identity
|
34
|
+
|
35
|
+
connection.destroy_group("id" => self.identity)
|
36
|
+
self.deleted = true
|
37
|
+
end
|
38
|
+
|
39
|
+
def destroyed?
|
40
|
+
self.deleted
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def params
|
46
|
+
Cistern::Hash.slice(Zendesk2.stringify_keys(attributes), *PARAMS)
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class Zendesk2::Client::Groups < Zendesk2::Collection
|
2
|
+
include Zendesk2::Searchable
|
3
|
+
|
4
|
+
model Zendesk2::Client::Group
|
5
|
+
|
6
|
+
self.collection_method = :get_groups
|
7
|
+
self.collection_root = "groups"
|
8
|
+
self.model_method = :get_group
|
9
|
+
self.model_root = "group"
|
10
|
+
self.search_type = "group"
|
11
|
+
|
12
|
+
def assignable
|
13
|
+
data = self.connection.get_assignable_groups.body
|
14
|
+
collection = self.connection.groups.load(data["groups"])
|
15
|
+
collection.merge_attributes(Cistern::Hash.slice(data, "next_page", "previous_page", "count"))
|
16
|
+
end
|
17
|
+
end
|
@@ -1,12 +1,11 @@
|
|
1
1
|
class Zendesk2::Client::Organizations < Zendesk2::Collection
|
2
|
-
include Zendesk2::PagedCollection
|
3
2
|
include Zendesk2::Searchable
|
4
3
|
|
5
4
|
model Zendesk2::Client::Organization
|
6
5
|
|
7
|
-
self.collection_method= :get_organizations
|
8
|
-
self.collection_root= "organizations"
|
9
|
-
self.model_method= :get_organization
|
10
|
-
self.model_root= "organization"
|
11
|
-
self.search_type= "organization"
|
6
|
+
self.collection_method = :get_organizations
|
7
|
+
self.collection_root = "organizations"
|
8
|
+
self.model_method = :get_organization
|
9
|
+
self.model_root = "organization"
|
10
|
+
self.search_type = "organization"
|
12
11
|
end
|
@@ -1,12 +1,11 @@
|
|
1
1
|
class Zendesk2::Client::Tickets < Zendesk2::Collection
|
2
|
-
include Zendesk2::PagedCollection
|
3
2
|
include Zendesk2::Searchable
|
4
3
|
|
5
4
|
model Zendesk2::Client::Ticket
|
6
5
|
|
7
|
-
self.collection_method= :get_tickets
|
8
|
-
self.collection_root= "tickets"
|
9
|
-
self.model_method= :get_ticket
|
10
|
-
self.model_root= "ticket"
|
11
|
-
self.search_type= "ticket"
|
6
|
+
self.collection_method = :get_tickets
|
7
|
+
self.collection_root = "tickets"
|
8
|
+
self.model_method = :get_ticket
|
9
|
+
self.model_root = "ticket"
|
10
|
+
self.search_type = "ticket"
|
12
11
|
end
|
@@ -46,7 +46,7 @@ class Zendesk2::Client::TopicComment < Zendesk2::Model
|
|
46
46
|
def reload
|
47
47
|
requires :identity
|
48
48
|
|
49
|
-
if data =
|
49
|
+
if data = self.connection.topic_comments("topic_id" => topic_id).get(identity)
|
50
50
|
new_attributes = data.attributes
|
51
51
|
merge_attributes(new_attributes)
|
52
52
|
self
|
@@ -1,5 +1,4 @@
|
|
1
1
|
class Zendesk2::Client::TopicComments < Zendesk2::Collection
|
2
|
-
include Zendesk2::PagedCollection
|
3
2
|
include Zendesk2::Searchable
|
4
3
|
|
5
4
|
model Zendesk2::Client::TopicComment
|
@@ -12,19 +11,5 @@ class Zendesk2::Client::TopicComments < Zendesk2::Collection
|
|
12
11
|
self.model_root = "topic_comment"
|
13
12
|
self.search_type = "topic_comment"
|
14
13
|
|
15
|
-
|
16
|
-
body = connection.send(collection_method, params.merge("topic_id" => self.topic_id)).body
|
17
|
-
|
18
|
-
collection = self.clone.load(body[collection_root])
|
19
|
-
collection.merge_attributes(Cistern::Hash.slice(body, "count", "next_page", "previous_page"))
|
20
|
-
collection
|
21
|
-
end
|
22
|
-
|
23
|
-
def get(topic_id, topic_comment_id)
|
24
|
-
if data = self.connection.send(model_method, {"topic_id" => topic_id, "id" => topic_comment_id}).body[self.model_root]
|
25
|
-
new(data)
|
26
|
-
end
|
27
|
-
rescue Zendesk2::Error
|
28
|
-
nil
|
29
|
-
end
|
14
|
+
scopes << :topic_id
|
30
15
|
end
|
@@ -1,12 +1,11 @@
|
|
1
1
|
class Zendesk2::Client::Topics < Zendesk2::Collection
|
2
|
-
include Zendesk2::PagedCollection
|
3
2
|
include Zendesk2::Searchable
|
4
3
|
|
5
4
|
model Zendesk2::Client::Topic
|
6
5
|
|
7
|
-
self.collection_method= :get_topics
|
8
|
-
self.collection_root= "topics"
|
9
|
-
self.model_method= :get_topic
|
10
|
-
self.model_root= "topic"
|
11
|
-
self.search_type= "topic"
|
6
|
+
self.collection_method = :get_topics
|
7
|
+
self.collection_root = "topics"
|
8
|
+
self.model_method = :get_topic
|
9
|
+
self.model_root = "topic"
|
10
|
+
self.search_type = "topic"
|
12
11
|
end
|
@@ -95,6 +95,7 @@ class Zendesk2::Client::User < Zendesk2::Model
|
|
95
95
|
end
|
96
96
|
|
97
97
|
# @param [Time] timestamp time sent with intial handshake
|
98
|
+
# @option options [String] :return_to (nil) url to return to after handshake
|
98
99
|
# @return [String] remote authentication login url
|
99
100
|
# @see http://www.zendesk.com/support/api/remote-authentication
|
100
101
|
def login_url(timestamp, options={})
|
@@ -1,5 +1,4 @@
|
|
1
1
|
class Zendesk2::Client::UserIdentities < Zendesk2::Collection
|
2
|
-
include Zendesk2::PagedCollection
|
3
2
|
include Zendesk2::Searchable
|
4
3
|
|
5
4
|
model Zendesk2::Client::UserIdentity
|
@@ -12,19 +11,5 @@ class Zendesk2::Client::UserIdentities < Zendesk2::Collection
|
|
12
11
|
self.model_root = "identity"
|
13
12
|
self.search_type = "identity"
|
14
13
|
|
15
|
-
|
16
|
-
body = connection.send(collection_method, params.merge("user_id" => self.user_id)).body
|
17
|
-
|
18
|
-
collection = self.clone.load(body[collection_root])
|
19
|
-
collection.merge_attributes(Cistern::Hash.slice(body, "count", "next_page", "previous_page"))
|
20
|
-
collection
|
21
|
-
end
|
22
|
-
|
23
|
-
def get(user_id, user_identity_id)
|
24
|
-
if data = self.connection.send(model_method, {"user_id" => user_id, "id" => user_identity_id}).body[self.model_root]
|
25
|
-
new(data)
|
26
|
-
end
|
27
|
-
rescue Zendesk2::Error
|
28
|
-
nil
|
29
|
-
end
|
14
|
+
scopes << :user_id
|
30
15
|
end
|
@@ -46,7 +46,7 @@ class Zendesk2::Client::UserIdentity < Zendesk2::Model
|
|
46
46
|
def reload
|
47
47
|
requires :identity
|
48
48
|
|
49
|
-
if data =
|
49
|
+
if data = self.connection.user_identities("user_id" => user_id).get(identity)
|
50
50
|
new_attributes = data.attributes
|
51
51
|
merge_attributes(new_attributes)
|
52
52
|
self
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class Zendesk2::Client
|
2
|
+
class Real
|
3
|
+
def create_group(params={})
|
4
|
+
request(
|
5
|
+
:body => {"group" => params},
|
6
|
+
:method => :post,
|
7
|
+
:path => "/groups.json",
|
8
|
+
)
|
9
|
+
end
|
10
|
+
end # Real
|
11
|
+
|
12
|
+
class Mock
|
13
|
+
def create_group(params={})
|
14
|
+
identity = self.class.new_id
|
15
|
+
|
16
|
+
record = {
|
17
|
+
"id" => identity,
|
18
|
+
"url" => url_for("/groups/#{identity}.json"),
|
19
|
+
"created_at" => Time.now.iso8601,
|
20
|
+
"updated_at" => Time.now.iso8601,
|
21
|
+
"deleted" => false,
|
22
|
+
}.merge(params)
|
23
|
+
|
24
|
+
self.data[:groups][identity] = record
|
25
|
+
|
26
|
+
response(
|
27
|
+
:method => :post,
|
28
|
+
:body => {"group" => record},
|
29
|
+
:path => "/groups.json"
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end # Mock
|
33
|
+
end # Zendesk2::Client
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class Zendesk2::Client
|
2
|
+
class Real
|
3
|
+
def destroy_group(params={})
|
4
|
+
id = params["id"]
|
5
|
+
|
6
|
+
request(
|
7
|
+
:method => :delete,
|
8
|
+
:path => "/groups/#{id}.json"
|
9
|
+
)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Mock
|
14
|
+
def destroy_group(params={})
|
15
|
+
id = params["id"]
|
16
|
+
body = self.data[:groups][id]
|
17
|
+
body["deleted"] = true
|
18
|
+
|
19
|
+
response(
|
20
|
+
:method => :delete,
|
21
|
+
:path => "/groups/#{id}.json",
|
22
|
+
:body => {
|
23
|
+
"group" => body,
|
24
|
+
},
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class Zendesk2::Client
|
2
|
+
class Real
|
3
|
+
def get_assignable_groups(params={})
|
4
|
+
page_params = Zendesk2.paging_parameters(params)
|
5
|
+
|
6
|
+
request(
|
7
|
+
:params => page_params,
|
8
|
+
:method => :get,
|
9
|
+
:path => "/groups/assignable.json",
|
10
|
+
)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
class Mock
|
14
|
+
def get_assignable_groups(params={})
|
15
|
+
filter = lambda { |group| group.select{|g| !g['deleted'] } }
|
16
|
+
|
17
|
+
page(params, :groups, "/groups/assignable.json", "groups", filter: filter)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class Zendesk2::Client
|
2
|
+
class Real
|
3
|
+
def get_group(params={})
|
4
|
+
id = params["id"]
|
5
|
+
|
6
|
+
request(
|
7
|
+
:method => :get,
|
8
|
+
:path => "/groups/#{id}.json"
|
9
|
+
)
|
10
|
+
end
|
11
|
+
end # Real
|
12
|
+
|
13
|
+
class Mock
|
14
|
+
def get_group(params={})
|
15
|
+
id = params["id"]
|
16
|
+
path = "/groups/#{id}.json"
|
17
|
+
|
18
|
+
if body = self.data[:groups][id]
|
19
|
+
response(
|
20
|
+
:path => path,
|
21
|
+
:body => {
|
22
|
+
"group" => body
|
23
|
+
},
|
24
|
+
)
|
25
|
+
else
|
26
|
+
response(
|
27
|
+
:path => path,
|
28
|
+
:status => 404,
|
29
|
+
:body => {"error" => "RecordNotFound", "description" => "Not found"},
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end # Mock
|
34
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class Zendesk2::Client
|
2
|
+
class Real
|
3
|
+
def get_groups(params={})
|
4
|
+
page_params = Zendesk2.paging_parameters(params)
|
5
|
+
|
6
|
+
request(
|
7
|
+
:params => page_params,
|
8
|
+
:method => :get,
|
9
|
+
:path => "/groups.json",
|
10
|
+
)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
class Mock
|
14
|
+
def get_groups(params={})
|
15
|
+
page(params, :groups, "/groups.json", "groups")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class Zendesk2::Client
|
2
|
+
class Real
|
3
|
+
def update_group(params={})
|
4
|
+
id = params.delete("id")
|
5
|
+
path = "/groups/#{id}.json"
|
6
|
+
|
7
|
+
request(
|
8
|
+
:method => :put,
|
9
|
+
:path => path,
|
10
|
+
:body => {
|
11
|
+
"group" => params
|
12
|
+
},
|
13
|
+
)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
class Mock
|
17
|
+
def update_group(params={})
|
18
|
+
id = params.delete("id")
|
19
|
+
path = "/groups/#{id}.json"
|
20
|
+
|
21
|
+
if group = self.data[:groups][id]
|
22
|
+
group.merge!(params)
|
23
|
+
response(
|
24
|
+
:method => :put,
|
25
|
+
:path => "/groups/#{id}.json",
|
26
|
+
:body => {
|
27
|
+
"group" => group
|
28
|
+
},
|
29
|
+
)
|
30
|
+
else response(status: 404)
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/zendesk2/client.rb
CHANGED
@@ -6,6 +6,7 @@ class Zendesk2::Client < Cistern::Service
|
|
6
6
|
|
7
7
|
collection :categories
|
8
8
|
collection :forums
|
9
|
+
collection :groups
|
9
10
|
collection :organizations
|
10
11
|
collection :ticket_audits
|
11
12
|
collection :tickets
|
@@ -16,6 +17,7 @@ class Zendesk2::Client < Cistern::Service
|
|
16
17
|
model :audit_event
|
17
18
|
model :category
|
18
19
|
model :forum
|
20
|
+
model :group
|
19
21
|
model :organization
|
20
22
|
model :ticket
|
21
23
|
model :ticket_audit
|
@@ -24,8 +26,10 @@ class Zendesk2::Client < Cistern::Service
|
|
24
26
|
model :user
|
25
27
|
model :user_identity
|
26
28
|
|
29
|
+
request :get_assignable_groups
|
27
30
|
request :create_category
|
28
31
|
request :create_forum
|
32
|
+
request :create_group
|
29
33
|
request :create_organization
|
30
34
|
request :create_ticket
|
31
35
|
request :create_topic
|
@@ -34,6 +38,7 @@ class Zendesk2::Client < Cistern::Service
|
|
34
38
|
request :create_user_identity
|
35
39
|
request :destroy_category
|
36
40
|
request :destroy_forum
|
41
|
+
request :destroy_group
|
37
42
|
request :destroy_organization
|
38
43
|
request :destroy_ticket
|
39
44
|
request :destroy_topic
|
@@ -47,6 +52,8 @@ class Zendesk2::Client < Cistern::Service
|
|
47
52
|
request :get_current_user
|
48
53
|
request :get_forum
|
49
54
|
request :get_forums
|
55
|
+
request :get_group
|
56
|
+
request :get_groups
|
50
57
|
request :get_organization
|
51
58
|
request :get_organization_tickets
|
52
59
|
request :get_organization_users
|
@@ -69,6 +76,7 @@ class Zendesk2::Client < Cistern::Service
|
|
69
76
|
request :mark_user_identity_primary
|
70
77
|
request :update_category
|
71
78
|
request :update_forum
|
79
|
+
request :update_group
|
72
80
|
request :update_organization
|
73
81
|
request :update_ticket
|
74
82
|
request :update_topic
|
@@ -100,14 +108,17 @@ class Zendesk2::Client < Cistern::Service
|
|
100
108
|
adapter = options[:adapter] || :net_http
|
101
109
|
connection_options = options[:connection_options] || {ssl: {verify: false}}
|
102
110
|
@username = options[:username] || Zendesk2.defaults[:username]
|
111
|
+
token = options[:token] || Zendesk2.defaults[:token]
|
103
112
|
password = options[:password] || Zendesk2.defaults[:password]
|
104
|
-
@token
|
113
|
+
@username += "/token" if token
|
114
|
+
@auth_token = token || password
|
105
115
|
|
106
|
-
raise "Missing required options:
|
116
|
+
raise "Missing required options: :username" unless @username
|
117
|
+
raise "Missing required options: :password or :token" unless password || token
|
107
118
|
|
108
119
|
@connection = Faraday.new({url: @url}.merge(connection_options)) do |builder|
|
109
120
|
# response
|
110
|
-
builder.use Faraday::Request::BasicAuthentication, @username,
|
121
|
+
builder.use Faraday::Request::BasicAuthentication, @username, @auth_token
|
111
122
|
builder.use Faraday::Response::RaiseError
|
112
123
|
builder.response :json
|
113
124
|
|
@@ -146,6 +157,7 @@ class Zendesk2::Client < Cistern::Service
|
|
146
157
|
@data ||= {
|
147
158
|
:categories => {},
|
148
159
|
:forums => {},
|
160
|
+
:groups => {},
|
149
161
|
:identities => {},
|
150
162
|
:organizations => {},
|
151
163
|
:ticket_audits => {},
|
data/lib/zendesk2/collection.rb
CHANGED
@@ -1,5 +1,25 @@
|
|
1
|
-
# @abstract
|
1
|
+
# @abstract Subclass and set #{collection_method}, #{collection_root}, #{model_method}, #{model_root} and #{model}
|
2
|
+
# adds {#create!} method to {Cistern::Collection}.
|
2
3
|
class Zendesk2::Collection < Cistern::Collection
|
4
|
+
def self.inherited(klass)
|
5
|
+
klass.send(:attribute, :count)
|
6
|
+
klass.send(:attribute, :next_page_link, {:aliases => "next_page"})
|
7
|
+
klass.send(:attribute, :previous_page_link, {:aliases => "previous_page"})
|
8
|
+
klass.send(:extend, ClassMethods)
|
9
|
+
end
|
10
|
+
|
11
|
+
def collection_method; self.class.collection_method; end
|
12
|
+
def collection_root; self.class.collection_root; end
|
13
|
+
def model_method; self.class.model_method; end
|
14
|
+
def model_root; self.class.model_root; end
|
15
|
+
|
16
|
+
def next_page
|
17
|
+
all("url" => next_page_link) if next_page_link
|
18
|
+
end
|
19
|
+
|
20
|
+
def previous_page
|
21
|
+
all("url" => previous_page_link) if previous_page_link
|
22
|
+
end
|
3
23
|
|
4
24
|
# Attempt creation of resource and explode if unsuccessful
|
5
25
|
# @raise [Zendesk2::Error] if creation was unsuccessful
|
@@ -16,4 +36,59 @@ class Zendesk2::Collection < Cistern::Collection
|
|
16
36
|
model = self.new(attributes.merge(Zendesk2.stringify_keys(self.attributes)))
|
17
37
|
model.save
|
18
38
|
end
|
39
|
+
|
40
|
+
# Fetch a collection of resources
|
41
|
+
def all(params={})
|
42
|
+
scoped_attributes = self.class.scopes.inject({}){|r,k| r.merge(k.to_s => send(k))}
|
43
|
+
scoped_attributes.merge!(params)
|
44
|
+
body = connection.send(collection_method, scoped_attributes).body
|
45
|
+
|
46
|
+
collection = self.clone.load(body[collection_root])
|
47
|
+
collection.merge_attributes(Cistern::Hash.slice(body, "count", "next_page", "previous_page"))
|
48
|
+
collection
|
49
|
+
end
|
50
|
+
|
51
|
+
# Fetch a single of resource
|
52
|
+
# @overload get!(identity)
|
53
|
+
# fetch a un-namespaced specific record or a namespaced record under the current {#scopes}
|
54
|
+
# @param [Integer] identity identity of the record
|
55
|
+
# @overload get!(scope)
|
56
|
+
# directly fetch a namespaced record
|
57
|
+
# @param [Hash] scope parameters to fetch record
|
58
|
+
# @example Fetch a record without contextual scoping
|
59
|
+
# self.identities.all("user_id" => 2, "id" => 4) # context defined directly
|
60
|
+
# @example Fetch a record with contextual scoping
|
61
|
+
# self.identities("user_id" => 2).get(4) # context defined in collection
|
62
|
+
# user.identities.get(4) # context defined by encapsulating model
|
63
|
+
# @raise [Zendesk2::Error] if the record cannot be found or other request error
|
64
|
+
# @return [Zendesk2::Model] fetched resource corresponding to value of {Zendesk2::Collection#model}
|
65
|
+
def get!(identity_or_hash)
|
66
|
+
scoped_attributes = self.class.scopes.inject({}){|r,k| r.merge(k.to_s => send(k))}
|
67
|
+
if identity_or_hash.is_a?(Hash)
|
68
|
+
scoped_attributes.merge!(identity_or_hash)
|
69
|
+
else scoped_attributes.merge!("id" => identity_or_hash)
|
70
|
+
end
|
71
|
+
|
72
|
+
if data = self.connection.send(model_method, scoped_attributes).body[self.model_root]
|
73
|
+
new(data)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# Quiet version of {#get!}
|
78
|
+
# @see #get!
|
79
|
+
# @return [Zendesk2::Model] Fetched model when successful
|
80
|
+
# @return [NilClass] return nothing if record cannot be found
|
81
|
+
def get(*args)
|
82
|
+
get!(*args)
|
83
|
+
rescue Zendesk2::Error
|
84
|
+
nil
|
85
|
+
end
|
86
|
+
|
87
|
+
module ClassMethods
|
88
|
+
attr_accessor :collection_method, :collection_root, :model_method, :model_root
|
89
|
+
|
90
|
+
def scopes
|
91
|
+
@scopes ||= []
|
92
|
+
end
|
93
|
+
end
|
19
94
|
end
|
data/lib/zendesk2/logger.rb
CHANGED
@@ -1,27 +1,22 @@
|
|
1
|
-
require 'forwardable'
|
2
|
-
|
3
1
|
class Zendesk2::Logger < Faraday::Response::Middleware
|
4
2
|
extend Forwardable
|
5
3
|
|
6
4
|
def initialize(app, logger = nil)
|
7
5
|
super(app)
|
8
|
-
@logger = logger ||
|
9
|
-
require 'logger'
|
10
|
-
::Logger.new(STDOUT)
|
11
|
-
end
|
6
|
+
@logger = logger || ::Logger.new(STDOUT)
|
12
7
|
end
|
13
8
|
|
14
9
|
def_delegators :@logger, :debug, :info, :warn, :error, :fatal
|
15
10
|
|
16
11
|
def call(env)
|
17
|
-
info
|
12
|
+
info("#{env[:method]} => #{env[:url].to_s}")
|
18
13
|
debug('request') { dump_headers env[:request_headers] }
|
19
14
|
debug('request.body') { env[:body] }
|
20
15
|
super
|
21
16
|
end
|
22
17
|
|
23
18
|
def on_complete(env)
|
24
|
-
info(
|
19
|
+
info("#{env[:status]} <= #{env[:url].to_s}")
|
25
20
|
debug('response') { dump_headers env[:response_headers] }
|
26
21
|
debug('response.body') { env[:body] }
|
27
22
|
end
|
data/lib/zendesk2/version.rb
CHANGED
data/lib/zendesk2.rb
CHANGED
@@ -9,12 +9,12 @@ require 'faraday_middleware'
|
|
9
9
|
# stdlib
|
10
10
|
require 'time'
|
11
11
|
require 'logger'
|
12
|
+
require 'forwardable'
|
12
13
|
|
13
14
|
module Zendesk2
|
14
15
|
autoload :Attributes, 'zendesk2/attributes'
|
15
16
|
autoload :Error, 'zendesk2/error'
|
16
17
|
autoload :Client, 'zendesk2/client'
|
17
|
-
autoload :PagedCollection, 'zendesk2/paged_collection'
|
18
18
|
autoload :Searchable, 'zendesk2/searchable'
|
19
19
|
autoload :Logger, 'zendesk2/logger'
|
20
20
|
autoload :Model, 'zendesk2/model'
|
data/spec/groups_spec.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "groups" do
|
4
|
+
let(:client) { create_client }
|
5
|
+
it_should_behave_like "a resource", :groups,
|
6
|
+
lambda { {name: Zendesk2.uuid} },
|
7
|
+
lambda { {name: Zendesk2.uuid} }
|
8
|
+
|
9
|
+
it "should list assignable groups" do
|
10
|
+
client.groups.create(name: Zendesk2.uuid) # assignable by default
|
11
|
+
|
12
|
+
client.groups.assignable.should be_all{|g| !g.deleted}
|
13
|
+
end
|
14
|
+
end
|
data/spec/shared/resource.rb
CHANGED
@@ -12,7 +12,7 @@ shared_examples "a resource" do |_collection, _params, _update_params, _options|
|
|
12
12
|
|
13
13
|
it "by fetching a specific record" do
|
14
14
|
record = collection.create(params)
|
15
|
-
collection.get(
|
15
|
+
collection.get(fetch_params.call(record)).should == record
|
16
16
|
end
|
17
17
|
|
18
18
|
context "that is paged" do
|
data/spec/topic_comments_spec.rb
CHANGED
@@ -5,12 +5,11 @@ describe "topic_comments" do
|
|
5
5
|
let(:user) { client.users.create(email: "zendesk2+#{Zendesk2.uuid}@example.org", name: Zendesk2.uuid, verified: true) }
|
6
6
|
let(:forum) { client.forums.create(name: Zendesk2.uuid) }
|
7
7
|
let(:topic) { client.topics.create(title: Zendesk2.uuid, body: Zendesk2.uuid, forum: forum) }
|
8
|
-
it_should_behave_like "a resource",
|
9
|
-
:topic_comments,
|
8
|
+
it_should_behave_like "a resource", :topic_comments,
|
10
9
|
lambda { {body: Zendesk2.uuid, topic_id: topic.id, user_id: user.id} },
|
11
10
|
lambda { {body: Zendesk2.uuid} },
|
12
11
|
{
|
13
|
-
:fetch_params => lambda {|tc|
|
12
|
+
:fetch_params => lambda {|tc| {"topic_id" => tc.topic_id, "id" => tc.id}},
|
14
13
|
:collection => lambda { client.topic_comments(topic_id: topic.id) },
|
15
14
|
}
|
16
15
|
end
|
@@ -8,7 +8,7 @@ describe "user_identities" do
|
|
8
8
|
lambda { {value: "ey+#{Zendesk2.uuid}@example.org", type: "email", user_id: user.id} },
|
9
9
|
lambda { {verified: true} },
|
10
10
|
{
|
11
|
-
:fetch_params => lambda {|uc|
|
11
|
+
:fetch_params => lambda {|uc| {"user_id" => uc.user_id, "id" => uc.id}},
|
12
12
|
:collection => lambda { client.user_identities(user_id: user.id) },
|
13
13
|
}
|
14
14
|
end
|
data/zendesk2.gemspec
CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = Zendesk2::VERSION
|
17
17
|
|
18
|
-
gem.add_dependency "cistern", "~> 0.
|
18
|
+
gem.add_dependency "cistern", "~> 0.2.0"
|
19
19
|
gem.add_dependency "faraday"
|
20
20
|
gem.add_dependency "faraday_middleware"
|
21
21
|
gem.add_dependency "addressable"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zendesk2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: cistern
|
@@ -18,14 +18,14 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0.
|
21
|
+
version: 0.2.0
|
22
22
|
none: false
|
23
23
|
type: :runtime
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
26
|
- - ~>
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version: 0.
|
28
|
+
version: 0.2.0
|
29
29
|
none: false
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: faraday
|
@@ -98,6 +98,8 @@ files:
|
|
98
98
|
- lib/zendesk2/client/models/category.rb
|
99
99
|
- lib/zendesk2/client/models/forum.rb
|
100
100
|
- lib/zendesk2/client/models/forums.rb
|
101
|
+
- lib/zendesk2/client/models/group.rb
|
102
|
+
- lib/zendesk2/client/models/groups.rb
|
101
103
|
- lib/zendesk2/client/models/organization.rb
|
102
104
|
- lib/zendesk2/client/models/organizations.rb
|
103
105
|
- lib/zendesk2/client/models/ticket.rb
|
@@ -114,6 +116,7 @@ files:
|
|
114
116
|
- lib/zendesk2/client/models/users.rb
|
115
117
|
- lib/zendesk2/client/requests/create_category.rb
|
116
118
|
- lib/zendesk2/client/requests/create_forum.rb
|
119
|
+
- lib/zendesk2/client/requests/create_group.rb
|
117
120
|
- lib/zendesk2/client/requests/create_organization.rb
|
118
121
|
- lib/zendesk2/client/requests/create_ticket.rb
|
119
122
|
- lib/zendesk2/client/requests/create_topic.rb
|
@@ -122,12 +125,14 @@ files:
|
|
122
125
|
- lib/zendesk2/client/requests/create_user_identity.rb
|
123
126
|
- lib/zendesk2/client/requests/destroy_category.rb
|
124
127
|
- lib/zendesk2/client/requests/destroy_forum.rb
|
128
|
+
- lib/zendesk2/client/requests/destroy_group.rb
|
125
129
|
- lib/zendesk2/client/requests/destroy_organization.rb
|
126
130
|
- lib/zendesk2/client/requests/destroy_ticket.rb
|
127
131
|
- lib/zendesk2/client/requests/destroy_topic.rb
|
128
132
|
- lib/zendesk2/client/requests/destroy_topic_comment.rb
|
129
133
|
- lib/zendesk2/client/requests/destroy_user.rb
|
130
134
|
- lib/zendesk2/client/requests/destroy_user_identity.rb
|
135
|
+
- lib/zendesk2/client/requests/get_assignable_groups.rb
|
131
136
|
- lib/zendesk2/client/requests/get_audits.rb
|
132
137
|
- lib/zendesk2/client/requests/get_categories.rb
|
133
138
|
- lib/zendesk2/client/requests/get_category.rb
|
@@ -135,6 +140,8 @@ files:
|
|
135
140
|
- lib/zendesk2/client/requests/get_current_user.rb
|
136
141
|
- lib/zendesk2/client/requests/get_forum.rb
|
137
142
|
- lib/zendesk2/client/requests/get_forums.rb
|
143
|
+
- lib/zendesk2/client/requests/get_group.rb
|
144
|
+
- lib/zendesk2/client/requests/get_groups.rb
|
138
145
|
- lib/zendesk2/client/requests/get_organization.rb
|
139
146
|
- lib/zendesk2/client/requests/get_organization_tickets.rb
|
140
147
|
- lib/zendesk2/client/requests/get_organization_users.rb
|
@@ -157,6 +164,7 @@ files:
|
|
157
164
|
- lib/zendesk2/client/requests/search_user.rb
|
158
165
|
- lib/zendesk2/client/requests/update_category.rb
|
159
166
|
- lib/zendesk2/client/requests/update_forum.rb
|
167
|
+
- lib/zendesk2/client/requests/update_group.rb
|
160
168
|
- lib/zendesk2/client/requests/update_organization.rb
|
161
169
|
- lib/zendesk2/client/requests/update_ticket.rb
|
162
170
|
- lib/zendesk2/client/requests/update_topic.rb
|
@@ -167,11 +175,11 @@ files:
|
|
167
175
|
- lib/zendesk2/error.rb
|
168
176
|
- lib/zendesk2/logger.rb
|
169
177
|
- lib/zendesk2/model.rb
|
170
|
-
- lib/zendesk2/paged_collection.rb
|
171
178
|
- lib/zendesk2/searchable.rb
|
172
179
|
- lib/zendesk2/version.rb
|
173
180
|
- spec/categories_spec.rb
|
174
181
|
- spec/forums_spec.rb
|
182
|
+
- spec/groups_spec.rb
|
175
183
|
- spec/organizations_spec.rb
|
176
184
|
- spec/shared/resource.rb
|
177
185
|
- spec/spec_helper.rb
|
@@ -209,6 +217,7 @@ summary: Zendesk V2 API client
|
|
209
217
|
test_files:
|
210
218
|
- spec/categories_spec.rb
|
211
219
|
- spec/forums_spec.rb
|
220
|
+
- spec/groups_spec.rb
|
212
221
|
- spec/organizations_spec.rb
|
213
222
|
- spec/shared/resource.rb
|
214
223
|
- spec/spec_helper.rb
|
@@ -1,41 +0,0 @@
|
|
1
|
-
module Zendesk2::PagedCollection
|
2
|
-
def self.included(klass)
|
3
|
-
klass.send(:attribute, :count)
|
4
|
-
klass.send(:attribute, :next_page_link, {:aliases => "next_page"})
|
5
|
-
klass.send(:attribute, :previous_page_link, {:aliases => "previous_page"})
|
6
|
-
klass.send(:extend, Zendesk2::PagedCollection::Attributes)
|
7
|
-
end
|
8
|
-
|
9
|
-
def collection_method; self.class.collection_method; end
|
10
|
-
def collection_root; self.class.collection_root; end
|
11
|
-
def model_method; self.class.model_method; end
|
12
|
-
def model_root; self.class.model_root; end
|
13
|
-
|
14
|
-
def all(params={})
|
15
|
-
body = connection.send(collection_method, params).body
|
16
|
-
|
17
|
-
collection = self.clone.load(body[collection_root])
|
18
|
-
collection.merge_attributes(Cistern::Hash.slice(body, "count", "next_page", "previous_page"))
|
19
|
-
collection
|
20
|
-
end
|
21
|
-
|
22
|
-
def get(id)
|
23
|
-
if data = self.connection.send(model_method, {"id" => id}).body[self.model_root]
|
24
|
-
new(data)
|
25
|
-
end
|
26
|
-
rescue Zendesk2::Error
|
27
|
-
nil
|
28
|
-
end
|
29
|
-
|
30
|
-
def next_page
|
31
|
-
all("url" => next_page_link) if next_page_link
|
32
|
-
end
|
33
|
-
|
34
|
-
def previous_page
|
35
|
-
all("url" => previous_page_link) if previous_page_link
|
36
|
-
end
|
37
|
-
|
38
|
-
module Attributes
|
39
|
-
attr_accessor :collection_method, :collection_root, :model_method, :model_root
|
40
|
-
end
|
41
|
-
end
|