rocketjob_mission_control 4.3.0 → 6.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/Rakefile +12 -13
  4. data/app/assets/config/manifest.js +3 -0
  5. data/app/assets/javascripts/rocket_job_mission_control/application.js +2 -4
  6. data/app/assets/javascripts/rocket_job_mission_control/nested_fields.js +112 -0
  7. data/app/assets/stylesheets/rocket_job_mission_control/{application.scss → application.css} +9 -9
  8. data/app/assets/stylesheets/rocket_job_mission_control/base.css +420 -0
  9. data/app/assets/stylesheets/rocket_job_mission_control/{callout.scss → callout.css} +50 -52
  10. data/app/assets/stylesheets/rocket_job_mission_control/jobs.css +57 -0
  11. data/app/assets/stylesheets/rocket_job_mission_control/worker_processes.css +7 -0
  12. data/app/controllers/rocket_job_mission_control/application_controller.rb +2 -3
  13. data/app/controllers/rocket_job_mission_control/dirmon_entries_controller.rb +53 -33
  14. data/app/controllers/rocket_job_mission_control/jobs_controller.rb +78 -37
  15. data/app/controllers/rocket_job_mission_control/servers_controller.rb +32 -38
  16. data/app/datatables/rocket_job_mission_control/abstract_datatable.rb +8 -6
  17. data/app/datatables/rocket_job_mission_control/active_workers_datatable.rb +5 -5
  18. data/app/datatables/rocket_job_mission_control/dirmon_entries_datatable.rb +4 -4
  19. data/app/datatables/rocket_job_mission_control/jobs_datatable.rb +55 -62
  20. data/app/datatables/rocket_job_mission_control/servers_datatable.rb +13 -14
  21. data/app/helpers/rocket_job_mission_control/application_helper.rb +70 -52
  22. data/app/helpers/rocket_job_mission_control/dirmon_entries_helper.rb +8 -0
  23. data/app/helpers/rocket_job_mission_control/jobs_helper.rb +80 -13
  24. data/app/helpers/rocket_job_mission_control/pagination_helper.rb +1 -1
  25. data/app/helpers/rocket_job_mission_control/servers_helper.rb +6 -6
  26. data/app/helpers/rocket_job_mission_control/slices_helper.rb +2 -4
  27. data/app/models/rocket_job_mission_control/access_policy.rb +3 -4
  28. data/app/models/rocket_job_mission_control/authorization.rb +3 -2
  29. data/app/models/rocket_job_mission_control/dirmon_sanitizer.rb +68 -0
  30. data/app/models/rocket_job_mission_control/job_sanitizer.rb +48 -16
  31. data/app/models/rocket_job_mission_control/query.rb +2 -5
  32. data/app/views/rocket_job_mission_control/dirmon_entries/_form.html.erb +78 -42
  33. data/app/views/rocket_job_mission_control/dirmon_entries/_input_categories.html.erb +59 -0
  34. data/app/views/rocket_job_mission_control/dirmon_entries/_input_category_fields.html.erb +56 -0
  35. data/app/views/rocket_job_mission_control/dirmon_entries/_output_categories.html.erb +44 -0
  36. data/app/views/rocket_job_mission_control/dirmon_entries/_output_category_fields.html.erb +36 -0
  37. data/app/views/rocket_job_mission_control/dirmon_entries/_status.html.erb +22 -16
  38. data/app/views/rocket_job_mission_control/dirmon_entries/copy.html.erb +4 -0
  39. data/app/views/rocket_job_mission_control/dirmon_entries/edit.html.erb +7 -3
  40. data/app/views/rocket_job_mission_control/dirmon_entries/show.html.erb +8 -5
  41. data/app/views/rocket_job_mission_control/jobs/_attributes.html.erb +89 -0
  42. data/app/views/rocket_job_mission_control/jobs/_dates.html.erb +39 -0
  43. data/app/views/rocket_job_mission_control/jobs/_details.html.erb +86 -0
  44. data/app/views/rocket_job_mission_control/jobs/_exception.html.erb +33 -0
  45. data/app/views/rocket_job_mission_control/jobs/_exceptions.html.erb +1 -1
  46. data/app/views/rocket_job_mission_control/jobs/_input_categories.html.erb +126 -0
  47. data/app/views/rocket_job_mission_control/jobs/_input_category_fields.html.erb +56 -0
  48. data/app/views/rocket_job_mission_control/jobs/_output_categories.html.erb +60 -0
  49. data/app/views/rocket_job_mission_control/jobs/_output_category_fields.html.erb +36 -0
  50. data/app/views/rocket_job_mission_control/jobs/_retryable.html.erb +27 -0
  51. data/app/views/rocket_job_mission_control/jobs/_status.html.erb +21 -49
  52. data/app/views/rocket_job_mission_control/jobs/edit.html.erb +28 -0
  53. data/app/views/rocket_job_mission_control/jobs/edit_slice.html.erb +1 -1
  54. data/app/views/rocket_job_mission_control/jobs/exception.html.erb +1 -1
  55. data/app/views/rocket_job_mission_control/jobs/index.html.erb +24 -18
  56. data/app/views/rocket_job_mission_control/jobs/show.html.erb +32 -58
  57. data/app/views/rocket_job_mission_control/jobs/view_slice.html.erb +4 -4
  58. data/app/views/rocket_job_mission_control/servers/index.html.erb +2 -2
  59. data/config/initializers/assets.rb +5 -8
  60. data/config/locales/en.yml +3 -0
  61. data/config/routes.rb +24 -21
  62. data/lib/rocket_job_mission_control/engine.rb +6 -9
  63. data/lib/rocket_job_mission_control/version.rb +1 -1
  64. data/lib/rocketjob_mission_control.rb +1 -1
  65. data/test/compare_hashes.rb +1 -2
  66. data/test/controllers/rocket_job_mission_control/application_controller_test.rb +13 -21
  67. data/test/controllers/rocket_job_mission_control/dirmon_entries_controller_test.rb +124 -157
  68. data/test/controllers/rocket_job_mission_control/jobs_controller_test.rb +103 -127
  69. data/test/controllers/rocket_job_mission_control/servers_controller_test.rb +66 -103
  70. data/test/helpers/rocket_job_mission_control/application_helper_test.rb +13 -14
  71. data/test/helpers/rocket_job_mission_control/jobs_helper_test.rb +31 -31
  72. data/test/helpers/rocket_job_mission_control/pagination_helper_test.rb +7 -9
  73. data/test/helpers/rocket_job_mission_control/servers_helper_test.rb +15 -15
  74. data/test/helpers/rocket_job_mission_control/slices_helper_test.rb +8 -10
  75. data/test/models/rocket_job_mission_control/dirmon_sanitizer_test.rb +146 -0
  76. data/test/models/rocket_job_mission_control/job_sanitizer_test.rb +47 -42
  77. data/test/models/rocket_job_mission_control/query_test.rb +26 -28
  78. data/test/test_helper.rb +9 -15
  79. data/vendor/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  80. data/vendor/assets/fonts/glyphicons-halflings-regular.svg +288 -0
  81. data/vendor/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  82. data/vendor/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  83. data/vendor/assets/fonts/glyphicons-halflings-regular.woff2 +0 -0
  84. data/vendor/assets/javascripts/datatables.min.js +881 -0
  85. data/vendor/assets/stylesheets/bootstrap.min.css.erb +6 -0
  86. data/vendor/assets/stylesheets/datatables.min.css +141 -0
  87. metadata +61 -65
  88. data/app/assets/stylesheets/rocket_job_mission_control/base.scss +0 -436
  89. data/app/assets/stylesheets/rocket_job_mission_control/bootstrap_and_overrides.scss +0 -488
  90. data/app/assets/stylesheets/rocket_job_mission_control/jobs.scss +0 -72
  91. data/app/assets/stylesheets/rocket_job_mission_control/worker_processes.scss +0 -9
  92. data/vendor/assets/stylesheets/bootstrap.min.css +0 -6
