hold 1.0.2 → 1.0.3

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: ccf3c450bd0581651f077eba61da713f1d1d2c55
4
- data.tar.gz: 9c91f6779ba78610c0cbf5140f1c401994b04f6a
3
+ metadata.gz: 5c24da8a40bff937b20200d7c3165c6b7f1aca2a
4
+ data.tar.gz: 34bc4c8bfe75830097e022376abd0a6b6d431d76
5
5
  SHA512:
6
- metadata.gz: a9264703012fd325bf2dacd390aa732830dbb6874c2da1cf05a774a15a8424ff300f46c268a6351f983cd9af29a79ccf8851407c8e358dab3b27f4eb74322dc3
7
- data.tar.gz: fbf1e4cb8abfd62aad061b5e5675f251e30e2a6d357c8da5e31c021a56d9624c6eeecdf2bf47976512d815fba8f458a1fe67684eefd1c1ea4fa2303a1acad52d
6
+ metadata.gz: eef09f90c3496dbedf8d9e651e8ae8dd6b9b2501a74fb9cf318c249b846787b622083eaee78a480d8d3a76fdca1611d219b9ec772edd98ca7949834d0cbe59c3
7
+ data.tar.gz: 3cfc1289ae4df6e2d633af0eeb2cfc129709e2b7d744f17eec5f48ee439ac793fa61dd0ae2a8bb5e8d956bbd9cb7a11f8520453240181e89a361223c7acf7b5e
data/lib/hold.rb CHANGED
@@ -1,12 +1,20 @@
1
- require_relative 'hold/interfaces'
2
- require_relative 'hold/file/hash_repository'
3
- require_relative 'hold/sequel'
1
+ require 'hold/interfaces'
2
+ require 'hold/file/hash_repository'
3
+ require 'hold/sequel'
4
4
 
5
- module Hold; end
5
+ require 'hold/error'
6
6
 
7
- module Persistence
8
- def self.const_missing(const_name)
9
- warn "'Persistence' has been deprecated, please use 'Hold' instead"
10
- Hold.const_get(const_name)
7
+ # Top level namespace
8
+ module Hold
9
+ end
10
+
11
+ unless defined?(Persistence)
12
+
13
+ # Display a warning if the old gem name is used.
14
+ module Persistence
15
+ def self.const_missing(const_name)
16
+ warn "'Persistence' has been deprecated, please use 'Hold' instead"
17
+ Hold.const_get(const_name)
18
+ end
11
19
  end
12
20
  end
data/lib/hold/error.rb ADDED
@@ -0,0 +1,28 @@
1
+ module Hold
2
+ # Error tag module
3
+ module Error; end
4
+
5
+ # Base error for Hold module
6
+ class StdError < StandardError
7
+ extend Error
8
+
9
+ attr_reader :original
10
+
11
+ def initialize(msg = nil, original = $ERROR_INFO)
12
+ super(msg)
13
+ @original = original
14
+ end
15
+ end
16
+
17
+ # UnsupoortedOperation
18
+ class UnsupportedOperation < StdError; end
19
+
20
+ # EmptyConflict
21
+ class EmptyConflict < StdError; end
22
+
23
+ # IdentityConflict
24
+ class IdentityConflict < StdError; end
25
+
26
+ # MissingIdentity
27
+ class MissingIdentity < StdError; end
28
+ end
@@ -1,59 +1,66 @@
1
1
  require 'hold/interfaces'
2
2
  require 'fileutils'
3
3
 
4
- # A simple HashRepository (ie key/value store implementation) which stores each
5
- # key in a separate file.
6
- #
7
- # * Keys must be suitable pathnames
8
- # * Values must be strings
9
- # * base_path should end with a /, or keys should start with a /, one or the other
10
- # * subdirectories will be created as required if the keys contain path separators
11
- # * watch out for per-directory file limits.
12
- #
13
- # NB: Not threadsafe for writes
14
4
  module Hold
15
- module File; end
5
+ module File
6
+ # A simple HashRepository (ie key/value store implementation) which stores
7
+ # each key in a separate file.
8
+ #
9
+ # * Keys must be suitable pathnames
10
+ # * Values must be strings
11
+ # * base_path should end with a /, or keys should start with a /, one or the
12
+ # other
13
+ # * subdirectories will be created as required if the keys contain path
14
+ # separators
15
+ # * watch out for per-directory file limits.
16
+ #
17
+ # NB: Not threadsafe for writes
18
+ class HashRepository
19
+ include Hold::HashRepository
16
20
 
17
- class File::HashRepository
18
- include Hold::HashRepository
21
+ def can_get_class?(klass)
22
+ klass == String
23
+ end
19
24
 
20
- def can_get_class?(klass); klass == String; end
21
- def can_set_class?(klass); klass == String; end
25
+ def can_set_class?(klass)
26
+ klass == String
27
+ end
22
28
 
23
- def initialize(base_path)
24
- @base_path = base_path
25
- end
29
+ def initialize(base_path)
30
+ @base_path = base_path
31
+ end
26
32
 
27
- def path_to_key(key)
28
- "#{@base_path}#{key}"
29
- end
33
+ def path_to_key(key)
34
+ "#{@base_path}#{key}"
35
+ end
30
36
 
31
- def set_with_key(key, value)
32
- path = path_to_key(key)
33
- FileUtils.mkdir_p(::File.dirname(path))
34
- ::File.open(path, "wb") {|file| file.write(value.to_s)}
35
- value
36
- end
37
+ def set_with_key(key, value)
38
+ path = path_to_key(key)
39
+ FileUtils.mkdir_p(::File.dirname(path))
40
+ ::File.open(path, 'wb') { |file| file.write(value.to_s) }
41
+ value
42
+ end
37
43
 
38
- def get_with_key(key)
39
- path = path_to_key(key)
40
- begin
41
- ::File.read(path)
42
- rescue Errno::ENOENT
44
+ def get_with_key(key)
45
+ path = path_to_key(key)
46
+ begin
47
+ ::File.read(path)
48
+ rescue Errno::ENOENT
49
+ end
43
50
  end
44
- end
45
51
 
46
- def clear_key(key)
47
- path = path_to_key(key)
48
- begin
49
- ::File.unlink(path)
50
- rescue Errno::ENOENT
52
+ def clear_key(key)
53
+ path = path_to_key(key)
54
+ begin
55
+ ::File.unlink(path)
56
+ rescue Errno::ENOENT
57
+ end
51
58
  end
52
- end
53
59
 
54
- def has_key?(key)
55
- ::File.exist?(path_to_key(key))
60
+ def key?(key)
61
+ ::File.exist?(path_to_key(key))
62
+ end
63
+ alias_method :has_key?, :key?
56
64
  end
57
- alias_method :key?, :has_key?
58
65
  end
59
66
  end
@@ -1,184 +1,16 @@
1
- require 'set'
2
-
1
+ require 'hold/in_memory/cell'
2
+ require 'hold/in_memory/array_cell'
3
+ require 'hold/in_memory/object_cell'
4
+ require 'hold/in_memory/hash_repository'
5
+ require 'hold/in_memory/set_repository'
6
+ require 'hold/in_memory/identity_set_repository'
7
+
8
+ # namespace module
3
9
  module Hold
4
-
5
- # These are a set of implementations of Hold interfaces based on in-memory storage.
6
- # They're not threadsafe or for production use, but are here as lightweight implementations to use in
7
- # tests, and for illustrative purposes.
10
+ # These are a set of implementations of Hold interfaces based on in-memory
11
+ # storage. They're not threadsafe or for production use, but are here as
12
+ # lightweight implementations to use in tests, and for illustrative purposes.
8
13
  module InMemory; end
9
14
 
10
15
  ARG_EMPTY = Object.new.freeze # something different to everything else
