keyvaluetree 0.0.3 → 0.0.4
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.
- data/lib/keyvaluetree/hash.rb +8 -2
- data/lib/keyvaluetree/memory_store.rb +0 -1
- data/lib/keyvaluetree/store.rb +24 -0
- data/lib/keyvaluetree/transaction_store.rb +85 -0
- data/lib/keyvaluetree/version.rb +1 -1
- data/lib/keyvaluetree.rb +1 -0
- data/test/hash_test.rb +11 -1
- data/test/memory_store_test.rb +1 -1
- data/test/transaction_store_test.rb +70 -0
- metadata +6 -4
- data/.idea/modules.xml +0 -9
data/lib/keyvaluetree/hash.rb
CHANGED
@@ -2,6 +2,8 @@ module KeyValueTree
|
|
2
2
|
|
3
3
|
class Hash
|
4
4
|
|
5
|
+
attr_reader :store
|
6
|
+
|
5
7
|
def initialize(store = KeyValueTree::MemoryStore.new(), key=nil, parent = nil)
|
6
8
|
@key = key.to_s
|
7
9
|
@parent = parent
|
@@ -9,15 +11,16 @@ module KeyValueTree
|
|
9
11
|
end
|
10
12
|
|
11
13
|
def [] (key)
|
14
|
+
return self if key.nil?
|
12
15
|
value = @store.key(key_path_string(key))
|
13
16
|
return value unless value.nil?
|
14
17
|
return KeyValueTree::Hash.new(@store, key, self)
|
15
18
|
end
|
16
19
|
|
17
20
|
def []= (key, value)
|
18
|
-
if value.is_a?(Hash)
|
21
|
+
if value.is_a?(::Hash)
|
19
22
|
value.each do |hash_key, hash_value|
|
20
|
-
self[
|
23
|
+
self[key][hash_key] = hash_value
|
21
24
|
end
|
22
25
|
return
|
23
26
|
end
|
@@ -75,6 +78,9 @@ module KeyValueTree
|
|
75
78
|
@store.keys_starting_with(key_path_string()).map { |each| each.split(".").first }.uniq
|
76
79
|
end
|
77
80
|
|
81
|
+
def import(object)
|
82
|
+
self[nil] = object
|
83
|
+
end
|
78
84
|
end
|
79
85
|
|
80
86
|
end
|
data/lib/keyvaluetree/store.rb
CHANGED
@@ -2,6 +2,30 @@ module KeyValueTree
|
|
2
2
|
|
3
3
|
class Store
|
4
4
|
|
5
|
+
def initialize(hash={})
|
6
|
+
raise NotImplementedError
|
7
|
+
end
|
8
|
+
|
9
|
+
def key(key)
|
10
|
+
raise NotImplementedError
|
11
|
+
end
|
12
|
+
|
13
|
+
def store(key, value)
|
14
|
+
raise NotImplementedError
|
15
|
+
end
|
16
|
+
|
17
|
+
def basic_delete(key)
|
18
|
+
raise NotImplementedError
|
19
|
+
end
|
20
|
+
|
21
|
+
def keys
|
22
|
+
raise NotImplementedError
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_hash
|
26
|
+
raise NotImplementedError
|
27
|
+
end
|
28
|
+
|
5
29
|
def delete(key)
|
6
30
|
self.delete_keys_start_with(key.to_s)
|
7
31
|
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module KeyValueTree
|
2
|
+
|
3
|
+
class TransactionStore < Store
|
4
|
+
|
5
|
+
def initialize(store = MemoryStore.new())
|
6
|
+
@store = store
|
7
|
+
@access_mutex = Mutex.new()
|
8
|
+
reset()
|
9
|
+
end
|
10
|
+
|
11
|
+
def key(key)
|
12
|
+
@access_mutex.synchronize do
|
13
|
+
result = @changed_properties[key]
|
14
|
+
return result unless result.nil?
|
15
|
+
@store.key(key)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def store(key, value)
|
20
|
+
@access_mutex.synchronize do
|
21
|
+
@changed_properties[key] = value
|
22
|
+
@deleted_property_keys.delete(key)
|
23
|
+
value
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def basic_delete(key)
|
28
|
+
@access_mutex.synchronize do
|
29
|
+
@changed_properties.delete(key)
|
30
|
+
@deleted_property_keys << key
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def keys
|
35
|
+
@access_mutex.synchronize do
|
36
|
+
result = @store.keys + @changed_properties.keys
|
37
|
+
@deleted_property_keys.each do |key|
|
38
|
+
result.delete(key)
|
39
|
+
end
|
40
|
+
result
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_hash
|
45
|
+
result = @store.to_hash
|
46
|
+
@changed_properties.each do |key, value|
|
47
|
+
result[key] = value
|
48
|
+
end
|
49
|
+
@deleted_property_keys.each do |key|
|
50
|
+
result.delete(key)
|
51
|
+
end
|
52
|
+
result
|
53
|
+
end
|
54
|
+
|
55
|
+
def commit
|
56
|
+
@access_mutex.synchronize do
|
57
|
+
@changed_properties.each do |key, value|
|
58
|
+
@store.store(key, value)
|
59
|
+
end
|
60
|
+
@deleted_property_keys.each do |key|
|
61
|
+
@store.delete(key)
|
62
|
+
end
|
63
|
+
reset()
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def rollback
|
68
|
+
@access_mutex.synchronize do
|
69
|
+
reset()
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def pending_changes?
|
74
|
+
!(@changed_properties.empty? && @deleted_property_keys.empty?)
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
def reset
|
80
|
+
@changed_properties = {}
|
81
|
+
@deleted_property_keys = []
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
data/lib/keyvaluetree/version.rb
CHANGED
data/lib/keyvaluetree.rb
CHANGED
data/test/hash_test.rb
CHANGED
@@ -5,7 +5,7 @@ class HashTest < Test::Unit::TestCase
|
|
5
5
|
context "Hash" do
|
6
6
|
|
7
7
|
setup do
|
8
|
-
@hash_object ={
|
8
|
+
@hash_object = {"a" => "b", "c" => {"d" => "e", "f" => "g"}}
|
9
9
|
@array_object = [:a, :b]
|
10
10
|
@store = KeyValueTree::MemoryStore.new()
|
11
11
|
@root = KeyValueTree::Hash.new(@store)
|
@@ -78,6 +78,16 @@ class HashTest < Test::Unit::TestCase
|
|
78
78
|
assert_same_elements ["one", "two"], @root.keys
|
79
79
|
end
|
80
80
|
|
81
|
+
should "import existing object" do
|
82
|
+
@root.import(@hash_object)
|
83
|
+
assert_same_elements ["a", "c"], @root.keys
|
84
|
+
assert_same_elements ["a", "c.d", "c.f"], @store.keys
|
85
|
+
assert_equal "b", @root.a
|
86
|
+
assert_equal "e", @root.c.d
|
87
|
+
assert_equal "g", @root.c.f
|
88
|
+
end
|
89
|
+
|
90
|
+
|
81
91
|
end
|
82
92
|
|
83
93
|
end
|
data/test/memory_store_test.rb
CHANGED
@@ -17,7 +17,7 @@ class MemoryStoreTest < Test::Unit::TestCase
|
|
17
17
|
should "get a value" do
|
18
18
|
@store.store(@key, @value)
|
19
19
|
assert_equal(@value, @store.key(@key))
|
20
|
-
assert_equal(nil, @store.key(
|
20
|
+
assert_equal(nil, @store.key(@nilkey))
|
21
21
|
end
|
22
22
|
|
23
23
|
should "delete a value" do
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require "common"
|
2
|
+
|
3
|
+
class TransactionStoreTest < MemoryStoreTest
|
4
|
+
|
5
|
+
context "a TransactionStore" do
|
6
|
+
setup do
|
7
|
+
|
8
|
+
@embedded_store = KeyValueTree::MemoryStore.new()
|
9
|
+
@store = KeyValueTree::TransactionStore.new(@embedded_store)
|
10
|
+
@key = "key"
|
11
|
+
@nilkey = "nil"
|
12
|
+
@value = 42
|
13
|
+
end
|
14
|
+
|
15
|
+
should "set a value" do
|
16
|
+
assert_equal @value, @store.store(@key, @value)
|
17
|
+
end
|
18
|
+
|
19
|
+
should "get a value" do
|
20
|
+
@store.store(@key, @value)
|
21
|
+
assert_equal(@value, @store.key(@key))
|
22
|
+
assert_equal(nil, @store.key(:@nilkey))
|
23
|
+
end
|
24
|
+
|
25
|
+
should "delete a value" do
|
26
|
+
assert_equal nil, @store.key(@key)
|
27
|
+
@store.store(@key, @value)
|
28
|
+
assert_equal @value, @store.key(@key)
|
29
|
+
@store.delete(@key)
|
30
|
+
assert_equal nil, @store.key(@nilkey)
|
31
|
+
end
|
32
|
+
|
33
|
+
should "access the hash" do
|
34
|
+
assert_nothing_raised(Exception) { @store.to_hash }
|
35
|
+
@store.store(@key, @value)
|
36
|
+
assert_equal @value, @store.to_hash[@key]
|
37
|
+
end
|
38
|
+
|
39
|
+
should "set a value with commit" do
|
40
|
+
assert_equal @value, @store.store(@key, @value)
|
41
|
+
assert_equal 1, @store.keys.size
|
42
|
+
assert_equal 0, @embedded_store.keys.size
|
43
|
+
@store.commit
|
44
|
+
assert_equal 1, @store.keys.size
|
45
|
+
assert_equal 1, @embedded_store.keys.size
|
46
|
+
end
|
47
|
+
|
48
|
+
should "set a value with rollback" do
|
49
|
+
assert_equal @value, @store.store(@key, @value)
|
50
|
+
assert_equal 1, @store.keys.size
|
51
|
+
assert_equal 0, @embedded_store.keys.size
|
52
|
+
@store.rollback
|
53
|
+
assert_equal 0, @store.keys.size
|
54
|
+
assert_equal 0, @embedded_store.keys.size
|
55
|
+
end
|
56
|
+
|
57
|
+
should "track changes" do
|
58
|
+
assert !@store.pending_changes?
|
59
|
+
@store.store(@key, @value)
|
60
|
+
assert @store.pending_changes?
|
61
|
+
@store.commit
|
62
|
+
assert !@store.pending_changes?
|
63
|
+
@store.delete(@key)
|
64
|
+
assert @store.pending_changes?
|
65
|
+
@store.commit
|
66
|
+
assert !@store.pending_changes?
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: keyvaluetree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -85,7 +85,6 @@ files:
|
|
85
85
|
- .gitignore
|
86
86
|
- .idea/encodings.xml
|
87
87
|
- .idea/misc.xml
|
88
|
-
- .idea/modules.xml
|
89
88
|
- .idea/vcs.xml
|
90
89
|
- Gemfile
|
91
90
|
- LICENSE.txt
|
@@ -96,10 +95,12 @@ files:
|
|
96
95
|
- lib/keyvaluetree/hash.rb
|
97
96
|
- lib/keyvaluetree/memory_store.rb
|
98
97
|
- lib/keyvaluetree/store.rb
|
98
|
+
- lib/keyvaluetree/transaction_store.rb
|
99
99
|
- lib/keyvaluetree/version.rb
|
100
100
|
- test/common.rb
|
101
101
|
- test/hash_test.rb
|
102
102
|
- test/memory_store_test.rb
|
103
|
+
- test/transaction_store_test.rb
|
103
104
|
homepage: ''
|
104
105
|
licenses:
|
105
106
|
- MIT
|
@@ -115,7 +116,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
115
116
|
version: '0'
|
116
117
|
segments:
|
117
118
|
- 0
|
118
|
-
hash:
|
119
|
+
hash: -3979295287032402634
|
119
120
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
121
|
none: false
|
121
122
|
requirements:
|
@@ -124,7 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
124
125
|
version: '0'
|
125
126
|
segments:
|
126
127
|
- 0
|
127
|
-
hash:
|
128
|
+
hash: -3979295287032402634
|
128
129
|
requirements: []
|
129
130
|
rubyforge_project:
|
130
131
|
rubygems_version: 1.8.24
|
@@ -135,3 +136,4 @@ test_files:
|
|
135
136
|
- test/common.rb
|
136
137
|
- test/hash_test.rb
|
137
138
|
- test/memory_store_test.rb
|
139
|
+
- test/transaction_store_test.rb
|
data/.idea/modules.xml
DELETED
@@ -1,9 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<project version="4">
|
3
|
-
<component name="ProjectModuleManager">
|
4
|
-
<modules>
|
5
|
-
<module fileurl="file://$PROJECT_DIR$/.idea/KeyValueTree.iml" filepath="$PROJECT_DIR$/.idea/KeyValueTree.iml" />
|
6
|
-
</modules>
|
7
|
-
</component>
|
8
|
-
</project>
|
9
|
-
|