shipit-engine 0.38.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 (323) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +48 -4
  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 +12 -10
  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 +6 -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 +5 -3
  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 -3
  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 +5 -4
  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 +48 -17
  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 +9 -7
  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 +2 -2
  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 +71 -60
  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 +40 -31
  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 +23 -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/_variables.html.erb +1 -1
  162. data/app/views/shipit/ccmenu/project.xml.builder +2 -1
  163. data/app/views/shipit/continuous_delivery_schedules/show.html.erb +59 -0
  164. data/app/views/shipit/merge_status/failure.html.erb +1 -1
  165. data/app/views/shipit/missing_settings.html.erb +1 -1
  166. data/app/views/shipit/stacks/_settings_form.erb +1 -0
  167. data/config/initializers/inflections.rb +1 -0
  168. data/config/locales/en.yml +1 -0
  169. data/config/routes.rb +21 -18
  170. data/config/secrets.development.example.yml +1 -1
  171. data/config/secrets.development.shopify.yml +1 -1
  172. data/db/migrate/20240821003007_add_continuous_delivery_schedules.rb +13 -0
  173. data/db/migrate/20250207203053_embiggen_github_ids.rb +8 -0
  174. data/lib/shipit/cast_value.rb +1 -0
  175. data/lib/shipit/command.rb +29 -9
  176. data/lib/shipit/commands.rb +4 -2
  177. data/lib/shipit/csv_serializer.rb +3 -0
  178. data/lib/shipit/deploy_commands.rb +2 -1
  179. data/lib/shipit/engine.rb +6 -5
  180. data/lib/shipit/environment_variables.rb +2 -0
  181. data/lib/shipit/first_parent_commits_iterator.rb +2 -3
  182. data/lib/shipit/flock.rb +11 -9
  183. data/lib/shipit/github_app.rb +14 -16
  184. data/lib/shipit/github_http_cache_middleware.rb +1 -0
  185. data/lib/shipit/null_serializer.rb +1 -0
  186. data/lib/shipit/octokit_check_runs.rb +2 -3
  187. data/lib/shipit/octokit_iterator.rb +2 -0
  188. data/lib/shipit/paginator.rb +1 -0
  189. data/lib/shipit/rollback_commands.rb +2 -1
  190. data/lib/shipit/same_site_cookie_middleware.rb +1 -0
  191. data/lib/shipit/simple_message_verifier.rb +1 -0
  192. data/lib/shipit/stack_commands.rb +35 -27
  193. data/lib/shipit/stat.rb +1 -0
  194. data/lib/shipit/task_commands.rb +7 -6
  195. data/lib/shipit/version.rb +2 -1
  196. data/lib/shipit.rb +30 -17
  197. data/lib/tasks/cron.rake +2 -1
  198. data/lib/tasks/dev.rake +3 -2
  199. data/lib/tasks/shipit.rake +3 -2
  200. data/lib/tasks/teams.rake +3 -2
  201. data/test/controllers/api/base_controller_test.rb +1 -0
  202. data/test/controllers/api/ccmenu_controller_test.rb +4 -3
  203. data/test/controllers/api/commits_controller_test.rb +1 -0
  204. data/test/controllers/api/deploys_controller_test.rb +26 -1
  205. data/test/controllers/api/hooks_controller_test.rb +6 -5
  206. data/test/controllers/api/locks_controller_test.rb +1 -0
  207. data/test/controllers/api/merge_requests_controller_test.rb +1 -0
  208. data/test/controllers/api/outputs_controller_test.rb +1 -0
  209. data/test/controllers/api/release_statuses_controller_test.rb +4 -3
  210. data/test/controllers/api/rollback_controller_test.rb +3 -2
  211. data/test/controllers/api/stacks_controller_test.rb +13 -12
  212. data/test/controllers/api/tasks_controller_test.rb +7 -6
  213. data/test/controllers/api_clients_controller_test.rb +10 -10
  214. data/test/controllers/ccmenu_controller_test.rb +1 -0
  215. data/test/controllers/commit_checks_controller_test.rb +1 -0
  216. data/test/controllers/commits_controller_test.rb +9 -8
  217. data/test/controllers/continuous_delivery_schedules_controller_test.rb +66 -0
  218. data/test/controllers/deploys_controller_test.rb +4 -2
  219. data/test/controllers/github_authentication_controller_test.rb +6 -4
  220. data/test/controllers/merge_requests_controller_test.rb +1 -0
  221. data/test/controllers/merge_status_controller_test.rb +5 -4
  222. data/test/controllers/release_statuses_controller_test.rb +1 -0
  223. data/test/controllers/repositories_controller_test.rb +6 -5
  224. data/test/controllers/rollbacks_controller_test.rb +3 -2
  225. data/test/controllers/stacks_controller_test.rb +8 -6
  226. data/test/controllers/status_controller_test.rb +1 -0
  227. data/test/controllers/tasks_controller_test.rb +13 -5
  228. data/test/controllers/webhooks_controller_test.rb +10 -9
  229. data/test/dummy/config/application.rb +2 -1
  230. data/test/dummy/config/initializers/0_load_development_secrets.rb +2 -2
  231. data/test/dummy/config/secrets.development.json +3 -0
  232. data/test/dummy/config/secrets.test.json +21 -0
  233. data/test/dummy/db/schema.rb +33 -6
  234. data/test/fixtures/shipit/commits.yml +7 -7
  235. data/test/fixtures/shipit/stacks.yml +4 -10
  236. data/test/fixtures/shipit/tasks.yml +3 -3
  237. data/test/helpers/api_helper.rb +2 -3
  238. data/test/helpers/fixture_aliases_helper.rb +1 -0
  239. data/test/helpers/hooks_helper.rb +1 -0
  240. data/test/helpers/json_helper.rb +4 -3
  241. data/test/helpers/links_helper.rb +2 -1
  242. data/test/helpers/payloads_helper.rb +1 -0
  243. data/test/helpers/queries_helper.rb +4 -3
  244. data/test/jobs/cache_deploy_spec_job_test.rb +3 -2
  245. data/test/jobs/chunk_rollup_job_test.rb +3 -2
  246. data/test/jobs/deliver_hook_job_test.rb +1 -0
  247. data/test/jobs/destroy_repository_job_test.rb +1 -0
  248. data/test/jobs/destroy_stack_job_test.rb +12 -0
  249. data/test/jobs/emit_event_job_test.rb +1 -0
  250. data/test/jobs/fetch_commit_stats_job_test.rb +1 -0
  251. data/test/jobs/fetch_deployed_revision_job_test.rb +1 -0
  252. data/test/jobs/github_sync_job_test.rb +22 -21
  253. data/test/jobs/mark_deploy_healthy_job_test.rb +1 -0
  254. data/test/jobs/perform_task_job_test.rb +3 -3
  255. data/test/jobs/process_merge_requests_job_test.rb +7 -6
  256. data/test/jobs/purge_old_deliveries_job_test.rb +1 -0
  257. data/test/jobs/reap_dead_tasks_job_test.rb +1 -0
  258. data/test/jobs/refresh_github_user_job_test.rb +1 -0
  259. data/test/jobs/refresh_status_job_test.rb +1 -0
  260. data/test/jobs/shipit/background_job_test.rb +35 -0
  261. data/test/jobs/shipit/continuous_delivery_job_test.rb +31 -0
  262. data/test/jobs/unique_job_test.rb +3 -1
  263. data/test/jobs/update_github_last_deployed_ref_job_test.rb +1 -0
  264. data/test/middleware/same_site_cookie_middleware_test.rb +2 -2
  265. data/test/models/api_client_test.rb +1 -0
  266. data/test/models/commit_checks_test.rb +2 -1
  267. data/test/models/commit_deployment_status_test.rb +2 -2
  268. data/test/models/commit_deployment_test.rb +4 -3
  269. data/test/models/commits_test.rb +72 -70
  270. data/test/models/delivery_test.rb +3 -2
  271. data/test/models/deploy_spec_test.rb +113 -109
  272. data/test/models/deploy_stats_test.rb +1 -0
  273. data/test/models/deploys_test.rb +65 -56
  274. data/test/models/duration_test.rb +1 -1
  275. data/test/models/github_hook_test.rb +1 -0
  276. data/test/models/hook_test.rb +7 -4
  277. data/test/models/membership_test.rb +1 -0
  278. data/test/models/merge_request_test.rb +26 -20
  279. data/test/models/release_statuses_test.rb +2 -1
  280. data/test/models/rollbacks_test.rb +4 -3
  281. data/test/models/shipit/check_run_test.rb +16 -15
  282. data/test/models/shipit/continuous_delivery_schedule_test.rb +109 -0
  283. data/test/models/shipit/deploy_spec/file_system_test.rb +54 -10
  284. data/test/models/shipit/pull_request_test.rb +9 -9
  285. data/test/models/shipit/repository_test.rb +3 -2
  286. data/test/models/shipit/review_stack_provisioning_queue_test.rb +2 -2
  287. data/test/models/shipit/{stacks_test.rb → stack_test.rb} +48 -34
  288. data/test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb +36 -34
  289. data/test/models/shipit/webhooks/handlers/pull_request/label_capturing_handler_test.rb +28 -28
  290. data/test/models/shipit/webhooks/handlers/pull_request/labeled_handler_test.rb +42 -42
  291. data/test/models/shipit/webhooks/handlers/pull_request/opened_handler_test.rb +33 -33
  292. data/test/models/shipit/webhooks/handlers/pull_request/reopened_handler_test.rb +37 -37
  293. data/test/models/shipit/webhooks/handlers/pull_request/review_stack_adapter_test.rb +1 -1
  294. data/test/models/shipit/webhooks/handlers/pull_request/unlabeled_handler_test.rb +44 -42
  295. data/test/models/shipit/webhooks/handlers_test.rb +1 -0
  296. data/test/models/status/group_test.rb +3 -2
  297. data/test/models/status/missing_test.rb +1 -0
  298. data/test/models/status_test.rb +2 -1
  299. data/test/models/task_definitions_test.rb +7 -6
  300. data/test/models/tasks_test.rb +5 -4
  301. data/test/models/team_test.rb +5 -4
  302. data/test/models/undeployed_commits_test.rb +10 -9
  303. data/test/models/users_test.rb +29 -20
  304. data/test/test_command_integration.rb +1 -1
  305. data/test/test_helper.rb +12 -10
  306. data/test/unit/anonymous_user_serializer_test.rb +1 -0
  307. data/test/unit/command_test.rb +10 -1
  308. data/test/unit/commands_test.rb +1 -0
  309. data/test/unit/commit_serializer_test.rb +1 -0
  310. data/test/unit/csv_serializer_test.rb +3 -2
  311. data/test/unit/deploy_commands_test.rb +33 -23
  312. data/test/unit/deploy_serializer_test.rb +1 -0
  313. data/test/unit/environment_variables_test.rb +2 -1
  314. data/test/unit/github_app_test.rb +11 -10
  315. data/test/unit/github_apps_test.rb +19 -18
  316. data/test/unit/github_url_helper_test.rb +1 -0
  317. data/test/unit/line_buffer_test.rb +1 -1
  318. data/test/unit/rollback_commands_test.rb +2 -1
  319. data/test/unit/shipit_helper_test.rb +1 -0
  320. data/test/unit/shipit_test.rb +47 -1
  321. data/test/unit/user_serializer_test.rb +1 -0
  322. data/test/unit/variable_definition_test.rb +4 -3
  323. metadata +61 -47
