cli-kit 3.0.1 → 3.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c6c63b562d9e105af0a13a110ad973bbb56d40a4
4
- data.tar.gz: f89728ea2fd0f05ed1c9b6f16dbad900c4bc5595
3
+ metadata.gz: 283b38ecb21fd3caac8399447f06f5bccff261af
4
+ data.tar.gz: fe47b61139d7df53eca531693ba385c44a0c6455
5
5
  SHA512:
6
- metadata.gz: 7088f3a7a238311cb8aaad7e83f74611ef30f2cbe0db5bbdc393d6c7da7ca51e68d54884c73707ea9751644c9ebdec6156829f939f4cf65044b5a690b053450a
7
- data.tar.gz: 19fbec7a9eaee07f188c69f1d776404227f554dc38e44ff08bd2160026a45aac0e843526703ba0a1312bbcb853d2496bd5b5bf2b41d232f1ac033353b05b83c3
6
+ metadata.gz: 6f8723304b346c20418debde33e203bc3794ae0defc4e34308a7c2fbf5364fb22c41f7b7e800bbe5f2fb76a0ac90ca37e980c5ec641c71b3deb19d277d029b19
7
+ data.tar.gz: 6f08ef957f6f63b6fe108b6b6e118b5f887a9050ae8aed548445d8b77ff8ec47ff5a488f881b3e95e3682c30ba7098196876096a5cd70fd7fe312dd74292928c
data/Gemfile CHANGED
@@ -4,13 +4,13 @@ source "https://rubygems.org"
4
4
  gemspec
5
5
 
6
6
  group :development, :test do
7
- gem 'rubocop'
7
+ gem 'rubocop', '~> 0.56.0'
8
8
  gem 'byebug'
9
9
  gem 'method_source'
10
10
  end
11
11
 
12
12
  group :test do
13
- gem 'mocha', require: false
13
+ gem 'mocha', '~> 1.5.0', require: false
14
14
  gem 'minitest', '>= 5.0.0', require: false
15
15
  gem 'minitest-reporters', require: false
16
16
  end
@@ -1,17 +1,17 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cli-kit (3.0.1)
5
- cli-ui (>= 1.1.0)
4
+ cli-kit (3.1.0)
5
+ cli-ui (>= 1.1.4)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
10
  ansi (1.5.0)
11
- ast (2.3.0)
11
+ ast (2.4.0)
12
12
  builder (3.2.3)
13
13
  byebug (9.0.6)
14
- cli-ui (1.1.1)
14
+ cli-ui (1.1.4)
15
15
  metaclass (0.0.4)
16
16
  method_source (0.8.2)
17
17
  minitest (5.10.2)
@@ -20,24 +20,23 @@ GEM
20
20
  builder
21
21
  minitest (>= 5.0)
22
22
  ruby-progressbar
23
- mocha (1.2.1)
23
+ mocha (1.5.0)
24
24
  metaclass (~> 0.0.1)
25
- parallel (1.11.2)
26
- parser (2.4.0.0)
27
- ast (~> 2.2)
25
+ parallel (1.12.1)
26
+ parser (2.5.1.0)
27
+ ast (~> 2.4.0)
28
28
  powerpack (0.1.1)
29
- rainbow (2.2.2)
30
- rake
29
+ rainbow (3.0.0)
31
30
  rake (10.5.0)
32
- rubocop (0.49.1)
31
+ rubocop (0.56.0)
33
32
  parallel (~> 1.10)
34
- parser (>= 2.3.3.1, < 3.0)
33
+ parser (>= 2.5)
35
34
  powerpack (~> 0.1)
36
- rainbow (>= 1.99.1, < 3.0)
35
+ rainbow (>= 2.2.2, < 4.0)
37
36
  ruby-progressbar (~> 1.7)
38
37
  unicode-display_width (~> 1.0, >= 1.0.1)
39
38
  ruby-progressbar (1.8.1)
40
- unicode-display_width (1.3.0)
39
+ unicode-display_width (1.3.2)
41
40
 
42
41
  PLATFORMS
43
42
  ruby
@@ -49,9 +48,9 @@ DEPENDENCIES
49
48
  method_source
