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.
- checksums.yaml +15 -0
- data/CHANGELOG.md +24 -0
- data/DEVELOPMENT.md +34 -0
- data/Gemfile +1 -1
- data/README.md +63 -39
- data/lib/nugrant/bag.rb +73 -21
- data/lib/nugrant/helper/bag.rb +42 -0
- data/lib/nugrant/parameters.rb +30 -74
- data/lib/nugrant/vagrant/v1/command/parameters.rb +8 -12
- data/lib/nugrant/vagrant/v1/config/user.rb +4 -0
- data/lib/nugrant/vagrant/v2/command/parameters.rb +8 -8
- data/lib/nugrant/vagrant/v2/config/user.rb +4 -0
- data/lib/nugrant/version.rb +1 -1
- data/nugrant.gemspec +0 -2
- data/test/lib/nugrant/test_bag.rb +117 -0
- data/test/lib/nugrant/test_parameters.rb +31 -21
- data/test/resources/Vagrantfile.v1.fake +6 -5
- data/test/resources/Vagrantfile.v2.fake +8 -5
- data/test/resources/json/params_array.json +5 -0
- data/test/resources/yml/params_array.yml +5 -0
- metadata +13 -33
- data/test/lib/nugrant/test_parameters_bag.rb +0 -84
checksums.yaml
ADDED
@@ -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=
|
data/CHANGELOG.md
CHANGED
@@ -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`
|
data/DEVELOPMENT.md
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# Nugrant [](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
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.
|
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
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
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
|
-
|
107
|
-
|
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
|
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
|
114
|
-
config.vm.
|
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,
|
122
|
-
|
123
|
-
|
124
|
-
|
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
|
128
|
-
`.vagrantuser` where your `Vagrantfile` is
|
129
|
-
must be a valid
|
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
|
141
|
-
config.
|
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
|
154
|
-
|
155
|
-
defined in the
|
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
|
-
|
165
|
+
ssh_port: 2223
|
161
166
|
repository:
|
162
167
|
project: "/home/user/work/git"
|
163
168
|
|
164
|
-
And another `.vagrantuser`
|
169
|
+
And another `.vagrantuser` within the same folder as your `Vagrantfile`:
|
165
170
|
|
166
|
-
|
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
|
173
|
-
config.ssh.port config.user.
|
177
|
+
Vagrant.configure("2") do |config|
|
178
|
+
config.ssh.port config.user.ssh_port
|
174
179
|
|
175
|
-
config.vm.
|
176
|
-
config.vm.
|
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
|
186
|
+
Vagrant.configure("2") do |config|
|
182
187
|
config.ssh.port 3332
|
183
188
|
|
184
|
-
config.vm.
|
185
|
-
config.vm.
|
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
|
247
|
+
Vagrant.configure("2") do |config|
|
224
248
|
config.user.defaults = {
|
225
249
|
"vm" => {
|
226
250
|
"ssh_port" => "3335"
|
data/lib/nugrant/bag.rb
CHANGED
@@ -1,44 +1,96 @@
|
|
1
1
|
module Nugrant
|
2
2
|
class Bag
|
3
|
-
|
4
|
-
|
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
|
8
|
-
|
9
|
-
|
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
|
-
|
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
|
25
|
-
|
56
|
+
def each()
|
57
|
+
@__elements.each do |key, value|
|
58
|
+
yield key, value
|
59
|
+
end
|
26
60
|
end
|
27
61
|
|
28
|
-
def
|
29
|
-
return
|
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
|
33
|
-
|
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
|
37
|
-
if not
|
88
|
+
def __fetch(key)
|
89
|
+
if not has?(key)
|
38
90
|
raise KeyError, "Undefined parameter '#{key}'"
|
39
91
|
end
|
40
92
|
|
41
|
-
return @
|
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
|
data/lib/nugrant/parameters.rb
CHANGED
@@ -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
|
10
|
-
attr_reader :
|
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
|
-
|
8
|
+
def initialize(config = nil, defaults = nil)
|
9
|
+
@__config = config || Config.new()
|
18
10
|
|
19
|
-
@
|
20
|
-
@
|
21
|
-
@
|
22
|
-
@
|
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
|
-
|
16
|
+
__compute_all()
|
25
17
|
end
|
26
18
|
|
27
|
-
def
|
28
|
-
@
|
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
|
35
|
-
@
|
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
|
47
|
-
|
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
|
61
|
-
return
|
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
|
74
|
-
|
35
|
+
def each(&block)
|
36
|
+
@__all.each(&block)
|
75
37
|
end
|
76
38
|
|
77
|
-
def
|
78
|
-
|
39
|
+
def defaults=(elements)
|
40
|
+
@__defaults = Bag.new(elements)
|
79
41
|
|
80
|
-
|
42
|
+
# When defaults change, we need to recompute parameters hierarchy
|
43
|
+
__compute_all()
|
81
44
|
end
|
82
45
|
|
83
|
-
def
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
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
|
-
|
84
|
+
print_bag("Defaults", parameters.__defaults)
|
85
85
|
end
|
86
86
|
|
87
87
|
def system(parameters)
|
88
|
-
|
88
|
+
print_bag("System", parameters.__system)
|
89
89
|
end
|
90
90
|
|
91
91
|
def user(parameters)
|
92
|
-
|
92
|
+
print_bag("User", parameters.__user)
|
93
93
|
end
|
94
94
|
|
95
95
|
def project(parameters)
|
96
|
-
|
96
|
+
print_bag("Project", parameters.__project)
|
97
97
|
end
|
98
98
|
|
99
99
|
def all(parameters)
|
100
|
-
|
100
|
+
print_bag("All", parameters.__all)
|
101
101
|
end
|
102
102
|
|
103
|
-
def
|
104
|
-
if !
|
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' =>
|
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
|
@@ -81,27 +81,27 @@ module Nugrant
|
|
81
81
|
end
|
82
82
|
|
83
83
|
def defaults(parameters)
|
84
|
-
|
84
|
+
print_bag("Defaults", parameters.__defaults)
|
85
85
|
end
|
86
86
|
|
87
87
|
def system(parameters)
|
88
|
-
|
88
|
+
print_bag("System", parameters.__system)
|
89
89
|
end
|
90
90
|
|
91
91
|
def user(parameters)
|
92
|
-
|
92
|
+
print_bag("User", parameters.__user)
|
93
93
|
end
|
94
94
|
|
95
95
|
def project(parameters)
|
96
|
-
|
96
|
+
print_bag("Project", parameters.__project)
|
97
97
|
end
|
98
98
|
|
99
99
|
def all(parameters)
|
100
|
-
|
100
|
+
print_bag("All", parameters.__all)
|
101
101
|
end
|
102
102
|
|
103
|
-
def
|
104
|
-
if !
|
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' =>
|
113
|
+
'user' => bag.__to_hash()
|
114
114
|
}
|
115
115
|
})
|
116
116
|
end
|
data/lib/nugrant/version.rb
CHANGED
data/nugrant.gemspec
CHANGED
@@ -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), "
|
27
|
+
assert_equal(value, parameters.send(key), "array[#{key}]")
|
28
28
|
assert_equal(value, parameters[key], "array[#{key}]")
|
29
29
|
end
|
30
30
|
|
31
|
-
|
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
|
-
|
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
|
-
|
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
|
163
|
-
assert_equal("value2", parameters
|
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
|
-
|
170
|
-
|
171
|
-
|
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
|
-
|
177
|
-
|
178
|
-
|
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
|
189
|
-
assert_equal("new1", parameters
|
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
|
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
|
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
|
-
'
|
3
|
+
'first' => "value1",
|
4
|
+
'second' => "value2"
|
4
5
|
}
|
5
|
-
|
6
|
-
config.
|
7
|
-
|
8
|
-
|
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
|
-
'
|
5
|
+
'local' => {
|
6
|
+
'first' => "value1",
|
7
|
+
'second' => "value2"
|
8
|
+
}
|
6
9
|
}
|
7
|
-
|
8
|
-
config.
|
9
|
-
|
10
|
-
|
10
|
+
|
11
|
+
config.user.local.each do |name, value|
|
12
|
+
puts "Parameters #{name}: #{value}"
|
13
|
+
end
|
11
14
|
end
|
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
|
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-
|
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:
|
130
|
+
rubygems_version: 2.0.3
|
153
131
|
signing_key:
|
154
|
-
specification_version:
|
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
|