Module: Canopus::Workspace::TaskAware

Defined in:
lib/canopus/workspace/task_aware.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#task_runner ⇒ Object (readonly)

Returns the value of attribute task_runner.



6
7
8
# File 'lib/canopus/workspace/task_aware.rb', line 6

def task_runner
  @task_runner
end

Instance Method Details

#accept_task_palette ⇒ Object

Raises:



41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/canopus/workspace/task_aware.rb', line 41

def accept_task_palette
  state = @palette
  index = state[:indices] ? state[:indices][state[:index]] : state[:index]
  source = index && state[:items][index]
  configuration = state[:task_configuration]
  self.palette = nil
  return unless source && configuration

  resolved = configuration.resolve(source, **task_context)
  matcher = resolved["problem_matcher"] && configuration.problem_matcher(resolved["problem_matcher"])
  raise Error, "unknown problem matcher: #{resolved['problem_matcher']}" if resolved["problem_matcher"] && !matcher
  start_task(resolved, matcher)
end

#activate_task_output(index) ⇒ Object



70
71
72
73
74
# File 'lib/canopus/workspace/task_aware.rb', line 70

def activate_task_output(index)
  output = @task_runner.activate(index)
  @window&.request_frame
  output
end

#close_task_output(index = @task_runner.active_index) ⇒ Object



76
77
78
79
80
81
82
# File 'lib/canopus/workspace/task_aware.rb', line 76

def close_task_output(index = @task_runner.active_index)
  output = @task_runner.remove(index)
  forget_task_output(output) if output
  @panels.hide("output") if task_outputs.empty?
  @window&.request_frame
  output
end

#close_tasks ⇒ Object



120
121
122
123
124
125
126
# File 'lib/canopus/workspace/task_aware.rb', line 120

def close_tasks
  @task_runner.close
ensure
  @task_matchers.clear
  @task_finished.clear
  publish_task_diagnostics
end

#drain_task_outputs ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/canopus/workspace/task_aware.rb', line 92

def drain_task_outputs
  changed = @task_runner.drain(max_bytes: @settings["terminal"]["max_bytes_per_frame"]) do |output, data, seconds|
    capture_test_output(output, data)
    matcher = @task_matchers[output.id]
    matcher&.feed(data.to_s, max_seconds: seconds)
    !matcher || !matcher.pending?
  end
  @task_runner.completed.each do |output|
    unless @task_finished[output.id]
      @task_finished[output.id] = true
      @task_matchers[output.id]&.finish
      complete_test_output(output)
    end
    next unless output.presentation.fetch("reveal") == "silent"
    status = output.terminal.status if output.terminal.respond_to?(:status)
    show_task_output(output) if status && !status.success?
  end
  @window&.request_frame if changed || @task_runner.pending?
  changed
end

#initialize_tasks ⇒ Object



8
9
10
11
12
13
# File 'lib/canopus/workspace/task_aware.rb', line 8

def initialize_tasks
  options = @settings["terminal"]
  @task_runner = Task::Runner.new(scrollback: options["scrollback_lines"],
    queue_limit_bytes: options["queue_limit_bytes"], report: ->(error) { post { notify("Cannot close task: #{error.message}") } })
  @task_matchers, @task_finished, @task_diagnostic_snapshot = {}, {}, {}.freeze
end

#resize_task_output(columns, rows) ⇒ Object



113
# File 'lib/canopus/workspace/task_aware.rb', line 113

def resize_task_output(columns, rows) = @task_runner.resize(columns, rows)

#run_task(task) ⇒ Object

Raises:



32
33
34
35
36
37
38
39
# File 'lib/canopus/workspace/task_aware.rb', line 32

def run_task(task)
  configuration = Task::Configuration.new(root: @root)
  source = task.is_a?(String) ? task : configuration.tasks.find { |candidate| candidate == task }
  resolved = configuration.resolve(source, **task_context)
  matcher = resolved["problem_matcher"] && configuration.problem_matcher(resolved["problem_matcher"])
  raise Error, "unknown problem matcher: #{resolved['problem_matcher']}" if resolved["problem_matcher"] && !matcher
  start_task(resolved, matcher)
end

#show_task_output(output = task_output) ⇒ Object



55
56
57
58
59
60
61
62
63
64
# File 'lib/canopus/workspace/task_aware.rb', line 55

def show_task_output(output = task_output)
  if output && (index = task_outputs.index { |entry| entry.equal?(output) })
    @task_runner.activate(index)
  end
  @panels.hide("terminal") if @panels.visible?("terminal")
  @panels.hide("debug_console") if @panels.visible?("debug_console")
  @panels.show("output")
  @window&.request_frame
  output
end

#show_tasks ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
# File 'lib/canopus/workspace/task_aware.rb', line 20

def show_tasks
  configuration = Task::Configuration.new(root: @root)
  if configuration.tasks.empty?
    self.message = "No tasks configured in .canopus/tasks.jsonc"
    return false
  end
  self.palette = {kind: :tasks, query: +"", index: 0,
    matches: configuration.tasks.map { |task| task.fetch("label") },
    items: configuration.tasks, task_configuration: configuration}
  update_palette
end

#stop_task(output = task_output) ⇒ Object



84
85
86
87
88
89
90
# File 'lib/canopus/workspace/task_aware.rb', line 84

def stop_task(output = task_output)
  stopped = @task_runner.stop(output)
  cancel_test_output(output) if stopped
  self.message = "No running task selected" unless stopped
  @window&.request_frame
  stopped
end

#task_output ⇒ Object



16
# File 'lib/canopus/workspace/task_aware.rb', line 16

def task_output = @task_runner.active

#task_output_title(output) ⇒ Object



115
116
117
118
# File 'lib/canopus/workspace/task_aware.rb', line 115

def task_output_title(output)
  suffix = @task_runner.running?(output) ? " ●" : ""
  "#{output.label}#{suffix}"
end

#task_output_visible ⇒ Object



18
# File 'lib/canopus/workspace/task_aware.rb', line 18

def task_output_visible = @panels.visible?("output") && @docks[:bottom][:visible]

#task_outputs ⇒ Object



15
# File 'lib/canopus/workspace/task_aware.rb', line 15

def task_outputs = @task_runner.entries

#task_terminal ⇒ Object



17
# File 'lib/canopus/workspace/task_aware.rb', line 17

def task_terminal = @task_runner.terminal

#toggle_task_output ⇒ Object



66
67
68
# File 'lib/canopus/workspace/task_aware.rb', line 66

def toggle_task_output
  task_output_visible ? @panels.hide("output") : show_task_output
end