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.
- checksums.yaml +7 -0
- data/.yardopts +18 -0
- data/bin/plop +5 -0
- data/lib/kamaze-project.rb +39 -0
- data/lib/kamaze/project.rb +155 -0
- data/lib/kamaze/project/boot/core_ext.rb +16 -0
- data/lib/kamaze/project/boot/listen.rb +38 -0
- data/lib/kamaze/project/concern.rb +13 -0
- data/lib/kamaze/project/concern/cli.rb +53 -0
- data/lib/kamaze/project/concern/cli/with_exit_on_failure.rb +36 -0
- data/lib/kamaze/project/concern/env.rb +63 -0
- data/lib/kamaze/project/concern/helper.rb +20 -0
- data/lib/kamaze/project/concern/mode.rb +19 -0
- data/lib/kamaze/project/concern/observable.rb +132 -0
- data/lib/kamaze/project/concern/sh.rb +91 -0
- data/lib/kamaze/project/concern/tasks.rb +55 -0
- data/lib/kamaze/project/concern/tools.rb +27 -0
- data/lib/kamaze/project/config.rb +58 -0
- data/lib/kamaze/project/core_ext/object.rb +27 -0
- data/lib/kamaze/project/core_ext/pp.rb +28 -0
- data/lib/kamaze/project/debug.rb +136 -0
- data/lib/kamaze/project/dsl.rb +16 -0
- data/lib/kamaze/project/dsl/definition.rb +43 -0
- data/lib/kamaze/project/dsl/setup.rb +11 -0
- data/lib/kamaze/project/helper.rb +63 -0
- data/lib/kamaze/project/helper/inflector.rb +44 -0
- data/lib/kamaze/project/helper/project.rb +34 -0
- data/lib/kamaze/project/helper/project/config.rb +25 -0
- data/lib/kamaze/project/observable.rb +20 -0
- data/lib/kamaze/project/observer.rb +37 -0
- data/lib/kamaze/project/resources/Vagrantfile +128 -0
- data/lib/kamaze/project/resources/config/tools.yml +15 -0
- data/lib/kamaze/project/struct.rb +34 -0
- data/lib/kamaze/project/tasks/cs.rb +23 -0
- data/lib/kamaze/project/tasks/cs/control.rb +17 -0
- data/lib/kamaze/project/tasks/cs/correct.rb +17 -0
- data/lib/kamaze/project/tasks/cs/pre_commit.rb +66 -0
- data/lib/kamaze/project/tasks/doc.rb +21 -0
- data/lib/kamaze/project/tasks/doc/watch.rb +41 -0
- data/lib/kamaze/project/tasks/gem.rb +14 -0
- data/lib/kamaze/project/tasks/gem/build.rb +34 -0
- data/lib/kamaze/project/tasks/gem/compile.rb +30 -0
- data/lib/kamaze/project/tasks/gem/gemspec.rb +20 -0
- data/lib/kamaze/project/tasks/gem/install.rb +32 -0
- data/lib/kamaze/project/tasks/gem/push.rb +27 -0
- data/lib/kamaze/project/tasks/misc/gitignore.rb +29 -0
- data/lib/kamaze/project/tasks/shell.rb +17 -0
- data/lib/kamaze/project/tasks/sources.rb +6 -0
- data/lib/kamaze/project/tasks/sources/license.rb +35 -0
- data/lib/kamaze/project/tasks/test.rb +16 -0
- data/lib/kamaze/project/tasks/vagrant.rb +71 -0
- data/lib/kamaze/project/tasks/version/edit.rb +16 -0
- data/lib/kamaze/project/tools.rb +18 -0
- data/lib/kamaze/project/tools/base_tool.rb +55 -0
- data/lib/kamaze/project/tools/console.rb +48 -0
- data/lib/kamaze/project/tools/console/output.rb +120 -0
- data/lib/kamaze/project/tools/console/output/buffer.rb +48 -0
- data/lib/kamaze/project/tools/gemspec.rb +33 -0
- data/lib/kamaze/project/tools/gemspec/builder.rb +99 -0
- data/lib/kamaze/project/tools/gemspec/concern.rb +13 -0
- data/lib/kamaze/project/tools/gemspec/concern/reading.rb +49 -0
- data/lib/kamaze/project/tools/gemspec/packager.rb +67 -0
- data/lib/kamaze/project/tools/gemspec/packer.rb +89 -0
- data/lib/kamaze/project/tools/gemspec/packer/command.rb +143 -0
- data/lib/kamaze/project/tools/gemspec/reader.rb +70 -0
- data/lib/kamaze/project/tools/gemspec/reader/decorator.rb +78 -0
- data/lib/kamaze/project/tools/gemspec/writer.rb +127 -0
- data/lib/kamaze/project/tools/gemspec/writer/dep_gen.rb +61 -0
- data/lib/kamaze/project/tools/gemspec/writer/dependency.rb +104 -0
- data/lib/kamaze/project/tools/git.rb +95 -0
- data/lib/kamaze/project/tools/git/hooks.rb +66 -0
- data/lib/kamaze/project/tools/git/hooks/base_hook.rb +33 -0
- data/lib/kamaze/project/tools/git/hooks/pre_commit.rb +81 -0
- data/lib/kamaze/project/tools/git/status.rb +101 -0
- data/lib/kamaze/project/tools/git/status/decorator.rb +39 -0
- data/lib/kamaze/project/tools/git/status/file.rb +180 -0
- data/lib/kamaze/project/tools/git/status/files_array.rb +39 -0
- data/lib/kamaze/project/tools/git/status/index.rb +77 -0
- data/lib/kamaze/project/tools/git/status/worktree.rb +19 -0
- data/lib/kamaze/project/tools/git/util.rb +35 -0
- data/lib/kamaze/project/tools/licenser.rb +197 -0
- data/lib/kamaze/project/tools/packager.rb +86 -0
- data/lib/kamaze/project/tools/packager/filesystem.rb +178 -0
- data/lib/kamaze/project/tools/packager/filesystem/operator.rb +83 -0
- data/lib/kamaze/project/tools/packager/filesystem/operator/utils.rb +77 -0
- data/lib/kamaze/project/tools/process_locker.rb +106 -0
- data/lib/kamaze/project/tools/rspec.rb +115 -0
- data/lib/kamaze/project/tools/rubocop.rb +128 -0
- data/lib/kamaze/project/tools/rubocop/arguments.rb +19 -0
- data/lib/kamaze/project/tools/rubocop/config.rb +43 -0
- data/lib/kamaze/project/tools/shell.rb +85 -0
- data/lib/kamaze/project/tools/vagrant.rb +182 -0
- data/lib/kamaze/project/tools/vagrant/composer.rb +88 -0
- data/lib/kamaze/project/tools/vagrant/composer/file.rb +79 -0
- data/lib/kamaze/project/tools/vagrant/remote.rb +79 -0
- data/lib/kamaze/project/tools/vagrant/shell.rb +102 -0
- data/lib/kamaze/project/tools/vagrant/writer.rb +81 -0
- data/lib/kamaze/project/tools/yardoc.rb +75 -0
- data/lib/kamaze/project/tools/yardoc/file.rb +55 -0
- data/lib/kamaze/project/tools/yardoc/watchable.rb +70 -0
- data/lib/kamaze/project/tools/yardoc/watcher.rb +106 -0
- data/lib/kamaze/project/tools_provider.rb +161 -0
- data/lib/kamaze/project/tools_provider/resolver.rb +42 -0
- data/lib/kamaze/project/version.rb +104 -0
- data/lib/kamaze/project/version.yml +17 -0
- 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
|