@@ -12,56 +12,59 @@ module RocketJobMissionControl
12
12
 
13
13
  rescue_from AccessGranted::AccessDenied do |exception|
14
14
  raise exception if Rails.env.development? || Rails.env.test?
15
- redirect_to :back, alert: 'Access not authorized.'
15
+
16
+ redirect_to :back, alert: "Access not authorized."
16
17
  end
17
18
 
18
19
  def index
19
- @data_table_url = servers_url(format: 'json')
20
- @actions = [:pause, :resume, :stop, :kill, :destroy_zombies]
21
- render_datatable(RocketJob::Server.all, 'All')
20
+ @data_table_url = servers_url(format: "json")
21
+ @actions = %i[pause resume stop kill destroy_zombies]
22
+ render_datatable(RocketJob::Server.all, "All")
22
23
  end
23
24
 
24
25
  def starting
25
- @data_table_url = starting_servers_url(format: 'json')
26
- @actions = [:pause, :stop, :kill]
27
- render_datatable(RocketJob::Server.starting, 'Starting')
26
+ @data_table_url = starting_servers_url(format: "json")
27
+ @actions = %i[pause stop kill]
28
+ render_datatable(RocketJob::Server.starting, "Starting")
28
29
  end
29
30
 
30
31
  def running
31
- @data_table_url = running_servers_url(format: 'json')
32
- @actions = [:pause, :stop, :kill, :destroy_zombies]
33
- render_datatable(RocketJob::Server.running, 'Running')
32
+ @data_table_url = running_servers_url(format: "json")
33
+ @actions = %i[pause stop kill destroy_zombies]
34
+ render_datatable(RocketJob::Server.running, "Running")
34
35
  end
