kuby-core 0.16.0 → 0.18.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +58 -0
  3. data/Gemfile +6 -2
  4. data/Rakefile +5 -3
  5. data/bin/tapioca +29 -0
  6. data/kuby-core.gemspec +9 -11
  7. data/lib/kuby/basic_logger.rb +34 -34
  8. data/lib/kuby/cli_base.rb +43 -43
  9. data/lib/kuby/commands.rb +135 -21
  10. data/lib/kuby/definition.rb +12 -12
  11. data/lib/kuby/dependable.rb +20 -0
  12. data/lib/kuby/dependency.rb +14 -0
  13. data/lib/kuby/docker/alpine.rb +10 -10
  14. data/lib/kuby/docker/app_image.rb +11 -20
  15. data/lib/kuby/docker/app_phase.rb +36 -0
  16. data/lib/kuby/docker/assets_phase.rb +2 -2
  17. data/lib/kuby/docker/bundler_phase.rb +42 -40
  18. data/lib/kuby/docker/cli.rb +72 -37
  19. data/lib/kuby/docker/copy_phase.rb +7 -7
  20. data/lib/kuby/docker/credentials.rb +1 -0
  21. data/lib/kuby/docker/debian.rb +10 -10
  22. data/lib/kuby/docker/distro.rb +13 -13
  23. data/lib/kuby/docker/docker_uri.rb +20 -20
  24. data/lib/kuby/docker/dockerfile.rb +48 -39
  25. data/lib/kuby/docker/image.rb +66 -54
  26. data/lib/kuby/docker/inline_layer.rb +4 -4
  27. data/lib/kuby/docker/layer.rb +6 -6
  28. data/lib/kuby/docker/layer_stack.rb +35 -35
  29. data/lib/kuby/docker/local_tags.rb +16 -16
  30. data/lib/kuby/docker/package_list.rb +16 -16
  31. data/lib/kuby/docker/package_phase.rb +16 -16
  32. data/lib/kuby/docker/packages/managed_package.rb +13 -13
  33. data/lib/kuby/docker/packages/nodejs.rb +5 -5
  34. data/lib/kuby/docker/packages/package.rb +8 -8
  35. data/lib/kuby/docker/packages/simple_managed_package.rb +7 -7
  36. data/lib/kuby/docker/packages/yarn.rb +6 -6
  37. data/lib/kuby/docker/remote_tags.rb +16 -16
  38. data/lib/kuby/docker/setup_phase.rb +18 -20
  39. data/lib/kuby/docker/spec.rb +93 -72
  40. data/lib/kuby/docker/timestamp_tag.rb +16 -11
  41. data/lib/kuby/docker/timestamped_image.rb +64 -38
  42. data/lib/kuby/docker/webserver_phase.rb +20 -20
  43. data/lib/kuby/docker/yarn_phase.rb +29 -5
  44. data/lib/kuby/docker.rb +2 -1
  45. data/lib/kuby/kubernetes/bare_metal_provider.rb +12 -10
  46. data/lib/kuby/kubernetes/deployer.rb +22 -10
  47. data/lib/kuby/kubernetes/docker_config.rb +1 -0
  48. data/lib/kuby/kubernetes/provider.rb +1 -0
  49. data/lib/kuby/kubernetes/spec.rb +63 -13
  50. data/lib/kuby/plugin.rb +23 -1
  51. data/lib/kuby/plugin_registry.rb +15 -0
  52. data/lib/kuby/plugins/nginx_ingress.rb +8 -6
  53. data/lib/kuby/plugins/rails_app/assets.rb +16 -4
  54. data/lib/kuby/plugins/rails_app/assets_image.rb +18 -11
  55. data/lib/kuby/plugins/rails_app/crdb/plugin.rb +473 -0
  56. data/lib/kuby/plugins/rails_app/crdb.rb +9 -0
  57. data/lib/kuby/plugins/rails_app/database.rb +12 -8
  58. data/lib/kuby/plugins/rails_app/generators/kuby.rb +17 -16
  59. data/lib/kuby/plugins/rails_app/plugin.rb +37 -27
  60. data/lib/kuby/plugins/rails_app/sqlite.rb +7 -3
  61. data/lib/kuby/plugins/rails_app/tasks.rake +25 -12
  62. data/lib/kuby/plugins/rails_app.rb +1 -0
  63. data/lib/kuby/plugins/system.rb +16 -0
  64. data/lib/kuby/plugins.rb +1 -0
  65. data/lib/kuby/railtie.rb +31 -1
  66. data/lib/kuby/tasks.rb +91 -10
  67. data/lib/kuby/trailing_hash.rb +2 -2
  68. data/lib/kuby/utils/sem_ver/constraint.rb +68 -0
  69. data/lib/kuby/utils/sem_ver/constraint_set.rb +25 -0
  70. data/lib/kuby/utils/sem_ver/version.rb +49 -0
  71. data/lib/kuby/utils/sem_ver.rb +17 -0
  72. data/lib/kuby/utils/table.rb +35 -0
  73. data/lib/kuby/utils/which.rb +65 -0
  74. data/lib/kuby/utils.rb +11 -0
  75. data/lib/kuby/version.rb +1 -1
  76. data/lib/kuby.rb +37 -2
  77. data/rbi/kuby-core.rbi +2128 -0
  78. data/spec/docker/spec_spec.rb +50 -26
  79. data/spec/docker/timestamped_image_spec.rb +2 -2
  80. data/spec/dummy/app/channels/application_cable/channel.rb +2 -1
  81. data/spec/dummy/app/channels/application_cable/connection.rb +2 -1
  82. data/spec/dummy/app/controllers/application_controller.rb +2 -1
  83. data/spec/dummy/app/jobs/application_job.rb +2 -1
  84. data/spec/dummy/app/mailers/application_mailer.rb +2 -1
  85. data/spec/dummy/app/models/application_record.rb +2 -1
  86. data/spec/dummy/config/application.rb +2 -1
  87. data/spec/dummy/config/initializers/wrap_parameters.rb +2 -1
  88. data/spec/dummy/config/routes.rb +2 -1
  89. data/spec/dummy/test/application_system_test_case.rb +2 -1
  90. data/spec/dummy/test/channels/application_cable/connection_test.rb +2 -1
  91. data/spec/spec_helper.rb +13 -1
  92. metadata +46 -39
  93. data/lib/kuby/plugins/rails_app/mysql.rb +0 -158
  94. data/lib/kuby/plugins/rails_app/postgres.rb +0 -163
