persistence 0.0.2 → 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/persistence.rb +0 -1
- data/lib/persistence/adapter/abstract.rb +1 -1
- data/lib/persistence/adapter/abstract/enable_disable.rb +1 -1
- data/lib/persistence/adapter/abstract/primary_key/id_property_string.rb +1 -1
- data/lib/persistence/adapter/abstract/primary_key/simple.rb +1 -1
- data/lib/persistence/adapter/mock/bucket/index/index_interface.rb +1 -1
- data/lib/persistence/cursor/atomic.rb +2 -2
- data/lib/persistence/object.rb +1 -1
- data/lib/persistence/object/autodetermine.rb +5 -4
- data/lib/persistence/object/class_instance.rb +12 -8
- data/lib/persistence/object/complex.rb +4 -4
- data/lib/persistence/object/complex/array.rb +6 -4
- data/lib/persistence/object/complex/array/class_instance.rb +1 -1
- data/lib/persistence/object/complex/array/object_instance.rb +1 -1
- data/lib/persistence/object/complex/attributes/attributes_array.rb +1 -1
- data/lib/persistence/object/complex/hash.rb +6 -4
- data/lib/persistence/object/complex/hash/class_instance.rb +1 -1
- data/lib/persistence/object/complex/hash/object_instance.rb +1 -1
- data/lib/persistence/object/complex/object_instance.rb +3 -3
- data/lib/persistence/object/flat.rb +6 -5
- data/lib/persistence/object/flat/class_instance.rb +2 -2
- data/lib/persistence/object/flat/file.rb +4 -3
- data/lib/persistence/object/flat/file/class_instance.rb +23 -30
- data/lib/persistence/object/flat/file/file_persistence.rb +4 -53
- data/lib/persistence/object/flat/file/object_instance.rb +21 -42
- data/lib/persistence/object/index.rb +0 -1
- data/lib/persistence/object/index_hash.rb +1 -1
- data/lib/persistence/object/object_instance.rb +11 -11
- data/lib/persistence/object/parse_persistence_args.rb +2 -108
- data/lib/persistence/object/parse_persistence_args/class_instance.rb +124 -0
- data/lib/persistence/object/parse_persistence_args/object_instance.rb +124 -0
- data/lib/persistence/port/bucket/bucket_interface.rb +0 -18
- data/lib/persistence/port/port_interface.rb +1 -19
- data/lib/requires.rb +10 -9
- data/spec/persistence/object/complex/attributes_spec.rb +1 -140
- data/spec/persistence/object/flat/bignum_spec.rb +12 -4
- data/spec/persistence/object/flat/class_spec.rb +9 -4
- data/spec/persistence/object/flat/file/class_instance_spec.rb +0 -1
- data/spec/persistence/object/flat/file_spec.rb +6 -9
- data/spec/persistence/object/indexes/block_index_spec.rb +1 -1
- data/spec/persistence/object/parse_persistence_args/class_instance_spec.rb +61 -0
- data/spec/persistence/object/parse_persistence_args/object_instance_spec.rb +63 -0
- data/spec/persistence/object_spec.rb +48 -82
- data/spec/persistence/port/bucket/index/bucket_index_spec.rb +1 -0
- data/spec/{Persistence_spec.rb → persistence_spec.rb} +0 -0
- metadata +8 -5
- data/spec/persistence/object/parse_persistence_args_spec.rb +0 -65
@@ -42,22 +42,6 @@ module ::Persistence::Object::Flat::File::FilePersistence
|
|
42
42
|
#
|
43
43
|
attr_setting :persists_files_by_path? => :persist_files_by_path=
|
44
44
|
|
45
|
-
#####################################
|
46
|
-
# persists_file_paths_as_objects? #
|
47
|
-
#####################################
|
48
|
-
|
49
|
-
###
|
50
|
-
#
|
51
|
-
# @method persists_file_paths_as_objects?
|
52
|
-
#
|
53
|
-
# Query whether File paths should be persisted as objects (rather than by strings).
|
54
|
-
# Lookup chain is: File instance, File class, Persistence::Port::Bucket instance, Persistence::Port instance,
|
55
|
-
# Persistence singleton.
|
56
|
-
#
|
57
|
-
# @return [true,false] Whether files should be persisted as objects rather than as strings.
|
58
|
-
#
|
59
|
-
attr_setting :persists_file_paths_as_objects? => :persist_file_paths_as_objects=
|
60
|
-
|
61
45
|
#####################################
|
62
46
|
# persists_file_paths_as_strings? #
|
63
47
|
#####################################
|
@@ -72,7 +56,10 @@ module ::Persistence::Object::Flat::File::FilePersistence
|
|
72
56
|
#
|
73
57
|
# @return [true,false] Whether files should be persisted as strings rather than as objects.
|
74
58
|
#
|
75
|
-
attr_setting :persists_file_paths_as_strings? => :
|
59
|
+
attr_setting :persists_file_paths_as_strings? => :persists_file_paths_as_strings=
|
60
|
+
|
61
|
+
alias_method( :persist_file_paths_as_strings?, :persists_file_paths_as_strings? )
|
62
|
+
alias_method( :persist_file_paths_as_strings=, :persists_file_paths_as_strings= )
|
76
63
|
|
77
64
|
############################
|
78
65
|
# persist_files_by_path! #
|
@@ -107,41 +94,5 @@ module ::Persistence::Object::Flat::File::FilePersistence
|
|
107
94
|
end
|
108
95
|
|
109
96
|
alias_method( :persists_files_by_content!, :persist_files_by_content! )
|
110
|
-
|
111
|
-
####################################
|
112
|
-
# persist_file_paths_as_objects! #
|
113
|
-
####################################
|
114
|
-
|
115
|
-
###
|
116
|
-
# Declare that file paths should be persisted as objects (rather than strings).
|
117
|
-
#
|
118
|
-
def persist_file_paths_as_objects!
|
119
|
-
|
120
|
-
self.persist_file_paths_as_objects = true
|
121
|
-
self.persist_file_paths_as_strings = false
|
122
|
-
|
123
|
-
return self
|
124
|
-
|
125
|
-
end
|
126
|
-
|
127
|
-
alias_method( :persists_file_paths_as_objects!, :persist_file_paths_as_objects! )
|
128
|
-
|
129
|
-
####################################
|
130
|
-
# persist_file_paths_as_strings! #
|
131
|
-
####################################
|
132
|
-
|
133
|
-
###
|
134
|
-
# Declare that file paths should be persisted as strings (rather than objects).
|
135
|
-
#
|
136
|
-
def persist_file_paths_as_strings!
|
137
|
-
|
138
|
-
self.persist_file_paths_as_strings = true
|
139
|
-
self.persist_file_paths_as_objects = false
|
140
|
-
|
141
|
-
return self
|
142
|
-
|
143
|
-
end
|
144
|
-
|
145
|
-
alias_method( :persists_file_paths_as_strings!, :persist_file_paths_as_strings! )
|
146
97
|
|
147
98
|
end
|
@@ -6,39 +6,36 @@ module ::Persistence::Object::Flat::File::ObjectInstance
|
|
6
6
|
|
7
7
|
include ::Persistence::Object::Flat::File::FilePersistence
|
8
8
|
|
9
|
-
|
10
|
-
#
|
11
|
-
|
9
|
+
##############################
|
10
|
+
# persistence_hash_to_port #
|
11
|
+
##############################
|
12
|
+
|
13
|
+
###
|
14
|
+
# @private
|
15
|
+
#
|
16
|
+
# Generate hash representing object.
|
17
|
+
#
|
18
|
+
# @return [Hash] Hash representing information to reproduce object instance.
|
19
|
+
#
|
20
|
+
def persistence_hash_to_port
|
21
|
+
|
22
|
+
persistence_contents = nil
|
12
23
|
|
13
|
-
def persist!( *args )
|
14
|
-
|
15
|
-
starting_pos = self.pos
|
16
|
-
|
17
24
|
# if we are persisting by file path
|
18
|
-
persistence_instance = nil
|
19
25
|
if persists_files_by_path?
|
20
|
-
|
26
|
+
persistence_contents = ::Persistence::Object::Flat::File::Path.new( path )
|
21
27
|
# if we are persisting by file contents
|
22
28
|
else
|
23
|
-
|
29
|
+
starting_pos = self.pos
|
30
|
+
persistence_contents = ::Persistence::Object::Flat::File::Contents.new( self.readlines.join )
|
31
|
+
# rewind file to wherever we started
|
32
|
+
self.pos = starting_pos
|
24
33
|
end
|
25
34
|
|
26
|
-
|
27
|
-
persistence_instance.persistence_bucket = persistence_bucket
|
28
|
-
|
29
|
-
# set new instance ID to current ID
|
30
|
-
persistence_instance.persistence_id = persistence_id
|
31
|
-
|
32
|
-
persistence_instance.persist!( *args )
|
33
|
-
|
34
|
-
# if we got ID from persist! on our instance set our own ID to it
|
35
|
-
self.persistence_id = persistence_instance.persistence_id
|
35
|
+
primary_key = persistence_bucket.primary_key_for_attribute_name( self, self.class.to_s )
|
36
36
|
|
37
|
-
|
38
|
-
self.pos = starting_pos
|
37
|
+
return { primary_key => persistence_contents }
|
39
38
|
|
40
|
-
return self
|
41
|
-
|
42
39
|
end
|
43
40
|
|
44
41
|
################################
|
@@ -77,24 +74,6 @@ module ::Persistence::Object::Flat::File::ObjectInstance
|
|
77
74
|
|
78
75
|
end
|
79
76
|
|
80
|
-
#####################################
|
81
|
-
# persists_file_paths_as_objects? #
|
82
|
-
#####################################
|
83
|
-
|
84
|
-
def persists_file_paths_as_objects?
|
85
|
-
|
86
|
-
persists_file_paths_as_objects = nil
|
87
|
-
|
88
|
-
persists_file_paths_as_objects = super
|
89
|
-
|
90
|
-
if persists_file_paths_as_objects.nil?
|
91
|
-
persists_file_paths_as_objects = self.class.persists_file_paths_as_objects?
|
92
|
-
end
|
93
|
-
|
94
|
-
return persists_file_paths_as_objects
|
95
|
-
|
96
|
-
end
|
97
|
-
|
98
77
|
#####################################
|
99
78
|
# persists_file_paths_as_strings? #
|
100
79
|
#####################################
|
@@ -4,7 +4,7 @@
|
|
4
4
|
#
|
5
5
|
module ::Persistence::Object::ObjectInstance
|
6
6
|
|
7
|
-
include ::Persistence::Object::ParsePersistenceArgs
|
7
|
+
include ::Persistence::Object::ParsePersistenceArgs::ObjectInstance
|
8
8
|
|
9
9
|
include ::CascadingConfiguration::Setting
|
10
10
|
include ::CascadingConfiguration::Hash
|
@@ -178,7 +178,7 @@ module ::Persistence::Object::ObjectInstance
|
|
178
178
|
#
|
179
179
|
def persist!( *args )
|
180
180
|
|
181
|
-
index_instance, key, no_key =
|
181
|
+
index_instance, key, no_key = parse_object_args_for_index_value_no_value( args, false )
|
182
182
|
|
183
183
|
# call super to ensure object is persisted
|
184
184
|
unless persistence_port
|
@@ -196,7 +196,7 @@ module ::Persistence::Object::ObjectInstance
|
|
196
196
|
end
|
197
197
|
|
198
198
|
# and make sure we have an index that permits arbitrary keys
|
199
|
-
unless explicit_indexes[ index_instance.name ] == index_instance
|
199
|
+
unless self.class.explicit_indexes[ index_instance.name ] == index_instance
|
200
200
|
raise ::Persistence::Exception::ExplicitIndexRequired,
|
201
201
|
'Index ' + index_instance.name.to_s + ' was not declared as an explicit index '
|
202
202
|
'and thus does not permit arbitrary keys.'
|
@@ -206,8 +206,8 @@ module ::Persistence::Object::ObjectInstance
|
|
206
206
|
|
207
207
|
end
|
208
208
|
|
209
|
-
unless block_indexes.empty?
|
210
|
-
block_indexes.each do |this_index_name, this_block_index|
|
209
|
+
unless self.class.block_indexes.empty?
|
210
|
+
self.class.block_indexes.each do |this_index_name, this_block_index|
|
211
211
|
this_block_index.index_object( self )
|
212
212
|
end
|
213
213
|
end
|
@@ -242,7 +242,7 @@ module ::Persistence::Object::ObjectInstance
|
|
242
242
|
#
|
243
243
|
def cease!
|
244
244
|
|
245
|
-
indexes.each do |this_index_name, this_index|
|
245
|
+
self.class.indexes.each do |this_index_name, this_index|
|
246
246
|
this_index.delete_keys_for_object_id!( persistence_id )
|
247
247
|
end
|
248
248
|
|
@@ -266,7 +266,7 @@ module ::Persistence::Object::ObjectInstance
|
|
266
266
|
#
|
267
267
|
# @return [CompositingHash{Symbol,String=>Persistence::Object::Index::ExplicitIndex}]
|
268
268
|
#
|
269
|
-
|
269
|
+
attr_module_hash :explicit_indexes, ::Persistence::Object::IndexHash
|
270
270
|
|
271
271
|
###################
|
272
272
|
# block_indexes #
|
@@ -280,7 +280,7 @@ module ::Persistence::Object::ObjectInstance
|
|
280
280
|
#
|
281
281
|
# @return [CompositingHash{Symbol,String=>Persistence::Object::Index::BlockIndex}]
|
282
282
|
#
|
283
|
-
|
283
|
+
attr_module_hash :block_indexes, ::Persistence::Object::IndexHash
|
284
284
|
|
285
285
|
#############
|
286
286
|
# indexes #
|
@@ -294,16 +294,16 @@ module ::Persistence::Object::ObjectInstance
|
|
294
294
|
#
|
295
295
|
# @return [CompositingHash{Symbol,String=>Persistence::Object::Index}]
|
296
296
|
#
|
297
|
-
|
297
|
+
attr_module_hash :indexes do
|
298
298
|
|
299
299
|
#======================#
|
300
300
|
# child_pre_set_hook #
|
301
301
|
#======================#
|
302
302
|
|
303
303
|
def child_pre_set_hook( index_name, index_instance )
|
304
|
-
|
304
|
+
|
305
305
|
child_instance = nil
|
306
|
-
|
306
|
+
|
307
307
|
case index_instance
|
308
308
|
when ::Persistence::Object::Index::ExplicitIndex
|
309
309
|
child_instance = configuration_instance.explicit_indexes[ index_name ]
|
@@ -4,115 +4,9 @@
|
|
4
4
|
#
|
5
5
|
# Internal helper for parsing args of the format: method, method( global_id ), method( index_name, value ),
|
6
6
|
# method( index_instance, value ), method( index_name => value ), method( index_instance => value ).
|
7
|
+
#
|
7
8
|
module ::Persistence::Object::ParsePersistenceArgs
|
8
9
|
|
9
|
-
#########################################
|
10
|
-
# parse_args_for_index_value_no_value #
|
11
|
-
#########################################
|
12
|
-
|
13
|
-
###
|
14
|
-
# Parse *args for index, key_value, no_value.
|
15
|
-
#
|
16
|
-
# @param args [Array] An array of args of the format: method, method( global_id ), method( index_name, value ),
|
17
|
-
# method( index_instance, value ), method( index_name => value ), method( index_instance => value ).
|
18
|
-
#
|
19
|
-
# @param require_value [true,false] Whether key value must be provided; will throw exception if true and
|
20
|
-
# key value is not provided.
|
21
|
-
#
|
22
|
-
# @return [Array] Array containing index instance, key value, whether key value was provided.
|
23
|
-
#
|
24
|
-
def parse_args_for_index_value_no_value( args, require_value = false )
|
25
|
-
|
26
|
-
# * nil
|
27
|
-
# - Cursor to primary bucket
|
28
|
-
# * :index
|
29
|
-
# - Cursor to index
|
30
|
-
# * :index => persistence_key
|
31
|
-
# - Object(s) for indexed key value
|
32
|
-
|
33
|
-
index = nil
|
34
|
-
key_value = nil
|
35
|
-
no_value = nil
|
36
|
-
case args.count
|
37
|
-
|
38
|
-
when 0
|
39
|
-
|
40
|
-
no_value = true
|
41
|
-
if require_value
|
42
|
-
raise ::Persistence::Exception::KeyValueRequired,
|
43
|
-
'Key value required.'
|
44
|
-
end
|
45
|
-
|
46
|
-
when 1
|
47
|
-
|
48
|
-
index_or_id = args[ 0 ]
|
49
|
-
if index_or_id.is_a?( Symbol ) or
|
50
|
-
index_or_id.is_a?( String )
|
51
|
-
|
52
|
-
index = indexes[ index_or_id ]
|
53
|
-
unless index
|
54
|
-
raise ::Persistence::Exception::ExplicitIndexRequired,
|
55
|
-
'Explicit index ' + index_or_id.to_s + ' did not exist.'
|
56
|
-
end
|
57
|
-
no_value = true
|
58
|
-
|
59
|
-
elsif index_or_id.respond_to?( :index_object )
|
60
|
-
|
61
|
-
index = index_or_id
|
62
|
-
no_value = true
|
63
|
-
|
64
|
-
elsif index_or_id.is_a?( Hash )
|
65
|
-
|
66
|
-
key_value = index_or_id.values[ 0 ]
|
67
|
-
index_name = index_or_id.keys[ 0 ]
|
68
|
-
if index_name.is_a?( Symbol ) or
|
69
|
-
index_name.is_a?( String )
|
70
|
-
|
71
|
-
index = indexes[ index_name ]
|
72
|
-
unless index
|
73
|
-
raise ::Persistence::Exception::ExplicitIndexRequired,
|
74
|
-
'Explicit index :' + index_name.to_s + ' did not exist.'
|
75
|
-
end
|
76
|
-
|
77
|
-
end
|
78
|
-
no_value = false
|
79
|
-
|
80
|
-
else
|
81
|
-
|
82
|
-
# persistence_id - anything other than Symbol, String, Hash
|
83
|
-
key_value = args[ 0 ]
|
84
|
-
no_value = false
|
85
|
-
|
86
|
-
end
|
87
|
-
|
88
|
-
when 2
|
89
|
-
|
90
|
-
index_or_name = args[ 0 ]
|
91
|
-
|
92
|
-
index = index_or_name.respond_to?( :index_object ) ? index_or_name : indexes[ index_or_name ]
|
93
|
-
key_value = args[ 1 ]
|
94
|
-
|
95
|
-
if ! index and ! key_value
|
96
|
-
raise ::Persistence::Exception::ExplicitIndexRequired,
|
97
|
-
'Index ' + index_or_name.to_s + ' did not exist.'
|
98
|
-
end
|
99
|
-
no_value = false
|
100
|
-
|
101
|
-
else
|
102
|
-
|
103
|
-
raise 'Unexpected arguments ' + args.inspect + '.'
|
104
|
-
|
105
|
-
end
|
106
|
-
|
107
|
-
# if we have a file we need to persist it like we would a sub-object
|
108
|
-
if key_value.is_a?( File )
|
109
|
-
key_value = process_file_key( key_value )
|
110
|
-
end
|
111
|
-
|
112
|
-
return index, key_value, no_value
|
113
|
-
|
114
|
-
end
|
115
|
-
|
116
10
|
######################
|
117
11
|
# process_file_key #
|
118
12
|
######################
|
@@ -130,7 +24,7 @@ module ::Persistence::Object::ParsePersistenceArgs
|
|
130
24
|
|
131
25
|
processed_key = nil
|
132
26
|
|
133
|
-
if persists_files_by_path?
|
27
|
+
if file_key.persists_files_by_path?
|
134
28
|
processed_key = ::Persistence::Object::Flat::File::Path.new( file_key.path )
|
135
29
|
else
|
136
30
|
starting_pos = file_key.pos
|
@@ -0,0 +1,124 @@
|
|
1
|
+
|
2
|
+
###
|
3
|
+
# @private
|
4
|
+
#
|
5
|
+
# Class-specific implementation for parsing persistence args.
|
6
|
+
#
|
7
|
+
# Internal helper for parsing args of the format: method, method( global_id ), method( index_name, value ),
|
8
|
+
# method( index_instance, value ), method( index_name => value ), method( index_instance => value ).
|
9
|
+
#
|
10
|
+
module ::Persistence::Object::ParsePersistenceArgs::ClassInstance
|
11
|
+
|
12
|
+
include ::Persistence::Object::ParsePersistenceArgs
|
13
|
+
|
14
|
+
###############################################
|
15
|
+
# parse_class_args_for_index_value_no_value #
|
16
|
+
###############################################
|
17
|
+
|
18
|
+
###
|
19
|
+
# Parse *args for index, key_value, no_value.
|
20
|
+
#
|
21
|
+
# @param args [Array] An array of args of the format: method, method( global_id ), method( index_name, value ),
|
22
|
+
# method( index_instance, value ), method( index_name => value ), method( index_instance => value ).
|
23
|
+
#
|
24
|
+
# @param require_value [true,false] Whether key value must be provided; will throw exception if true and
|
25
|
+
# key value is not provided.
|
26
|
+
#
|
27
|
+
# @return [Array] Array containing index instance, key value, whether key value was provided.
|
28
|
+
#
|
29
|
+
def parse_class_args_for_index_value_no_value( args, require_value = false )
|
30
|
+
|
31
|
+
# * nil
|
32
|
+
# - Cursor to primary bucket
|
33
|
+
# * :index
|
34
|
+
# - Cursor to index
|
35
|
+
# * :index => persistence_key
|
36
|
+
# - Object(s) for indexed key value
|
37
|
+
|
38
|
+
index = nil
|
39
|
+
key_value = nil
|
40
|
+
no_value = nil
|
41
|
+
case args.count
|
42
|
+
|
43
|
+
when 0
|
44
|
+
|
45
|
+
no_value = true
|
46
|
+
if require_value
|
47
|
+
raise ::Persistence::Exception::KeyValueRequired,
|
48
|
+
'Key value required.'
|
49
|
+
end
|
50
|
+
|
51
|
+
when 1
|
52
|
+
|
53
|
+
index_or_id = args[ 0 ]
|
54
|
+
|
55
|
+
case index_or_id
|
56
|
+
|
57
|
+
when ::Symbol, ::String
|
58
|
+
|
59
|
+
index = index( index_or_id, true )
|
60
|
+
no_value = true
|
61
|
+
|
62
|
+
when ::Hash
|
63
|
+
|
64
|
+
key_value = index_or_id.values[ 0 ]
|
65
|
+
index_name = index_or_id.keys[ 0 ]
|
66
|
+
|
67
|
+
case index_name
|
68
|
+
|
69
|
+
when ::Symbol, ::String
|
70
|
+
|
71
|
+
index = index( index_name, true )
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
no_value = false
|
76
|
+
|
77
|
+
else
|
78
|
+
|
79
|
+
if index_or_id.respond_to?( :index_object )
|
80
|
+
|
81
|
+
index = index_or_id
|
82
|
+
no_value = true
|
83
|
+
|
84
|
+
else
|
85
|
+
|
86
|
+
# persistence_id - anything other than Symbol, String, Hash
|
87
|
+
key_value = args[ 0 ]
|
88
|
+
no_value = false
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
when 2
|
95
|
+
|
96
|
+
index_or_name = args[ 0 ]
|
97
|
+
|
98
|
+
|
99
|
+
if index_or_name.respond_to?( :index_object )
|
100
|
+
index = index_or_name
|
101
|
+
elsif index_or_name
|
102
|
+
index = index( index_or_name, true )
|
103
|
+
end
|
104
|
+
|
105
|
+
key_value = args[ 1 ]
|
106
|
+
|
107
|
+
no_value = false
|
108
|
+
|
109
|
+
else
|
110
|
+
|
111
|
+
raise 'Unexpected arguments ' << args.inspect + '.'
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
# if we have a file we need to persist it like we would a sub-object
|
116
|
+
if key_value.is_a?( ::File )
|
117
|
+
key_value = process_file_key( key_value )
|
118
|
+
end
|
119
|
+
|
120
|
+
return index, key_value, no_value
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|