shipit-engine 0.39.0 → 0.40.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 (315) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +40 -1
  3. data/Rakefile +2 -1
  4. data/app/assets/javascripts/shipit/continuous_delivery_schedule.js.coffee +15 -0
  5. data/app/controllers/concerns/shipit/active_model_serializers_patch.rb +1 -0
  6. data/app/controllers/concerns/shipit/api/cacheable.rb +1 -0
  7. data/app/controllers/concerns/shipit/api/paginable.rb +3 -2
  8. data/app/controllers/concerns/shipit/api/rendering.rb +1 -0
  9. data/app/controllers/concerns/shipit/authentication.rb +1 -0
  10. data/app/controllers/concerns/shipit/pagination.rb +3 -2
  11. data/app/controllers/shipit/api/base_controller.rb +10 -8
  12. data/app/controllers/shipit/api/ccmenu_controller.rb +2 -1
  13. data/app/controllers/shipit/api/commits_controller.rb +2 -3
  14. data/app/controllers/shipit/api/deploys_controller.rb +2 -1
  15. data/app/controllers/shipit/api/hooks_controller.rb +4 -3
  16. data/app/controllers/shipit/api/locks_controller.rb +1 -0
  17. data/app/controllers/shipit/api/merge_requests_controller.rb +6 -5
  18. data/app/controllers/shipit/api/outputs_controller.rb +1 -0
  19. data/app/controllers/shipit/api/release_statuses_controller.rb +2 -1
  20. data/app/controllers/shipit/api/rollbacks_controller.rb +1 -0
  21. data/app/controllers/shipit/api/stacks_controller.rb +15 -14
  22. data/app/controllers/shipit/api/tasks_controller.rb +6 -5
  23. data/app/controllers/shipit/api_clients_controller.rb +6 -7
  24. data/app/controllers/shipit/ccmenu_url_controller.rb +3 -2
  25. data/app/controllers/shipit/commit_checks_controller.rb +2 -1
  26. data/app/controllers/shipit/commits_controller.rb +1 -0
  27. data/app/controllers/shipit/continuous_delivery_schedules_controller.rb +42 -0
  28. data/app/controllers/shipit/deploys_controller.rb +6 -5
  29. data/app/controllers/shipit/github_authentication_controller.rb +6 -0
  30. data/app/controllers/shipit/merge_requests_controller.rb +1 -0
  31. data/app/controllers/shipit/merge_status_controller.rb +30 -26
  32. data/app/controllers/shipit/release_statuses_controller.rb +1 -0
  33. data/app/controllers/shipit/repositories_controller.rb +4 -7
  34. data/app/controllers/shipit/rollbacks_controller.rb +2 -1
  35. data/app/controllers/shipit/shipit_controller.rb +1 -0
  36. data/app/controllers/shipit/stacks_controller.rb +27 -31
  37. data/app/controllers/shipit/status_controller.rb +1 -0
  38. data/app/controllers/shipit/tasks_controller.rb +3 -1
  39. data/app/controllers/shipit/webhooks_controller.rb +2 -1
  40. data/app/helpers/shipit/api_clients_helper.rb +1 -0
  41. data/app/helpers/shipit/chunks_helper.rb +3 -1
  42. data/app/helpers/shipit/deploys_helper.rb +7 -3
  43. data/app/helpers/shipit/github_url_helper.rb +5 -4
  44. data/app/helpers/shipit/merge_status_helper.rb +1 -0
  45. data/app/helpers/shipit/shipit_helper.rb +11 -10
  46. data/app/helpers/shipit/stacks_helper.rb +10 -11
  47. data/app/helpers/shipit/tasks_helper.rb +2 -1
  48. data/app/jobs/shipit/background_job/unique.rb +3 -2
  49. data/app/jobs/shipit/background_job.rb +9 -1
  50. data/app/jobs/shipit/cache_deploy_spec_job.rb +2 -1
  51. data/app/jobs/shipit/chunk_rollup_job.rb +1 -0
  52. data/app/jobs/shipit/clear_git_cache_job.rb +1 -0
  53. data/app/jobs/shipit/continuous_delivery_job.rb +5 -0
  54. data/app/jobs/shipit/create_on_github_job.rb +1 -0
  55. data/app/jobs/shipit/create_release_statuses_job.rb +2 -0
  56. data/app/jobs/shipit/deferred_touch_job.rb +1 -0
  57. data/app/jobs/shipit/deliver_hook_job.rb +1 -0
  58. data/app/jobs/shipit/destroy_job.rb +1 -0
  59. data/app/jobs/shipit/destroy_repository_job.rb +1 -0
  60. data/app/jobs/shipit/destroy_stack_job.rb +36 -15
  61. data/app/jobs/shipit/emit_event_job.rb +1 -0
  62. data/app/jobs/shipit/fetch_commit_stats_job.rb +1 -0
  63. data/app/jobs/shipit/fetch_deployed_revision_job.rb +1 -0
  64. data/app/jobs/shipit/github_sync_job.rb +4 -2
  65. data/app/jobs/shipit/mark_deploy_healthy_job.rb +1 -0
  66. data/app/jobs/shipit/perform_commit_checks_job.rb +1 -0
  67. data/app/jobs/shipit/perform_task_job.rb +1 -0
  68. data/app/jobs/shipit/process_merge_requests_job.rb +2 -0
  69. data/app/jobs/shipit/purge_old_deliveries_job.rb +1 -0
  70. data/app/jobs/shipit/reap_dead_tasks_job.rb +1 -0
  71. data/app/jobs/shipit/refresh_check_runs_job.rb +1 -0
  72. data/app/jobs/shipit/refresh_github_user_job.rb +1 -0
  73. data/app/jobs/shipit/refresh_merge_request_job.rb +1 -0
  74. data/app/jobs/shipit/refresh_statuses_job.rb +1 -0
  75. data/app/jobs/shipit/setup_github_hook_job.rb +1 -0
  76. data/app/jobs/shipit/update_estimated_deploy_duration_job.rb +1 -0
  77. data/app/jobs/shipit/update_github_last_deployed_ref_job.rb +6 -7
  78. data/app/models/concerns/shipit/deferred_touch.rb +5 -2
  79. data/app/models/shipit/anonymous_user.rb +4 -5
  80. data/app/models/shipit/api_client.rb +4 -2
  81. data/app/models/shipit/application_record.rb +1 -0
  82. data/app/models/shipit/check_run.rb +7 -6
  83. data/app/models/shipit/command_line_user.rb +4 -5
  84. data/app/models/shipit/commit.rb +46 -32
  85. data/app/models/shipit/commit_checks.rb +4 -2
  86. data/app/models/shipit/commit_deployment.rb +7 -5
  87. data/app/models/shipit/commit_deployment_status.rb +5 -2
  88. data/app/models/shipit/commit_message.rb +2 -0
  89. data/app/models/shipit/continuous_delivery_schedule.rb +84 -0
  90. data/app/models/shipit/delivery.rb +4 -3
  91. data/app/models/shipit/deploy.rb +46 -26
  92. data/app/models/shipit/deploy_spec/bundler_discovery.rb +3 -1
  93. data/app/models/shipit/deploy_spec/capistrano_discovery.rb +1 -0
  94. data/app/models/shipit/deploy_spec/file_system.rb +35 -16
  95. data/app/models/shipit/deploy_spec/kubernetes_discovery.rb +4 -3
  96. data/app/models/shipit/deploy_spec/lerna_discovery.rb +32 -31
  97. data/app/models/shipit/deploy_spec/npm_discovery.rb +18 -13
  98. data/app/models/shipit/deploy_spec/pypi_discovery.rb +5 -4
  99. data/app/models/shipit/deploy_spec/rubygems_discovery.rb +1 -0
  100. data/app/models/shipit/deploy_spec.rb +25 -30
  101. data/app/models/shipit/deploy_stats.rb +6 -1
  102. data/app/models/shipit/duration.rb +5 -3
  103. data/app/models/shipit/ephemeral_commit_checks.rb +8 -7
  104. data/app/models/shipit/github_hook.rb +1 -0
  105. data/app/models/shipit/github_status.rb +1 -0
  106. data/app/models/shipit/hook.rb +8 -6
  107. data/app/models/shipit/membership.rb +1 -0
  108. data/app/models/shipit/merge_request.rb +26 -16
  109. data/app/models/shipit/output_chunk.rb +1 -0
  110. data/app/models/shipit/provisioning_handler.rb +1 -0
  111. data/app/models/shipit/pull_request.rb +1 -1
  112. data/app/models/shipit/record.rb +1 -0
  113. data/app/models/shipit/release_status.rb +4 -3
  114. data/app/models/shipit/repository.rb +12 -11
  115. data/app/models/shipit/review_stack.rb +3 -1
  116. data/app/models/shipit/review_stack_provisioning_queue.rb +2 -2
  117. data/app/models/shipit/rollback.rb +2 -0
  118. data/app/models/shipit/stack.rb +59 -56
  119. data/app/models/shipit/status/common.rb +1 -0
  120. data/app/models/shipit/status/group.rb +5 -3
  121. data/app/models/shipit/status/missing.rb +2 -1
  122. data/app/models/shipit/status/unknown.rb +1 -0
  123. data/app/models/shipit/status.rb +5 -4
  124. data/app/models/shipit/task.rb +33 -28
  125. data/app/models/shipit/task_definition.rb +10 -7
  126. data/app/models/shipit/task_execution_strategy/default.rb +13 -13
  127. data/app/models/shipit/team.rb +13 -12
  128. data/app/models/shipit/undeployed_commit.rb +8 -3
  129. data/app/models/shipit/unlimited_api_client.rb +2 -2
  130. data/app/models/shipit/user.rb +21 -16
  131. data/app/models/shipit/variable_definition.rb +2 -1
  132. data/app/models/shipit/webhooks/handlers/check_suite_handler.rb +1 -0
  133. data/app/models/shipit/webhooks/handlers/handler.rb +1 -0
  134. data/app/models/shipit/webhooks/handlers/membership_handler.rb +1 -0
  135. data/app/models/shipit/webhooks/handlers/pull_request/assigned_handler.rb +10 -10
  136. data/app/models/shipit/webhooks/handlers/pull_request/closed_handler.rb +1 -1
  137. data/app/models/shipit/webhooks/handlers/pull_request/edited_handler.rb +10 -10
  138. data/app/models/shipit/webhooks/handlers/pull_request/label_capturing_handler.rb +2 -2
  139. data/app/models/shipit/webhooks/handlers/pull_request/labeled_handler.rb +2 -2
  140. data/app/models/shipit/webhooks/handlers/pull_request/reopened_handler.rb +1 -1
  141. data/app/models/shipit/webhooks/handlers/pull_request/review_stack_adapter.rb +3 -3
  142. data/app/models/shipit/webhooks/handlers/pull_request/unlabeled_handler.rb +1 -1
  143. data/app/models/shipit/webhooks/handlers/push_handler.rb +2 -1
  144. data/app/models/shipit/webhooks/handlers/status_handler.rb +1 -0
  145. data/app/models/shipit/webhooks.rb +3 -2
  146. data/app/serializers/concerns/shipit/conditional_attributes.rb +1 -0
  147. data/app/serializers/shipit/anonymous_user_serializer.rb +1 -0
  148. data/app/serializers/shipit/command_line_user_serializer.rb +1 -0
  149. data/app/serializers/shipit/commit_serializer.rb +2 -1
  150. data/app/serializers/shipit/deploy_serializer.rb +1 -0
  151. data/app/serializers/shipit/hook_serializer.rb +1 -0
  152. data/app/serializers/shipit/merge_request_serializer.rb +2 -1
  153. data/app/serializers/shipit/rollback_serializer.rb +1 -0
  154. data/app/serializers/shipit/short_commit_serializer.rb +1 -0
  155. data/app/serializers/shipit/stack_serializer.rb +4 -3
  156. data/app/serializers/shipit/tail_task_serializer.rb +4 -1
  157. data/app/serializers/shipit/task_serializer.rb +1 -0
  158. data/app/serializers/shipit/user_serializer.rb +1 -0
  159. data/app/validators/ascii_only_validator.rb +4 -3
  160. data/app/validators/subset_validator.rb +1 -0
  161. data/app/views/shipit/ccmenu/project.xml.builder +2 -1
  162. data/app/views/shipit/continuous_delivery_schedules/show.html.erb +59 -0
  163. data/app/views/shipit/stacks/_settings_form.erb +1 -0
  164. data/config/initializers/inflections.rb +1 -0
  165. data/config/locales/en.yml +1 -0
  166. data/config/routes.rb +21 -18
  167. data/db/migrate/20240821003007_add_continuous_delivery_schedules.rb +13 -0
  168. data/db/migrate/20250207203053_embiggen_github_ids.rb +8 -0
  169. data/lib/shipit/cast_value.rb +1 -0
  170. data/lib/shipit/command.rb +29 -9
  171. data/lib/shipit/commands.rb +4 -2
  172. data/lib/shipit/csv_serializer.rb +3 -0
  173. data/lib/shipit/deploy_commands.rb +2 -1
  174. data/lib/shipit/engine.rb +5 -4
  175. data/lib/shipit/environment_variables.rb +2 -0
  176. data/lib/shipit/first_parent_commits_iterator.rb +2 -3
  177. data/lib/shipit/flock.rb +11 -9
  178. data/lib/shipit/github_app.rb +14 -15
  179. data/lib/shipit/github_http_cache_middleware.rb +1 -0
  180. data/lib/shipit/null_serializer.rb +1 -0
  181. data/lib/shipit/octokit_check_runs.rb +1 -0
  182. data/lib/shipit/octokit_iterator.rb +2 -0
  183. data/lib/shipit/paginator.rb +1 -0
  184. data/lib/shipit/rollback_commands.rb +2 -1
  185. data/lib/shipit/same_site_cookie_middleware.rb +1 -0
  186. data/lib/shipit/simple_message_verifier.rb +1 -0
  187. data/lib/shipit/stack_commands.rb +34 -26
  188. data/lib/shipit/stat.rb +1 -0
  189. data/lib/shipit/task_commands.rb +7 -6
  190. data/lib/shipit/version.rb +2 -1
  191. data/lib/shipit.rb +29 -16
  192. data/lib/tasks/cron.rake +2 -1
  193. data/lib/tasks/dev.rake +3 -2
  194. data/lib/tasks/shipit.rake +3 -2
  195. data/lib/tasks/teams.rake +3 -2
  196. data/test/controllers/api/base_controller_test.rb +1 -0
  197. data/test/controllers/api/ccmenu_controller_test.rb +4 -3
  198. data/test/controllers/api/commits_controller_test.rb +1 -0
  199. data/test/controllers/api/deploys_controller_test.rb +2 -1
  200. data/test/controllers/api/hooks_controller_test.rb +6 -5
  201. data/test/controllers/api/locks_controller_test.rb +1 -0
  202. data/test/controllers/api/merge_requests_controller_test.rb +1 -0
  203. data/test/controllers/api/outputs_controller_test.rb +1 -0
  204. data/test/controllers/api/release_statuses_controller_test.rb +4 -3
  205. data/test/controllers/api/rollback_controller_test.rb +3 -2
  206. data/test/controllers/api/stacks_controller_test.rb +13 -12
  207. data/test/controllers/api/tasks_controller_test.rb +7 -6
  208. data/test/controllers/api_clients_controller_test.rb +10 -10
  209. data/test/controllers/ccmenu_controller_test.rb +1 -0
  210. data/test/controllers/commit_checks_controller_test.rb +1 -0
  211. data/test/controllers/commits_controller_test.rb +9 -8
  212. data/test/controllers/continuous_delivery_schedules_controller_test.rb +66 -0
  213. data/test/controllers/deploys_controller_test.rb +4 -2
  214. data/test/controllers/github_authentication_controller_test.rb +6 -4
  215. data/test/controllers/merge_requests_controller_test.rb +1 -0
  216. data/test/controllers/merge_status_controller_test.rb +5 -4
  217. data/test/controllers/release_statuses_controller_test.rb +1 -0
  218. data/test/controllers/repositories_controller_test.rb +6 -5
  219. data/test/controllers/rollbacks_controller_test.rb +3 -2
  220. data/test/controllers/stacks_controller_test.rb +7 -5
  221. data/test/controllers/status_controller_test.rb +1 -0
  222. data/test/controllers/tasks_controller_test.rb +5 -4
  223. data/test/controllers/webhooks_controller_test.rb +10 -9
  224. data/test/dummy/config/application.rb +1 -1
  225. data/test/dummy/db/schema.rb +33 -6
  226. data/test/fixtures/shipit/commits.yml +7 -7
  227. data/test/fixtures/shipit/stacks.yml +4 -10
  228. data/test/fixtures/shipit/tasks.yml +3 -3
  229. data/test/helpers/api_helper.rb +2 -3
  230. data/test/helpers/fixture_aliases_helper.rb +1 -0
  231. data/test/helpers/hooks_helper.rb +1 -0
  232. data/test/helpers/json_helper.rb +4 -3
  233. data/test/helpers/links_helper.rb +2 -1
  234. data/test/helpers/payloads_helper.rb +1 -0
  235. data/test/helpers/queries_helper.rb +4 -3
  236. data/test/jobs/cache_deploy_spec_job_test.rb +3 -2
  237. data/test/jobs/chunk_rollup_job_test.rb +3 -2
  238. data/test/jobs/deliver_hook_job_test.rb +1 -0
  239. data/test/jobs/destroy_repository_job_test.rb +1 -0
  240. data/test/jobs/destroy_stack_job_test.rb +12 -0
  241. data/test/jobs/emit_event_job_test.rb +1 -0
  242. data/test/jobs/fetch_commit_stats_job_test.rb +1 -0
  243. data/test/jobs/fetch_deployed_revision_job_test.rb +1 -0
  244. data/test/jobs/github_sync_job_test.rb +22 -21
  245. data/test/jobs/mark_deploy_healthy_job_test.rb +1 -0
  246. data/test/jobs/perform_task_job_test.rb +3 -3
  247. data/test/jobs/process_merge_requests_job_test.rb +7 -6
  248. data/test/jobs/purge_old_deliveries_job_test.rb +1 -0
  249. data/test/jobs/reap_dead_tasks_job_test.rb +1 -0
  250. data/test/jobs/refresh_github_user_job_test.rb +1 -0
  251. data/test/jobs/refresh_status_job_test.rb +1 -0
  252. data/test/jobs/shipit/background_job_test.rb +35 -0
  253. data/test/jobs/shipit/continuous_delivery_job_test.rb +31 -0
  254. data/test/jobs/unique_job_test.rb +3 -1
  255. data/test/jobs/update_github_last_deployed_ref_job_test.rb +1 -0
  256. data/test/middleware/same_site_cookie_middleware_test.rb +2 -2
  257. data/test/models/api_client_test.rb +1 -0
  258. data/test/models/commit_checks_test.rb +2 -1
  259. data/test/models/commit_deployment_status_test.rb +2 -1
  260. data/test/models/commit_deployment_test.rb +4 -3
  261. data/test/models/commits_test.rb +72 -70
  262. data/test/models/delivery_test.rb +3 -2
  263. data/test/models/deploy_spec_test.rb +113 -109
  264. data/test/models/deploy_stats_test.rb +1 -0
  265. data/test/models/deploys_test.rb +65 -56
  266. data/test/models/duration_test.rb +1 -1
  267. data/test/models/github_hook_test.rb +1 -0
  268. data/test/models/hook_test.rb +7 -4
  269. data/test/models/membership_test.rb +1 -0
  270. data/test/models/merge_request_test.rb +23 -20
  271. data/test/models/release_statuses_test.rb +2 -1
  272. data/test/models/rollbacks_test.rb +4 -3
  273. data/test/models/shipit/check_run_test.rb +16 -15
  274. data/test/models/shipit/continuous_delivery_schedule_test.rb +109 -0
  275. data/test/models/shipit/deploy_spec/file_system_test.rb +54 -10
  276. data/test/models/shipit/pull_request_test.rb +9 -9
  277. data/test/models/shipit/repository_test.rb +3 -2
  278. data/test/models/shipit/review_stack_provisioning_queue_test.rb +2 -2
  279. data/test/models/shipit/stack_test.rb +30 -29
  280. data/test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb +36 -34
  281. data/test/models/shipit/webhooks/handlers/pull_request/label_capturing_handler_test.rb +28 -28
  282. data/test/models/shipit/webhooks/handlers/pull_request/labeled_handler_test.rb +42 -42
  283. data/test/models/shipit/webhooks/handlers/pull_request/opened_handler_test.rb +33 -33
  284. data/test/models/shipit/webhooks/handlers/pull_request/reopened_handler_test.rb +37 -37
  285. data/test/models/shipit/webhooks/handlers/pull_request/review_stack_adapter_test.rb +1 -1
  286. data/test/models/shipit/webhooks/handlers/pull_request/unlabeled_handler_test.rb +44 -42
  287. data/test/models/shipit/webhooks/handlers_test.rb +1 -0
  288. data/test/models/status/group_test.rb +3 -2
  289. data/test/models/status/missing_test.rb +1 -0
  290. data/test/models/status_test.rb +2 -1
  291. data/test/models/task_definitions_test.rb +7 -6
  292. data/test/models/tasks_test.rb +5 -4
  293. data/test/models/team_test.rb +5 -4
  294. data/test/models/undeployed_commits_test.rb +10 -9
  295. data/test/models/users_test.rb +21 -20
  296. data/test/test_command_integration.rb +1 -1
  297. data/test/test_helper.rb +11 -9
  298. data/test/unit/anonymous_user_serializer_test.rb +1 -0
  299. data/test/unit/command_test.rb +10 -1
  300. data/test/unit/commands_test.rb +1 -0
  301. data/test/unit/commit_serializer_test.rb +1 -0
  302. data/test/unit/csv_serializer_test.rb +3 -2
  303. data/test/unit/deploy_commands_test.rb +33 -23
  304. data/test/unit/deploy_serializer_test.rb +1 -0
  305. data/test/unit/environment_variables_test.rb +2 -1
  306. data/test/unit/github_app_test.rb +10 -9
  307. data/test/unit/github_apps_test.rb +19 -18
  308. data/test/unit/github_url_helper_test.rb +1 -0
  309. data/test/unit/line_buffer_test.rb +1 -1
  310. data/test/unit/rollback_commands_test.rb +2 -1
  311. data/test/unit/shipit_helper_test.rb +1 -0
  312. data/test/unit/shipit_test.rb +47 -1
  313. data/test/unit/user_serializer_test.rb +1 -0
  314. data/test/unit/variable_definition_test.rb +4 -3
  315. metadata +53 -43
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -33,14 +34,14 @@ module Shipit
33
34
  assert_difference -> { @commit.check_runs.count }, +1 do
