kuby-core 0.17.0 → 0.18.0

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.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +44 -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 +94 -11
  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 -11
  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 +71 -43
  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 +59 -40
  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 +9 -9
  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 +47 -7
  50. data/lib/kuby/plugin.rb +22 -1
  51. data/lib/kuby/plugins/nginx_ingress.rb +8 -6
  52. data/lib/kuby/plugins/rails_app/assets.rb +16 -4
  53. data/lib/kuby/plugins/rails_app/assets_image.rb +17 -8
  54. data/lib/kuby/plugins/rails_app/crdb/plugin.rb +473 -0
  55. data/lib/kuby/plugins/rails_app/crdb.rb +9 -0
  56. data/lib/kuby/plugins/rails_app/database.rb +12 -8
  57. data/lib/kuby/plugins/rails_app/generators/kuby.rb +17 -16
  58. data/lib/kuby/plugins/rails_app/plugin.rb +29 -18
  59. data/lib/kuby/plugins/rails_app/sqlite.rb +7 -3
  60. data/lib/kuby/plugins/rails_app/tasks.rake +25 -12
  61. data/lib/kuby/plugins/rails_app.rb +1 -0
  62. data/lib/kuby/plugins/system.rb +16 -0
  63. data/lib/kuby/plugins.rb +1 -0
  64. data/lib/kuby/railtie.rb +31 -1
  65. data/lib/kuby/tasks.rb +72 -5
  66. data/lib/kuby/trailing_hash.rb +2 -2
  67. data/lib/kuby/utils/sem_ver/constraint.rb +68 -0
  68. data/lib/kuby/utils/sem_ver/constraint_set.rb +25 -0
  69. data/lib/kuby/utils/sem_ver/version.rb +49 -0
  70. data/lib/kuby/utils/sem_ver.rb +17 -0
  71. data/lib/kuby/utils/which.rb +65 -0
  72. data/lib/kuby/utils.rb +7 -1
  73. data/lib/kuby/version.rb +1 -1
  74. data/lib/kuby.rb +37 -2
  75. data/rbi/kuby-core.rbi +2128 -0
  76. data/spec/docker/spec_spec.rb +50 -26
  77. data/spec/dummy/app/channels/application_cable/channel.rb +2 -1
  78. data/spec/dummy/app/channels/application_cable/connection.rb +2 -1
  79. data/spec/dummy/app/controllers/application_controller.rb +2 -1
  80. data/spec/dummy/app/jobs/application_job.rb +2 -1
  81. data/spec/dummy/app/mailers/application_mailer.rb +2 -1
  82. data/spec/dummy/app/models/application_record.rb +2 -1
  83. data/spec/dummy/config/application.rb +2 -1
  84. data/spec/dummy/config/initializers/wrap_parameters.rb +2 -1
  85. data/spec/dummy/config/routes.rb +2 -1
  86. data/spec/dummy/test/application_system_test_case.rb +2 -1
  87. data/spec/dummy/test/channels/application_cable/connection_test.rb +2 -1
  88. data/spec/spec_helper.rb +13 -1
  89. metadata +44 -39
  90. data/lib/kuby/plugins/rails_app/mysql.rb +0 -158
  91. data/lib/kuby/plugins/rails_app/postgres.rb +0 -163
@@ -3,39 +3,39 @@
3
3
  module Kuby
4
4
  module Docker
5
5
  class Debian < Distro
6
- SHELL_EXE = T.let('/bin/bash'.freeze, String)
6
+ SHELL_EXE = '/bin/bash'.freeze
7
7
 
8
- DEFAULT_PACKAGES = T.let([
8
+ DEFAULT_PACKAGES = [
9
9
  [:ca_certificates, nil],
10
10
  [:nodejs, '12.14.1'],
11
11
  [:yarn, '1.21.1']
12
- ].freeze, T::Array[[Symbol, T.nilable(String)]])
12
+ ].freeze
13
13
 
14
- sig { returns(Layer) }
14
+ # T::Sig::WithoutRuntime.sig { returns(Layer) }
15
15
  attr_reader :phase
