caperoma 4.0.1 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Capefile +6 -6
- data/Capefile.template +4 -1
- data/Gemfile +1 -5
- data/Gemfile.lock +3 -45
- data/HELP +84 -13
- data/README.md +165 -29
- data/Rakefile +25 -22
- data/VERSION +1 -1
- data/bin/caperoma +6 -9
- data/caperoma.gemspec +15 -13
- data/config/crontab +0 -2
- data/config/schedule.rb +17 -19
- data/config/unschedule.rb +3 -0
- data/images/circle.png +0 -0
- data/images/report.png +0 -0
- data/lib/caperoma.rb +308 -98
- data/lib/caperoma/models/account.rb +1 -1
- data/lib/caperoma/models/project.rb +1 -2
- data/lib/caperoma/models/report.rb +15 -15
- data/lib/caperoma/models/task.rb +203 -46
- data/lib/caperoma/models/tasks/chore.rb +2 -0
- data/lib/caperoma/models/tasks/feature.rb +1 -0
- data/lib/caperoma/models/tasks/fix.rb +2 -0
- data/lib/caperoma/models/tasks/meeting.rb +2 -0
- data/lib/caperoma/models/tasks/modules/git.rb +94 -15
- data/lib/caperoma/models/tasks/task_with_commit.rb +8 -5
- data/lib/caperoma/models/tasks/task_with_separate_branch.rb +6 -4
- data/spec/caperoma_spec.rb +558 -2
- data/spec/factories/accounts.rb +1 -1
- data/spec/factories/projects.rb +1 -1
- data/spec/factories/report_recipients.rb +1 -1
- data/spec/factories/reports.rb +1 -1
- data/spec/factories/tasks.rb +1 -2
- data/spec/features/command_unknown_spec.rb +0 -1
- data/spec/features/feature_spec.rb +64 -44
- data/spec/features/init_spec.rb +20 -0
- data/spec/features/status_spec.rb +12 -11
- data/spec/models/project_spec.rb +0 -1
- data/spec/models/task_spec.rb +811 -27
- data/spec/models/task_with_commit_spec.rb +0 -4
- data/spec/models/task_with_separate_branch_spec.rb +4 -4
- data/spec/models/three_day_report_spec.rb +2 -3
- data/spec/spec_helper.rb +2 -0
- data/spec/support/capefile_generator.rb +35 -27
- data/spec/support/stubs.rb +7 -74
- metadata +47 -24
- data/lib/caperoma/models/branch.rb +0 -6
- data/lib/caperoma/services/airbrake_email_processor.rb +0 -47
- data/lib/caperoma/services/pivotal_fetcher.rb +0 -108
- data/spec/factories/branches.rb +0 -9
- data/spec/models/branch_spec.rb +0 -8
@@ -3,7 +3,7 @@
|
|
3
3
|
class Account < ApplicationRecord
|
4
4
|
self.inheritance_column = nil
|
5
5
|
|
6
|
-
validates :email, presence: true
|
6
|
+
validates :email, presence: true
|
7
7
|
validates :password, presence: true
|
8
8
|
validates :type, presence: true, inclusion: { in: %w[--jira --pivotal --gmail --git --caperoma] }
|
9
9
|
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class Project < ApplicationRecord
|
4
|
-
has_many :branches
|
5
4
|
has_many :chores
|
6
5
|
has_many :bugs
|
7
6
|
has_many :features
|
@@ -9,6 +8,6 @@ class Project < ApplicationRecord
|
|
9
8
|
has_many :fixes
|
10
9
|
|
11
10
|
def folder_path
|
12
|
-
|
11
|
+
(self[:folder_path]).to_s
|
13
12
|
end
|
14
13
|
end
|
@@ -11,18 +11,18 @@ class Report < ApplicationRecord
|
|
11
11
|
after_create :update_content
|
12
12
|
|
13
13
|
def self.schedule
|
14
|
-
# may screw up existing cron tasks
|
15
14
|
puts 'Turning on auto reports'
|
16
15
|
root = File.dirname __dir__
|
17
|
-
|
18
|
-
`crontab #{
|
19
|
-
# > whenever --update-crontab caperoma
|
16
|
+
crontab_config_file = File.join root, '..', '..', 'config', 'schedule.rb'
|
17
|
+
`whenever --update-crontab caperoma --load-file "#{crontab_config_file}"`
|
20
18
|
puts 'Auto reports turned on'
|
21
19
|
end
|
22
20
|
|
23
21
|
def self.unschedule
|
24
22
|
puts 'Turning off auto reports'
|
25
|
-
|
23
|
+
root = File.dirname __dir__
|
24
|
+
crontab_config_file = File.join root, '..', '..', 'config', 'unschedule.rb'
|
25
|
+
`whenever --update-crontab caperoma --load-file "#{crontab_config_file}"`
|
26
26
|
puts 'Auto reports turned off'
|
27
27
|
end
|
28
28
|
|
@@ -124,16 +124,16 @@ class Report < ApplicationRecord
|
|
124
124
|
[
|
125
125
|
"\n",
|
126
126
|
"<h2>Done during #{timeframe}:</h2>",
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
127
|
+
'<br />',
|
128
|
+
'<table style="width: 100%;text-align: left;">',
|
129
|
+
'<thead>',
|
130
|
+
'<tr><th>Jira</th><th>Pivotal</th><th>Title</th><th>Time spent</th></tr>',
|
131
|
+
'</thead>',
|
132
|
+
'<tbody>',
|
133
133
|
reported_tasks_rows,
|
134
|
-
|
135
|
-
|
136
|
-
|
134
|
+
'</tbody>',
|
135
|
+
'</table>',
|
136
|
+
'<br />',
|
137
137
|
"<strong>Total time spent during #{timeframe}:</strong> #{total_time_spent}."
|
138
138
|
].flatten.join("\n")
|
139
139
|
end
|
@@ -143,7 +143,7 @@ class Report < ApplicationRecord
|
|
143
143
|
end
|
144
144
|
|
145
145
|
def table_row(task)
|
146
|
-
'<tr>' + task_row_data(task).collect{|task| '<td>' + task + '</td>' }.join("\n") + '</tr>'
|
146
|
+
'<tr>' + task_row_data(task).collect { |task| '<td>' + task + '</td>' }.join("\n") + '</tr>'
|
147
147
|
end
|
148
148
|
|
149
149
|
def task_row_data(task)
|
data/lib/caperoma/models/task.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
class Task < ActiveRecord::Base
|
3
4
|
include Git
|
4
5
|
|
@@ -10,6 +11,8 @@ class Task < ActiveRecord::Base
|
|
10
11
|
validates :title, presence: true
|
11
12
|
validates :pivotal_id, length: { minimum: 6 }, allow_blank: true, numericality: { only_integer: true }
|
12
13
|
|
14
|
+
validates :additional_time, allow_blank: true, numericality: { only_integer: true }
|
15
|
+
|
13
16
|
before_create :generate_uuid
|
14
17
|
before_create :set_start_time
|
15
18
|
|
@@ -47,30 +50,29 @@ class Task < ActiveRecord::Base
|
|
47
50
|
end
|
48
51
|
|
49
52
|
def self.status
|
50
|
-
if unfinished.
|
51
|
-
puts
|
52
|
-
else
|
53
|
-
unfinished.each do |task|
|
54
|
-
puts
|
53
|
+
if unfinished.empty?
|
54
|
+
puts 'You are not working on anything now.'
|
55
|
+
else
|
56
|
+
unfinished.each do |task|
|
57
|
+
puts 'You are working on: '
|
55
58
|
puts "Title: #{task.title}"
|
56
59
|
puts "Type: #{task.type}"
|
57
|
-
puts "Jira ID: #{task.jira_key}." if task.jira_key.present?
|
60
|
+
puts "Jira ID: #{task.jira_key} (#{task.jira_live_url})." if task.jira_key.present?
|
58
61
|
puts "Pivotal ID: #{task.pivotal_id} (#{task.pivotal_url})" if task.pivotal_id.present?
|
59
62
|
puts "Time spent at the moment: #{task.time_spent_so_far}"
|
63
|
+
puts "Branch with the task: #{task.branch}" if task.branch.present?
|
60
64
|
puts "Pull request will be sent to this branch: #{task.parent_branch}" if task.parent_branch.present?
|
61
65
|
puts "Project location: #{task.project.folder_path}"
|
62
66
|
end
|
63
67
|
end
|
64
68
|
end
|
65
69
|
|
66
|
-
attr_writer :additional_time
|
67
|
-
|
68
70
|
def finish(comment)
|
69
71
|
# full pull request
|
70
72
|
update_attribute(:finished_at, Time.now)
|
71
73
|
close_issue_on_jira
|
72
|
-
log_work_to_jira(comment)
|
73
|
-
finish_on_pivotal if
|
74
|
+
log_work_to_jira(comment) if should_log_work?
|
75
|
+
finish_on_pivotal if finish_on_pivotal?
|
74
76
|
puts time_spent
|
75
77
|
end
|
76
78
|
|
@@ -78,8 +80,8 @@ class Task < ActiveRecord::Base
|
|
78
80
|
# finish with commit & push but without pull request
|
79
81
|
update_attribute(:finished_at, Time.now)
|
80
82
|
close_issue_on_jira
|
81
|
-
log_work_to_jira(comment)
|
82
|
-
finish_on_pivotal if
|
83
|
+
log_work_to_jira(comment) if should_log_work?
|
84
|
+
finish_on_pivotal if finish_on_pivotal?
|
83
85
|
puts time_spent
|
84
86
|
end
|
85
87
|
|
@@ -87,12 +89,12 @@ class Task < ActiveRecord::Base
|
|
87
89
|
# finish without commit or push
|
88
90
|
update_attribute(:finished_at, Time.now)
|
89
91
|
close_issue_on_jira
|
90
|
-
log_work_to_jira(comment)
|
91
|
-
finish_on_pivotal if
|
92
|
+
log_work_to_jira(comment) if should_log_work?
|
93
|
+
finish_on_pivotal if finish_on_pivotal?
|
92
94
|
puts time_spent
|
93
95
|
end
|
94
96
|
|
95
|
-
def abort_without_time(
|
97
|
+
def abort_without_time(_comment)
|
96
98
|
# finish without commit or push
|
97
99
|
update_attribute(:finished_at, Time.now)
|
98
100
|
close_issue_on_jira
|
@@ -100,6 +102,10 @@ class Task < ActiveRecord::Base
|
|
100
102
|
puts time_spent
|
101
103
|
end
|
102
104
|
|
105
|
+
def should_log_work?
|
106
|
+
time_spent_so_far != '0h 0m' && Account.jira.present?
|
107
|
+
end
|
108
|
+
|
103
109
|
def time_spent_so_far
|
104
110
|
result = TimeDifference.between(started_at, Time.now).in_minutes
|
105
111
|
|
@@ -137,19 +143,23 @@ class Task < ActiveRecord::Base
|
|
137
143
|
end
|
138
144
|
|
139
145
|
def create_on_jira?
|
140
|
-
Account.jira.present? &&
|
146
|
+
Account.jira.present? && not_test?
|
141
147
|
end
|
142
148
|
|
143
149
|
def start_on_jira?
|
144
|
-
jira_key.present? && Account.jira.present? &&
|
150
|
+
jira_key.present? && Account.jira.present? && not_test?
|
145
151
|
end
|
146
152
|
|
147
153
|
def create_on_pivotal?
|
148
|
-
pivotal_id.blank? && this_is_a_type_a_user_wants_to_create? && Account.pivotal.present? &&
|
154
|
+
pivotal_id.blank? && this_is_a_type_a_user_wants_to_create? && Account.pivotal.present? && not_test?
|
149
155
|
end
|
150
156
|
|
151
157
|
def start_on_pivotal?
|
152
|
-
pivotal_id.present? && Account.pivotal.present? &&
|
158
|
+
pivotal_id.present? && Account.pivotal.present? && not_test?
|
159
|
+
end
|
160
|
+
|
161
|
+
def finish_on_pivotal?
|
162
|
+
pivotal_id.present? && Account.pivotal.present? && not_test?
|
153
163
|
end
|
154
164
|
|
155
165
|
def this_is_a_type_a_user_wants_to_create?
|
@@ -162,7 +172,7 @@ class Task < ActiveRecord::Base
|
|
162
172
|
|
163
173
|
def set_start_time
|
164
174
|
time = Time.now
|
165
|
-
time -=
|
175
|
+
time -= additional_time.to_i.minutes if additional_time.present?
|
166
176
|
self.started_at = time
|
167
177
|
end
|
168
178
|
|
@@ -171,7 +181,7 @@ class Task < ActiveRecord::Base
|
|
171
181
|
end
|
172
182
|
|
173
183
|
def output_jira_key?
|
174
|
-
jira_key.present? &&
|
184
|
+
jira_key.present? && not_test?
|
175
185
|
end
|
176
186
|
|
177
187
|
def start_issue_on_pivotal_data
|
@@ -182,6 +192,8 @@ class Task < ActiveRecord::Base
|
|
182
192
|
|
183
193
|
def start_issue_on_pivotal
|
184
194
|
if not_test?
|
195
|
+
puts 'Starting the task in Pivotal'
|
196
|
+
|
185
197
|
conn = Faraday.new(url: 'https://www.pivotaltracker.com/') do |c|
|
186
198
|
c.adapter Faraday.default_adapter
|
187
199
|
end
|
@@ -193,7 +205,22 @@ class Task < ActiveRecord::Base
|
|
193
205
|
request.headers['Content-Type'] = 'application/json'
|
194
206
|
request.headers['X-TrackerToken'] = Account.pivotal.password
|
195
207
|
end
|
208
|
+
|
209
|
+
case response.status
|
210
|
+
when 200, 201, 202, 204, 301, 302, 303, 304, 307
|
211
|
+
puts 'Started the task in Pivotal'
|
212
|
+
when 401, 403
|
213
|
+
puts "No access to the task ##{pivotal_id} in Pivotal. Maybe login or api_key are incorrect."
|
214
|
+
when 404
|
215
|
+
puts "A task with ID ##{pivotal_id} is not found in Pivotal."
|
216
|
+
else
|
217
|
+
puts 'Could not start the task in Pivotal.'
|
218
|
+
puts "Error status: #{response.status}"
|
219
|
+
puts "Message from server: #{response.reason_phrase}"
|
220
|
+
end
|
196
221
|
end
|
222
|
+
rescue Faraday::ConnectionFailed
|
223
|
+
puts 'Connection failed. Performing the task without requests to Pivotal.'
|
197
224
|
end
|
198
225
|
|
199
226
|
def finish_on_pivotal_data
|
@@ -204,6 +231,8 @@ class Task < ActiveRecord::Base
|
|
204
231
|
|
205
232
|
def finish_on_pivotal
|
206
233
|
if not_test?
|
234
|
+
puts 'Finishing the task in Pivotal'
|
235
|
+
|
207
236
|
conn = Faraday.new(url: 'https://www.pivotaltracker.com/') do |c|
|
208
237
|
c.adapter Faraday.default_adapter
|
209
238
|
end
|
@@ -215,7 +244,22 @@ class Task < ActiveRecord::Base
|
|
215
244
|
request.headers['Content-Type'] = 'application/json'
|
216
245
|
request.headers['X-TrackerToken'] = Account.pivotal.password
|
217
246
|
end
|
247
|
+
|
248
|
+
case response.status
|
249
|
+
when 200, 201, 202, 204, 301, 302, 303, 304, 307
|
250
|
+
puts 'Finished the task in Pivotal'
|
251
|
+
when 401, 403
|
252
|
+
puts "No access to the task ##{pivotal_id} in Pivotal. Maybe login or api_key are incorrect."
|
253
|
+
when 404
|
254
|
+
puts "A task with ID ##{pivotal_id} is not found in Pivotal."
|
255
|
+
else
|
256
|
+
puts 'Could not finish the task in Pivotal.'
|
257
|
+
puts "Error status: #{response.status}"
|
258
|
+
puts "Message from server: #{response.reason_phrase}"
|
259
|
+
end
|
218
260
|
end
|
261
|
+
rescue Faraday::ConnectionFailed
|
262
|
+
puts 'Connection failed. Performing the task without requests to Pivotal.'
|
219
263
|
end
|
220
264
|
|
221
265
|
def start_issue_on_jira_data
|
@@ -226,18 +270,35 @@ class Task < ActiveRecord::Base
|
|
226
270
|
|
227
271
|
def start_issue_on_jira
|
228
272
|
if not_test?
|
273
|
+
puts 'Starting the issue in Jira'
|
274
|
+
|
229
275
|
conn = Faraday.new(url: project.jira_url) do |c|
|
230
276
|
c.basic_auth(Account.jira.email, Account.jira.password)
|
231
277
|
c.adapter Faraday.default_adapter
|
232
278
|
end
|
233
279
|
|
234
|
-
conn.post do |request|
|
280
|
+
response = conn.post do |request|
|
235
281
|
request.url "rest/api/3/issue/#{jira_key}/transitions"
|
236
282
|
request.body = start_issue_on_jira_data
|
237
283
|
request.headers['User-Agent'] = 'Caperoma'
|
238
284
|
request.headers['Content-Type'] = 'application/json'
|
239
285
|
end
|
286
|
+
|
287
|
+
case response.status
|
288
|
+
when 200, 201, 202, 204, 301, 302, 303, 304, 307
|
289
|
+
puts 'Started the issue in Jira'
|
290
|
+
when 401, 403
|
291
|
+
puts "No access to the task #{jira_key} in Jira. Maybe login or api_key are incorrect."
|
292
|
+
when 404
|
293
|
+
puts "A task with ID #{jira_key} is not found in Jira."
|
294
|
+
else
|
295
|
+
puts 'Could not start the issue in Jira.'
|
296
|
+
puts "Error status: #{response.status}"
|
297
|
+
puts "Message from server: #{response.reason_phrase}"
|
298
|
+
end
|
240
299
|
end
|
300
|
+
rescue Faraday::ConnectionFailed
|
301
|
+
puts 'Connection failed. Performing the task without requests to Jira.'
|
241
302
|
end
|
242
303
|
|
243
304
|
def close_issue_on_jira_data
|
@@ -248,6 +309,8 @@ class Task < ActiveRecord::Base
|
|
248
309
|
|
249
310
|
def close_issue_on_jira
|
250
311
|
if not_test?
|
312
|
+
puts 'Closing the issue in Jira'
|
313
|
+
|
251
314
|
conn = Faraday.new(url: project.jira_url) do |c|
|
252
315
|
c.basic_auth(Account.jira.email, Account.jira.password)
|
253
316
|
c.adapter Faraday.default_adapter
|
@@ -259,7 +322,22 @@ class Task < ActiveRecord::Base
|
|
259
322
|
request.headers['User-Agent'] = 'Caperoma'
|
260
323
|
request.headers['Content-Type'] = 'application/json'
|
261
324
|
end
|
325
|
+
|
326
|
+
case response.status
|
327
|
+
when 200, 201, 202, 204, 301, 302, 303, 304, 307
|
328
|
+
puts 'Closed the issue in Jira'
|
329
|
+
when 401, 403
|
330
|
+
puts "No access to the task #{jira_key} in Jira. Maybe login or api_key are incorrect."
|
331
|
+
when 404
|
332
|
+
puts "A task with ID #{jira_key} is not found in Jira."
|
333
|
+
else
|
334
|
+
puts 'Could not close the issue in Jira.'
|
335
|
+
puts "Error status: #{response.status}"
|
336
|
+
puts "Message from server: #{response.reason_phrase}"
|
337
|
+
end
|
262
338
|
end
|
339
|
+
rescue Faraday::ConnectionFailed
|
340
|
+
puts 'Connection failed. Performing the task without requests to Jira.'
|
263
341
|
end
|
264
342
|
|
265
343
|
def log_work_to_jira_data(comment = 'Done')
|
@@ -272,18 +350,35 @@ class Task < ActiveRecord::Base
|
|
272
350
|
|
273
351
|
def log_work_to_jira(comment = 'Done')
|
274
352
|
if not_test?
|
353
|
+
puts 'Logging work to Jira'
|
354
|
+
|
275
355
|
conn = Faraday.new(url: project.jira_url) do |c|
|
276
356
|
c.basic_auth(Account.jira.email, Account.jira.password)
|
277
357
|
c.adapter Faraday.default_adapter
|
278
358
|
end
|
279
359
|
|
280
|
-
|
360
|
+
response = conn.post do |request|
|
281
361
|
request.url "rest/api/3/issue/#{jira_key}/worklog"
|
282
362
|
request.body = log_work_to_jira_data(comment)
|
283
363
|
request.headers['User-Agent'] = 'Caperoma'
|
284
364
|
request.headers['Content-Type'] = 'application/json'
|
285
365
|
end
|
366
|
+
|
367
|
+
case response.status
|
368
|
+
when 200, 201, 202, 204, 301, 302, 303, 304, 307
|
369
|
+
puts 'Work logged to Jira'
|
370
|
+
when 401, 403
|
371
|
+
puts "No access to the task #{jira_key} in Jira. Maybe login or api_key are incorrect."
|
372
|
+
when 404
|
373
|
+
puts "A task with ID #{jira_key} is not found in Jira."
|
374
|
+
else
|
375
|
+
puts 'Could not log work to Jira.'
|
376
|
+
puts "Error status: #{response.status}"
|
377
|
+
puts "Message from server: #{response.reason_phrase}"
|
378
|
+
end
|
286
379
|
end
|
380
|
+
rescue Faraday::ConnectionFailed
|
381
|
+
puts 'Connection failed. Performing the task without requests to Jira.'
|
287
382
|
end
|
288
383
|
|
289
384
|
def current_time
|
@@ -297,14 +392,17 @@ class Task < ActiveRecord::Base
|
|
297
392
|
def create_issue_on_pivotal_data
|
298
393
|
Jbuilder.encode do |j|
|
299
394
|
j.current_state 'unstarted'
|
300
|
-
j.estimate 1
|
395
|
+
j.estimate pivotal_estimate == 0 ? 1 : pivotal_estimate
|
301
396
|
j.name title.to_s
|
397
|
+
j.description description
|
302
398
|
j.story_type story_type
|
303
399
|
end
|
304
400
|
end
|
305
401
|
|
306
402
|
def create_issue_on_pivotal
|
307
403
|
if not_test?
|
404
|
+
puts 'Creating a task in Pivotal'
|
405
|
+
|
308
406
|
conn = Faraday.new(url: 'https://www.pivotaltracker.com/') do |c|
|
309
407
|
c.adapter Faraday.default_adapter
|
310
408
|
end
|
@@ -317,29 +415,69 @@ class Task < ActiveRecord::Base
|
|
317
415
|
request.headers['X-TrackerToken'] = Account.pivotal.password
|
318
416
|
end
|
319
417
|
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
418
|
+
case response.status
|
419
|
+
when 200, 201, 202, 204, 301, 302, 303, 304, 307
|
420
|
+
puts 'Created the task in Pivotal'
|
421
|
+
result = JSON.parse response.body
|
422
|
+
|
423
|
+
update_attributes(
|
424
|
+
pivotal_id: result['id']
|
425
|
+
)
|
426
|
+
when 401, 403
|
427
|
+
puts "No access to the server. Maybe login, api_key or Pivotal Project ID ##{project.pivotal_tracker_project_id} is incorrect."
|
428
|
+
when 404
|
429
|
+
puts "Resource not found. Maybe Pivotal Project ID ##{project.pivotal_tracker_project_id} is incorrect."
|
430
|
+
else
|
431
|
+
puts 'Could not create the task in Pivotal.'
|
432
|
+
puts "Error status: #{response.status}"
|
433
|
+
puts "Message from server: #{response.reason_phrase}"
|
434
|
+
end
|
325
435
|
end
|
436
|
+
rescue Faraday::ConnectionFailed
|
437
|
+
puts 'Connection failed. Performing the task without requests to Pivotal.'
|
326
438
|
end
|
327
439
|
|
328
440
|
def create_issue_on_jira_data
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
441
|
+
hash = {
|
442
|
+
fields: {
|
443
|
+
summary: title.to_s,
|
444
|
+
issuetype: {
|
445
|
+
id: issue_type
|
446
|
+
},
|
447
|
+
project: {
|
448
|
+
id: project.jira_project_id.to_s
|
449
|
+
},
|
450
|
+
assignee: {
|
451
|
+
name: Account.jira.username
|
452
|
+
}
|
453
|
+
}
|
454
|
+
}
|
455
|
+
|
456
|
+
description_hash = {
|
457
|
+
type: 'doc',
|
458
|
+
version: 1,
|
459
|
+
content: [
|
460
|
+
{
|
461
|
+
type: 'paragraph',
|
462
|
+
content: [
|
463
|
+
{
|
464
|
+
text: description,
|
465
|
+
type: 'text'
|
466
|
+
}
|
467
|
+
]
|
468
|
+
}
|
469
|
+
]
|
470
|
+
}
|
471
|
+
|
472
|
+
hash[:fields][:description] = description_hash if description.present?
|
473
|
+
|
474
|
+
hash.to_json
|
339
475
|
end
|
340
476
|
|
341
477
|
def create_issue_on_jira
|
342
478
|
if not_test?
|
479
|
+
puts 'Creating an issue in Jira'
|
480
|
+
|
343
481
|
conn = Faraday.new(url: project.jira_url) do |c|
|
344
482
|
c.basic_auth(Account.jira.email, Account.jira.password)
|
345
483
|
c.adapter Faraday.default_adapter
|
@@ -352,17 +490,36 @@ class Task < ActiveRecord::Base
|
|
352
490
|
request.headers['Content-Type'] = 'application/json'
|
353
491
|
end
|
354
492
|
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
493
|
+
case response.status
|
494
|
+
when 200, 201, 202, 204, 301, 302, 303, 304, 307
|
495
|
+
puts 'Created the issue in Jira'
|
496
|
+
|
497
|
+
result = JSON.parse response.body
|
498
|
+
|
499
|
+
update_attributes(
|
500
|
+
jira_id: result['id'],
|
501
|
+
jira_key: result['key'],
|
502
|
+
jira_url: result['self']
|
503
|
+
)
|
504
|
+
when 401, 403
|
505
|
+
puts "Forbidden access to the resource in Jira. Maybe login, api_key or Jira project id #{project.jira_project_id} are incorrect."
|
506
|
+
when 404
|
507
|
+
puts "Not found the resource in Jira. Maybe the Jira Project ID #{project.jira_project_id} is incorrect."
|
508
|
+
else
|
509
|
+
puts 'Could not create the issue in Jira.'
|
510
|
+
puts "Error status: #{response.status}"
|
511
|
+
puts "Message from server: #{response.reason_phrase}"
|
512
|
+
end
|
362
513
|
end
|
514
|
+
rescue Faraday::ConnectionFailed
|
515
|
+
puts 'Connection failed. Performing the task without requests to Jira.'
|
363
516
|
end
|
364
517
|
|
365
518
|
def not_test?
|
366
519
|
ENV['CAPEROMA_INTEGRATION_TEST'].blank?
|
367
520
|
end
|
521
|
+
|
522
|
+
def enable_git?
|
523
|
+
ENV['CAPEROMA_TEST'].blank? && ENV['CAPEROMA_INTEGRATION_TEST'].blank?
|
524
|
+
end
|
368
525
|
end
|