ns-options 1.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -47,7 +47,11 @@ module NsOptions
47
47
  # for the option/namespace name-keys
48
48
  def to_hash
49
49
  Hash.new.tap do |hash|
50
- @child_options.each{|name, opt| hash[name.to_sym] = opt.value}
50
+ @child_options.each do |name, opt|
51
+ # this is meant to be a "value exporter", so always use distinct values
52
+ # on the returned hash to prevent unintentional pass-by-ref shared objects
53
+ hash[name.to_sym] = NsOptions.distinct_value(opt.value)
54
+ end
51
55
  @child_namespaces.each{|name, value| hash[name.to_sym] = value.to_hash}
52
56
  end
53
57
  end
@@ -60,8 +64,10 @@ module NsOptions
60
64
  # recursively apply namespace values if hash given; ignore otherwise.
61
65
  get_namespace(name).apply(value) if value.kind_of?(Hash)
62
66
  else
67
+ # this is meant as a "value importer", so always apply distinct values
68
+ # to prevent unintentional pass-by-ref shared objects.
63
69
  # be sure to use the namespace's writer to write the option value
64
- @ns.send("#{name}=", value)
70
+ @ns.send("#{name}=", NsOptions.distinct_value(value))
65
71
  end
66
72
  end
67
73
  end
@@ -52,12 +52,7 @@ module NsOptions
52
52
  end
53
53
 
54
54
  def reset
55
- default_value = begin
56
- self.rules[:default].clone
57
- rescue TypeError
58
- self.rules[:default]
59
- end
60
- save_value(default_value)
55
+ save_value NsOptions.distinct_value(self.rules[:default])
61
56
  end
62
57
 
63
58
  def is_set?
@@ -1,3 +1,3 @@
1
1
  module NsOptions
2
- VERSION = "1.1.0"
2
+ VERSION = "1.1.1"
3
3
  end
data/lib/ns-options.rb CHANGED
@@ -8,6 +8,14 @@ module NsOptions
8
8
  receiver.class_eval { extend NsOptions::DSL }
9
9
  end
10
10
 
11
+ def self.distinct_value(value)
12
+ begin
13
+ value.clone
14
+ rescue TypeError
15
+ value
16
+ end
17
+ end
18
+
11
19
  module DSL
12
20
 
13
21
  # This is the main DSL method for creating a namespace of options for your
@@ -127,22 +127,6 @@ class NsOptions::NamespaceData
127
127
  assert_not subject.has_namespace? 'dlakjsglasdjgaklsdgjas'
128
128
  end
129
129
 
130
- should "return its Hash representation" do
131
- exp_hash = {
132
- :first => nil, :second => nil, :third => nil,
133
- :child_a => {
134
- :fourth => nil, :fifth => nil,
135
- :child_b => { :sixth => nil }
136
- }
137
- }
138
- assert_equal(exp_hash, subject.to_hash)
139
- end
140
-
141
- should "apply a given hash value to itself" do
142
- subject.apply(@named_values)
143
- assert_equal @named_values, subject.to_hash
144
- end
145
-
146
130
  end
147
131
 
148
132
  class EachTests < HandlingTests
@@ -213,7 +197,7 @@ class NsOptions::NamespaceData
213
197
 
214
198
  end
215
199
 
216
- class ApplyTests < BaseTests
200
+ class HashHandlingTests < BaseTests
217
201
  setup do
218
202
  @data.define do
219
203
  option :first; option :second; option :third
@@ -223,21 +207,61 @@ class NsOptions::NamespaceData
223
207
  end
224
208
  end
225
209
 
210
+ @shared_array = []
226
211
  @named_values = {
227
212
  :first => "1", :second => "2", :third => "3", :twenty_one => "21",
228
213
  :child_a => {
229
214
  :fourth => "4", :fifth => "5",
230
215
  :child_b => { :sixth => "6" }
231
216
  },
232
- :child_c => { :what => "?" }
217
+ :child_c => { :what => "?" },
218
+ :shared => @shared_array
233
219
  }
234
220
  end
235
221
 
222
+ end
223
+
224
+ class ToHashTests < HashHandlingTests
225
+
226
+ should "return its Hash representation" do
227
+ exp_hash = {
228
+ :first => nil, :second => nil, :third => nil,
229
+ :child_a => {
230
+ :fourth => nil, :fifth => nil,
231
+ :child_b => { :sixth => nil }
232
+ }
233
+ }
234
+ assert_equal(exp_hash, subject.to_hash)
235
+ end
236
+
237
+ should "use distinct values in its Hash representation" do
238
+ subject.add_option(:shared)
239
+ subject.set_option(:shared, [])
240
+ hash_rep = subject.to_hash
241
+ subject.get_option(:shared) << 1
242
+
243
+ assert_not_empty subject.get_option(:shared)
244
+ assert_empty hash_rep[:shared]
245
+ assert_not_equal subject.get_option(:shared).object_id, hash_rep[:shared].object_id
246
+ end
247
+
248
+ end
249
+
250
+ class ApplyTests < HashHandlingTests
251
+
236
252
  should "apply a given hash value to itself" do
237
253
  subject.apply(@named_values)
238
254
  assert_equal @named_values, subject.to_hash
239
255
  end
240
256
 
257
+ should "use distinct values when applying hashes" do
258
+ subject.apply(@named_values)
259
+ @shared_array << 1
260
+
261
+ assert_empty subject.get_option(:shared)
262
+ assert_not_equal @shared_array.object_id, subject.get_option(:shared).object_id
263
+ end
264
+
241
265
  should "ignore applying non-hash values to namespaces" do
242
266
  assert_nil subject.ns.child_a.fourth
243
267
  prev_child_b = subject.ns.child_a.child_b.dup
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ns-options
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 17
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 1
9
- - 0
10
- version: 1.1.0
9
+ - 1
10
+ version: 1.1.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Collin Redding
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2012-12-10 00:00:00 Z
19
+ date: 2012-12-18 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: assert