riak-client 2.2.0.pre1 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile +0 -2
  4. data/README.markdown +11 -7
  5. data/RELEASE_NOTES.md +29 -2
  6. data/Rakefile +5 -3
  7. data/lib/riak/bucket.rb +55 -23
  8. data/lib/riak/bucket_properties.rb +8 -1
  9. data/lib/riak/bucket_type.rb +29 -0
  10. data/lib/riak/bucket_typed/bucket.rb +15 -7
  11. data/lib/riak/client.rb +24 -8
  12. data/lib/riak/client/beefcake/bucket_properties_operator.rb +8 -8
  13. data/lib/riak/client/beefcake/crdt/set_loader.rb +1 -1
  14. data/lib/riak/client/beefcake/crdt_loader.rb +1 -1
  15. data/lib/riak/client/beefcake/crdt_operator.rb +9 -9
  16. data/lib/riak/client/beefcake/message_codes.rb +4 -0
  17. data/lib/riak/client/beefcake/message_overlay.rb +4 -0
  18. data/lib/riak/client/beefcake/messages.rb +35 -5
  19. data/lib/riak/client/beefcake/object_methods.rb +21 -13
  20. data/lib/riak/client/beefcake/protocol.rb +7 -7
  21. data/lib/riak/client/beefcake/socket.rb +2 -2
  22. data/lib/riak/client/beefcake_protobuffs_backend.rb +58 -33
  23. data/lib/riak/client/protobuffs_backend.rb +5 -5
  24. data/lib/riak/client/yokozuna.rb +3 -3
  25. data/lib/riak/core_ext/deep_dup.rb +1 -1
  26. data/lib/riak/counter.rb +10 -10
  27. data/lib/riak/crdt/base.rb +39 -21
  28. data/lib/riak/crdt/batch_counter.rb +5 -5
  29. data/lib/riak/crdt/batch_map.rb +2 -2
  30. data/lib/riak/crdt/counter.rb +7 -7
  31. data/lib/riak/crdt/inner_counter.rb +4 -4
  32. data/lib/riak/crdt/inner_flag.rb +3 -3
  33. data/lib/riak/crdt/inner_map.rb +1 -1
  34. data/lib/riak/crdt/inner_register.rb +1 -1
  35. data/lib/riak/crdt/inner_set.rb +5 -5
  36. data/lib/riak/crdt/map.rb +9 -9
  37. data/lib/riak/crdt/set.rb +10 -10
  38. data/lib/riak/crdt/typed_collection.rb +39 -36
  39. data/lib/riak/errors/base.rb +1 -1
  40. data/lib/riak/errors/crdt_error.rb +20 -0
  41. data/lib/riak/errors/search_error.rb +6 -0
  42. data/lib/riak/index_collection.rb +1 -1
  43. data/lib/riak/link.rb +5 -3
  44. data/lib/riak/locale/en.yml +5 -1
  45. data/lib/riak/map_reduce.rb +7 -7
  46. data/lib/riak/map_reduce/filter_builder.rb +2 -2
  47. data/lib/riak/map_reduce/phase.rb +2 -2
  48. data/lib/riak/preflist_item.rb +7 -0
  49. data/lib/riak/rcontent.rb +8 -8
  50. data/lib/riak/robject.rb +27 -14
  51. data/lib/riak/search.rb +1 -0
  52. data/lib/riak/search/index.rb +17 -3
  53. data/lib/riak/search/query.rb +14 -6
  54. data/lib/riak/search/result_collection.rb +56 -3
  55. data/lib/riak/search/result_document.rb +71 -1
  56. data/lib/riak/search/schema.rb +6 -6
  57. data/lib/riak/secondary_index.rb +20 -12
  58. data/lib/riak/serializers.rb +0 -1
  59. data/lib/riak/util/escape.rb +2 -2
  60. data/lib/riak/util/translation.rb +1 -2
  61. data/lib/riak/version.rb +1 -1
  62. data/lib/riak/walk_spec.rb +67 -32
  63. data/riak-client.gemspec +5 -4
  64. data/spec/integration/riak/bucket_types_spec.rb +35 -5
  65. data/spec/integration/riak/conflict_resolution_spec.rb +1 -1
  66. data/spec/integration/riak/counters_spec.rb +1 -1
  67. data/spec/integration/riak/crdt/configuration_spec.rb +37 -0
  68. data/spec/integration/riak/crdt_search_spec.rb +176 -0
  69. data/spec/integration/riak/crdt_spec.rb +9 -33
  70. data/spec/integration/riak/crdt_validation/map_spec.rb +4 -4
  71. data/spec/integration/riak/crdt_validation/set_spec.rb +13 -13
  72. data/spec/integration/riak/preflist_spec.rb +31 -0
  73. data/spec/integration/riak/protobuffs/interrupted_request_spec.rb +2 -2
  74. data/spec/integration/riak/protobuffs_backends_spec.rb +9 -2
  75. data/spec/integration/riak/search_spec.rb +3 -3
  76. data/spec/integration/riak/secondary_index_spec.rb +3 -3
  77. data/spec/integration/riak/security_spec.rb +7 -7
  78. data/spec/integration/yokozuna/queries_spec.rb +1 -1
  79. data/spec/riak/beefcake_protobuffs_backend/bucket_properties_operator_spec.rb +9 -9
  80. data/spec/riak/beefcake_protobuffs_backend/crdt_operator_spec.rb +9 -9
  81. data/spec/riak/beefcake_protobuffs_backend/protocol_spec.rb +5 -5
  82. data/spec/riak/beefcake_protobuffs_backend_spec.rb +8 -8
  83. data/spec/riak/bucket_properties_spec.rb +27 -6
  84. data/spec/riak/bucket_spec.rb +5 -5
  85. data/spec/riak/bucket_type_spec.rb +21 -5
  86. data/spec/riak/bucket_typed/bucket_spec.rb +62 -0
  87. data/spec/riak/client_spec.rb +36 -18
  88. data/spec/riak/counter_spec.rb +4 -4
  89. data/spec/riak/crdt/counter_spec.rb +2 -2
  90. data/spec/riak/crdt/inner_flag_spec.rb +2 -2
  91. data/spec/riak/crdt/inner_map_spec.rb +4 -4
  92. data/spec/riak/crdt/inner_register_spec.rb +1 -1
  93. data/spec/riak/crdt/map_spec.rb +4 -4
  94. data/spec/riak/crdt/shared_examples.rb +5 -5
  95. data/spec/riak/crdt/typed_collection_spec.rb +21 -21
  96. data/spec/riak/map_reduce/filter_builder_spec.rb +2 -2
  97. data/spec/riak/map_reduce/phase_spec.rb +4 -4
  98. data/spec/riak/map_reduce_spec.rb +60 -42
  99. data/spec/riak/multiget_spec.rb +2 -2
  100. data/spec/riak/robject_spec.rb +55 -14
  101. data/spec/riak/search/index_spec.rb +12 -2
  102. data/spec/riak/search/query_spec.rb +4 -4
  103. data/spec/riak/search/result_collection_spec.rb +6 -4
  104. data/spec/riak/search/result_document_spec.rb +52 -9
  105. data/spec/riak/search/schema_spec.rb +2 -2
  106. data/spec/riak/secondary_index_spec.rb +6 -6
  107. data/spec/riak/serializers_spec.rb +27 -10
  108. data/spec/riak/walk_spec_spec.rb +10 -6
  109. data/spec/spec_helper.rb +11 -2
  110. data/spec/support/crdt_search_config.rb +112 -0
  111. data/spec/support/crdt_search_fixtures.rb +42 -0
  112. data/spec/support/search_config.rb +7 -5
  113. data/spec/support/search_corpus_setup.rb +2 -2
  114. data/spec/support/test_client.rb +2 -2
  115. data/spec/support/unified_backend_examples.rb +5 -5
  116. data/spec/support/version_filter.rb +5 -3
  117. data/spec/support/wait_until.rb +9 -3
  118. metadata +36 -13
  119. data/spec/riak/bucket_typed/bucket.rb +0 -43
@@ -2,16 +2,16 @@ module Riak
2
2
  module Crdt
3
3
  class BatchCounter
4
4
  attr_reader :accumulator
5
-
5
+
6
6
  def initialize
7
7
  @accumulator = 0
8
8
  end
9
-
10
- def increment(amount=1)
9
+
10
+ def increment(amount = 1)
11
11
  @accumulator += amount
12
12
  end
13
-
14
- def decrement(amount=1)
13
+
14
+ def decrement(amount = 1)
15
15
  increment -amount
16
16
  end
17
17
  end
@@ -4,7 +4,7 @@ module Riak
4
4
  # Riak all at once.
5
5
  class BatchMap
6
6
  attr_reader :counters, :flags, :maps, :registers, :sets
7
-
7
+
8
8
  # @api private
9
9
  def initialize(parent)
10
10
  @parent = parent
@@ -27,7 +27,7 @@ module Riak
27
27
  end
28
28
  end
29
29
  end
30
-
30
+
31
31
  private
32
32
  def initialize_collections
33
33
  @counters = @parent.counters.reparent self
@@ -19,10 +19,10 @@ module Riak
19
19
  # @param [String] bucket_type The optional bucket type for this counter.
20
20
  # The default is in `Crdt::Base::DEFAULT_BUCKET_TYPES[:counter]`.
21
21
  # @param [Hash] options
22
- def initialize(bucket, key, bucket_type=nil, options={})
22
+ def initialize(bucket, key, bucket_type = nil, options = {})
23
23
  super(bucket, key, bucket_type || :counter, options)
24
24
  end
25
-
25
+
26
26
  # The current value of the counter; hits the server if the value has
27
27
  # not been fetched or if the counter has been incremented.
28
28
  def value
@@ -34,7 +34,7 @@ module Riak
34
34
  #
35
35
  # @param [Integer] amount
36
36
  # @param [Hash] options
37
- def increment(amount=1, options={})
37
+ def increment(amount = 1, options = {})
38
38
  operate operation(amount), options
39
39
  end
40
40
 
@@ -46,16 +46,16 @@ module Riak
46
46
  batcher = BatchCounter.new
47
47
 
48
48
  yield batcher
49
-
49
+
50
50
  increment batcher.accumulator
51
51
  end
52
-
52
+
53
53
  alias :to_i :value
54
54
 
55
55
  # Decrement the counter.
56
56
  #
57
57
  # @param [Integer] amount
58
- def decrement(amount=1)
58
+ def decrement(amount = 1)
59
59
  increment -amount
60
60
  end
61
61
 
@@ -65,7 +65,7 @@ module Riak
65
65
  pp.text "value=#{value}"
66
66
  end
67
67
  end
68
-
68
+
69
69
  private
70
70
  def vivify(value)
71
71
  @value = value
@@ -1,6 +1,6 @@
1
1
  module Riak
2
2
  module Crdt
3
- # The {InnerCounter} lives inside a {Map}, or an {InnerMap} inside of a
3
+ # The {InnerCounter} lives inside a {Map}, or an {InnerMap} inside of a
4
4
  # {Map}, and is accessed through a {TypedCollection}.
5
5
  #
6
6
  # Much like the {Riak::Crdt::Counter}, it provides an integer value that can
@@ -21,9 +21,9 @@ module Riak
21
21
  #
22
22
  # @api private
23
23
  attr_reader :parent
24
-
24
+
25
25
  # @api private
26
- def initialize(parent, value=0)
26
+ def initialize(parent, value = 0)
27
27
  @parent = parent
28
28
  @value = value
29
29
  end
@@ -54,7 +54,7 @@ module Riak
54
54
 
55
55
  increment batcher.accumulator
56
56
  end
57
-
57
+
58
58
  def pretty_print(pp)
59
59
  pp.object_group self do
60
60
  pp.breakable
@@ -6,15 +6,15 @@ module Riak
6
6
  #
7
7
  # @api private
8
8
  class InnerFlag
9
- def self.new(parent, value=false)
9
+ def self.new(parent, value = false)
10
10
  ensure_boolean value
11
-
11
+
12
12
  return value
13
13
  end
14
14
 
15
15
  def self.update(value)
16
16
  ensure_boolean value
17
-
17
+
18
18
  Operation::Update.new.tap do |op|
19
19
  op.value = value
20
20
  op.type = :flag
@@ -12,7 +12,7 @@ module Riak
12
12
  attr_reader :parent
13
13
 
14
14
  # @api private
15
- def initialize(parent, value={})
15
+ def initialize(parent, value = {})
16
16
  @parent = parent
17
17
  @value = value.symbolize_keys
18
18
 
@@ -2,7 +2,7 @@ module Riak
2
2
  module Crdt
3
3
  class InnerRegister < String
4
4
  attr_reader :parent
5
-
5
+
6
6
  def initialize(parent, *args, &block)
7
7
  @parent = parent
8
8
  super(*args, &block)