@@ -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,9 +1,10 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
  require 'securerandom'
4
5
 
5
6
  module Shipit
6
- class StacksTest < ActiveSupport::TestCase
7
+ class StackTest < ActiveSupport::TestCase
7
8
  def setup
8
9
  @stack = shipit_stacks(:shipit)
9
10
  @expected_base_path = Rails.root.join('data', 'stacks', @stack.to_param).to_s
@@ -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
@@ -704,12 +705,12 @@ module Shipit
704
705
  assert_equal shipit_commits(:fifth), @stack.next_commit_to_deploy
705
706
  end
706
707
 
707
- test "#next_commit_to_deploy respects the deploy.max_commits directive" do
708
+ test "#next_commit_to_deploy respects the deploy.max_commits directive given the commit is deployable" do
708
709
  @stack.tasks.destroy_all
709
710
 
710
- fifth_commit = shipit_commits(:third)
711
- fifth_commit.statuses.create!(stack_id: @stack.id, state: 'success', context: 'ci/travis')
712
- assert_predicate fifth_commit, :deployable?
711
+ third_commit = shipit_commits(:third)
712
+ third_commit.statuses.create!(stack_id: @stack.id, state: 'success', context: 'ci/travis')
713
+ assert_predicate third_commit, :deployable?
713
714
 
