command_proposal 1.0.3 → 1.0.7
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 +18 -7
- data/app/helpers/command_proposal/permissions_helper.rb +11 -0
- data/app/models/command_proposal/iteration.rb +1 -1
- data/app/views/command_proposal/tasks/_lines.html.erb +1 -1
- data/app/views/command_proposal/tasks/_task_detail_table.html.erb +2 -2
- data/lib/command_proposal/configuration.rb +2 -1
- 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/generators/command_proposal/install/templates/initializer.rb +11 -0
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 31a6d83b17c11473a1b540ed85ee8d9f9eb18e7c0e19e2a5ba3d5dec32ecec48
|
4
|
+
data.tar.gz: 8c98bf481ccb61042260928daf5f2b89783b9cdb577db44ff5ce6c9ddd264579
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0c70f51608c1d81770bf4cbe084f445da6a1aac249243e8c05ebb8fca375ef21c33d9b7bb118085d60853b483480675c4ed723ed9fd5074067fd1d12d6fc990e
|
7
|
+
data.tar.gz: ec49a4f24e8384a56fb24add427e26b56df0b414fb3916830b414440f92a97a6183762696f7e995f0a12baab224c7176ac1cc0a43610b1200b3ad6db9240eb0f
|
@@ -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,31 @@ 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 ||= begin
|
52
|
+
name = `rails routes | grep command_proposal_engine`[/\w*command_proposal_engine/]
|
53
|
+
send(name)
|
54
|
+
end
|
44
55
|
end
|
45
56
|
|
46
57
|
# Runner controller doesn't map to a model, so needs special handling
|
47
58
|
def runner_path(task, iteration=nil)
|
48
59
|
if iteration.present?
|
49
|
-
|
60
|
+
engine.command_proposal_task_runner_path(task, iteration)
|
50
61
|
else
|
51
|
-
|
62
|
+
engine.command_proposal_task_runner_index_path(task)
|
52
63
|
end
|
53
64
|
end
|
54
65
|
|
55
66
|
# Runner controller doesn't map to a model, so needs special handling
|
56
67
|
def runner_url(task, iteration=nil)
|
57
68
|
if iteration.present?
|
58
|
-
|
69
|
+
engine.command_proposal_task_runner_url(task, iteration)
|
59
70
|
else
|
60
|
-
|
71
|
+
engine.command_proposal_task_runner_index_url(task)
|
61
72
|
end
|
62
73
|
end
|
63
74
|
end
|
@@ -1,12 +1,14 @@
|
|
1
1
|
module CommandProposal
|
2
2
|
module PermissionsHelper
|
3
3
|
def can_command?(user=command_user)
|
4
|
+
return false unless permitted_to_use?
|
4
5
|
return true unless cmd_config.approval_required?
|
5
6
|
|
6
7
|
command_user.try("#{cmd_config.role_scope}?")
|
7
8
|
end
|
8
9
|
|
9
10
|
def can_approve?(iteration)
|
11
|
+
return false unless permitted_to_use?
|
10
12
|
return true unless cmd_config.approval_required?
|
11
13
|
return if iteration.nil?
|
12
14
|
|
@@ -14,15 +16,24 @@ module CommandProposal
|
|
14
16
|
end
|
15
17
|
|
16
18
|
def has_approval?(task)
|
19
|
+
return false unless permitted_to_use?
|
17
20
|
return true unless cmd_config.approval_required?
|
18
21
|
|
19
22
|
task&.approved?
|
20
23
|
end
|
21
24
|
|
22
25
|
def current_is_author?(iteration)
|
26
|
+
return false unless permitted_to_use?
|
27
|
+
|
23
28
|
command_user&.id == iteration&.requester&.id
|
24
29
|
end
|
25
30
|
|
31
|
+
def permitted_to_use?
|
32
|
+
return true if cmd_config.controller_var.blank?
|
33
|
+
|
34
|
+
command_user&.send("#{cmd_config.role_scope}?")
|
35
|
+
end
|
36
|
+
|
26
37
|
def command_user(user=nil)
|
27
38
|
@command_user ||= begin
|
28
39
|
if user.present?
|
@@ -8,8 +8,8 @@
|
|
8
8
|
</thead>
|
9
9
|
<tbody>
|
10
10
|
<tr>
|
11
|
-
<td><%= @iteration&.requester_name %></td>
|
12
|
-
<td><%= @iteration&.approver_name %></td>
|
11
|
+
<td><%= @iteration&.requester_name.presence || "ID: #{@iteration&.requester_id}" if @iteration&.requester_id.present? %></td>
|
12
|
+
<td><%= @iteration&.approver_name.presence || "ID: #{@iteration&.approver_id}" if @iteration&.approver_id.present? %></td>
|
13
13
|
<td><%= @iteration&.started_at&.strftime("%b %-d '%y, %-l:%M%P") %></td>
|
14
14
|
<td data-iteration-status><%= @iteration&.status&.capitalize %></td>
|
15
15
|
<td data-iteration-duration><%= humanized_duration(@iteration&.duration) %></td>
|
@@ -18,7 +18,7 @@ module CommandProposal
|
|
18
18
|
# Default
|
19
19
|
@approval_required = true
|
20
20
|
|
21
|
-
#
|
21
|
+
# User details - highly recommended
|
22
22
|
@user_class_name = nil
|
23
23
|
@role_scope = nil
|
24
24
|
@user_name = nil
|
@@ -26,6 +26,7 @@ module CommandProposal
|
|
26
26
|
|
27
27
|
# Optional
|
28
28
|
@proposal_callback = nil
|
29
|
+
@approval_callback = nil
|
29
30
|
@success_callback = nil
|
30
31
|
@failed_callback = nil
|
31
32
|
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]
|
@@ -1,4 +1,9 @@
|
|
1
1
|
::CommandProposal.configure do |config|
|
2
|
+
# Determines if a user needs a different user to approve their commands.
|
3
|
+
# Defaults to true, the recommended value.
|
4
|
+
# However, disabling in development could help with testing.
|
5
|
+
# config.approval_required = !Rails.env.development?
|
6
|
+
|
2
7
|
# Change if your base user class has a different model name
|
3
8
|
config.user_class_name = "User"
|
4
9
|
|
@@ -8,6 +13,8 @@
|
|
8
13
|
# Scope for your user class that determines users who are permitted to interact with commands
|
9
14
|
# It is highly recommended to make this very exclusive, as any users in this scope will be able
|
10
15
|
# to interact with your database directly.
|
16
|
+
# Expected that the class will respond to `#{role_scope}` and
|
17
|
+
# instances of the class respond to `#{role_scope}?`
|
11
18
|
config.role_scope = :admin
|
12
19
|
|
13
20
|
# Method called to display a user's name
|
@@ -36,6 +43,10 @@
|
|
36
43
|
config.proposal_callback = Proc.new { |proposal|
|
37
44
|
# Slack.notify("#{proposal.requester} has proposed #{proposal.name}.\n<#{proposal.url}|Click Here> to view this proposal and approve.")
|
38
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
|
+
}
|
39
50
|
# Called when a command runs and completes successfully
|
40
51
|
config.success_callback = Proc.new { |proposal|
|
41
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.7
|
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
|
@@ -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: []
|