toys-core 0.3.11 → 0.4.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
  SHA256:
3
- metadata.gz: 170a7493ef1b6d852d4a551b7e6f38d0cf861f6660c8b2b1d710c1eee7b5dd2b
4
- data.tar.gz: eb2b614017aff294664306a4a2aa6ce96eda22bf37a375c9bb03641c39eb439d
3
+ metadata.gz: 95766b26892b0fab477c7f05a8eddf8aa0f30a9e98075b41881791ca1d446389
4
+ data.tar.gz: 03af27a0411ed093f1b0b27edb4aafd2562cc3b92f9176dfdd10e26be090d8f0
5
5
  SHA512:
6
- metadata.gz: 2e0dc6614370daa927916614b19631dd6b9541d3ed664593b4aeaa6cab2407cb8abf7284afbf13c100fc7b6a783ac261c10e280f7112e6f359bcce90125ab414
7
- data.tar.gz: aa7dbaf6c473f233207886fb2b4ce11a7dd551f802dd4e16ad9e8647ee394c8c96f5b6f483e3a775aab08224d4213cce05cf78dbf5fb1000258c4630942e2dc9
6
+ metadata.gz: dc6e36460d0849a153a4fe8ac376bfc120f93e19f2931bfc892dbf0fda67af82e4aa0bd73c138e9950c5559fca8cc1bc6f056195bdaad5f935e7203a48cf3411
7
+ data.tar.gz: 458da8a2896163512994018fbce12ee6392ae69e63383b232d9c86577bdd02a5069bbbda52c79786d7d2e09f880ccea7bca2b0845979ef12c73a545a68303c28
data/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Release History
2
2
 
3
+ ### 0.4.0 / 2018-07-03
4
+
5
+ Now declaring this alpha quality. Backward-incompatible changes are still
6
+ possible from this point, but I'll try to avoid them.
7
+
8
+ * CHANGED: Utils::Terminal#confirm default is now unset by default
9
+ * CHANGED: Moved gem install/activation methods into a mixin
10
+ * IMPROVED: Toys::Utils::Gems can suppress the confirmation prompt
11
+ * IMPROVED: Magic comments are now honored in toys files.
12
+ * IMPROVED: Utils::Gems installation is now much faster.
13
+ * FIXED: Utils::Gems didn't reset the specifications on Ruby 2.3.
14
+
3
15
  ### 0.3.11 / 2018-07-02
4
16
 
5
17
  * CHANGED: Require Ruby 2.3 or later
data/README.md CHANGED
@@ -1,26 +1,15 @@
1
1
  # Toys
2
2
 
3
- Toys is a command line binary that lets you build your own personal suite of
4
- command line tools using a Ruby DSL. Toys handles argument parsing, error
5
- reporting, logging, help text, and many other details for you. Toys is designed
6
- for software developers, IT specialists, and other power users who want to
7
- write and organize scripts to automate their workflows.
3
+ Toys is a configurable command line tool. Write commands in config files using
4
+ a simple DSL, and Toys will provide the command line binary and take care of
5
+ all the details such as argument parsing, online help, and error reporting.
8
6
 
9
7
  Toys-Core is the command line tool framework underlying Toys. It can be used
10
- to create command line binaries using the internal Toys APIs.
8
+ to create your own command line binaries using the internal Toys APIs.
11
9
 