50
49
  minitest (>= 5.0.0)
51
50
  minitest-reporters
52
- mocha
51
+ mocha (~> 1.5.0)
53
52
  rake (~> 10.0)
54
- rubocop
53
+ rubocop (~> 0.56.0)
55
54
 
56
55
  BUNDLED WITH
57
56
  1.16.1
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
22
  spec.require_paths = ['lib']
23
23
 
24
- spec.add_runtime_dependency 'cli-ui', '>= 1.1.0'
24
+ spec.add_runtime_dependency 'cli-ui', '>= 1.1.4'
25
25
 
26
26
  spec.add_development_dependency 'bundler', '~> 1.15'
27
27
  spec.add_development_dependency 'rake', '~> 10.0'
@@ -8,7 +8,10 @@ module Gen
8
8
 
9
9
  TOOL_NAME = 'cli-kit'
10
10
  ROOT = File.expand_path('../../..', __FILE__)
11
- LOG_FILE = '/tmp/cli-kit.log'
11
+
12
+ TOOL_CONFIG_PATH = File.expand_path(File.join('~', '.config', TOOL_NAME))
13
+ LOG_FILE = File.join(TOOL_CONFIG_PATH, 'logs', 'log.log')
14
+ DEBUG_LOG_FILE = File.join(TOOL_CONFIG_PATH, 'logs', 'debug.log')
12
15
 
13
16
  autoload(:Generator, 'gen/generator')
14
17
 
@@ -17,6 +20,7 @@ module Gen
17
20
 
18
21
  autocall(:Config) { CLI::Kit::Config.new(tool_name: TOOL_NAME) }
19
22
  autocall(:Command) { CLI::Kit::BaseCommand }
23
+ autocall(:Logger) { CLI::Kit::Logger.new(debug_log_file: DEBUG_LOG_FILE) }
20
24
 
21
25
  autocall(:Executor) { CLI::Kit::Executor.new(log_file: LOG_FILE) }
22
26
  autocall(:Resolver) do
@@ -4,7 +4,7 @@ gem 'cli-kit', '~> __cli-kit-version__'
4
4
  gem 'cli-ui', '~> __cli-ui-version__'
5
5
 
6
6
  group :test do
7
- gem 'mocha', require: false
7
+ gem 'mocha', '~> 1.5.0', require: false
8
8
  gem 'minitest', '>= 5.0.0', require: false
9
9
  gem 'minitest-reporters', require: false
10
10
  end
@@ -6,10 +6,12 @@ module __App__
6
6
 
7
7
  def test_example
8
8
  CLI::Kit::System.fake("ls -al", stdout: "a\nb", success: true)
9
- assert_all_commands_run do
10
- out, = CLI::Kit::System.capture2('ls', '-al')
11
- assert_equal ['a', 'b'], out.split("\n")
12
- end
9
+
10
+ out, = CLI::Kit::System.capture2('ls', '-al')
11
+ assert_equal %w(a b), out.split("\n")
12
+
13
+ errors = assert_all_commands_run(should_raise: false)
14
+ assert_nil errors, "expected command to run successfully"
13
15
  end
14
16
  end
15
17
  end
@@ -18,4 +18,5 @@ require 'bundler/setup'
18
18
  CLI::UI::StdoutRouter.enable
19
19
 
20
20
  require 'minitest/autorun'
21
- require 'mocha/mini_test'
21
+ require "minitest/unit"
22
+ require 'mocha/minitest'
@@ -11,9 +11,11 @@ module CLI
11
11
  autoload :Executor, 'cli/kit/executor'
12
12
  autoload :Ini, 'cli/kit/ini'
13
13
  autoload :Levenshtein, 'cli/kit/levenshtein'
14
+ autoload :Logger, 'cli/kit/logger'
14
15
  autoload :Resolver, 'cli/kit/resolver'
15
16
  autoload :Support, 'cli/kit/support'
16
17
  autoload :System, 'cli/kit/system'
18
+ autoload :Util, 'cli/kit/util'
17
19
 
18
20
  EXIT_FAILURE_BUT_NOT_BUG = 30
