nugrant 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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 [![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
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
|