35
36
 
36
37
  def paused
37
- @data_table_url = paused_servers_url(format: 'json')
38
- @actions = [:resume, :destroy_zombies]
39
- render_datatable(RocketJob::Server.paused, 'Paused')
38
+ @data_table_url = paused_servers_url(format: "json")
39
+ @actions = %i[resume destroy_zombies]
40
+ render_datatable(RocketJob::Server.paused, "Paused")
40
41
  end
41
42
 
42
43
  def stopping
43
- @data_table_url = stopping_servers_url(format: 'json')
44
+ @data_table_url = stopping_servers_url(format: "json")
44
45
  @actions = [:destroy_zombies]
45
- render_datatable(RocketJob::Server.stopping, 'Stopping')
46
+ render_datatable(RocketJob::Server.stopping, "Stopping")
46
47
  end
47
48
 
48
49
  def zombie
49
- @data_table_url = zombie_servers_url(format: 'json')
50
+ @data_table_url = zombie_servers_url(format: "json")
50
51
  @actions = [:destroy_zombies]
51
- render_datatable(RocketJob::Server.zombies, 'Zombie')
52
+ render_datatable(RocketJob::Server.zombies, "Zombie")
52
53
  end
53
54
 
54
- VALID_ACTIONS = [:stop, :kill, :pause, :resume, :thread_dump]
55
+ VALID_ACTIONS = %i[stop kill pause resume thread_dump].freeze
55
56
 
56
57
  def update_all
57
- authorize! :update_all, RocketJob::Server
58
58
  server_action = params[:server_action].to_sym
59
+ authorize! server_action, RocketJob::Server
60
+
59
61
  if server_action == :destroy_zombies
60
62
  RocketJob::Server.destroy_zombies
61
63
  elsif VALID_ACTIONS.include?(server_action)
62
64
  RocketJob::Subscribers::Server.publish(server_action)
65
+ flash[:notice] = t(:success, scope: %i[server update_all], action: server_action.to_s)
63
66
  else
64
- flash[:alert] = t(:invalid, scope: [:server, :update_all])
67
+ flash[:alert] = t(:invalid, scope: %i[server update_all])
65
68
  end
66
69
 
67
70
  # TODO: Refresh the same page it was on
@@ -72,11 +75,8 @@ module RocketJobMissionControl
72
75
 
73
76
  def stop
74
77
  authorize! :stop, @server