34
35
  @commit.check_runs.create_or_update_from_github!(
35
36
  @stack.id,
36
- github_check_run(conclusion: 'success', completed_at: completed_at)
37
+ github_check_run(conclusion: 'success', completed_at:)
37
38
  )
38
39
  end
39
40
 
40
41
  assert_enqueued_with(job: RefreshCheckRunsJob) do
41
42
  @commit.check_runs.create_or_update_from_github!(
42
43
  @stack.id,
43
- github_check_run(conclusion: nil, completed_at: completed_at)
44
+ github_check_run(conclusion: nil, completed_at:)
44
45
  )
45
46
  end
46
47
 
@@ -50,9 +51,9 @@ module Shipit
50
51
  @stack.id,
51
52
  github_check_run(
52
53
  conclusion: 'action_required',
53
- completed_at: completed_at,
54
- started_at: completed_at + 1.minute,
55
- ),
54
+ completed_at:,
55
+ started_at: completed_at + 1.minute
56
+ )
56
57
  )
57
58
  end
58
59
 
@@ -62,12 +63,12 @@ module Shipit
62
63
  test ".create_or_update_from_github! is idempotent" do
63
64
  completed_at = Time.now
64
65
  assert_difference -> { @commit.check_runs.count }, +1 do
65
- @commit.check_runs.create_or_update_from_github!(@stack.id, github_check_run(completed_at: completed_at))
66
+ @commit.check_runs.create_or_update_from_github!(@stack.id, github_check_run(completed_at:))
66
67
  end
