kuby-core 0.11.1 → 0.11.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8664691d15dc7ba054a6986e9b62ef0ad3fc1ff7aa9e80a12595bee3029b7814
4
- data.tar.gz: 1a29a74242aa420dbf1c8c50804f85b24716d479f226bd8b411fdb5794031d41
3
+ metadata.gz: a3a59a9d3e923807647da18d834d994cc7b2d149f4c82d6d9966d72748d7bcd5
4
+ data.tar.gz: 2bbd8e7d1c92ed3d0eb7d6d05420d7119d6f20a249f4401e52191868baeb0996
5
5
  SHA512:
6
- metadata.gz: 3fd0f6fc04d728e7122287889c6013a3578b4eb4a7bc0ae8903232bbd42b99265567271a6e171ec26838259e193f042558df583c2f66ac7d90454aa2f53943ef
7
- data.tar.gz: e3480ec344cd46ca020cc7f4615028490f721ed21887b1c45efcb0d17f4d2e1739741946768ed52bab8a1fa75f417ff061a5c970a331fa003520044e0cfca508
6
+ metadata.gz: d8bf5fce8051029c8231e915035ec6c704ab361a6008b5335bf8a6747fb106ed55869164bb15eb704ecd72e6366ee320664d23d128a74726b6ca320edcb5c442
7
+ data.tar.gz: 679ad59207c201fb710e47e69c4682676a6fb12c826b59350a74d98c48f212d358c50fde0f8da0a5804391738d442a839cb4560d2cebd61ec7e7955677bd8e53
@@ -1,3 +1,7 @@
1
+ ## 0.11.2
2
+ * Attempt to auto-require the requested provider if it isn't registered.
3
+ * Adjust error message when provider can't be found to include reminder to add a require statement.
4
+
1
5
  ## 0.11.1
2
6
  * Use integers for ports instead of strings to appease Kubernetes.
3
7
 
@@ -1,10 +1,30 @@
1
- # typed: false
1
+ # typed: strict
2
+
2
3
  require 'logger'
3
4
  require 'colorized_string'
4
5
 
5
6
  module Kuby
6
7
  class BasicLogger < Logger
7
- def initialize(*args)
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
+
8
28
  super
9
29
 
10
30
  self.formatter = proc do |_severity, _datetime, _progname, msg|
@@ -12,23 +32,51 @@ module Kuby
12
32
  end
13
33
  end
14
34
 
15
- def info(msg, *args)
16
- super(ColorizedString[msg].yellow, *args)
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
17
47
  end
18
48
 
19
- def fatal(msg, *args)
20
- super(ColorizedString[msg].red, *args)
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
21
61
  end
22
62
 
23
63
  # adhere to the "CLI" interface
24
- def with_pipes(out = STDOUT, err = STDERR)
25
- previous_logdev = @logdev || STDERR
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
26
73
  reopen(err)
27
74
  yield
28
75
  ensure
29
76
  reopen(previous_logdev)
30
77
  end
31
78
 
79
+ sig { returns(T.nilable(Process::Status)) }
32
80
  def last_status
33
81
  nil
34
82
  end
@@ -1,24 +1,39 @@
1
- # typed: true
1
+ # typed: strict
2
+
2
3
  require 'open3'
3
4
  require 'thread'
4
5
 
5
6
  module Kuby
6
7
  class CLIBase
8
+ extend T::Sig
9
+
10
+ sig { returns(T.nilable(Process::Status)) }
7
11
  def last_status
8
12
  Thread.current[status_key]
9
13
  end
10
14
 
15
+ sig { params(block: T.proc.params(cmd: String).void).void }
11
16
  def before_execute(&block)
17
+ @before_execute = T.let(@before_execute, T.nilable(T::Array[T.proc.params(cmd: String).void]))
12
18
  @before_execute ||= []
13
19
  @before_execute << block
14
20
  end
15
21
 
22
+ sig { params(block: T.proc.params(cmd: String).void).void }
16
23
  def after_execute(&block)
24
+ @after_execute = T.let(@after_execute, T.nilable(T::Array[T.proc.params(cmd: String).void]))
17
25
  @after_execute ||= []
18
26
  @after_execute << block
19
27
  end
20
28
 
21
- def with_pipes(out = STDOUT, err = STDERR)
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)
22
37
  previous_stdout = self.stdout
23
38
  previous_stderr = self.stderr
24
39
  self.stdout = out
@@ -29,29 +44,39 @@ module Kuby
29
44
  self.stderr = previous_stderr
30
45
  end
31
46
 
47
+ sig { returns(T.nilable(T.any(IO, StringIO))) }
32
48
  def stdout
33
49
  Thread.current[stdout_key] || STDOUT