16
16
 
17
- sig { override.params(packages: T::Array[Distro::PackageImpl], into: Dockerfile).void }
17
+ # T::Sig::WithoutRuntime.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
+ # T::Sig::WithoutRuntime.sig { override.returns(T::Array[[Symbol, T.nilable(String)]]) }
25
25
  def default_packages
26
26
  DEFAULT_PACKAGES
27
27
  end
28
28
 
29
- sig { override.returns(String) }
29
+ # T::Sig::WithoutRuntime.sig { override.returns(String) }
30
30
  def shell_exe
31
31
  SHELL_EXE
32
32
  end
33
33
 
34
34
  private
35
35
 
36
- sig { params(packages: T::Array[Distro::PackageImpl], dockerfile: Dockerfile).void }
36
+ # T::Sig::WithoutRuntime.sig { params(packages: T::Array[Distro::PackageImpl], dockerfile: Dockerfile).void }
37
37
  def install_managed(packages, dockerfile)
38
- pkgs = T.cast(packages.select(&:managed?), T::Array[Distro::ManagedPackageImpl])
38
+ pkgs = packages.select(&:managed?)
39
39
 
40
40
  pkg_cmd = <<~CMD.strip
41
41
  apt-get update -qq && \\
@@ -52,7 +52,7 @@ module Kuby
52
52
  dockerfile.run(pkg_cmd)
53
53
  end
54
54
 
55
- sig { params(packages: T::Array[Distro::PackageImpl], dockerfile: Dockerfile).void }
55
+ # T::Sig::WithoutRuntime.sig { params(packages: T::Array[Distro::PackageImpl], dockerfile: Dockerfile).void }
56
56
  def install_unmanaged(packages, dockerfile)
57
57
  packages
58
58
  .reject(&:managed?)
@@ -3,37 +3,37 @@
3
3
  module Kuby
4
4
  module Docker
5
5
  class Distro
6
- extend T::Sig
7
- extend T::Helpers
6
+ # extend T::Sig
7
+ # extend T::Helpers
8
8
 
9
- abstract!
9
+ # abstract!
10
10
 
11
- PackageImpl = T.type_alias {
12
- T.any(Packages::Package, Packages::ManagedPackage, Packages::SimpleManagedPackage)
13
- }
11
+ # PackageImpl = T.type_alias {
12
+ # T.any(Packages::Package, Packages::ManagedPackage, Packages::SimpleManagedPackage)
13
+ # }
14
14
 
15
- ManagedPackageImpl = T.type_alias {
16
- T.any(Packages::ManagedPackage, Packages::SimpleManagedPackage)
17
- }
15
+ # ManagedPackageImpl = T.type_alias {
16
+ # T.any(Packages::ManagedPackage, Packages::SimpleManagedPackage)
17
+ # }
18
18
 
19
- sig { params(phase: Layer).void }
19
+ # T::Sig::WithoutRuntime.sig { params(phase: Layer).void }
20
20
  def initialize(phase)
21
21
  @phase = phase
22
22
  end
23
23
 
24
- sig { params(packages: T::Array[PackageImpl], into: Dockerfile).void }
24
+ # T::Sig::WithoutRuntime.sig { params(packages: T::Array[PackageImpl], into: Dockerfile).void }
25
25
  def install(packages, into:)
26
26
  raise NotImplementedError,
27
27
  "#{__method__} must be defined in derived classes"
28
28
  end
29
29
 
30
- sig { returns(T::Array[[Symbol, T.nilable(String)]]) }
30
+ # T::Sig::WithoutRuntime.sig { returns(T::Array[[Symbol, T.nilable(String)]]) }
31
31
  def default_packages
32
32
  raise NotImplementedError,
33
33
  "#{__method__} must be defined in derived classes"
34
34
  end
35
35
 
36
- sig { returns(String) }
36
+ # T::Sig::WithoutRuntime.sig { returns(String) }
37
37
  def shell_exe
38
38
  raise NotImplementedError,
39
39
  "#{__method__} must be defined in derived classes"
@@ -3,13 +3,13 @@
3
3
  module Kuby