75
- if @server.may_stop?
76
- @server.stop!
77
- else
78
- flash[:alert] = t(:failure, scope: [:server, :stop])
79
- end
78
+ RocketJob::Subscribers::Server.publish(:stop, server_id: @server.id)
79
+ flash[:notice] = t(:success, scope: %i[server update_one], action: "stop", name: @server.name)
80
80
 
81
81
  respond_to do |format|
82
82
  format.html { redirect_to servers_path }
@@ -86,7 +86,7 @@ module RocketJobMissionControl
86
86
  def destroy
87
87
  authorize! :destroy, @server
88
88
  @server.destroy
89
- flash[:notice] = t(:success, scope: [:server, :destroy])
89
+ flash[:notice] = t(:success, scope: %i[server destroy])
90
90
 
91
91
  respond_to do |format|
92
92
  format.html { redirect_to servers_path }
@@ -95,11 +95,8 @@ module RocketJobMissionControl
95
95
 
96
96
  def pause
97
97
  authorize! :pause, @server
98
- if @server.may_pause?
99
- @server.pause!
100
- else
101
- flash[:alert] = t(:failure, scope: [:server, :pause])
102
- end
98
+ RocketJob::Subscribers::Server.publish(:pause, server_id: @server.id)
99
+ flash[:notice] = t(:success, scope: %i[server update_one], action: "pause", name: @server.name)
103
100
 
104
101
  respond_to do |format|
105
102
  format.html { redirect_to servers_path }
@@ -108,11 +105,8 @@ module RocketJobMissionControl
108
105
 
109
106
  def resume
110
107
  authorize! :resume, @server
111
- if @server.may_resume?
112
- @server.resume!
113
- else
114
- flash[:alert] = t(:failure, scope: [:server, :resume])
115
- end
108
+ RocketJob::Subscribers::Server.publish(:resume, server_id: @server.id)
109
+ flash[:notice] = t(:success, scope: %i[server update_one], action: "resume", name: @server.name)
116
110
 
117
111
  respond_to do |format|
118
112
  format.html { redirect_to servers_path }
@@ -130,7 +124,7 @@ module RocketJobMissionControl
130
124
  format.html do
131
125
  @description = description
132
126
  @states = RocketJob::Server.aasm.states.map { |s| s.name.to_s }
133
- @states << 'zombie'
127
+ @states << "zombie"
134
128
 
135
129
  @server_counts = RocketJob::Server.counts_by_state
136
130
  # TODO: Move into RocketJob
@@ -146,7 +140,7 @@ module RocketJobMissionControl
146
140
 
147
141
  def find_server_or_redirect
148
142
  unless @server = RocketJob::Server.where(id: params[:id]).first
149
- flash[:alert] = t(:failure, scope: [:server, :find], id: params[:id])
143
+ flash[:alert] = t(:failure, scope: %i[server find], id: params[:id])
150
144
 
151
145
  redirect_to(servers_path)
152
146
  end
@@ -1,7 +1,7 @@
1
1
  module RocketJobMissionControl
2
2
  class AbstractDatatable
3
3
  delegate :params, :link_to, :render, to: :@view
4
- delegate :h, to: 'ERB::Util'
4
+ delegate :h, to: "ERB::Util"
5
5
 
6
6
  attr_accessor :view, :query
7
7
 
@@ -11,7 +11,7 @@ module RocketJobMissionControl
11
11
  extract_query_params
12
12
  end
13
13
 