19
21
  EXIT_BUG = 1
@@ -17,8 +17,7 @@ module CLI
17
17
 
18
18
  def self.call(args, command_name)
19
19
  cmd = new
20
- stats_tags = ["task:#{cmd.class}"]
21
- stats_tags << "subcommand:#{args.first}" if args && args.first && cmd.has_subcommands?
20
+ stats_tags = cmd.stats_tags(args)
22
21
  begin
23
22
  statsd_increment("cli.command.invoked", tags: stats_tags)
24
23
  statsd_time("cli.command.time", tags: stats_tags) do
@@ -31,6 +30,12 @@ module CLI
31
30
  end
32
31
  end
33
32
 
33
+ def stats_tags(args)
34
+ tags = ["task:#{self.class}"]
35
+ tags << "subcommand:#{args.first}" if args&.first && has_subcommands?
36
+ tags
37
+ end
38
+
34
39
  def call(_args, _command_name)
35
40
  raise NotImplementedError
36
41
  end
@@ -68,7 +68,7 @@ module CLI
68
68
 
69
69
  def resolve_global_command(name)
70
70
  klass = resolve_class(commands.fetch(name, nil))
71
- return nil unless klass && klass.defined?
71
+ return nil unless klass&.defined?
72
72
  [klass, name]
73
73
  rescue NameError
74
74
  nil
@@ -27,6 +27,18 @@ module CLI
27
27
  all_configs.dig("[#{section}]", name) || false
28
28
  end
29
29
 
30
+ # Coalesce and enforce the value of a config to a boolean
31
+ def get_bool(section, name)
32
+ case get(section, name).to_s
33
+ when "true"
34
+ true
35
+ when "false"
36
+ false
37
+ else
38
+ raise CLI::Kit::Abort, "Invalid config: #{section}.#{name} is expected to be true or false"
39
+ end
40
+ end
41
+
30
42
  # Sets the config value in the config file
31
43
  #
32
44
  # #### Parameters
@@ -83,7 +83,7 @@ module CLI
83
83
  CLI::Kit::EXIT_FAILURE_BUT_NOT_BUG
84
84
  rescue Interrupt
85
85
  $stderr.puts(format_error_message("Interrupt"))
86
- return CLI::Kit::EXIT_FAILURE_BUT_NOT_BUG
86
+ CLI::Kit::EXIT_FAILURE_BUT_NOT_BUG
87
87
  end
88
88
 
89
89
  def exception_reporter
@@ -1,22 +1,38 @@
1
1
  require 'cli/kit'
2
2
  require 'English'
3
+ require 'fileutils'
3
4
 
4
5
  module CLI
5
6
  module Kit
6
7
  class Executor
7
8
  def initialize(log_file:)
9
+ FileUtils.mkpath(File.dirname(log_file))
8
10
  @log_file = log_file
9
11
  end
10
12
 
11
13
  def call(command, command_name, args)
12
- with_traps { with_logging { command.call(args, command_name) } }
14
+ with_traps do
15
+ with_logging do |id|
16
+ begin
17
+ command.call(args, command_name)
18
+ rescue => e
19
+ $stderr.puts "This command ran with ID: #{id}"
20
+ $stderr.puts "Please include this information in any issues/report along with relevant logs"
21
+ raise e
22
+ end
23
+ end
24
+ end
13
25
  end
14
26
 
15
27
  private
16
28
 
17
29
  def with_logging(&block)
18
30
  return yield unless @log_file
19
- CLI::UI.log_output_to(@log_file, &block)
31
+ CLI::UI.log_output_to(@log_file) do
32
+ CLI::UI::StdoutRouter.with_id(on_streams: [CLI::UI::StdoutRouter.duplicate_output_to]) do |id|
33
+ block.call(id)
34
+ end
35
+ end
20
36
  end
21
37
 
22
38
  def with_traps
@@ -0,0 +1,76 @@
1
+ require 'logger'
2
+ require 'fileutils'
3
+
4
+ module CLI
5
+ module Kit
6
+ class Logger
7
+ MAX_LOG_SIZE = 5 * 1024 * 1000 # 5MB
8
+ MAX_NUM_LOGS = 10
9
+
10
+ # Constructor for CLI::Kit::Logger
11
+ #
12
+ # @param debug_log_file [String] path to the file where debug logs should be stored
13
+ def initialize(debug_log_file:)
14
+ FileUtils.mkpath(File.dirname(debug_log_file))
15
+ @debug_logger = ::Logger.new(debug_log_file, MAX_NUM_LOGS, MAX_LOG_SIZE)
16
+ end
17
+
18
+ # Functionally equivalent to Logger#info
19
+ # Also logs to the debug file, taking into account CLI::UI::StdoutRouter.current_id
20
+ #
21
+ # @param msg [String] the message to log
22
+ # @param debug [Boolean] determines if the debug logger will receive the log (default true)
23
+ def info(msg, debug: true)
24
+ $stdout.puts CLI::UI.fmt(msg)
25
+ @debug_logger.info(format_debug(msg)) if debug
26
+ end
27
+
28
+ # Functionally equivalent to Logger#warn
29
+ # Also logs to the debug file, taking into account CLI::UI::StdoutRouter.current_id
30
+ #
31
+ # @param msg [String] the message to log
32
+ # @param debug [Boolean] determines if the debug logger will receive the log (default true)
33
+ def warn(msg, debug: true)
34
+ $stdout.puts CLI::UI.fmt("{{yellow:#{msg}}}")
35
+ @debug_logger.warn(format_debug(msg)) if debug
36
+ end
37
+
38
+ # Functionally equivalent to Logger#error
39
+ # Also logs to the debug file, taking into account CLI::UI::StdoutRouter.current_id
40
+ #
41
+ # @param msg [String] the message to log
42
+ # @param debug [Boolean] determines if the debug logger will receive the log (default true)
43
+ def error(msg, debug: true)
44
+ $stderr.puts CLI::UI.fmt("{{red:#{msg}}}")
45
+ @debug_logger.error(format_debug(msg)) if debug
46
+ end
47
+
48
+ # Functionally equivalent to Logger#fatal
49
+ # Also logs to the debug file, taking into account CLI::UI::StdoutRouter.current_id
50
+ #
51
+ # @param msg [String] the message to log
52
+ # @param debug [Boolean] determines if the debug logger will receive the log (default true)
53
+ def fatal(msg, debug: true)
54
+ $stderr.puts CLI::UI.fmt("{{red:{{bold:Fatal:}} #{msg}}}")
55
+ @debug_logger.fatal(format_debug(msg)) if debug
56
+ end
57
+
58
+ # Similar to Logger#debug, however will not output to STDOUT unless DEBUG env var is set
59
+ # Logs to the debug file, taking into account CLI::UI::StdoutRouter.current_id
60
+ #
61
+ # @param msg [String] the message to log
62
+ def debug(msg)
63
+ $stdout.puts CLI::UI.fmt(msg) if ENV['DEBUG']
64
+ @debug_logger.debug(format_debug(msg))
65
+ end
66
+
67
+ private
68
+
69
+ def format_debug(msg)
70
+ msg = CLI::UI.fmt(msg)
71
+ return msg unless CLI::UI::StdoutRouter.current_id
72
+ "[#{CLI::UI::StdoutRouter.current_id[:id]}] #{msg}"
73
+ end
74
+ end
75
+ end
76
+ end
@@ -117,10 +117,10 @@ module CLI
117
117
 
118
118
  handlers = if block_given?
119
119
  { out_r => ->(data) { yield(data.force_encoding(Encoding::UTF_8), '') },
120
- err_r => ->(data) { yield('', data.force_encoding(Encoding::UTF_8)) }, }
120
+ err_r => ->(data) { yield('', data.force_encoding(Encoding::UTF_8)) } }
121
121
  else
122
122
  { out_r => ->(data) { STDOUT.write(data) },
123
- err_r => ->(data) { STDOUT.write(data) }, }
123
+ err_r => ->(data) { STDOUT.write(data) } }
124
124
  end
125
125
 
126
126
  previous_trailing = Hash.new('')