4
4
  module Docker
5
5
  class DockerURI
6
- extend T::Sig
6
+ # extend T::Sig
7
7
 
8
- DEFAULT_REGISTRY_HOST = T.let('docker.io'.freeze, String)
9
- DEFAULT_REGISTRY_INDEX_HOST = T.let('index.docker.io'.freeze, String)
10
- DEFAULT_PORT = T.let(443, Integer)
8
+ DEFAULT_REGISTRY_HOST = 'docker.io'.freeze
9
+ DEFAULT_REGISTRY_INDEX_HOST = 'index.docker.io'.freeze
10
+ DEFAULT_PORT = 443
11
11
 
12
- sig { params(url: String).returns(DockerURI) }
12
+ # T::Sig::WithoutRuntime.sig { params(url: String).returns(DockerURI) }
13
13
  def self.parse_uri(url)
14
14
  parse(
15
15
  url,
@@ -18,7 +18,7 @@ module Kuby
18
18
  )
19
19
  end
20
20
 
21
- sig { params(url: String).returns(DockerURI) }
21
+ # T::Sig::WithoutRuntime.sig { params(url: String).returns(DockerURI) }
22
22
  def self.parse_index_uri(url)
23
23
  parse(
24
24
  url,
@@ -27,13 +27,13 @@ module Kuby
27
27
  )
28
28
  end
29
29
 
30
- sig {
31
- params(
32
- url: String,
33
- default_host: T.nilable(String),
34
- default_port: T.nilable(Integer)
35
- ).returns(DockerURI)
36
- }
30
+ # T::Sig::WithoutRuntime.sig {
31
+ # params(
32
+ # url: String,
33
+ # default_host: T.nilable(String),
34
+ # default_port: T.nilable(Integer)
35
+ # ).returns(DockerURI)
36
+ # }
37
37
  def self.parse(url, default_host:, default_port:)
38
38
  if idx = url.index('://')
39
39
  url = url[(idx + 3)..-1] || ''
@@ -41,8 +41,8 @@ module Kuby
41
41
 
42
42
  host_port, *path = url.split('/')
43
43
  host, port, *path = if host_port =~ /[.:]/
44
- hst, prt = T.must(host_port).split(':')
45
- [T.must(hst), prt || default_port, *path]
44
+ hst, prt = host_port.split(':')
45
+ [hst, prt || default_port, *path]
46
46
  else
47
47
  [default_host, default_port, host_port, *path]
48
48
  end
@@ -50,23 +50,23 @@ module Kuby
50
50
  new(host.to_s, port.to_i, (path || []).join('/'))
51
51
  end
52
52
 
53
- sig { returns(String) }
53
+ # T::Sig::WithoutRuntime.sig { returns(String) }
54
54
  attr_reader :host
55
55
 
56
- sig { returns(Integer) }
56
+ # T::Sig::WithoutRuntime.sig { returns(Integer) }
57
57
  attr_reader :port
58
58
 
59
- sig { returns(String) }
59
+ # T::Sig::WithoutRuntime.sig { returns(String) }
60
60
  attr_reader :path
61
61
 
62
- sig { params(host: String, port: Integer, path: String).void }
62
+ # T::Sig::WithoutRuntime.sig { params(host: String, port: Integer, path: String).void }
63
63
  def initialize(host, port, path)
64
64
  @host = host
65
65
  @port = port
66
66
  @path = path
67
67
  end
68
68
 
69
- sig { returns(T::Boolean) }
69
+ # T::Sig::WithoutRuntime.sig { returns(T::Boolean) }
70
70
  def has_default_port?
71
71
  port == DEFAULT_PORT
72
72
  end
@@ -5,39 +5,39 @@ require 'digest'
5
5
  module Kuby
6
6
  module Docker
7
7
  class Dockerfile
8
- extend T::Sig
8
+ # extend T::Sig
9
9
 
10
10
  class Command
11
- extend T::Sig
11
+ # extend T::Sig
12
12
 
13
- sig { returns(T::Array[T.any(String, Integer)]) }
13
+ # T::Sig::WithoutRuntime.sig { returns(T::Array[T.any(String, Integer)]) }
14
14
  attr_reader :args
15
15
 
16
- sig { params(args: T::Array[T.any(String, Integer)]).void }
16
+ # T::Sig::WithoutRuntime.sig { params(args: T::Array[T.any(String, Integer)]).void }
17
17
  def initialize(args)
18
18
  @args = args
19
19
  end
20
20
 
21
- sig { returns(String) }
21
+ # T::Sig::WithoutRuntime.sig { returns(String) }
22
22
  def to_s
23
23
  args.join(' ')
24
24
  end
25
25
  end
26
26
 
27
27
  class From < Command
28
- sig { returns(String) }
28
+ # T::Sig::WithoutRuntime.sig { returns(String) }
29
29
  attr_reader :image_url
30
30
 
31
- sig { returns(T.nilable(String)) }
31
+ # T::Sig::WithoutRuntime.sig { returns(T.nilable(String)) }
32
32
  attr_reader :as
33
33
 
34
- sig { params(image_url: String, as: T.nilable(String)).void }
34
+ # T::Sig::WithoutRuntime.sig { params(image_url: String, as: T.nilable(String)).void }
35
35
  def initialize(image_url, as: nil)
36
36
  @image_url = image_url
37
37
  @as = as
38
38
  end
39
39
 
40
- sig { returns(String) }
40
+ # T::Sig::WithoutRuntime.sig { returns(String) }
41
41
  def to_s
42
42
  str = "FROM #{image_url}"
43
43
  str << " AS #{as}" if as
@@ -46,38 +46,38 @@ module Kuby
46
46
  end
47
47
 
48
48
  class Workdir < Command
49
- sig { returns(String) }
49
+ # T::Sig::WithoutRuntime.sig { returns(String) }
50
50
  def to_s; "WORKDIR #{super}"; end
51
51
  end
52
52
 
53
53
  class Env < Command
54
- sig { returns(String) }
54
+ # T::Sig::WithoutRuntime.sig { returns(String) }
55
55
  def to_s; "ENV #{super}"; end
56
56
  end
57
57
 
58
58
  class Run < Command
59
- sig { returns(String) }
59
+ # T::Sig::WithoutRuntime.sig { returns(String) }
60
60
  def to_s; "RUN #{super}"; end
61
61
  end
62
62
 
63
63
  class Copy < Command
64
- sig { returns(String) }
64
+ # T::Sig::WithoutRuntime.sig { returns(String) }
65
65
  attr_reader :source
66
66
 
67
- sig { returns(String) }
67
+ # T::Sig::WithoutRuntime.sig { returns(String) }
68
68
  attr_reader :dest
69
69
 
70
- sig { returns(T.nilable(String)) }
70
+ # T::Sig::WithoutRuntime.sig { returns(T.nilable(String)) }
71
71
  attr_reader :from
72
72
 
73
- sig { params(source: String, dest: String, from: T.nilable(String)).void }
73
+ # T::Sig::WithoutRuntime.sig { params(source: String, dest: String, from: T.nilable(String)).void }
74
74
  def initialize(source, dest, from: nil)
75
75
  @source = source
76
76
  @dest = dest
77
77
  @from = from
78
78
  end
79
79
 
80
- sig { returns(String) }
80
+ # T::Sig::WithoutRuntime.sig { returns(String) }
81
81
  def to_s
82
82
  cmd = ['COPY']
83
83
  cmd << "--from=#{from}" if from
@@ -87,91 +87,100 @@ module Kuby
87
87
  end
88
88
 
89
89
  class Expose < Command
90
- sig { returns(String) }
90
+ # T::Sig::WithoutRuntime.sig { returns(String) }
91
91
  def to_s; "EXPOSE #{super}"; end
92
92
  end
93
93
 
94
94
  class Cmd < Command
95
- sig { returns(String) }
95
+ # T::Sig::WithoutRuntime.sig { returns(String) }
96
96
  def to_s; "CMD #{super}"; end
97
97
  end
98
98
 
99
99
  class Arg < Command
100
- sig { returns(String) }
100
+ # T::Sig::WithoutRuntime.sig { returns(String) }
101
101
  def to_s; "ARG #{super}"; end
102
102
  end
103
103
 
104
- sig { returns(T::Array[Command]) }
104
+ # T::Sig::WithoutRuntime.sig { returns(T::Array[Command]) }
105
105
  attr_reader :commands
106
106
 
107
- sig { returns(Integer) }
107
+ # T::Sig::WithoutRuntime.sig { returns(Integer) }
108
108
  attr_reader :cursor
109
109
 
110
- sig { void }
110
+ # T::Sig::WithoutRuntime.sig { void }
111
111
  def initialize
112
- @commands = T.let([], T::Array[Command])
113
- @cursor = T.let(0, Integer)
112
+ @commands = []
113
+ @cursor = 0
114
114
  end
115
115
 
116
- sig { params(image_url: String, as: T.nilable(String)).void }
116
+ # T::Sig::WithoutRuntime.sig { params(image_url: String, as: T.nilable(String)).void }
117
117
  def from(image_url, as: nil)
118
118
  add From.new(image_url, as: as)
119
119
  end
120
120
 
121
- sig { params(args: String).void }
121
+ # T::Sig::WithoutRuntime.sig { params(args: String).void }
122
122
  def workdir(*args)
123
123
  add Workdir.new(args)
124
124
  end
125
125
 
126
- sig { params(args: String).void }
126
+ # T::Sig::WithoutRuntime.sig { params(args: String).void }
127
127
  def env(*args)
128
128
  add Env.new(args)
129
129
  end
130
130
 
131
- sig { params(args: String).void }
131
+ # T::Sig::WithoutRuntime.sig { params(args: String).void }
132
132
  def arg(*args)
133
133
  add Arg.new(args)
134
134
  end
135
135
 
136
- sig { params(args: String).void }
136
+ # T::Sig::WithoutRuntime.sig { params(args: String).void }
137
137
  def run(*args)
138
138
  add Run.new(args)
139
139
  end
140
140
 
141
- sig { params(source: String, dest: String, from: T.nilable(String)).void }
141
+ # T::Sig::WithoutRuntime.sig { params(source: String, dest: String, from: T.nilable(String)).void }
142
142
  def copy(source, dest, from: nil)
143
143
  add Copy.new(source, dest, from: from)
144
144
  end
145
145
 
146
- sig { params(port: Integer).void }
146
+ # T::Sig::WithoutRuntime.sig { params(port: Integer).void }
147
147
  def expose(port)
148
148
  add Expose.new([port])
149
149
  end
150
150
 
151
- sig { params(args: String).void }
151
+ # T::Sig::WithoutRuntime.sig { params(args: String).void }
152
152
  def cmd(*args)
153
153
  add Cmd.new(args)
154
154
  end
155
155
 
156
- sig { returns(String) }
156
+ # T::Sig::WithoutRuntime.sig { returns(String) }
157
157
  def to_s
158
158
  # ensure trailing newline
159
159
  "#{commands.map(&:to_s).join("\n")}\n"
160
160
  end
161
161
 
162
- sig { returns(String) }
162
+ # T::Sig::WithoutRuntime.sig { returns(String) }
163
163
  def checksum
164
164
  Digest::SHA256.hexdigest(to_s)
165
165
  end
166
166
 
167
- sig { returns(T::Array[Integer]) }
167
+ # T::Sig::WithoutRuntime.sig { returns(T::Array[Integer]) }
168
168
  def exposed_ports
169
169
  commands
170
170
  .select { |c| c.is_a?(Expose) }
171
- .map { |c| T.cast(c.args.first, Integer) }
171
+ .map { |c| c.args.first }
172
172
  end
173
173
 
174
- sig { params(pos: Integer, block: T.proc.void).void }
174
+ # T::Sig::WithoutRuntime.sig { returns(T.nilable(String)) }
175
+ def current_workdir
176
+ found = commands.reverse_each.find do |command|
177
+ command.is_a?(Kuby::Docker::Dockerfile::Workdir)
178
+ end
179
+
180
+ found.args.first if found
181
+ end
182
+
183
+ # T::Sig::WithoutRuntime.sig { params(pos: Integer, block: T.proc.void).void }
175
184
  def insert_at(pos, &block)
176
185
  @cursor = pos
177
186
  yield
@@ -181,7 +190,7 @@ module Kuby
181
190
 
182
191
  private
183
192
 
184
- sig { params(cmd: Command).void }
193
+ # T::Sig::WithoutRuntime.sig { params(cmd: Command).void }
185
194
  def add(cmd)
186
195
  commands.insert(cursor, cmd)
187
196
  @cursor += 1
@@ -3,137 +3,149 @@
3
3
  module Kuby
4
4
  module Docker
5
5
  class Image
6
- extend T::Sig
6
+ # extend T::Sig
7
7
 
8
- sig { returns(T.nilable(String)) }
8
+ # T::Sig::WithoutRuntime.sig { returns(T.nilable(String)) }
9
9
  attr_reader :identifier
10
10
 
11
- sig { returns(String) }
11
+ # T::Sig::WithoutRuntime.sig { returns(String) }
12
12
  attr_reader :image_url
13
13
 
14
- sig { returns(T.nilable(String)) }
14
+ # T::Sig::WithoutRuntime.sig { returns(T.nilable(String)) }
15
15
  attr_reader :registry_index_url
16
16
 
17
- sig { returns(Credentials) }
17
+ # T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::Credentials) }
18
18
  attr_reader :credentials
19
19
 
20
- sig { returns(T.nilable(String)) }
20
+ # T::Sig::WithoutRuntime.sig { returns(T.nilable(String)) }
21
21
  attr_reader :main_tag
22
22
 
23
- sig { returns T::Array[String] }
23
+ # T::Sig::WithoutRuntime.sig { returns T::Array[String] }
24
24
  attr_reader :alias_tags
25
25
 
26
- sig {
27
- params(
28
- dockerfile: T.any(Dockerfile, T.proc.returns(Dockerfile)),
29
- image_url: String,
30
- credentials: Credentials,
31
- registry_index_url: T.nilable(String),
32
- main_tag: T.nilable(String),
33
- alias_tags: T::Array[String]
34
- ).void
35
- }
26
+ # T::Sig::WithoutRuntime.sig {
27
+ # params(
28
+ # dockerfile: T.any(Dockerfile, T.proc.returns(Kuby::Docker::Dockerfile)),
29
+ # image_url: String,
30
+ # credentials: Kuby::Docker::Credentials,
31
+ # registry_index_url: T.nilable(String),
32
+ # main_tag: T.nilable(String),
33
+ # alias_tags: T::Array[String]
34
+ # ).void
35
+ # }
36
36
  def initialize(dockerfile, image_url, credentials, registry_index_url = nil, main_tag = nil, alias_tags = [])
37
- @dockerfile = T.let(dockerfile, T.any(Dockerfile, T.proc.returns(Dockerfile)))
38
- @image_url = T.let(image_url, String)
39
- @registry_index_url = T.let(registry_index_url, T.nilable(String))
40
- @credentials = T.let(credentials, Credentials)
41
- @main_tag = T.let(main_tag, T.nilable(String))
42
- @alias_tags = T.let(alias_tags, T::Array[String])
43
- @identifier = T.let(@identifier, T.nilable(String))
44
-
45
- @image_host = T.let(@image_host, T.nilable(String))
46
- @image_hostname = T.let(@image_hostname, T.nilable(String))
47
- @registry_index_host = T.let(@registry_index_host, T.nilable(String))
48
- @registry_index_hostname = T.let(@registry_index_hostname, T.nilable(String))
49
- @registry_index_uri = T.let(@registry_index_uri, T.nilable(DockerURI))
50
- @image_repo = T.let(@image_repo, T.nilable(String))
51
- @full_image_uri = T.let(@full_image_uri, T.nilable(DockerURI))
52
- @docker_cli = T.let(@docker_cli, T.nilable(Docker::CLI))
53
- end
54
-
55
- sig { returns(Image) }
37
+ @dockerfile = dockerfile
38
+ @image_url = image_url
39
+ @registry_index_url = registry_index_url
40
+ @credentials = credentials
41
+ @main_tag = main_tag
42
+ @alias_tags = alias_tags
43
+ # @identifier = T.let(@identifier, T.nilable(String))
44
+
45
+ # @image_host = T.let(@image_host, T.nilable(String))
46
+ # @image_hostname = T.let(@image_hostname, T.nilable(String))
47
+ # @registry_index_host = T.let(@registry_index_host, T.nilable(String))
48
+ # @registry_index_hostname = T.let(@registry_index_hostname, T.nilable(String))
49
+ # @registry_index_uri = T.let(@registry_index_uri, T.nilable(DockerURI))
50
+ # @image_repo = T.let(@image_repo, T.nilable(String))
51
+ # @full_image_uri = T.let(@full_image_uri, T.nilable(DockerURI))
52
+ # @docker_cli = T.let(@docker_cli, T.nilable(Docker::CLI))
53
+ end
54
+
55
+ # T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::Image) }
56
56
  def new_version
57
57
  raise NotImplementedError, 'please use a Docker::Image subclass'
58
58
  end
59
59
 
60
- sig { returns(Image) }
60
+ # T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::Image) }
61
61
  def current_version
62
62
  raise NotImplementedError, 'please use a Docker::Image subclass'
63
63
  end
64
64
 
65
- sig { params(current_tag: T.nilable(String)).returns(Image) }
65
+ # T::Sig::WithoutRuntime.sig { params(current_tag: T.nilable(String)).returns(Image) }
66
66
  def previous_version(current_tag = nil)
67
67
  raise NotImplementedError, 'please use a Docker::Image subclass'
68
68
  end
69
69
 
70
- sig { returns(Dockerfile) }
70
+ # T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::Dockerfile) }
71
71
  def dockerfile
72
72
  if @dockerfile.respond_to?(:call)
73
- T.cast(@dockerfile, T.proc.returns(Dockerfile)).call
73
+ @dockerfile.call
74
74
  else
75
- T.cast(@dockerfile, Dockerfile)
75
+ @dockerfile
76
76
  end
77
77
  end
78
78
 
79
- sig { returns(String) }
79
+ # T::Sig::WithoutRuntime.sig { returns(String) }
80
80
  def image_host
81
81
  @image_host ||= "#{image_uri.host}:#{image_uri.port}"
82
82
  end
83
83
 
84
- sig { returns(String) }
84
+ # T::Sig::WithoutRuntime.sig { returns(String) }
85
85
  def registry_index_host
86
86
  @registry_index_host ||= "#{registry_index_uri.host}:#{registry_index_uri.port}"
87
87
  end
88
88
 
89
- sig { returns(String) }
89
+ # T::Sig::WithoutRuntime.sig { returns(String) }
90
90
  def registry_index_hostname
91
91
  @registry_index_hostname ||= registry_index_uri.host
92
92
  end
93
93
 
94
- sig { returns(String) }
94
+ # T::Sig::WithoutRuntime.sig { returns(String) }
95
95
  def image_hostname
96
96
  @image_hostname ||= image_uri.host
97
97
  end
98
98
 
99
- sig { returns(String) }
99
+ # T::Sig::WithoutRuntime.sig { returns(String) }
100
100
  def image_repo
101
101
  @image_repo ||= image_uri.path
102
102
  end
103
103
 
104
- sig { returns(DockerURI) }
104
+ # T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::DockerURI) }
105
105
  def image_uri
106
106
  @full_image_uri ||= DockerURI.parse_uri(image_url)
107
107
  end
108
108
 
109
- sig { returns(DockerURI) }
109
+ # T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::DockerURI) }
110
110
  def registry_index_uri
111
111
  @registry_index_uri ||= DockerURI.parse_index_uri(registry_index_url || image_url)
112
112
  end
113
113
 
114
- sig { returns(T::Array[String]) }
114
+ # T::Sig::WithoutRuntime.sig { returns(T::Array[String]) }
115
115
  def tags
116
116
  [main_tag, *alias_tags].compact
117
117
  end
118
118
 
119
- sig { params(build_args: T::Hash[String, String], docker_args: T::Array[String], context: T.nilable(String)).void }
120
- def build(build_args = {}, docker_args = [], context: nil)
119
+ # T::Sig::WithoutRuntime.sig {
120
+ # params(
121
+ # build_args: T::Hash[String, String],
122
+ # docker_args: T::Array[String],
123
+ # context: T.nilable(String),
124
+ # cache_from: T.nilable(String)
125
+ # ).void
126
+ # }
127
+ def build(build_args = {}, docker_args = [], context: nil, cache_from: nil)
121
128
  raise NotImplementedError, 'please use a Docker::Image subclass'
122
129
  end
123
130
 
124
- sig { params(tag: String).void }
131
+ # T::Sig::WithoutRuntime.sig { params(tag: String).void }
125
132
  def push(tag)
126
133
  raise NotImplementedError, 'please use a Docker::Image subclass'
127
134
  end
128
135
 
129
- sig { returns(Docker::CLI) }
136
+ # T::Sig::WithoutRuntime.sig { params(tag: String).void }
137
+ def pull(tag)
138
+ raise NotImplementedError, 'please use a Docker::Image subclass'
139
+ end
140
+
141
+ # T::Sig::WithoutRuntime.sig { returns(Kuby::Docker::CLI) }
130
142
  def docker_cli
131
143
  @docker_cli ||= Docker::CLI.new
132
144
  end
133
145
 
134
146
  private
135
147
 
136
- sig { params(main_tag: String, alias_tags: T::Array[String]).returns(Image) }
148
+ # T::Sig::WithoutRuntime.sig { params(main_tag: String, alias_tags: T::Array[String]).returns(Image) }
137
149
  def duplicate_with_tags(main_tag, alias_tags)
138
150
  self.class.new(dockerfile, image_url, credentials, registry_index_url, main_tag, alias_tags)
139
151
  end
@@ -3,17 +3,17 @@
3
3
  module Kuby
4
4
  module Docker
5
5
  class InlineLayer < Layer
6
- extend T::Sig
6
+ # extend T::Sig
7
7
 
8
- sig { returns(T.proc.params(df: Dockerfile).void) }
8
+ # T::Sig::WithoutRuntime.sig { returns(T.proc.params(df: Dockerfile).void) }
9
9
  attr_reader :block
10
10
 
11
- sig { params(block: T.proc.params(df: Dockerfile).void).void }
11
+ # T::Sig::WithoutRuntime.sig { params(block: T.proc.params(df: Dockerfile).void).void }
12
12
  def initialize(block)
13
13
  @block = block
14
14
  end
15
15
 
16
- sig { override.params(dockerfile: Dockerfile).void }
16
+ # T::Sig::WithoutRuntime.sig { override.params(dockerfile: Dockerfile).void }
17
17
  def apply_to(dockerfile)
18
18
  block.call(dockerfile)
19
19
  end
@@ -3,20 +3,20 @@
3
3
  module Kuby
4
4
  module Docker
5
5
  class Layer
6
- extend T::Sig
7
- extend T::Helpers
6
+ # extend T::Sig
7
+ # extend T::Helpers
8
8
 
9
- abstract!
9
+ # abstract!
10
10
 
11
- sig { returns(Environment) }
11
+ # T::Sig::WithoutRuntime.sig { returns(Environment) }
12
12
  attr_reader :environment
13
13
 
14
- sig { params(environment: Environment).void }
14
+ # T::Sig::WithoutRuntime.sig { params(environment: Environment).void }
15
15
  def initialize(environment)
16
16
  @environment = environment
17
17
  end
18
18
 
19
- sig { params(dockerfile: Dockerfile).void }
19
+ # T::Sig::WithoutRuntime.sig { params(dockerfile: Dockerfile).void }
20
20
  def apply_to(dockerfile)
21
21
  raise NotImplementedError,
22
22
  "#{__method__} must be defined in derived classes"