714
715
  assert_equal shipit_commits(:third), @stack.next_commit_to_deploy
715
716
 
@@ -717,6 +718,19 @@ module Shipit
717
718
  assert_equal shipit_commits(:third), @stack.next_commit_to_deploy
718
719
  end
719
720
 
721
+ test "#next_commit_to_deploy deploys the first deployable commit when deploy.max_commits directive fails to find a deployable commit" do
722
+ @stack.tasks.destroy_all
723
+
724
+ third_commit = shipit_commits(:third)
725
+ third_commit.statuses.create!(stack_id: @stack.id, state: 'success', context: 'ci/travis')
726
+ assert_predicate third_commit, :deployable?
727
+
728
+ assert_equal shipit_commits(:third), @stack.next_commit_to_deploy
729
+
730
+ @stack.expects(:maximum_commits_per_deploy).returns(1).at_least_once
731
+ assert_equal shipit_commits(:third), @stack.next_commit_to_deploy
732
+ end
733
+
720
734
  test "setting #lock_reason also sets #locked_since" do
721
735
  assert_predicate @stack.locked_since, :nil?
722
736
 
@@ -802,7 +816,7 @@ module Shipit
802
816
  assert !commits.empty?
803
817
  commits.each { |c| refute_predicate c, :deployable? }
