Class: Dynamini::TestClient
- Inherits:
-
Object
- Object
- Dynamini::TestClient
- Defined in:
- lib/dynamini/test_client.rb
Overview
In-memory database client for test purposes.
Instance Attribute Summary collapse
-
#data ⇒ Object
readonly
Returns the value of attribute data.
-
#hash_key_attr ⇒ Object
readonly
Returns the value of attribute hash_key_attr.
-
#range_key_attr ⇒ Object
readonly
Returns the value of attribute range_key_attr.
Instance Method Summary collapse
-
#batch_get_item(args = {}) ⇒ Object
No range key support - use query instead.
-
#batch_write_item(request_options) ⇒ Object
TODO add range key support.
- #delete_item(args = {}) ⇒ Object
- #get_item(args = {}) ⇒ Object
- #get_table(table_name) ⇒ Object
-
#initialize(hash_key_attr, range_key_attr = nil) ⇒ TestClient
constructor
A new instance of TestClient.
- #query(args = {}) ⇒ Object
- #reset ⇒ Object
- #update_item(args = {}) ⇒ Object
Constructor Details
#initialize(hash_key_attr, range_key_attr = nil) ⇒ TestClient
Returns a new instance of TestClient.
9 10 11 12 13 |
# File 'lib/dynamini/test_client.rb', line 9 def initialize(hash_key_attr, range_key_attr = nil) @data = {} @hash_key_attr = hash_key_attr @range_key_attr = range_key_attr end |
Instance Attribute Details
#data ⇒ Object (readonly)
Returns the value of attribute data.
7 8 9 |
# File 'lib/dynamini/test_client.rb', line 7 def data @data end |
#hash_key_attr ⇒ Object (readonly)
Returns the value of attribute hash_key_attr.
7 8 9 |
# File 'lib/dynamini/test_client.rb', line 7 def hash_key_attr @hash_key_attr end |
#range_key_attr ⇒ Object (readonly)
Returns the value of attribute range_key_attr.
7 8 9 |
# File 'lib/dynamini/test_client.rb', line 7 def range_key_attr @range_key_attr end |
Instance Method Details
#batch_get_item(args = {}) ⇒ Object
No range key support - use query instead.
65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/dynamini/test_client.rb', line 65 def batch_get_item(args = {}) responses = {} args[:request_items].each do |table_name, get_request| responses[table_name] = [] get_request[:keys].each do |key_hash| item = get_table(table_name)[key_hash.values.first] responses[table_name] << item unless item.nil? end end OpenStruct.new(responses: responses) end |
#batch_write_item(request_options) ⇒ Object
TODO add range key support
80 81 82 83 84 85 86 87 88 |
# File 'lib/dynamini/test_client.rb', line 80 def batch_write_item() [:request_items].each do |table_name, put_requests| put_requests.each do |request_hash| item = request_hash[:put_request][:item] key = item[hash_key_attr.to_s] get_table(table_name)[key] = item end end end |
#delete_item(args = {}) ⇒ Object
90 91 92 |
# File 'lib/dynamini/test_client.rb', line 90 def delete_item(args = {}) get_table(args[:table_name]).delete(args[:key][hash_key_attr]) end |
#get_item(args = {}) ⇒ Object
52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/dynamini/test_client.rb', line 52 def get_item(args = {}) table = get_table(args[:table_name]) hash_key_value = args[:key][hash_key_attr] range_key_value = args[:key][range_key_attr] attributes_hash = table[hash_key_value] attributes_hash = attributes_hash[range_key_value] if attributes_hash && range_key_value OpenStruct.new(item: attributes_hash) end |
#get_table(table_name) ⇒ Object
15 16 17 |
# File 'lib/dynamini/test_client.rb', line 15 def get_table(table_name) @data[table_name] ||= {} end |
#query(args = {}) ⇒ Object
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
# File 'lib/dynamini/test_client.rb', line 94 def query(args = {}) # Possible key condition structures: # "foo = val" # "foo = val AND bar <= val2" # "foo = val AND bar >= val2" # "foo = val AND bar BETWEEN val2 AND val3" args[:expression_attribute_values].each do |symbol, value| args[:key_condition_expression].gsub!(symbol, value.to_s) end tokens = args[:key_condition_expression].split(/\s+/) hash_key = tokens[2] case tokens[5] when ">=" start_val = tokens[6] end_val = nil when "<=" start_val = nil end_val = tokens[6] when "BETWEEN" start_val = tokens[6] end_val = tokens[8] else start_val = nil end_val = nil end parent = get_table(args[:table_name])[hash_key] return OpenStruct.new(items:[]) unless parent selected = parent.values selected = selected.select{ |item| item[@range_key_attr] >= start_val.to_f } if start_val selected = selected.select{ |item| item[@range_key_attr] <= end_val.to_f } if end_val OpenStruct.new(items: selected) end |
#reset ⇒ Object
131 132 133 |
# File 'lib/dynamini/test_client.rb', line 131 def reset @data = {} end |
#update_item(args = {}) ⇒ Object
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/dynamini/test_client.rb', line 19 def update_item(args = {}) table = get_table(args[:table_name]) keys = args[:key] hash_key_value = keys[hash_key_attr] range_key_value = keys[range_key_attr] updates = flatten_attribute_updates(args).merge( hash_key_attr => hash_key_value ) if hash_key_value if range_key_value updates.merge!(range_key_attr => range_key_value) if table[hash_key_value] && table[hash_key_value][range_key_value] table[hash_key_value][range_key_value].merge! updates else table[hash_key_value] ||= {} table[hash_key_value][range_key_value] = updates end else if table[hash_key_value] table[hash_key_value].merge!(updates) else table[hash_key_value] = updates end end end end |