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.
@@ -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
-