@@ -0,0 +1,189 @@
1
+ module CLI
2
+ module Kit
3
+ module Util
4
+ class << self
5
+ def snake_case(camel_case, seperator = "_")
6
+ camel_case.to_s # MyCoolThing::MyAPIModule
7
+ .gsub(/::/, '/') # MyCoolThing/MyAPIModule
8
+ .gsub(/([A-Z]+)([A-Z][a-z])/, "\\1#{seperator}\\2") # MyCoolThing::MyAPI_Module
9
+ .gsub(/([a-z\d])([A-Z])/, "\\1#{seperator}\\2") # My_Cool_Thing::My_API_Module
10
+ .downcase # my_cool_thing/my_api_module
11
+ end
12
+
13
+ def dash_case(camel_case)
14
+ snake_case(camel_case, '-')
15
+ end
16
+
17
+ # The following methods is taken from activesupport
18
+ # All credit for this method goes to the original authors.
19
+ # https://github.com/rails/rails/blob/d66e7835bea9505f7003e5038aa19b6ea95ceea1/activesupport/lib/active_support/core_ext/string/strip.rb
20
+ #
21
+ # Copyright (c) 2005-2018 David Heinemeier Hansson
22
+ #
23
+ # Permission is hereby granted, free of charge, to any person obtaining
24
+ # a copy of this software and associated documentation files (the
25
+ # "Software"), to deal in the Software without restriction, including
26
+ # without limitation the rights to use, copy, modify, merge, publish,
27
+ # distribute, sublicense, and/or sell copies of the Software, and to
28
+ # permit persons to whom the Software is furnished to do so, subject to
29
+ # the following conditions:
30
+ #
31
+ # The above copyright notice and this permission notice shall be
32
+ # included in all copies or substantial portions of the Software.
33
+ #
34
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
35
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
36
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
37
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
38
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
39
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
40
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
41
+ #
42
+ # Strips indentation by removing the amount of leading whitespace in the least indented
43
+ # non-empty line in the whole string
44
+ #
45
+ def strip_heredoc(str)
46
+ str.gsub(/^#{str.scan(/^[ \t]*(?=\S)/).min}/, "".freeze)
47
+ end
48
+
49
+ # Joins an array with commas and "and", using the Oxford comma.
50
+ def english_join(array)
51
+ return "" if array.nil?
52
+ return array.join(" and ") if array.length < 3
53
+
54
+ "#{array[0..-2].join(', ')}, and #{array[-1]}"
55
+ end
56
+
57
+ # Execute a block within the context of a variable enviroment
58
+ #
59
+ def with_environment(environment, value)
60
+ return yield unless environment
61
+
62
+ old_env = ENV[environment]
63
+ begin
64
+ ENV[environment] = value
65
+ yield
66
+ ensure
67
+ old_env ? ENV[environment] = old_env : ENV.delete(environment)
68
+ end
69
+ end
70
+
71
+ # Converts an integer representing bytes into a human readable format
72
+ #
73
+ def to_filesize(bytes, precision: 2, space: false)
74
+ to_si_scale(bytes, 'B', precision: precision, space: space, factor: 1024)
75
+ end
76
+
77
+ # Converts a number to a human readable format on the SI scale
78
+ #
79
+ def to_si_scale(number, unit = '', factor: 1000, precision: 2, space: false)
80
+ raise ArgumentError, "factor should only be 1000 or 1024" unless [1000, 1024].include?(factor)
81
+
82
+ small_scale = %w(m µ n p f a z y)
83
+ big_scale = %w(k M G T P E Z Y)
84
+ negative = number < 0
85
+ number = number.abs.to_f
86
+
87
+ if number == 0 || number.between?(1, factor)
88
+ prefix = ""
89
+ scale = 0
90
+ else
91
+ scale = Math.log(number, factor).floor
92
+ if number < 1
93
+ index = [-scale - 1, small_scale.length].min
94
+ scale = -(index + 1)
95
+ prefix = small_scale[index]
96
+ else
97
+ index = [scale - 1, big_scale.length].min
98
+ scale = index + 1
99
+ prefix = big_scale[index]
100
+ end
101
+ end
102
+
103
+ divider = (factor**scale)
104
+ fnum = (number / divider).round(precision)
105
+
106
+ # Trim useless decimal
107
+ fnum = fnum.to_i if (fnum.to_i.to_f * divider) == number
108
+
109
+ fnum = -fnum if negative
110
+ prefix = " " + prefix if space
111
+
112
+ "#{fnum}#{prefix}#{unit}"
113
+ end
114
+
115
+ # Dir.chdir, when invoked in block form, complains when we call chdir
116
+ # again recursively. There's no apparent good reason for this, so we
117
+ # simply implement our own block form of Dir.chdir here.
118
+ def with_dir(dir)
119
+ prev = Dir.pwd
120
+ Dir.chdir(dir)
121
+ yield
122
+ ensure
123
+ Dir.chdir(prev)
124
+ end
125
+
126
+ def with_tmp_dir
127
+ require 'fileutils'
128
+ dir = Dir.mktmpdir
129
+ with_dir(dir) do
130
+ yield(dir)
131
+ end
132
+ ensure
133
+ FileUtils.remove_entry(dir)
134
+ end
135
+
136
+ # Standard way of checking for CI / Tests
137
+ def testing?
138
+ ci? || ENV['TEST']
139
+ end
140
+
141
+ # Set only in IntegrationTest#session; indicates that the process was
142
+ # called by `session.execute` from an IntegrationTest subclass.
143
+ def integration_test_session?
144
+ ENV['INTEGRATION_TEST_SESSION']
145
+ end
146
+
147
+ # Standard way of checking for CI
148
+ def ci?
149
+ ENV['CI']
150
+ end
151
+
152
+ # Must call retry_after on the result in order to execute the block
153
+ #
154
+ # Example usage:
155
+ #
156
+ # CLI::Kit::Util.begin do
157
+ # might_raise_if_costly_prep_not_done()
158
+ # end.retry_after(ExpectedError) do
159
+ # costly_prep()
160
+ # end
161
+ def begin(&block_that_might_raise)
162
+ Retrier.new(block_that_might_raise)
163
+ end
164
+ end
165
+
166
+ class Retrier
167
+ def initialize(block_that_might_raise)
168
+ @block_that_might_raise = block_that_might_raise
169
+ end
170
+
171
+ def retry_after(exception = StandardError, retries: 1, &before_retry)
172
+ @block_that_might_raise.call
173
+ rescue exception => e
174
+ raise if (retries -= 1) < 0
175
+ if before_retry
176
+ if before_retry.arity == 0
177
+ yield
178
+ else
179
+ yield e
180
+ end
181
+ end
182
+ retry
183
+ end
184
+ end
185
+
186
+ private_constant :Retrier
187
+ end
188
+ end
189
+ end
@@ -1,5 +1,5 @@
1
1
  module CLI
2
2
  module Kit
3
- VERSION = "3.0.1"
3
+ VERSION = "3.1.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cli-kit
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.1
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Burke Libbey
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2018-05-01 00:00:00.000000000 Z
13
+ date: 2018-07-27 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: cli-ui
@@ -18,14 +18,14 @@ dependencies:
18
18
  requirements:
19
19
  - - ">="
20
20
  - !ruby/object:Gem::Version
21
- version: 1.1.0
21
+ version: 1.1.4
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
28
- version: 1.1.0
28
+ version: 1.1.4
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: bundler
31
31
  requirement: !ruby/object:Gem::Requirement
@@ -123,11 +123,13 @@ files:
123
123
  - lib/cli/kit/executor.rb
124
124
  - lib/cli/kit/ini.rb
125
125
  - lib/cli/kit/levenshtein.rb
126
+ - lib/cli/kit/logger.rb
126
127
  - lib/cli/kit/resolver.rb
127
128
  - lib/cli/kit/ruby_backports/enumerable.rb
128
129
  - lib/cli/kit/support.rb
129
130
  - lib/cli/kit/support/test_helper.rb
130
131
  - lib/cli/kit/system.rb
132
+ - lib/cli/kit/util.rb
131
133
  - lib/cli/kit/version.rb
132
134
  homepage: https://github.com/shopify/cli-kit
133
135
  licenses: