nugrant 2.0.0.rc1 → 2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c0de10dfbe571d6be4e0c7a7c3fa3c7d4893fc88
4
- data.tar.gz: 9fbec16a209341335a171f6fe57128b71bfa6e60
3
+ metadata.gz: 89aef5f2cae21cfe30f4fd15204955cd83ee5fd7
4
+ data.tar.gz: 85aff126d8c8cb3719d5f4a75ace5a95ce4460df
5
5
  SHA512:
6
- metadata.gz: a7d7b102855c2af842e76eaa609b96b4a6b5316a4f8a05a956e5515b514024e356ff5b4afd23dc9a2fc25126998d90146626e018e29851ed1952721351259b41
7
- data.tar.gz: 5c16317e800d0c725ae2f2544935de78da3cf994b1214032f4a0ddbf1ffc3b86ec84437a7e188f4864a230dd172b35809ac9d1afa2b0c666b52bc767704cedce
6
+ metadata.gz: b9fb53dbf9edcb2cf22060430ea36fe6a54c07002fe4601e374f98e5d8a001243f1ff0550b07d8a3a576729d69c3b9da5478f8f7f6fd08485cd07b05f0641597
7
+ data.tar.gz: 0ee9ef8856832546e5048f614a42ca6ad166387b905d3cfa119bce4a8d2ffd185c9814ea26f15ef714bad9c36fa50e4b807f6c3d23493fbf58bf992b5888919d
@@ -1,5 +1,9 @@
1
1
  # 2.0.0 (In progress)
2
2
 
3
+ * Fixed retrieval of current directory for `.vagrantuser`. The directory
4
+ is now that same as the one of the `Vagrantfile`. Rules have been
5
+ copied for Vagrant's one, hence, the behavior should be the same.
6
+
3
7
  * Fixed bad implementation of config class `::Vagrant.plugin("2", :config)`
4
8
  where `merge` was not implemented and was causing errors. Now, all objects
5
9
  (i.e. `Config`, `Bag` and `Parameters` implements `merge` and `merge!`
data/README.md CHANGED
@@ -30,8 +30,8 @@ Let's start with an example. You need to distribute among your enterprise a
30
30
  The `aws_access_key` and `aws_secret_key` should be configurable depending on the user
31
31
  running `vagrant up`.
32
32
 
33
- To achieve this, simply create a file named `.vagrantuser` in the project directory with
34
- the following content:
33
+ To achieve this, simply create a file named `.vagrantuser` that resides in the directory
34
+ as your `Vagrantfile`:
35
35
 
36
36
  aws:
37
37
  access_key: "123456"
@@ -60,16 +60,32 @@ must be filled in, something like:
60
60
  access_key: "<ACCESS_KEY_HERE>"
61
61
  secret_key: "<SECRET_KEY_HERE>"
62
62
 
63
- Moreover, there is a hierarchy of `.vagrantuser` files that you can leverage.
64
- The order is project `.vagrantuser` overrides `$HOME/.vagrantuser` overrides
65
- `$SYSTEM/.vagrantuser` where `$HOME` is the user's home directory and `$SYSTEM`
66
- is the platform dependent folder where system global parameters are set.
63
+ To find where your project `.vagrantuser` is located, Nugrant uses the directory
64
+ where the `Vagrantfile` is located. It achieves this using the same set of
65
+ rules as Vagrant meaning you can be in a nested directory and parameters
66
+ will still be fetched correctly.
67
67
 
68
- Use the command `vagrant user parameters` to see the final merged hierarchy
69
- seen by Nugrant. This command also prints [restricted keys](#restricted-keys) defined
70
- in your hierarchy.
68
+ Moreover, like other similar system, there is a hierarchy of `.vagrantuser` files
69
+ that you can leverage:
71
70
 
72
- You can access parameters in your `Vagrantfile` either by method access
71
+ | Name | Location | Priority | Overrides |
72
+ | ---------|-----------------------------------------|:---------:|--------------------------|
73
+ | Defaults | [config.user.defaults](#default-values) | 4 | - |
74
+ | System | $SYSTEM/.vagrantuser | 3 | Defaults |
75
+ | User | ~/.vagrantuser | 2 | Defaults & System |
76
+ | Project | .vagrantuser | 1 | Defaults & System & User |
77
+
78
+ The project level directory is always the same as the directory where your
79
+ `Vagrantfile` resides and same rules as Vagrant are used to find it.
80
+ The `~` is the user's home directory and `$SYSTEM` is the platform dependent
81
+ folder where system global can be put. Check [Hierarchy](#hierarchy) section
82
+ for where `$SYSTEM` maps exactly.
83
+
84
+ You can use the command `vagrant user parameters` to see the final merged
85
+ hierarchy seen by Nugrant. This command also prints [restricted keys](#restricted-keys)
86
+ defined in your hierarchy.
87
+
88
+ Accessing parameters in your `Vagrantfile` can be done either by method access
73
89
  (i.e. `config.user.<key>`) or by array access (i.e. `config.user[<key>]`).
74
90
  This support is working for any deepness, only `config.user` is different
75
91
  because provided directly by `Vagrant` and not by this plugin.
@@ -230,6 +246,8 @@ That would be equivalent to:
230
246
  config.vm.synced_folder "/home/user/personal/git", "/personal"
231
247
  end
232
248
 
249
+ #### Hierarchy
250
+
233
251
  As you can see, the parameters defined in the second `.vagrantuser` file
234
252
  (the current one) overrides settings defined in the `.vagrantuser` found
235
253
  in the home directory (the user one).
@@ -239,7 +257,7 @@ Here the list of locations where Nugrant looks for parameters:
239
257
  1. Defaults (via `config.user.defaults` in `Vagrantfile`)
240
258
  2. System (`/etc/.vagrantuser` on Unix, `%PROGRAMDATA%/.vagrantuser` or `%ALLUSERSPROFILE%/.vagrantuser` on Windows)
241
259
  3. Home (`~/.vagrantuser`)
242
- 4. current (`.vagrantuser` within the same folder as the `Vagrantfile`)
260
+ 4. Project (`.vagrantuser` within the same folder as the `Vagrantfile`)
243
261
 
244
262
  #### Paths
245
263
 
@@ -44,6 +44,30 @@ module Nugrant
44
44
  "/etc"
45
45
  end
46
46
 
47
+ ##
48
+ # Method to fix-up a received path. The fix-up do the follows
49
+ # the following rules:
50
+ #
51
+ # 1. If the path is callable, call it to get the value.
52
+ # 2. If value is nil, return default value.
53
+ # 3. If value is a directory, return path + params_filename to it.
54
+ # 4. Otherwise, return value
55
+ #
56
+ # @param path The path parameter received.
57
+ # @param default The default path to use, can be a directory.
58
+ # @param params_filename The params filename to append if path is a directory
59
+ #
60
+ # @return The fix-up path following rules defined above.
61
+ #
62
+ def self.fixup_path(path, default, params_filename)
63
+ path = path.call if path.respond_to?(:call)
64
+
65
+ path = File.expand_path(path || default)
66
+ path = "#{path}/#{params_filename}" if ::File.directory?(path)
67
+
68
+ path
69
+ end
70
+
47
71
  def self.supported_array_merge_strategy(strategy)
48
72
  SUPPORTED_ARRAY_MERGE_STRATEGIES.include?(strategy)
49
73
  end
@@ -108,9 +132,9 @@ module Nugrant
108
132
  @params_filename = options[:params_filename] || DEFAULT_PARAMS_FILENAME
109
133
  @params_format = options[:params_format] || DEFAULT_PARAMS_FORMAT
110
134
 
111
- @current_path = File.expand_path(options[:current_path] || "./#{@params_filename}")
112
- @user_path = File.expand_path(options[:user_path] || "#{Config.default_user_path()}/#{@params_filename}")
113
- @system_path = File.expand_path(options[:system_path] || "#{Config.default_system_path()}/#{@params_filename}")
135
+ @current_path = Config.fixup_path(options[:current_path], ".", @params_filename)
136
+ @user_path = Config.fixup_path(options[:user_path], Config.default_user_path(), @params_filename)
137
+ @system_path = Config.fixup_path(options[:system_path], Config.default_system_path(), @params_filename)
114
138
 
115
139
  @array_merge_strategy = options[:array_merge_strategy] || :replace
116
140
 
@@ -1,6 +1,6 @@
1
1
  require 'nugrant'
2
2
  require 'nugrant/helper/yaml'
3
- require 'nugrant/vagrant/v2/command/helper'
3
+ require 'nugrant/vagrant/v2/helper'
4
4
 
5
5
  module Nugrant
6
6
  module Vagrant
@@ -101,7 +101,7 @@ module Nugrant
101
101
  end
102
102
 
103
103
  def project(parameters)
104
- print_bag("Project", parameters.__project)
104
+ print_bag("Project", parameters.__current)
105
105
  end
106
106
 
107
107
  def all(parameters)
@@ -1,5 +1,5 @@
1
1
  require 'nugrant'
2
- require 'nugrant/vagrant/v2/command/helper'
2
+ require 'nugrant/vagrant/v2/helper'
3
3
 
4
4
  module Nugrant
5
5
  module Vagrant
@@ -30,8 +30,8 @@ module Nugrant
30
30
 
31
31
  parser.separator ""
32
32
  parser.separator "Prints keys that cannot be accessed using the method access syntax\n" +
33
- "(`config.user.local`). Use array access syntax (`config.user['local']`)\n" +
34
- "if you really want to use of the restricted keys\n"
33
+ "(`config.user.<key>`). Use array access syntax (`config.user['<key>']`)\n" +
34
+ "if you really want to use of the restricted keys.\n"
35
35
  end
36
36
  end
37
37
 
@@ -41,9 +41,9 @@ module Nugrant
41
41
 
42
42
  return help(parser) if @show_help
43
43
 
44
- @env.ui.info("The following keys are restricted, i.e. that method access (`config.user.first`)", :prefix => false)
44
+ @env.ui.info("The following keys are restricted, i.e. that method access (`config.user.<key>`)", :prefix => false)
45
45
  @env.ui.info("will not work. If you really want to use a restricted key, use array access ", :prefix => false)
46
- @env.ui.info("instead (`config.user['local']`).", :prefix => false)
46
+ @env.ui.info("instead (`config.user['<key>']`).", :prefix => false)
47
47
  @env.ui.info("", :prefix => false)
48
48
 
49
49
  @env.ui.info("You can run `vagrant user parameters` to check if your config currently defines", :prefix => false)
@@ -12,6 +12,7 @@ module Nugrant
12
12
  def initialize(defaults = {}, config = {})
13
13
  setup!(defaults,
14
14
  :params_filename => ".vagrantuser",
15
+ :current_path => Helper.find_project_path(),
15
16
  :key_error => Proc.new do |key|
16
17
  raise Errors::ParameterNotFoundError, :key => key.to_s
17
18
  end,
@@ -20,8 +21,6 @@ module Nugrant
20
21
  end
21
22
  )
22
23
  end
23
-
24
-
25
24
  end
26
25
  end
27
26
  end
@@ -0,0 +1,95 @@
1
+ require 'pathname'
2
+
3
+ require 'nugrant'
4
+ require 'nugrant/bag'
5
+ require 'nugrant/vagrant/v2/config/user'
6
+
7
+ module Nugrant
8
+ module Vagrant
9
+ module V2
10
+ class Helper
11
+
12
+ ##
13
+ # The project path is the path where the top-most (loaded last)
14
+ # Vagrantfile resides. It can be considered the project root for
15
+ # this environment.
16
+ #
17
+ # Copied from `lib\vagrant\environment.rb#532` (tag: v1.6.2)
18
+ #
19
+ # @return [String] The project path to use.
20
+ #
21
+ def self.find_project_path()
22
+ vagrantfile_name = ENV["VAGRANT_VAGRANTFILE"]
23
+
24
+ root_finder = lambda do |path|
25
+ vagrantfile = find_vagrantfile(path, vagrantfile_name)
26
+
27
+ return path if vagrantfile
28
+ return nil if path.root? || !File.exist?(path)
29
+
30
+ root_finder.call(path.parent)
31
+ end
32
+
33
+ root_finder.call(get_vagrant_working_directory())
34
+ end
35
+
36
+ ##
37
+ # Finds the Vagrantfile in the given directory.
38
+ #
39
+ # Copied from `lib\vagrant\environment.rb#732` (tag: v1.6.2)
40
+ #
41
+ # @param [Pathname] path Path to search in.
42
+ # @return [Pathname]
43
+ #
44
+ def self.find_vagrantfile(search_path, filenames = nil)
45
+ filenames ||= ["Vagrantfile", "vagrantfile"]
46
+ filenames.each do |vagrantfile|
47
+ current_path = search_path.join(vagrantfile)
48
+ return current_path if current_path.file?
49
+ end
50
+
51
+ nil
52
+ end
53
+
54
+ ##
55
+ # Returns Vagrant working directory to use.
56
+ #
57
+ # Copied from `lib\vagrant\environment.rb#80` (tag: v1.6.2)
58
+ #
59
+ # @return [Pathname] The working directory to start search in.
60
+ #
61
+ def self.get_vagrant_working_directory()
62
+ cwd = nil
63
+
64
+ # Set the default working directory to look for the vagrantfile
65
+ cwd ||= ENV["VAGRANT_CWD"] if ENV.has_key?("VAGRANT_CWD")
66
+ cwd ||= Dir.pwd
67
+ cwd = Pathname.new(cwd)
68
+
69
+ if !cwd.directory?
70
+ raise Errors::EnvironmentNonExistentCWD, cwd: cwd.to_s
71
+ end
72
+
73
+ cwd = cwd.expand_path
74
+ end
75
+
76
+ def self.get_restricted_keys()
77
+ bag_methods = Nugrant::Bag.instance_methods
78
+ parameters_methods = V2::Config::User.instance_methods
79
+
80
+ (bag_methods | parameters_methods).map(&:to_s)
81
+ end
82
+
83
+ def self.get_used_restricted_keys(hash, restricted_keys)
84
+ keys = []
85
+ hash.each do |key, value|
86
+ keys << key if restricted_keys.include?(key)
87
+ keys += get_used_restricted_keys(value, restricted_keys) if value.kind_of?(Hash)
88
+ end
89
+
90
+ keys.uniq
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -4,6 +4,9 @@ module Nugrant
4
4
  module V2
5
5
  class Plugin < ::Vagrant.plugin("2")
6
6
  name "Nugrant"
7
+ description <<-DESC
8
+ Plugin to define and use user specific parameters from various location inside your Vagrantfile.
9
+ DESC
7
10
 
8
11
  command "user" do
9
12
  require_relative "command/root"
@@ -1,3 +1,3 @@
1
1
  module Nugrant
2
- VERSION = "2.0.0.rc1"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -9,8 +9,8 @@ en:
9
9
 
10
10
  %{context}
11
11
 
12
- If you think it should be found, don't hesitate to fill an
13
- issue @ https://github.com/maoueh/nugrant/issues.
12
+ If you think the parameter '%{key}' should have been found, don't
13
+ hesitate to fill an issue @ https://github.com/maoueh/nugrant/issues.
14
14
 
15
15
  parse_error: |-
16
16
  Nugrant: Vagrant user file could not be parsed correctly,
@@ -0,0 +1,24 @@
1
+ en:
2
+ nugrant:
3
+ vagrant:
4
+ errors:
5
+ parameter_not_found: |-
6
+ Nugrant: Le paramètre '%{key}' n'a pu être trouvé, est-il définie
7
+ dans votre fichier .vagrantuser ? Voici où nous pensons que l'erreur
8
+ se trouve dans votre fichier Vagrantfile:
9
+
10
+ %{context}
11
+
12
+ Si vous croyez que le paramètre '%{key}' devrait être trouvé, n'hésitez
13
+ pas à rapporter le problème @ https://github.com/maoueh/nugrant/issues.
14
+
15
+ parse_error: |-
16
+ Nugrant: Le fichier de paramètres Vagrant n'a pu être lu correctement,
17
+ le fichier contient probablement une erreur de syntaxe.
18
+
19
+ File: %{filename}
20
+ Error: %{error}
21
+
22
+ Si vous croyez que ceci est un bug, n'hésitez pas à rapporter le
23
+ problème @ https://github.com/maoueh/nugrant/issues.
24
+
@@ -54,6 +54,28 @@ module Nugrant
54
54
  assert_equal("#{@user_dir}/.currentcustomparams", config.current_path())
55
55
  end
56
56
 
57
+ def test_custom_current_path_without_filename
58
+ config = Nugrant::Config.new({
59
+ :params_filename => ".customparams",
60
+ :current_path => "#{@user_dir}"
61
+ })
62
+
63
+ assert_equal(".customparams", config.params_filename())
64
+ assert_equal("#{@user_dir}/.customparams", config.current_path())
65
+ end
66
+
67
+ def test_custom_current_path_using_callable
68
+ config = Nugrant::Config.new({
69
+ :params_filename => ".customparams",
70
+ :current_path => lambda do ||
71
+ "#{@user_dir}/"
72
+ end
73
+ })
74
+
75
+ assert_equal(".customparams", config.params_filename())
76
+ assert_equal("#{@user_dir}/.customparams", config.current_path())
77
+ end
78
+
57
79
  def test_custom_user_path
58
80
  config = Nugrant::Config.new({
59
81
  :params_filename => ".customparams",
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nugrant
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.rc1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthieu Vachon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-25 00:00:00.000000000 Z
11
+ date: 2014-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multi_json
@@ -64,14 +64,15 @@ files:
64
64
  - lib/nugrant/parameters.rb
65
65
  - lib/nugrant/vagrant/errors.rb
66
66
  - lib/nugrant/vagrant/v2/command/env.rb
67
- - lib/nugrant/vagrant/v2/command/helper.rb
68
67
  - lib/nugrant/vagrant/v2/command/parameters.rb
69
68
  - lib/nugrant/vagrant/v2/command/restricted_keys.rb
70
69
  - lib/nugrant/vagrant/v2/command/root.rb
71
70
  - lib/nugrant/vagrant/v2/config/user.rb
71
+ - lib/nugrant/vagrant/v2/helper.rb
72
72
  - lib/nugrant/vagrant/v2/plugin.rb
73
73
  - lib/nugrant/version.rb
74
74
  - locales/en.yml
75
+ - locales/fr.yml
75
76
  - nugrant.gemspec
76
77
  - test/lib/nugrant/helper/env/test_exporter.rb
77
78
  - test/lib/nugrant/helper/test_bag.rb
@@ -139,9 +140,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
139
140
  version: '0'
140
141
  required_rubygems_version: !ruby/object:Gem::Requirement
141
142
  requirements:
142
- - - '>'
143
+ - - '>='
143
144
  - !ruby/object:Gem::Version
144
- version: 1.3.1
145
+ version: '0'
145
146
  requirements: []
146
147
  rubyforge_project:
147
148
  rubygems_version: 2.2.2
@@ -1,30 +0,0 @@
1
- require 'nugrant'
2
- require 'nugrant/bag'
3
- require 'nugrant/vagrant/v2/config/user'
4
-
5
- module Nugrant
6
- module Vagrant
7
- module V2
8
- module Command
9
- class Helper
10
- def self.get_restricted_keys()
11
- bag_methods = Nugrant::Bag.instance_methods
12
- parameters_methods = V2::Config::User.instance_methods
13
-
14
- (bag_methods | parameters_methods).map(&:to_s)
15
- end
16
-
17
- def self.get_used_restricted_keys(hash, restricted_keys)
18
- keys = []
19
- hash.each do |key, value|
20
- keys << key if restricted_keys.include?(key)
21
- keys += get_used_restricted_keys(value, restricted_keys) if value.kind_of?(Hash)
22
- end
23
-
24
- keys.uniq
25
- end
26
- end
27
- end
28
- end
29
- end
30
- end