sweet_staging 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +86 -12
- data/app/assets/images/ror.svg +1 -0
- data/app/controllers/sweet_staging/commands_controller.rb +14 -0
- data/app/controllers/sweet_staging/console_controller.rb +18 -0
- data/app/controllers/sweet_staging/home_controller.rb +5 -1
- data/app/views/sweet_staging/commands/call.html.erb +13 -0
- data/app/views/sweet_staging/console/execute.js.erb +10 -0
- data/app/views/sweet_staging/console/index.html.erb +22 -0
- data/app/views/sweet_staging/javascripts/_javascripts.html.erb +1 -0
- data/app/views/sweet_staging/javascripts/app.js +49 -4
- data/app/views/sweet_staging/javascripts/highlight.pack.js +1257 -0
- data/app/views/sweet_staging/layouts/sweet_staging.html.erb +9 -11
- data/app/views/sweet_staging/logs/watch.html.erb +10 -11
- data/app/views/sweet_staging/shared/_header.html.erb +24 -3
- data/app/views/sweet_staging/stylesheets/_stylesheets.html.erb +1 -0
- data/app/views/sweet_staging/stylesheets/gruvbox-dark.css +107 -0
- data/app/views/sweet_staging/stylesheets/style.css +129 -27
- data/config/routes.rb +5 -0
- data/lib/sweet_staging.rb +9 -1
- data/lib/sweet_staging/version.rb +1 -1
- metadata +38 -2
@@ -3,28 +3,26 @@
|
|
3
3
|
<head>
|
4
4
|
<meta charset="utf-8">
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
6
|
-
<title
|
6
|
+
<title><%= yield :title %></title>
|
7
7
|
<%= csrf_meta_tags %>
|
8
8
|
<%= csp_meta_tag if ::Rails::VERSION::STRING.to_f >= 5.2 %>
|
9
9
|
<link rel="preconnect" href="https://fonts.gstatic.com">
|
10
10
|
<link href="https://fonts.googleapis.com/css2?family=Ubuntu+Mono&display=swap" rel="stylesheet">
|
11
11
|
<%= render '/sweet_staging/stylesheets/stylesheets' %>
|
12
|
+
<%= render '/sweet_staging/javascripts/javascripts' %>
|
12
13
|
<link rel="shortcut icon" href="/favicon.ico">
|
13
14
|
<script>
|
14
15
|
var FETCH_TIMEOUT = <%= SweetStaging.fetch_timeout %>;
|
15
16
|
</script>
|
16
17
|
</head>
|
17
|
-
<body
|
18
|
-
<
|
19
|
-
<
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
</section>
|
25
|
-
</div>
|
18
|
+
<body>
|
19
|
+
<section>
|
20
|
+
<div class="">
|
21
|
+
<%= render '/sweet_staging/shared/header' %>
|
22
|
+
<%= yield %>
|
23
|
+
</div>
|
24
|
+
</section>
|
26
25
|
<%#= render '/sweet_staging/shared/footer' %>
|
27
|
-
<%= render '/sweet_staging/javascripts/javascripts' %>
|
28
26
|
<%= yield :on_load %>
|
29
27
|
</body>
|
30
28
|
</html>
|
@@ -1,20 +1,19 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
</ul>
|
9
|
-
</div>
|
1
|
+
<%= provide :title, params[:name] %>
|
2
|
+
|
3
|
+
<script>
|
4
|
+
$(function() {
|
5
|
+
logsWorkerInit();
|
6
|
+
});
|
7
|
+
</script>
|
10
8
|
|
11
|
-
<div
|
9
|
+
<div class="page-content">
|
12
10
|
<div class="loader-wrapper">
|
13
11
|
<div class="loader is-loading"></div>
|
14
12
|
</div>
|
13
|
+
<div id="logs" class="scrollable-content"></div>
|
15
14
|
</div>
|
16
15
|
|
17
|
-
<div class="columns is-fluid" id="controls">
|
16
|
+
<div class="page-footer columns is-fluid" id="controls">
|
18
17
|
<div class="column">
|
19
18
|
<a class="button" id="pause" onclick="pauseButton();">
|
20
19
|
<%= icon 'pause2' %>
|
@@ -1,3 +1,24 @@
|
|
1
|
-
|
2
|
-
<
|
3
|
-
<%
|
1
|
+
<div class="page-header tabs is-large">
|
2
|
+
<ul>
|
3
|
+
<% SweetStaging.logs.each_with_index do |log, index| %>
|
4
|
+
<li class="<%= 'is-active' if log[:name] == params[:name] || (index == 0 && params[:name].blank? && controller_name == 'logs') %>">
|
5
|
+
<%= link_to log[:name], sweet_staging.watch_url(name: log[:name]), "changes_url" => sweet_staging.changes_url(name: log[:name]) %>
|
6
|
+
</li>
|
7
|
+
<% end %>
|
8
|
+
|
9
|
+
<% if SweetStaging.console %>
|
10
|
+
<li class="<%= 'is-active' if controller_name == 'console' %>">
|
11
|
+
<%= link_to sweet_staging.console_url, class: 'console-icon' do %>
|
12
|
+
<%= icon 'ror' %>
|
13
|
+
console
|
14
|
+
<% end %>
|
15
|
+
</li>
|
16
|
+
<% end %>
|
17
|
+
|
18
|
+
<% SweetStaging.commands.each_with_index do |command, index| %>
|
19
|
+
<li class="<%= 'is-active' if command[:name] == params[:name] || (index == 0 && params[:name].blank? && controller_name == 'commands') %>">
|
20
|
+
<%= link_to command[:name], sweet_staging.call_url(name: command[:name]) %>
|
21
|
+
</li>
|
22
|
+
<% end %>
|
23
|
+
</ul>
|
24
|
+
</div>
|
@@ -0,0 +1,107 @@
|
|
1
|
+
/*
|
2
|
+
|
3
|
+
Gruvbox style (dark) (c) Pavel Pertsev (original style at https://github.com/morhetz/gruvbox)
|
4
|
+
|
5
|
+
*/
|
6
|
+
|
7
|
+
.hljs {
|
8
|
+
display: block;
|
9
|
+
overflow-x: auto;
|
10
|
+
padding: 0.5em;
|
11
|
+
}
|
12
|
+
|
13
|
+
.hljs,
|
14
|
+
.hljs-subst {
|
15
|
+
color: #ebdbb2;
|
16
|
+
}
|
17
|
+
|
18
|
+
/* Gruvbox Red */
|
19
|
+
.hljs-deletion,
|
20
|
+
.hljs-formula,
|
21
|
+
.hljs-keyword,
|
22
|
+
.hljs-link,
|
23
|
+
.hljs-selector-tag {
|
24
|
+
color: #fb4934;
|
25
|
+
}
|
26
|
+
|
27
|
+
/* Gruvbox Blue */
|
28
|
+
.hljs-built_in,
|
29
|
+
.hljs-emphasis,
|
30
|
+
.hljs-name,
|
31
|
+
.hljs-quote,
|
32
|
+
.hljs-strong,
|
33
|
+
.hljs-title,
|
34
|
+
.hljs-variable {
|
35
|
+
color: #83a598;
|
36
|
+
}
|
37
|
+
|
38
|
+
/* Gruvbox Yellow */
|
39
|
+
.hljs-attr,
|
40
|
+
.hljs-params,
|
41
|
+
.hljs-template-tag,
|
42
|
+
.hljs-type {
|
43
|
+
color: #fabd2f;
|
44
|
+
}
|
45
|
+
|
46
|
+
/* Gruvbox Purple */
|
47
|
+
.hljs-builtin-name,
|
48
|
+
.hljs-doctag,
|
49
|
+
.hljs-literal,
|
50
|
+
.hljs-number {
|
51
|
+
color: #8f3f71;
|
52
|
+
}
|
53
|
+
|
54
|
+
/* Gruvbox Orange */
|
55
|
+
.hljs-code,
|
56
|
+
.hljs-meta,
|
57
|
+
.hljs-regexp,
|
58
|
+
.hljs-selector-id,
|
59
|
+
.hljs-template-variable {
|
60
|
+
color: #fe8019;
|
61
|
+
}
|
62
|
+
|
63
|
+
/* Gruvbox Green */
|
64
|
+
.hljs-addition,
|
65
|
+
.hljs-meta-string,
|
66
|
+
.hljs-section,
|
67
|
+
.hljs-selector-attr,
|
68
|
+
.hljs-selector-class,
|
69
|
+
.hljs-string,
|
70
|
+
.hljs-symbol {
|
71
|
+
color: #b8bb26;
|
72
|
+
}
|
73
|
+
|
74
|
+
/* Gruvbox Aqua */
|
75
|
+
.hljs-attribute,
|
76
|
+
.hljs-bullet,
|
77
|
+
.hljs-class,
|
78
|
+
.hljs-function,
|
79
|
+
.hljs-function .hljs-keyword,
|
80
|
+
.hljs-meta-keyword,
|
81
|
+
.hljs-selector-pseudo,
|
82
|
+
.hljs-tag {
|
83
|
+
color: #8ec07c;
|
84
|
+
}
|
85
|
+
|
86
|
+
/* Gruvbox Gray */
|
87
|
+
.hljs-comment {
|
88
|
+
color: #928374;
|
89
|
+
}
|
90
|
+
|
91
|
+
/* Gruvbox Purple */
|
92
|
+
.hljs-link_label,
|
93
|
+
.hljs-literal,
|
94
|
+
.hljs-number {
|
95
|
+
color: #d3869b;
|
96
|
+
}
|
97
|
+
|
98
|
+
.hljs-comment,
|
99
|
+
.hljs-emphasis {
|
100
|
+
font-style: italic;
|
101
|
+
}
|
102
|
+
|
103
|
+
.hljs-section,
|
104
|
+
.hljs-strong,
|
105
|
+
.hljs-tag {
|
106
|
+
font-weight: bold;
|
107
|
+
}
|
@@ -1,51 +1,153 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
|
2
|
+
html, body {
|
3
|
+
scrollbar-width: none;
|
4
|
+
}
|
5
|
+
|
6
|
+
body::-webkit-scrollbar {
|
7
|
+
display: none;
|
8
|
+
}
|
9
|
+
|
10
|
+
.page-header {
|
11
|
+
position: fixed;
|
12
|
+
right: 0;
|
13
|
+
left: 0;
|
14
|
+
z-index: 100;
|
15
|
+
background-color: black;
|
5
16
|
}
|
6
17
|
|
7
|
-
.
|
8
|
-
|
18
|
+
.page-footer {
|
19
|
+
position: fixed;
|
20
|
+
right: 0;
|
21
|
+
left: 0;
|
22
|
+
bottom: 0;
|
23
|
+
padding: 20px;
|
24
|
+
}
|
25
|
+
|
26
|
+
.page-content {
|
27
|
+
padding: 70px 20px 0 20px;
|
28
|
+
position: relative;
|
29
|
+
}
|
30
|
+
|
31
|
+
.loader-wrapper {
|
32
|
+
position: absolute;
|
33
|
+
width: 100%;
|
34
|
+
height: 100%;
|
35
|
+
}
|
36
|
+
|
37
|
+
.is-loading {
|
38
|
+
left: calc(50% - 0.5em);
|
39
|
+
top: 35%
|
40
|
+
}
|
41
|
+
|
42
|
+
.scrollable-content {
|
43
|
+
position: relative;
|
44
|
+
width: 100%;
|
45
|
+
font-family: Consolas, "Ubuntu Mono";
|
46
|
+
font-size: 13px;
|
47
|
+
line-height: 17px;
|
48
|
+
overflow-y: scroll;
|
49
|
+
|
50
|
+
/* Firefox custom scrollbar */
|
51
|
+
scrollbar-width: thin;
|
52
|
+
scrollbar-color: #888 black;
|
9
53
|
}
|
10
54
|
|
11
55
|
#logs {
|
12
|
-
|
13
|
-
|
14
|
-
|
56
|
+
height: calc(100vh - 150px);
|
57
|
+
white-space: pre-wrap;
|
58
|
+
}
|
15
59
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
60
|
+
/* Webkit custom scrollbar */
|
61
|
+
.scrollable-content::-webkit-scrollbar {
|
62
|
+
width: 7px;
|
63
|
+
}
|
64
|
+
.scrollable-content::-webkit-scrollbar-track {
|
65
|
+
background: black;
|
66
|
+
}
|
67
|
+
.scrollable-content::-webkit-scrollbar-thumb {
|
68
|
+
background: #888;
|
69
|
+
border-radius: 3px;
|
70
|
+
}
|
71
|
+
.scrollable-content::-webkit-scrollbar-thumb:hover {
|
72
|
+
background: #555;
|
20
73
|
}
|
21
74
|
|
22
75
|
#controls {
|
23
|
-
|
76
|
+
padding-top: 20px;
|
24
77
|
}
|
25
78
|
|
26
79
|
#controls a svg {
|
27
|
-
|
28
|
-
|
29
|
-
|
80
|
+
width: 16px;
|
81
|
+
height: 16px;
|
82
|
+
margin-right: 6px;
|
30
83
|
}
|
31
84
|
|
32
85
|
.github-ext {
|
33
|
-
|
34
|
-
|
35
|
-
|
86
|
+
display: inline-block;
|
87
|
+
margin-top: 15px;
|
88
|
+
height: 14px;
|
36
89
|
}
|
37
90
|
|
38
91
|
.github-ext svg {
|
39
|
-
|
40
|
-
|
92
|
+
height: 14px;
|
93
|
+
width: 14px;
|
41
94
|
}
|
42
95
|
|
43
96
|
#three-dots {
|
44
|
-
|
45
|
-
|
46
|
-
|
97
|
+
display: inline-block;
|
98
|
+
margin-left: 20px;
|
99
|
+
padding-top: 5px;
|
47
100
|
}
|
48
101
|
|
49
102
|
#three-dots svg {
|
50
|
-
|
51
|
-
}
|
103
|
+
height: 4px;
|
104
|
+
}
|
105
|
+
|
106
|
+
#console {
|
107
|
+
height: calc(100vh - 256px);
|
108
|
+
}
|
109
|
+
|
110
|
+
#console.hidden {
|
111
|
+
opacity: 0.5;
|
112
|
+
}
|
113
|
+
|
114
|
+
.console-icon svg {
|
115
|
+
margin-top: 6px;
|
116
|
+
width: 24px;
|
117
|
+
height: 24px;
|
118
|
+
margin-right: 8px;
|
119
|
+
}
|
120
|
+
|
121
|
+
#command-output {
|
122
|
+
overflow-y: scroll;
|
123
|
+
font-family: Consolas, "Ubuntu Mono";
|
124
|
+
font-size: 13px;
|
125
|
+
line-height: 17px;
|
126
|
+
}
|
127
|
+
|
128
|
+
.textarea {
|
129
|
+
min-height: auto !important;
|
130
|
+
height: 100px !important;
|
131
|
+
margin-bottom: 15px !important;
|
132
|
+
background-color: #292929;
|
133
|
+
border: none;
|
134
|
+
color: white;
|
135
|
+
}
|
136
|
+
|
137
|
+
.textarea::placeholder {
|
138
|
+
color: silver;
|
139
|
+
}
|
140
|
+
|
141
|
+
pre {
|
142
|
+
background-color:#1c1b1b !important;
|
143
|
+
}
|
144
|
+
|
145
|
+
.execute-btn svg {
|
146
|
+
width: 16px;
|
147
|
+
height: 16px;
|
148
|
+
margin-right: 6px;
|
149
|
+
}
|
150
|
+
|
151
|
+
.console-content.loader-wrapper {
|
152
|
+
display: none;
|
153
|
+
}
|
data/config/routes.rb
CHANGED
@@ -3,6 +3,11 @@ SweetStaging::Engine.routes.draw do
|
|
3
3
|
get '/watch' => 'logs#watch', as: :watch
|
4
4
|
get '/watch/changes' => 'logs#changes', as: :changes
|
5
5
|
|
6
|
+
get '/console' => 'console#index', as: :console
|
7
|
+
post '/execute' => 'console#execute', as: :execute
|
8
|
+
|
9
|
+
get '/call' => 'commands#call', as: :call
|
10
|
+
|
6
11
|
["ansi_up.js.map", "perfect-scrollbar.min.js.map", "bulmaswatch.min.css.map", "ansi_up.js.map", "perfect-scrollbar.min.js.map", "bulmaswatch.min.css.map"].each do |res|
|
7
12
|
get "/#{res}", to: -> (env) do
|
8
13
|
[200, { 'Content-Type' => 'text/plain' }, ['']]
|
data/lib/sweet_staging.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require "sweet_staging/version"
|
2
|
+
require "awesome_print"
|
3
|
+
require "open3"
|
2
4
|
|
3
5
|
module SweetStaging
|
4
6
|
mattr_accessor :enabled
|
@@ -25,11 +27,17 @@ module SweetStaging
|
|
25
27
|
@@verify_access_proc = proc { |controller| true }
|
26
28
|
|
27
29
|
mattr_accessor :fetch_timeout
|
28
|
-
@@fetch_timeout =
|
30
|
+
@@fetch_timeout = 1000
|
29
31
|
|
30
32
|
mattr_accessor :logs
|
31
33
|
@@logs = []
|
32
34
|
|
35
|
+
mattr_accessor :console
|
36
|
+
@@console = true
|
37
|
+
|
38
|
+
mattr_accessor :commands
|
39
|
+
@@commands = []
|
40
|
+
|
33
41
|
def self.setup
|
34
42
|
yield(self)
|
35
43
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sweet_staging
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Igor Kasyanchuk
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -24,6 +24,34 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 5.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: awesome_print
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: open3
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: pry
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -61,18 +89,25 @@ files:
|
|
61
89
|
- app/assets/images/play3.svg
|
62
90
|
- app/assets/images/plus.svg
|
63
91
|
- app/assets/images/record.svg
|
92
|
+
- app/assets/images/ror.svg
|
64
93
|
- app/assets/images/settings.svg
|
65
94
|
- app/assets/images/stop.svg
|
66
95
|
- app/assets/images/success.svg
|
67
96
|
- app/assets/images/three-dots.svg
|
68
97
|
- app/controllers/sweet_staging/base_controller.rb
|
98
|
+
- app/controllers/sweet_staging/commands_controller.rb
|
99
|
+
- app/controllers/sweet_staging/console_controller.rb
|
69
100
|
- app/controllers/sweet_staging/home_controller.rb
|
70
101
|
- app/controllers/sweet_staging/logs_controller.rb
|
71
102
|
- app/helpers/sweet_staging/application_helper.rb
|
103
|
+
- app/views/sweet_staging/commands/call.html.erb
|
104
|
+
- app/views/sweet_staging/console/execute.js.erb
|
105
|
+
- app/views/sweet_staging/console/index.html.erb
|
72
106
|
- app/views/sweet_staging/home/index.html.erb
|
73
107
|
- app/views/sweet_staging/javascripts/_javascripts.html.erb
|
74
108
|
- app/views/sweet_staging/javascripts/ansi_up.js
|
75
109
|
- app/views/sweet_staging/javascripts/app.js
|
110
|
+
- app/views/sweet_staging/javascripts/highlight.pack.js
|
76
111
|
- app/views/sweet_staging/javascripts/jquery-3.4.1.min.js
|
77
112
|
- app/views/sweet_staging/javascripts/keyboard.min.js
|
78
113
|
- app/views/sweet_staging/javascripts/perfect-scrollbar.min.js
|
@@ -85,6 +120,7 @@ files:
|
|
85
120
|
- app/views/sweet_staging/shared/_header.html.erb
|
86
121
|
- app/views/sweet_staging/stylesheets/_stylesheets.html.erb
|
87
122
|
- app/views/sweet_staging/stylesheets/bulmaswatch.min.css
|
123
|
+
- app/views/sweet_staging/stylesheets/gruvbox-dark.css
|
88
124
|
- app/views/sweet_staging/stylesheets/perfect-scrollbar.css
|
89
125
|
- app/views/sweet_staging/stylesheets/style.css
|
90
126
|
- config/routes.rb
|