kuby-core 0.10.1 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -0
  3. data/Gemfile +1 -0
  4. data/README.md +4 -2
  5. data/kuby-core.gemspec +2 -1
  6. data/lib/kuby-core.rb +1 -0
  7. data/lib/kuby.rb +7 -0
  8. data/lib/kuby/basic_logger.rb +1 -0
  9. data/lib/kuby/cli_base.rb +1 -0
  10. data/lib/kuby/commands.rb +1 -0
  11. data/lib/kuby/definition.rb +1 -0
  12. data/lib/kuby/dev_setup.rb +1 -0
  13. data/lib/kuby/docker.rb +3 -0
  14. data/lib/kuby/docker/alpine.rb +16 -12
  15. data/lib/kuby/docker/assets_phase.rb +5 -0
  16. data/lib/kuby/docker/bundler_phase.rb +36 -2
  17. data/lib/kuby/docker/cli.rb +36 -2
  18. data/lib/kuby/docker/copy_phase.rb +11 -3
  19. data/lib/kuby/docker/credentials.rb +1 -0
  20. data/lib/kuby/docker/debian.rb +14 -10
  21. data/lib/kuby/docker/dev_spec.rb +82 -18
  22. data/lib/kuby/docker/distro.rb +43 -0
  23. data/lib/kuby/docker/dockerfile.rb +66 -18
  24. data/lib/kuby/docker/errors.rb +8 -0
  25. data/lib/kuby/docker/inline_layer.rb +7 -0
  26. data/lib/kuby/docker/layer.rb +11 -0
  27. data/lib/kuby/docker/layer_stack.rb +43 -6
  28. data/lib/kuby/docker/local_tags.rb +23 -2
  29. data/lib/kuby/docker/metadata.rb +35 -7
  30. data/lib/kuby/docker/package_list.rb +22 -3
  31. data/lib/kuby/docker/package_phase.rb +25 -5
  32. data/lib/kuby/docker/packages.rb +1 -0
  33. data/lib/kuby/docker/packages/managed_package.rb +20 -2
  34. data/lib/kuby/docker/packages/nodejs.rb +8 -0
  35. data/lib/kuby/docker/packages/package.rb +15 -1
  36. data/lib/kuby/docker/packages/simple_managed_package.rb +10 -1
  37. data/lib/kuby/docker/packages/yarn.rb +14 -0
  38. data/lib/kuby/docker/remote_tags.rb +21 -2
  39. data/lib/kuby/docker/setup_phase.rb +35 -4
  40. data/lib/kuby/docker/spec.rb +89 -13
  41. data/lib/kuby/docker/tags.rb +37 -2
  42. data/lib/kuby/docker/timestamp_tag.rb +14 -2
  43. data/lib/kuby/docker/webserver_phase.rb +40 -5
  44. data/lib/kuby/docker/yarn_phase.rb +5 -0
  45. data/lib/kuby/environment.rb +4 -0
  46. data/lib/kuby/kubernetes.rb +1 -0
  47. data/lib/kuby/kubernetes/deploy_task.rb +1 -0
  48. data/lib/kuby/kubernetes/deployer.rb +1 -0
  49. data/lib/kuby/kubernetes/docker_config.rb +1 -0
  50. data/lib/kuby/kubernetes/docker_desktop_provider.rb +1 -0
  51. data/lib/kuby/kubernetes/errors.rb +1 -0
  52. data/lib/kuby/kubernetes/manifest.rb +1 -0
  53. data/lib/kuby/kubernetes/provider.rb +1 -0
  54. data/lib/kuby/kubernetes/registry_secret.rb +1 -0
  55. data/lib/kuby/kubernetes/spec.rb +1 -0
  56. data/lib/kuby/middleware.rb +1 -0
  57. data/lib/kuby/middleware/health_check.rb +1 -0
  58. data/lib/kuby/plugin.rb +1 -0
  59. data/lib/kuby/plugin_registry.rb +1 -0
  60. data/lib/kuby/plugins.rb +1 -0
  61. data/lib/kuby/plugins/nginx_ingress.rb +1 -0
  62. data/lib/kuby/plugins/rails_app.rb +1 -0
  63. data/lib/kuby/plugins/rails_app/asset_copy_task.rb +1 -0
  64. data/lib/kuby/plugins/rails_app/assets.rb +1 -0
  65. data/lib/kuby/plugins/rails_app/database.rb +9 -7
  66. data/lib/kuby/plugins/rails_app/generators/kuby.rb +43 -40
  67. data/lib/kuby/plugins/rails_app/mysql.rb +1 -0
  68. data/lib/kuby/plugins/rails_app/plugin.rb +10 -5
  69. data/lib/kuby/plugins/rails_app/postgres.rb +1 -0
  70. data/lib/kuby/plugins/rails_app/rewrite_db_config.rb +1 -0
  71. data/lib/kuby/plugins/rails_app/sqlite.rb +1 -0
  72. data/lib/kuby/rails_commands.rb +1 -0
  73. data/lib/kuby/railtie.rb +1 -0
  74. data/lib/kuby/tasks.rb +1 -0
  75. data/lib/kuby/trailing_hash.rb +5 -3
  76. data/lib/kuby/version.rb +3 -1
  77. data/spec/docker/metadata_spec.rb +1 -0
  78. data/spec/docker/spec_spec.rb +37 -0
  79. data/spec/docker/timestamp_tag_spec.rb +1 -0
  80. data/spec/dummy/app/channels/application_cable/channel.rb +1 -0
  81. data/spec/dummy/app/channels/application_cable/connection.rb +1 -0
  82. data/spec/dummy/app/controllers/application_controller.rb +1 -0
  83. data/spec/dummy/app/helpers/application_helper.rb +1 -0
  84. data/spec/dummy/app/jobs/application_job.rb +1 -0
  85. data/spec/dummy/app/mailers/application_mailer.rb +1 -0
  86. data/spec/dummy/app/models/application_record.rb +1 -0
  87. data/spec/dummy/config/application.rb +1 -0
  88. data/spec/dummy/config/boot.rb +1 -0
  89. data/spec/dummy/config/environment.rb +1 -0
  90. data/spec/dummy/config/environments/development.rb +1 -0
  91. data/spec/dummy/config/environments/production.rb +1 -0
  92. data/spec/dummy/config/environments/test.rb +1 -0
  93. data/spec/dummy/config/initializers/application_controller_renderer.rb +1 -0
  94. data/spec/dummy/config/initializers/assets.rb +1 -0
  95. data/spec/dummy/config/initializers/backtrace_silencers.rb +1 -0
  96. data/spec/dummy/config/initializers/content_security_policy.rb +1 -0
  97. data/spec/dummy/config/initializers/cookies_serializer.rb +1 -0
  98. data/spec/dummy/config/initializers/filter_parameter_logging.rb +1 -0
  99. data/spec/dummy/config/initializers/inflections.rb +1 -0
  100. data/spec/dummy/config/initializers/mime_types.rb +1 -0
  101. data/spec/dummy/config/initializers/wrap_parameters.rb +1 -0
  102. data/spec/dummy/config/puma.rb +1 -0
  103. data/spec/dummy/config/routes.rb +1 -0
  104. data/spec/dummy/config/spring.rb +1 -0
  105. data/spec/dummy/db/seeds.rb +1 -0
  106. data/spec/dummy/test/application_system_test_case.rb +1 -0
  107. data/spec/dummy/test/channels/application_cable/connection_test.rb +1 -0
  108. data/spec/dummy/test/test_helper.rb +1 -0
  109. data/spec/spec_helper.rb +10 -0
  110. data/spec/support/docker/fake_cli.rb +1 -0
  111. data/spec/support/docker/remote/fake_client.rb +1 -0
  112. data/spec/trailing_hash_spec.rb +2 -0
  113. metadata +20 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2b7d982098e06b6e511fe3404385d6762c9f37fdf7df2ac91ce9775f40ce809e
4
- data.tar.gz: b23e5c83e32a488ba8effb2ff3a8fd0f2834c305f6046072bcd6dd1e54c1f0e9
3
+ metadata.gz: 63e975e73abc299262e996d4bc336f951633d993c8fe56ce997543fb442abe57
4
+ data.tar.gz: 1a662d6ff200ecf2b9b8fdd7446d0936329599d940afd06800166537bf82005e
5
5
  SHA512:
6
- metadata.gz: d64e1c94a33045be652d9bbea27d68ec905779f8e67339a03f3e5a10729e2f9c0622f120cf66a08ab8978152dc2ae4bd863d74cca60588e9d4f0b96d484ca72a
7
- data.tar.gz: acd984606d103c17d5150cca2fbba13757051c277733d360868cc79145472dd77e7f536fd8c71687d62da09c7eaad59fc5071aa590d95d08c4367a2ba61d1b35
6
+ metadata.gz: 30d01ba9e76b0bc79c0d22c63ab65a4edbec0f35add876935233402ae6c96077adeb1b91cef3003858f0534441b1939beae31872860ba453ef3b9ef13aa84d76
7
+ data.tar.gz: bb75588789e02dc6bf4135ab59fb401d1ce8e07d8169460ff86282128d1ea610e01de01c44e564c4a9196959a9f6975640f0c14407bd3d02e8257499b0723099
@@ -1,3 +1,14 @@
1
+ ## 0.11.0
2
+ * Defer evaluation of database config until after Kuby has been configured.
3
+ - 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.
4
+ * Fix tests broken in 0.10.1.
5
+ * Set up Travis CI builds.
6
+ * Add a few tests for custom build phases.
7
+ * 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.
8
+ * Add sorbet typedefs for some classes.
9
+ * Fix issue in Rails generator (hadn't been updated with new `environment` block).
10
+ * Add kuby-core.rb so Bundler setup works for Kuby without having to add a Rails initializer.
11
+
1
12
  ## 0.10.1
2
13
  * Fix bug causing some `rails` and `rake` commands to not be executed.
3
14
  * Fix issue restricting Docker CLI output.
data/Gemfile CHANGED
@@ -5,6 +5,7 @@ gemspec
5
5
  group :development, :test do
6
6
  gem 'pry-byebug'
7
7
  gem 'rake'
8
+ gem 'sorbet', '~> 0.5'
8
9
  end
9
10
 
10
11
  group :test do
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://github.com/getkuby/kuby-core/wiki/Quick-Start-Guide)
25
+ See the [Quick Start Guide](https://getkuby.io/docs)
24
26
 
25
27
  ## More Info
26
28
 
27
- See the [wiki](https://github.com/getkuby/kuby-core/wiki).
29
+ Check out [getkuby.io](https://getkuby.io).
28
30
 
29
31
  ## Running Tests
30
32
 
@@ -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.3'
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
 
@@ -0,0 +1 @@
1
+ require 'kuby'
@@ -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
 
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  require 'logger'
2
3
  require 'colorized_string'
3
4
 
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  require 'open3'
2
3
  require 'thread'
3
4
 
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  require 'kuby/version'
2
3
  require 'gli'
3
4
 
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  module Kuby
2
3
  class Definition
3
4
  attr_reader :app_name
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  module Kuby
2
3
  class Spinner
3
4
  PIECES = %w(- \\ | /).freeze
@@ -1,3 +1,5 @@
1
+ # typed: strict
2
+
1
3
  require 'kuby/docker/errors'
2
4
 
3
5
  module Kuby
@@ -10,6 +12,7 @@ module Kuby
10
12
  autoload :Credentials, 'kuby/docker/credentials'
11
13
  autoload :Debian, 'kuby/docker/debian'
12
14
  autoload :DevSpec, 'kuby/docker/dev_spec'
15
+ autoload :Distro, 'kuby/docker/distro'
13
16
  autoload :Dockerfile, 'kuby/docker/dockerfile'
14
17
  autoload :InlineLayer, 'kuby/docker/inline_layer'
15
18
  autoload :Layer, 'kuby/docker/layer'
@@ -1,40 +1,43 @@
1
+ # typed: strict
2
+
1
3
  module Kuby
2
4
  module Docker
3
- class Alpine
4
- SHELL_EXE = '/bin/sh'.freeze
5
+ class Alpine < Distro
6
+ SHELL_EXE = T.let('/bin/sh'.freeze, String)
5
7
 
6
- DEFAULT_PACKAGES = [
7
- [:ca_certificates],
8
+ DEFAULT_PACKAGES = T.let([
9
+ [:ca_certificates, nil],
8
10
  [:nodejs, '12.14.1'],
9
11
  [:yarn, '1.21.1'],
10
- [:c_toolchain],
11
- [:tzdata]
12
- ].freeze
12
+ [:c_toolchain, nil],
13
+ [:tzdata, nil]
14
+ ].freeze, T::Array[[Symbol, T.nilable(String)]])
13
15
 
16
+ sig { returns(Layer) }
14
17
  attr_reader :phase
15
18
 
16
- def initialize(phase)
17
- @phase = phase
18
- end
19
-
19
+ sig { override.params(packages: T::Array[Distro::PackageImpl], into: Dockerfile).void }
20
20
  def install(packages, into:)
21
21
  dockerfile = into
22
22
  install_managed(packages, dockerfile)
23
23
  install_unmanaged(packages, dockerfile)
24
24
  end
25
25
 
26
+ sig { override.returns(T::Array[[Symbol, T.nilable(String)]]) }
26
27
  def default_packages
27
28
  DEFAULT_PACKAGES
28
29
  end
29
30
 
31
+ sig { override.returns(String) }
30
32
  def shell_exe
31
33
  SHELL_EXE
32
34
  end
33
35
 
34
36
  private
35
37
 
38
+ sig { params(packages: T::Array[Distro::PackageImpl], dockerfile: Dockerfile).void }
36
39
  def install_managed(packages, dockerfile)
37
- pkgs = packages.select(&:managed?)
40
+ pkgs = T.cast(packages.select(&:managed?), T::Array[Distro::ManagedPackageImpl])
38
41
 
39
42
  unless pkgs.empty?
40
43
  package_names = pkgs.map { |pkg| pkg.package_name_for(:alpine) }
@@ -44,6 +47,7 @@ module Kuby
44
47
  end
45
48
  end
46
49
 
50
+ sig { params(packages: T::Array[Distro::PackageImpl], dockerfile: Dockerfile).void }
47
51
  def install_unmanaged(packages, dockerfile)
48
52
  packages
49
53
  .reject(&:managed?)
@@ -1,6 +1,11 @@
1
+ # typed: strict
2
+
1
3
  module Kuby
2
4
  module Docker
3
5
  class AssetsPhase < Layer
6
+ extend T::Sig
7
+
8
+ sig { override.params(dockerfile: Dockerfile).void }
4
9
  def apply_to(dockerfile)
5
10
  dockerfile.run(
6
11
  'bundle', 'exec', 'rake', 'assets:precompile'
@@ -1,12 +1,44 @@
1
+ # typed: strict
2
+
1
3
  require 'pathname'
2
4
 
3
5
  module Kuby
4
6
  module Docker
5
7
  class BundlerPhase < Layer
6
- DEFAULT_WITHOUT = ['development', 'test', 'deploy'].freeze
8
+ extend T::Sig
9
+
10
+ DEFAULT_WITHOUT = T.let(
11
+ ['development', 'test', 'deploy'].freeze, T::Array[String]
12
+ )
13
+
14
+ sig { returns(T.nilable(String)) }
15
+ attr_reader :version
16
+
17
+ sig { params(version: String).void }
18
+ attr_writer :version
19
+
20
+ sig { returns(T.nilable(String)) }
21
+ attr_reader :gemfile
7
22
 
8
- attr_accessor :version, :gemfile, :without
23
+ sig { params(gemfile: String).void }
24
+ attr_writer :gemfile
25
+
26
+ sig { returns(T.nilable(T::Array[String])) }
27
+ attr_reader :without
28
+
29
+ sig { params(without: T::Array[String]).void }
30
+ attr_writer :without
31
+
32
+ sig { params(environment: Environment).void }
33
+ def initialize(environment)
34
+ super
35
+
36
+ @version = T.let(@version, T.nilable(String))
37
+ @gemfile = T.let(@gemfile, T.nilable(String))
38
+ @without = T.let(@without, T.nilable(T::Array[String]))
39
+ end
9
40
 
41
+ sig { override.params(dockerfile: Dockerfile).void }
10
42
  def apply_to(dockerfile)
11
43
  gf = gemfile || default_gemfile
12
44
  lf = "#{gf}.lock"
@@ -41,10 +73,12 @@ module Kuby
41
73
 
42
74
  private
43
75
 
76
+ sig { returns(String) }
44
77
  def default_version
45
78
  Bundler::VERSION
46
79
  end
47
80
 
81
+ sig { returns(String) }
48
82
  def default_gemfile
49
83
  Bundler
50
84
  .definition
@@ -1,3 +1,5 @@
1
+ # typed: strict
2
+
1
3
  require 'json'
2
4
  require 'open3'
3
5
  require 'shellwords'
@@ -5,22 +7,29 @@ require 'shellwords'
5
7
  module Kuby
6
8
  module Docker
7
9
  class CLI < CLIBase
10
+ extend T::Sig
11
+
12
+ sig { returns(String) }
8
13
  attr_reader :executable
9
14
 
15
+ sig { params(executable: T.nilable(String)).void }
10
16
  def initialize(executable = nil)
11
- @executable = executable || `which docker`.strip
17
+ @executable = T.let(executable || `which docker`.strip, String)
12
18
  end
13
19
 
20
+ sig { returns(T.nilable(String)) }
14
21
  def config_file
15
22
  if File.exist?(default_config_file)
16
23
  default_config_file
17
24
  end
18
25
  end
19
26
 
27
+ sig { returns(String) }
20
28
  def default_config_file
21
29
  File.join(Dir.home, '.docker', 'config.json')
22
30
  end
23
31
 
32
+ sig { params(url: String, username: String, password: String).void }
24
33
  def login(url:, username:, password:)
25
34
  cmd = [
26
35
  executable, 'login', url, '--username', username, '--password-stdin'
@@ -36,13 +45,23 @@ module Kuby
36
45
  end
37
46
  end
38
47
 
48
+ sig { returns(T::Array[String]) }
39
49
  def auths
40
50
  return [] unless config_file
41
51
 
42
- config = JSON.parse(File.read(config_file))
52
+ config = JSON.parse(File.read(T.must(config_file)))
43
53
  config.fetch('auths', {}).keys
44
54
  end
45
55
 
56
+ sig {
57
+ params(
58
+ dockerfile: Dockerfile,
59
+ image_url: String,
60
+ tags: T::Array[String],
61
+ build_args: T::Hash[T.any(Symbol, String), String]
62
+ )
63
+ .void
64
+ }
46
65
  def build(dockerfile:, image_url:, tags:, build_args: {})
47
66
  cmd = [
48
67
  executable, 'build',
@@ -63,6 +82,15 @@ module Kuby
63
82
  end
64
83
  end
65
84
 
85
+ sig {
86
+ params(
87
+ image_url: String,
88
+ tag: String,
89
+ env: T::Hash[T.any(Symbol, String), String],
90
+ ports: T::Array[T.any(String, Integer)]
91
+ )
92
+ .void
93
+ }
66
94
  def run(image_url:, tag: 'latest', env: {}, ports: [])
67
95
  cmd = [
68
96
  executable, 'run',
@@ -76,6 +104,7 @@ module Kuby
76
104
  execc(cmd)
77
105
  end
78
106
 
107
+ sig { params(image_url: String).returns(T::Array[T::Hash[Symbol, String]]) }
79
108
  def images(image_url)
80
109
  cmd = [
81
110
  executable, 'images', image_url,
@@ -89,6 +118,7 @@ module Kuby
89
118
  end
90
119
  end
91
120
 
121
+ sig { params(image_url: String, tag: String).void }
92
122
  def push(image_url, tag)
93
123
  systemm([
94
124
  executable, 'push', "#{image_url}:#{tag}"
@@ -100,6 +130,7 @@ module Kuby
100
130
  end
101
131
  end
102
132
 
133
+ sig { params(image_url: String, tag: String).void }
103
134
  def pull(image_url, tag)
104
135
  systemm([
105
136
  executable, 'pull', "#{image_url}:#{tag}"
@@ -111,14 +142,17 @@ module Kuby
111
142
  end
112
143
  end
113
144
 
145
+ sig { returns(Symbol) }
114
146
  def status_key
115
147
  :kuby_docker_cli_last_status
116
148
  end
117
149
 
150
+ sig { returns(Symbol) }
118
151
  def stdout_key
119
152
  :kuby_docker_stdout
120
153
  end
121
154
 
155
+ sig { returns(Symbol) }
122
156
  def stderr_key
123
157
  :kuby_docker_stderr
124
158
  end
@@ -1,19 +1,27 @@
1
+ # typed: strict
2
+
1
3
  module Kuby
2
4
  module Docker
3
5
  class CopyPhase < Layer
4
- DEFAULT_PATHS = ['./'].freeze
6
+ extend T::Sig
7
+
8
+ DEFAULT_PATHS = T.let(['./'].freeze, T::Array[String])
5
9
 
10
+ sig { returns(T::Array[String]) }
6
11
  attr_reader :paths
7
12
 
8
- def initialize(*args)
13
+ sig { params(environment: Environment).void }
14
+ def initialize(environment)
9
15
  super
10
- @paths = []
16
+ @paths = T.let([], T::Array[String])
11
17
  end
12
18
 
19
+ sig { params(path: String).void }
13
20
  def <<(path)
14
21
  paths << path
15
22
  end
16
23
 
24
+ sig { params(dockerfile: Dockerfile).void }
17
25
  def apply_to(dockerfile)
18
26
  to_copy = paths.empty? ? DEFAULT_PATHS : paths
19
27
  to_copy.each { |path| dockerfile.copy(path, '.') }
@@ -1,3 +1,4 @@
1
+ # typed: strict
1
2
  require 'kube-dsl'
2
3
 
3
4
  module Kuby
@@ -1,38 +1,41 @@
1
+ # typed: strict
2
+
1
3
  module Kuby
2
4
  module Docker
3
- class Debian
4
- SHELL_EXE = '/bin/bash'
5
+ class Debian < Distro
6
+ SHELL_EXE = T.let('/bin/bash'.freeze, String)
5
7
 
6
- DEFAULT_PACKAGES = [
7
- [:ca_certificates],
8
+ DEFAULT_PACKAGES = T.let([
9
+ [:ca_certificates, nil],
8
10
  [:nodejs, '12.14.1'],
9
11
  [:yarn, '1.21.1']
10
- ].freeze
12
+ ].freeze, T::Array[[Symbol, T.nilable(String)]])
11
13
 
14
+ sig { returns(Layer) }
12
15
  attr_reader :phase
13
16
 
14
- def initialize(phase)
15
- @phase = phase
16
- end
17
-
17
+ sig { override.params(packages: T::Array[Distro::PackageImpl], into: Dockerfile).void }
18
18
  def install(packages, into:)
19
19
  dockerfile = into
20
20
  install_managed(packages, dockerfile)
21
21
  install_unmanaged(packages, dockerfile)
22
22
  end
23
23
 
24
+ sig { override.returns(T::Array[[Symbol, T.nilable(String)]]) }
24
25
  def default_packages
25
26
  DEFAULT_PACKAGES
26
27
  end
27
28
 
29
+ sig { override.returns(String) }
28
30
  def shell_exe
29
31
  SHELL_EXE
30
32
  end
31
33
 
32
34
  private
33
35
 
36
+ sig { params(packages: T::Array[Distro::PackageImpl], dockerfile: Dockerfile).void }
34
37
  def install_managed(packages, dockerfile)
35
- pkgs = packages.select(&:managed?)
38
+ pkgs = T.cast(packages.select(&:managed?), T::Array[Distro::ManagedPackageImpl])
36
39
 
37
40
  pkg_cmd = <<~CMD.strip
38
41
  apt-get update -qq && \\
@@ -49,6 +52,7 @@ module Kuby
49
52
  dockerfile.run(pkg_cmd)
50
53
  end
51
54
 
55
+ sig { params(packages: T::Array[Distro::PackageImpl], dockerfile: Dockerfile).void }
52
56
  def install_unmanaged(packages, dockerfile)
53
57
  packages
54
58
  .reject(&:managed?)