67
68
 
68
69
  assert_no_difference -> { @commit.check_runs.count } do
69
70
  assert_no_enqueued_jobs(only: RefreshCheckRunsJob) do
70
- @commit.check_runs.create_or_update_from_github!(@stack.id, github_check_run(completed_at: completed_at))
71
+ @commit.check_runs.create_or_update_from_github!(@stack.id, github_check_run(completed_at:))
71
72
  end
72
73
  end
73
74
  end
@@ -77,7 +78,7 @@ module Shipit
77
78
  assert_difference -> { @commit.check_runs.count }, +1 do
78
79
  @commit.check_runs.create_or_update_from_github!(
79
80
  @stack.id,
80
- github_check_run(conclusion: 'success', completed_at: completed_at)
81
+ github_check_run(conclusion: 'success', completed_at:)
81
82
  )
82
83
  end
83
84
 
@@ -109,7 +110,7 @@ module Shipit
109
110
  assert_difference -> { @commit.check_runs.count }, +1 do
110
111
  @commit.check_runs.create_or_update_from_github!(
111
112
  @stack.id,
112
- github_check_run(conclusion: 'success', completed_at: completed_at)
113
+ github_check_run(conclusion: 'success', completed_at:)
113
114
  )
114
115
  end
115
116
 
@@ -143,10 +144,10 @@ module Shipit
143
144
  'neutral' => 'success',
