scash 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 50b2f94b76de1c9fbd0867043e4d130ee069368e
4
- data.tar.gz: b7cdbf6ad0bbb527cc4a3be066bd48ac79a5e284
3
+ metadata.gz: eab17874bb39585b1908492ff3167973886daa1a
4
+ data.tar.gz: 8d79365ffce1fb0712e2dbdb0d196e87f165f558
5
5
  SHA512:
6
- metadata.gz: eb1f0bfb1cc25491e14415880a779b4d1bd57408b67d110c375fca3564a6621129fab4b5fd26543d73dc1cca578c47a9f48fa4eb519c3c203ef6f7342a0536d1
7
- data.tar.gz: 8cca5809b87ea8571e20a1c830b3bdafe6442b672fb7eeec1d515aebad3ddb9b3350562b86d1fe21dbdcec2b9bc4847ae4a8b318cfdc802e046591a7715fe8f4
6
+ metadata.gz: 4b648c6503c28de69b49dfdd2876d0954481ad61aceceeb66995c453abfb669182de5d68671c99158711a6c5854a95de8b68344ac2c9a7a13283568947aab60f
7
+ data.tar.gz: a20b50700b57ef2d86ea35ac172685de49210a858151a38fb83861949a1ee4a13f2bd1814e4cac86c1ddcd62c36712afbfaa6ad02365ff782fee181ae3806983
data/lib/scash.rb CHANGED
@@ -10,27 +10,34 @@ class Scash
10
10
 
11
11
  attr_reader :stack
12
12
 
13
- def initialize(variables = {})
14
- @stack = [variables.with_indifferent_access]
13
+ def initialize(variables = {}, klass = HashWithIndifferentAccess)
14
+ @klass = klass
15
+ @stack = [convert(variables)]
16
+ @hashes = [build_hash]
17
+ @inverse_hashes = [build_inverse_hash]
18
+ @global_variables = {}
15
19
  end
16
20
 
17
21
  def to_hash
18
- @stack.inject(HashWithIndifferentAccess.new) do |hash, variables|
19
- variables.merge hash
20
- end
22
+ @hashes.first.merge(@global_variables)
21
23
  end
22
24
 
23
25
  def to_inverse_hash
24
- @stack.inject(HashWithIndifferentAccess.new) do |hash, variables|
25
- hash.merge variables
26
- end
26
+ @inverse_hashes.first.merge(@global_variables)
27
27
  end
28
28
 
29
29
  def scope(variables)
30
- @stack.unshift variables.with_indifferent_access
30
+ @stack.unshift convert(variables)
31
+ added = true
32
+ @hashes.unshift build_hash
33
+ @inverse_hashes.unshift build_inverse_hash
31
34
  yield
32
35
  ensure
33
36
  @stack.shift
37
+ if added
38
+ @hashes.shift
39
+ @inverse_hashes.shift
40
+ end
34
41
  end
35
42
  alias :with :scope
36
43
 
@@ -47,16 +54,30 @@ class Scash
47
54
  end
48
55
 
49
56
  def define_global_variables(variables)
50
- variables.keys.each do |key|
51
- delete_key(key)
52
- end
53
-
54
- @stack.push variables.with_indifferent_access
57
+ @global_variables.merge! convert(variables)
55
58
  end
56
59
 
57
60
  private
58
61
 
62
+ def build_hash(index = 0)
63
+ @stack[index..-1].inject(@klass.new) do |hash, variables|
64
+ variables.merge hash
65
+ end
66
+ end
67
+
68
+ def build_inverse_hash(index = 0)
69
+ @stack[index..-1].inject(@klass.new) do |hash, variables|
70
+ hash.merge variables
71
+ end
72
+ end
73
+
59
74
  def delete_key(key)
60
75
  @stack.each{|hash|hash.delete(key)}
61
76
  end
77
+
78
+ def convert(variables)
79
+ raise(ArgumentError, "Variables should respond to `keys`") unless variables.respond_to?("keys")
80
+ @klass.new(variables)
81
+ end
82
+
62
83
  end
data/lib/scash/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Scash
2
- VERSION = "0.0.4"
2
+ VERSION = "0.1.0"
3
3
  end
data/test/test_scash.rb CHANGED
@@ -53,7 +53,7 @@ class TestScash < Minitest::Test
53
53
 
54
54
  it "should keep scope instact when an error occurs" do
55
55
  scash = Scash.new
56
- assert_raises(NoMethodError) do
56
+ assert_raises(ArgumentError) do
57
57
  scash.with(["a" => 1]) do
58
58
  end
59
59
  end
@@ -74,6 +74,27 @@ class TestScash < Minitest::Test
74
74
  assert_equal 3, scash[:c]
75
75
  end
76
76
 
77
+ it "should typecast correctly" do
78
+ scash = Scash.new({:a => 1})
79
+ assert_equal({"a" => 1}, scash.to_hash)
80
+ assert_equal HashWithIndifferentAccess, scash.to_hash.class
81
+
82
+ scash = Scash.new({:a => 1})
83
+ assert_equal({"a" => 1}, scash.to_inverse_hash)
84
+ assert_equal HashWithIndifferentAccess, scash.to_inverse_hash.class
85
+
86
+ class SubHash < HashWithIndifferentAccess
87
+ end
88
+
89
+ scash = Scash.new({:a => 1}, SubHash)
90
+ assert_equal({"a" => 1}, scash.to_hash)
91
+ assert_equal SubHash, scash.to_hash.class
92
+
93
+ scash = Scash.new({:a => 1}, SubHash)
94
+ assert_equal({"a" => 1}, scash.to_inverse_hash)
95
+ assert_equal SubHash, scash.to_inverse_hash.class
96
+ end
97
+
77
98
  it "should reuse instances" do
78
99
  class Foo
79
100
  attr_accessor :bar
@@ -136,12 +157,18 @@ class TestScash < Minitest::Test
136
157
 
137
158
  scash.with({:b => 2}) do
138
159
  assert_equal 1337, scash[:result]
160
+ assert_equal 2, scash[:b]
139
161
  scash.define_global_variables :result => "foo"
162
+ scash.define_global_variables :b => "bar"
163
+ assert_equal "bar", scash[:b]
140
164
  assert_equal "foo", scash[:result]
141
165
  end
142
166
 
143
167
  assert_equal "foo", scash[:result]
144
168
  end
169
+
170
+ assert_equal "foo", scash[:result]
171
+ assert_equal "bar", scash[:b]
145
172
  end
146
173
  end
147
174
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephan Kaag
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-06 00:00:00.000000000 Z
11
+ date: 2013-11-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport