rocketjob_mission_control 4.3.0 → 5.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +12 -12
  3. data/app/controllers/rocket_job_mission_control/application_controller.rb +1 -2
  4. data/app/controllers/rocket_job_mission_control/dirmon_entries_controller.rb +20 -19
  5. data/app/controllers/rocket_job_mission_control/jobs_controller.rb +36 -35
  6. data/app/controllers/rocket_job_mission_control/servers_controller.rb +32 -38
  7. data/app/datatables/rocket_job_mission_control/abstract_datatable.rb +8 -6
  8. data/app/datatables/rocket_job_mission_control/active_workers_datatable.rb +5 -5
  9. data/app/datatables/rocket_job_mission_control/dirmon_entries_datatable.rb +4 -4
  10. data/app/datatables/rocket_job_mission_control/jobs_datatable.rb +55 -62
  11. data/app/datatables/rocket_job_mission_control/servers_datatable.rb +13 -14
  12. data/app/helpers/rocket_job_mission_control/application_helper.rb +42 -41
  13. data/app/helpers/rocket_job_mission_control/jobs_helper.rb +9 -10
  14. data/app/helpers/rocket_job_mission_control/pagination_helper.rb +1 -1
  15. data/app/helpers/rocket_job_mission_control/servers_helper.rb +6 -6
  16. data/app/helpers/rocket_job_mission_control/slices_helper.rb +2 -4
  17. data/app/models/rocket_job_mission_control/access_policy.rb +1 -2
  18. data/app/models/rocket_job_mission_control/authorization.rb +3 -2
  19. data/app/models/rocket_job_mission_control/job_sanitizer.rb +14 -17
  20. data/app/models/rocket_job_mission_control/query.rb +2 -5
  21. data/app/views/rocket_job_mission_control/jobs/_exceptions.html.erb +1 -1
  22. data/app/views/rocket_job_mission_control/jobs/edit_slice.html.erb +1 -1
  23. data/app/views/rocket_job_mission_control/servers/index.html.erb +2 -2
  24. data/config/initializers/assets.rb +5 -7
  25. data/config/locales/en.yml +3 -0
  26. data/config/routes.rb +20 -21
  27. data/lib/rocket_job_mission_control/engine.rb +8 -9
  28. data/lib/rocket_job_mission_control/version.rb +1 -1
  29. data/lib/rocketjob_mission_control.rb +1 -1
  30. data/test/compare_hashes.rb +1 -2
  31. data/test/controllers/rocket_job_mission_control/application_controller_test.rb +13 -13
  32. data/test/controllers/rocket_job_mission_control/dirmon_entries_controller_test.rb +107 -108
  33. data/test/controllers/rocket_job_mission_control/jobs_controller_test.rb +89 -93
  34. data/test/controllers/rocket_job_mission_control/servers_controller_test.rb +66 -103
  35. data/test/helpers/rocket_job_mission_control/application_helper_test.rb +13 -14
  36. data/test/helpers/rocket_job_mission_control/jobs_helper_test.rb +31 -31
  37. data/test/helpers/rocket_job_mission_control/pagination_helper_test.rb +7 -9
  38. data/test/helpers/rocket_job_mission_control/servers_helper_test.rb +15 -15
  39. data/test/helpers/rocket_job_mission_control/slices_helper_test.rb +8 -10
  40. data/test/models/rocket_job_mission_control/job_sanitizer_test.rb +39 -40
  41. data/test/models/rocket_job_mission_control/query_test.rb +26 -28
  42. data/test/test_helper.rb +12 -12
  43. metadata +28 -28
@@ -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 collect_output input_categories output_categories encrypt compress slice_size 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
@@ -1,42 +1,43 @@
1
1
  module RocketJobMissionControl
2
2
  module ApplicationHelper
3
3
  STATE_ICON_MAP = {
4
- aborted: 'fas fa-stop',
5
- completed: 'fas fa-check',
6
- disabled: 'fas fa-stop',
7
- enabled: 'fas fa-check',
8
- failed: 'fas fa-exclamation-triangle',
9
- paused: 'fas fa-pause',
10
- pending: 'fas fa-inbox',
11
- queued: 'fas fa-inbox',
12
- running: 'fas fa-play',
13
- sleeping: 'fas fa-hourglass',
14
- scheduled: 'fas fa-clock',
15
- starting: 'fas fa-cogs',
16
- stopping: 'fas fa-stop',
17
- zombie: 'fas fa-hourglass'
18
- }
4
+ aborted: "fas fa-stop",
5
+ completed: "fas fa-check",
6
+ disabled: "fas fa-stop",
7
+ enabled: "fas fa-check",
8
+ failed: "fas fa-exclamation-triangle",
9
+ paused: "fas fa-pause",
10
+ pending: "fas fa-inbox",
11
+ queued: "fas fa-inbox",
12
+ running: "fas fa-play",
13
+ sleeping: "fas fa-hourglass",
14
+ scheduled: "fas fa-clock",
15
+ starting: "fas fa-cogs",
16
+ stopping: "fas fa-stop",
17
+ zombie: "fas fa-hourglass"
18
+ }.freeze
19
19
 
20
20
  def state_icon(state)
21
- STATE_ICON_MAP[state.to_sym] + ' ' + state.to_s
21
+ STATE_ICON_MAP[state.to_sym] + " " + state.to_s
22
22
  end
23
23
 
24
24
  def site_title
25
- 'Rocket Job Mission Control'
25
+ "Rocket Job Mission Control"
26
26
  end
27
27
 
28
28
  def title
29
29
  @page_title ||= params[:controller].to_s.titleize
30
- h(@full_title || [@page_title, site_title].compact.join(' | '))
30
+ h(@full_title || [@page_title, site_title].compact.join(" | "))
31
31
  end
32
32
 
33
33
  def active_page(path)
34
- 'active' if current_page?(path)
34
+ "active" if current_page?(path)
35
35
  end
36
36
 
37
37
  def pretty_print_array_or_hash(arguments)
38
- return arguments unless arguments.kind_of?(Array) || arguments.kind_of?(Hash)
39
- json_string_options = {space: ' ', indent: ' ', array_nl: '<br />', object_nl: '<br />'}
38
+ return arguments unless arguments.is_a?(Array) || arguments.is_a?(Hash)
39
+
40
+ json_string_options = {space: " ", indent: " ", array_nl: "<br />", object_nl: "<br />"}
40
41
  JSON.generate(arguments, json_string_options).html_safe
41
42
  end
42
43
 
@@ -60,49 +61,49 @@ module RocketJobMissionControl
60
61
  # When editing a job the values are of the correct type.
61
62
  # When editing a dirmon entry values are strings.
62
63
  field = klass.fields[field_name.to_s]
63
- return unless field && field.type
64
+ return unless field&.type
64
65
 
65
66
  placeholder = field.default_val
66
67
  placeholder = nil if placeholder.is_a?(Proc)
67
68
 
68
69
  case field.type.name
69
- when 'Symbol', 'String', 'Integer'
70
+ when "Symbol", "String", "Integer"
70
71
  options = extract_inclusion_values(klass, field_name)
71
72
  str = "[#{field.type.name}]\n".html_safe
72
73
  if options
73
- str + f.select(field_name, options, { include_blank: options.include?(nil) || include_nil_selectors, selected: value }, { class: 'selectize form-control' })
74
+ str + f.select(field_name, options, {include_blank: options.include?(nil) || include_nil_selectors, selected: value}, {class: "selectize form-control"})
74
75
  else
75
- if field.type.name == 'Integer'
76
- str + f.number_field(field_name, value: value, class: 'form-control', placeholder: placeholder)
76
+ if field.type.name == "Integer"
77
+ str + f.number_field(field_name, value: value, class: "form-control", placeholder: placeholder)
77
78
  else
78
- str + f.text_field(field_name, value: value, class: 'form-control', placeholder: placeholder)
79
+ str + f.text_field(field_name, value: value, class: "form-control", placeholder: placeholder)
79
80
  end
80
81
  end
81
- when 'Hash'
82
+ when "Hash"
82
83
  "[JSON Hash]\n".html_safe +
83
- f.text_field(field_name, value: value ? value.to_json : '', class: 'form-control', placeholder: '{"key1":"value1", "key2":"value2", "key3":"value3"}')
84
- when 'Array'
84
+ f.text_field(field_name, value: value ? value.to_json : "", class: "form-control", placeholder: '{"key1":"value1", "key2":"value2", "key3":"value3"}')
85
+ when "Array"
85
86
  options = Array(value)
86
87
  "[Array]\n".html_safe +
87
- f.select(field_name, options_for_select(options, options), { include_hidden: false }, { class: 'selectize form-control', multiple: true })
88
- when 'Mongoid::Boolean'
88
+ f.select(field_name, options_for_select(options, options), {include_hidden: false}, {class: "selectize form-control", multiple: true})
89
+ when "Mongoid::Boolean"
89
90
  name = "#{field_name}_true".to_sym
90
91
  value = value.to_s
91
- str = '<div class="radio-buttons">'.html_safe
92
- str << f.radio_button(field_name, 'true', checked: value == 'true')
93
- str << ' '.html_safe + f.label(name, 'true')
94
- str << ' '.html_safe + f.radio_button(field_name, 'false', checked: value == 'false')
95
- str << ' '.html_safe + f.label(name, 'false')
92
+ str = '<div class="radio-buttons">'.html_safe
93
+ str << f.radio_button(field_name, "true", checked: value == "true")
94
+ str << " ".html_safe + f.label(name, "true")
95
+ str << " ".html_safe + f.radio_button(field_name, "false", checked: value == "false")
96
+ str << " ".html_safe + f.label(name, "false")
96
97
  # Allow this field to be unset (nil).
97
98
  if include_nil_selectors
98
- str << ' '.html_safe + f.radio_button(field_name, '', checked: value == '')
99
- str << ' '.html_safe + f.label(name, 'nil')
99
+ str << " ".html_safe + f.radio_button(field_name, "", checked: value == "")
100
+ str << " ".html_safe + f.label(name, "nil")
100
101
  end
101
102
 
102
- str << '</div>'.html_safe
103
+ str << "</div>".html_safe
103
104
  else
104
105
  "[#{field.type.name}]".html_safe +
105
- f.text_field(field_name, value: value, class: 'form-control', placeholder: placeholder)
106
+ f.text_field(field_name, value: value, class: "form-control", placeholder: placeholder)
106
107
  end
107
108
  end
108
109
  end
@@ -20,7 +20,7 @@ module RocketJobMissionControl
20
20
  end
21
21
 
22
22
  def job_states_with_scheduled
23
- @job_states_with_scheduled ||= ['scheduled'] + job_states
23
+ @job_states_with_scheduled ||= ["scheduled"] + job_states
24
24
  end
25
25
 
26
26
  def job_counts_by_state(state)
@@ -32,35 +32,34 @@ module RocketJobMissionControl
32
32
  @job_counts.fetch(state.downcase.to_sym, 0)
33
33
  end
34
34
 
35
- def job_action_link(action, path, http_method=:get)
35
+ def job_action_link(action, path, http_method = :get)
36
36
  link_to(
37
37
  action,
38
38
  path,
39
39
  method: http_method,
40
40
  title: "#{action} job",
41
- class: 'btn btn-default',
42
- data: {confirm: t(:confirm, scope: [:job, :action], action: action)}
41
+ class: "btn btn-default",
42
+ data: {confirm: t(:confirm, scope: %i[job action], action: action)}
43
43
  )
44
44
  end
45
45
 
46
- def job_action_links_for_show(action, path, http_method=:get)
46
+ def job_action_links_for_show(action, path, http_method = :get)
47
47
  link_to(
48
48
  action,
49
49
  path,
50
50
  method: http_method,
51
51
  title: "#{action} job",
52
- class: 'btn btn-primary',
53
- data: {confirm: t(:confirm, scope: [:job, :action], action: action)}
52
+ class: "btn btn-primary",
53
+ data: {confirm: t(:confirm, scope: %i[job action], action: action)}
54
54
  )
55
55
  end
56
56
 
57
57
  def job_selected_class(job, selected_job)
58
58
  if selected_job.present? && job.id == selected_job.id
59
- 'selected'
59
+ "selected"
60
60
  else
61
- ''
61
+ ""
62
62
  end
63
63
  end
64
-
65
64
  end
66
65
  end