scash 0.0.4 → 0.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 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