144
145
  'cancelled' => 'failure',
145
146
  'timed_out' => 'error',
146
- 'action_required' => 'pending',
147
+ 'action_required' => 'pending'
147
148
  }.each do |conclusion, expected_status|
148
149
  test "#state is #{expected_status.inspect} when conclusion is #{conclusion.inspect}" do
149
- @check_run.update!(conclusion: conclusion)
150
+ @check_run.update!(conclusion:)
150
151
  assert_equal expected_status, @check_run.state
151
152
  end
152
153
  end
@@ -156,15 +157,15 @@ module Shipit
156
157
  def github_check_run(conclusion: 'success', completed_at: Time.now, started_at: Time.now - 1.minute)
157
158
  OpenStruct.new(
158
159
  id: 424_242,
159
- conclusion: conclusion,
160
+ conclusion:,
160
161
  output: OpenStruct.new(
161
- description: 'This is a description',
162
+ description: 'This is a description'
162
163
  ),
163
164
  name: 'Test Suite',
164
165
  html_url: 'http://example.com/run',
165
166
  details_url: 'http://example.com/details',
166
- completed_at: completed_at,
167
- started_at: started_at,
167
+ completed_at:,
168
+ started_at:
168
169
  )
169
170
  end
170
171
  end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ module Shipit
6
+ class ContinuousDeliveryScheduleTest < ActiveSupport::TestCase
7
+ test "defaults to all the time" do
8
+ stack = shipit_stacks(:shipit)
9
+ schedule = stack.build_continuous_delivery_schedule
10
+
11
+ assert(schedule.valid?)
12
+
13
+ Shipit::ContinuousDeliverySchedule::DAYS.each do |day|
14
+ assert(schedule.read_attribute("#{day}_enabled"))
15
+
16
+ day_start = schedule.read_attribute("#{day}_start")
17
+ assert_equal(day_start.at_beginning_of_day, day_start)
18
+
19
+ day_end = schedule.read_attribute("#{day}_end")
20
+ assert_equal(day_end.at_end_of_day.at_beginning_of_minute, day_end)
21
+ end
22
+ end
23
+
24
+ test "#get_deployment_window" do
25
+ schedule = Shipit::ContinuousDeliverySchedule.new(
26
+ monday_enabled: false,
27
+ monday_start: "09:15",
28
+ monday_end: "17:30"
29
+ )
30
+
31
+ monday = Date.current.monday
32
+
33
+ deployment_window = schedule.get_deployment_window(monday)
34
+
35
+ refute(deployment_window.enabled?)
36
+
37
+ starts_at = deployment_window.starts_at
38
+ assert_equal(monday, starts_at.to_date)
39
+ assert_equal(9, starts_at.hour)
40
+ assert_equal(15, starts_at.min)
41
+ assert_equal(starts_at.at_beginning_of_minute, starts_at)
42
+
43
+ ends_at = deployment_window.ends_at
44
+ assert_equal(monday, ends_at.to_date)
45
+ assert_equal(17, ends_at.hour)
46
+ assert_equal(30, ends_at.min)
47
+ assert_equal(ends_at.at_end_of_minute, ends_at)
48
+ end
49
+
50
+ test "#can_deploy? is false if the day is disabled" do
51
+ schedule = Shipit::ContinuousDeliverySchedule.new(
52
+ tuesday_enabled: false,
53
+ tuesday_start: "00:00",
54
+ tuesday_end: "23:59"
55
+ )
56
+
57
+ tuesday = Date.current.monday.advance(days: 1).beginning_of_day
58
+
59
+ refute(schedule.can_deploy?(tuesday))
60
+ end
61
+
62
+ test "#can_deploy? is true when the current time is within the window" do
63
+ schedule = Shipit::ContinuousDeliverySchedule.new(
64
+ wednesday_enabled: true,
65
+ wednesday_start: "09:15",
66
+ wednesday_end: "17:30"
67
+ )
68
+
69
+ wednesday = Date.current.monday.advance(days: 2).beginning_of_day
70
+
71
+ refute(schedule.can_deploy?(wednesday))
72
+ assert(schedule.can_deploy?(wednesday.advance(hours: 9, minutes: 15)))
73
+ assert(schedule.can_deploy?(wednesday.advance(hours: 12)))
74
+ assert(schedule.can_deploy?(wednesday.advance(hours: 17, minutes: 30).at_end_of_minute))
75
+ refute(schedule.can_deploy?(wednesday.advance(hours: 17, minutes: 31)))
76
+ end
77
+
78
+ test "validates that end times must come after start times" do
79
+ schedule = Shipit::ContinuousDeliverySchedule.new(
80
+ thursday_start: "15:00",
81
+ thursday_end: "14:00"
82
+ )
83
+
84
+ schedule.validate
85
+ assert(schedule.errors.include?(:thursday_end))
86
+ assert_equal(["must be after start (03:00 PM)"], schedule.errors.messages_for(:thursday_end))
87
+ end
88
+
89
+ test "validates `*_enabled` fields" do
90
+ schedule = Shipit::ContinuousDeliverySchedule.new(
91
+ friday_enabled: nil
92
+ )
93
+
94
+ schedule.validate
95
+ assert_equal(["is not included in the list"], schedule.errors.messages_for(:friday_enabled))
96
+ end
97
+
98
+ test "requires `_start` and `_end` fields" do
99
+ schedule = Shipit::ContinuousDeliverySchedule.new(
100
+ saturday_start: nil,
101
+ saturday_end: nil
102
+ )
103
+
104
+ schedule.validate
105
+ assert_equal(["can't be blank"], schedule.errors.messages_for(:saturday_start))
106
+ assert_equal(["can't be blank"], schedule.errors.messages_for(:saturday_end))
107
+ end
108
+ end
109
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
  require 'tmpdir'
