caperoma 4.0.1 → 5.0.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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/Capefile +6 -6
  3. data/Capefile.template +4 -1
  4. data/Gemfile +1 -5
  5. data/Gemfile.lock +3 -45
  6. data/HELP +84 -13
  7. data/README.md +165 -29
  8. data/Rakefile +25 -22
  9. data/VERSION +1 -1
  10. data/bin/caperoma +6 -9
  11. data/caperoma.gemspec +15 -13
  12. data/config/crontab +0 -2
  13. data/config/schedule.rb +17 -19
  14. data/config/unschedule.rb +3 -0
  15. data/images/circle.png +0 -0
  16. data/images/report.png +0 -0
  17. data/lib/caperoma.rb +308 -98
  18. data/lib/caperoma/models/account.rb +1 -1
  19. data/lib/caperoma/models/project.rb +1 -2
  20. data/lib/caperoma/models/report.rb +15 -15
  21. data/lib/caperoma/models/task.rb +203 -46
  22. data/lib/caperoma/models/tasks/chore.rb +2 -0
  23. data/lib/caperoma/models/tasks/feature.rb +1 -0
  24. data/lib/caperoma/models/tasks/fix.rb +2 -0
  25. data/lib/caperoma/models/tasks/meeting.rb +2 -0
  26. data/lib/caperoma/models/tasks/modules/git.rb +94 -15
  27. data/lib/caperoma/models/tasks/task_with_commit.rb +8 -5
  28. data/lib/caperoma/models/tasks/task_with_separate_branch.rb +6 -4
  29. data/spec/caperoma_spec.rb +558 -2
  30. data/spec/factories/accounts.rb +1 -1
  31. data/spec/factories/projects.rb +1 -1
  32. data/spec/factories/report_recipients.rb +1 -1
  33. data/spec/factories/reports.rb +1 -1
  34. data/spec/factories/tasks.rb +1 -2
  35. data/spec/features/command_unknown_spec.rb +0 -1
  36. data/spec/features/feature_spec.rb +64 -44
  37. data/spec/features/init_spec.rb +20 -0
  38. data/spec/features/status_spec.rb +12 -11
  39. data/spec/models/project_spec.rb +0 -1
  40. data/spec/models/task_spec.rb +811 -27
  41. data/spec/models/task_with_commit_spec.rb +0 -4
  42. data/spec/models/task_with_separate_branch_spec.rb +4 -4
  43. data/spec/models/three_day_report_spec.rb +2 -3
  44. data/spec/spec_helper.rb +2 -0
  45. data/spec/support/capefile_generator.rb +35 -27
  46. data/spec/support/stubs.rb +7 -74
  47. metadata +47 -24
  48. data/lib/caperoma/models/branch.rb +0 -6
  49. data/lib/caperoma/services/airbrake_email_processor.rb +0 -47
  50. data/lib/caperoma/services/pivotal_fetcher.rb +0 -108
  51. data/spec/factories/branches.rb +0 -9
  52. 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
- %(#{self[:folder_path]})
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
- crontab_file = File.join root, 'config', 'crontab'
18
- `crontab #{crontab_file}`
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
- puts 'pending'
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
- "<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>",
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
- "</tbody>",
135
- "</table>",
136
- "<br />",
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)
@@ -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.length == 0
51
- puts "You are not working on anything now."
52
- else
53
- unfinished.each do |task|
54
- puts "You are working on: "
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 pivotal_id.present?
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 pivotal_id.present?
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 pivotal_id.present?
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(comment)
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? && ENV['CAPEROMA_INTEGRATION_TEST'].blank?
146
+ Account.jira.present? && not_test?
141
147
  end
142
148
 
143
149
  def start_on_jira?
144
- jira_key.present? && Account.jira.present? && ENV['CAPEROMA_INTEGRATION_TEST'].blank?
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? && ENV['CAPEROMA_INTEGRATION_TEST'].blank?
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? && ENV['CAPEROMA_INTEGRATION_TEST'].blank?
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 -= @additional_time.to_i.minutes if @additional_time.present?
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? && ENV['CAPEROMA_INTEGRATION_TEST'].blank?
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
- result = conn.post do |request|
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
- result = JSON.parse response.body
321
-
322
- update_attributes(
323
- pivotal_id: result['id']
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
- Jbuilder.encode do |j|
330
- j.fields do
331
- j.project { j.id project.jira_project_id.to_s }
332
- j.issuetype { j.id issue_type }
333
- j.summary title.to_s
334
- j.assignee do
335
- j.name Account.jira.username
336
- end
337
- end
338
- end
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
- result = JSON.parse response.body
356
-
357
- update_attributes(
358
- jira_id: result['id'],
359
- jira_key: result['key'],
360
- jira_url: result['self']
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