804
818
 
805
- assert_nil @stack.next_expected_commit_to_deploy(commits: commits)
819
+ assert_nil @stack.next_expected_commit_to_deploy(commits:)
806
820
  end
807
821
 
808
822
  test "#next_expected_commit_to_deploy returns nil if all deployable commits are active" do
@@ -812,7 +826,7 @@ module Shipit
812
826
  assert !commits.empty?
813
827
  commits.each { |c| assert_predicate c, :active? }
814
828
 
815
- assert_nil @stack.next_expected_commit_to_deploy(commits: commits)
829
+ assert_nil @stack.next_expected_commit_to_deploy(commits:)
816
830
  end
817
831
 
818
832
  test "#next_expected_commit_to_deploy returns nil if there are no commits" do
@@ -825,7 +839,7 @@ module Shipit
825
839
 
826
840
  assert !commits.empty?
827
841
 
828
- most_recent_limited = @stack.next_expected_commit_to_deploy(commits: commits)
842
+ most_recent_limited = @stack.next_expected_commit_to_deploy(commits:)
829
843
  most_recent = commits.find { |c| !c.active? && c.deployable? }
830
844
 
831
845
  assert most_recent.id > most_recent_limited.id
@@ -844,16 +858,16 @@ module Shipit
844
858
  test "#lock_reverted_commits! locks all commits between the original and reverted commits" do
845
859
  reverted_commit = @stack.undeployed_commits.first
846
860
  revert_author = shipit_users(:bob)
847
- generate_revert_commit(stack: @stack, reverted_commit: reverted_commit, author: revert_author)
861
+ generate_revert_commit(stack: @stack, reverted_commit:, author: revert_author)
848
862
  @stack.reload
849
863
 
850
864
  assert_equal(
851
865
  [
852
866
  ['Revert "whoami"', false, nil],
853
867
  ["whoami", false, nil],
854
- ["fix all the things", false, nil],
868
+ ["fix all the things", false, nil]
855
869
  ],
856
- @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] }
857
871
  )
858
872
 
859
873
  @stack.lock_reverted_commits!
@@ -863,27 +877,27 @@ module Shipit
863
877
  [
864
878
  ['Revert "whoami"', false, nil],
865
879
  ["whoami", true, revert_author.id],
866
- ["fix all the things", false, nil],
880
+ ["fix all the things", false, nil]
867
881
  ],
