command_proposal 1.0.5 → 1.0.9
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.
- checksums.yaml +4 -4
- data/app/controllers/command_proposal/iterations_controller.rb +1 -1
- data/app/helpers/command_proposal/application_helper.rb +15 -7
- data/app/jobs/command_proposal/application_job.rb +3 -0
- data/app/models/command_proposal/iteration.rb +1 -1
- data/app/views/command_proposal/tasks/_past_iterations_list.html.erb +2 -2
- data/lib/command_proposal/configuration.rb +2 -0
- data/lib/command_proposal/services/command_interpreter.rb +7 -1
- data/lib/command_proposal/services/runner.rb +3 -2
- data/lib/command_proposal/version.rb +1 -6
- data/lib/command_proposal.rb +6 -0
- data/lib/generators/command_proposal/install/templates/initializer.rb +4 -0
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ae6c3b31f79557ffddfc4cc86435547b0523e204ff618d88160b4b7caa16da7
|
4
|
+
data.tar.gz: e2fdfb9505a9c10815f5503a3db917ef63b019b83a2f86b4f5d5dd30e704a8c1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7199f95ffb1a7f26b8c58f96bc7d249d2d9429b7104fba4016aedcc3fcf0a355ea6748de16a7e136d0ab5c2bd927df14c173e5a84439b49993500031abd43601
|
7
|
+
data.tar.gz: 3d9c1bf0cbfa570679e8d149402278cfb34a453368ea8e5da72744ec93043ef199cfe92eac2233f91d692f4aa8a7d882245a15bc6c132271dd4438616a41a711
|
@@ -48,7 +48,7 @@ class ::CommandProposal::IterationsController < ::CommandProposal::EngineControl
|
|
48
48
|
begin
|
49
49
|
alter_command if params.dig(:command_proposal_iteration, :command).present?
|
50
50
|
rescue ::CommandProposal::Services::CommandInterpreter::Error => e
|
51
|
-
return redirect_to cmd_path(:
|
51
|
+
return redirect_to cmd_path(:error, :tasks), alert: e.message
|
52
52
|
end
|
53
53
|
|
54
54
|
sleep 0.2
|
@@ -21,9 +21,13 @@ module CommandProposal
|
|
21
21
|
args << { host: host, port: nil } if host.present?
|
22
22
|
|
23
23
|
begin
|
24
|
-
|
24
|
+
engine.url_for(args.compact)
|
25
25
|
rescue NoMethodError => e
|
26
|
-
|
26
|
+
if e.message.match?(/\_(url|path)\'/)
|
27
|
+
raise e
|
28
|
+
else
|
29
|
+
raise "Error generating route! Please make sure `config.action_mailer.default_url_options` are set."
|
30
|
+
end
|
27
31
|
end
|
28
32
|
end
|
29
33
|
|
@@ -40,24 +44,28 @@ module CommandProposal
|
|
40
44
|
end
|
41
45
|
|
42
46
|
def string_path(*args)
|
43
|
-
[
|
47
|
+
[engine.command_proposal_tasks_url + args.shift, args.to_param.presence].compact.join("?")
|
48
|
+
end
|
49
|
+
|
50
|
+
def engine
|
51
|
+
@engine ||= send(::CommandProposal.engine_name)
|
44
52
|
end
|
45
53
|
|
46
54
|
# Runner controller doesn't map to a model, so needs special handling
|
47
55
|
def runner_path(task, iteration=nil)
|
48
56
|
if iteration.present?
|
49
|
-
|
57
|
+
engine.command_proposal_task_runner_path(task, iteration)
|
50
58
|
else
|
51
|
-
|
59
|
+
engine.command_proposal_task_runner_index_path(task)
|
52
60
|
end
|
53
61
|
end
|
54
62
|
|
55
63
|
# Runner controller doesn't map to a model, so needs special handling
|
56
64
|
def runner_url(task, iteration=nil)
|
57
65
|
if iteration.present?
|
58
|
-
|
66
|
+
engine.command_proposal_task_runner_url(task, iteration)
|
59
67
|
else
|
60
|
-
|
68
|
+
engine.command_proposal_task_runner_index_url(task)
|
61
69
|
end
|
62
70
|
end
|
63
71
|
end
|
@@ -18,8 +18,8 @@
|
|
18
18
|
<% end %>
|
19
19
|
</td>
|
20
20
|
<td><%= iteration.status.capitalize %></td>
|
21
|
-
<!-- <td
|
22
|
-
<!-- <td
|
21
|
+
<!-- <td><%#= iteration.comments.count %></td> -->
|
22
|
+
<!-- <td><%#= link_to "Diff", cmd_path(@task, iteration: @iteration.id, diff: iteration.id) %></td> -->
|
23
23
|
</tr>
|
24
24
|
<% end %>
|
25
25
|
</tbody>
|
@@ -10,6 +10,7 @@ module CommandProposal
|
|
10
10
|
:approval_required,
|
11
11
|
# Optional
|
12
12
|
:proposal_callback,
|
13
|
+
:approval_callback,
|
13
14
|
:success_callback,
|
14
15
|
:failed_callback,
|
15
16
|
)
|
@@ -26,6 +27,7 @@ module CommandProposal
|
|
26
27
|
|
27
28
|
# Optional
|
28
29
|
@proposal_callback = nil
|
30
|
+
@approval_callback = nil
|
29
31
|
@success_callback = nil
|
30
32
|
@failed_callback = nil
|
31
33
|
end
|
@@ -56,6 +56,8 @@ module CommandProposal
|
|
56
56
|
check_can_command? && check_can_approve?
|
57
57
|
|
58
58
|
@iteration.update(status: :approved, approver: @user, approved_at: Time.current)
|
59
|
+
proposal = ::CommandProposal::Service::ProposalPresenter.new(@iteration)
|
60
|
+
::CommandProposal.configuration.approval_callback&.call(proposal)
|
59
61
|
end
|
60
62
|
|
61
63
|
def command_run
|
@@ -86,7 +88,11 @@ module CommandProposal
|
|
86
88
|
check_can_command?
|
87
89
|
return unless @iteration.task.console?
|
88
90
|
|
89
|
-
|
91
|
+
if ::CommandProposal.sessions.key?("task:#{@task.id}")
|
92
|
+
@task.first_iteration.update(status: :success, completed_at: Time.current)
|
93
|
+
else
|
94
|
+
@task.first_iteration.update(status: :terminated, completed_at: Time.current)
|
95
|
+
end
|
90
96
|
::CommandProposal.sessions.delete("task:#{@task.id}")
|
91
97
|
end
|
92
98
|
|
@@ -125,7 +125,8 @@ module CommandProposal
|
|
125
125
|
|
126
126
|
def results_from_exception(exc)
|
127
127
|
klass = exc.class
|
128
|
-
|
128
|
+
# Dup to avoid frozen string errors
|
129
|
+
msg = (exc.try(:message) || exc.try(:body) || exc.to_s).dup
|
129
130
|
# Remove proposal context
|
130
131
|
msg.gsub!(/ for \#\<CommandProposal.*/, "")
|
131
132
|
msg.gsub!(/(::)?CommandProposal::Services::Runner(::)?/, "")
|
@@ -142,7 +143,7 @@ module CommandProposal
|
|
142
143
|
|
143
144
|
eval_trace = backtrace.select { |row| row.include?("(eval)") }.presence || []
|
144
145
|
eval_trace = eval_trace.map do |row|
|
145
|
-
eval_row_number = row[/\(eval\)\:\d+/].to_s[7..-1]
|
146
|
+
eval_row_number = row[/\(eval\)\:\d+/].to_s.dup[7..-1]
|
146
147
|
next if eval_row_number.blank?
|
147
148
|
|
148
149
|
error_line = @iteration.code.split("\n")[eval_row_number.to_i - 1]
|
data/lib/command_proposal.rb
CHANGED
@@ -22,6 +22,12 @@ module CommandProposal
|
|
22
22
|
@configuration = ::CommandProposal::Configuration.new
|
23
23
|
end
|
24
24
|
|
25
|
+
def self.engine_name
|
26
|
+
@engine_name ||= begin
|
27
|
+
`rails routes | grep command_proposal_engine`[/\w*command_proposal_engine/]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
25
31
|
def self.configure
|
26
32
|
yield(configuration)
|
27
33
|
end
|
@@ -43,6 +43,10 @@
|
|
43
43
|
config.proposal_callback = Proc.new { |proposal|
|
44
44
|
# Slack.notify("#{proposal.requester} has proposed #{proposal.name}.\n<#{proposal.url}|Click Here> to view this proposal and approve.")
|
45
45
|
}
|
46
|
+
# Called when a command is approved
|
47
|
+
config.approval_callback = Proc.new { |proposal|
|
48
|
+
# Slack.notify("The task #{proposal.name} has been approved and is now ready to run.\n<#{proposal.url}|Click Here> to view.")
|
49
|
+
}
|
46
50
|
# Called when a command runs and completes successfully
|
47
51
|
config.success_callback = Proc.new { |proposal|
|
48
52
|
# Slack.notify("The task #{proposal.name} has completed in #{proposal.duration}s.\n<#{proposal.url}|Click Here> to view the results.")
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: command_proposal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rocco Nicholls
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-09-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 5.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 5.0.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: font-awesome-rails
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -147,7 +147,7 @@ metadata:
|
|
147
147
|
homepage_uri: https://github.com/Rockster160/command_proposal
|
148
148
|
source_code_uri: https://github.com/Rockster160/command_proposal
|
149
149
|
changelog_uri: https://github.com/Rockster160/command_proposal/blob/master/README.md
|
150
|
-
post_install_message:
|
150
|
+
post_install_message:
|
151
151
|
rdoc_options: []
|
152
152
|
require_paths:
|
153
153
|
- lib
|
@@ -162,8 +162,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
162
162
|
- !ruby/object:Gem::Version
|
163
163
|
version: '0'
|
164
164
|
requirements: []
|
165
|
-
rubygems_version: 3.
|
166
|
-
signing_key:
|
165
|
+
rubygems_version: 3.2.22
|
166
|
+
signing_key:
|
167
167
|
specification_version: 4
|
168
168
|
summary: Gives the ability to run approved commands through a UI in your browser
|
169
169
|
test_files: []
|