kamaze-project 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +9 -9
  3. data/lib/kamaze-project.rb +1 -31
  4. data/lib/kamaze/project.rb +37 -31
  5. data/lib/kamaze/project/autoload.rb +38 -0
  6. data/lib/kamaze/project/boot/core_ext.rb +8 -8
  7. data/lib/kamaze/project/boot/listen.rb +11 -13
  8. data/lib/kamaze/project/bundled.rb +79 -0
  9. data/lib/kamaze/project/concern.rb +17 -2
  10. data/lib/kamaze/project/concern/cli.rb +3 -1
  11. data/lib/kamaze/project/concern/cli/with_exit_on_failure.rb +2 -6
  12. data/lib/kamaze/project/concern/env.rb +14 -12
  13. data/lib/kamaze/project/concern/helper.rb +1 -2
  14. data/lib/kamaze/project/concern/mode.rb +1 -1
  15. data/lib/kamaze/project/concern/observable.rb +12 -11
  16. data/lib/kamaze/project/concern/sh.rb +7 -7
  17. data/lib/kamaze/project/concern/tasks.rb +36 -10
  18. data/lib/kamaze/project/concern/tools.rb +2 -3
  19. data/lib/kamaze/project/config.rb +1 -1
  20. data/lib/kamaze/project/core_ext/object.rb +17 -8
  21. data/lib/kamaze/project/core_ext/pp.rb +14 -16
  22. data/lib/kamaze/project/debug.rb +47 -48
  23. data/lib/kamaze/project/dsl.rb +9 -5
  24. data/lib/kamaze/project/dsl/definition.rb +6 -12
  25. data/lib/kamaze/project/dsl/setup.rb +1 -3
  26. data/lib/kamaze/project/helper.rb +1 -1
  27. data/lib/kamaze/project/helper/inflector.rb +9 -27
  28. data/lib/kamaze/project/helper/project.rb +1 -1
  29. data/lib/kamaze/project/helper/project/config.rb +1 -1
  30. data/lib/kamaze/project/inflector.rb +15 -0
  31. data/lib/kamaze/project/observable.rb +1 -4
  32. data/lib/kamaze/project/observer.rb +1 -1
  33. data/lib/kamaze/project/resources/Vagrantfile +1 -1
  34. data/lib/kamaze/project/struct.rb +1 -1
  35. data/lib/kamaze/project/tasks/cs.rb +1 -1
  36. data/lib/kamaze/project/tasks/cs/control.rb +1 -1
  37. data/lib/kamaze/project/tasks/cs/correct.rb +1 -1
  38. data/lib/kamaze/project/tasks/cs/pre_commit.rb +4 -6
  39. data/lib/kamaze/project/tasks/doc.rb +2 -4
  40. data/lib/kamaze/project/tasks/doc/watch.rb +4 -6
  41. data/lib/kamaze/project/tasks/gem.rb +15 -6
  42. data/lib/kamaze/project/tasks/gem/build.rb +33 -17
  43. data/lib/kamaze/project/tasks/gem/compile.rb +1 -1
  44. data/lib/kamaze/project/tasks/gem/gemspec.rb +12 -11
  45. data/lib/kamaze/project/tasks/gem/install.rb +1 -1
  46. data/lib/kamaze/project/tasks/gem/push.rb +16 -17
  47. data/lib/kamaze/project/tasks/misc/gitignore.rb +1 -1
  48. data/lib/kamaze/project/tasks/shell.rb +1 -1
  49. data/lib/kamaze/project/tasks/sources.rb +1 -1
  50. data/lib/kamaze/project/tasks/sources/license.rb +1 -1
  51. data/lib/kamaze/project/tasks/test.rb +3 -5
  52. data/lib/kamaze/project/tasks/vagrant.rb +1 -1
  53. data/lib/kamaze/project/tasks/version/edit.rb +1 -1
  54. data/lib/kamaze/project/tools.rb +18 -6
  55. data/lib/kamaze/project/tools/base_tool.rb +6 -2
  56. data/lib/kamaze/project/tools/console.rb +4 -13
  57. data/lib/kamaze/project/tools/console/output.rb +14 -6
  58. data/lib/kamaze/project/tools/console/output/buffer.rb +8 -3
  59. data/lib/kamaze/project/tools/gemspec.rb +11 -21
  60. data/lib/kamaze/project/tools/gemspec/builder.rb +43 -31
  61. data/lib/kamaze/project/tools/gemspec/concern.rb +6 -1
  62. data/lib/kamaze/project/tools/gemspec/concern/reading.rb +2 -5
  63. data/lib/kamaze/project/tools/gemspec/packager.rb +10 -10
  64. data/lib/kamaze/project/tools/gemspec/packer.rb +11 -15
  65. data/lib/kamaze/project/tools/gemspec/packer/command.rb +1 -1
  66. data/lib/kamaze/project/tools/gemspec/reader.rb +22 -14
  67. data/lib/kamaze/project/tools/gemspec/reader/decorator.rb +3 -6
  68. data/lib/kamaze/project/tools/gemspec/writer.rb +43 -19
  69. data/lib/kamaze/project/tools/gemspec/writer/dep_gen.rb +9 -6
  70. data/lib/kamaze/project/tools/gemspec/writer/dependency.rb +1 -1
  71. data/lib/kamaze/project/tools/git.rb +13 -31
  72. data/lib/kamaze/project/tools/git/hooks.rb +12 -6
  73. data/lib/kamaze/project/tools/git/hooks/base_hook.rb +3 -11
  74. data/lib/kamaze/project/tools/git/hooks/pre_commit.rb +3 -7
  75. data/lib/kamaze/project/tools/git/status.rb +13 -9
  76. data/lib/kamaze/project/tools/git/status/decorator.rb +1 -1
  77. data/lib/kamaze/project/tools/git/status/file.rb +2 -1
  78. data/lib/kamaze/project/tools/git/status/files_array.rb +1 -1
  79. data/lib/kamaze/project/tools/git/status/index.rb +1 -1
  80. data/lib/kamaze/project/tools/git/status/worktree.rb +1 -1
  81. data/lib/kamaze/project/tools/git/util.rb +1 -1
  82. data/lib/kamaze/project/tools/licenser.rb +2 -2
  83. data/lib/kamaze/project/tools/packager.rb +12 -22
  84. data/lib/kamaze/project/tools/packager/filesystem.rb +11 -3
  85. data/lib/kamaze/project/tools/packager/filesystem/operator.rb +19 -11
  86. data/lib/kamaze/project/tools/packager/filesystem/operator/utils.rb +22 -16
  87. data/lib/kamaze/project/tools/process_locker.rb +67 -36
  88. data/lib/kamaze/project/tools/rspec.rb +5 -3
  89. data/lib/kamaze/project/tools/rubocop.rb +30 -40
  90. data/lib/kamaze/project/tools/rubocop/arguments.rb +1 -1
  91. data/lib/kamaze/project/tools/rubocop/config.rb +2 -4
  92. data/lib/kamaze/project/tools/shell.rb +7 -8
  93. data/lib/kamaze/project/tools/vagrant.rb +6 -16
  94. data/lib/kamaze/project/tools/vagrant/composer.rb +1 -1
  95. data/lib/kamaze/project/tools/vagrant/composer/file.rb +1 -1
  96. data/lib/kamaze/project/tools/vagrant/remote.rb +1 -1
  97. data/lib/kamaze/project/tools/vagrant/shell.rb +1 -1
  98. data/lib/kamaze/project/tools/vagrant/writer.rb +1 -1
  99. data/lib/kamaze/project/tools/yardoc.rb +14 -17
  100. data/lib/kamaze/project/tools/yardoc/file.rb +7 -7
  101. data/lib/kamaze/project/tools/yardoc/watchable.rb +9 -15
  102. data/lib/kamaze/project/tools/yardoc/watcher.rb +28 -35
  103. data/lib/kamaze/project/tools_provider.rb +28 -40
  104. data/lib/kamaze/project/tools_provider/resolver.rb +1 -1
  105. data/lib/kamaze/project/version.rb +5 -94
  106. data/lib/kamaze/project/version.yml +5 -5
  107. metadata +23 -64
  108. data/bin/plop +0 -5
