keyvaluetree 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -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[key_path_string(key)][hash_key] = hash_value
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
@@ -26,7 +26,6 @@ module KeyValueTree
26
26
  @hash
27
27
  end
28
28
 
29
-
30
29
  end
31
30
 
32
31
  end
@@ -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
@@ -1,3 +1,3 @@
1
1
  module KeyValueTree
2
- VERSION = '0.0.3'
2
+ VERSION = '0.0.4'
3
3
  end
data/lib/keyvaluetree.rb CHANGED
@@ -2,6 +2,7 @@ require "keyvaluetree/version"
2
2
 
3
3
  require 'keyvaluetree/store'
4
4
  require 'keyvaluetree/memory_store'
5
+ require 'keyvaluetree/transaction_store'
5
6
 
6
7
  require 'keyvaluetree/hash'
7
8
 
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 ={:a => :b}
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
@@ -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(:@nilkey))
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.3
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: 1144361209399156749
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: 1144361209399156749
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
-