@@ -4,29 +4,29 @@ module Kuby
4
4
  module Docker
5
5
  module Packages
6
6
  class Package
7
- extend T::Sig
8
- extend T::Helpers
7
+ # extend T::Sig
8
+ # extend T::Helpers
9
9
 
10
- abstract!
10
+ # abstract!
11
11
 
12
- sig { returns(Symbol) }
12
+ # T::Sig::WithoutRuntime.sig { returns(Symbol) }
13
13
  attr_reader :name
14
14
 
15
- sig { returns(T.nilable(String)) }
15
+ # T::Sig::WithoutRuntime.sig { returns(T.nilable(String)) }
16
16
  attr_reader :version
17
17
 
18
- sig { params(name: Symbol, version: T.nilable(String)).void }
18
+ # T::Sig::WithoutRuntime.sig { params(name: Symbol, version: T.nilable(String)).void }
19
19
  def initialize(name, version = nil)
20
20
  @name = name
21
21
  @version = version
22
22
  end
23
23
 
24
- sig { params(ver: String).returns(T.self_type) }
24
+ # T::Sig::WithoutRuntime.sig { params(ver: String).returns(T.self_type) }
25
25
  def with_version(ver)
26
26
  self.class.new(name, ver)
27
27
  end
28
28
 
29
- sig { returns(T::Boolean) }
29
+ # T::Sig::WithoutRuntime.sig { returns(T::Boolean) }
30
30
  def managed?
31
31
  false
32
32
  end
@@ -4,27 +4,27 @@ module Kuby
4
4
  module Docker
5
5
  module Packages
6
6
  class SimpleManagedPackage
7
- extend T::Sig
7
+ # extend T::Sig
8
8
 
9
- sig { returns(String) }
9
+ # T::Sig::WithoutRuntime.sig { returns(String) }
10
10
  attr_reader :name
11
11
 