@@ -1,20 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
3
+ # Copyright (C) 2017-2021 Dimitri Arrigoni <dimitri@arrigoni.me>
4
4
  # License GPLv3+: GNU GPL version 3 or later
5
5
  # <http://www.gnu.org/licenses/gpl.html>.
6
6
  # This is free software: you are free to change and redistribute it.
7
7
  # There is NO WARRANTY, to the extent permitted by law.
8
8
 
9
- require 'pathname'
10
- require 'fileutils'
11
- require 'rake/file_utils'
12
-
13
9
  require_relative '../operator'
14
10
 
15
11
  # Utilities related to files/paths manipulations
16
12
  module Kamaze::Project::Tools::Packager::Filesystem::Operator::Utils
17
- include FileUtils
13
+ autoload(:Pathname, 'pathname')
14
+
15
+ lambda do
16
+ require 'fileutils'
17
+ require 'rake/file_utils'
18
+
19
+ include FileUtils
20
+ end.call
18
21
 
19
22
  protected
20
23
 
@@ -24,11 +27,11 @@ module Kamaze::Project::Tools::Packager::Filesystem::Operator::Utils
24
27
  # @return [Pathname]
25
28
  def purge(dir, options = {})
26
29
  options = { verbose: true }.merge(options)
27
- dir = ::Pathname.new(dir)
30
+ dir = Pathname.new(dir)
28
31
 
29
32
  if dir.exist?
30
33
  ls(dir).each do |entry|
31
- rm_rf(dir.join(entry), options)
34
+ rm_rf(dir.join(entry), **options)
32
35
  end
33
36
  end
34
37
 
@@ -40,13 +43,12 @@ module Kamaze::Project::Tools::Packager::Filesystem::Operator::Utils
40
43
  # @param [String|Pathname] basedir
41
44
  # @param [Array<>] entries
42
45
  # @param [Hash] options
46
+ #
43
47
  # @return [Pathname]
44
48
  def skel_dirs(basedir, entries, options = {})
45
- basedir = ::Pathname.new(basedir)
46
-
47
- map_dirs(entries).each { |dir| mkdir_p(basedir.join(dir), options) }
48
-
49
- basedir
49
+ Pathname.new(basedir).tap do
50
+ map_dirs(entries).each { |dir| mkdir_p(basedir.join(dir), **options) }
51
+ end
50
52
  end
51
53
 
52
54
  # List entries
@@ -54,9 +56,11 @@ module Kamaze::Project::Tools::Packager::Filesystem::Operator::Utils
54
56
  # @param [String] dir
55
57
  # @return [Array<Pathname>]
56
58
  def ls(dir)
57
- ::Pathname.new(dir).entries
58
- .map { |path| ::Pathname.new(path) }
59
- .delete_if { |path| ['.', '..'].include?(path.basename.to_s) }
59
+ # @formatter:off
60
+ Pathname.new(dir).entries
61
+ .map { |path| ::Pathname.new(path) }
62
+ .delete_if { |path| ['.', '..'].include?(path.basename.to_s) }
63
+ # @formatter:on
60
64
  end
61
65
 
62
66
  # Extract directories from given paths
@@ -64,10 +68,12 @@ module Kamaze::Project::Tools::Packager::Filesystem::Operator::Utils
64
68
  # @param [Array<String>] paths
65
69
  # @return [Array<Pathname>]
66
70
  def map_dirs(paths)
71
+ # @formatter:off
67
72
  paths.map { |path| ::Pathname.new(path) }
68
73
  .map(&:dirname)
69
74
  .delete_if { |path| ['.', '..'].include?(path.basename.to_s) }
70
75
  .uniq.sort
76
+ # @formatter:on
71
77
  end
72
78
 
73
79
  # @return [Array<Symbol>]
@@ -1,28 +1,45 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
3
+ # Copyright (C) 2017-2021 Dimitri Arrigoni <dimitri@arrigoni.me>
4
4
  # License GPLv3+: GNU GPL version 3 or later
5
5
  # <http://www.gnu.org/licenses/gpl.html>.
6
6
  # This is free software: you are free to change and redistribute it.
7
7
  # There is NO WARRANTY, to the extent permitted by law.
8
8
 
9
9
  require_relative '../tools'
10
- require 'etc'
11
- require 'fileutils'
12
- require 'pathname'
13
- require 'tmpdir'
14
- require 'process_lock'
15
- require 'active_support/inflector'
16
-
17
- module Kamaze::Project::Tools
18
- class ProcessLocker < BaseTool
19
- end
20
- end
21
10
 
22
11
  # Process Locker
23
12
  #
24
13
  # @see https://github.com/ianheggie/process_lock
25
14
  class Kamaze::Project::Tools::ProcessLocker < Kamaze::Project::Tools::BaseTool