14
- def as_json(options = {})
14
+ def as_json(_options = {})
15
15
  {
16
16
  draw: params[:draw].to_i,
17
17
  recordsTotal: query.unfiltered_count,
@@ -39,7 +39,7 @@ module RocketJobMissionControl
39
39
  end
40
40
 
41
41
  # Pagination
42
- unless params[:length].present? && params[:length] == '-1'
42
+ unless params[:length].present? && params[:length] == "-1"
43
43
  query.start = params[:start].to_i
44
44
  query.page_size = params.fetch(:length, 10).to_i
45
45
  end
@@ -49,13 +49,15 @@ module RocketJobMissionControl
49
49
  return nil unless order.present?
50
50
 
51
51
  sort_by = {}
52
- order.each_pair do |key, value|
52
+ order.each_pair do |_key, value|
53
53
  name = query.display_columns[value[:column].to_i]
54
- raise(ArgumentError, "Invalid column id: #{value[:column]}. Must fit #{query.display_columns.inspect}") unless name.present?
54
+ unless name.present?
55
+ raise(ArgumentError, "Invalid column id: #{value[:column]}. Must fit #{query.display_columns.inspect}")
56
+ end
57
+
55
58
  sort_by[name] = value[:dir]
56
59
  end
57
60
  sort_by
58
61
  end
59
-
60
62
  end
61
63
  end
@@ -10,11 +10,11 @@ module RocketJobMissionControl
10
10
 
11
11
  def map(active_worker)
12
12
  {
13
- '0' => worker_name_with_icon(active_worker, active_worker.job),
14
- '1' => job_name_with_link(active_worker.job.class.name, active_worker.job.id),
15
- '2' => h(active_worker.job.description.try!(:truncate, 50)),
16
- '3' => h("#{active_worker.duration} ago"),
17
- 'DT_RowClass' => 'card callout callout-running'
13
+ "0" => worker_name_with_icon(active_worker, active_worker.job),
14
+ "1" => job_name_with_link(active_worker.job.class.name, active_worker.job.id),
15
+ "2" => h(active_worker.job.description.try!(:truncate, 50)),
16
+ "3" => h("#{active_worker.duration} ago"),
17
+ "DT_RowClass" => "card callout callout-running"
18
18
  }
19
19
  end
20
20
 
@@ -6,10 +6,10 @@ module RocketJobMissionControl
6
6
 
7
7
  def map(dirmon)
8
8
  {
9
- '0' => name_with_link(dirmon),
10
- '1' => h(dirmon.job_class_name),
11
- '2' => h(dirmon.pattern.try(:truncate, 80)),
12
- 'DT_RowClass' => "card callout callout-#{dirmon.state}"
9
+ "0" => name_with_link(dirmon),
10
+ "1" => h(dirmon.job_class_name),
11
+ "2" => h(dirmon.pattern.try(:truncate, 80)),
12
+ "DT_RowClass" => "card callout callout-#{dirmon.state}"
13
13
  }
14
14
  end
15
15
 
@@ -4,68 +4,68 @@ module RocketJobMissionControl
4
4
  :abort_job_path, :job_path, :fail_job_path, :run_now_job_path, :pause_job_path,
5
5
  :resume_job_path, :retry_job_path, :exception_job_path, :job_action_link, :exceptions_job_path, to: :@view
6
6
 
7
- COMMON_FIELDS = [:id, :_type, :description, :completed_at, :created_at, :started_at, :state, :worker_name, :login].freeze
7
+ COMMON_FIELDS = %i[id _type description completed_at created_at started_at state worker_name login].freeze
8
8
 
9
9
  ABORTED_COLUMNS = [
10
- {display: 'Class', value: :class_with_link, field: '_type', width: '30%'},
11
- {display: 'Description', value: :description, field: 'description', width: '30%'},
12
- {display: 'Aborted', value: :completed_ago, field: 'completed_at'},
13
- {display: 'Actions', value: :action_buttons, orderable: false}
14
- ]
10
+ {display: "Class", value: :class_with_link, field: "_type", width: "30%"},
11
+ {display: "Description", value: :description, field: "description", width: "30%"},
12
+ {display: "Aborted", value: :completed_ago, field: "completed_at"},
13
+ {display: "Actions", value: :action_buttons, orderable: false}
14
+ ].freeze
15
15
 
16
16
  COMPLETED_COLUMNS = [
17
- {display: 'Class', value: :class_with_link, field: '_type', width: '30%'},
18
- {display: 'Description', value: :description, field: 'description', width: '30%'},
19
- {display: 'Duration', value: :duration, field: 'duration', orderable: false},
20
- {display: 'Completed', value: :completed_ago, field: 'completed_at'},
21
- {display: 'Actions', value: :action_buttons, orderable: false}
22
- ]
17
+ {display: "Class", value: :class_with_link, field: "_type", width: "30%"},
18
+ {display: "Description", value: :description, field: "description", width: "30%"},
19
+ {display: "Duration", value: :duration, field: "duration", orderable: false},
20
+ {display: "Completed", value: :completed_ago, field: "completed_at"},
21
+ {display: "Actions", value: :action_buttons, orderable: false}
22
+ ].freeze
23
23
 