868
- @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] }
869
883
  )
870
884
  end
871
885
 
872
886
  test "#lock_reverted_commits! is a no-op if the reverted commit has already shipped" do
873
887
  reverted_commit = shipit_commits(:first)
874
888
  revert_author = shipit_users(:bob)
875
- generate_revert_commit(stack: @stack, reverted_commit: reverted_commit, author: revert_author)
889
+ generate_revert_commit(stack: @stack, reverted_commit:, author: revert_author)
876
890
  @stack.reload
877
891
 
878
892
  initial_state = [
879
893
  ['Revert "lets go"', false, nil],
880
894
  ["whoami", false, nil],
881
- ["fix all the things", false, nil],
895
+ ["fix all the things", false, nil]
882
896
  ]
883
897
 
884
898
  assert_equal(
885
899
  initial_state,
886
- @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] }
887
901
  )
888
902
 
889
903
  @stack.lock_reverted_commits!
@@ -891,7 +905,7 @@ module Shipit
891
905
 
892
906
  assert_equal(
893
907
  initial_state,
894
- @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] }
895
909
  )
896
910
  end
897
911
 
@@ -909,9 +923,9 @@ module Shipit
909
923
  ['Revert "whoami"', false, nil],
910
924
  ['Revert "fix all the things"', false, nil],
911
925
  ["whoami", false, nil],
912
- ["fix all the things", false, nil],
926
+ ["fix all the things", false, nil]
913
927
  ],
914
- @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] }
915
929
  )
916
930
 
917
931
  @stack.lock_reverted_commits!
@@ -922,9 +936,9 @@ module Shipit
922
936
  ['Revert "whoami"', false, nil],
923
937
  ['Revert "fix all the things"', true, second_revert_author.id],
924
938
  ["whoami", true, first_revert_author.id],
925
- ["fix all the things", true, first_revert_author.id],
939
+ ["fix all the things", true, first_revert_author.id]
926
940
  ],
927
- @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] }
928
942
  )
929
943
  end
930
944
 
@@ -949,16 +963,16 @@ module Shipit
949
963
  @stack.cached_deploy_spec = create_deploy_spec(
950
964
  "links" => {
951
965
  "logs" => "http://logs.$GITHUB_REPO_NAME.$ENVIRONMENT.domain.com",
952
- "monitoring" => "https://graphs.$GITHUB_REPO_NAME.$ENVIRONMENT.domain.com",
953
- },
966
+ "monitoring" => "https://graphs.$GITHUB_REPO_NAME.$ENVIRONMENT.domain.com"
967
+ }
954
968
  )
955
969
 
956
970
  assert_equal(
957
971
  {
958
972
  "logs" => "http://logs.expected-repository-name.expected-environment.domain.com",
959
- "monitoring" => "https://graphs.expected-repository-name.expected-environment.domain.com",
973
+ "monitoring" => "https://graphs.expected-repository-name.expected-environment.domain.com"
960
974
  },
961
- @stack.links,
975
+ @stack.links
962
976
  )
963
977
  end
964
978
 
@@ -969,12 +983,12 @@ module Shipit
969
983
  'GITHUB_REPO_OWNER' => @stack.repository.owner,
970
984
  'GITHUB_REPO_NAME' => @stack.repository.name,
971
985
  'DEPLOY_URL' => @stack.deploy_url,
972
- 'BRANCH' => @stack.branch,
986
+ 'BRANCH' => @stack.branch
973
987
  }
974
988
 
975
989
  assert_equal(
976
990
  @stack.env,
977
- expected_environment,
991
+ expected_environment
978
992
  )
979
993
  end
980
994
 
@@ -1000,10 +1014,10 @@ module Shipit
1000
1014
  stack.commits.create(
1001
1015
  sha: SecureRandom.hex(20),
1002
1016
  message: "Revert \"#{reverted_commit.message_header}\"",
1003
- author: author,
1017
+ author:,
1004
1018
  committer: author,
1005
1019
  authored_at: Time.zone.now,
1006
- committed_at: Time.zone.now,
1020
+ committed_at: Time.zone.now
1007
1021
  )
1008
1022
  end
1009
1023