toys-core 0.10.3 → 0.10.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6b02cdff2a475e8868e2b657c16ced39c83f8b729552408cc09a22060f783ca5
4
- data.tar.gz: 5a0d9db1a99cc425de54f12ea8b888ef8d91a15e2991fcbc782a1a1e0e85c137
3
+ metadata.gz: 73bf616783bbde0d72f5f62c57437220208bb4e06d46feb6eeea4507aae386a6
4
+ data.tar.gz: 3e526d1a50a7d03b8d42ef762b7bae02b5964efbc18a0b029dd39362876ff689
5
5
  SHA512:
6
- metadata.gz: c7547679c269c0b882a82e0704d8d664b9e75872e72ca9368b673118fc3d20948fe5ab1588fea0b0e2c1def7685e4e378ea537ec1b7809e60809fee25bc0baf4
7
- data.tar.gz: e6767c8ae11fd7bfbadbc0b4bb23f86ee055b5832a67577dd4d72109e7e0d9a015d7d7d92612893e292e6257d89014c86aba6fcbd769701196748822cb4b6869
6
+ metadata.gz: 90100efa91c07240449b8da3ce72c358c4e09766afa80bdae044e0769586a6c890815e4c71786526fa00851d2fbc32db82fec586b01bf0bf9877ab17fb7b2867
7
+ data.tar.gz: f45936daa1ec21ee4d5531f5bda027a27cc45f4d99d678636d2c529fe1e0f1592130e5cddee5ffd25f8750487a92b8697f77f7a86d96f85cae63aa2840908f68
@@ -1,5 +1,10 @@
1
1
  # Release History
2
2
 
3
+ ### 0.10.4 / 2020-07-11
4
+
5
+ * IMPROVED: Bundler integration can now handle Toys itself being in the bundle, as long as the version requirements cover the running Toys version.
6
+ * IMPROVED: Passing `static: true` to the `:bundler` mixin installs the bundle at definition rather than execution time.
7
+
3
8
  ### 0.10.3 / 2020-07-04
4
9
 
5
10
  * FIXED: The `exec_separate_tool` method in the `:exec` mixin no longer throws ENOEXEC on Windows.
@@ -9,7 +9,7 @@ module Toys
9
9
  # Current version of Toys core.
10
10
  # @return [String]
11
11
  #
12
- VERSION = "0.10.3"
12
+ VERSION = "0.10.4"
13
13
  end
14
14
 
15
15
  ## @private deprecated
@@ -7,6 +7,10 @@ module Toys
7
7
  #
8
8
  # The following parameters can be passed when including this mixin:
9
9
  #
10
+ # * `:static` (Boolean) If `true`, installs the bundle immediately, when
11
+ # defining the tool. If `false` (the default), installs the bundle just
12
+ # before the tool runs.
13
+ #
10
14
  # * `:groups` (Array<String>) The groups to include in setup
11
15
  #
12
16
  # * `:search_dirs` (Array<String,Symbol>) Directories to search for a
@@ -41,32 +45,39 @@ module Toys
41
45
  module Bundler
42
46
  include Mixin
43
47
 
44
- on_initialize do
45
- |groups: nil,
46
- search_dirs: nil,
47
- on_missing: nil,
48
- on_conflict: nil,
49
- terminal: nil,
50
- input: nil,
51
- output: nil|
52
- require "toys/utils/gems"
53
- search_dirs = ::Toys::StandardMixins::Bundler.resolve_search_dirs(search_dirs, self)
54
- gems = ::Toys::Utils::Gems.new(on_missing: on_missing, on_conflict: on_conflict,
55
- terminal: terminal, input: input, output: output)
56
- gems.bundle(groups: groups, search_dirs: search_dirs)
48
+ on_initialize do |static: false, search_dirs: nil, **kwargs|
49
+ unless static
50
+ require "toys/utils/gems"
51
+ search_dirs = ::Toys::StandardMixins::Bundler.resolve_search_dirs(
52
+ search_dirs,
53
+ self[::Toys::Context::Key::CONTEXT_DIRECTORY],
54
+ self[::Toys::Context::Key::TOOL_SOURCE]
55
+ )
56
+ ::Toys::StandardMixins::Bundler.setup_bundle(search_dirs, **kwargs)
57
+ end
58
+ end
59
+
60
+ on_include do |static: false, search_dirs: nil, **kwargs|
61
+ if static
62
+ require "toys/utils/gems"
63
+ search_dirs = ::Toys::StandardMixins::Bundler.resolve_search_dirs(
64
+ search_dirs, context_directory, source_info
65
+ )
66
+ ::Toys::StandardMixins::Bundler.setup_bundle(search_dirs, **kwargs)
67
+ end
57
68
  end
58
69
 
59
70
  ## @private
60
- def self.resolve_search_dirs(search_dirs, context)
71
+ def self.resolve_search_dirs(search_dirs, context_dir, source_info)
61
72
  search_dirs ||= [:toys, :context, :current]
62
73
  Array(search_dirs).flat_map do |dir|
63
74
  case dir
64
75
  when :context
65
- context[::Toys::Context::Key::CONTEXT_DIRECTORY]
76
+ context_dir
66
77
  when :current
