kamaze-project 1.0.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.
Files changed (106) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +18 -0
  3. data/bin/plop +5 -0
  4. data/lib/kamaze-project.rb +39 -0
  5. data/lib/kamaze/project.rb +155 -0
  6. data/lib/kamaze/project/boot/core_ext.rb +16 -0
  7. data/lib/kamaze/project/boot/listen.rb +38 -0
  8. data/lib/kamaze/project/concern.rb +13 -0
  9. data/lib/kamaze/project/concern/cli.rb +53 -0
  10. data/lib/kamaze/project/concern/cli/with_exit_on_failure.rb +36 -0
  11. data/lib/kamaze/project/concern/env.rb +63 -0
  12. data/lib/kamaze/project/concern/helper.rb +20 -0
  13. data/lib/kamaze/project/concern/mode.rb +19 -0
  14. data/lib/kamaze/project/concern/observable.rb +132 -0
  15. data/lib/kamaze/project/concern/sh.rb +91 -0
  16. data/lib/kamaze/project/concern/tasks.rb +55 -0
  17. data/lib/kamaze/project/concern/tools.rb +27 -0
  18. data/lib/kamaze/project/config.rb +58 -0
  19. data/lib/kamaze/project/core_ext/object.rb +27 -0
  20. data/lib/kamaze/project/core_ext/pp.rb +28 -0
  21. data/lib/kamaze/project/debug.rb +136 -0
  22. data/lib/kamaze/project/dsl.rb +16 -0
  23. data/lib/kamaze/project/dsl/definition.rb +43 -0
  24. data/lib/kamaze/project/dsl/setup.rb +11 -0
  25. data/lib/kamaze/project/helper.rb +63 -0
  26. data/lib/kamaze/project/helper/inflector.rb +44 -0
  27. data/lib/kamaze/project/helper/project.rb +34 -0
  28. data/lib/kamaze/project/helper/project/config.rb +25 -0
  29. data/lib/kamaze/project/observable.rb +20 -0
  30. data/lib/kamaze/project/observer.rb +37 -0
  31. data/lib/kamaze/project/resources/Vagrantfile +128 -0
  32. data/lib/kamaze/project/resources/config/tools.yml +15 -0
  33. data/lib/kamaze/project/struct.rb +34 -0
  34. data/lib/kamaze/project/tasks/cs.rb +23 -0
  35. data/lib/kamaze/project/tasks/cs/control.rb +17 -0
  36. data/lib/kamaze/project/tasks/cs/correct.rb +17 -0
  37. data/lib/kamaze/project/tasks/cs/pre_commit.rb +66 -0
  38. data/lib/kamaze/project/tasks/doc.rb +21 -0
  39. data/lib/kamaze/project/tasks/doc/watch.rb +41 -0
  40. data/lib/kamaze/project/tasks/gem.rb +14 -0
  41. data/lib/kamaze/project/tasks/gem/build.rb +34 -0
  42. data/lib/kamaze/project/tasks/gem/compile.rb +30 -0
  43. data/lib/kamaze/project/tasks/gem/gemspec.rb +20 -0
  44. data/lib/kamaze/project/tasks/gem/install.rb +32 -0
  45. data/lib/kamaze/project/tasks/gem/push.rb +27 -0
  46. data/lib/kamaze/project/tasks/misc/gitignore.rb +29 -0
  47. data/lib/kamaze/project/tasks/shell.rb +17 -0
  48. data/lib/kamaze/project/tasks/sources.rb +6 -0
  49. data/lib/kamaze/project/tasks/sources/license.rb +35 -0
  50. data/lib/kamaze/project/tasks/test.rb +16 -0
  51. data/lib/kamaze/project/tasks/vagrant.rb +71 -0
  52. data/lib/kamaze/project/tasks/version/edit.rb +16 -0
  53. data/lib/kamaze/project/tools.rb +18 -0
  54. data/lib/kamaze/project/tools/base_tool.rb +55 -0
  55. data/lib/kamaze/project/tools/console.rb +48 -0
  56. data/lib/kamaze/project/tools/console/output.rb +120 -0
  57. data/lib/kamaze/project/tools/console/output/buffer.rb +48 -0
  58. data/lib/kamaze/project/tools/gemspec.rb +33 -0
  59. data/lib/kamaze/project/tools/gemspec/builder.rb +99 -0
  60. data/lib/kamaze/project/tools/gemspec/concern.rb +13 -0
  61. data/lib/kamaze/project/tools/gemspec/concern/reading.rb +49 -0
  62. data/lib/kamaze/project/tools/gemspec/packager.rb +67 -0
  63. data/lib/kamaze/project/tools/gemspec/packer.rb +89 -0
  64. data/lib/kamaze/project/tools/gemspec/packer/command.rb +143 -0
  65. data/lib/kamaze/project/tools/gemspec/reader.rb +70 -0
  66. data/lib/kamaze/project/tools/gemspec/reader/decorator.rb +78 -0
  67. data/lib/kamaze/project/tools/gemspec/writer.rb +127 -0
  68. data/lib/kamaze/project/tools/gemspec/writer/dep_gen.rb +61 -0
  69. data/lib/kamaze/project/tools/gemspec/writer/dependency.rb +104 -0
  70. data/lib/kamaze/project/tools/git.rb +95 -0
  71. data/lib/kamaze/project/tools/git/hooks.rb +66 -0
  72. data/lib/kamaze/project/tools/git/hooks/base_hook.rb +33 -0
  73. data/lib/kamaze/project/tools/git/hooks/pre_commit.rb +81 -0
  74. data/lib/kamaze/project/tools/git/status.rb +101 -0
  75. data/lib/kamaze/project/tools/git/status/decorator.rb +39 -0
  76. data/lib/kamaze/project/tools/git/status/file.rb +180 -0
  77. data/lib/kamaze/project/tools/git/status/files_array.rb +39 -0
  78. data/lib/kamaze/project/tools/git/status/index.rb +77 -0
  79. data/lib/kamaze/project/tools/git/status/worktree.rb +19 -0
  80. data/lib/kamaze/project/tools/git/util.rb +35 -0
  81. data/lib/kamaze/project/tools/licenser.rb +197 -0
  82. data/lib/kamaze/project/tools/packager.rb +86 -0
  83. data/lib/kamaze/project/tools/packager/filesystem.rb +178 -0
  84. data/lib/kamaze/project/tools/packager/filesystem/operator.rb +83 -0
  85. data/lib/kamaze/project/tools/packager/filesystem/operator/utils.rb +77 -0
  86. data/lib/kamaze/project/tools/process_locker.rb +106 -0
  87. data/lib/kamaze/project/tools/rspec.rb +115 -0
  88. data/lib/kamaze/project/tools/rubocop.rb +128 -0
  89. data/lib/kamaze/project/tools/rubocop/arguments.rb +19 -0
  90. data/lib/kamaze/project/tools/rubocop/config.rb +43 -0
  91. data/lib/kamaze/project/tools/shell.rb +85 -0
  92. data/lib/kamaze/project/tools/vagrant.rb +182 -0
  93. data/lib/kamaze/project/tools/vagrant/composer.rb +88 -0
  94. data/lib/kamaze/project/tools/vagrant/composer/file.rb +79 -0
  95. data/lib/kamaze/project/tools/vagrant/remote.rb +79 -0
  96. data/lib/kamaze/project/tools/vagrant/shell.rb +102 -0
  97. data/lib/kamaze/project/tools/vagrant/writer.rb +81 -0
  98. data/lib/kamaze/project/tools/yardoc.rb +75 -0
  99. data/lib/kamaze/project/tools/yardoc/file.rb +55 -0
  100. data/lib/kamaze/project/tools/yardoc/watchable.rb +70 -0
  101. data/lib/kamaze/project/tools/yardoc/watcher.rb +106 -0
  102. data/lib/kamaze/project/tools_provider.rb +161 -0
  103. data/lib/kamaze/project/tools_provider/resolver.rb +42 -0
  104. data/lib/kamaze/project/version.rb +104 -0
  105. data/lib/kamaze/project/version.yml +17 -0
  106. metadata +321 -0
@@ -0,0 +1,128 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
4
+ # License GPLv3+: GNU GPL version 3 or later
5
+ # <http://www.gnu.org/licenses/gpl.html>.
6
+ # This is free software: you are free to change and redistribute it.
7
+ # There is NO WARRANTY, to the extent permitted by law.
8
+
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
+
30
+ # Tool to run ``Rubocop::CLI``
31
+ #
32
+ # Sample of use:
33
+ #
34
+ # ```ruby
35
+ # Rubocop.new.prepare do |c|
36
+ # c.patterns = ["#{Dir.pwd}/test/cs.rb"]
37
+ # c.options = ['--fail-level', 'E']
38
+ # end.run
39
+ # ```
40
+ class Kamaze::Project::Tools::Rubocop
41
+ include Kamaze::Project::Concern::Cli::WithExitOnFailure
42
+
43
+ # Default arguments used by ``Rubocop::CLI``
44
+ #
45
+ # @type [Array|Arguments]
46
+ # @return [Arguments]
47
+ attr_accessor :defaults
48
+
49
+ def mutable_attributes
50
+ [:defaults]
51
+ end
52
+
53
+ def prepare
54
+ reset
55
+
56
+ if block_given?
57
+ config = Config.new
58
+ yield(config)
59
+ arguments.concat(config.freeze.to_a)
60
+ end
61
+
62
+ arguments.freeze
63
+
64
+ self
65
+ end
66
+
67
+ # Arguments used by ``CLI`` (during execution/``run``)
68
+ #
69
+ # @return [Arguments]
70
+ def arguments
71
+ @arguments = defaults.clone if @arguments.to_a.size.zero?
72
+
73
+ if caller_locations(1..1).first.path == __FILE__
74
+ @arguments
75
+ else
76
+ @arguments.clone.freeze
77
+ end
78
+ end
79
+
80
+ # Denote runnable
81
+ #
82
+ # When last argument is ``--`` we suppose there is no files
83
+ #
84
+ # @return [Boolean]
85
+ def runnable?
86
+ '--' != arguments.last
87
+ end
88
+
89
+ # @raise [SystemExit]
90
+ # @return [self]
91
+ def run
92
+ prepare if arguments.to_a.empty?
93
+
94
+ if runnable?
95
+ with_exit_on_failure do
96
+ core.run(arguments.to_a).yield_self do |retcode|
97
+ self.retcode = retcode
98
+ reset
99
+ end
100
+ end
101
+ end
102
+
103
+ self
104
+ end
105
+
106
+ protected
107
+
108
+ attr_writer :arguments
109
+
110
+ def setup
111
+ @defaults = Arguments.new(@defaults.to_a)
112
+ end
113
+
114
+ # Reset arguments + retcode
115
+ #
116
+ # @return [self]
117
+ def reset
118
+ @arguments = nil
119
+ self.retcode = nil if retcode.to_i.zero?
120
+
121
+ self
122
+ end
123
+
124
+ # @return [YARD::CLI::Yardoc]
125
+ def core
126
+ RuboCop::CLI.new
127
+ end
128
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
4
+ # License GPLv3+: GNU GPL version 3 or later
5
+ # <http://www.gnu.org/licenses/gpl.html>.
6
+ # This is free software: you are free to change and redistribute it.
7
+ # There is NO WARRANTY, to the extent permitted by law.
8
+
9
+ require_relative '../rubocop'
10
+
11
+ # Arguments
12
+ #
13
+ # Almost a basic ``Array``
14
+ class Kamaze::Project::Tools::Rubocop::Arguments < Array
15
+ # @return [Array<String>]
16
+ def to_a
17
+ super.map(&:to_s)
18
+ end
19
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
4
+ # License GPLv3+: GNU GPL version 3 or later
5
+ # <http://www.gnu.org/licenses/gpl.html>.
6
+ # This is free software: you are free to change and redistribute it.
7
+ # There is NO WARRANTY, to the extent permitted by law.
8
+
9
+ require_relative '../rubocop'
10
+
11
+ # Config used during prepare method
12
+ #
13
+ # Config is defined by ``options`` and ``patterns``
14
+ class Kamaze::Project::Tools::Rubocop::Config
15
+ # Patterns used to match files
16
+ #
17
+ # @type [Array]
18
+ # @return [Array]
19
+ attr_accessor :patterns
20
+
21
+ # Command options
22
+ #
23
+ # @type [Array]
24
+ # @return [Array]
25
+ attr_accessor :options
26
+
27
+ # @return [Array<String>]
28
+ def to_a
29
+ filepaths = match_patterns(patterns)
30
+
31
+ self.options.to_a.clone.concat(['--'] + filepaths)
32
+ end
33
+
34
+ protected
35
+
36
+ # Match against given patterns
37
+ #
38
+ # @param [Array<String>] patterns
39
+ # @return [Array<String>]
40
+ def match_patterns(patterns)
41
+ Dir.glob(patterns)
42
+ end
43
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
4
+ # License GPLv3+: GNU GPL version 3 or later
5
+ # <http://www.gnu.org/licenses/gpl.html>.
6
+ # This is free software: you are free to change and redistribute it.
7
+ # There is NO WARRANTY, to the extent permitted by law.
8
+
9
+ require_relative '../tools'
10
+
11
+ # Provide a REPL (based on ``Pry``)
12
+ class Kamaze::Project::Tools::Shell < Kamaze::Project::Tools::BaseTool
13
+ # REPL provider
14
+ #
15
+ # Allowing to replace ``Pry`` by ``IRB``, or any REPL
16
+ # class or instance responding to a `start`` method.
17
+ #
18
+ # @type [Pry|Class|Object]
19
+ attr_writer :provider
20
+
21
+ # Console used for outputs (``stderr`` and ``stdout``)
22
+ #
23
+ # @type [Kamaze::Project::Tools::Console]
24
+ attr_writer :console
25
+
26
+ # @type [String]
27
+ attr_writer :banner
28
+
29
+ # Get banner
30
+ #
31
+ # @return [String]
32
+ def banner
33
+ return @banner if @banner
34
+
35
+ patch = defined?(RUBY_PATCHLEVEL) ? "p#{RUBY_PATCHLEVEL}" : nil
36
+ # almost like RUBY_DESCRIPTION
37
+ descr = ["#{RUBY_ENGINE} #{RUBY_VERSION}#{patch}".rstrip,
38
+ "(#{RUBY_RELEASE_DATE})",
39
+ "[#{RUBY_PLATFORM}]"].join(' ')
40
+
41
+ "{{green:#{descr}}}"
42
+ end
43
+
44
+ def setup
45
+ @console ||= Kamaze.project.tools.fetch(:console)
46
+ @provider ||= require_any(:pry) ? Pry : nil
47
+ @banner ||= nil
48
+ end
49
+
50
+ # Start REPL session
51
+ def start
52
+ require_any(:interesting_methods)
53
+ console.stdout.puts(banner)
54
+ provider.start
55
+ end
56
+
57
+ protected
58
+
59
+ # Get console
60
+ #
61
+ # @return [Kamaze::Project::Tools::Console]
62
+ attr_reader :console
63
+
64
+ # Get provider
65
+ #
66
+ # @return [Pry|Class|Object]
67
+ attr_reader :provider
68
+
69
+ # Require any gem based on ``Gem::Specification``
70
+ #
71
+ # @param [String|Symbol] gem_name
72
+ # @param [String|Symbol] req_name
73
+ # @return [Boolean]
74
+ def require_any(gem_name, req_name = nil)
75
+ gem_name = gem_name.to_s
76
+ req_name ||= gem_name
77
+ spec = Gem::Specification
78
+
79
+ return false unless spec.find_all_by_name(gem_name).any?
80
+
81
+ require req_name
82
+
83
+ true
84
+ end
85
+ end
@@ -0,0 +1,182 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (C) 2017-2018 Dimitri Arrigoni <dimitri@arrigoni.me>
4
+ # License GPLv3+: GNU GPL version 3 or later
5
+ # <http://www.gnu.org/licenses/gpl.html>.
6
+ # This is free software: you are free to change and redistribute it.
7
+ # There is NO WARRANTY, to the extent permitted by law.
8
+
9
+ require_relative '../tools'
10
+ require_relative 'base_tool'
11
+ require 'base64'
12
+ require 'pathname'
13
+
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
+ # Vagrant based,
28
+ # this class provides a easy and ready to use wrapper around ``vagrant``
29
+ # executable. VM configuration is easyfied by the use of YAML files.
30
+ #
31
+ # VM configurations are stored in a single directory (default: ``vagrant``)
32
+ # and can be overriden by an ``.override.yml`` file.
33
+ # A ``Vagrantfile`` is generated upon configurations.
34
+ #
35
+ # Sample use in Rake task:
36
+ #
37
+ # ```ruby
38
+ # vagrant = project.tools.fetch(:vagrant)
39
+ #
40
+ # if vagrant.boxes? and vagrant.executable?
41
+ # file vagrant.vagrantfile => vagrant.sources do
42
+ # vagrant.install
43
+ # end
44
+ # end
45
+ # ```
46
+ #
47
+ # This class is almost a facade based on:
48
+ #
49
+ # * Composer
50
+ # * Writer
51
+ # * Shell
52
+ # * Remote
53
+ #
54
+ # @see http://yaml.org/YAML_for_ruby.html
55
+ # @see https://friendsofvagrant.github.io/v1/docs/boxes.html
56
+ class Kamaze::Project::Tools::Vagrant
57
+ # Template file (used for code generation)
58
+ #
59
+ # @return [String]
60
+ attr_accessor :template
61
+
62
+ # Absolute path to the vagrant executable
63
+ #
64
+ # @return [String|nil]
65
+ attr_accessor :executable
66
+
67
+ # Get path to actual ``Vagrantfile``
68
+ #
69
+ # @return [Pathname]
70
+ attr_accessor :vagrantfile
71
+
72
+ # Path to files describing boxes (directory)
73
+ #
74
+ # defaults to ``./vagrant``
75
+ #
76
+ # @return [String]
77
+ attr_accessor :path
78
+
79
+ def mutable_attributes
80
+ [:path, :executable, :template, :vagrantfile]
81
+ end
82
+
83
+ # Get working dir
84
+ #
85
+ # @return [Pathname]
86
+ def pwd
87
+ Pathname.new(Dir.pwd).realpath
88
+ end
89
+
90
+ # Denote ``vagrant`` executable is present
91
+ #
92
+ # @return [Boolean]
93
+ def executable?
94
+ shell.executable?
95
+ end
96
+
97
+ # Run the vagrant command with given ``args``.
98
+ #
99
+ # @see https://github.com/ruby/rake/blob/master/lib/rake/file_utils.rb
100
+ def execute(*args, &block)
101
+ shell.execute(*args, &block)
102
+ end
103
+
104
+ # Run a command remotely on box identified by ``box_id``
105
+ #
106
+ # Sample of use:
107
+ #
108
+ # ```ruby
109
+ # vagrant.ssh('freebsd', 'rake clobber')
110
+ # ```
111
+ def ssh(*args, &block)
112
+ remote.execute(*args, &block)
113
+ end
114
+
115
+ # Install a new Vagrantfile
116
+ #
117
+ # Vagrant file is installed with additionnal YAML file,
118
+ # defining ``boxes``
119
+ #
120
+ # @return [self]
121
+ def install
122
+ writer.write(boxes)
123
+
124
+ self
125
+ end
126
+
127
+ def method_missing(method, *args, &block)
128
+ if respond_to_missing?(method)
129
+ composer.public_send(method, *args, &block)
130
+ else
131
+ super
132
+ end
133
+ end
134
+
135
+ def respond_to_missing?(method, include_private = false)
136
+ return true if composer.respond_to?(method, include_private)
137
+
138
+ super
139
+ end
140
+
141
+ protected
142
+
143
+ # Get composer, responsible to read and combine files describing boxes
144
+ #
145
+ # @return [Composer]
146
+ attr_reader :composer
147
+
148
+ # Get a shell, to execute ``vagrant`` commands
149
+ #
150
+ # @return [Shell]
151
+ attr_reader :shell
152
+
153
+ # Get writer, reponsible of ``Vagrantfile`` generation
154
+ #
155
+ # @return [Writer]
156
+ attr_reader :writer
157
+
158
+ def setup
159
+ @template ||= Pathname.new(__dir__).join('..', 'resources').to_s
160
+ @vagrantfile ||= ::Pathname.new(@vagrantfile || pwd.join('Vagrantfile'))
161
+ @executable ||= :vagrant
162
+ @path ||= pwd.join('vagrant').to_s
163
+
164
+ setup_compose
165
+ end
166
+
167
+ # Initialize most of the tools used internally
168
+ def setup_compose
169
+ @composer = Composer.new(@path)
170
+ @shell = Shell.new(executable: executable)
171
+ @writer = Writer.new(@template, vagrantfile)
172
+
173
+ self
174
+ end
175
+
176
+ # Get remote shell provider
177
+ #
178
+ # @return [Remote]
179
+ def remote
180
+ Remote.new(boxes, executable: executable)
181
+ end
182
+ end