11
-
12
- class InMemory::Cell
13
- include Hold::Cell
14
-
15
- # new -- empty
16
- # new(nil) -- non-empty, value is nil
17
- # new(123) -- non-empty, value is 123
18
- def initialize(value=ARG_EMPTY)
19
- @value = value unless ARG_EMPTY.equal?(value)
20
- end
21
-
22
- def get
23
- @value
24
- end
25
-
26
- def set(value)
27
- @value = value
28
- end
29
-
30
- def empty?
31
- !instance_variable_defined?(:@value)
32
- end
33
-
34
- def clear
35
- remove_instance_variable(:@value) if instance_variable_defined?(:@value)
36
- end
37
- end
38
-
39
- class InMemory::ArrayCell
40
- include Hold::ArrayCell
41
-
42
- def initialize(array=[])
43
- @array = array
44
- end
45
-
46
- def get
47
- @array.dup
48
- end
49
-
50
- def set(value)
51
- @array.replace(value)
52
- end
53
-
54
- def get_slice(start,length)
55
- @array[start, length]
56
- end
57
-
58
- def get_length
59
- @array.length
60
- end
61
- end
62
-
63
- class InMemory::ObjectCell < InMemory::Cell
64
- include Hold::ObjectCell
65
-
66
- def get
67
- @value && @value.dup
68
- end
69
-
70
- def get_property(property_name)
71
- @value && @value[property_name]
72
- end
73
-
74
- def set_property(property_name, value)
75
- raise EmptyConflict unless @value
76
- @value[property_name] = value
77
- end
78
-
79
- def clear_property(property_name)
80
- raise EmptyConflict unless @value
81
- @value.delete(property_name)
82
- end
83
-
84
- def has_property?(property_name)
85
- raise EmptyConflict unless @value
86
- @value.has_key?(property_name)
87
- end
88
- end
89
-
90
- class InMemory::HashRepository
91
- include Hold::HashRepository
92
-
93
- def initialize
94
- @hash = {}
95
- end
96
-
97
- def set_with_key(key, value)
98
- @hash[key] = value
99
- end
100
-
101
- def get_with_key(key)
102
- value = @hash[key] and value.dup
103
- end
104
-
105
- def clear_key(key)
106
- @hash.delete(key)
107
- end
108
-
109
- def has_key?(key)
110
- @hash.key?(key)
111
- end
112
- alias_method :key?, :has_key?
113
- end
114
-
115
- class InMemory::SetRepository
116
- include Hold::SetRepository
117
-
118
- def initialize
119
- @set = Set.new
120
- end
121
-
122
- def store(value)
123
- @set << value
124
- end
125
-
126
- def delete(value)
127
- @set.delete(value)
128
- end
129
-
130
- def contains?(value)
131
- @set.include?(value)
132
- end
133
-
134
- def get_all
135
- @set.to_a
136
- end
137
- end
138
-
139
- class InMemory::IdentitySetRepository
140
- include Hold::IdentitySetRepository
141
-
142
- def initialize(allocates_ids=false)
143
- @by_id = {}
144
- @id_seq = 0 if allocates_ids
145
- end
146
-
147
- def allocates_ids?
148
- !!@id_seq
149
- end
150
-
151
- def store(object)
152
- id = object.id
153
- object.send(:id=, id = @id_seq += 1) if @id_seq && !id
154
- raise MissingIdentity unless id
155
- @by_id[id] = object
156
- end
157
-
158
- def delete(object)
159
- id = object.id or raise MissingIdentity
160
- delete_id(id)
161
- end
162
-
163
- def contains?(object)
164
- id = object.id or raise MissingIdentity
165
- @by_id.include?(id)
166
- end
167
-
168
- def get_all
169
- @by_id.values
170
- end
171
-
172
- def get_by_id(id)
173
- value = @by_id[id] and value.dup
174
- end
175
-
176
- def delete_id(id)
177
- @by_id.delete(id)
178
- end
179
-
180
- def contains_id?(id)
181
- @by_id.include?(id)
182
- end
183
- end
184
16
  end
@@ -0,0 +1,27 @@
1
+ module Hold
2
+ module InMemory
3
+ class ArrayCell
4
+ include Hold::ArrayCell
5
+
6
+ def initialize(array=[])
7
+ @array = array
8
+ end
9
+
10
+ def get
11
+ @array.dup
12
+ end
13
+
14
+ def set(value)
15
+ @array.replace(value)
16
+ end
17
+
18
+ def get_slice(start,length)
19
+ @array[start, length]
20
+ end
21
+
22
+ def get_length
23
+ @array.length
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,30 @@
1
+ module Hold
2
+ module InMemory
3
+ class Cell
4
+ include Hold::Cell
5
+
6
+ # new -- empty
7
+ # new(nil) -- non-empty, value is nil
8
+ # new(123) -- non-empty, value is 123
9
+ def initialize(value=ARG_EMPTY)
10
+ @value = value unless ARG_EMPTY.equal?(value)
11
+ end
12
+
13
+ def get
14
+ @value
15
+ end
16
+
17
+ def set(value)
18
+ @value = value
19
+ end
20
+
21
+ def empty?
22
+ !instance_variable_defined?(:@value)
23
+ end
24
+
25
+ def clear
26
+ remove_instance_variable(:@value) if instance_variable_defined?(:@value)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,28 @@
1
+ module Hold
2
+ module InMemory
3
+ class HashRepository
4
+ include Hold::HashRepository
5
+
6
+ def initialize
7
+ @hash = {}
8
+ end
9
+
10
+ def set_with_key(key, value)
11
+ @hash[key] = value
12
+ end
13
+
14
+ def get_with_key(key)
15
+ value = @hash[key] and value.dup
16
+ end
17
+
18
+ def clear_key(key)
19
+ @hash.delete(key)
20
+ end
21
+
22
+ def has_key?(key)
23
+ @hash.key?(key)
24
+ end
25
+ alias_method :key?, :has_key?
26
+ end
27
+ end
28
+ end