nugrant 0.0.14 → 1.0.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
data/.buildpath CHANGED
File without changes
data/.gitignore CHANGED
@@ -17,3 +17,5 @@ spec/reports
17
17
  test/tmp
18
18
  test/version_tmp
19
19
  tmp
20
+
21
+ test/resources/Vagrantfile
data/.project CHANGED
File without changes
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ # 1.0.0 (unreleased)
2
+
3
+ * For now on, this gem will follow semantic versioning.
4
+
1
5
  # 0.0.14
2
6
 
3
7
  * Renamed `ParameterBag` to `Bag`
data/Gemfile CHANGED
@@ -1,4 +1,27 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in nugrant.gemspec
4
3
  gemspec
4
+
5
+ group :development do
6
+ vagrant_dependencies = {
7
+ 'v1' => {
8
+ 'home' => "C:/Users/Matt/.vagrant.d.v1",
9
+ 'gem' => Proc.new do
10
+ gem "vagrant", "~> 1.0.5"
11
+ end,
12
+ },
13
+ 'v2' => {
14
+ 'home' => "C:/Users/Matt/.vagrant.d",
15
+ 'gem' => Proc.new do
16
+ gem "vagrant", :git => "git://github.com/mitchellh/vagrant.git"
17
+ end,
18
+ },
19
+ }
20
+
21
+ vagrant_plugin_version = ENV['VAGRANT_PLUGIN_VERSION'] || "v2"
22
+ vagrant_dependency = vagrant_dependencies[vagrant_plugin_version]
23
+
24
+ ENV['VAGRANT_HOME'] = vagrant_dependency['home']
25
+
26
+ vagrant_dependency['gem'].call()
27
+ end
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012 Matthieu Vachon
1
+ Copyright (c) 2012-2013 Matthieu Vachon
2
2
 
3
3
  MIT License
4
4
 
@@ -19,4 +19,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
19
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
20
  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
21
  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -1,48 +1,95 @@
1
1
  # Nugrant [![Build Status](https://travis-ci.org/maoueh/nugrant.png)](https://travis-ci.org/maoueh/nugrant)
2
2
 
3
- Vagrant plugin that brings user specific configuration
4
- options. It will enable a `.vagrantuser` at different
5
- location that will get imported into the main vagrant
6
- config.
3
+ Nugrant is a library to easily handle parameters that need to be
4
+ injected into an application via different sources (system, user,
5
+ project, defaults).
7
6
 
8
- For example, let say the git repository you want to
9
- expose is not located under the root folder of
10
- your `Vagrantfile`. That means you will need to specify
11
- an absolute host path to share the folder on the guest vm.
7
+ But Nugrant is foremost a Vagrant plugin that will enhance
8
+ Vagrantfile to allow user specific configuration values. The plugin
9
+ will let users define a `.vagrantuser` file at different locations. This
10
+ file will contain parameters that will be injected into the Vagrantfile.
12
11
 
13
- Your `Vagrantfile` would look like this:
12
+ ## Installation
14
13
 
15
- Vagrant::Config.run do |config|
16
- config.vm.share_folder "git", "/git", "/home/user/work/git"
17
- end
14
+ ### Library
18
15
 
19
- However, what happens when multiple developers
20
- need to share the same `Vagrantfile`? This is the main
21
- use case this plugin address.
16
+ If you would like to use Nugrant as a library, simply reference
17
+ it as a dependency of your application. Probably by adding it to
18
+ your `Gemfile` or your `.gemspec` file.
22
19
 
23
- ## Installation
20
+ nugrant ~> 0.0.15
24
21
 
25
- First, you need to have Vagrant installed for this gem
26
- to work correctly.
22
+ ### Vagrant
27
23
 
28
- There is two different way to install the gem. You can
29
- install it via Vagrant or via the system gem containers.
24
+ If you would like to use Nugrant as a Vagrant plugin, the
25
+ detailed installation steps are provided below. Without a
26
+ doubt, you need Vagrant installed for those steps to work ;)
30
27
 
31
- When you install from Vagrant, the main benefit is that
32
- it's decoupled from your other system gems. There is less
28
+ There are two different ways to install the gem. You can
29
+ install it via Vagrant or via the system gem container.
30
+
31
+ When you install via Vagrant, the main benefit is that
32
+ it's decoupled from other system gems. There is less
33
33
  chance for this gem's dependencies, even if they are minimal,
34
34
  to clash with gems already installed on your system. This is the
35
35
  recommended installation method. To install, simply run:
36
36
 
37
37
  > vagrant gem install nugrant
38
38
 
39
- If you prefer to install the gem in a system wide matters,
39
+ If you prefer to install the gem in a system wide manner,
40
40
  please use this command instead:
41
41
 
42
42
  > gem install nugrant
43
43
 
44
44
  ## Usage
45
45
 
46
+ Whether used as a library or a Vagrant plugin, Nugrant has some
47
+ common concepts that apply to both usages. The most important
48
+ one is the parameters hierarchy.
49
+
50
+ Nugrant can read parameters from various locations and will merge
51
+ them all together in a single set. Merging is done in a fairly
52
+ standard fashion.
53
+
54
+ Here the precedence rules that apply when merging parameters
55
+ from various location:
56
+
57
+ - Defaults
58
+ - System
59
+ - User
60
+ - Project
61
+
62
+ In text, this means that project parameters overrides user
63
+ parameters, user parameters overrides system parameters and
64
+ finally system parameters overrides defaults parameters.
65
+
66
+ ### Library
67
+
68
+ Using Nugrant as a library to handle parameters from various
69
+ location is really easy. Two main classes need to be handled.
70
+
71
+ First, you need to create a `Nugrant::Config` object. This
72
+ configuration holds the values that needs to be customized
73
+ by your own application. This includes the different parameters paths
74
+ and the format of the parameters file.
75
+
76
+ ### Vagrant
77
+
78
+ For example, let say the git repository you want to
79
+ expose is not located under the root folder of
80
+ your `Vagrantfile`. That means you will need to specify
81
+ an absolute host path to share the folder on the guest vm.
82
+
83
+ Your `Vagrantfile` would look like this:
84
+
85
+ Vagrant::Config.run do |config|
86
+ config.vm.share_folder "git", "/git", "/home/user/work/git"
87
+ end
88
+
89
+ However, what happens when multiple developers
90
+ need to share the same `Vagrantfile`? This is the main
91
+ use case this plugin address.
92
+
46
93
  When Vagrant starts, via any of the `vagrant` commands,
47
94
  it loads all vagrant plugins it founds under the `GEM_PATH`
48
95
  variable. If you installed the plugin with one of the two
data/Rakefile CHANGED
@@ -1,6 +1,16 @@
1
- require "bundler/gem_tasks"
1
+ require "bundler/setup"
2
2
  require "rake/testtask"
3
3
 
4
+ # Immediately sync all stdout so that tools like buildbot can
5
+ # immediately load in the output.
6
+ $stdout.sync = true
7
+ $stderr.sync = true
8
+
9
+ # Change to the directory of this file.
10
+ Dir.chdir(File.expand_path("../", __FILE__))
11
+
12
+ Bundler::GemHelper.install_tasks
13
+
4
14
  Rake::TestTask.new do |task|
5
15
  task.test_files = FileList['test/**/test*.rb']
6
16
  end
data/lib/nugrant.rb CHANGED
@@ -1,4 +1,4 @@
1
- require 'nugrant'
1
+ require 'pathname'
2
2
  require 'nugrant/config'
3
3
  require 'nugrant/parameters'
4
4
 
@@ -7,6 +7,17 @@ unless defined?(KeyError)
7
7
  end
8
8
  end
9
9
 
10
+ if defined?(Vagrant)
11
+ case
12
+ when defined?(Vagrant::Plugin::V2)
13
+ require 'nugrant/vagrant/v2/plugin'
14
+ when Vagrant::VERSION =~ /1\.0\..*/
15
+ # Nothing to do, v1 plugins are picked by the vagrant_init.rb file
16
+ else
17
+ abort("You are trying to use Nugrant with an unsupported Vagrant version [#{Vagrant::VERSION}]")
18
+ end
19
+ end
20
+
10
21
  module Nugrant
11
22
  def self.create_parameters(options)
12
23
  config = Nugrant::Config.new(options)
@@ -9,20 +9,19 @@ module Nugrant
9
9
  attr :params_filetype, true
10
10
 
11
11
  def self.user_base_path()
12
- return File.expand_path("~")
12
+ File.expand_path("~")
13
13
  end
14
14
 
15
15
  def self.system_base_path()
16
- # TODO: Fixme, find the right location to put system wide settings on windows...
17
16
  if Config.on_windows?
18
- return "C:/etc"
17
+ return File.expand_path(ENV['PROGRAMDATA'] || ENV['ALLUSERSPROFILE'])
19
18
  end
20
19
 
21
- return "/etc"
20
+ "/etc"
22
21
  end
23
22
 
24
23
  def self.on_windows?()
25
- return (RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/) != nil
24
+ (RbConfig::CONFIG['host_os'].downcase =~ /mswin|mingw|cygwin/) != nil
26
25
  end
27
26
 
28
27
  def initialize(options = {})
File without changes
@@ -0,0 +1,137 @@
1
+ require 'nugrant'
2
+ require 'nugrant/helper/yaml'
3
+
4
+ module Nugrant
5
+ module Vagrant
6
+ module V1
7
+ module Command
8
+ class Parameters < ::Vagrant::Command::Base
9
+ def initialize(arguments, environment)
10
+ super(arguments, environment)
11
+
12
+ @show_help = false
13
+ @show_defaults = false
14
+ @show_system = false
15
+ @show_user = false
16
+ @show_project = false
17
+ end
18
+
19
+ def create_parser()
20
+ return OptionParser.new do |parser|
21
+ parser.banner = "Usage: vagrant user parameters [<options>]"
22
+ parser.separator ""
23
+
24
+ parser.separator "Available options:"
25
+ parser.separator ""
26
+
27
+ parser.on("-h", "--help", "Print this help") do
28
+ @show_help = true
29
+ end
30
+
31
+ parser.on("-d", "--defaults", "Show only defaults parameters") do
32
+ @show_defaults = true
33
+ end
34
+
35
+ parser.on("-s", "--system", "Show only system parameters") do
36
+ @show_system = true
37
+ end
38
+
39
+ parser.on("-u", "--user", "Show only user parameters") do
40
+ @show_user = true
41
+ end
42
+
43
+ parser.on("-p", "--project", "Show only project parameters") do
44
+ @show_project = true
45
+ end
46
+
47
+ parser.separator ""
48
+ parser.separator "When no options is provided, the command prints the names and values \n" +
49
+ "of all parameters that would be available for usage in the Vagrantfile.\n" +
50
+ "The hierarchy of the parameters is respected, so the final values are\n" +
51
+ "displayed."
52
+ end
53
+ end
54
+
55
+ def execute
56
+ parser = create_parser()
57
+ arguments = parse_options(parser)
58
+
59
+ return help(parser) if @show_help
60
+
61
+ @logger.debug("'Parameters' each target VM...")
62
+ with_target_vms(arguments) do |vm|
63
+ parameters = vm.config.keys[:user].parameters
64
+
65
+ @env.ui.info("# Vm '#{vm.name}'", :prefix => false)
66
+
67
+ defaults(parameters) if @show_defaults
68
+ system(parameters) if @show_system
69
+ user(parameters) if @show_user
70
+ project(parameters) if @show_project
71
+
72
+ all(parameters) if !@show_defaults && !@show_system && !@show_user && !@show_project
73
+ end
74
+
75
+ return 0
76
+ end
77
+
78
+ def help(parser)
79
+ @env.ui.info(parser.help, :prefix => false)
80
+ end
81
+
82
+ def defaults(parameters)
83
+ print_results("Defaults", parameters.defaults)
84
+ end
85
+
86
+ def system(parameters)
87
+ print_results("System", parameters.system)
88
+ end
89
+
90
+ def user(parameters)
91
+ print_results("User", parameters.user)
92
+ end
93
+
94
+ def project(parameters)
95
+ print_results("Project", parameters.project)
96
+ end
97
+
98
+ def all(parameters)
99
+ print_results("All", parameters.all)
100
+ end
101
+
102
+ def print_results(kind, parameters)
103
+ if !parameters || parameters.empty?()
104
+ print_header(kind)
105
+ @env.ui.info(" Empty", :prefix => false)
106
+ @env.ui.info("", :prefix => false)
107
+ return
108
+ end
109
+
110
+ print_parameters(kind, {
111
+ 'config' => {
112
+ 'user' => parameters
113
+ }
114
+ })
115
+ end
116
+
117
+ def print_parameters(kind, data)
118
+ string = Nugrant::Helper::Yaml.format(data.to_yaml, :indent => 1)
119
+
120
+ print_header(kind)
121
+ @env.ui.info(string, :prefix => false)
122
+ @env.ui.info("", :prefix => false)
123
+ end
124
+
125
+ def print_header(kind, length = 50)
126
+ @env.ui.info(" #{kind.capitalize} Parameters", :prefix => false)
127
+ @env.ui.info(" " + "-" * length, :prefix => false)
128
+ end
129
+
130
+ def compute_header_length(string)
131
+
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,80 @@
1
+ require 'nugrant'
2
+
3
+ module Nugrant
4
+ module Vagrant
5
+ module V1
6
+ module Command
7
+ class Root < ::Vagrant::Command::Base
8
+ def initialize(arguments, environment)
9
+ super(arguments, environment)
10
+
11
+ @arguments, @subcommand, @subarguments = split_main_and_subcommand(arguments)
12
+
13
+ # Change super class available arguments to main ones only
14
+ @argv = @arguments
15
+
16
+ @subcommands = ::Vagrant::Registry.new()
17
+ @subcommands.register(:parameters) do
18
+ require File.expand_path("../parameters", __FILE__)
19
+ Parameters
20
+ end
21
+
22
+ @show_help = false
23
+ @show_version = false
24
+ end
25
+
26
+ def create_parser()
27
+ return OptionParser.new do |parser|
28
+ parser.banner = "Usage: vagrant user [-h] [-v] <command> [<args>]"
29
+
30
+ parser.separator ""
31
+ parser.on("-h", "--help", "Print this help") do
32
+ @show_help = true
33
+ end
34
+
35
+ parser.on("-v", "--version", "Print plugin version and exit.") do
36
+ @show_version = true
37
+ end
38
+
39
+ parser.separator ""
40
+ parser.separator "Available subcommands:"
41
+
42
+ keys = []
43
+ @subcommands.each { |key, value| keys << key.to_s }
44
+
45
+ keys.sort.each do |key|
46
+ parser.separator " #{key}"
47
+ end
48
+
49
+ parser.separator ""
50
+ parser.separator "For help on any individual command run `vagrant user COMMAND -h`"
51
+ end
52
+ end
53
+
54
+ def execute
55
+ parser = create_parser()
56
+ arguments = parse_options(parser)
57
+
58
+ return version() if @show_version
59
+ return help(parser) if @show_help
60
+
61
+ command_class = @subcommands.get(@subcommand.to_sym) if @subcommand
62
+ return help(parser) if !command_class || !@subcommand
63
+
64
+ @logger.debug("Invoking nugrant command class: #{command_class} #{@subarguments.inspect}")
65
+
66
+ command_class.new(@subarguments, @env).execute
67
+ end
68
+
69
+ def help(parser)
70
+ @env.ui.info(parser.help, :prefix => false)
71
+ end
72
+
73
+ def version()
74
+ @env.ui.info("Nugrant version #{Nugrant::VERSION}", :prefix => false)
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end