kuby-core 0.10.0 → 0.11.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +25 -0
- data/Gemfile +1 -0
- data/README.md +4 -2
- data/kuby-core.gemspec +2 -1
- data/lib/kuby-core.rb +1 -0
- data/lib/kuby.rb +7 -0
- data/lib/kuby/basic_logger.rb +56 -7
- data/lib/kuby/cli_base.rb +103 -15
- data/lib/kuby/commands.rb +8 -0
- data/lib/kuby/definition.rb +15 -1
- data/lib/kuby/dev_setup.rb +113 -22
- data/lib/kuby/docker.rb +3 -0
- data/lib/kuby/docker/alpine.rb +16 -12
- data/lib/kuby/docker/assets_phase.rb +5 -0
- data/lib/kuby/docker/bundler_phase.rb +36 -2
- data/lib/kuby/docker/cli.rb +55 -10
- data/lib/kuby/docker/copy_phase.rb +11 -3
- data/lib/kuby/docker/credentials.rb +1 -0
- data/lib/kuby/docker/debian.rb +14 -10
- data/lib/kuby/docker/dev_spec.rb +82 -18
- data/lib/kuby/docker/distro.rb +43 -0
- data/lib/kuby/docker/dockerfile.rb +67 -19
- data/lib/kuby/docker/errors.rb +9 -0
- data/lib/kuby/docker/inline_layer.rb +7 -0
- data/lib/kuby/docker/layer.rb +11 -0
- data/lib/kuby/docker/layer_stack.rb +43 -6
- data/lib/kuby/docker/local_tags.rb +23 -2
- data/lib/kuby/docker/metadata.rb +35 -7
- data/lib/kuby/docker/package_list.rb +22 -3
- data/lib/kuby/docker/package_phase.rb +25 -5
- data/lib/kuby/docker/packages.rb +1 -0
- data/lib/kuby/docker/packages/managed_package.rb +20 -2
- data/lib/kuby/docker/packages/nodejs.rb +8 -0
- data/lib/kuby/docker/packages/package.rb +15 -1
- data/lib/kuby/docker/packages/simple_managed_package.rb +10 -1
- data/lib/kuby/docker/packages/yarn.rb +14 -0
- data/lib/kuby/docker/remote_tags.rb +21 -2
- data/lib/kuby/docker/setup_phase.rb +35 -4
- data/lib/kuby/docker/spec.rb +89 -13
- data/lib/kuby/docker/tags.rb +37 -2
- data/lib/kuby/docker/timestamp_tag.rb +14 -2
- data/lib/kuby/docker/webserver_phase.rb +41 -6
- data/lib/kuby/docker/yarn_phase.rb +5 -0
- data/lib/kuby/environment.rb +4 -0
- data/lib/kuby/kubernetes.rb +1 -0
- data/lib/kuby/kubernetes/deploy_task.rb +1 -0
- data/lib/kuby/kubernetes/deployer.rb +1 -0
- data/lib/kuby/kubernetes/docker_config.rb +1 -0
- data/lib/kuby/kubernetes/docker_desktop_provider.rb +1 -0
- data/lib/kuby/kubernetes/errors.rb +1 -0
- data/lib/kuby/kubernetes/manifest.rb +1 -0
- data/lib/kuby/kubernetes/provider.rb +1 -0
- data/lib/kuby/kubernetes/registry_secret.rb +1 -0
- data/lib/kuby/kubernetes/spec.rb +19 -3
- data/lib/kuby/middleware.rb +1 -0
- data/lib/kuby/middleware/health_check.rb +1 -0
- data/lib/kuby/plugin.rb +1 -0
- data/lib/kuby/plugin_registry.rb +1 -0
- data/lib/kuby/plugins.rb +1 -0
- data/lib/kuby/plugins/nginx_ingress.rb +1 -0
- data/lib/kuby/plugins/rails_app.rb +1 -0
- data/lib/kuby/plugins/rails_app/asset_copy_task.rb +1 -0
- data/lib/kuby/plugins/rails_app/assets.rb +1 -0
- data/lib/kuby/plugins/rails_app/database.rb +9 -7
- data/lib/kuby/plugins/rails_app/generators/kuby.rb +53 -40
- data/lib/kuby/plugins/rails_app/mysql.rb +1 -0
- data/lib/kuby/plugins/rails_app/plugin.rb +9 -5
- data/lib/kuby/plugins/rails_app/postgres.rb +1 -0
- data/lib/kuby/plugins/rails_app/rewrite_db_config.rb +1 -0
- data/lib/kuby/plugins/rails_app/sqlite.rb +1 -0
- data/lib/kuby/rails_commands.rb +1 -6
- data/lib/kuby/railtie.rb +1 -0
- data/lib/kuby/tasks.rb +1 -0
- data/lib/kuby/trailing_hash.rb +5 -3
- data/lib/kuby/version.rb +3 -1
- data/spec/docker/metadata_spec.rb +1 -0
- data/spec/docker/spec_spec.rb +37 -0
- data/spec/docker/timestamp_tag_spec.rb +1 -0
- data/spec/dummy/app/channels/application_cable/channel.rb +1 -0
- data/spec/dummy/app/channels/application_cable/connection.rb +1 -0
- data/spec/dummy/app/controllers/application_controller.rb +1 -0
- data/spec/dummy/app/helpers/application_helper.rb +1 -0
- data/spec/dummy/app/jobs/application_job.rb +1 -0
- data/spec/dummy/app/mailers/application_mailer.rb +1 -0
- data/spec/dummy/app/models/application_record.rb +1 -0
- data/spec/dummy/config/application.rb +1 -0
- data/spec/dummy/config/boot.rb +1 -0
- data/spec/dummy/config/environment.rb +1 -0
- data/spec/dummy/config/environments/development.rb +1 -0
- data/spec/dummy/config/environments/production.rb +1 -0
- data/spec/dummy/config/environments/test.rb +1 -0
- data/spec/dummy/config/initializers/application_controller_renderer.rb +1 -0
- data/spec/dummy/config/initializers/assets.rb +1 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +1 -0
- data/spec/dummy/config/initializers/content_security_policy.rb +1 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +1 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +1 -0
- data/spec/dummy/config/initializers/inflections.rb +1 -0
- data/spec/dummy/config/initializers/mime_types.rb +1 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +1 -0
- data/spec/dummy/config/puma.rb +1 -0
- data/spec/dummy/config/routes.rb +1 -0
- data/spec/dummy/config/spring.rb +1 -0
- data/spec/dummy/db/seeds.rb +1 -0
- data/spec/dummy/test/application_system_test_case.rb +1 -0
- data/spec/dummy/test/channels/application_cable/connection_test.rb +1 -0
- data/spec/dummy/test/test_helper.rb +1 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/support/docker/fake_cli.rb +1 -0
- data/spec/support/docker/remote/fake_client.rb +1 -0
- data/spec/trailing_hash_spec.rb +2 -0
- metadata +20 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed18879c6aaea9b7fa96be67e6fd3f4b9b59cfc7b79a1d0eef33017e8bf509aa
|
4
|
+
data.tar.gz: 1b36fab3efe73e5df8510ef4896fbb991d8d2b478c86af3a3b76fd7b185a92b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bbc63d361f6ee464b88cdfca30be2974a99faf63824427d8f483aa136d55e3315242d02d0d8be1aebebddb0d954c863dfa5bff31af178d2f4e922870f8d206e5
|
7
|
+
data.tar.gz: d93d06d263c9c7fef24fcb15417f58c64033dbd9da492bd72728e5ac05d4ff0cf73ccf360d5cb7e03f363f9e22c99d003694a0ca30b81c30a7b6676307abcfa4
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,28 @@
|
|
1
|
+
## 0.11.3
|
2
|
+
* I've gone back and forth a few times on this, but I decided to put the initializer code back into the Rails generator.
|
3
|
+
|
4
|
+
## 0.11.2
|
5
|
+
* Attempt to auto-require the requested provider if it isn't registered.
|
6
|
+
* Adjust error message when provider can't be found to include reminder to add a require statement.
|
7
|
+
|
8
|
+
## 0.11.1
|
9
|
+
* Use integers for ports instead of strings to appease Kubernetes.
|
10
|
+
|
11
|
+
## 0.11.0
|
12
|
+
* Defer evaluation of database config until after Kuby has been configured.
|
13
|
+
- The issue that prompted this was that the `database` block was being evaluated before the Rails root had been set via `root`. Kuby couldn't find database.yml in a non-standard location and blew up with an error.
|
14
|
+
* Fix tests broken in 0.10.1.
|
15
|
+
* Set up Travis CI builds.
|
16
|
+
* Add a few tests for custom build phases.
|
17
|
+
* Add the `Environment#configured?` method that will return `true` if Kuby has been configured and `false` if configuration hasn't happened or is in progress.
|
18
|
+
* Add sorbet typedefs for some classes.
|
19
|
+
* Fix issue in Rails generator (hadn't been updated with new `environment` block).
|
20
|
+
* Add kuby-core.rb so Bundler setup works for Kuby without having to add a Rails initializer.
|
21
|
+
|
22
|
+
## 0.10.1
|
23
|
+
* Fix bug causing some `rails` and `rake` commands to not be executed.
|
24
|
+
* Fix issue restricting Docker CLI output.
|
25
|
+
|
1
26
|
## 0.10.0
|
2
27
|
* Set default database user and password in dev environment.
|
3
28
|
* Add ability to run rake tasks in dev environment.
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
## Kuby
|
2
2
|
|
3
|
+
[![Build Status](https://travis-ci.com/getkuby/kuby-core.svg?branch=master)](https://travis-ci.com/getkuby/kuby-core)
|
4
|
+
|
3
5
|
Deploy your Rails app the easy way.
|
4
6
|
|
5
7
|
## What is Kuby?
|
@@ -20,11 +22,11 @@ Kuby embraces the same convention-over-configuration approach that Rails does. I
|
|
20
22
|
|
21
23
|
## Getting Started
|
22
24
|
|
23
|
-
See the [Quick Start Guide](https://
|
25
|
+
See the [Quick Start Guide](https://getkuby.io/docs)
|
24
26
|
|
25
27
|
## More Info
|
26
28
|
|
27
|
-
|
29
|
+
Check out [getkuby.io](https://getkuby.io).
|
28
30
|
|
29
31
|
## Running Tests
|
30
32
|
|
data/kuby-core.gemspec
CHANGED
@@ -20,11 +20,12 @@ Gem::Specification.new do |s|
|
|
20
20
|
# See: https://github.com/Shopify/krane/blob/master/CHANGELOG.md#114
|
21
21
|
s.add_dependency 'krane', '>= 1.1.4', '< 2.0'
|
22
22
|
s.add_dependency 'kuby-cert-manager', '>= 0.3'
|
23
|
-
s.add_dependency 'kube-dsl', '~> 0.
|
23
|
+
s.add_dependency 'kube-dsl', '~> 0.4'
|
24
24
|
s.add_dependency 'kuby-kube-db', '>= 0.6'
|
25
25
|
s.add_dependency 'kubernetes-cli', '~> 0.3'
|
26
26
|
s.add_dependency 'railties', '>= 5.1'
|
27
27
|
s.add_dependency 'rouge', '~> 3.0'
|
28
|
+
s.add_dependency 'sorbet-runtime-stub', '~> 0.2'
|
28
29
|
|
29
30
|
s.add_development_dependency 'rspec'
|
30
31
|
|
data/lib/kuby-core.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'kuby'
|
data/lib/kuby.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
# typed: false
|
2
|
+
|
3
|
+
require 'sorbet-runtime-stub'
|
1
4
|
require 'kuby/railtie'
|
2
5
|
|
3
6
|
begin
|
@@ -69,6 +72,10 @@ module Kuby
|
|
69
72
|
env.kubernetes.after_configuration
|
70
73
|
end
|
71
74
|
|
75
|
+
@definition.environments.each do |_, env|
|
76
|
+
env.configured = true
|
77
|
+
end
|
78
|
+
|
72
79
|
@definition
|
73
80
|
end
|
74
81
|
|
data/lib/kuby/basic_logger.rb
CHANGED
@@ -1,9 +1,30 @@
|
|
1
|
+
# typed: strict
|
2
|
+
|
1
3
|
require 'logger'
|
2
4
|
require 'colorized_string'
|
3
5
|
|
4
6
|
module Kuby
|
5
7
|
class BasicLogger < Logger
|
6
|
-
|
8
|
+
extend T::Sig
|
9
|
+
|
10
|
+
sig {
|
11
|
+
override.params(
|
12
|
+
logdev: T.any(String, IO, StringIO, NilClass),
|
13
|
+
shift_age: Integer,
|
14
|
+
shift_size: Integer,
|
15
|
+
level: Integer,
|
16
|
+
progname: T.nilable(String),
|
17
|
+
formatter: T.nilable(FormatterProcType),
|
18
|
+
datetime_format: T.nilable(String),
|
19
|
+
shift_period_suffix: T.nilable(String)
|
20
|
+
).void
|
21
|
+
}
|
22
|
+
def initialize(
|
23
|
+
logdev, shift_age = 0, shift_size = 1048576, level: DEBUG,
|
24
|
+
progname: nil, formatter: nil, datetime_format: nil,
|
25
|
+
shift_period_suffix: '%Y%m%d')
|
26
|
+
@logdev = T.let(@logdev, T.nilable(Logger::LogDevice))
|
27
|
+
|
7
28
|
super
|
8
29
|
|
9
30
|
self.formatter = proc do |_severity, _datetime, _progname, msg|
|
@@ -11,23 +32,51 @@ module Kuby
|
|
11
32
|
end
|
12
33
|
end
|
13
34
|
|
14
|
-
|
15
|
-
|
35
|
+
sig {
|
36
|
+
override.params(
|
37
|
+
progname_or_msg: T.untyped,
|
38
|
+
block: T.nilable(T.proc.returns(T.untyped))
|
39
|
+
).void
|
40
|
+
}
|
41
|
+
def info(progname_or_msg = nil, &block)
|
42
|
+
if block
|
43
|
+
super(progname_or_msg) { ColorizedString[block.call].yellow }
|
44
|
+
else
|
45
|
+
super(ColorizedString[progname_or_msg].yellow)
|
46
|
+
end
|
16
47
|
end
|
17
48
|
|
18
|
-
|
19
|
-
|
49
|
+
sig {
|
50
|
+
override.params(
|
51
|
+
progname_or_msg: T.untyped,
|
52
|
+
block: T.nilable(T.proc.returns(T.untyped))
|
53
|
+
).void
|
54
|
+
}
|
55
|
+
def fatal(progname_or_msg, &block)
|
56
|
+
if block
|
57
|
+
super(progname_or_msg) { ColorizedString[block.call].red }
|
58
|
+
else
|
59
|
+
super(ColorizedString[progname_or_msg].red)
|
60
|
+
end
|
20
61
|
end
|
21
62
|
|
22
63
|
# adhere to the "CLI" interface
|
23
|
-
|
24
|
-
|
64
|
+
sig {
|
65
|
+
params(
|
66
|
+
out: T.any(IO, StringIO),
|
67
|
+
err: T.any(IO, StringIO),
|
68
|
+
block: T.proc.void
|
69
|
+
).void
|
70
|
+
}
|
71
|
+
def with_pipes(out = STDOUT, err = STDERR, &block)
|
72
|
+
previous_logdev = @logdev&.dev || STDERR
|
25
73
|
reopen(err)
|
26
74
|
yield
|
27
75
|
ensure
|
28
76
|
reopen(previous_logdev)
|
29
77
|
end
|
30
78
|
|
79
|
+
sig { returns(T.nilable(Process::Status)) }
|
31
80
|
def last_status
|
32
81
|
nil
|
33
82
|
end
|
data/lib/kuby/cli_base.rb
CHANGED
@@ -1,23 +1,39 @@
|
|
1
|
+
# typed: strict
|
2
|
+
|
1
3
|
require 'open3'
|
2
4
|
require 'thread'
|
3
5
|
|
4
6
|
module Kuby
|
5
7
|
class CLIBase
|
8
|
+
extend T::Sig
|
9
|
+
|
10
|
+
sig { returns(T.nilable(Process::Status)) }
|
6
11
|
def last_status
|
7
12
|
Thread.current[status_key]
|
8
13
|
end
|
9
14
|
|
15
|
+
sig { params(block: T.proc.params(cmd: String).void).void }
|
10
16
|
def before_execute(&block)
|
17
|
+
@before_execute = T.let(@before_execute, T.nilable(T::Array[T.proc.params(cmd: String).void]))
|
11
18
|
@before_execute ||= []
|
12
19
|
@before_execute << block
|
13
20
|
end
|
14
21
|
|
22
|
+
sig { params(block: T.proc.params(cmd: String).void).void }
|
15
23
|
def after_execute(&block)
|
24
|
+
@after_execute = T.let(@after_execute, T.nilable(T::Array[T.proc.params(cmd: String).void]))
|
16
25
|
@after_execute ||= []
|
17
26
|
@after_execute << block
|
18
27
|
end
|
19
28
|
|
20
|
-
|
29
|
+
sig {
|
30
|
+
params(
|
31
|
+
out: T.any(IO, StringIO),
|
32
|
+
err: T.any(IO, StringIO),
|
33
|
+
block: T.proc.void
|
34
|
+
).void
|
35
|
+
}
|
36
|
+
def with_pipes(out = STDOUT, err = STDERR, &block)
|
21
37
|
previous_stdout = self.stdout
|
22
38
|
previous_stderr = self.stderr
|
23
39
|
self.stdout = out
|
@@ -28,29 +44,39 @@ module Kuby
|
|
28
44
|
self.stderr = previous_stderr
|
29
45
|
end
|
30
46
|
|
47
|
+
sig { returns(T.nilable(T.any(IO, StringIO))) }
|
31
48
|
def stdout
|
32
49
|
Thread.current[stdout_key] || STDOUT
|
33
50
|
end
|
34
51
|
|
52
|
+
sig { params(new_stdout: T.nilable(T.any(IO, StringIO))).void }
|
35
53
|
def stdout=(new_stdout)
|
36
54
|
Thread.current[stdout_key] = new_stdout
|
37
55
|
end
|
38
56
|
|
57
|
+
sig { returns(T.nilable(T.any(IO, StringIO))) }
|
39
58
|
def stderr
|
40
59
|
Thread.current[stderr_key] || STDERR
|
41
60
|
end
|
42
61
|
|
62
|
+
sig { params(new_stderr: T.nilable(T.any(IO, StringIO))).void }
|
43
63
|
def stderr=(new_stderr)
|
44
64
|
Thread.current[stderr_key] = new_stderr
|
45
65
|
end
|
46
66
|
|
47
67
|
private
|
48
68
|
|
49
|
-
|
69
|
+
sig {
|
70
|
+
params(
|
71
|
+
cmd: T::Array[String],
|
72
|
+
block: T.proc.params(stdin: IO).void
|
73
|
+
).void
|
74
|
+
}
|
75
|
+
def open3_w(cmd, &block)
|
50
76
|
run_before_callbacks(cmd)
|
51
77
|
cmd_s = cmd.join(' ')
|
52
78
|
|
53
|
-
Open3.popen3(
|
79
|
+
Open3.popen3(cmd_s) do |p_stdin, p_stdout, p_stderr, wait_thread|
|
54
80
|
Thread.new(stdout) do |t_stdout|
|
55
81
|
begin
|
56
82
|
p_stdout.each { |line| t_stdout.puts(line) }
|
@@ -65,55 +91,111 @@ module Kuby
|
|
65
91
|
end
|
66
92
|
end
|
67
93
|
|
68
|
-
yield(p_stdin)
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
94
|
+
yield(p_stdin)
|
95
|
+
|
96
|
+
p_stdin.close
|
97
|
+
self.last_status = T.cast(wait_thread.value, Process::Status)
|
98
|
+
run_after_callbacks(cmd)
|
99
|
+
wait_thread.join
|
74
100
|
end
|
75
101
|
end
|
76
102
|
|
103
|
+
sig { params(cmd: T::Array[String]).void }
|
77
104
|
def execc(cmd)
|
78
105
|
run_before_callbacks(cmd)
|
79
106
|
cmd_s = cmd.join(' ')
|
80
107
|
exec(cmd_s)
|
81
108
|
end
|
82
109
|
|
110
|
+
sig { params(cmd: T::Array[String]).void }
|
83
111
|
def systemm(cmd)
|
112
|
+
if stdout == STDOUT && stderr == STDERR
|
113
|
+
systemm_default(cmd)
|
114
|
+
else
|
115
|
+
systemm_open3(cmd)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
sig { params(cmd: T::Array[String]).void }
|
120
|
+
def systemm_default(cmd)
|
121
|
+
run_before_callbacks(cmd)
|
122
|
+
cmd_s = cmd.join(' ')
|
123
|
+
system(cmd_s).tap do
|
124
|
+
self.last_status = $?
|
125
|
+
run_after_callbacks(cmd)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
sig { params(cmd: T::Array[String]).void }
|
130
|
+
def systemm_open3(cmd)
|
84
131
|
run_before_callbacks(cmd)
|
85
132
|
cmd_s = cmd.join(' ')
|
86
133
|
|
87
134
|
Open3.popen3(cmd_s) do |p_stdin, p_stdout, p_stderr, wait_thread|
|
88
135
|
Thread.new(stdout) do |t_stdout|
|
89
|
-
|
136
|
+
begin
|
137
|
+
p_stdout.each { |line| t_stdout.puts(line) }
|
138
|
+
rescue IOError
|
139
|
+
end
|
90
140
|
end
|
91
141
|
|
92
142
|
Thread.new(stderr) do |t_stderr|
|
93
|
-
|
143
|
+
begin
|
144
|
+
p_stderr.each { |line| t_stderr.puts(line) }
|
145
|
+
rescue IOError
|
146
|
+
end
|
94
147
|
end
|
95
148
|
|
96
|
-
|
149
|
+
p_stdin.close
|
150
|
+
self.last_status = T.cast(wait_thread.value, Process::Status)
|
97
151
|
run_after_callbacks(cmd)
|
98
152
|
wait_thread.join
|
99
153
|
end
|
100
154
|
end
|
101
155
|
|
156
|
+
|
157
|
+
sig { params(cmd: T::Array[String]).returns(String) }
|
102
158
|
def backticks(cmd)
|
159
|
+
if stdout == STDOUT && stderr == STDERR
|
160
|
+
backticks_default(cmd)
|
161
|
+
else
|
162
|
+
backticks_open3(cmd)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
sig { params(cmd: T::Array[String]).returns(String) }
|
167
|
+
def backticks_default(cmd)
|
168
|
+
run_before_callbacks(cmd)
|
169
|
+
cmd_s = cmd.join(' ')
|
170
|
+
`#{cmd_s}`.tap do
|
171
|
+
self.last_status = $?
|
172
|
+
run_after_callbacks(cmd)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
sig { params(cmd: T::Array[String]).returns(String) }
|
177
|
+
def backticks_open3(cmd)
|
103
178
|
run_before_callbacks(cmd)
|
104
179
|
cmd_s = cmd.join(' ')
|
105
180
|
result = StringIO.new
|
106
181
|
|
107
182
|
Open3.popen3(cmd_s) do |p_stdin, p_stdout, p_stderr, wait_thread|
|
108
183
|
Thread.new do
|
109
|
-
|
184
|
+
begin
|
185
|
+
p_stdout.each { |line| result.puts(line) }
|
186
|
+
rescue IOError
|
187
|
+
end
|
110
188
|
end
|
111
189
|
|
112
190
|
Thread.new(stderr) do |t_stderr|
|
113
|
-
|
191
|
+
begin
|
192
|
+
p_stderr.each { |line| t_stderr.puts(line) }
|
193
|
+
rescue IOError
|
194
|
+
end
|
114
195
|
end
|
115
196
|
|
116
|
-
|
197
|
+
p_stdin.close
|
198
|
+
self.last_status = T.cast(wait_thread.value, Process::Status)
|
117
199
|
run_after_callbacks(cmd)
|
118
200
|
wait_thread.join
|
119
201
|
end
|
@@ -121,26 +203,32 @@ module Kuby
|
|
121
203
|
result.string
|
122
204
|
end
|
123
205
|
|
206
|
+
sig { params(cmd: T::Array[String]).void }
|
124
207
|
def run_before_callbacks(cmd)
|
125
208
|
(@before_execute || []).each { |cb| cb.call(cmd) }
|
126
209
|
end
|
127
210
|
|
211
|
+
sig { params(cmd: T::Array[String]).void }
|
128
212
|
def run_after_callbacks(cmd)
|
129
213
|
(@after_execute || []).each { |cb| cb.call(cmd, last_status) }
|
130
214
|
end
|
131
215
|
|
216
|
+
sig { params(status: Process::Status).void }
|
132
217
|
def last_status=(status)
|
133
218
|
Thread.current[status_key] = status
|
134
219
|
end
|
135
220
|
|
221
|
+
sig { returns(Symbol) }
|
136
222
|
def status_key
|
137
223
|
raise NotImplementedError, "#{__method__} must be defined in derived classes"
|
138
224
|
end
|
139
225
|
|
226
|
+
sig { returns(Symbol) }
|
140
227
|
def stdout_key
|
141
228
|
raise NotImplementedError, "#{__method__} must be defined in derived classes"
|
142
229
|
end
|
143
230
|
|
231
|
+
sig { returns(Symbol) }
|
144
232
|
def stderr_key
|
145
233
|
raise NotImplementedError, "#{__method__} must be defined in derived classes"
|
146
234
|
end
|
data/lib/kuby/commands.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
|
+
# typed: strict
|
2
|
+
|
1
3
|
require 'kuby/version'
|
2
4
|
require 'gli'
|
3
5
|
|
4
6
|
module Kuby
|
5
7
|
class Commands
|
8
|
+
extend T::Sig
|
6
9
|
extend GLI::App
|
7
10
|
|
8
11
|
# GLI doesn't have a wildcard option, so it's impossible to tell it to
|
@@ -16,8 +19,10 @@ module Kuby
|
|
16
19
|
# avoid the usual series of cryptic alias_method calls (note that there
|
17
20
|
# is no singleton class version of #prepend in the Ruby language).
|
18
21
|
singleton_class.send(:prepend, Module.new do
|
22
|
+
sig { params(args: T::Array[String]).void }
|
19
23
|
def run(args)
|
20
24
|
if idx = args.index('rails') || idx = args.index('rake')
|
25
|
+
@rails_options = T.let(@rails_options, T.nilable(T::Array[String]))
|
21
26
|
@rails_options = args[idx..-1]
|
22
27
|
super(args[0..idx])
|
23
28
|
else
|
@@ -26,10 +31,12 @@ module Kuby
|
|
26
31
|
end
|
27
32
|
end)
|
28
33
|
|
34
|
+
sig { returns(Kuby::Tasks) }
|
29
35
|
def self.tasks
|
30
36
|
Kuby::Tasks.new(Kuby.environment)
|
31
37
|
end
|
32
38
|
|
39
|
+
sig { void }
|
33
40
|
def self.must_be_dev_env!
|
34
41
|
unless Kuby.environment.development?
|
35
42
|
fail "Command not supported in the '#{Kuby.environment.name}' environment"
|
@@ -66,6 +73,7 @@ module Kuby
|
|
66
73
|
rc.action do |global_options, options, args|
|
67
74
|
must_be_dev_env!
|
68
75
|
exit 1 unless tasks.dev_deployment_ok
|
76
|
+
@rails_options = T.let(@rails_options, T.nilable(T::Array[String]))
|
69
77
|
Kuby::RailsCommands.run(@rails_options)
|
70
78
|
end
|
71
79
|
|