kamaze-project 1.0.4 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +9 -9
  3. data/lib/kamaze-project.rb +1 -30
  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 +4 -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 +40 -49
  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 -38
  88. data/lib/kamaze/project/tools/rspec.rb +5 -3
  89. data/lib/kamaze/project/tools/rubocop.rb +30 -41
  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 -18
  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 -91
  106. data/lib/kamaze/project/version.yml +6 -6
  107. metadata +23 -51
  108. data/.rubocop.yml +0 -37
  109. data/bin/plop +0 -5
@@ -1,29 +1,15 @@
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 'base_tool'
11
10
  require 'base64'
12
11
  require 'pathname'
13
12
 
14
- # rubocop:disable Style/Documentation
15
-
16
- module Kamaze::Project::Tools
17
- class Vagrant < BaseTool
18
- end
19
-
20
- [:composer, :shell, :writer, :remote].each do |req|
21
- require_relative "vagrant/#{req}"
22
- end
23
- end
24
-
25
- # rubocop:enable Style/Documentation
26
-
27
13
  # Vagrant based,
28
14
  # this class provides a easy and ready to use wrapper around ``vagrant``
29
15
  # executable. VM configuration is easyfied by the use of YAML files.
@@ -53,7 +39,11 @@ end
53
39
  #
54
40
  # @see http://yaml.org/YAML_for_ruby.html
55
41
  # @see https://friendsofvagrant.github.io/v1/docs/boxes.html
56
- class Kamaze::Project::Tools::Vagrant
42
+ class Kamaze::Project::Tools::Vagrant < Kamaze::Project::Tools::BaseTool
43
+ [:composer, :shell, :writer, :remote].each do |req|
44
+ require_relative "vagrant/#{req}"
45
+ end
46
+
57
47
  # Template file (used for code generation)
58
48
  #
59
49
  # @return [String]
@@ -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.
@@ -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.
@@ -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,30 +1,28 @@
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 'pathname'
11
-
12
- # rubocop:disable Style/Documentation
13
-
14
- module Kamaze::Project::Tools
15
- class Yardoc < BaseTool
16
- end
17
-
18
- require_relative 'yardoc/file'
19
- require_relative 'yardoc/watchable'
20
- end
21
-
22
- # rubocop:enable Style/Documentation
23
10
 
24
11
  # Tool to run ``CLI::Yardoc`` and generate documentation
25
12
  #
26
13
  # @see https://github.com/lsegal/yard/blob/49d885f29075cfef4cb954bb9247b6fbc8318cac/lib/yard/rake/yardoc_task.rb
27
- class Kamaze::Project::Tools::Yardoc
14
+ class Kamaze::Project::Tools::Yardoc < Kamaze::Project::Tools::BaseTool
15
+ autoload(:Pathname, 'pathname')
16
+ autoload(:YARD, 'yard')
17
+
18
+ # @formatter:off
19
+ {
20
+ File: 'file',
21
+ Watchable: 'watchable',
22
+ Watcher: 'watcher',
23
+ }.each { |s, fp| autoload(s, "#{__dir__}/yardoc/#{fp}") }
24
+ # @formatter:on
25
+
28
26
  include Watchable
29
27
 
30
28
  # Options used by ``YARD::CLI::Yardoc``
@@ -65,10 +63,8 @@ class Kamaze::Project::Tools::Yardoc
65
63
 
66
64
  # @return [YARD::CLI::Yardoc]
67
65
  def core
68
- require 'yard'
69
-
70
66
  YARD::CLI::Yardoc.new.tap do |yard|
71
- yard.parse_arguments([])
67
+ yard.parse_arguments
72
68
 
73
69
  options.to_h.each { |k, v| yard.options[k.to_sym] = v }
74
70
  end
@@ -1,13 +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 '../yardoc'
10
- require 'pathname'
11
10
 
12
11
  # Describe a "file"
13
12
  #
@@ -16,9 +15,12 @@ require 'pathname'
16
15
  # as a glob expression, else file (``filepath``) is a fixed string.
17
16
  # Thus, file is castable to ``Array``.
18
17
  class Kamaze::Project::Tools::Yardoc::File
18
+ autoload(:Pathname, 'pathname')
19
+
19
20
  # @param [String] filepath
20
21
  # @param [Boolean] glob
21
22
  def initialize(filepath, glob = false)
23
+ # noinspection RubySimplifyBooleanInspection
22
24
  @glob = !!glob
23
25
  @filepath = filepath.to_s
24
26
  end
@@ -27,13 +29,11 @@ class Kamaze::Project::Tools::Yardoc::File
27
29
  def paths
28
30
  proc do
29
31
  if glob?
30
- Dir.glob(filepath).map { |f| ::Pathname.new(f).dirname }
32
+ Dir.glob(filepath).map { |f| Pathname.new(f).dirname }
31
33
  else
32
- [::Pathname.new(filepath).dirname]
34
+ [Pathname.new(filepath).dirname]
33
35
  end
34
- end.call.uniq.sort.map do |f|
35
- ::Pathname.new(f.to_s.gsub('./', ''))
36
- end
36
+ end.call.uniq.sort.map { |f| Pathname.new(f.to_s.gsub('./', '')) }
37
37
  end
38
38
 
39
39
  # Denote file MUST be evaluated as a glob expression
@@ -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.
@@ -8,19 +8,6 @@
8
8
 
9
9
  require_relative '../yardoc'
10
10
 
11
- # rubocop:disable Style/Documentation
12
-
13
- class Kamaze::Project::Tools::Yardoc
14
- module Watchable
15
- class File < Kamaze::Project::Tools::Yardoc::File
16
- end
17
-
18
- private_constant :File
19
- end
20
- end
21
-
22
- # rubocop:enable Style/Documentation
23
-
24
11
  # Provide watch related methods
25
12
  #
26
13
  # Yardoc (wrapper class) is used by a Watcher using tools
@@ -31,12 +18,17 @@ end
31
18
  #
32
19
  # Instance of ``YARD::CLI::Yardoc`` is retrieved through ``core`` method
33
20
  module Kamaze::Project::Tools::Yardoc::Watchable
21
+ class File < Kamaze::Project::Tools::Yardoc::File
22
+ end
23
+
24
+ private_constant :File
25
+
34
26
  # Get paths
35
27
  #
36
28
  # @return [Array<Pathname>]
37
29
  def paths
38
30
  files.map do |file|
39
- file.to_a.sort[0]
31
+ file.to_a.min
40
32
  end.flatten.compact.uniq.sort
41
33
  end
42
34
 
@@ -55,10 +47,12 @@ module Kamaze::Project::Tools::Yardoc::Watchable
55
47
  #
56
48
  # @return [Array<Kamaze::Project::Tools::Yardoc::File>]
57
49
  def files
50
+ # @formatter:off
58
51
  [
59
52
  core.files.to_a.flatten.map { |f| File.new(f, true) },
60
53
  core.options.files.to_a.map { |f| File.new(f.filename, false) }
61
54
  ].flatten
55
+ # @formatter:on
62
56
  end
63
57
 
64
58
  # Ignores files matching path match (regexp)
@@ -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.
@@ -8,13 +8,13 @@
8
8
 
9
9
  require_relative '../yardoc'
10
10
 
11
- class Kamaze::Project::Tools::Yardoc
12
- class Watcher < Kamaze::Project::Tools::BaseTool
13
- end
14
- end
15
-
16
11
  # Provide a watcher built on top of Yardoc
17
- class Kamaze::Project::Tools::Yardoc::Watcher
12
+ class Kamaze::Project::Tools::Yardoc::Watcher < Kamaze::Project::Tools::BaseTool
13
+ autoload(:Listen, 'listen')
14
+
15
+ # @return [Kamaze::Project::Tools::Yardoc]
16
+ attr_accessor :yardoc
17
+
18
18
  # @type [Array<String>]
19
19
  attr_writer :paths
20
20
 
@@ -26,21 +26,18 @@ class Kamaze::Project::Tools::Yardoc::Watcher
26
26
 
27
27
  # Watch for changes
28
28
  #
29
- # Non-blocking, unless ``wait``
29
+ # Non-blocking, unless ``wait`` (bool)
30
30
  #
31
31
  # @param [Boolean] wait
32
32
  # @return [self]
33
33
  def watch(wait = false)
34
- listener = ::Listen.to(*paths, options) do |mod, add, rem|
35
- if trigger?(mod + add + rem)
36
- yardoc.run
37
- end
38
- end
39
-
40
- listener.start
41
- sleep if wait
34
+ self.tap do
35
+ Listen.to(*paths, options) do |mod, add, rem|
36
+ yardoc.run if trigger?(*mod.concat(add).concat(rem))
37
+ end.tap(&:start)
42
38
 
43
- self
39
+ sleep if wait
40
+ end
44
41
  end
45
42
 
46
43
  # @return [Array<String>]
@@ -50,13 +47,13 @@ class Kamaze::Project::Tools::Yardoc::Watcher
50
47
 
51
48
  # @return [Array<String>]
52
49
  def paths
53
- paths = @paths.map(&:to_s)
54
-
55
- paths.include?('.') ? ['.'] : paths
50
+ @paths.map(&:to_s).tap do |paths|
51
+ return paths.include?('.') ? ['.'] : paths
52
+ end
56
53
  end
57
54
 
58
55
  def mutable_attributes
59
- [:paths, :options, :patterns]
56
+ [:yardoc, :paths, :options, :patterns]
60
57
  end
61
58
 
62
59
  protected
@@ -64,10 +61,8 @@ class Kamaze::Project::Tools::Yardoc::Watcher
64
61
  # Transform paths to relative paths
65
62
  #
66
63
  # @param [String|Pathname|Array<String>] paths
67
- def rel(paths)
68
- paths = [paths] unless paths.is_a?(Array)
69
-
70
- paths.map do |path|
64
+ def relative(*paths)
65
+ (paths.is_a?(Array) ? paths : [paths]).map do |path|
71
66
  path.to_s.gsub(%r{^#{Dir.pwd}/+}, '')
72
67
  end
73
68
  end
@@ -76,31 +71,29 @@ class Kamaze::Project::Tools::Yardoc::Watcher
76
71
  #
77
72
  # @param [String|Pathname|Array<String>] paths
78
73
  # @return [Boolean]
79
- def trigger?(paths)
80
- paths = [paths] unless paths.is_a?(Array)
81
-
74
+ def trigger?(*paths)
75
+ # @formatter:off
82
76
  paths.map(&:to_s)
83
- .map { |path| rel(path)[0] }
77
+ .map { |path| relative(path)[0] }
84
78
  .each do |path|
85
79
  patterns.each do |pattern|
86
80
  return true if File.fnmatch(pattern, path, File::FNM_PATHNAME)
87
81
  end
82
+ # @formatter:on
88
83
  end
89
84
 
90
85
  false
91
86
  end
92
87
 
93
88
  def setup
89
+ @yardoc ||= Kamaze::Project.instance.tools.fetch('yardoc')
94
90
  @paths ||= yardoc.paths
95
91
  @patterns ||= yardoc.patterns
92
+ # @formatter:off
96
93
  @options = {
97
- only: /\.(rb|md)$/,
94
+ only: /\.(rb|md)$/,
98
95
  ignore: yardoc.excluded.map { |pattern| /#{pattern}/ }
99
96
  }.merge(@options.to_h)
100
- end
101
-
102
- # @return [Kamaze::Project::Tools::Yardoc]
103
- def yardoc
104
- Kamaze.project.tools.fetch('yardoc')
97
+ # @formatter:on
105
98
  end
106
99
  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.
@@ -8,15 +8,6 @@
8
8
 
9
9
  require_relative '../project'
10
10
 
11
- class Kamaze::Project
12
- class ToolsProvider
13
- class Resolver
14
- end
15
- end
16
- end
17
-
18
- require_relative 'tools_provider/resolver'
19
-
20
11
  # Tools provider
21
12
  #
22
13
  # Tools are instantiated on demand,
@@ -33,6 +24,12 @@ require_relative 'tools_provider/resolver'
33
24
  # end
34
25
  # ```
35
26
  class Kamaze::Project::ToolsProvider
27
+ # @formatter:off
28
+ {
29
+ Resolver: 'resolver',
30
+ }.each { |s, fp| autoload(s, "#{__dir__}/tools_provider/#{fp}") }
31
+ # @formatter:on
32
+
36
33
  class << self
37
34
  # Default tools
38
35
  #
@@ -52,29 +49,26 @@ class Kamaze::Project::ToolsProvider
52
49
  #
53
50
  # @return [Hash]
54
51
  def items
55
- config = "#{__dir__}/resources/config/tools.yml"
56
- defaults = YAML.load_file(config)
57
-
58
- Hash[defaults.collect { |k, v| [k.to_sym, v] }]
52
+ "#{__dir__}/resources/config/tools.yml"
53
+ .yield_self { |file| YAML.load_file(file) }
54
+ .yield_self do |defaults|
55
+ defaults.transform_keys(&:to_sym)
56
+ end
59
57
  end
60
58
  end
61
59
 
62
60
  # @param [Hash] items
63
61
  def initialize(items = {})
64
62
  @items = Hash[self.class.defaults].merge(items)
65
- @cache = {}
66
63
  @resolver = Resolver.new
67
64
  end
68
65
 
69
66
  # @param [Hash] items
70
67
  # @return [self]
71
68
  def merge!(items)
72
- items = Hash[items.map { |k, v| [k.to_sym, v] }]
73
- @cache.delete_if { |k| items.member?(k) }
74
-
75
- @items.merge!(items)
76
-
77
- self
69
+ self.tap do
70
+ items.transform_keys(&:to_sym).tap { |h| @items.merge!(h) }
71
+ end
78
72
  end
79
73
 
80
74
  # Associates the value given by value with the given key.
@@ -82,7 +76,9 @@ class Kamaze::Project::ToolsProvider
82
76
  # @param [String|Symbol] name
83
77
  # @param [Class] value
84
78
  def []=(name, value)
85
- merge!(name => value)
79
+ value.tap do
80
+ { name => value }.tap { |h| merge!(h) }
81
+ end
86
82
  end
87
83
 
88
84
  # Prevents further modifications.
@@ -91,8 +87,9 @@ class Kamaze::Project::ToolsProvider
91
87
  #
92
88
  # @return [self]
93
89
  def freeze
94
- @items.freeze
95
- super
90
+ super.tap do
91
+ @items.freeze
92
+ end
96
93
  end
97
94
 
98
95
  # Get a fresh instance with given name
@@ -115,11 +112,9 @@ class Kamaze::Project::ToolsProvider
115
112
 
116
113
  return nil unless member?(name)
117
114
 
118
- @cache[name] ||= @items.fetch(name).yield_self do |klass|
119
- resolver.classify(klass)
115
+ self.items.fetch(name).yield_self do |klass|
116
+ resolver.classify(klass).new
120
117
  end
121
-
122
- @cache.fetch(name).new
123
118
  end
124
119
 
125
120
  alias get fetch
@@ -128,10 +123,10 @@ class Kamaze::Project::ToolsProvider
128
123
  #
129
124
  # @return [Hash]
130
125
  def to_h
131
- @items
132
- .map { |k, v| [k, @cache[k] ||= resolver.classify(v)] }
133
- .yield_self { |results| Hash[results] }
134
- .yield_self { |items| Hash[items.collect { |k, v| [k, v.new] }] }
126
+ self.items
127
+ .map { |k, v| [k, resolver.classify(v)] }
128
+ .yield_self { |results| Hash[results] }
129
+ .yield_self { |items| items.transform_values(&:new) }
135
130
  end
136
131
 
137
132
  # Returns ``true`` if the given key is present
@@ -139,9 +134,7 @@ class Kamaze::Project::ToolsProvider
139
134
  # @param [Symbol|String] name
140
135
  # @return [Boolean]
141
136
  def member?(name)
142
- name = name.to_sym
143
-
144
- @items.member?(name)
137
+ self.items.member?(name.to_sym)
145
138
  end
146
139
 
147
140
  protected
@@ -153,9 +146,4 @@ class Kamaze::Project::ToolsProvider
153
146
  #
154
147
  # @return [Hash]
155
148
  attr_reader :items
156
-
157
- # Used to avoid classes resolution.
158
- #
159
- # @return [Hash]
160
- attr_reader :cache
161
149
  end