24
24
  FAILED_COLUMNS = ABORTED_COLUMNS.deep_dup
25
- FAILED_COLUMNS[2][:display] = 'Failed'
25
+ FAILED_COLUMNS[2][:display] = "Failed"
26
26
 
27
27
  PAUSED_COLUMNS = ABORTED_COLUMNS.deep_dup
28
- PAUSED_COLUMNS[2][:display] = 'Paused'
28
+ PAUSED_COLUMNS[2][:display] = "Paused"
29
29
 
30
30
  QUEUED_COLUMNS = [
31
- {display: 'Class', value: :class_with_link, field: '_type'},
32
- {display: 'Description', value: :description, field: 'description'},
33
- {display: 'Record Count', value: :record_count, field: 'record_count'},
34
- {display: 'Priority', value: :priority, field: 'priority'},
35
- {display: 'Queued For', value: :duration, field: 'duration', orderable: false},
36
- {display: 'Actions', value: :action_buttons, orderable: false}
37
- ]
38
- QUEUED_FIELDS = (COMMON_FIELDS + [:record_count, :run_at, :priority]).freeze
31
+ {display: "Class", value: :class_with_link, field: "_type"},
32
+ {display: "Description", value: :description, field: "description"},
33
+ {display: "Record Count", value: :record_count, field: "record_count"},
34
+ {display: "Priority", value: :priority, field: "priority"},
35
+ {display: "Queued For", value: :duration, field: "duration", orderable: false},
36
+ {display: "Actions", value: :action_buttons, orderable: false}
37
+ ].freeze
38
+ QUEUED_FIELDS = (COMMON_FIELDS + %i[record_count run_at priority]).freeze
39
39
 
40
40
  RUNNING_COLUMNS = [
41
- {display: 'Class', value: :class_with_link, field: '_type'},
42
- {display: 'Description', value: :description, field: 'description'},
43
- {display: 'Record Count', value: :record_count, field: 'record_count'},
44
- {display: 'Progress', value: :progress, field: 'percent_complete', orderable: false},
45
- {display: 'Workers', value: :worker_count, field: 'worker_count', orderable: false},
46
- {display: 'Priority', value: :priority, field: 'priority'},
47
- {display: 'Started', value: :started, field: 'started_at'},
48
- {display: 'Actions', value: :action_buttons, orderable: false}
49
- ]
50
- RUNNING_FIELDS = (COMMON_FIELDS + [:record_count, :collect_output, :input_categories, :output_categories, :encrypt, :compress, :slice_size, :priority, :sub_state, :percent_complete]).freeze
41
+ {display: "Class", value: :class_with_link, field: "_type"},
42
+ {display: "Description", value: :description, field: "description"},
43
+ {display: "Record Count", value: :record_count, field: "record_count"},
44
+ {display: "Progress", value: :progress, field: "percent_complete", orderable: false},
45
+ {display: "Workers", value: :worker_count, field: "worker_count", orderable: false},
46
+ {display: "Priority", value: :priority, field: "priority"},
47
+ {display: "Started", value: :started, field: "started_at"},
48
+ {display: "Actions", value: :action_buttons, orderable: false}
49
+ ].freeze
50
+ RUNNING_FIELDS = (COMMON_FIELDS + %i[record_count input_categories output_categories priority sub_state percent_complete]).freeze
51
51
 
52
52
  SCHEDULED_COLUMNS = [
53
- {display: 'Class', value: :class_with_link, field: '_type'},
54
- {display: 'Description', value: :description, field: 'description'},
55
- {display: 'Runs in', value: :time_till_run, field: 'run_at'},
56
- {display: 'Cron Schedule', value: :cron_schedule, field: 'cron_schedule'},
57
- {display: 'Actions', value: :action_buttons, orderable: false}
58
- ]
59
- SCHEDULED_FIELDS = (COMMON_FIELDS + [:run_at, :cron_schedule]).freeze
53
+ {display: "Class", value: :class_with_link, field: "_type"},
54
+ {display: "Description", value: :description, field: "description"},
55
+ {display: "Runs in", value: :time_till_run, field: "run_at"},
56
+ {display: "Cron Schedule", value: :cron_schedule, field: "cron_schedule"},
57
+ {display: "Actions", value: :action_buttons, orderable: false}
58
+ ].freeze
59
+ SCHEDULED_FIELDS = (COMMON_FIELDS + %i[run_at cron_schedule]).freeze
60
60
 
61
61
  ALL_COLUMNS = [
62
- {display: 'Class', value: :class_with_link, field: '_type'},
63
- {display: 'Description', value: :description, field: 'description'},
64
- {display: 'Created', value: :created_at, field: 'created_at'},
65
- {display: 'Duration', value: :duration, field: 'duration', orderable: false},
66
- {display: 'Actions', value: :action_buttons, orderable: false}
67
- ]
68
- ALL_FIELDS = (QUEUED_FIELDS + RUNNING_FIELDS + SCHEDULED_FIELDS).uniq.freeze
62
+ {display: "Class", value: :class_with_link, field: "_type"},
63
+ {display: "Description", value: :description, field: "description"},
64
+ {display: "Created", value: :created_at, field: "created_at"},
65
+ {display: "Duration", value: :duration, field: "duration", orderable: false},
66
+ {display: "Actions", value: :action_buttons, orderable: false}
67
+ ].freeze
68
+ ALL_FIELDS = (QUEUED_FIELDS + RUNNING_FIELDS + SCHEDULED_FIELDS).uniq.freeze
69
69
 
70
70
  def initialize(view, query, columns)
71
71
  @columns = columns
@@ -84,9 +84,9 @@ module RocketJobMissionControl
84
84
  h = {}
85
85
  @columns.each do |column|
86
86
  h[index.to_s] = send(column[:value], job)
87
- index += 1
87
+ index += 1
88
88
  end
89
- h['DT_RowClass'] = "card callout callout-#{job_state(job)}"
89
+ h["DT_RowClass"] = "card callout callout-#{job_state(job)}"
90
90
  h
91
91
  end
92
92
 
@@ -121,7 +121,7 @@ module RocketJobMissionControl
121
121
  end
122
122
 
123
123
  def record_count(job)
124
- job.attributes.key?('record_count') ? h(job.record_count) : 0
124
+ job.attributes.key?("record_count") ? h(job.record_count) : 0
125
125
  end
126
126
 
127
127
  def started(job)
@@ -141,7 +141,7 @@ module RocketJobMissionControl
141
141
  end
142
142
 
143
143
  def progress(job)
144
- if (sub_state = job.attributes['sub_state']) && [:before, :after].include?(sub_state)
144
+ if (sub_state = job.attributes["sub_state"]) && %i[before after].include?(sub_state)
145
145
  <<-EOS
146
146
  <div class="job-status">
147
147
  <div class="job-state">
@@ -162,27 +162,20 @@ module RocketJobMissionControl
162
162
  def action_buttons(job)
163
163
  events = valid_events(job)
164
164
  buttons = "<div class='inline-job-actions'>"
165
- if job.scheduled? && view.can?(:run_now, job)
166
- buttons += "#{ job_action_link('Run', run_now_job_path(job), :patch) }"
167
- end
165
+ buttons += job_action_link("Run", run_now_job_path(job), :patch).to_s if job.scheduled? && view.can?(:run_now, job)
168
166
  if events.include?(:pause) && job.pausable? && view.can?(:pause, job)
169
- buttons += "#{ job_action_link('Pause', pause_job_path(job), :patch) }"
167
+ buttons += job_action_link("Pause", pause_job_path(job), :patch).to_s
170
168
  end
171
169
  if events.include?(:resume) && view.can?(:resume, job)
172
- buttons += "#{ job_action_link('Resume', resume_job_path(job), :patch) }"
173
- end
174
- if events.include?(:retry) && view.can?(:retry, job)
175
- buttons += "#{ job_action_link('Retry', retry_job_path(job), :patch) }"
176
- end
177
- if view.can?(:destroy, job)
178
- buttons += "#{ job_action_link('Destroy', job_path(job), :delete) }"
170
+ buttons += job_action_link("Resume", resume_job_path(job), :patch).to_s
179
171
  end
172
+ buttons += job_action_link("Retry", retry_job_path(job), :patch).to_s if events.include?(:retry) && view.can?(:retry, job)
173
+ buttons += job_action_link("Destroy", job_path(job), :delete).to_s if view.can?(:destroy, job)
180
174
  buttons += "</div>"
181
175
  end
182
176
 
183
177
  def valid_events(job)
184
178
  job.aasm.events.collect(&:name)
185
179
  end
186
-
187
180
  end
188
181
  end
@@ -12,12 +12,12 @@ module RocketJobMissionControl
12
12
 
13
13
  def map(server)
14
14
  {
15
- '0' => name_with_icon(server),
16
- '1' => h(threads(server)),
17
- '2' => h(started_ago(server)),
18
- '3' => h(time_since_heartbeat(server)),
19
- '4' => action_links_html(server),
20
- 'DT_RowClass' => "card callout #{server_card_class(server)}"
15
+ "0" => name_with_icon(server),
16
+ "1" => h(threads(server)),
17
+ "2" => h(started_ago(server)),
18
+ "3" => h(time_since_heartbeat(server)),
19
+ "4" => action_links_html(server),
20
+ "DT_RowClass" => "card callout #{server_card_class(server)}"
21
21
  }
22
22
  end
23
23
 
@@ -45,33 +45,32 @@ module RocketJobMissionControl
45
45
  events = valid_events(server)
46
46
 
47
47
  if events.include?(:resume) && view.can?(:resume, server)
48
- actions += "#{ link_to "resume", resume_server_path(server), method: :patch, class: 'btn btn-default', data: {confirm: "Resume this server?"} }"
48
+ actions += (link_to "resume", resume_server_path(server), method: :patch, class: "btn btn-default", data: {confirm: "Resume this server?"}).to_s
49
49
  end
50
50
 
51
51
  if events.include?(:pause) && view.can?(:pause, server)
52
- actions += "#{ link_to "pause", pause_server_path(server), method: :patch, class: 'btn btn-default', data: {confirm: "Pause this server?"} }"
52
+ actions += (link_to "pause", pause_server_path(server), method: :patch, class: "btn btn-default", data: {confirm: "Pause this server?"}).to_s
53
53
  end
54
54
 
55
55
  if events.include?(:stop) && view.can?(:stop, server)
56
- actions += "#{ link_to "stop", stop_server_path(server), method: :patch, class: 'btn btn-danger', data: {confirm: "Stop this server?"} }"
56
+ actions += (link_to "stop", stop_server_path(server), method: :patch, class: "btn btn-danger", data: {confirm: "Stop this server?"}).to_s
57
57
  end
58
58
 
59
59
  if server.stopping? && view.can?(:destroy, server)
60
- actions += "Server is stopping..."
61
- confirmation = ''
60
+ actions += "Server is stopping..."
61
+ confirmation = ""
62
62
  unless server.zombie?
63
63
  confirmation << "Warning!\n\nDestroying this server will hard kill its active workers/jobs.\nKilled jobs will be requeued for processing on another worker.\n\n"
64
64
  end
65
65
  confirmation << "Are you sure you want to destroy #{server.name} ?"
66
- actions += "#{ link_to "destroy", server_path(server), method: :delete, class: 'btn btn-danger', data: {confirm: confirmation} }"
66
+ actions += (link_to "destroy", server_path(server), method: :delete, class: "btn btn-danger", data: {confirm: confirmation}).to_s
67
67
  end
68
68
 
69
- actions += '</div>'
69
+ actions += "</div>"
70
70
  end
71
71
 
72
72
  def valid_events(server)
73
73
  server.aasm.events.collect(&:name)
74
74
  end
75
-
76
75
  end
77
76
  end