12
- sig { params(name: String).void }
12
+ # T::Sig::WithoutRuntime.sig { params(name: T.any(String, Symbol)).void }
13
13
  def initialize(name)
14
- @name = name
14
+ @name = name.to_s
15
15
  end
16
16
 
17
- sig { params(distro: Symbol).returns(String) }
17
+ # T::Sig::WithoutRuntime.sig { params(distro: Symbol).returns(String) }
18
18
  def package_name_for(distro)
19
19
  name
20
20
  end
21
21
 
22
- sig { params(ver: String).returns(T.self_type) }
22
+ # T::Sig::WithoutRuntime.sig { params(ver: String).returns(T.self_type) }
23
23
  def with_version(ver)
24
24
  self
25
25
  end
26
26
 
27
- sig { returns(T::Boolean) }
27
+ # T::Sig::WithoutRuntime.sig { returns(T::Boolean) }
28
28
  def managed?
29
29
  true
30
30
  end
@@ -4,16 +4,16 @@ module Kuby
4
4
  module Docker
5
5
  module Packages
6
6
  class Yarn < Package
7
- extend T::Sig
7
+ # extend T::Sig
8
8
 
9
- sig { params(name: Symbol, version: T.nilable(String)).void }
9
+ # T::Sig::WithoutRuntime.sig { params(name: Symbol, version: T.nilable(String)).void }
10
10
  def initialize(name, version = nil)
11
11
  super
12
12
 
13
- @url = T.let(@url, T.nilable(String))
13
+ # @url = T.let(@url, T.nilable(String))
14
14
  end
15
15
 
16
- sig { params(dockerfile: Dockerfile).void }
16
+ # T::Sig::WithoutRuntime.sig { params(dockerfile: Dockerfile).void }
17
17
  def install_on_debian(dockerfile)
18
18
  dockerfile.run(<<~CMD.strip)
19
19
  wget #{url} && \\
@@ -29,7 +29,7 @@ module Kuby
29
29
  dockerfile.env("PATH=$PATH:/opt/yarn/bin")
30
30
  end
31
31
 
32
- sig { params(dockerfile: Dockerfile).void }
32
+ # T::Sig::WithoutRuntime.sig { params(dockerfile: Dockerfile).void }
33
33
  def install_on_alpine(dockerfile)
34
34
  dockerfile.run(<<~CMD.strip)
35
35
  wget #{url} && \\
@@ -47,7 +47,7 @@ module Kuby
47
47
 
48
48
  private
49
49
 
50
- sig { returns(String) }
50
+ # T::Sig::WithoutRuntime.sig { returns(String) }
51
51
  def url
52
52
  @url ||= if version
53
53
  "https://github.com/yarnpkg/yarn/releases/download/v#{version}/yarn-v#{version}.tar.gz"
@@ -5,41 +5,41 @@ require 'docker/remote'
5
5
  module Kuby
6
6
  module Docker
7
7
  class RemoteTags
8
- extend T::Sig
8
+ # extend T::Sig
9
9
 
10
- sig { returns(::Docker::Remote::Client) }
10
+ # T::Sig::WithoutRuntime.sig { returns(::Docker::Remote::Client) }
11
11
  attr_reader :remote_client
12
12
 
13
- sig { returns(String) }
13
+ # T::Sig::WithoutRuntime.sig { returns(String) }
14
14
  attr_reader :image_url
15
15
 
16
- sig {
17
- params(
18
- remote_client: ::Docker::Remote::Client,
19
- image_url: String
20
- )
21
- .void
22
- }
16
+ # T::Sig::WithoutRuntime.sig {
17
+ # params(
18
+ # remote_client: ::Docker::Remote::Client,
19
+ # image_url: String
20
+ # )
21
+ # .void
22
+ # }
23
23
  def initialize(remote_client, image_url)
24
24
  @remote_client = remote_client
25
25
  @image_url = image_url
26
26
  end
27
27
 
28
- sig { returns(T::Array[String]) }
28
+ # T::Sig::WithoutRuntime.sig { returns(T::Array[String]) }
29
29
  def tags
