nugrant 1.0.1 → 1.1.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.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NTBjZWZmNDZmODZhZjM5YWQ2ZmVkNWI5YjRkZDUwZjc2YTdlNWY2YQ==
5
+ data.tar.gz: !binary |-
6
+ MTI2MWU0MWJmNTEwZjI5ZWQxZTRkYWZhMDAwODM2N2I3NGQ1NWFhMQ==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ N2VjMzZkZGI4MTE3MDdlYjM1YTY5MzY4ZjIwZjQ3ZmM4Y2VmMjMzMzJlODE2
10
+ Mjk4ODFiNjNhNDdjM2U1ZWViMGYwMmE3OWU3NTI1ZmY2MTJkY2M5ZWI3MzNj
11
+ ZjM5NmM4NjY1OGI2NWY4OTY3YWMxMWEwMjdjYzRiODI0OTYxNTE=
12
+ data.tar.gz: !binary |-
13
+ Nzc0NzFiZTE1MDQ3MTE2ZDhlMWMzMTk3ZGYzMzQ3NDFlNWQ2ZDJiYWJjYzRi
14
+ OGRhYmIzODg3N2U5OWY0NjgwYjQyY2I5NDM0ZjBjMTVjNjM3ZDU0MWExMTVj
15
+ MDE4ODE4OTVkZDliNTg4YTAxMDRlYzBjODAwMTUwODFmMjU5YjE=
@@ -1,3 +1,27 @@
1
+ # 1.1.0 (May 17th, 2013)
2
+
3
+ * Rewrite completely classes `Parameters` and `Bag`.
4
+ * Reduced chances to have a parameter name collapsing with an
5
+ implementation method.
6
+ * Removed dependency on `deep_merge`. We do now perform
7
+ our own merge.
8
+ * Added possibility to iterate through keys by using
9
+ `.each`:
10
+
11
+ ```
12
+ config.user.local.each do |name, value|
13
+ puts "Key #{name}: #{value}"
14
+ end
15
+ ```
16
+
17
+ ### Backward Incompatibilities
18
+
19
+ * `Parameters` is not extending the `Bag` class anymore.
20
+ * `Parameters` and `Bag` attributes and methods are now almost
21
+ all prefixed with __ to reduce clashes to a minimum when
22
+ accessing parameters with method-like syntax
23
+ (i.e. `parameters.git.master` instead of `parameters['git']['master']`)
24
+
1
25
  # 1.0.1 (April 9th, 2013)
2
26
 
3
27
  * Fixed a crash when `user` config value is `nil` preventing `vagrant user parameters`
@@ -0,0 +1,34 @@
1
+ # Nugrant [![Build Status](https://travis-ci.org/maoueh/nugrant.png)](https://travis-ci.org/maoueh/nugrant)
2
+
3
+ Since at first I wanted to have support for plugin api V1 and V2 in the same
4
+ codebase without having to switch between branches, development is a bit
5
+ more complicated than usual.
6
+
7
+ As many other ruby projects, Nugrant use `bundler` to manage its dependencies.
8
+ However, as not many ruby projects, Nugrant supports two incompatible version
9
+ of Vagrant.
10
+
11
+ For this reason, the `Gemfile` used by `bundler` is conditional to an
12
+ environment variable. The environment used is `VAGRANT_PLUGIN_VERSION`.
13
+ When it is set, it can take the value `v1` or `v2` which is the plugin
14
+ version you want to test. By default, if the environment variable is
15
+ not set, `v2` is the default.
16
+
17
+ ## Develop Nugrant for Vagrant api v1
18
+
19
+ To do this, you will need to set and environment variable
20
+ `VAGRANT_PLUGIN_VERSION` to `v1` prior to calling bundle
21
+ install, like this:
22
+
23
+ VAGRANT_PLUGIN_VERSION="v1" bundle install
24
+
25
+ This will instruct `bundler` to setup Vagrant `1.0.z`, which
26
+ at the time of talking, is `1.0.7`.
27
+
28
+ ## Develop Nugrant for Vagrant api v2
29
+
30
+ You can simply install the dependencies normally by doing:
31
+
32
+ bundle install
33
+
34
+
data/Gemfile CHANGED
@@ -7,7 +7,7 @@ group :development do
7
7
  'v1' => {
8
8
  'home' => "~/.vagrant.d.v1",
9
9
  'gem' => Proc.new do
10
- gem "vagrant", "~> 1.0.5"
10
+ gem "vagrant", "~> 1.0.7"
11
11
  end,
12
12
  },