15
+ autoload(:Digest, 'digest')
16
+
17
+ # @formatter:off
18
+ {
19
+ Etc: 'etc',
20
+ FileUtils: 'fileutils',
21
+ Pathname: 'pathname',
22
+ ProcessLock: 'process_lock',
23
+ }.each { |s, fp| autoload(s, fp) }
24
+ # @formatter:on
25
+
26
+ # @return [String]
27
+ attr_reader :lockdir
28
+
29
+ def mutable_attributes
30
+ [:lockdir]
31
+ end
32
+
33
+ # Set name for lockdir.
34
+ #
35
+ # @see #tmpdir
36
+ # @see #setup
37
+ def lockdir=(lockdir)
38
+ inflector.classify(lockdir).yield_self { |s| inflector.underscore(s) }.tap do |name|
39
+ @lockdir = name
40
+ end
41
+ end
42
+
26
43
  # Manage lock on given block
27
44
  #
28
45
  # @return [Object]
@@ -38,26 +55,31 @@ class Kamaze::Project::Tools::ProcessLocker < Kamaze::Project::Tools::BaseTool
38
55
  def lock!(lockname)
39
56
  mklock(lockname).acquire! { yield }
40
57
  rescue ProcessLock::AlreadyLocked
58
+ # noinspection RubyResolve
41
59
  raise Errno::EALREADY if mklock(lockname).alive?
60
+
42
61
  raise
43
62
  end
44
63
 
64
+ # Get tmpdir where lock files are stored.
65
+ #
45
66
  # @return [Pathname]
46
67
  def tmpdir
47
- tmp = Pathname.new(Dir.tmpdir)
48
- uid = Etc.getpwnam(Etc.getlogin).uid
49
- dir = [inflector.underscore(self.class.name).tr('/', '-'), uid].join('.')
68
+ require 'tmpdir' unless Dir.respond_to?(:tmpdir)
50
69
 
51
- tmp.join(dir)
70
+ Pathname.new(Dir.tmpdir).join('%<libname>s.%<uid>s' % { # @formatter:off
71
+ libname: inflector.underscore(self.class.name).split('/')[0..1].join('-'),
72
+ uid: Etc.getpwnam(Etc.getlogin).uid, # @formatter:on
73
+ }, lockdir)
52
74
  end
53
75
 
54
76
  class << self
55
77
  def method_missing(method, *args, &block)
56
78
  if respond_to_missing?(method)
57
- self.new.public_send(method, *args, &block)
58
- else
59
- super
79
+ return self.new.public_send(method, *args, &block)
60
80
  end
81
+
82
+ super
61
83
  end
62
84
 
63
85
  def respond_to_missing?(method, include_private = false)
@@ -69,12 +91,29 @@ class Kamaze::Project::Tools::ProcessLocker < Kamaze::Project::Tools::BaseTool
69
91
 
70
92
  protected
71
93
 
94
+ # @return [Dry::Inflector]
95
+ attr_reader :inflector
96
+
97
+ # @return [Module<FileUtils>]
98
+ attr_reader :fs
99
+
100
+ def setup
101
+ @fs ||= FileUtils
102
+ @inflector ||= Kamaze::Project::Inflector.new
103
+
104
+ unless lockdir # rubocop:disable Style/GuardClause
105
+ self.lockdir = lambda do
106
+ return Kamaze::Project.instance.name if Kamaze::Project.instance
107
+
108
+ Digest::SHA1.hexdigest(__FILE__) # Does not avoid collision if package is globally installed
109
+ end.call
110
+ end
111
+ end
112
+
72
113
  # @param [String] lockname
73
114
  # @return [ProcessLock]
74
115
  def mklock(lockname)
75
- lockfile = mktemp(lockname)
76
-
77
- ProcessLock.new(lockfile)
116
+ mktemp(lockname).yield_self { |lockfile| ProcessLock.new(lockfile) }
78
117
  end
79
118
 
80
119
  # Create a temporary file
@@ -82,25 +121,17 @@ class Kamaze::Project::Tools::ProcessLocker < Kamaze::Project::Tools::BaseTool
82
121
  # @param [String] lockname
83
122
  # @return [Pathname]
84
123
  def mktemp(lockname)
85
- lockname = Pathname.new(lockname.to_s).basename('.*')
86
-
87
- mktmpdir.join(lockname)
124
+ Pathname.new(lockname.to_s).basename('.*').yield_self { |fp| mktmpdir.join(fp) }
88
125
  end
89
126
 
90
127
  # Create ``tmpdir``
91
128
  #
92
- # @param [Hash] options
93
129
  # @return [Pathname]
94
- def mktmpdir(options = {})
95
- tmpdir = self.tmpdir
96
- options[:mode] ||= 0o700
97
-
98
- FileUtils.mkdir_p(tmpdir, options)
130
+ def mktmpdir(**options)
131
+ self.tmpdir.tap do |tmpdir|
132
+ options[:mode] ||= 0o700
99
133
 
100
- tmpdir
101
- end
102
-
103
- def inflector
104
- ActiveSupport::Inflector
134
+ fs.mkdir_p(tmpdir, **options)
135
+ end
105
136
  end
106
137
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
3
+ # Copyright (C) 2017-2021 Dimitri Arrigoni <dimitri@arrigoni.me>
4
4
  # License GPLv3+: GNU GPL version 3 or later
5
5
  # <http://www.gnu.org/licenses/gpl.html>.
6
6
  # This is free software: you are free to change and redistribute it.
@@ -67,10 +67,12 @@ class Kamaze::Project::Tools::Rspec < Kamaze::Project::Tools::BaseTool
67
67
  @arguments += ['--tag', tag]
68
68
  end
69
69
 
70
+ # @formatter:off
70
71
  {
71
- true => @arguments,
72
+ true => @arguments,
72
73
  false => @arguments.clone.concat(options_arguments).map(&:to_s).freeze
73
- }.fetch(caller_locations(1..1).first.path == __FILE__)
74
+ }.fetch(caller_locations(1..1).first&.path == __FILE__)
75
+ # @formatter:on
74
76
  end
75
77
 
76
78
  protected
@@ -1,31 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
3
+ # Copyright (C) 2017-2021 Dimitri Arrigoni <dimitri@arrigoni.me>
4
4
  # License GPLv3+: GNU GPL version 3 or later
5
5
  # <http://www.gnu.org/licenses/gpl.html>.
6
6
  # This is free software: you are free to change and redistribute it.
7
7
  # There is NO WARRANTY, to the extent permitted by law.
8
8
 
9
9
  require_relative '../tools'
10
- require_relative '../concern/cli/with_exit_on_failure'
11
- require 'pathname'
12
- require 'rubocop'
13
-
14
- # rubocop:disable Style/Documentation
15
-
16
- module Kamaze::Project::Tools
17
- class Rubocop < BaseTool
18
- class Arguments < Array
19
- require_relative 'rubocop/arguments'
20
- end
21
-
22
- class Config
23
- require_relative 'rubocop/config'
24
- end
25
- end
26
- end
27
-
28
- # rubocop:enable Style/Documentation
29
10
 
30
11
  # Tool to run ``Rubocop::CLI``
31
12
  #
@@ -37,7 +18,17 @@ end
37
18
  # c.options = ['--fail-level', 'E']
38
19
  # end.run
39
20
  # ```
40
- class Kamaze::Project::Tools::Rubocop
21
+ class Kamaze::Project::Tools::Rubocop < Kamaze::Project::Tools::BaseTool
22
+ # @formatter:off
23
+ {
24
+ Arguments: 'arguments',
25
+ Config: 'config',
26
+ }.each { |s, fp| autoload(s, "#{__dir__}/rubocop/#{fp}") }
27
+ # @formatter:on
28
+
29
+ autoload(:Pathname, 'pathname')
30
+ autoload(:RuboCop, 'rubocop')
31
+
41
32
  include Kamaze::Project::Concern::Cli::WithExitOnFailure
42
33
 
43
34
  # Default arguments used by ``Rubocop::CLI``
@@ -51,17 +42,18 @@ class Kamaze::Project::Tools::Rubocop
51
42
  end
52
43
 
53
44
  def prepare
54
- reset
45
+ self.tap do
46
+ reset
55
47
 
56
- if block_given?
57
- config = Config.new
58
- yield(config)
59
- arguments.concat(config.freeze.to_a)
60
- end
61
-
62
- arguments.freeze
48
+ if block_given?
49
+ Config.new.tap do |config|
50
+ yield(config)
51
+ arguments.concat(config.freeze.to_a)
52
+ end
53
+ end
63
54
 
64
- self
55
+ arguments.freeze
56
+ end
65
57
  end
66
58
 
67
59
  # Arguments used by ``CLI`` (during execution/``run``)
@@ -93,10 +85,8 @@ class Kamaze::Project::Tools::Rubocop
93
85
 
94
86
  if runnable?
95
87
  with_exit_on_failure do
96
- core.run(arguments.to_a).yield_self do |retcode|
97
- self.retcode = retcode
98
- reset
99
- end
88
+ core.run(arguments.to_a).tap { |retcode| self.retcode = retcode }
89
+ reset
100
90
  end
101
91
  end
102
92
 
@@ -108,20 +98,20 @@ class Kamaze::Project::Tools::Rubocop
108
98
  attr_writer :arguments
109
99
 
110
100
  def setup
111
- @defaults = Arguments.new(@defaults.to_a)
101
+ @defaults = Arguments.new((@defaults || ['--only-recognized-file-types']).to_a)
112
102
  end
113
103
 
114
104
  # Reset arguments + retcode
115
105
  #
116
106
  # @return [self]
117
107
  def reset
118
- @arguments = nil
119
- self.retcode = nil if retcode.to_i.zero?
120
-
121
- self
108
+ self.tap do
109
+ @arguments = nil
110
+ self.retcode = nil if retcode.to_i.zero?
111
+ end
122
112
  end
123
113
 
124
- # @return [YARD::CLI::Yardoc]
114
+ # @return [RuboCop::CLI]
125
115
  def core
126
116
  RuboCop::CLI.new
127
117
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
3
+ # Copyright (C) 2017-2021 Dimitri Arrigoni <dimitri@arrigoni.me>
4
4
  # License GPLv3+: GNU GPL version 3 or later
5
5
  # <http://www.gnu.org/licenses/gpl.html>.
6
6
  # This is free software: you are free to change and redistribute it.
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
3
+ # Copyright (C) 2017-2021 Dimitri Arrigoni <dimitri@arrigoni.me>
4
4
  # License GPLv3+: GNU GPL version 3 or later
5
5
  # <http://www.gnu.org/licenses/gpl.html>.
6
6
  # This is free software: you are free to change and redistribute it.
@@ -26,9 +26,7 @@ class Kamaze::Project::Tools::Rubocop::Config
26
26
 
27
27
  # @return [Array<String>]
28
28
  def to_a
29
- filepaths = match_patterns(patterns)
30
-
31
- self.options.to_a.clone.concat(['--'] + filepaths)
29
+ self.options.to_a.clone.concat(['--']).concat(match_patterns(patterns))
32
30
  end
33
31
 
34
32
  protected
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
3
+ # Copyright (C) 2017-2021 Dimitri Arrigoni <dimitri@arrigoni.me>
4
4
  # License GPLv3+: GNU GPL version 3 or later
5
5
  # <http://www.gnu.org/licenses/gpl.html>.
6
6
  # This is free software: you are free to change and redistribute it.
@@ -43,7 +43,7 @@ class Kamaze::Project::Tools::Shell < Kamaze::Project::Tools::BaseTool
43
43
 
44
44
  def setup
45
45
  @console ||= Kamaze.project.tools.fetch(:console)
46
- @provider ||= require_any(:pry) ? Pry : nil
46
+ @provider ||= require_any(:pry) ? Object.const_get(:Pry) : nil
47
47
  @banner ||= nil
48
48
  end
49
49
 
@@ -69,16 +69,15 @@ class Kamaze::Project::Tools::Shell < Kamaze::Project::Tools::BaseTool
69
69
  # Require any gem based on ``Gem::Specification``
70
70
  #
71
71
  # @param [String|Symbol] gem_name
72
- # @param [String|Symbol] req_name
72
+ # @param [Array|nil] requirements
73
73
  # @return [Boolean]
74
- def require_any(gem_name, req_name = nil)
74
+ def require_any(gem_name, requirements = nil)
75
75
  gem_name = gem_name.to_s
76
- req_name ||= gem_name
77
- spec = Gem::Specification
76
+ requirements ||= [gem_name]
78
77
 
79
- return false unless spec.find_all_by_name(gem_name).any?
78
+ return false unless Gem::Specification.find_all_by_name(gem_name).any?
80
79
 
81
- require req_name
80
+ requirements.each { |req| require req.to_s }
82
81
 
83
82
  true
84
83
  end