30
- remote_client.tags
31
- rescue ::Docker::Remote::UnknownRepoError
32
- # this can happen if we've never pushed to the repo before
30
+ remote_client.tags || []
31
+ rescue ::Docker::Remote::UnknownRepoError, ::Docker::Remote::UnauthorizedError, ::Docker::Remote::TooManyRetriesError
32
+ # these can happen if we've never pushed to the repo before
33
33
  []
34
34
  end
35
35
 
36
- sig { returns(T::Array[String]) }
36
+ # T::Sig::WithoutRuntime.sig { returns(T::Array[String]) }
37
37
  def latest_tags
38
38
  # not available for remote repos
39
39
  []
40
40
  end
41
41
 
42
- sig { returns(T::Array[TimestampTag]) }
42
+ # T::Sig::WithoutRuntime.sig { returns(T::Array[Kuby::Docker::TimestampTag]) }
43
43
  def timestamp_tags
44
44
  tags.map { |t| TimestampTag.try_parse(t) }.compact
45
45
  end
@@ -3,39 +3,39 @@
3
3
  module Kuby
4
4
  module Docker
5
5
  class SetupPhase < Layer
6
- extend T::Sig
6
+ # extend T::Sig
7
7
 
8
- DEFAULT_WORKING_DIR = T.let('/usr/src/app'.freeze, String)
8
+ DEFAULT_WORKING_DIR = '/usr/src/app'.freeze
9
9
 
10
- sig { params(base_image: String).void }
10
+ # T::Sig::WithoutRuntime.sig { params(base_image: String).returns(String) }
11
11
  attr_writer :base_image
12
12
 
13
- sig { returns(T.nilable(String)) }
13
+ # T::Sig::WithoutRuntime.sig { returns(T.nilable(String)) }
14
14
  attr_reader :working_dir
15
15
 
16
- sig { params(working_dir: String).void }
16
+ # T::Sig::WithoutRuntime.sig { params(working_dir: String).returns(String) }
17
17
  attr_writer :working_dir
18
18
 
19
- sig { returns(T.nilable(String)) }
19
+ # T::Sig::WithoutRuntime.sig { returns(T.nilable(String)) }
20
20
  attr_reader :rails_env
21
21
 
22
- sig { params(rails_env: String).void }
22
+ # T::Sig::WithoutRuntime.sig { params(rails_env: String).returns(String) }
23
23
  attr_writer :rails_env
24
24
 
25
- sig { returns(T.nilable(Docker::Spec)) }
25
+ # T::Sig::WithoutRuntime.sig { returns(Docker::Spec) }
26
26
  attr_reader :docker_spec
27
27
 
28
- sig { params(environment: Environment, docker_spec: Docker::Spec).void }
28
+ # T::Sig::WithoutRuntime.sig { params(environment: Environment, docker_spec: Docker::Spec).void }
29
29
  def initialize(environment, docker_spec)
30
30
  super(environment)
31
31
 
32
- @base_image = T.let(@base_image, T.nilable(String))
33
- @working_dir = T.let(@working_dir, T.nilable(String))
34
- @rails_env = T.let(@rails_env, T.nilable(String))
35
- @docker_spec = T.let(docker_spec, T.nilable(Docker::Spec))
32
+ # @base_image = T.let(@base_image, T.nilable(String))
33
+ # @working_dir = T.let(@working_dir, T.nilable(String))
34
+ # @rails_env = T.let(@rails_env, T.nilable(String))
35
+ @docker_spec = docker_spec
36
36
  end
37
37
 
38
- sig { override.params(dockerfile: Dockerfile).void }
38
+ # T::Sig::WithoutRuntime.sig { override.params(dockerfile: Dockerfile).void }
39
39
  def apply_to(dockerfile)
40
40
  dockerfile.from(base_image)
41
41
  dockerfile.workdir(working_dir || DEFAULT_WORKING_DIR)
@@ -44,24 +44,22 @@ module Kuby
44
44
  dockerfile.arg('RAILS_MASTER_KEY')
45
45
  end
46
46
 
47
- sig { returns(String) }
47
+ # T::Sig::WithoutRuntime.sig { returns(String) }
48
48
  def base_image
49
49
  @base_image || default_base_image
50
50
  end
51
51
 
52
52
  private
53
53
 
54
- sig { returns(String) }
54
+ # T::Sig::WithoutRuntime.sig { returns(String) }
55
55
  def default_base_image
56
- spec = T.must(docker_spec)
57
-
58
- case spec.distro_name
56
+ case docker_spec.distro_name
59
57
  when :debian
60
58
  "ruby:#{RUBY_VERSION}"
61
59
  when :alpine
62
60
  "ruby:#{RUBY_VERSION}-alpine"
63
61
  else
64
- raise MissingDistroError, "distro '#{spec.distro_name}' hasn't been registered"
62
+ raise MissingDistroError, "distro '#{docker_spec.distro_name}' hasn't been registered"
65
63
  end
66
64
  end
67
65
  end
@@ -3,201 +3,221 @@
3
3
  module Kuby
4
4
  module Docker
5
5
  class Spec
6
- extend T::Sig
6
+ # extend T::Sig
7
7
 
8
8
  DEFAULT_DISTRO = :debian
9
+ DEFAULT_APP_ROOT_PATH = '.'.freeze
9
10
 
10
- sig { returns(Environment) }
11
+ # T::Sig::WithoutRuntime.sig { returns(Kuby::Environment) }
11
12
  attr_reader :environment
12
13
 
13
- sig { returns(T.nilable(String)) }
14
+ # T::Sig::WithoutRuntime.sig { returns(T.nilable(String)) }
14
15
  attr_reader :image_url_str
15
16
 
16
- sig { returns(T.nilable(String)) }
17
+ # T::Sig::WithoutRuntime.sig { returns(T.nilable(String)) }
17
18
  attr_reader :registry_index_url_str
18
19
 
19
- sig { params(environment: Environment).void }
20
+ # T::Sig::WithoutRuntime.sig { returns(T.nilable(String)) }
21
+ attr_reader :app_root_path
22
+
23
+ # T::Sig::WithoutRuntime.sig { returns T.nilable(Kuby::Docker::AppImage) }
24
+ attr_reader :image
25
+
26
+ # T::Sig::WithoutRuntime.sig { params(environment: Kuby::Environment).void }
20
27
  def initialize(environment)
21
28
  @environment = environment
22
29
 
23
- @credentials = T.let(@credentials, T.nilable(Credentials))
24
- @setup_phase = T.let(@setup_phase, T.nilable(SetupPhase))
25
- @package_phase = T.let(@package_phase, T.nilable(PackagePhase))
26
- @bundler_phase = T.let(@bundler_phase, T.nilable(BundlerPhase))
27
- @yarn_phase = T.let(@yarn_phase, T.nilable(YarnPhase))
28
- @copy_phase = T.let(@copy_phase, T.nilable(CopyPhase))
29
- @assets_phase = T.let(@assets_phase, T.nilable(AssetsPhase))
30
- @webserver_phase = T.let(@webserver_phase, T.nilable(WebserverPhase))
30
+ # @credentials = T.let(@credentials, T.nilable(Credentials))
31
+ # @setup_phase = T.let(@setup_phase, T.nilable(SetupPhase))
32
+ # @package_phase = T.let(@package_phase, T.nilable(PackagePhase))
33
+ # @bundler_phase = T.let(@bundler_phase, T.nilable(BundlerPhase))
34
+ # @yarn_phase = T.let(@yarn_phase, T.nilable(YarnPhase))
35
+ # @copy_phase = T.let(@copy_phase, T.nilable(CopyPhase))
36
+ # @app_phase = T.let(@app_phase, T.nilable(AppPhase))
37
+ # @assets_phase = T.let(@assets_phase, T.nilable(AssetsPhase))
38
+ # @webserver_phase = T.let(@webserver_phase, T.nilable(WebserverPhase))
31
39
 
32
- @distro_name = T.let(@distro_name, T.nilable(Symbol))
33
- @distro_spec = T.let(@distro_spec, T.nilable(Distro))
34
- @layer_stack = T.let(@layer_stack, T.nilable(Kuby::Docker::LayerStack))
40
+ # @distro_name = T.let(@distro_name, T.nilable(Symbol))
41
+ # @distro_spec = T.let(@distro_spec, T.nilable(Distro))
42
+ # @layer_stack = T.let(@layer_stack, T.nilable(Kuby::Docker::LayerStack))
35
43
 
36
- @image_url_str = T.let(@image_url_str, T.nilable(String))
37
- @registry_index_url_str = T.let(@registry_index_url_str, T.nilable(String))
38
- @image = T.let(@image, T.nilable(Docker::AppImage))
44
+ # @image_url_str = T.let(@image_url_str, T.nilable(String))
45
+ # @registry_index_url_str = T.let(@registry_index_url_str, T.nilable(String))
46
+ # @image = T.let(@image, T.nilable(Docker::AppImage))
47
+
48
+ @app_root_path = DEFAULT_APP_ROOT_PATH
39
49
  end
40
50
 
41
- sig { returns(Symbol) }
51
+ # T::Sig::WithoutRuntime.sig { returns(Symbol) }
42
52
  def distro_name
43
53
  @distro_name || DEFAULT_DISTRO
44
54
  end
45
55
 
46
- sig { params(image_url: String).void }
56
+ # T::Sig::WithoutRuntime.sig { params(image_url: String).void }
47
57
  def base_image(image_url)
48
58
  setup_phase.base_image = image_url
49
59
  end
50
60
 
51
- sig { params(dir: String).void }
61
+ # T::Sig::WithoutRuntime.sig { params(dir: String).void }
52
62
  def working_dir(dir)
53
63
  setup_phase.working_dir = dir
54
64
  end
55
65
 
56
- sig { params(env: String).void }
66
+ # T::Sig::WithoutRuntime.sig { params(env: String).void }
57
67
  def rails_env(env)
58
68
  setup_phase.rails_env = env
59
69
  end
60
70
 
61
- sig { params(version: String).void }
71
+ # T::Sig::WithoutRuntime.sig { params(version: String).void }
62
72
  def bundler_version(version)
63
73
  bundler_phase.version = version
64
74
  end
65
75
 
66
- sig { params(path: String).void }
76
+ # T::Sig::WithoutRuntime.sig { params(path: String).void }
67
77
  def gemfile(path)
68
78
  bundler_phase.gemfile = path
69
79
  end
70
80
 
71
- sig {
72
- params(
73
- package_name: Symbol,
74
- version: T.nilable(String)
75
- )
76
- .void
77
- }
81
+ # T::Sig::WithoutRuntime.sig { params(path: String).void }
82
+ def app_root(path)
83
+ @app_root_path = path
84
+ end
85
+
86
+ # T::Sig::WithoutRuntime.sig {
87
+ # params(
88
+ # package_name: Symbol,
89
+ # version: T.nilable(String)
90
+ # )
91
+ # .void
92
+ # }
78
93
  def package(package_name, version = nil)
79
94
  package_phase.add(package_name, version)
80
95
  end
81
96
 
82
- sig { params(distro_name: Symbol).void }
97
+ # T::Sig::WithoutRuntime.sig { params(distro_name: Symbol).void }
83
98
  def distro(distro_name)
84
99
  @distro_name = distro_name
85
100
  @distro_spec = nil
86
101
  end
87
102
 
88
- sig { params(path: String).void }
103
+ # T::Sig::WithoutRuntime.sig { params(path: String).void }
89
104
  def files(path)
90
105
  copy_phase << path
91
106
  end
92
107
 
93
- sig { params(port: Integer).void }
108
+ # T::Sig::WithoutRuntime.sig { params(port: Integer).void }
94
109
  def port(port)
95
110
  webserver_phase.port = port
96
111
  end
97
112
 
98
- sig { params(url: String).void }
113
+ # T::Sig::WithoutRuntime.sig { params(url: String).void }
99
114
  def image_url(url)
100
115
  @image_url_str = url
101
116
  end
102
117
 
103
- sig { params(url: String).void }
118
+ # T::Sig::WithoutRuntime.sig { params(url: String).void }
104
119
  def registry_index_url(url)
105
120
  @registry_index_url_str = url
106
121
  end
107
122
 
108
- sig {
109
- params(
110
- name: Symbol,
111
- layer: T.nilable(Layer),
112
- block: T.nilable(T.proc.params(df: Dockerfile).void)
113
- )
114
- .void
115
- }
123
+ # T::Sig::WithoutRuntime.sig {
124
+ # params(
125
+ # name: Symbol,
126
+ # layer: T.nilable(Layer),
127
+ # block: T.nilable(T.proc.params(df: Kuby::Docker::Dockerfile).void)
128
+ # )
129
+ # .void
130
+ # }
116
131
  def use(name, layer = nil, &block)
117
132
  layer_stack.use(name, layer, &block)
118
133
  end
119
134
 
120
- sig {
121
- params(
122
- name: Symbol,
123
- layer: T.nilable(T.any(Layer, T::Hash[Symbol, T.untyped])),
124
- options: T::Hash[Symbol, T.untyped],
125
- block: T.nilable(T.proc.params(df: Dockerfile).void)
126
- )
127
- .void
128
- }
135
+ # T::Sig::WithoutRuntime.sig {
136
+ # params(
137
+ # name: Symbol,
138
+ # layer: T.nilable(T.any(Layer, T::Hash[Symbol, T.untyped])),
139
+ # options: T::Hash[Symbol, T.untyped],
140
+ # block: T.nilable(T.proc.params(df: Dockerfile).void)
141
+ # )
142
+ # .void
143
+ # }
129
144
  def insert(name, layer = nil, options = {}, &block)
130
145
  layer_stack.insert(name, layer, options, &block)
131
146
  end
132
147
 
133
- sig { params(name: Symbol).void }
148
+ # T::Sig::WithoutRuntime.sig { params(name: Symbol).void }
134
149
  def delete(name)
135
150
  layer_stack.delete(name)
136
151
  end
137
152
 
138
- sig { params(name: Symbol).returns(T::Boolean) }
153
+ # T::Sig::WithoutRuntime.sig { params(name: Symbol).returns(T::Boolean) }
139
154
  def exists?(name)
140
155
  layer_stack.includes?(name)
141
156
  end
142
157
 
143
- sig {
144
- params(block: T.nilable(T.proc.void)).returns(Credentials)
145
- }
158
+ # T::Sig::WithoutRuntime.sig {
159
+ # params(block: T.nilable(T.proc.void)).returns(Kuby::Docker::Credentials)
160
+ # }
146
161
  def credentials(&block)
147
162
  @credentials ||= Credentials.new
148
163
  @credentials.instance_eval(&block) if block
149
164
  @credentials
150
165
  end
151
166
 
152
- sig { returns(Docker::AppImage) }
153
- def image
154
- @image ||= begin
167
+ # T::Sig::WithoutRuntime.sig { void }
168
+ def after_configuration
169
+ @image = begin
155
170
  dockerfile = Dockerfile.new.tap do |df|
156
171
  layer_stack.each { |layer| layer.apply_to(df) }
157
172
  end
158
173
 
159
174
  Docker::AppImage.new(
160
- dockerfile, T.must(image_url_str), credentials, registry_index_url_str
175
+ dockerfile, image_url_str, credentials, registry_index_url_str
161
176
  )
162
177
  end
163
178
  end
164
179
 
165
- sig { returns(SetupPhase) }
180
+ # T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::SetupPhase) }
166
181
  def setup_phase
167
182
  @setup_phase ||= SetupPhase.new(environment, self)
168
183
  end
169
184
 
170
- sig { returns(PackagePhase) }
185
+ # T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::PackagePhase) }
171
186
  def package_phase
172
187
  @package_phase ||= PackagePhase.new(environment)
173
188
  end
174
189
 
175
- sig { returns(BundlerPhase) }
190
+ # T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::BundlerPhase) }
176
191
  def bundler_phase
177
192
  @bundler_phase ||= BundlerPhase.new(environment)
178
193
  end
179
194
 
180
- sig { returns(YarnPhase) }
195
+ # T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::YarnPhase) }
181
196
  def yarn_phase
182
197
  @yarn_phase ||= YarnPhase.new(environment)
183
198
  end
184
199
 
185
- sig { returns(CopyPhase) }
200
+ # T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::CopyPhase) }
186
201
  def copy_phase
187
202
  @copy_phase ||= CopyPhase.new(environment)
188
203
  end
189
204
 
190
- sig { returns(AssetsPhase) }
205
+ # T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::AppPhase) }
206
+ def app_phase
207
+ @app_phase ||= AppPhase.new(environment)
208
+ end
209
+
210
+ # T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::AssetsPhase) }
191
211
  def assets_phase
192
212
  @assets_phase ||= AssetsPhase.new(environment)
193
213
  end
194
214
 
195
- sig { returns(WebserverPhase) }
215
+ # T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::WebserverPhase) }
196
216
  def webserver_phase
197
217
  @webserver_phase ||= WebserverPhase.new(environment)
198
218
  end
199
219
 
200
- sig { returns(Distro) }
220
+ # T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::Distro) }
201
221
  def distro_spec
202
222
  @distro_spec ||= if distro_klass = Kuby.distros[distro_name]
203
223
  distro_klass.new(self)
@@ -208,7 +228,7 @@ module Kuby
208
228
 
209
229
  private
210
230
 
211
- sig { returns(Kuby::Docker::LayerStack) }
231
+ # T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::LayerStack) }
212
232
  def layer_stack
213
233
  @layer_stack ||= Kuby::Docker::LayerStack.new.tap do |stack|
214
234
  stack.use(:setup_phase, setup_phase)
@@ -216,6 +236,7 @@ module Kuby
216
236
  stack.use(:bundler_phase, bundler_phase)
217
237
  stack.use(:yarn_phase, yarn_phase)
218
238
  stack.use(:copy_phase, copy_phase)
239
+ stack.use(:app_phase, app_phase)
219
240
  stack.use(:assets_phase, assets_phase)
220
241
  stack.use(:webserver_phase, webserver_phase)
221
242
  end
@@ -5,11 +5,11 @@ require 'time'
5
5
  module Kuby
6
6
  module Docker
7
7
  class TimestampTag
8
- extend T::Sig
8
+ # extend T::Sig
9
9
 
10
- FORMAT = T.let('%Y%m%d%H%M%S'.freeze, String)
10
+ FORMAT = '%Y%m%d%H%M%S'.freeze
11
11
 
12
- sig { params(str: T.nilable(String)).returns(T.nilable(TimestampTag)) }
12
+ # T::Sig::WithoutRuntime.sig { params(str: T.nilable(String)).returns(T.nilable(Kuby::Docker::TimestampTag)) }
13
13
  def self.try_parse(str)
14
14
  return nil unless str
15
15
 
@@ -27,35 +27,40 @@ module Kuby
27
27
  new(time)
28
28
  end
29
29
 
30
- sig { returns(Time) }
30
+ # T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::TimestampTag) }
31
+ def self.now
32
+ new(Time.now.utc)
33
+ end
34
+
35
+ # T::Sig::WithoutRuntime.sig { returns(Time) }
31
36
  attr_reader :time
32
37
 
33
- sig { params(time: Time).void }
38
+ # T::Sig::WithoutRuntime.sig { params(time: Time).void }
34
39
  def initialize(time)
35
- @time = T.let(time, Time)
40
+ @time = time
36
41
  end
37
42
 
38
- sig { returns(String) }
43
+ # T::Sig::WithoutRuntime.sig { returns(String) }
39
44
  def to_s
40
45
  time.strftime(FORMAT)
41
46
  end
42
47
 
43
- sig { params(other: TimestampTag).returns(T.nilable(Integer)) }
48
+ # T::Sig::WithoutRuntime.sig { params(other: Kuby::Docker::TimestampTag).returns(T.nilable(Integer)) }
44
49
  def <=>(other)
45
50
  time <=> other.time
46
51
  end
47
52
 
48
- sig { params(other: TimestampTag).returns(T::Boolean) }
53
+ # T::Sig::WithoutRuntime.sig { params(other: Kuby::Docker::TimestampTag).returns(T::Boolean) }
49
54
  def ==(other)
50
55
  time == other.time
51
56
  end
52
57
 
53
- sig { returns(Integer) }
58
+ # T::Sig::WithoutRuntime.sig { returns(Integer) }
54
59
  def hash
55
60
  time.hash
56
61
  end
57
62
 
58
- sig { params(other: TimestampTag).returns(T::Boolean) }
63
+ # T::Sig::WithoutRuntime.sig { params(other: Kuby::Docker::TimestampTag).returns(T::Boolean) }
59
64
  def eql?(other)
60
65
  time == other.time
61
66
  end