13
13
  'v2' => {
data/README.md CHANGED
@@ -17,7 +17,7 @@ If you would like to use Nugrant as a library, simply reference
17
17
  it as a dependency of your application. Probably by adding it to
18
18
  your `Gemfile` or your `.gemspec` file.
19
19
 
20
- nugrant ~> 1.0.0
20
+ nugrant ~> 1.0.1
21
21
 
22
22
  ### Vagrant
23
23
 
@@ -80,12 +80,14 @@ them all together in a single set. Merging is done in a fairly
80
80
  standard fashion.
81
81
 
82
82
  Here the precedence rules that apply when merging parameters
83
- from various location:
83
+ from various location. List index indicate the priority of the
84
+ entry. Entry with lower number has lower priority (values at this
85
+ priority will be overridden by values defined on higher priorities).
84
86
 
85
- - Defaults
86
- - System
87
- - User
88
- - Project
87
+ 1. Defaults
88
+ 2. System
89
+ 3. User
90
+ 4. Project
89
91
 
90
92
  In text, this means that project parameters overrides user
91
93
  parameters, user parameters overrides system parameters and
@@ -103,32 +105,35 @@ and the format of the parameters file.
103
105
 
104
106
  ### Vagrant
105
107
 
106
- For example, let say the git repository you want to
107
- expose is not located under the root folder of
108
+ All examples shown here are for Vagrant 1.1+. They have
109
+ been tested with Vagrant 1.2.2. Keep this in mind when
110
+ copying examples.
111
+
112
+ Let start with a small use case. Say the git repository you want
113
+ to share with your guest VM is not located under the root folder of
108
114
  your `Vagrantfile`. That means you will need to specify
109
- an absolute host path to share the folder on the guest vm.
115
+ an absolute host path to share the folder on the guest VM.
110
116
 
111
117
  Your `Vagrantfile` would look like this:
112
118
 
113
- Vagrant::Config.run do |config|
114
- config.vm.share_folder "git", "/git", "/home/user/work/git"
119
+ Vagrant.configure("2") do |config|
120
+ config.vm.box = "base"
121
+ config.vm.synced_folder "/home/user/work/git", "/git"
115
122
  end
116
123
 
117
124
  However, what happens when multiple developers
118
125
  need to share the same `Vagrantfile`? This is the main
119
- use case this plugin address.
126
+ use case this plugin try to address.
120
127
 
121
- When Vagrant starts, via any of the `vagrant` commands,
122
- it loads all vagrant plugins it founds under the `GEM_PATH`
123
- variable. If you installed the plugin with one of the two
124
- methods we listed above, you DO NOT need to setup this
125
- environment variable.
128
+ When Vagrant starts, it loads all vagrant plugins it knows
129
+ about. If you installed the plugin with one of the two
130
+ methods we listed above, Vagrant will know about Nugrant
131
+ and will load it correctly.
126
132
 
127
- To use the plugin, first create a yaml file named
128
- `.vagrantuser` where your `Vagrantfile` is located. The file
129
- must be a valid yaml file:
133
+ To use the plugin, first create a YAML file named
134
+ `.vagrantuser` in the same folder where your `Vagrantfile` is
135
+ located. The file must be a valid YAML file:
130
136
 
131
- vm_port: 2223
132
137
  repository:
133
138
  project: "/home/user/work/git"
134
139
 
@@ -137,10 +142,9 @@ is imported into the `config` object of the `Vagrantfile`
137
142
  under the key `user`. So, with the `.vagrantuser` file above, you
138
143
  could have this `Vagrantfile` that abstract absolute paths.
139
144
 
140
- Vagrant::Config.run do |config|
141
- config.ssh.port config.user.vm_port
142
-
143
- config.vm.share_folder "git", "/git", config.user.repository.project
145
+ Vagrant.configure("2") do |config|
146
+ config.vm.box = "base"
147
+ config.vm.synced_folder config.user.repository.project, "/git"
144
148
  end
145
149
 
146
150
  This way, paths can be customized by every developer. They just
@@ -150,45 +154,65 @@ version control system so it is to committed with the project.
150
154
 
151
155
  Additionally, you can also have a `.vagrantuser` under your user home
152
156
  directory. This way, you can set parameters that will be
153
- available to all your `Vagrantfile'. The project `.vagrantuser`
154
- file will overrides parameters defined in the `.vagrantuser` file
155
- defined in the user home directory
157
+ available to all your `Vagrantfile'. The `.vagrantuser` located
158
+ within the same folder as the `Vagrantfile` file will overrides
159
+ parameters defined in the `.vagrantuser` file defined in the user
160
+ home directory.
156
161
 
157
162
  For example, you have `.vagrantuser` file located at `~/.vagrantuser`
158
163
  that has the following content:
159
164
 
160
- vm_port: 2223
165
+ ssh_port: 2223
161
166
  repository:
162
167
  project: "/home/user/work/git"
163
168
 
164
- And another `.vagrantuser` at the root of your `Vagrantfile`:
169
+ And another `.vagrantuser` within the same folder as your `Vagrantfile`:
165
170
 
166
- vm_port: 3332
171
+ ssh_port: 3332
167
172
  repository:
168
173
  personal: "/home/user/personal/git"
169
174
 
170
175
  Then, the `Vagrantfile` could be defined like this:
171
176
 
172
- Vagrant::Config.run do |config|
173
- config.ssh.port config.user.vm_port
177
+ Vagrant.configure("2") do |config|
178
+ config.ssh.port config.user.ssh_port
174
179
 
175
- config.vm.share_folder "git", "/git", config.user.repository.project
176
- config.vm.share_folder "personal", "/personal", config.user.repository.personal
180
+ config.vm.synced_folder config.user.repository.project, "/git"
181
+ config.vm.synced_folder config.user.repository.personal, "/personal"
177
182
  end
178
183
 
179
184
  That would be equivalent to:
180
185
 
181
- Vagrant::Config.run do |config|
186
+ Vagrant.configure("2") do |config|
182
187
  config.ssh.port 3332
183
188
 
184
- config.vm.share_folder "git", "/git", "/home/user/work/git"
185
- config.vm.share_folder "personal", "/personal", "/home/user/personal/git"
189
+ config.vm.synced_folder "/home/user/work/git", "/git"
190
+ config.vm.synced_folder "/home/user/personal/git", "/personal"
186
191
  end
187
192
 
188
193
  As you can see, the parameters defined in the second `.vagrantuser` file
189
194
  (the project one) overrides settings defined in the `.vagrantuser` found
190
195
  in the home directory (the user one).
191
196
 
197
+ Here the list of locations where Nugrant looks for parameters:
198
+
199
+ 1. Defaults (via `config.user.defaults` in `Vagrantfile`)
200
+ 2. System (`/etc/.vagrantuser` on Unix, `%PROGRAMDATA%/.vagrantuser` or `%ALLUSERSPROFILE%/.vagrantuser` on Windows)
201
+ 3. Home (`~/.vagrantuser`)
202
+ 4. Project (`.vagrantuser` within the same folder as the `Vagrantfile`)
203
+
204
+ ### Paths
205
+
206
+ When you want to specify paths on, specially on Windows, it's probably
207
+ better to only use foward slash (`/`). The main reason for this is because
208
+ Ruby, which will be used at the end by Vagrant is able to deal with forward
209
+ slash even on Windows. This is great because with this, you can avoid
210
+ values escaping in YAML file. If you need to use backward slash (`\`), don't
211
+ forget to properly escape it!
212
+
213
+ value: "C:/Users/user/work/git"
214
+ value: "C:\\Users\\user\\work\\git"
215
+
192
216
  ### Parameters access
193
217
 
194
218
  Parameters in the `Vagrantfile` can be retrieved via method call
@@ -220,7 +244,7 @@ parameter `config.user.vm.ssh_port`.
220
244
  You can use the following snippet directly within your Vagrantfile
221
245
  to set a default value for this parameter:
222
246
 
223
- Vagrant::Config.run do |config|
247
+ Vagrant.configure("2") do |config|
224
248
  config.user.defaults = {
225
249
  "vm" => {
226
250
  "ssh_port" => "3335"
@@ -1,44 +1,96 @@
1
1
  module Nugrant
2
2
  class Bag
3
- def initialize(hash)
4
- @bag = recompute(hash)
3
+ attr_reader :__elements
4
+
5
+ def initialize(elements = nil)
6
+ if elements.kind_of?(Bag)
7
+ @__elements = elements
8
+ end
9
+
10
+ __recompute(elements)
5
11
  end
6
12
 
7
- def recompute(hash)
8
- @bag = {}
9
- return @bag if hash == nil
13
+ def [](key)
14
+ return __fetch(key)
15
+ end
16
+
17
+ def method_missing(method, *args, &block)
18
+ return __fetch(method.to_s)
19
+ end
20
+
21
+ def has?(key)
22
+ return @__elements.has_key?(key)
23
+ end
24
+
25
+ def empty?()
26
+ @__elements.size() <= 0
27
+ end
28
+
29
+ ##
30
+ # This method always perform a deep merge and will deep merge
31
+ # array scalar values only. This means that we do not merge
32
+ # within array themselves.
33
+ #
34
+ def __merge!(elements)
35
+ bag = elements.kind_of?(Bag) ? elements : Bag.new(elements)
36
+ return if bag.empty?()
37
+
38
+ bag.each do |key, value|
39
+ if has?(key)
40
+ current = @__elements[key]
41
+ if current.kind_of?(Bag) and value.kind_of?(Bag)
42
+ current.__merge!(value)
43
+ elsif current.kind_of?(Array) and value.kind_of?(Array)
44
+ @__elements[key] = current | value
45
+ else
46
+ @__elements[key] = value
47
+ end
10
48
 
11
- hash.each do |key, value|
12
- if not value.is_a?(Hash)
13
- @bag[key] = value
14
49
  next
15
50
  end
16
51
 
17
- # It is a hash, transform it into a bag
18
- @bag[key] = Nugrant::Bag.new(value)
52
+ @__elements[key] = value
19
53
  end
20
-
21
- return @bag
22
54
  end
23
55
 
24
- def [](key)
25
- return fetch(key)
56
+ def each()
57
+ @__elements.each do |key, value|
58
+ yield key, value
59
+ end
26
60
  end
27
61
 
28
- def method_missing(method, *args, &block)
29
- return fetch(method.to_s)
62
+ def __to_hash()
63
+ return {} if empty?()
64
+
65
+ hash = {}
66
+ each do |key, value|
67
+ hash[key] = value.kind_of?(Bag) ? value.__to_hash() : value
68
+ end
69
+
70
+ return hash
30
71
  end
31
72
 
32
- def has_key?(key)
33
- return @bag.has_key?(key)
73
+ def __recompute(hash = nil)
74
+ @__elements = {}
75
+ return if hash == nil or not hash.kind_of?(Hash)
76
+
77
+ hash.each do |key, value|
78
+ if not value.kind_of?(Hash)
79
+ @__elements[key] = value
80
+ next
81
+ end
82
+
83
+ # It is a hash, transform it into a bag
84
+ @__elements[key] = Bag.new(value)
85
+ end
34
86
  end
35
87
 
36
- def fetch(key)
37
- if not has_key?(key)
88
+ def __fetch(key)
89
+ if not has?(key)
38
90
  raise KeyError, "Undefined parameter '#{key}'"
39
91
  end
40
92
 
41
- return @bag[key]
93
+ return @__elements[key]
42
94
  end
43
95
  end
44
96
  end
@@ -0,0 +1,42 @@
1
+ require 'json'
2
+ require 'yaml'
3
+
4
+ require 'nugrant/bag'
5
+
6
+ module Nugrant
7
+ module Helper
8
+ module Bag
9
+ def self.read(filepath, filetype, error_handler = nil)
10
+ data = parse_data(filepath, filetype, error_handler)
11
+
12
+ return Nugrant::Bag.new(data)
13
+ end
14
+
15
+ def self.parse_data(filepath, filetype, error_handler = nil)
16
+ return if not File.exists?(filepath)
17
+
18
+ begin
19
+ File.open(filepath, "rb") do |file|
20
+ parsing_method = "parse_#{filetype}"
21
+ return send(parsing_method, file.read)
22
+ end
23
+ rescue => error
24
+ if error_handler
25
+ # TODO: Implements error handler logic
26
+ error_handler.handle("Could not parse the user #{filetype} parameters file '#{filepath}': #{error}")
27
+ end
28
+ end
29
+ end
30
+
31
+ def self.parse_json(data_string)
32
+ JSON.parse(data_string)
33
+ end
34
+
35
+ def self.parse_yml(data_string)
36
+ YAML::ENGINE.yamler= 'syck' if defined?(YAML::ENGINE)
37
+
38
+ YAML.load(data_string)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -1,98 +1,54 @@
1
- require 'deep_merge'
2
- require 'json'
3
- require 'ostruct'
4
- require 'yaml'
5
-
6
1
  require 'nugrant/bag'
2
+ require 'nugrant/helper/bag'
7
3
 
8
4
  module Nugrant
9
- class Parameters < Nugrant::Bag
10
- attr_reader :defaults, :system, :user, :project, :all
11
-
12
- def initialize(config = nil)
13
- if config == nil
14
- config = Nugrant::Config.new()
15
- end
5
+ class Parameters
6
+ attr_reader :__defaults, :__system, :__user, :__project, :__all
16
7
 
17
- @config = config
8
+ def initialize(config = nil, defaults = nil)
9
+ @__config = config || Config.new()
18
10
 
19
- @defaults = nil
20
- @system = parse_parameters(@config.system_params_path)
21
- @user = parse_parameters(@config.user_params_path)
22
- @project = parse_parameters(@config.project_params_path)
11
+ @__defaults = defaults || Bag.new()
12
+ @__system = Helper::Bag.read(@__config.system_params_path, @__config.params_filetype)
13
+ @__user = Helper::Bag.read(@__config.user_params_path, @__config.params_filetype)
14
+ @__project = Helper::Bag.read(@__config.project_params_path, @__config.params_filetype)
23
15
 
24
- @all = compute_all()
16
+ __compute_all()
25
17
  end
26
18
 
27
- def defaults=(parameters)
28
- @defaults = parameters
29
-
30
- # When defaults change, we need to recompute parameters hierarchy
31
- compute_all()
19
+ def [](key)
20
+ return @__all[key]
32
21
  end
33
22
 
34
- def compute_all()
35
- @all = Hash.new()
36
- @all.deep_merge!(@defaults) if @defaults != nil
37
- @all.deep_merge!(@system) if @system != nil
38
- @all.deep_merge!(@user) if @user != nil
39
- @all.deep_merge!(@project) if @project != nil
40
-
41
- self.recompute(@all)
42
-
43
- return @all
23
+ def method_missing(method, *args, &block)
24
+ return @__all[method.to_s]
44
25
  end
45
26
 
46
- def parse_parameters(file_path)
47
- data = parse_data(file_path)
48
- if data == nil || !data.kind_of?(Hash)
49
- return
50
- end
51
-
52
- restricted_key = has_restricted_keys?(data)
53
- if restricted_key
54
- raise ArgumentError, "The key '#{restricted_key}' has restricted usage and cannot be defined"
55
- end
56
-
57
- return data
27
+ def empty?()
28
+ @__all.empty?()
58
29
  end
59
30
 
60
- def parse_data(file_path)
61
- return if not File.exists?(file_path)
62
-
63
- begin
64
- File.open(file_path, "rb") do |file|
65
- parsing_method = "parse_#{@config.params_filetype}"
66
- return send(parsing_method, file.read)
67
- end
68
- rescue => error
69
- # TODO: log this message "Could not parse the user #{@config.params_filetype} parameters file '#{file_path}': #{error}"
70
- end
31
+ def has?(key)
32
+ return @__all.has?(key)
71
33
  end
72
34
 
73
- def parse_json(data_string)
74
- JSON.parse(data_string)
35
+ def each(&block)
36
+ @__all.each(&block)
75
37
  end
76
38
 
77
- def parse_yml(data_string)
78
- YAML::ENGINE.yamler= 'syck' if defined?(YAML::ENGINE)
39
+ def defaults=(elements)
40
+ @__defaults = Bag.new(elements)
79
41
 
80
- YAML.load(data_string)
42
+ # When defaults change, we need to recompute parameters hierarchy
43
+ __compute_all()
81
44
  end
82
45
 
83
- def has_restricted_keys?(parameters)
84
- parameters.each do |key, value|
85
- if key == "defaults"
86
- return "defaults"
87
- end
88
-
89
- if value.is_a?(Hash)
90
- result = has_restricted_keys?(value)
91
- return result if result
92
- end
93
- end
94
-
95
- return false
46
+ def __compute_all()
47
+ @__all = Bag.new()
48
+ @__all.__merge!(@__defaults)
49
+ @__all.__merge!(@__system)
50
+ @__all.__merge!(@__user)
51
+ @__all.__merge!(@__project)
96
52
  end
97
53
  end
98
54
  end
@@ -81,27 +81,27 @@ module Nugrant
81
81
  end
82
82
 
83
83
  def defaults(parameters)
84
- print_results("Defaults", parameters.defaults)
84
+ print_bag("Defaults", parameters.__defaults)
85
85
  end
86
86
 
87
87
  def system(parameters)
88
- print_results("System", parameters.system)
88
+ print_bag("System", parameters.__system)
89
89
  end
90
90
 
91
91
  def user(parameters)
92
- print_results("User", parameters.user)
92
+ print_bag("User", parameters.__user)
93
93
  end
94
94
 
95
95
  def project(parameters)
96
- print_results("Project", parameters.project)
96
+ print_bag("Project", parameters.__project)
97
97
  end
98
98
 
99
99
  def all(parameters)
100
- print_results("All", parameters.all)
100
+ print_bag("All", parameters.__all)
101
101
  end
102
102
 
103
- def print_results(kind, parameters)
104
- if !parameters || parameters.empty?()
103
+ def print_bag(kind, bag)
104
+ if !bag || bag.empty?()
105
105
  print_header(kind)
106
106
  @env.ui.info(" Empty", :prefix => false)
107
107
  @env.ui.info("", :prefix => false)
@@ -110,7 +110,7 @@ module Nugrant
110
110
 
111
111
  print_parameters(kind, {
112
112
  'config' => {
113
- 'user' => parameters
113
+ 'user' => bag.__to_hash()
114
114
  }
115
115
  })
116
116
  end
@@ -127,10 +127,6 @@ module Nugrant
127
127
  @env.ui.info(" #{kind.capitalize} Parameters", :prefix => false)
128
128
  @env.ui.info(" " + "-" * length, :prefix => false)
129
129
  end
130
-
131
- def compute_header_length(string)
132
-
133
- end
134
130
  end
135
131
  end
136
132
  end
@@ -19,6 +19,10 @@ module Nugrant
19
19
  return @parameters.method_missing(method, *args, &block)
20
20
  end
21
21
 
22
+ def each(&block)
23
+ @parameters.each(&block)
24
+ end
25
+
22
26
  def defaults(parameters)
23
27
  @parameters.defaults(parameters)
24
28
  end
@@ -81,27 +81,27 @@ module Nugrant
81
81
  end
82
82
 
83
83
  def defaults(parameters)
84
- print_results("Defaults", parameters.defaults)
84
+ print_bag("Defaults", parameters.__defaults)
85
85
  end
86
86
 
87
87
  def system(parameters)
88
- print_results("System", parameters.system)
88
+ print_bag("System", parameters.__system)
89
89
  end
90
90
 
91
91
  def user(parameters)
92
- print_results("User", parameters.user)
92
+ print_bag("User", parameters.__user)
93
93
  end
94
94
 
95
95
  def project(parameters)
96
- print_results("Project", parameters.project)
96
+ print_bag("Project", parameters.__project)
97
97
  end
98
98
 
99
99
  def all(parameters)
100
- print_results("All", parameters.all)
100
+ print_bag("All", parameters.__all)
101
101
  end
102
102
 
103
- def print_results(kind, parameters)
104
- if !parameters || parameters.empty?()
103
+ def print_bag(kind, bag)
104
+ if !bag || bag.empty?()
105
105
  print_header(kind)
106
106
  @env.ui.info(" Empty", :prefix => false)
107
107
  @env.ui.info("", :prefix => false)
@@ -110,7 +110,7 @@ module Nugrant
110
110
 
111
111
  print_parameters(kind, {
112
112
  'config' => {
113
- 'user' => parameters
113
+ 'user' => bag.__to_hash()
114
114
  }
115
115
  })
116
116
  end
@@ -19,6 +19,10 @@ module Nugrant
19
19
  return @parameters.method_missing(method, *args, &block)
20
20
  end
21
21
 
22
+ def each(&block)
23
+ @parameters.each(&block)
24
+ end
25
+
22
26
  def defaults(parameters)
23
27
  @parameters.defaults(parameters)
24
28
  end
@@ -1,3 +1,3 @@
1
1
  module Nugrant
2
- VERSION = "1.0.1"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -28,7 +28,5 @@ Gem::Specification.new do |gem|
28
28
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
29
29
  gem.require_paths = ["lib"]
30
30
 
31
- gem.add_dependency "deep_merge", "~> 1.0.0"
32
-
33
31
  gem.add_development_dependency "rake"
34
32
  end
@@ -0,0 +1,117 @@
1
+ require 'test/unit'
2
+
3
+ require 'nugrant/bag'
4
+
5
+ module Nugrant
6
+ class TestBag < Test::Unit::TestCase
7
+ def create_bag(parameters)
8
+ return Bag.new(parameters)
9
+ end
10
+
11
+ def assert_bag(parameters, bag)
12
+ assert_kind_of(Bag, bag)
13
+
14
+ parameters.each do |key, value|
15
+ if not value.kind_of?(Hash)
16
+ assert_equal(value, bag.send(key))
17
+ assert_equal(value, bag[key])
18
+ next
19
+ end
20
+
21
+ assert_bag(value, bag.send(key))
22
+ assert_bag(value, bag[key])
23
+ end
24
+ end
25
+
26
+ def run_test_bag(parameters)
27
+ bag = create_bag(parameters)
28
+
29
+ assert_bag(parameters, bag)
30
+ end
31
+
32
+ def test_bag()
33
+ run_test_bag({"first" => "value1", "second" => "value2"})
34
+
35
+ run_test_bag({
36
+ "first" => {
37
+ "level1" => "value1",
38
+ "level2" => "value2",
39
+ },
40
+ "second" => {
41
+ "level1" => "value3",
42
+ "level2" => "value4",
43
+ },
44
+ "third" => "value5"
45
+ })
46
+
47
+ run_test_bag({
48
+ "first" => {
49
+ "level1" => {
50
+ "level11" => "value1",
51
+ "level12" => "value2",
52
+ },
53
+ "level2" => {
54
+ "level21" => "value3",
55
+ "level22" => "value4",
56
+ },
57
+ "level3" => "value5",
58
+ },
59
+ "second" => {
60
+ "level1" => {
61
+ "level11" => "value6",
62
+ "level12" => "value7",
63
+ },
64
+ "level2" => {
65
+ "level21" => "value8",
66
+ "level22" => "value9",
67
+ },
68
+ "level3" => "value10",
69
+ },
70
+ "third" => "value11"
71
+ })
72
+ end
73
+
74
+ def test_undefined_value()
75
+ bag = create_bag({"value" => "one"})
76
+
77
+ assert_raise(KeyError) do
78
+ bag.invalid_value
79
+ end
80
+
81
+ assert_raise(KeyError) do
82
+ bag["invalid_value"]
83
+ end
84
+ end
85
+
86
+ def test_to_hash()
87
+ hash = create_bag({}).__to_hash()
88
+
89
+ assert_kind_of(Hash, hash)
90
+ assert_equal({}, hash)
91
+
92
+ hash = create_bag({"value" => {"one" => "value", "two" => "value"}}).__to_hash()
93
+
94
+ assert_kind_of(Hash, hash)
95
+ assert_kind_of(Hash, hash['value'])
96
+ assert_kind_of(String, hash['value']['one'])
97
+ assert_kind_of(String, hash['value']['two'])
98
+ assert_equal({"value" => {"one" => "value", "two" => "value"}}, hash)
99
+ end
100
+
101
+ def test_merge_array()
102
+ bag1 = create_bag({"first" => [1, 2]})
103
+ bag2 = create_bag({"first" => [2, 3]})
104
+
105
+ bag1.__merge!(bag2);
106
+
107
+ assert_equal({"first" => [1, 2, 3]}, bag1.__to_hash())
108
+
109
+ bag1 = create_bag({"first" => [1, 2]})
110
+ bag2 = create_bag({"first" => "string"})
111
+
112
+ bag1.__merge!(bag2);
113
+
114
+ assert_equal({"first" => "string"}, bag1.__to_hash())
115
+ end
116
+ end
117
+ end
@@ -24,11 +24,17 @@ class Nugrant::TestParameters < Test::Unit::TestCase
24
24
 
25
25
  def assert_level(parameters, results)
26
26
  results.each do |key, value|
27
- assert_equal(value, parameters.send(key), "method(#{key})")
27
+ assert_equal(value, parameters.send(key), "array[#{key}]")
28
28
  assert_equal(value, parameters[key], "array[#{key}]")
29
29
  end
30
30
 
31
- assert_equal(false, parameters.has_key?("0.0.0"))
31
+ assert_key_error(parameters, "0.0.0")
32
+ end
33
+
34
+ def assert_key_error(parameters, key)
35
+ assert_raise(KeyError) do
36
+ parameters[key]
37
+ end
32
38
  end
33
39
 
34
40
  def test_params_level_1()
@@ -109,7 +115,7 @@ class Nugrant::TestParameters < Test::Unit::TestCase
109
115
  "0.0.1" => "system",
110
116
  })
111
117
 
112
- assert_equal(false, parameters.has_key?("0.0.0"))
118
+ assert_key_error(parameters, "0.0.0")
113
119
  end
114
120
  end
115
121
 
@@ -117,7 +123,16 @@ class Nugrant::TestParameters < Test::Unit::TestCase
117
123
  assert_level(parameters.send(key), results)
118
124
  assert_level(parameters[key], results)
119
125
 
120
- assert_equal(false, parameters.has_key?("0.0.0"))
126
+ assert_key_error(parameters, "0.0.0")
127
+ end
128
+
129
+ def test_params_array()
130
+ file_path = "params_array"
131
+ filetypes.each do |params_filetype|
132
+ parameters = create_parameters(params_filetype, file_path, invalid_path, invalid_path)
133
+
134
+ assert_equal(["1", "2", "3"], parameters['level1']['level2'])
135
+ end
121
136
  end
122
137
 
123
138
  def test_file_nil()
@@ -131,15 +146,12 @@ class Nugrant::TestParameters < Test::Unit::TestCase
131
146
  def run_test_file_invalid(invalid_value)
132
147
  filetypes.each do |params_filetype|
133
148
  parameters = create_parameters(params_filetype, "params_simple", invalid_path, invalid_path)
134
- assert_equal("value", parameters.test)
135
149
  assert_equal("value", parameters["test"])
136
150
 
137
151
  parameters = create_parameters(params_filetype, invalid_path, "params_simple", invalid_path)
138
- assert_equal("value", parameters.test)
139
152
  assert_equal("value", parameters["test"])
140
153
 
141
154
  parameters = create_parameters(params_filetype, invalid_path, invalid_path, "params_simple")
142
- assert_equal("value", parameters.test)
143
155
  assert_equal("value", parameters["test"])
144
156
 
145
157
  parameters = create_parameters(params_filetype, invalid_path, invalid_path, invalid_path)
@@ -159,24 +171,22 @@ class Nugrant::TestParameters < Test::Unit::TestCase
159
171
  filetypes.each do |params_filetype|
160
172
  parameters = create_parameters(params_filetype, file_path, invalid_path, invalid_path)
161
173
 
162
- assert_equal("value1", parameters.level1)
163
- assert_equal("value2", parameters.level2.first)
174
+ assert_equal("value1", parameters['level1'])
175
+ assert_equal("value2", parameters['level2']['first'])
164
176
  end
165
177
  end
166
178
 
167
179
  def test_restricted_defaults_usage()
168
180
  filetypes.each do |params_filetype|
169
- assert_raise(ArgumentError) do
170
- results = create_parameters(params_filetype, "params_defaults_at_root", invalid_path, invalid_path)
171
- puts("Results: #{results.inspect} (Should have thrown!)")
172
- end
181
+ parameters = create_parameters(params_filetype, "params_defaults_at_root", invalid_path, invalid_path)
182
+
183
+ assert_equal("value", parameters.defaults)
173
184
  end
174
185
 
175
186
  filetypes.each do |params_filetype|
176
- assert_raise(ArgumentError) do
177
- results = create_parameters(params_filetype, "params_defaults_not_at_root", invalid_path, invalid_path)
178
- puts("Results: #{results.inspect} (Should have thrown!)")
179
- end
187
+ parameters = create_parameters(params_filetype, "params_defaults_not_at_root", invalid_path, invalid_path)
188
+
189
+ assert_equal("value", parameters.level.defaults)
180
190
  end
181
191
  end
182
192
 
@@ -185,8 +195,8 @@ class Nugrant::TestParameters < Test::Unit::TestCase
185
195
  parameters = create_parameters(params_filetype, "params_simple", invalid_path, invalid_path)
186
196
  parameters.defaults = {"test" => "override1", "level" => "new1"}
187
197
 
188
- assert_equal("value", parameters.test)
189
- assert_equal("new1", parameters.level)
198
+ assert_equal("value", parameters['test'])
199
+ assert_equal("new1", parameters['level'])
190
200
  end
191
201
  end
192
202
 
@@ -195,7 +205,7 @@ class Nugrant::TestParameters < Test::Unit::TestCase
195
205
  parameters = create_parameters(params_filetype, "params_empty", invalid_path, invalid_path)
196
206
  parameters.defaults = {"test" => "value"}
197
207
 
198
- assert_equal("value", parameters.test)
208
+ assert_equal("value", parameters['test'])
199
209
  end
200
210
  end
201
211
 
@@ -205,7 +215,7 @@ class Nugrant::TestParameters < Test::Unit::TestCase
205
215
  parameters = create_parameters(params_filetype, "params_#{wrong_type}", invalid_path, invalid_path)
206
216
  parameters.defaults = {"test" => "value"}
207
217
 
208
- assert_equal("value", parameters.test)
218
+ assert_equal("value", parameters['test'])
209
219
  end
210
220
  end
211
221
  end
@@ -1,9 +1,10 @@
1
1
  Vagrant::Config.run do |config|
2
2
  config.user.defaults = {
3
- 'value' => "test"
3
+ 'first' => "value1",
4
+ 'second' => "value2"
4
5
  }
5
-
6
- config.vm.box = "testing"
7
-
8
- puts config.user.user.vm_port
6
+
7
+ config.user.each do |name, value|
8
+ puts "Parameters #{name}: #{value.inspect}"
9
+ end
9
10
  end
@@ -2,10 +2,13 @@ Vagrant.require_plugin('nugrant')
2
2
 
3
3
  Vagrant.configure("2") do |config|
4
4
  config.user.defaults = {
5
- 'value' => "test"
5
+ 'local' => {
6
+ 'first' => "value1",
7
+ 'second' => "value2"
8
+ }
6
9
  }
7
-
8
- config.vm.box = "testing"
9
-
10
- puts config.user.value
10
+
11
+ config.user.local.each do |name, value|
12
+ puts "Parameters #{name}: #{value}"
13
+ end
11
14
  end
@@ -0,0 +1,5 @@
1
+ {
2
+ "level1": {
3
+ "level2": ["1", "2", "3"]
4
+ }
5
+ }
@@ -0,0 +1,5 @@
1
+ level1:
2
+ level2:
3
+ - "1"
4
+ - "2"
5
+ - "3"
metadata CHANGED
@@ -1,36 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nugrant
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
5
- prerelease:
4
+ version: 1.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Matthieu Vachon
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-04-09 00:00:00.000000000 Z
11
+ date: 2013-05-17 00:00:00.000000000 Z
13
12
  dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: deep_merge
16
- requirement: !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ~>
20
- - !ruby/object:Gem::Version
21
- version: 1.0.0
22
- type: :runtime
23
- prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ~>
28
- - !ruby/object:Gem::Version
29
- version: 1.0.0
30
13
  - !ruby/object:Gem::Dependency
31
14
  name: rake
32
15
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
16
  requirements:
35
17
  - - ! '>='
36
18
  - !ruby/object:Gem::Version
@@ -38,7 +20,6 @@ dependencies:
38
20
  type: :development
39
21
  prerelease: false
40
22
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
23
  requirements:
43
24
  - - ! '>='
44
25
  - !ruby/object:Gem::Version
@@ -62,6 +43,7 @@ files:
62
43
  - .project
63
44
  - .travis.yml
64
45
  - CHANGELOG.md
46
+ - DEVELOPMENT.md
65
47
  - Gemfile
66
48
  - LICENSE.txt
67
49
  - README.md
@@ -69,6 +51,7 @@ files:
69
51
  - lib/nugrant.rb
70
52
  - lib/nugrant/bag.rb
71
53
  - lib/nugrant/config.rb
54
+ - lib/nugrant/helper/bag.rb
72
55
  - lib/nugrant/helper/yaml.rb
73
56
  - lib/nugrant/parameters.rb
74
57
  - lib/nugrant/vagrant/v1/command/parameters.rb
@@ -82,9 +65,9 @@ files:
82
65
  - lib/nugrant/version.rb
83
66
  - lib/vagrant_init.rb
84
67
  - nugrant.gemspec
68
+ - test/lib/nugrant/test_bag.rb
85
69
  - test/lib/nugrant/test_config.rb
86
70
  - test/lib/nugrant/test_parameters.rb
87
- - test/lib/nugrant/test_parameters_bag.rb
88
71
  - test/resources/.vagrantuser
89
72
  - test/resources/README.md
90
73
  - test/resources/Vagrantfile.v1.empty
@@ -93,6 +76,7 @@ files:
93
76
  - test/resources/Vagrantfile.v2.empty
94
77
  - test/resources/Vagrantfile.v2.fake
95
78
  - test/resources/Vagrantfile.v2.real
79
+ - test/resources/json/params_array.json
96
80
  - test/resources/json/params_boolean.json
97
81
  - test/resources/json/params_combinations.json
98
82
  - test/resources/json/params_defaults_at_root.json
@@ -108,6 +92,7 @@ files:
108
92
  - test/resources/json/params_user_1.json
109
93
  - test/resources/json/params_user_2.json
110
94
  - test/resources/json/params_windows_eol.json
95
+ - test/resources/yml/params_array.yml
111
96
  - test/resources/yml/params_boolean.yml
112
97
  - test/resources/yml/params_combinations.yml
113
98
  - test/resources/yml/params_defaults_at_root.yml
@@ -125,38 +110,31 @@ files:
125
110
  - test/resources/yml/params_windows_eol.yml
126
111
  homepage: https://github.com/maoueh/nugrant
127
112
  licenses: []
113
+ metadata: {}
128
114
  post_install_message:
129
115
  rdoc_options: []
130
116
  require_paths:
131
117
  - lib
132
118
  required_ruby_version: !ruby/object:Gem::Requirement
133
- none: false
134
119
  requirements:
135
120
  - - ! '>='
136
121
  - !ruby/object:Gem::Version
137
122
  version: '0'
138
- segments:
139
- - 0
140
- hash: -217736077
141
123
  required_rubygems_version: !ruby/object:Gem::Requirement
142
- none: false
143
124
  requirements:
144
125
  - - ! '>='
145
126
  - !ruby/object:Gem::Version
146
127
  version: '0'
147
- segments:
148
- - 0
149
- hash: -217736077
150
128
  requirements: []
151
129
  rubyforge_project:
152
- rubygems_version: 1.8.24
130
+ rubygems_version: 2.0.3
153
131
  signing_key:
154
- specification_version: 3
132
+ specification_version: 4
155
133
  summary: Library to handle user specific parameters from various location.
156
134
  test_files:
135
+ - test/lib/nugrant/test_bag.rb
157
136
  - test/lib/nugrant/test_config.rb
158
137
  - test/lib/nugrant/test_parameters.rb
159
- - test/lib/nugrant/test_parameters_bag.rb
160
138
  - test/resources/.vagrantuser
161
139
  - test/resources/README.md
162
140
  - test/resources/Vagrantfile.v1.empty
@@ -165,6 +143,7 @@ test_files:
165
143
  - test/resources/Vagrantfile.v2.empty
166
144
  - test/resources/Vagrantfile.v2.fake
167
145
  - test/resources/Vagrantfile.v2.real
146
+ - test/resources/json/params_array.json
168
147
  - test/resources/json/params_boolean.json
169
148
  - test/resources/json/params_combinations.json
170
149
  - test/resources/json/params_defaults_at_root.json
@@ -180,6 +159,7 @@ test_files:
180
159
  - test/resources/json/params_user_1.json
181
160
  - test/resources/json/params_user_2.json
182
161
  - test/resources/json/params_windows_eol.json
162
+ - test/resources/yml/params_array.yml
183
163
  - test/resources/yml/params_boolean.yml
184
164
  - test/resources/yml/params_combinations.yml
185
165
  - test/resources/yml/params_defaults_at_root.yml
@@ -1,84 +0,0 @@
1
- require 'nugrant'
2
- require 'nugrant/parameters'
3
- require 'test/unit'
4
-
5
- class Nugrant::TestBag < Test::Unit::TestCase
6
- def create_bag(parameters)
7
- return Nugrant::Bag.new(parameters)
8
- end
9
-
10
- def assert_bag(parameters, bag)
11
- assert_kind_of(Nugrant::Bag, bag)
12
-
13
- parameters.each do |key, value|
14
- if not value.is_a?(Hash)
15
- assert_equal(value, bag.send(key))
16
- assert_equal(value, bag[key])
17
- next
18
- end
19
-
20
- assert_bag(value, bag.send(key))
21
- assert_bag(value, bag[key])
22
- end
23
- end
24
-
25
- def run_test_bag(parameters)
26
- bag = create_bag(parameters)
27
-
28
- assert_bag(parameters, bag)
29
- end
30
-
31
- def test_bag()
32
- run_test_bag({"first" => "value1", "second" => "value2"})
33
-
34
- run_test_bag({
35
- "first" => {
36
- "level1" => "value1",
37
- "level2" => "value2",
38
- },
39
- "second" => {
40
- "level1" => "value3",
41
- "level2" => "value4",
42
- },
43
- "third" => "value5"
44
- })
45
-
46
- run_test_bag({
47
- "first" => {
48
- "level1" => {
49
- "level11" => "value1",
50
- "level12" => "value2",
51
- },
52
- "level2" => {
53
- "level21" => "value3",
54
- "level22" => "value4",
55
- },
56
- "level3" => "value5",
57
- },
58
- "second" => {
59
- "level1" => {
60
- "level11" => "value6",
61
- "level12" => "value7",
62
- },
63
- "level2" => {
64
- "level21" => "value8",
65
- "level22" => "value9",
66
- },
67
- "level3" => "value10",
68
- },
69
- "third" => "value11"
70
- })
71
- end
72
-
73
- def test_undefined_value()
74
- bag = create_bag({"value" => "one"})
75
-
76
- assert_raise(KeyError) do
77
- bag.invalid_value
78
- end
79
-
80
- assert_raise(KeyError) do
81
- bag["invalid_value"]
82
- end
83
- end
84
- end