zensana 1.1.2 → 1.2.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.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1832214144fb9cf8e0af229da4ad08ca2f3977e8
|
4
|
+
data.tar.gz: 7887bc8414164f1945aefb1c1a3c7b877330c8ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 979c0c4796428272d3fa60676b28c344fde588686b1f98e7cd2a690e0d0de45ba3f1f5bd82ff6b282b02d5b87c760d8e12c8815f49b9f099c1dc1976e962b7cf
|
7
|
+
data.tar.gz: df196da8ba97fe840b8903e184f66b47342d329f9449a37f1427af4169995faa2c6d1dafc62c36078138e6ac05d26e08ecaf66c29b0dfcd7fb574820324280f5
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'pry'
|
2
|
+
|
1
3
|
module Zensana
|
2
4
|
class Command::Project < Zensana::Command
|
3
5
|
|
@@ -31,7 +33,7 @@ module Zensana
|
|
31
33
|
option :completed, type: 'boolean', aliases: '-c', default: false, desc: 'include tasks that are completed'
|
32
34
|
option :global_tags, type: 'array', aliases: '-t', default: ['zensana'], desc: 'array of tag(s) to be applied to every ticket imported'
|
33
35
|
option :stories, type: 'boolean', aliases: '-s', default: true, desc: 'import stories as comments'
|
34
|
-
option :default_user, type: 'string', aliases: '-u', default: nil, desc: 'set a default user to assign to
|
36
|
+
option :default_user, type: 'string', aliases: '-u', default: nil, desc: 'set a default user to assign to invalid asana user items'
|
35
37
|
option :verified, type: 'boolean', aliases: '-v', default: true, desc: '`false` will send email to zendesk users created'
|
36
38
|
def convert(project)
|
37
39
|
@asana_project = Zensana::Asana::Project.new(project)
|
@@ -51,6 +53,16 @@ using options #{options}
|
|
51
53
|
exit
|
52
54
|
end
|
53
55
|
|
56
|
+
if options[:default_user]
|
57
|
+
default_user = Zensana::Zendesk::User.new
|
58
|
+
if default_user.find(options[:default_user])
|
59
|
+
options[:default_user] = default_user
|
60
|
+
else
|
61
|
+
say "\nDefault user '#{options[:default_user]}' does not exist in ZenDesk!\n", :red
|
62
|
+
exit(1)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
54
66
|
# LIFO tags for recursive tagging
|
55
67
|
#
|
56
68
|
# `project_tag_list` holds the project tags
|
@@ -110,6 +122,9 @@ using options #{options}
|
|
110
122
|
if task.attributes['completed'] && !options[:completed]
|
111
123
|
say "\nSkipping completed task: #{task.name}! ", :yellow
|
112
124
|
return
|
125
|
+
elsif task.attributes['name'].nil? || task.attributes['name'].empty?
|
126
|
+
say "\nSkipping blank task: #{task.id}! ", :yellow
|
127
|
+
return
|
113
128
|
end
|
114
129
|
|
115
130
|
# sections contribute their tags but nothing else
|
@@ -171,13 +186,13 @@ using options #{options}
|
|
171
186
|
|
172
187
|
Task attributes: #{task.attributes}
|
173
188
|
EOF
|
174
|
-
:assignee_id => zendesk_assignee_id(task),
|
189
|
+
:assignee_id => zendesk_assignee_id(task.attributes['assignee']),
|
175
190
|
:created_at => task.created_at,
|
176
191
|
:tags => flatten_tags(project_tags, section_tags),
|
177
192
|
:comments => comments
|
178
193
|
)
|
179
194
|
ticket.import
|
180
|
-
say "\n >>> ticket imported "
|
195
|
+
say "\n >>> ticket successfully imported ", :green
|
181
196
|
end
|
182
197
|
|
183
198
|
# rinse and repeat for subtasks and their subtasks and ...
|
@@ -194,42 +209,44 @@ using options #{options}
|
|
194
209
|
|
195
210
|
# lookup up asana user on zendesk and
|
196
211
|
# optionally create new if not exists
|
212
|
+
# NOTE: if asana user is invalid we
|
213
|
+
# must substitute the default user
|
197
214
|
#
|
198
215
|
# return: zendesk user or nil
|
199
216
|
#
|
200
217
|
def asana_to_zendesk_user(spec, create)
|
201
218
|
key = spec.is_a?(Hash) ? spec['id'] : spec
|
202
219
|
asana = Zensana::Asana::User.new(key)
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
if create
|
207
|
-
zendesk.create(
|
208
|
-
:email => asana.email,
|
209
|
-
:name => asana.name,
|
210
|
-
:verified => options[:verified]
|
211
|
-
)
|
212
|
-
zendesk
|
220
|
+
unless asana.attributes['email']
|
221
|
+
raise NotFound, "Invalid asana email in #{asana}; please provide 'default_user' option" unless options[:default_user]
|
222
|
+
zendesk = options[:default_user]
|
213
223
|
else
|
214
|
-
|
224
|
+
zendesk = Zensana::Zendesk::User.new
|
225
|
+
unless zendesk.find(asana.email)
|
226
|
+
if create
|
227
|
+
zendesk.create(
|
228
|
+
:email => asana.email,
|
229
|
+
:name => asana.name,
|
230
|
+
:verified => options[:verified]
|
231
|
+
)
|
232
|
+
else
|
233
|
+
zendesk = nil
|
234
|
+
end
|
235
|
+
end
|
215
236
|
end
|
216
|
-
else
|
217
237
|
zendesk
|
218
238
|
end
|
219
239
|
|
220
|
-
# lookup the asana
|
240
|
+
# lookup the asana user in zendesk and
|
221
241
|
# return their id if they are an agent or admin
|
222
242
|
#
|
223
|
-
def zendesk_assignee_id(
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
if assignee.attributes && assignee.attributes['role'] != 'end-user'
|
228
|
-
assignee_id = assignee.attributes['id']
|
229
|
-
end
|
243
|
+
def zendesk_assignee_id(asana_user_id)
|
244
|
+
if (assignee = asana_to_zendesk_user(asana_user_id, false))
|
245
|
+
if assignee.attributes && assignee.attributes['role'] != 'end-user'
|
246
|
+
assignee_id = assignee.attributes['id']
|
230
247
|
end
|
231
248
|
end
|
232
|
-
assignee_id
|
249
|
+
assignee_id || (options[:default_user] ? options[:default_user].attributes['id'] : nil)
|
233
250
|
end
|
234
251
|
|
235
252
|
# download the attachments to the local file system
|
@@ -264,10 +281,15 @@ using options #{options}
|
|
264
281
|
[].tap do |tokens|
|
265
282
|
attachments.each do |attachment|
|
266
283
|
tries = 3
|
284
|
+
file = attachment.full_path
|
267
285
|
begin
|
268
286
|
uploader = Zensana::Zendesk::Attachment.new
|
269
|
-
|
270
|
-
|
287
|
+
if uploader.too_big?(file)
|
288
|
+
say "\n --> skip: #{file} exceeds filesize limit! ", :red
|
289
|
+
else
|
290
|
+
tokens << uploader.upload(attachment.full_path)['token']
|
291
|
+
print '.'
|
292
|
+
end
|
271
293
|
rescue
|
272
294
|
retry unless (tries-= 1).zero?
|
273
295
|
raise
|
@@ -3,6 +3,8 @@ module Zensana
|
|
3
3
|
class Attachment
|
4
4
|
include Zensana::Zendesk::Access
|
5
5
|
|
6
|
+
MAX_ATTACHMENT_SIZE = 2*10**6
|
7
|
+
|
6
8
|
attr_reader :attributes
|
7
9
|
|
8
10
|
def initialize
|
@@ -13,6 +15,10 @@ module Zensana
|
|
13
15
|
@attributes = upload_file(filename)
|
14
16
|
end
|
15
17
|
|
18
|
+
def too_big?(file)
|
19
|
+
File.size(file).to_f > MAX_ATTACHMENT_SIZE
|
20
|
+
end
|
21
|
+
|
16
22
|
def method_missing(name, *args, &block)
|
17
23
|
attributes[name.to_s] || super
|
18
24
|
end
|
@@ -21,9 +21,8 @@ module Zensana
|
|
21
21
|
|
22
22
|
def create(attributes)
|
23
23
|
validate_keys attributes
|
24
|
-
email = attributes['email'] || attributes['user']['email']
|
25
|
-
raise AlreadyExists, "User '#{email}' already exists" if lookup_by_email(email)
|
26
|
-
rescue NotFound
|
24
|
+
email = attributes['email'] || (attributes['user'] && attributes['user']['email'])
|
25
|
+
raise AlreadyExists, "User '#{email}' already exists" if email && lookup_by_email(email)
|
27
26
|
user = create_user(attributes)
|
28
27
|
update_cache user
|
29
28
|
@attributes = user
|
data/lib/zensana/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zensana
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Warren Bain
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httmultiparty
|