12
- To get started using toys-core for your own command line binary, see the
10
+ To get started with toys-core, see the
13
11
  [Getting Started Guide](https://www.rubydoc.info/gems/toys-core/file/docs/getting-started.md)
14
12
 
15
- ## Contributing
16
-
17
- While we appreciate contributions, please note that this software is currently
18
- highly experimental, and the code is evolving very rapidly. Please contact the
19
- author before embarking on a major pull request. More detailed contribution
20
- guidelines will be provided when the software stabilizes further.
21
-
22
- The source can be found on Github at https://github.com/dazuma/toys
23
-
24
13
  ## License
25
14
 
26
15
  Copyright 2018 Daniel Azuma
@@ -28,3 +17,5 @@ Copyright 2018 Daniel Azuma
28
17
  This software is licensed under the 3-clause BSD license.
29
18
 
30
19
  See the LICENSE.md file for more information.
20
+
21
+ The source can be found on Github at https://github.com/dazuma/toys
@@ -34,5 +34,5 @@ module Toys
34
34
  # Current version of Toys core
35
35
  # @return [String]
36
36
  #
37
- CORE_VERSION = "0.3.11"
37
+ CORE_VERSION = "0.4.0"
38
38
  end
@@ -666,7 +666,7 @@ module Toys
666
666
  unless @definition_finished
667
667
  ContextualError.capture("Error installing tool middleware!", tool_name: full_name) do
668
668
  config_proc = proc {}
669
- middleware_stack.reverse.each do |middleware|
669
+ middleware_stack.reverse_each do |middleware|
670
670
  config_proc = make_config_proc(middleware, loader, config_proc)
671
671
  end
672
672
  config_proc.call
data/lib/toys/dsl/tool.rb CHANGED
@@ -590,23 +590,15 @@ module Toys
590
590
  if mod.nil?
591
591
  raise ToolDefinitionError, "Module not found: #{name.inspect}"
592
592
  end
593
- if mod.respond_to?(:initializer)
594
- cur_tool.add_initializer(mod.initializer, *args) if mod.initializer
593
+ if mod.respond_to?(:initialization_callback) && mod.initialization_callback
594
+ cur_tool.add_initializer(mod.initialization_callback, *args)
595
+ end
596
+ if mod.respond_to?(:inclusion_callback) && mod.inclusion_callback
597
+ class_exec(*args, &mod.inclusion_callback)
595
598
  end
596
599
  super(mod)
597
600
  end
598
601
 
599
- ##
600
- # Activate the given gem. If it is not present, attempt to install it (or
601
- # inform the user to update the bundle).
602
- #
603
- # @param [String] name Name of the gem
604
- # @param [String...] requirements Version requirements
605
- #
606
- def gem(name, *requirements)
607
- (@__gems ||= Utils::Gems.new).activate(name, *requirements)
608
- end
609
-
610
602
  ## @private
611
603
  def self.new_class(words, priority, loader)
612
604
  tool_class = ::Class.new(::Toys::Tool)
@@ -48,20 +48,28 @@ module Toys::InputFile # rubocop:disable Style/ClassAndModuleChildren
48
48
  end
49
49
  basename = ::File.basename(path).tr(".-", "_").gsub(/\W/, "")
50
50
  name = "M#{namespace.object_id}_#{basename}"
51
- const_set(name, namespace)
52
- str = <<-STR
53
- module #{name}
54
- @tool_class.class_eval do
55
- #{::IO.read(path)}
51
+ str = build_eval_string(name, ::IO.read(path))
52
+ if str
53
+ const_set(name, namespace)
54
+ ::Toys::DSL::Tool.prepare(tool_class, remaining_words, path) do
55
+ ::Toys::ContextualError.capture_path("Error while loading Toys config!", path) do
56
+ # rubocop:disable Security/Eval
57
+ eval(str, __binding, path, 0)
58
+ # rubocop:enable Security/Eval
56
59
  end
57
60
  end
58
- STR
59
- ::Toys::DSL::Tool.prepare(tool_class, remaining_words, path) do
60
- ::Toys::ContextualError.capture_path("Error while loading Toys config!", path) do
61
- # rubocop:disable Security/Eval
62
- eval(str, __binding, path, 0)
63
- # rubocop:enable Security/Eval
64
- end
65
61
  end
66
62
  end
63
+
64
+ ## @private
65
+ def self.build_eval_string(module_name, string)
66
+ index = string.index(/^\s*[^#\s]/)
67
+ return nil if index.nil?
68
+ "#{string[0, index]}\n" \
69
+ "module #{module_name}\n" \
70
+ "@tool_class.class_eval do\n" \
71
+ "#{string[index..-1]}\n" \
72
+ "end\n" \
73
+ "end\n"
74
+ end
67
75
  end
data/lib/toys/mixin.rb CHANGED
@@ -43,12 +43,20 @@ module Toys
43
43
  # To create a mixin, define a module, and include this module. Then define
44
44
  # the methods you want to be available.
45
45
  #
46
- # If you want to perform some initialization specific to the mixin, use a
47
- # `to_initialize` block. This block is passed any extra arguments that were
48
- # passed to the `include` directive. It is called in the context of the tool,
49
- # so it also has access to tool methods such as {Toys::Tool#option}. It can
50
- # perform any setup required, which often involves initializing some
51
- # persistent state and storing it in the tool using {Toys::Tool#set}.
46
+ # If you want to perform some initialization specific to the mixin, you can
47
+ # provide a `to_initialize` block and/or a `to_include` block.
48
+ #
49
+ # The `to_initialize` block is called when the tool itself is instantiated.
50
+ # It has access to tool methods such as {Toys::Tool#option}, and can perform
51
+ # setup for the tool execution itself, often involving initializing some
52
+ # persistent state and storing it in the tool using {Toys::Tool#set}. The
53
+ # `to_initialize` block is passed any extra arguments that were provided to
54
+ # the `include` directive.
55
+ #
56
+ # The `to_include` block is called in the context of your tool class when
57
+ # your mixin is included. It is also passed any extra arguments that were
58
+ # provided to the `include` directive. It can be used to issue directives
59
+ # or define methods on the DSL, specific to the mixin.
52
60
  #
53
61
  # ## Example
54
62
  #
@@ -95,25 +103,40 @@ module Toys
95
103
  ## @private
96
104
  def self.included(mod)
97
105
  return if mod.respond_to?(:to_initialize)
98
- mod.extend(ClassMethods)
106
+ mod.extend(ModuleMethods)
99
107
  end
100
108
 
101
109
  ##
102
- # Class methods that will be added to a mixin module.
110
+ # Methods that will be added to a mixin module object.
103
111
  #
104
- module ClassMethods
112
+ module ModuleMethods
105
113
  ##
106
- # Provide the block that initializes this mixin.
114
+ # Provide a block that initializes this mixin when the tool is
115
+ # constructed.
107
116
  #
108
117
  def to_initialize(&block)
109
- self.initializer = block
118
+ self.initialization_callback = block
119
+ end
120
+
121
+ ##
122
+ # Provide a block that modifies the tool class when the mixin is
123
+ # included.
124
+ #
125
+ def to_include(&block)
126
+ self.inclusion_callback = block
110
127
  end
111
128
 
112
129
  ##
113
130
  # You may alternately set the initializer block using this accessor.
114
131
  # @return [Proc]
115
132
  #
116
- attr_accessor :initializer
133
+ attr_accessor :initialization_callback
134
+
135
+ ##
136
+ # You may alternately set the inclusion block using this accessor.
137
+ # @return [Proc]
138
+ #
139
+ attr_accessor :inclusion_callback
117
140
  end
118
141
  end
119
142
  end
data/lib/toys/runner.rb CHANGED
@@ -161,7 +161,7 @@ module Toys
161
161
  tool.exit(-1)
162
162
  end
163
163
  end
164
- @tool_definition.middleware_stack.reverse.each do |middleware|
164
+ @tool_definition.middleware_stack.reverse_each do |middleware|
165
165
  executor = make_executor(middleware, tool, executor)
166
166
  end
167
167
  catch(:result) do
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2018 Daniel Azuma
4
+ #
5
+ # All rights reserved.
6
+ #
7
+ # Redistribution and use in source and binary forms, with or without
8
+ # modification, are permitted provided that the following conditions are met:
9
+ #
10
+ # * Redistributions of source code must retain the above copyright notice,
11
+ # this list of conditions and the following disclaimer.
12
+ # * Redistributions in binary form must reproduce the above copyright notice,
13
+ # this list of conditions and the following disclaimer in the documentation
14
+ # and/or other materials provided with the distribution.
15
+ # * Neither the name of the copyright holder, nor the names of any other
16
+ # contributors to this software, may be used to endorse or promote products
17
+ # derived from this software without specific prior written permission.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
+ # POSSIBILITY OF SUCH DAMAGE.
30
+ ;
31
+
32
+ module Toys
33
+ module StandardMixins
34
+ ##
35
+ # Provides methods for installing and activating third-party gems. When
36
+ # this mixin is included, it provides a `gem` method that has the same
37
+ # effect as {Toys::Utils::Gems#activate}, so you can ensure a gem is
38
+ # present when running a tool. A `gem` directive is likewise added to the
39
+ # tool DSL itself, so you can also ensure a gem is present when defining a
40
+ # tool.
41
+ #
42
+ # You may make these methods available to your tool by including the
43
+ # following directive in your tool configuration:
44
+ #
45
+ # include :gems
46
+ #
47
+ # If you pass additional options to the include directive, those are used
48
+ # to initialize settings for the gem install process. For example:
49
+ #
50
+ # include :gems, output: $stdout, default_confirm: false
51
+ #
52
+ # This is a frontend for {Toys::Utils::Gems}. More information is
53
+ # available in that class's documentation.
54
+ #
55
+ module Gems
56
+ include Mixin
57
+
58
+ to_include do |opts = {}|
59
+ @__gems = Utils::Gems.new(opts)
60
+
61
+ def self.gems
62
+ @__gems
63
+ end
64
+
65
+ def self.gem(name, *requirements)
66
+ gems.activate(name, *requirements)
67
+ end
68
+ end
69
+
70
+ ##
71
+ # Returns a tool-wide instance of {Toys::Utils::Gems}.
72
+ #
73
+ def gems
74
+ self.class.gems
75
+ end
76
+
77
+ ##
78
+ # Activate the given gem.
79
+ #
80
+ # @param [String] name Name of the gem
81
+ # @param [String...] requirements Version requirements
82
+ #
83
+ def gem(name, *requirements)
84
+ self.class.gems.activate(name, *requirements)
85
+ end
86
+ end
87
+ end
88
+ end
@@ -74,7 +74,7 @@ module Toys
74
74
  end
75
75
 
76
76
  ##
77
- # Returns a global highline instance
77
+ # Returns a tool-wide highline instance
78
78
  # @return [::HighLine]
79
79
  #
80
80
  def highline
@@ -69,7 +69,7 @@ module Toys
69
69
  end
70
70
 
71
71
  ##
72
- # Returns a global terminal instance
72
+ # Returns a tool-wide terminal instance
73
73
  # @return [Toys::Utils::Terminal]
74
74
  #
75
75
  def terminal
data/lib/toys/tool.rb CHANGED
@@ -259,17 +259,6 @@ module Toys
259
259
  end
260
260
  end
261
261
 
262
- ##
263
- # Activate the given gem. If it is not present, attempt to install it (or
264
- # inform the user to update the bundle).
265
- #
266
- # @param [String] name Name of the gem
267
- # @param [String...] requirements Version requirements
268
- #
269
- def gem(name, *requirements)
270
- (@__data[Utils::Gems] ||= Utils::Gems.new).activate(name, *requirements)
271
- end
272
-
273
262
  ##
274
263
  # Exit immediately with the given status code
275
264
  #
@@ -58,22 +58,35 @@ module Toys
58
58
  end
59
59
 
60
60
  ##
61
- # Activate the given gem.
61
+ # Activate the given gem. If it is not present, attempt to install it (or
62
+ # inform the user to update the bundle).
62
63
  #
63
64
  # @param [String] name Name of the gem
64
65
  # @param [String...] requirements Version requirements
65
- # @param [Boolean] default_confirm Default response for the confirmation prompt
66
66
  #
67
- def self.activate(name, *requirements, default_confirm: false)
68
- new.activate(name, *requirements, default_confirm: default_confirm)
67
+ def self.activate(name, *requirements)
68
+ new.activate(name, *requirements)
69
69
  end
70
70
 
71
71
  ##
72
72
  # Create a new gem activator.
73
73
  #
74
- def initialize(input: $stdin, output: $stderr)
74
+ # @param [IO] input Input IO
75
+ # @param [IO] output Output IO
76
+ # @param [Boolean] suppress_confirm Suppress the confirmation prompt and
77
+ # just use the given `default_confirm` value. Default is false,
78
+ # indicating the confirmation prompt appears by default.
79
+ # @param [Boolean] default_confirm Default response for the confirmation
80
+ # prompt. Default is true.
81
+ #
82
+ def initialize(input: $stdin,
83
+ output: $stderr,
84
+ suppress_confirm: false,
85
+ default_confirm: true)
75
86
  @terminal = Terminal.new(input: input, output: output)
76
87
  @exec = Exec.new
88
+ @suppress_confirm = suppress_confirm ? true : false
89
+ @default_confirm = default_confirm ? true : false
77
90
  end
78
91
 
79
92
  ##
@@ -82,18 +95,26 @@ module Toys
82
95
  #
83
96
  # @param [String] name Name of the gem
84
97
  # @param [String...] requirements Version requirements
85
- # @param [Boolean] default_confirm Default response for the confirmation prompt
86
98
  #
87
- def activate(name, *requirements, default_confirm: false)
99
+ def activate(name, *requirements)
88
100
  gem(name, *requirements)
89
- rescue ::Gem::MissingSpecError
90
- install_gem(name, requirements, default_confirm: default_confirm)
91
- rescue ::Gem::LoadError => e
92
- if ::ENV["BUNDLE_GEMFILE"]
93
- raise GemfileUpdateNeededError.new(gem_requirements_text(name, requirements),
94
- ::ENV["BUNDLE_GEMFILE"])
101
+ rescue ::Gem::LoadError => e1
102
+ is_missing_spec =
103
+ if defined?(::Gem::MissingSpecError)
104
+ e1.is_a?(::Gem::MissingSpecError)
105
+ else
106
+ e1.message.include?("Could not find")
107
+ end
108
+ if is_missing_spec
109
+ install_gem(name, requirements)
110
+ begin
111
+ gem(name, *requirements)
112
+ rescue ::Gem::LoadError => e2
113
+ report_error(name, requirements, e2)
114
+ end
115
+ else
116
+ report_error(name, requirements, e1)
95
117
  end
96
- raise ActivationFailedError, e.message
97
118
  end
98
119
 
99
120
  private
@@ -102,44 +123,40 @@ module Toys
102
123
  "#{name.inspect}, #{requirements.map(&:inspect).join(', ')}"
103
124
  end
104
125
 
105
- def install_gem(name, requirements, default_confirm: false)
126
+ def install_gem(name, requirements)
106
127
  requirements_text = gem_requirements_text(name, requirements)
107
- response = @terminal.confirm("Gem needed: #{requirements_text}. Install?",
108
- default: default_confirm)
128
+ response =
129
+ if @suppress_confirm
130
+ @default_confirm
131
+ else
132
+ @terminal.confirm("Gem needed: #{requirements_text}. Install?",
133
+ default: @default_confirm)
134
+ end
109
135
  unless response
110
136
  raise InstallFailedError, "Canceled installation of needed gem: #{requirements_text}"
111
137
  end
112
- version = find_best_version(name, requirements)
113
- raise InstallFailedError, "No gem found matching #{requirements_text}." unless version
114
- perform_install(name, version)
115
- activate(name, *requirements)
138
+ perform_install(name, requirements)
116
139
  end
117
140
 
118
- def find_best_version(name, requirements)
119
- @terminal.spinner(leading_text: "Getting info on gem #{name.inspect}... ",
120
- final_text: "Done.\n") do
121
- req = ::Gem::Requirement.new(*requirements)
122
- result = @exec.capture(["gem", "query", "-q", "-r", "-a", "-e", name])
123
- if result =~ /\(([\w\.,\s]+)\)/
124
- $1.split(", ")
125
- .map { |v| ::Gem::Version.new(v) }
126
- .find { |v| !v.prerelease? && req.satisfied_by?(v) }
127
- else
128
- raise InstallFailedError, "Unable to determine existing versions of gem #{name.inspect}"
129
- end
141
+ def perform_install(name, requirements)
142
+ result = @terminal.spinner(leading_text: "Installing gem #{name}... ",
143
+ final_text: "Done.\n") do
144
+ @exec.exec(["gem", "install", name, "--version", requirements.join(",")],
145
+ out: :capture, err: :capture)
146
+ end
147
+ @terminal.puts(result.captured_out + result.captured_err)
148
+ if result.error?
149
+ raise InstallFailedError, "Failed to install gem #{name}"
130
150
  end
151
+ ::Gem::Specification.reset
131
152
  end
132
153
 
133
- def perform_install(name, version)
134
- @terminal.spinner(leading_text: "Installing gem #{name} #{version}... ",
135
- final_text: "Done.\n") do
136
- result = @exec.exec(["gem", "install", name, "--version", version.to_s],
137
- out: :capture, err: :capture)
138
- if result.error?
139
- @terminal.puts(result.captured_out + result.captured_err)
140
- raise InstallFailedError, "Failed to install gem #{name} #{version}"
141
- end
154
+ def report_error(name, requirements, err)
155
+ if ::ENV["BUNDLE_GEMFILE"]
156
+ raise GemfileUpdateNeededError.new(gem_requirements_text(name, requirements),
157
+ ::ENV["BUNDLE_GEMFILE"])
142
158
  end
159
+ raise ActivationFailedError, err.message
143
160
  end
144
161
  end
145
162
  end
@@ -55,6 +55,12 @@ module Toys
55
55
  # * An array of ANSI codes as integers.
56
56
  #
57
57
  class Terminal
58
+ ##
59
+ # Fatal terminal error.
60
+ #
61
+ class TerminalError < ::StandardError
62
+ end
63
+
58
64
  ## ANSI style code to clear styles
59
65
  CLEAR_CODE = "\e[0m"
60
66
 
@@ -207,23 +213,29 @@ module Toys
207
213
  # Confirm with the user.
208
214
  #
209
215
  # @param [String] prompt Prompt string. Defaults to `"Proceed?"`.
210
- # @param [Boolean] default Default value (defaults to false).
216
+ # @param [Boolean,nil] default Default value, or `nil` for no default.
217
+ # Uses `nil` if not specified.
211
218
  # @return [Boolean]
212
219
  #
213
- def confirm(prompt = "Proceed?", default: false)
214
- y = default ? "Y" : "y"
215
- n = default ? "n" : "N"
220
+ def confirm(prompt = "Proceed?", default: nil)
221
+ y = default == true ? "Y" : "y"
222
+ n = default == false ? "n" : "N"
216
223
  write("#{prompt} (#{y}/#{n}) ")
217
- resp = input.gets.to_s.strip
224
+ resp = input.gets
218
225
  case resp
219
226
  when /^y/i
220
227
  true
221
228
  when /^n/i
222
229
  false
223
- when ""
230
+ when nil
231
+ raise TerminalError, "Cannot confirm because the input stream is at eof." if default.nil?
224
232
  default
225
233
  else
226
- confirm("Please answer \"y\" or \"n\"")
234
+ if !resp.strip.empty? || default.nil?
235
+ confirm("Please answer \"y\" or \"n\"")
236
+ else
237
+ default
238
+ end
227
239
  end
228
240
  end
229
241
 
metadata CHANGED
@@ -1,99 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: toys-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.11
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Azuma
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-02 00:00:00.000000000 Z
11
+ date: 2018-07-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: minitest
14
+ name: highline
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '5.11'
19
+ version: '2.0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '5.11'
26
+ version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: minitest-focus
28
+ name: minitest
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.1'
33
+ version: '5.11'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.1'
40
+ version: '5.11'
41
41
  - !ruby/object:Gem::Dependency
42
- name: minitest-rg
42
+ name: minitest-focus
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '5.2'
47
+ version: '1.1'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '5.2'
54
+ version: '1.1'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rubocop
56
+ name: minitest-rg
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.55.0
61
+ version: '5.2'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.55.0
68
+ version: '5.2'
69
69
  - !ruby/object:Gem::Dependency
70
- name: yard
70
+ name: rubocop
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0.9'
75
+ version: 0.57.2
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0.9'
82
+ version: 0.57.2
83
83
  - !ruby/object:Gem::Dependency
84
- name: highline
84
+ name: yard
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '2.0'
89
+ version: 0.9.14
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '2.0'
96
+ version: 0.9.14
97
97
  description: Toys-Core is the command line tool framework underlying Toys. It can
98
98
  be used to create command line binaries using the internal Toys APIs.
99
99
  email:
@@ -131,6 +131,7 @@ files:
131
131
  - lib/toys/standard_middleware/show_root_version.rb
132
132
  - lib/toys/standard_mixins/exec.rb
133
133
  - lib/toys/standard_mixins/fileutils.rb
134
+ - lib/toys/standard_mixins/gems.rb
134
135
  - lib/toys/standard_mixins/highline.rb
135
136
  - lib/toys/standard_mixins/terminal.rb
136
137
  - lib/toys/template.rb