riak-client 2.2.0.pre1 → 2.2.0

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