4
5
 
@@ -7,8 +8,9 @@ module Shipit
7
8
  class FileSystemTest < ActiveSupport::TestCase
8
9
  test 'deploy.pre calls "exit 1" if there is a bare shipit file and Shipit is configured to ignore' do
9
10
  Shipit.expects(:respect_bare_shipit_file?).returns(false).at_least_once
10
- deploy_spec = Shipit::DeploySpec::FileSystem.new(Dir.tmpdir, 'env')
11
- deploy_spec.expects(:config_file_path).returns(Pathname.new(Dir.tmpdir) + '/shipit.yml').at_least_once
11
+ stack = shipit_stacks(:shipit)
12
+ deploy_spec = Shipit::DeploySpec::FileSystem.new(Dir.tmpdir, stack)
13
+ deploy_spec.expects(:config_file_path).returns("#{Pathname.new(Dir.tmpdir)}/shipit.yml").at_least_once
12
14
  deploy_spec.expects(:read_config).never
13
15
  pre_commands = deploy_spec.send(:config, 'deploy', 'pre')
14
16
  assert pre_commands.include?('exit 1')
@@ -18,8 +20,9 @@ module Shipit
18
20
 
19
21
  test 'deploy.pre does not call "exit 1" if Shipit is not configured to do so' do
20
22
  Shipit.expects(:respect_bare_shipit_file?).returns(true).at_least_once