67
78
  ::Dir.getwd
68
79
  when :toys
69
- toys_dir_stack(context[::Toys::Context::Key::TOOL_SOURCE])
80
+ toys_dir_stack(source_info)
70
81
  when ::String
71
82
  dir
72
83
  else
@@ -84,6 +95,19 @@ module Toys
84
95
  end
85
96
  dirs
86
97
  end
98
+
99
+ ## @private
100
+ def self.setup_bundle(search_dirs,
101
+ groups: nil,
102
+ on_missing: nil,
103
+ on_conflict: nil,
104
+ terminal: nil,
105
+ input: nil,
106
+ output: nil)
107
+ gems = ::Toys::Utils::Gems.new(on_missing: on_missing, on_conflict: on_conflict,
108
+ terminal: terminal, input: input, output: output)
109
+ gems.bundle(groups: groups, search_dirs: search_dirs)
110
+ end
87
111
  end
88
112
  end
89
113
  end
@@ -81,16 +81,22 @@ module Toys
81
81
  #
82
82
  # @param on_missing [:confirm,:error,:install] What to do if a needed gem
83
83
  # is not installed. Possible values:
84
+ #
84
85
  # * `:confirm` - prompt the user on whether to install
85
86
  # * `:error` - raise an exception
86
87
  # * `:install` - just install the gem
88
+ #
87
89
  # The default is `:confirm`.
90
+ #
88
91
  # @param on_conflict [:error,:warn,:ignore] What to do if bundler has
89
92
  # already been run with a different Gemfile. Possible values:
93
+ #
90
94
  # * `:error` - raise an exception
91
95
  # * `:ignore` - just silently proceed without bundling again
92
96
  # * `:warn` - print a warning and proceed without bundling again
97
+ #
93
98
  # The default is `:error`.
99
+ #
94
100
  # @param terminal [Toys::Utils::Terminal] Terminal to use (optional)
95
101
  # @param input [IO] Input IO (optional, defaults to STDIN)
96
102
  # @param output [IO] Output IO (optional, defaults to STDOUT)
@@ -146,8 +152,9 @@ module Toys
146
152
  search_dirs: nil)
147
153
  Gems.synchronize do
148
154
  gemfile_path = find_gemfile(Array(search_dirs))
149
- activate("bundler", "~> 2.1")
150
155
  if configure_gemfile(gemfile_path)
156
+ activate("bundler", "~> 2.1")
157
+ require "bundler"
151
158
  setup_bundle(gemfile_path, groups || [])
152
159
  end
153
160
  end
@@ -184,14 +191,14 @@ module Toys
184
191
  error.message.include?("Could not find")
185
192
  end
186
193
  if !is_missing_spec || @on_missing == :error
187
- report_error(name, requirements, error)
194
+ report_activation_error(name, requirements, error)
188
195
  return
189
196
  end
190
197
  confirm_and_install_gem(name, requirements)
191
198
  begin
192
199
  gem(name, *requirements)
193
200
  rescue ::Gem::LoadError => e
194
- report_error(name, requirements, e)
201
+ report_activation_error(name, requirements, e)
195
202
  end
196
203
  end
197
204
 
@@ -215,7 +222,7 @@ module Toys
215
222
  ::Gem::Specification.reset
216
223
  end
217
224
 
218
- def report_error(name, requirements, err)
225
+ def report_activation_error(name, requirements, err)
219
226
  if ::ENV["BUNDLE_GEMFILE"]
220
227
  raise GemfileUpdateNeededError.new(gem_requirements_text(name, requirements),
221
228
  ::ENV["BUNDLE_GEMFILE"])
@@ -233,12 +240,14 @@ module Toys
233
240
 
234
241
  def configure_gemfile(gemfile_path)
235
242
  old_path = ::ENV["BUNDLE_GEMFILE"]
236
- if old_path && gemfile_path != old_path
237
- case @on_conflict
238
- when :warn
239
- terminal.puts("Warning: could not set up bundler because it is already set up.", :red)
240
- when :error
241
- raise AlreadyBundledError, "Could not set up bundler because it is already set up"
243
+ if old_path
244
+ if gemfile_path != old_path
245
+ case @on_conflict
246
+ when :warn
247
+ terminal.puts("Warning: could not set up bundler because it is already set up.", :red)
248
+ when :error
249
+ raise AlreadyBundledError, "Could not set up bundler because it is already set up"
250
+ end
242
251
  end
243
252
  return false
244
253
  end
@@ -247,21 +256,47 @@ module Toys
247
256
  end
248
257
 
249
258
  def setup_bundle(gemfile_path, groups)
250
- require "bundler"
251
259
  begin
260
+ modify_bundle_definition(gemfile_path)
252
261
  ::Bundler.setup(*groups)
253
262
  rescue ::Bundler::GemNotFound
254
263
  restore_toys_libs
255
264
  install_bundle(gemfile_path)
256
265
  ::Bundler.reset!
266
+ modify_bundle_definition(gemfile_path)
257
267
  ::Bundler.setup(*groups)
258
268
  end
259
269
  restore_toys_libs
260
270
  end
261
271
 
272
+ def modify_bundle_definition(gemfile_path)
273
+ builder = ::Bundler::Dsl.new
274
+ builder.eval_gemfile(gemfile_path)
275
+ begin
276
+ builder.eval_gemfile(::File.join(__dir__, "gems", "gemfile.rb"))
277
+ rescue ::Bundler::Dsl::DSLError
278
+ terminal.puts(
279
+ "WARNING: Unable to integrate your Gemfile into the Toys runtime.\n" \
280
+ "When using the Toys Bundler integration features, do NOT list\n" \
281
+ "the toys or toys-core gems directly in your Gemfile. They can be\n" \
282
+ "dependencies of another gem, but cannot be listed directly.",
283
+ :red
284
+ )
285
+ return
286
+ end
287
+ toys_gems = ["toys-core"]
288
+ toys_gems << "toys" if ::Toys.const_defined?(:VERSION)
289
+ definition = builder.to_definition(gemfile_path + ".lock", { gems: toys_gems })
290
+ ::Bundler.instance_variable_set(:@definition, definition)
291
+ end
292
+
262
293
  def restore_toys_libs
294
+ $LOAD_PATH.delete(::Toys::CORE_LIB_PATH)
263
295
  $LOAD_PATH.unshift(::Toys::CORE_LIB_PATH)
264
- $LOAD_PATH.unshift(::Toys::LIB_PATH) if ::Toys.const_defined?(:LIB_PATH)
296
+ if ::Toys.const_defined?(:LIB_PATH)
297
+ $LOAD_PATH.delete(::Toys::LIB_PATH)
298
+ $LOAD_PATH.unshift(::Toys::LIB_PATH)
299
+ end
265
300
  end
266
301
 
267
302
  def permission_to_bundle?
@@ -271,7 +306,8 @@ module Toys
271
306
  when :error
272
307
  false
273
308
  else
274
- terminal.confirm("Your bundle is not complete. Install? ", default: @default_confirm)
309
+ terminal.confirm("Your bundle requires additional gems. Install? ",
310
+ default: @default_confirm)
275
311
  end
276
312
  end
277
313
 
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ unless defined?(@__toys_dev_gemspec)
4
+ gem("toys-core", ::Toys::Core::VERSION)
5
+ gem("toys", ::Toys::VERSION) if ::Toys.const_defined?(:VERSION)
6
+ end
@@ -5,7 +5,7 @@ require "monitor"
5
5
 
6
6
  begin
7
7
  require "io/console"
8
- rescue ::LoadError # rubocop:disable Lint/SuppressedException
8
+ rescue ::LoadError
9
9
  # TODO: alternate methods of getting terminal size
10
10
  end
11
11
 
metadata CHANGED
@@ -1,141 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: toys-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.3
4
+ version: 0.10.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Azuma
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-04 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: did_you_mean
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '1.0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '1.0'
27
- - !ruby/object:Gem::Dependency
28
- name: highline
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '2.0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '2.0'
41
- - !ruby/object:Gem::Dependency
42
- name: minitest
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '5.14'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '5.14'
55
- - !ruby/object:Gem::Dependency
56
- name: minitest-focus
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '1.1'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '1.1'
69
- - !ruby/object:Gem::Dependency
70
- name: minitest-rg
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '5.2'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '5.2'
83
- - !ruby/object:Gem::Dependency
84
- name: rdoc
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: 6.1.2
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: 6.1.2
97
- - !ruby/object:Gem::Dependency
98
- name: redcarpet
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '3.5'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '3.5'
111
- - !ruby/object:Gem::Dependency
112
- name: rubocop
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: 0.79.0
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - "~>"
123
- - !ruby/object:Gem::Version
124
- version: 0.79.0
125
- - !ruby/object:Gem::Dependency
126
- name: yard
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: 0.9.24
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: 0.9.24
11
+ date: 2020-07-11 00:00:00.000000000 Z
12
+ dependencies: []
139
13
  description: Toys-Core is the command line tool framework underlying Toys. It can
140
14
  be used to create command line executables using the Toys DSL and classes.
141
15
  email:
@@ -188,6 +62,7 @@ files:
188
62
  - lib/toys/utils/completion_engine.rb
189
63
  - lib/toys/utils/exec.rb
190
64
  - lib/toys/utils/gems.rb
65
+ - lib/toys/utils/gems/gemfile.rb
191
66
  - lib/toys/utils/help_text.rb
192
67
  - lib/toys/utils/terminal.rb
193
68
  - lib/toys/wrappable_string.rb
@@ -198,7 +73,7 @@ metadata:
198
73
  changelog_uri: https://github.com/dazuma/toys/blob/master/toys-core/CHANGELOG.md
199
74
  source_code_uri: https://github.com/dazuma/toys
200
75
  bug_tracker_uri: https://github.com/dazuma/toys/issues
201
- documentation_uri: https://dazuma.github.io/toys/gems/toys-core/v0.10.3
76
+ documentation_uri: https://dazuma.github.io/toys/gems/toys-core/v0.10.4
202
77
  post_install_message:
203
78
  rdoc_options: []
204
79
  require_paths: