nugrant 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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