21
- deploy_spec = Shipit::DeploySpec::FileSystem.new(Dir.tmpdir, 'env')
22
- deploy_spec.expects(:config_file_path).returns(Pathname.new(Dir.tmpdir) + '/shipit.yml').at_least_once
23
+ stack = shipit_stacks(:shipit)
24
+ deploy_spec = Shipit::DeploySpec::FileSystem.new(Dir.tmpdir, stack)
25
+ deploy_spec.expects(:config_file_path).returns("#{Pathname.new(Dir.tmpdir)}/shipit.yml").at_least_once
23
26
  deploy_spec.expects(:read_config).returns(SafeYAML.load(deploy_spec_yaml))
24
27
  pre_commands = deploy_spec.send(:config, 'deploy', 'pre')
25
28
  refute pre_commands.include?('exit 1')
@@ -29,8 +32,9 @@ module Shipit
29
32
  test 'Shipit.respect_bare_shipit_file? has no effect if the file is not a bare file' do
30
33
  [true, false].each do |obey_val|
31
34
  Shipit.expects(:respect_bare_shipit_file?).returns(obey_val).at_least_once
32
- deploy_spec = Shipit::DeploySpec::FileSystem.new(Dir.tmpdir, 'env')
33
- deploy_spec.expects(:config_file_path).returns(Pathname.new(Dir.tmpdir) + '/shipit.env.yml').at_least_once
35
+ stack = shipit_stacks(:shipit)
36
+ deploy_spec = Shipit::DeploySpec::FileSystem.new(Dir.tmpdir, stack)
37
+ deploy_spec.expects(:config_file_path).returns("#{Pathname.new(Dir.tmpdir)}/shipit.env.yml").at_least_once
34
38
  deploy_spec.expects(:read_config).returns(SafeYAML.load(deploy_spec_yaml))
35
39
  pre_commands = deploy_spec.send(:config, 'deploy', 'pre')
36
40
  refute pre_commands.include?('exit 1')
@@ -40,8 +44,9 @@ module Shipit
40
44
 
41
45
  test '#load_config does not error if the file is empty' do
42
46
  Shipit.expects(:respect_bare_shipit_file?).returns(true).at_least_once
43
- deploy_spec = Shipit::DeploySpec::FileSystem.new(Dir.tmpdir, 'env')
44
- deploy_spec.expects(:config_file_path).returns(Pathname.new(Dir.tmpdir) + '/shipit.env.yml').at_least_once
47
+ stack = shipit_stacks(:shipit)
48
+ deploy_spec = Shipit::DeploySpec::FileSystem.new(Dir.tmpdir, stack)
49
+ deploy_spec.expects(:config_file_path).returns("#{Pathname.new(Dir.tmpdir)}/shipit.env.yml").at_least_once
45
50
  deploy_spec.expects(:read_config).at_least_once.returns(false)
46
51
  loaded_config = deploy_spec.send(:cacheable_config)
47
52
  refute loaded_config == false
@@ -49,8 +54,9 @@ module Shipit
49
54
 
50
55
  test '#load_config does not error if there is no "deploy" key' do
51
56
  Shipit.expects(:respect_bare_shipit_file?).returns(false).at_least_once
52
- deploy_spec = Shipit::DeploySpec::FileSystem.new(Dir.tmpdir, 'env')
53
- deploy_spec.expects(:config_file_path).returns(Pathname.new(Dir.tmpdir) + '/shipit.yml').at_least_once
57
+ stack = shipit_stacks(:shipit)
58
+ deploy_spec = Shipit::DeploySpec::FileSystem.new(Dir.tmpdir, stack)
59
+ deploy_spec.expects(:config_file_path).returns("#{Pathname.new(Dir.tmpdir)}/shipit.yml").at_least_once
54
60
  deploy_spec.expects(:read_config).never
55
61
  loaded_config = deploy_spec.send(:load_config)
56
62
  assert loaded_config.key?("deploy")
@@ -58,6 +64,35 @@ module Shipit
58
64
  assert loaded_config["deploy"]["pre"].include?('exit 1')
59
65
  end
60
66
 
67
+ test '#load_config builds proper config if inherit_from is present' do
68
+ Shipit.expects(:respect_bare_shipit_file?).returns(true).at_least_once
69
+ stack = shipit_stacks(:shipit)
70
+ deploy_spec = Shipit::DeploySpec::FileSystem.new(Dir.tmpdir, stack)
71
+ deploy_spec.expects(:config_file_path).returns(Pathname.new("#{Dir.tmpdir}/shipit_1.yml")).at_least_once
72
+ deploy_spec.expects(:read_config).returns(SafeYAML.load(deploy_spec_inherit_from_yaml), SafeYAML.load(deploy_spec_yaml)).at_least_once
73
+ Pathname.any_instance.stubs(:exist?).returns(true)
74
+ loaded_config = deploy_spec.send(:load_config)
75
+ assert loaded_config.key?("deploy")
76
+ assert loaded_config["deploy"].key?("pre")
77
+ assert loaded_config["deploy"]["pre"].include?("test 2")
78
+ assert loaded_config["deploy"]["override"].include?("test 11")
79
+ assert_not loaded_config.include?(Shipit::DeploySpec::FileSystem::SHIPIT_CONFIG_INHERIT_FROM_KEY)
80
+ end
81
+
82
+ test '#load_config builds valid config if inherit_from path is missing' do
83
+ Shipit.expects(:respect_bare_shipit_file?).returns(true).at_least_once
84
+ stack = shipit_stacks(:shipit)
85
+ deploy_spec = Shipit::DeploySpec::FileSystem.new(Dir.tmpdir, stack)
86
+ deploy_spec.expects(:config_file_path).returns(Pathname.new("#{Dir.tmpdir}/shipit_1.yml")).at_least_once
87
+ deploy_spec.expects(:read_config).returns(SafeYAML.load(deploy_spec_inherit_from_yaml)).at_least_once
88
+ Pathname.any_instance.stubs(:exist?).returns(false)
89
+ loaded_config = deploy_spec.send(:load_config)
90
+ assert loaded_config.key?("deploy")
91
+ assert_not loaded_config["deploy"].include?("pre")
92
+ assert loaded_config["deploy"]["override"].include?("test 11")
93
+ assert_not loaded_config.include?(Shipit::DeploySpec::FileSystem::SHIPIT_CONFIG_INHERIT_FROM_KEY)
94
+ end
95
+
61
96
  def deploy_spec_yaml
62
97
  <<~EOYAML
63
98
  deploy:
@@ -68,6 +103,15 @@ module Shipit
68
103
  EOYAML
69
104
  end
70
105
 
106
+ def deploy_spec_inherit_from_yaml
107
+ <<~EOYAML
108
+ inherit_from: shipit.yml
109
+ deploy:
110
+ override:
111
+ - test 11
112
+ EOYAML
113
+ end
114
+
71
115
  def deploy_spec_missing_deploy_yaml
72
116
  <<~EOYAML
73
117
  production_platform:
@@ -8,28 +8,28 @@ module Shipit
8
8
  github_pull_request = resource(
9
9
  {
10
10
  url: "https://api.github.com/repos/Codertocat/Hello-World/pulls/2",
11
- id: 279147437,
11
+ id: 279_147_437,
12
12
  number: 2,
13
13
  state: "open",
14
14
  additions: 100,
15
15
  deletions: 101,
16
16
  title: "Update the README with new information.",
17
17
  head: {
18
- sha: "ec26c3e57ca3a959ca5aad62de7213c562f8c821",
18
+ sha: "ec26c3e57ca3a959ca5aad62de7213c562f8c821"
19
19
  },
20
20
  user: {
21
- login: "Codertocat",
21
+ login: "Codertocat"
22
22
  },
23
23
  assignees: [
24
24
  {
25
- login: "bob",
26
- },
25
+ login: "bob"
26
+ }
27
27
  ],
28
28
  labels: [
29
29
  {
30
- name: "deploy",
31
- },
32
- ],
30
+ name: "deploy"
31
+ }
32
+ ]
33
33
  }
34
34
  )
35
35
  stack = shipit_stacks(:review_stack)
@@ -37,7 +37,7 @@ module Shipit
37
37
 
38
38
  stack.pull_request.github_pull_request = github_pull_request
39
39
 
40
- assert_equal 279147437, pull_request.github_id
40
+ assert_equal 279_147_437, pull_request.github_id
41
41
  assert_equal 2, pull_request.number
42
42
  assert_equal "https://api.github.com/repos/Codertocat/Hello-World/pulls/2", pull_request.api_url
43
43
  assert_equal "Update the README with new information.", pull_request.title
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -23,7 +24,7 @@ module Shipit
23
24
  error = assert_raises(ActiveRecord::RecordInvalid) do
24
25
  Repository.create!(
25
26
  owner: @repository.owner.upcase,
26
- name: @repository.name.upcase,
27
+ name: @repository.name.upcase
27
28
  )
28
29
  end
29
30
  assert_equal 'Validation failed: Name cannot be used more than once', error.message
@@ -71,7 +72,7 @@ module Shipit
71
72
  owner = "repository-owner"
72
73
  name = "repository-name"
73
74
  github_repo_name = [owner, name].join("/")
74
- expected_repository = Repository.create(owner: owner, name: name)
75
+ expected_repository = Repository.create(owner:, name:)
75
76
 
76
77
  found_repository = Repository.from_github_repo_name(github_repo_name)
77
78
 
@@ -39,7 +39,7 @@ module Shipit
39
39
  def setup_provisioning_handler(for_stack:, provision:)
40
40
  provisioning_handler_instance = mock("ProvisioningHandler instance")
41
41
  provisioning_handler_instance.expects(:provision?).returns(provision)
42
- provisioning_handler_instance.expects(:up).returns(true) if !!provision
42
+ provisioning_handler_instance.expects(:up).returns(true) if provision
43
43
  provisioning_handler_class = mock("ProvisioningHandler class")
44
44
  provisioning_handler_class.expects(:new).at_least_once.with(for_stack).returns(provisioning_handler_instance)
45
45
  Shipit::ProvisioningHandler.expects(:fetch).at_least_once.returns(provisioning_handler_class)
@@ -50,7 +50,7 @@ module Shipit
50
50
  def provisionable_review_stack
51
51
  review_stack = shipit_stacks(:review_stack)
52
52
  review_stack.update(
53
- provision_status: :deprovisioned,
53
+ provision_status: :deprovisioned
54
54
  )
55
55
 
56
56
  review_stack
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
  require 'securerandom'
4
5
 
@@ -82,10 +83,10 @@ module Shipit
82
83
  last_commit = shipit_commits(:third)
83
84
  deploy = @stack.trigger_deploy(last_commit, AnonymousUser.new)
84
85
  assert_includes(FakeReceiver.hooks, [
85
- :deploy,
86
- @stack,
87
- { deploy: deploy, status: "pending", stack: @stack },
88
- ])
86
+ :deploy,
87
+ @stack,
88
+ { deploy:, status: "pending", stack: @stack }
89
+ ])
89
90
  ensure
90
91
  Shipit.internal_hook_receivers = original_receivers
91
92
  end
@@ -262,7 +263,7 @@ module Shipit
262
263
  stack = Stack.create!(
263
264
  repository: Repository.new(owner: "foo", name: "bar"),
264
265
  environment: 'production',
265
- branch: 'main',
266
+ branch: 'main'
266
267
  )
267
268
  commit = shipit_commits(:first)
268
269
  stack.commits << commit
@@ -815,7 +816,7 @@ module Shipit
815
816
  assert !commits.empty?
816
817
  commits.each { |c| refute_predicate c, :deployable? }
817
818
 
818
- assert_nil @stack.next_expected_commit_to_deploy(commits: commits)
819
+ assert_nil @stack.next_expected_commit_to_deploy(commits:)
819
820
  end
820
821
 
821
822
  test "#next_expected_commit_to_deploy returns nil if all deployable commits are active" do
@@ -825,7 +826,7 @@ module Shipit
825
826
  assert !commits.empty?
826
827
  commits.each { |c| assert_predicate c, :active? }
827
828
 
828
- assert_nil @stack.next_expected_commit_to_deploy(commits: commits)
829
+ assert_nil @stack.next_expected_commit_to_deploy(commits:)
829
830
  end
830
831
 
831
832
  test "#next_expected_commit_to_deploy returns nil if there are no commits" do
@@ -838,7 +839,7 @@ module Shipit
838
839
 
839
840
  assert !commits.empty?
840
841
 
841
- most_recent_limited = @stack.next_expected_commit_to_deploy(commits: commits)
842
+ most_recent_limited = @stack.next_expected_commit_to_deploy(commits:)
842
843
  most_recent = commits.find { |c| !c.active? && c.deployable? }
843
844
 
844
845
  assert most_recent.id > most_recent_limited.id
@@ -857,16 +858,16 @@ module Shipit
857
858
  test "#lock_reverted_commits! locks all commits between the original and reverted commits" do
858
859
  reverted_commit = @stack.undeployed_commits.first
859
860
  revert_author = shipit_users(:bob)
860
- generate_revert_commit(stack: @stack, reverted_commit: reverted_commit, author: revert_author)
861
+ generate_revert_commit(stack: @stack, reverted_commit:, author: revert_author)
861
862
  @stack.reload
862
863
 
863
864
  assert_equal(
864
865
  [
865
866
  ['Revert "whoami"', false, nil],
866
867
  ["whoami", false, nil],
867
- ["fix all the things", false, nil],
868
+ ["fix all the things", false, nil]
868
869
  ],
869
- @stack.undeployed_commits.map { |c| [c.message, c.locked, c.lock_author_id] },
870
+ @stack.undeployed_commits.map { |c| [c.message, c.locked, c.lock_author_id] }
870
871
  )
871
872
 
872
873
  @stack.lock_reverted_commits!
@@ -876,27 +877,27 @@ module Shipit
876
877
  [
877
878
  ['Revert "whoami"', false, nil],
878
879
  ["whoami", true, revert_author.id],
879
- ["fix all the things", false, nil],
880
+ ["fix all the things", false, nil]
880
881
  ],
881
- @stack.undeployed_commits.map { |c| [c.message, c.locked, c.lock_author_id] },
882
+ @stack.undeployed_commits.map { |c| [c.message, c.locked, c.lock_author_id] }
882
883
  )
883
884
  end
884
885
 
885
886
  test "#lock_reverted_commits! is a no-op if the reverted commit has already shipped" do
886
887
  reverted_commit = shipit_commits(:first)
887
888
  revert_author = shipit_users(:bob)
888
- generate_revert_commit(stack: @stack, reverted_commit: reverted_commit, author: revert_author)
889
+ generate_revert_commit(stack: @stack, reverted_commit:, author: revert_author)
889
890
  @stack.reload
890
891
 
891
892
  initial_state = [
892
893
  ['Revert "lets go"', false, nil],
893
894
  ["whoami", false, nil],
894
- ["fix all the things", false, nil],
895
+ ["fix all the things", false, nil]
895
896
  ]
896
897
 
897
898
  assert_equal(
898
899
  initial_state,
899
- @stack.undeployed_commits.map { |c| [c.message, c.locked, c.lock_author_id] },
900
+ @stack.undeployed_commits.map { |c| [c.message, c.locked, c.lock_author_id] }
900
901
  )
901
902
 
902
903
  @stack.lock_reverted_commits!
@@ -904,7 +905,7 @@ module Shipit
904
905
 
905
906
  assert_equal(
906
907
  initial_state,
907
- @stack.undeployed_commits.map { |c| [c.message, c.locked, c.lock_author_id] },
908
+ @stack.undeployed_commits.map { |c| [c.message, c.locked, c.lock_author_id] }
908
909
  )
909
910
  end
910
911
 
@@ -922,9 +923,9 @@ module Shipit
922
923
  ['Revert "whoami"', false, nil],
923
924
  ['Revert "fix all the things"', false, nil],
924
925
  ["whoami", false, nil],
925
- ["fix all the things", false, nil],
926
+ ["fix all the things", false, nil]
926
927
  ],
927
- @stack.undeployed_commits.map { |c| [c.message, c.locked, c.lock_author_id] },
928
+ @stack.undeployed_commits.map { |c| [c.message, c.locked, c.lock_author_id] }
928
929
  )
929
930
 
930
931
  @stack.lock_reverted_commits!
@@ -935,9 +936,9 @@ module Shipit
935
936
  ['Revert "whoami"', false, nil],
936
937
  ['Revert "fix all the things"', true, second_revert_author.id],
937
938
  ["whoami", true, first_revert_author.id],
938
- ["fix all the things", true, first_revert_author.id],
939
+ ["fix all the things", true, first_revert_author.id]
939
940
  ],
940
- @stack.undeployed_commits.map { |c| [c.message, c.locked, c.lock_author_id] },
941
+ @stack.undeployed_commits.map { |c| [c.message, c.locked, c.lock_author_id] }
941
942
  )
942
943
  end
943
944
 
@@ -962,16 +963,16 @@ module Shipit
962
963
  @stack.cached_deploy_spec = create_deploy_spec(
963
964
  "links" => {
964
965
  "logs" => "http://logs.$GITHUB_REPO_NAME.$ENVIRONMENT.domain.com",
965
- "monitoring" => "https://graphs.$GITHUB_REPO_NAME.$ENVIRONMENT.domain.com",
966
- },
966
+ "monitoring" => "https://graphs.$GITHUB_REPO_NAME.$ENVIRONMENT.domain.com"
967
+ }
967
968
  )
968
969
 
969
970
  assert_equal(
970
971
  {
971
972
  "logs" => "http://logs.expected-repository-name.expected-environment.domain.com",
972
- "monitoring" => "https://graphs.expected-repository-name.expected-environment.domain.com",
973
+ "monitoring" => "https://graphs.expected-repository-name.expected-environment.domain.com"
973
974
  },
974
- @stack.links,
975
+ @stack.links
975
976
  )
976
977
  end
977
978
 
@@ -982,12 +983,12 @@ module Shipit
982
983
  'GITHUB_REPO_OWNER' => @stack.repository.owner,
983
984
  'GITHUB_REPO_NAME' => @stack.repository.name,
984
985
  'DEPLOY_URL' => @stack.deploy_url,
985
- 'BRANCH' => @stack.branch,
986
+ 'BRANCH' => @stack.branch
986
987
  }
987
988
 
988
989
  assert_equal(
989
990
  @stack.env,
990
- expected_environment,
991
+ expected_environment
991
992
  )
992
993
  end
993
994
 
@@ -1013,10 +1014,10 @@ module Shipit
1013
1014
  stack.commits.create(
1014
1015
  sha: SecureRandom.hex(20),
1015
1016
  message: "Revert \"#{reverted_commit.message_header}\"",
1016
- author: author,
1017
+ author:,
1017
1018
  committer: author,
1018
1019
  authored_at: Time.zone.now,
1019
- committed_at: Time.zone.now,
1020
+ committed_at: Time.zone.now
1020
1021
  )
1021
1022
  end
1022
1023