34
50
  end
35
51
 
52
+ sig { params(new_stdout: T.nilable(T.any(IO, StringIO))).void }
36
53
  def stdout=(new_stdout)
37
54
  Thread.current[stdout_key] = new_stdout
38
55
  end
39
56
 
57
+ sig { returns(T.nilable(T.any(IO, StringIO))) }
40
58
  def stderr
41
59
  Thread.current[stderr_key] || STDERR
42
60
  end
43
61
 
62
+ sig { params(new_stderr: T.nilable(T.any(IO, StringIO))).void }
44
63
  def stderr=(new_stderr)
45
64
  Thread.current[stderr_key] = new_stderr
46
65
  end
47
66
 
48
67
  private
49
68
 
50
- def open3_w(env, cmd, opts = {}, &block)
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)
51
76
  run_before_callbacks(cmd)
52
77
  cmd_s = cmd.join(' ')
53
78
 
54
- Open3.popen3(env, cmd_s, opts) do |p_stdin, p_stdout, p_stderr, wait_thread|
79
+ Open3.popen3(cmd_s) do |p_stdin, p_stdout, p_stderr, wait_thread|
55
80
  Thread.new(stdout) do |t_stdout|
56
81
  begin
57
82
  p_stdout.each { |line| t_stdout.puts(line) }
@@ -66,21 +91,23 @@ module Kuby
66
91
  end
67
92
  end
68
93
 
69
- yield(p_stdin).tap do
70
- p_stdin.close
71
- self.last_status = wait_thread.value
72
- run_after_callbacks(cmd)
73
- wait_thread.join
74
- end
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
75
100
  end
76
101
  end
77
102
 
103
+ sig { params(cmd: T::Array[String]).void }
78
104
  def execc(cmd)
79
105
  run_before_callbacks(cmd)
80
106
  cmd_s = cmd.join(' ')
81
107
  exec(cmd_s)
82
108
  end
83
109
 
110
+ sig { params(cmd: T::Array[String]).void }
84
111
  def systemm(cmd)
85
112
  if stdout == STDOUT && stderr == STDERR
86
113
  systemm_default(cmd)
@@ -89,6 +116,7 @@ module Kuby
89
116
  end
90
117
  end
91
118
 
119
+ sig { params(cmd: T::Array[String]).void }
92
120
  def systemm_default(cmd)
93
121
  run_before_callbacks(cmd)
94
122
  cmd_s = cmd.join(' ')
@@ -98,6 +126,7 @@ module Kuby
98
126
  end
99
127
  end
100
128
 
129
+ sig { params(cmd: T::Array[String]).void }
101
130
  def systemm_open3(cmd)
102
131
  run_before_callbacks(cmd)
103
132
  cmd_s = cmd.join(' ')
@@ -118,12 +147,14 @@ module Kuby
118
147
  end
119
148
 
120
149
  p_stdin.close
121
- self.last_status = wait_thread.value
150
+ self.last_status = T.cast(wait_thread.value, Process::Status)
122
151
  run_after_callbacks(cmd)
123
152
  wait_thread.join
124
153
  end
125
154
  end
126
155
 
156
+
157
+ sig { params(cmd: T::Array[String]).returns(String) }
127
158
  def backticks(cmd)
128
159
  if stdout == STDOUT && stderr == STDERR
129
160
  backticks_default(cmd)
@@ -132,6 +163,7 @@ module Kuby
132
163
  end
133
164
  end
134
165
 
166
+ sig { params(cmd: T::Array[String]).returns(String) }
135
167
  def backticks_default(cmd)
136
168
  run_before_callbacks(cmd)
137
169
  cmd_s = cmd.join(' ')
@@ -141,6 +173,7 @@ module Kuby
141
173
  end
142
174
  end
143
175
 
176
+ sig { params(cmd: T::Array[String]).returns(String) }
144
177
  def backticks_open3(cmd)
145
178
  run_before_callbacks(cmd)
146
179
  cmd_s = cmd.join(' ')
@@ -162,7 +195,7 @@ module Kuby
162
195
  end
163
196
 
164
197
  p_stdin.close
165
- self.last_status = wait_thread.value
198
+ self.last_status = T.cast(wait_thread.value, Process::Status)
166
199
  run_after_callbacks(cmd)
167
200
  wait_thread.join
168
201
  end
@@ -170,26 +203,32 @@ module Kuby
170
203
  result.string
171
204
  end
172
205
 
206
+ sig { params(cmd: T::Array[String]).void }
173
207
  def run_before_callbacks(cmd)
174
208
  (@before_execute || []).each { |cb| cb.call(cmd) }
175
209
  end
176
210
 