@@ -4,14 +4,14 @@ module Riak
4
4
  # a {Map} (or an {InnerMap} inside of a {Map}). It is usually accessed
5
5
  # through a {TypedCollection}.
6
6
  #
7
- # Just like a {Riak::Crdt::Set}, it's a set of {String Strings} that can
7
+ # Just like a {Riak::Crdt::Set}, it's a set of {String Strings} that can
8
8
  # be added to or removed from.
9
9
  class InnerSet
10
10
  # The name of this set inside a map.
11
11
  #
12
12
  # @api private
13
13
  attr_accessor :name
14
-
14
+
15
15
  # The {::Set} value of this {InnerSet}.
16
16
  #
17
17
  # @return [::Set] set value
@@ -24,13 +24,13 @@ module Riak
24
24
  attr_reader :parent
25
25
 
26
26
  # @api private
27
- def initialize(parent, value=[])
27
+ def initialize(parent, value = [])
28
28
  @parent = parent
29
29
  frozen_value = value.to_a.tap{ |v| v.each(&:freeze) }
30
30
  @value = ::Set.new frozen_value
31
31
  @value.freeze
32
32
  end
33
-
33
+
34
34
  # Casts this {InnerSet} to an {Array}.
35
35
  #
36
36
  # @return [Array] an array of all the members of this set
@@ -68,7 +68,7 @@ module Riak
68
68
  @parent.operate name, update(remove: element)
69
69
  end
70
70
 
71
-
71
+
72
72
  # Does the map containing this set have the context necessary to remove elements?
73
73
  #
74
74
  # @return [Boolean] if the set has a defined context
data/lib/riak/crdt/map.rb CHANGED
@@ -16,10 +16,10 @@ module Riak
16
16
  # * {InnerRegister}: a {String} value inside a map
17
17
  # * {InnerCounter}: a {Riak::Crdt::Counter}, but inside a map
18
18
  # * {InnerSet}: a {Riak::Crdt::Set}, but inside a map
19
- #
19
+ #
20
20
  class Map < Base
21
21
  attr_reader :counters, :flags, :maps, :registers, :sets
22
-
22
+
23
23
  # Create a map instance. The bucket type is determined by the first of
24
24
  # these sources:
25
25
  #
@@ -33,21 +33,21 @@ module Riak
33
33
  # @param [String] bucket_type The optional bucket type for this map.
34
34
  # The default is in `Crdt::Base::DEFAULT_BUCKET_TYPES[:map]`.
35
35
  # @param options [Hash]
36
- def initialize(bucket, key, bucket_type=nil, options={})
36
+ def initialize(bucket, key, bucket_type = nil, options = {})
37
37
  super(bucket, key, bucket_type || :map, options)
38
38
 
39
39
  if key
40
- initialize_collections
40
+ initialize_collections
41
41
  else
42
42
  initialize_blank_collections
43
43
  end
44
44
  end
45
45
 
46
- # Maps are frequently updated in batches. Use this method to get a
46
+ # Maps are frequently updated in batches. Use this method to get a
47
47
  # {BatchMap} to turn multiple operations into a single Riak update
48
48
  # request.
49
49
  #
50
- # @yieldparam batch_map [BatchMap] collects updates and other operations
50
+ # @yieldparam batch_map [BatchMap] collects updates and other operations
51
51
  def batch(*args)
52
52
  batch_map = BatchMap.new self
53
53
 
@@ -58,7 +58,7 @@ module Riak
58
58
 
59
59
  # This method *for internal use only* is used to collect oprations from
60
60
  # disparate sources to provide a user-friendly API.
61
- #
61
+ #
62
62
  # @api private
63
63
  def operate(operation, *args)
64
64
  batch *args do |m|
@@ -83,7 +83,7 @@ module Riak
83
83
  end
84
84
 
85
85
  alias :value :to_value_h
86
-
86
+
87
87
  private
88
88
  def vivify(data)
89
89
  @counters = TypedCollection.new InnerCounter, self, data[:counters]
@@ -93,7 +93,7 @@ module Riak
93
93
  @sets = TypedCollection.new InnerSet, self, data[:sets]
94
94
  end
95
95
 
96
- def initialize_collections(data={})
96
+ def initialize_collections(data = {})
97
97
  reload if dirty?
98
98
  end
99
99
 
data/lib/riak/crdt/set.rb CHANGED
@@ -6,7 +6,7 @@ module Riak
6
6
  # Uses the Ruby standard library `::Set` frequently, so the full class names will
7
7
  # be used frequently.
8
8
  class Set < Base
9
-
9
+
10
10
  # Create a set instance. The bucket type is determined by the first of
11
11
  # these sources:
12
12
  #
@@ -19,12 +19,12 @@ module Riak
19
19
  # Riak assign a key.
20
20
  # @param [String] bucket_type The optional bucket type for this set.
21
21
  # @param options [Hash]
22
- def initialize(bucket, key, bucket_type=nil, options={})
22
+ def initialize(bucket, key, bucket_type = nil, options = {})
23
23
  super(bucket, key, bucket_type || :set, options)
24
24
  end
25
25
 
26
26
  # Yields a `BatchSet` to proxy multiple set operations into a single
27
- # Riak update. The `BatchSet` has the same methods as this
27
+ # Riak update. The `BatchSet` has the same methods as this
28
28
  # {Riak::Crdt::Set}.
29
29
  #
30
30
  # @yieldparam batch_set [BatchSet] collects set operations
@@ -38,7 +38,7 @@ module Riak
38
38
  batcher = BatchSet.new self
39
39
 
40
40
  yield batcher
41
-
41
+
42
42
  operate batcher.operations
43
43
  end
44
44
 
@@ -53,7 +53,7 @@ module Riak
53
53
  end
54
54
 
55
55
  alias :value :members
56
-
56
+
57
57
  # Cast this {Riak::Crdt::Set} to a Ruby {Array}.
58
58
  #
59
59
  # @return [Array] array of set members
@@ -67,7 +67,7 @@ module Riak
67
67
  def empty?
68
68
  members.empty?
69
69
  end
70
-
70
+
71
71
  # Check to see if a given string is present in this data structure.
72
72
  #
73
73
  # @param [String] candidate string to check for inclusion in this structure
@@ -80,7 +80,7 @@ module Riak
80
80
  #
81
81
  # @param [String] element the element to add to the set
82
82
  # @param [Hash] options
83
- def add(element, options={})
83
+ def add(element, options = {})
84
84
  operate operation(:add, element), options
85
85
  end
86
86
 
@@ -88,13 +88,13 @@ module Riak
88
88
  #
89
89
  # @param [String] element to remove from the set
90
90
  # @param [Hash] options
91
- def remove(element, options={})
91
+ def remove(element, options = {})
92
92
  raise CrdtError::SetRemovalWithoutContextError unless context?
93
93
  operate operation(:remove, element), options
94
94
  end
95
95
 
96
96
  alias :delete :remove
97
-
97
+
98
98
  def pretty_print(pp)
99
99
  super pp do
100
100
  pp.comma_breakable
@@ -120,7 +120,7 @@ module Riak
120
120
  @adds = ::Set.new
121
121
  @removes = ::Set.new
122
122
  end
123
-
123
+
124
124
  def add(element)
125
125
  @adds.add element
126
126
  end
@@ -2,28 +2,17 @@ module Riak
2
2
  module Crdt
3
3
  # A collection of elements of a given type inside a {Map}.
4
4
  class TypedCollection
5
-
6
5
  ALREADY_WRAPPED = ::Set.new [InnerCounter, InnerFlag, InnerMap]
7
6
  NEEDS_NAME = ::Set.new [InnerCounter, InnerSet, InnerMap]
8
7
  INITIALIZE_NIL = ::Set.new [InnerRegister]
9
-
8
+
10
9
  # @api private
11
- def initialize(type, parent, contents={})
10
+ def initialize(type, parent, contents = {})
12
11
  @type = type
13
12
  @parent = parent
14
13
  contents = {} if contents.nil?
15
14
  stringified_contents = contents.stringify_keys
16
- @contents = stringified_contents.keys.inject(Hash.new) do |contents, key|
17
- contents.tap do |c|
18
- content = stringified_contents[key]
19
- if ALREADY_WRAPPED.include? content.class
20
- c[key] = content
21
- else
22
- c[key] = @type.new self, content
23
- end
24
- c[key].name = key if needs_name?
25
- end
26
- end
15
+ @contents = materialize_contents stringified_contents
27
16
  end
28
17
 
29
18
  def pretty_print(pp)
@@ -31,15 +20,15 @@ module Riak
31
20
  pp.breakable
32
21
  pp.text inspect_name
33
22
  pp.comma_breakable
34
- pp.text "parent="
23
+ pp.text 'parent='
35
24
  @parent.pretty_print_cycle(pp)
36
25
  pp.comma_breakable
37
- pp.text "contents="
26
+ pp.text 'contents='
38
27
  pp.pp @contents
39
28
  end
40
29
  # buf = []
41
30
  # buf << inspect_name
42
- # buf <<
31
+ # buf <<
43
32
  # buf << "contents={#{inspect_contents}}"
44
33
  # "#<#{self.class.name} #{buf.join ' '}>"
45
34
  end
@@ -55,8 +44,8 @@ module Riak
55
44
  "contains=#{content_name}"
56
45
  end
57
46
 
58
- def pretty_print_contents(pp)
59
- @contents.map do |k,v|
47
+ def pretty_print_contents(_pp)
48
+ @contents.map do |k, v|
60
49
  "#{k}=>#{v.inspect}"
61
50
  end.join ', '
62
51
  end
@@ -67,11 +56,11 @@ module Riak
67
56
 
68
57
  # @api private
69
58
  def reparent(new_parent)
70
- reparented = self.class.new(@type,
71
- new_parent,
72
- @contents)
59
+ self.class.new(@type,
60
+ new_parent,
61
+ @contents)
73
62
  end
74
-
63
+
75
64
  # Check if a value for a given key exists in this map.
76
65
  #
77
66
  # @param [String] key the key to check for
@@ -79,7 +68,7 @@ module Riak
79
68
  def include?(key)
80
69
  @contents.include? normalize_key(key)
81
70
  end
82
-
71
+
83
72
  # Get the value for a given key
84
73
  #
85
74
  # @param [String] key the key to get the value for
@@ -93,15 +82,15 @@ module Riak
93
82
  end
94
83
 
95
84
  return nil if initialize_nil?
96
-
85
+
97
86
  new_instance = @type.new self
98
87
  new_instance.name = key if needs_name?
99
88
 
100
- return new_instance
89
+ new_instance
101
90
  end
102
91
 
103
92
  # Set the value for a given key. Operation of this method
104
- # is only defined for {InnerCounter}, {InnerRegister}, and
93
+ # is only defined for {InnerCounter}, {InnerRegister}, and
105
94
  # {InnerFlag} types.
106
95
  #
107
96
  # @param [String] key the key to set a new value for
@@ -117,11 +106,11 @@ module Riak
117
106
 
118
107
  @contents[key] = @type.new self, value
119
108
  @contents[key].name = key if needs_name?
120
-
109
+
121
110
  result
122
111
  end
123
-
124
- alias :increment :[]=
112
+
113
+ alias_method :increment, :[]=
125
114
 
126
115
  # Remove the entry from the map.
127
116
  #
@@ -139,20 +128,19 @@ module Riak
139
128
  # @api private
140
129
  def operate(key, inner_operation)
141
130
  key = normalize_key key
142
-
131
+
143
132
  inner_operation.name = key
144
-
133
+
145
134
  @parent.operate inner_operation
146
135
  end
147
-
148
-
136
+
149
137
  # Does this set have the context necessary to remove elements?
150
138
  #
151
139
  # @return [Boolean] if the set has a defined context
152
140
  def context?
153
141
  !!@parent.context?
154
142
  end
155
-
143
+
156
144
  def to_value_h
157
145
  return @contents unless NEEDS_NAME.include? @type
158
146
 
@@ -162,6 +150,7 @@ module Riak
162
150
  end
163
151
 
164
152
  private
153
+
165
154
  def normalize_key(unnormalized_key)
166
155
  unnormalized_key.to_s
167
156
  end
@@ -169,10 +158,24 @@ module Riak
169
158
  def initialize_nil?
170
159
  INITIALIZE_NIL.include? @type
171
160
  end
172
-
161
+
173
162
  def needs_name?
174
163
  NEEDS_NAME.include? @type
175
164
  end
165
+
166
+ def materialize_contents(stringified_contents)
167
+ stringified_contents.keys.inject(Hash.new) do |new_contents, key|
168
+ new_contents.tap do |c|
169
+ content = stringified_contents[key]
170
+ if ALREADY_WRAPPED.include? content.class
171
+ c[key] = content
172
+ else
173
+ c[key] = @type.new self, content
174
+ end
175
+ c[key].name = key if needs_name?
176
+ end
177
+ end
178
+ end
176
179
  end
177
180
  end
178
181
  end