211
+ sig { params(cmd: T::Array[String]).void }
177
212
  def run_after_callbacks(cmd)
178
213
  (@after_execute || []).each { |cb| cb.call(cmd, last_status) }
179
214
  end
180
215
 
216
+ sig { params(status: Process::Status).void }
181
217
  def last_status=(status)
182
218
  Thread.current[status_key] = status
183
219
  end
184
220
 
221
+ sig { returns(Symbol) }
185
222
  def status_key
186
223
  raise NotImplementedError, "#{__method__} must be defined in derived classes"
187
224
  end
188
225
 
226
+ sig { returns(Symbol) }
189
227
  def stdout_key
190
228
  raise NotImplementedError, "#{__method__} must be defined in derived classes"
191
229
  end
192
230
 
231
+ sig { returns(Symbol) }
193
232
  def stderr_key
194
233
  raise NotImplementedError, "#{__method__} must be defined in derived classes"
195
234
  end
@@ -35,13 +35,13 @@ module Kuby
35
35
  executable, 'login', url, '--username', username, '--password-stdin'
36
36
  ]
37
37
 
38
- open3_w({}, cmd) do |stdin, _wait_threads|
38
+ open3_w(cmd) do |stdin, _wait_threads|
39
39
  stdin.puts(password)
40
40
  end
41
41
 
42
- unless last_status.success?
42
+ unless T.must(last_status).success?
43
43
  raise LoginError, 'build failed: docker command exited with '\
44
- "status code #{last_status.exitstatus}"
44
+ "status code #{T.must(last_status).exitstatus}"
45
45
  end
46
46
  end
47
47
 
@@ -72,13 +72,13 @@ module Kuby
72
72
  '-f-', '.'
73
73
  ]
74
74
 
75
- open3_w({}, cmd) do |stdin, _wait_threads|
75
+ open3_w(cmd) do |stdin, _wait_threads|
76
76
  stdin.puts(dockerfile.to_s)
77
77
  end
78
78
 
79
- unless last_status.success?
79
+ unless T.must(last_status).success?
80
80
  raise BuildError, 'build failed: docker command exited with '\
81
- "status code #{last_status.exitstatus}"
81
+ "status code #{T.must(last_status).exitstatus}"
82
82
  end
83
83
  end
84
84
 
@@ -124,9 +124,9 @@ module Kuby
124
124
  executable, 'push', "#{image_url}:#{tag}"
125
125
  ])
126
126
 
127
- unless last_status.success?
127
+ unless T.must(last_status).success?
128
128
  raise PushError, 'push failed: docker command exited with '\
129
- "status code #{last_status.exitstatus}"
129
+ "status code #{T.must(last_status).exitstatus}"
130
130
  end
131
131
  end
132
132
 
@@ -136,9 +136,9 @@ module Kuby
136
136
  executable, 'pull', "#{image_url}:#{tag}"
137
137
  ])
138
138
 
139
- unless last_status.success?
139
+ unless T.must(last_status).success?
140
140
  raise PullError, 'pull failed: docker command exited with '\
141
- "status code #{last_status.exitstatus}"
141
+ "status code #{T.must(last_status).exitstatus}"
142
142
  end
143
143
  end
144
144
 
@@ -18,13 +18,28 @@ module Kuby
18
18
 
19
19
  def provider(provider_name = nil, &block)
20
20
  if provider_name
21
- if @provider || provider_klass = Kuby.providers[provider_name]
22
- @provider ||= provider_klass.new(environment)
21
+ provider_klass = Kuby.providers[provider_name]
22
+
23
+ unless provider_klass
24
+ begin
25
+ # attempt to auto-require
26
+ require "kuby/#{provider_name}"
27
+ provider_klass = Kuby.providers[provider_name]
28
+ rescue LoadError
29
+ end
30
+ end
31
+
32
+ if provider_klass
33
+ if !@provider || !@provider.is_a?(provider_klass)
34
+ @provider = provider_klass.new(environment)
35
+ end
36
+
23
37
  @provider.configure(&block)
24
38
  else
25
39
  msg = if provider_name
26
40
  "no provider registered with name #{provider_name}, "\
27
- 'do you need to add a gem to your Gemfile?'
41
+ 'do you need to add a gem to your Gemfile and/or a '\
42
+ 'require statement to your Kuby config?'
28
43
  else
29
44
  'no provider configured'
30
45
  end
@@ -1,5 +1,5 @@
1
1
  # typed: strict
2
2
 
3
3
  module Kuby
4
- VERSION = '0.11.1'
4
+ VERSION = '0.11.2'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kuby-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.1
4
+ version: 0.11.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cameron Dutro
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-05 00:00:00.000000000 Z
11
+ date: 2020-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize