dynamoid 0.6.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Dynamoid.gemspec +3 -3
- data/VERSION +1 -1
- data/lib/dynamoid/persistence.rb +3 -1
- data/spec/dynamoid/adapter/aws_sdk_spec.rb +329 -345
- data/spec/dynamoid/persistence_spec.rb +29 -15
- data/spec/spec_helper.rb +9 -5
- metadata +4 -4
data/Dynamoid.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "dynamoid"
|
8
|
-
s.version = "0.6.
|
8
|
+
s.version = "0.6.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Josh Symonds"]
|
12
|
-
s.date = "
|
12
|
+
s.date = "2013-01-09"
|
13
13
|
s.description = "Dynamoid is an ORM for Amazon's DynamoDB that supports offline development, associations, querying, and everything else you'd expect from an ActiveRecord-style replacement."
|
14
14
|
s.email = "josh@joshsymonds.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -139,7 +139,7 @@ Gem::Specification.new do |s|
|
|
139
139
|
s.homepage = "http://github.com/Veraticus/Dynamoid"
|
140
140
|
s.licenses = ["MIT"]
|
141
141
|
s.require_paths = ["lib"]
|
142
|
-
s.rubygems_version = "1.8.
|
142
|
+
s.rubygems_version = "1.8.23"
|
143
143
|
s.summary = "Dynamoid is an ORM for Amazon's DynamoDB"
|
144
144
|
|
145
145
|
if s.respond_to? :specification_version then
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.6.
|
1
|
+
0.6.1
|
data/lib/dynamoid/persistence.rb
CHANGED
@@ -69,7 +69,7 @@ module Dynamoid
|
|
69
69
|
self.attributes.each do |attribute, options|
|
70
70
|
hash[attribute] = undump_field(incoming[attribute], options)
|
71
71
|
end
|
72
|
-
incoming.each {|attribute, value| hash[attribute]
|
72
|
+
incoming.each {|attribute, value| hash[attribute] = value unless hash.has_key? attribute }
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
@@ -118,6 +118,8 @@ module Dynamoid
|
|
118
118
|
else
|
119
119
|
raise ArgumentError, "Boolean column neither true nor false"
|
120
120
|
end
|
121
|
+
else
|
122
|
+
raise ArgumentError, "Unknown type #{options[:type]}"
|
121
123
|
end
|
122
124
|
end
|
123
125
|
|
@@ -2,382 +2,366 @@ require 'dynamoid/adapter/aws_sdk'
|
|
2
2
|
require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper')
|
3
3
|
|
4
4
|
describe Dynamoid::Adapter::AwsSdk do
|
5
|
+
before(:each) do
|
6
|
+
pending "You must have an active DynamoDB connection" unless ENV['ACCESS_KEY'] && ENV['SECRET_KEY']
|
7
|
+
end
|
5
8
|
|
6
|
-
|
9
|
+
#
|
10
|
+
# These let() definitions create tables "dynamoid_tests_TestTable<N>" and return the
|
11
|
+
# name of the table. An after(:each) handler drops any tables created this way after each test
|
12
|
+
#
|
13
|
+
# Name => Constructor args
|
14
|
+
{
|
15
|
+
1 => [:id],
|
16
|
+
2 => [:id],
|
17
|
+
3 => [:id, {:range_key => {:range => :number}}],
|
18
|
+
4 => [:id, {:range_key => {:range => :number}}]
|
19
|
+
}.each do |n, args|
|
20
|
+
name = "dynamoid_tests_TestTable#{n}"
|
21
|
+
let(:"test_table#{n}") do
|
22
|
+
Dynamoid::Adapter.create_table(name, *args)
|
23
|
+
@created_tables << name
|
24
|
+
name
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
before(:each) { @created_tables = [] }
|
29
|
+
after(:each) do
|
30
|
+
@created_tables.each do |t|
|
31
|
+
Dynamoid::Adapter.delete_table(t)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
#
|
36
|
+
# Returns a random key parition if partitioning is on, or an empty string if
|
37
|
+
# it is off, useful for shared examples where partitioning may or may not be on
|
38
|
+
#
|
39
|
+
def key_partition
|
40
|
+
Dynamoid::Config.partitioning? ? ".#{Random.rand(Dynamoid::Config.partition_size)}" : ''
|
41
|
+
end
|
42
|
+
|
43
|
+
#
|
44
|
+
# Tests adapter against ranged tables
|
45
|
+
#
|
46
|
+
shared_examples 'range queries' do
|
47
|
+
before do
|
48
|
+
Dynamoid::Adapter.put_item(test_table3, {:id => "1#{key_partition}", :range => 1.0})
|
49
|
+
Dynamoid::Adapter.put_item(test_table3, {:id => "1#{key_partition}", :range => 3.0})
|
50
|
+
end
|
7
51
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
table = Dynamoid::Adapter.create_table('CreateTable', :id, :range_key => { :created_at => :number })
|
52
|
+
it 'performs query on a table with a range and selects items in a range' do
|
53
|
+
Dynamoid::Adapter.query(test_table3, :hash_value => '1', :range_value => 0.0..3.0).should =~ [{:id => '1', :range => BigDecimal.new(1)}, {:id => '1', :range => BigDecimal.new(3)}]
|
54
|
+
end
|
12
55
|
|
13
|
-
|
56
|
+
it 'performs query on a table with a range and selects items greater than' do
|
57
|
+
Dynamoid::Adapter.query(test_table3, :hash_value => '1', :range_greater_than => 1.0).should =~ [{:id => '1', :range => BigDecimal.new(3)}]
|
58
|
+
end
|
14
59
|
|
15
|
-
|
16
|
-
|
60
|
+
it 'performs query on a table with a range and selects items less than' do
|
61
|
+
Dynamoid::Adapter.query(test_table3, :hash_value => '1', :range_less_than => 2.0).should =~ [{:id => '1', :range => BigDecimal.new(1)}]
|
17
62
|
end
|
18
63
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
Dynamoid::Adapter.create_table('dynamoid_tests_TestTable2', :id) unless Dynamoid::Adapter.list_tables.include?('dynamoid_tests_TestTable2')
|
23
|
-
Dynamoid::Adapter.create_table('dynamoid_tests_TestTable3', :id, :range_key => { :range => :number }) unless Dynamoid::Adapter.list_tables.include?('dynamoid_tests_TestTable3')
|
24
|
-
Dynamoid::Adapter.create_table('dynamoid_tests_TestTable4', :id, :range_key => { :range => :number }) unless Dynamoid::Adapter.list_tables.include?('dynamoid_tests_TestTable4')
|
25
|
-
end
|
64
|
+
it 'performs query on a table with a range and selects items gte' do
|
65
|
+
Dynamoid::Adapter.query(test_table3, :hash_value => '1', :range_gte => 1.0).should =~ [{:id => '1', :range => BigDecimal.new(1)}, {:id => '1', :range => BigDecimal.new(3)}]
|
66
|
+
end
|
26
67
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
68
|
+
it 'performs query on a table with a range and selects items lte' do
|
69
|
+
Dynamoid::Adapter.query(test_table3, :hash_value => '1', :range_lte => 3.0).should =~ [{:id => '1', :range => BigDecimal.new(1)}, {:id => '1', :range => BigDecimal.new(3)}]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
#
|
74
|
+
# Tests scan_index_forwards flag behavior on range queries
|
75
|
+
#
|
76
|
+
shared_examples 'correct ordering' do
|
77
|
+
before(:each) do
|
78
|
+
pending "Order is not preserved on paritioned tables" if(Dynamoid::Config.partitioning?)
|
79
|
+
Dynamoid::Adapter.put_item(test_table4, {:id => "1#{key_partition}", :order => 1, :range => 1.0})
|
80
|
+
Dynamoid::Adapter.put_item(test_table4, {:id => "1#{key_partition}", :order => 2, :range => 2.0})
|
81
|
+
Dynamoid::Adapter.put_item(test_table4, {:id => "1#{key_partition}", :order => 3, :range => 3.0})
|
82
|
+
Dynamoid::Adapter.put_item(test_table4, {:id => "1#{key_partition}", :order => 4, :range => 4.0})
|
83
|
+
Dynamoid::Adapter.put_item(test_table4, {:id => "1#{key_partition}", :order => 5, :range => 5.0})
|
84
|
+
Dynamoid::Adapter.put_item(test_table4, {:id => "1#{key_partition}", :order => 6, :range => 6.0})
|
85
|
+
end
|
31
86
|
|
32
|
-
|
33
|
-
|
87
|
+
it 'performs query on a table with a range and selects items less than that is in the correct order, scan_index_forward true' do
|
88
|
+
query = Dynamoid::Adapter.query(test_table4, :hash_value => '1', :range_greater_than => 0, :scan_index_forward => true)
|
89
|
+
query[0].should == {:id => '1', :order => 1, :range => BigDecimal.new(1)}
|
90
|
+
query[1].should == {:id => '1', :order => 2, :range => BigDecimal.new(2)}
|
91
|
+
query[2].should == {:id => '1', :order => 3, :range => BigDecimal.new(3)}
|
92
|
+
query[3].should == {:id => '1', :order => 4, :range => BigDecimal.new(4)}
|
93
|
+
query[4].should == {:id => '1', :order => 5, :range => BigDecimal.new(5)}
|
94
|
+
query[5].should == {:id => '1', :order => 6, :range => BigDecimal.new(6)}
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'performs query on a table with a range and selects items less than that is in the correct order, scan_index_forward false' do
|
98
|
+
query = Dynamoid::Adapter.query(test_table4, :hash_value => '1', :range_greater_than => 0, :scan_index_forward => false)
|
99
|
+
query[5].should == {:id => '1', :order => 1, :range => BigDecimal.new(1)}
|
100
|
+
query[4].should == {:id => '1', :order => 2, :range => BigDecimal.new(2)}
|
101
|
+
query[3].should == {:id => '1', :order => 3, :range => BigDecimal.new(3)}
|
102
|
+
query[2].should == {:id => '1', :order => 4, :range => BigDecimal.new(4)}
|
103
|
+
query[1].should == {:id => '1', :order => 5, :range => BigDecimal.new(5)}
|
104
|
+
query[0].should == {:id => '1', :order => 6, :range => BigDecimal.new(6)}
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
context 'without a preexisting table' do
|
110
|
+
# CreateTable and DeleteTable
|
111
|
+
it 'performs CreateTable and DeleteTable' do
|
112
|
+
table = Dynamoid::Adapter.create_table('CreateTable', :id, :range_key => { :created_at => :number })
|
34
113
|
|
35
|
-
|
114
|
+
Dynamoid::Adapter.connection.tables.collect{|t| t.name}.should include 'CreateTable'
|
36
115
|
|
37
|
-
|
116
|
+
Dynamoid::Adapter.delete_table('CreateTable')
|
117
|
+
end
|
118
|
+
end
|
38
119
|
|
39
|
-
Dynamoid::Adapter.get_item('dynamoid_tests_TestTable1', '1').should be_nil
|
40
|
-
end
|
41
120
|
|
42
|
-
|
43
|
-
|
121
|
+
context 'with a preexisting table without paritioning' do
|
122
|
+
# GetItem, PutItem and DeleteItem
|
123
|
+
it "performs GetItem for an item that does not exist" do
|
124
|
+
Dynamoid::Adapter.get_item(test_table1, '1').should be_nil
|
125
|
+
end
|
44
126
|
|
45
|
-
|
127
|
+
it "performs GetItem for an item that does exist" do
|
128
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '1', :name => 'Josh'})
|
46
129
|
|
47
|
-
|
130
|
+
Dynamoid::Adapter.get_item(test_table1, '1').should == {:name => 'Josh', :id => '1'}
|
48
131
|
|
49
|
-
|
50
|
-
end
|
132
|
+
Dynamoid::Adapter.delete_item(test_table1, '1')
|
51
133
|
|
52
|
-
|
53
|
-
|
134
|
+
Dynamoid::Adapter.get_item(test_table1, '1').should be_nil
|
135
|
+
end
|
54
136
|
|
55
|
-
|
56
|
-
|
137
|
+
it 'performs GetItem for an item that does exist with a range key' do
|
138
|
+
Dynamoid::Adapter.put_item(test_table3, {:id => '1', :name => 'Josh', :range => 2.0})
|
57
139
|
|
58
|
-
|
59
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '1', :name => 'Josh'})
|
140
|
+
Dynamoid::Adapter.get_item(test_table3, '1', :range_key => 2.0).should == {:name => 'Josh', :id => '1', :range => 2.0}
|
60
141
|
|
61
|
-
|
62
|
-
end
|
142
|
+
Dynamoid::Adapter.delete_item(test_table3, '1', :range_key => 2.0)
|
63
143
|
|
64
|
-
|
65
|
-
|
66
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '1', :name => 'Josh'})
|
67
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable2', {:id => '1', :name => 'Justin'})
|
144
|
+
Dynamoid::Adapter.get_item(test_table3, '1', :range_key => 2.0).should be_nil
|
145
|
+
end
|
68
146
|
|
69
|
-
|
70
|
-
|
71
|
-
results['dynamoid_tests_TestTable1'].should include({:name => 'Josh', :id => '1'})
|
72
|
-
results['dynamoid_tests_TestTable2'].should include({:name => 'Justin', :id => '1'})
|
73
|
-
end
|
147
|
+
it 'performs DeleteItem for an item that does not exist' do
|
148
|
+
Dynamoid::Adapter.delete_item(test_table1, '1')
|
74
149
|
|
75
|
-
|
76
|
-
|
77
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '2', :name => 'Justin'})
|
150
|
+
Dynamoid::Adapter.get_item(test_table1, '1').should be_nil
|
151
|
+
end
|
78
152
|
|
79
|
-
|
80
|
-
|
81
|
-
results['dynamoid_tests_TestTable1'].should include({:name => 'Josh', :id => '1'})
|
82
|
-
results['dynamoid_tests_TestTable1'].should include({:name => 'Justin', :id => '2'})
|
83
|
-
end
|
153
|
+
it 'performs PutItem for an item that does not exist' do
|
154
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '1', :name => 'Josh'})
|
84
155
|
|
85
|
-
|
86
|
-
|
87
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable3', {:id => '2', :name => 'Justin', :range => 2.0})
|
156
|
+
Dynamoid::Adapter.get_item(test_table1, '1').should == {:id => '1', :name => 'Josh'}
|
157
|
+
end
|
88
158
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
159
|
+
# BatchGetItem
|
160
|
+
it "performs BatchGetItem with singular keys" do
|
161
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '1', :name => 'Josh'})
|
162
|
+
Dynamoid::Adapter.put_item(test_table2, {:id => '1', :name => 'Justin'})
|
93
163
|
|
94
|
-
|
95
|
-
|
96
|
-
|
164
|
+
results = Dynamoid::Adapter.batch_get_item(test_table1 => '1', test_table2 => '1')
|
165
|
+
results.size.should == 2
|
166
|
+
results[test_table1].should include({:name => 'Josh', :id => '1'})
|
167
|
+
results[test_table2].should include({:name => 'Justin', :id => '1'})
|
168
|
+
end
|
169
|
+
|
170
|
+
it "performs BatchGetItem with multiple keys" do
|
171
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '1', :name => 'Josh'})
|
172
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '2', :name => 'Justin'})
|
173
|
+
|
174
|
+
results = Dynamoid::Adapter.batch_get_item(test_table1 => ['1', '2'])
|
175
|
+
results.size.should == 1
|
176
|
+
results[test_table1].should include({:name => 'Josh', :id => '1'})
|
177
|
+
results[test_table1].should include({:name => 'Justin', :id => '2'})
|
178
|
+
end
|
179
|
+
|
180
|
+
it 'performs BatchGetItem with one ranged key' do
|
181
|
+
Dynamoid::Adapter.put_item(test_table3, {:id => '1', :name => 'Josh', :range => 1.0})
|
182
|
+
Dynamoid::Adapter.put_item(test_table3, {:id => '2', :name => 'Justin', :range => 2.0})
|
183
|
+
|
184
|
+
results = Dynamoid::Adapter.batch_get_item(test_table3 => [['1', 1.0]])
|
185
|
+
results.size.should == 1
|
186
|
+
results[test_table3].should include({:name => 'Josh', :id => '1', :range => 1.0})
|
187
|
+
end
|
188
|
+
|
189
|
+
it 'performs BatchGetItem with multiple ranged keys' do
|
190
|
+
Dynamoid::Adapter.put_item(test_table3, {:id => '1', :name => 'Josh', :range => 1.0})
|
191
|
+
Dynamoid::Adapter.put_item(test_table3, {:id => '2', :name => 'Justin', :range => 2.0})
|
192
|
+
|
193
|
+
results = Dynamoid::Adapter.batch_get_item(test_table3 => [['1', 1.0],['2', 2.0]])
|
194
|
+
results.size.should == 1
|
195
|
+
results[test_table3].should include({:name => 'Josh', :id => '1', :range => 1.0})
|
196
|
+
results[test_table3].should include({:name => 'Justin', :id => '2', :range => 2.0})
|
197
|
+
end
|
198
|
+
|
199
|
+
# BatchDeleteItem
|
200
|
+
it "performs BatchDeleteItem with singular keys" do
|
201
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '1', :name => 'Josh'})
|
202
|
+
Dynamoid::Adapter.put_item(test_table2, {:id => '1', :name => 'Justin'})
|
97
203
|
|
98
|
-
|
99
|
-
results.size.should == 1
|
100
|
-
results['dynamoid_tests_TestTable3'].should include({:name => 'Josh', :id => '1', :range => 1.0})
|
101
|
-
results['dynamoid_tests_TestTable3'].should include({:name => 'Justin', :id => '2', :range => 2.0})
|
102
|
-
end
|
204
|
+
Dynamoid::Adapter.batch_delete_item(test_table1 => ['1'], test_table2 => ['1'])
|
103
205
|
|
104
|
-
|
105
|
-
|
106
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '1', :name => 'Josh'})
|
107
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable2', {:id => '1', :name => 'Justin'})
|
108
|
-
|
109
|
-
Dynamoid::Adapter.batch_delete_item('dynamoid_tests_TestTable1' => ['1'], 'dynamoid_tests_TestTable2' => ['1'])
|
110
|
-
|
111
|
-
results = Dynamoid::Adapter.batch_get_item('dynamoid_tests_TestTable1' => '1', 'dynamoid_tests_TestTable2' => '1')
|
112
|
-
results.size.should == 0
|
113
|
-
|
114
|
-
results['dynamoid_tests_TestTable1'].should_not include({:name => 'Josh', :id => '1'})
|
115
|
-
results['dynamoid_tests_TestTable2'].should_not include({:name => 'Justin', :id => '1'})
|
116
|
-
end
|
117
|
-
|
118
|
-
it "performs BatchDeleteItem with multiple keys" do
|
119
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '1', :name => 'Josh'})
|
120
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '2', :name => 'Justin'})
|
121
|
-
|
122
|
-
Dynamoid::Adapter.batch_delete_item('dynamoid_tests_TestTable1' => ['1', '2'])
|
123
|
-
|
124
|
-
results = Dynamoid::Adapter.batch_get_item('dynamoid_tests_TestTable1' => ['1', '2'])
|
125
|
-
results.size.should == 0
|
126
|
-
|
127
|
-
results['dynamoid_tests_TestTable1'].should_not include({:name => 'Josh', :id => '1'})
|
128
|
-
results['dynamoid_tests_TestTable1'].should_not include({:name => 'Justin', :id => '2'})
|
129
|
-
end
|
130
|
-
|
131
|
-
it 'performs BatchDeleteItem with one ranged key' do
|
132
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable3', {:id => '1', :name => 'Josh', :range => 1.0})
|
133
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable3', {:id => '2', :name => 'Justin', :range => 2.0})
|
134
|
-
|
135
|
-
Dynamoid::Adapter.batch_delete_item('dynamoid_tests_TestTable3' => [['1', 1.0]])
|
136
|
-
results = Dynamoid::Adapter.batch_get_item('dynamoid_tests_TestTable3' => [['1', 1.0]])
|
137
|
-
results.size.should == 0
|
138
|
-
|
139
|
-
results['dynamoid_tests_TestTable3'].should_not include({:name => 'Josh', :id => '1', :range => 1.0})
|
140
|
-
end
|
141
|
-
|
142
|
-
it 'performs BatchDeleteItem with multiple ranged keys' do
|
143
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable3', {:id => '1', :name => 'Josh', :range => 1.0})
|
144
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable3', {:id => '2', :name => 'Justin', :range => 2.0})
|
145
|
-
|
146
|
-
Dynamoid::Adapter.batch_delete_item('dynamoid_tests_TestTable3' => [['1', 1.0],['2', 2.0]])
|
147
|
-
results = Dynamoid::Adapter.batch_get_item('dynamoid_tests_TestTable3' => [['1', 1.0],['2', 2.0]])
|
148
|
-
results.size.should == 0
|
149
|
-
|
150
|
-
results['dynamoid_tests_TestTable3'].should_not include({:name => 'Josh', :id => '1', :range => 1.0})
|
151
|
-
results['dynamoid_tests_TestTable3'].should_not include({:name => 'Justin', :id => '2', :range => 2.0})
|
152
|
-
end
|
153
|
-
|
154
|
-
# ListTables
|
155
|
-
it 'performs ListTables' do
|
156
|
-
Dynamoid::Adapter.list_tables.should include 'dynamoid_tests_TestTable1'
|
157
|
-
Dynamoid::Adapter.list_tables.should include 'dynamoid_tests_TestTable2'
|
158
|
-
end
|
159
|
-
|
160
|
-
# Query
|
161
|
-
it 'performs query on a table and returns items' do
|
162
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '1', :name => 'Josh'})
|
163
|
-
|
164
|
-
Dynamoid::Adapter.query('dynamoid_tests_TestTable1', :hash_value => '1').should == { :id=> '1', :name=>"Josh" }
|
165
|
-
end
|
166
|
-
|
167
|
-
it 'performs query on a table and returns items if there are multiple items' do
|
168
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '1', :name => 'Josh'})
|
169
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '2', :name => 'Justin'})
|
170
|
-
|
171
|
-
Dynamoid::Adapter.query('dynamoid_tests_TestTable1', :hash_value => '1').should == { :id=> '1', :name=>"Josh" }
|
172
|
-
end
|
173
|
-
|
174
|
-
context 'range queries' do
|
175
|
-
before do
|
176
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable3', {:id => '1', :range => 1.0})
|
177
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable3', {:id => '1', :range => 3.0})
|
178
|
-
end
|
179
|
-
|
180
|
-
it 'performs query on a table with a range and selects items in a range' do
|
181
|
-
Dynamoid::Adapter.query('dynamoid_tests_TestTable3', :hash_value => '1', :range_value => 0.0..3.0).should =~ [{:id => '1', :range => BigDecimal.new(1)}, {:id => '1', :range => BigDecimal.new(3)}]
|
182
|
-
end
|
183
|
-
|
184
|
-
it 'performs query on a table with a range and selects items greater than' do
|
185
|
-
Dynamoid::Adapter.query('dynamoid_tests_TestTable3', :hash_value => '1', :range_greater_than => 1.0).should =~ [{:id => '1', :range => BigDecimal.new(3)}]
|
186
|
-
end
|
187
|
-
|
188
|
-
it 'performs query on a table with a range and selects items less than' do
|
189
|
-
Dynamoid::Adapter.query('dynamoid_tests_TestTable3', :hash_value => '1', :range_less_than => 2.0).should =~ [{:id => '1', :range => BigDecimal.new(1)}]
|
190
|
-
end
|
191
|
-
|
192
|
-
it 'performs query on a table with a range and selects items gte' do
|
193
|
-
Dynamoid::Adapter.query('dynamoid_tests_TestTable3', :hash_value => '1', :range_gte => 1.0).should =~ [{:id => '1', :range => BigDecimal.new(1)}, {:id => '1', :range => BigDecimal.new(3)}]
|
194
|
-
end
|
195
|
-
|
196
|
-
it 'performs query on a table with a range and selects items lte' do
|
197
|
-
Dynamoid::Adapter.query('dynamoid_tests_TestTable3', :hash_value => '1', :range_lte => 3.0).should =~ [{:id => '1', :range => BigDecimal.new(1)}, {:id => '1', :range => BigDecimal.new(3)}]
|
198
|
-
end
|
199
|
-
end
|
200
|
-
|
201
|
-
# Scan
|
202
|
-
it 'performs scan on a table and returns items' do
|
203
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '1', :name => 'Josh'})
|
204
|
-
|
205
|
-
Dynamoid::Adapter.scan('dynamoid_tests_TestTable1', :name => 'Josh').should == [{ :id=> '1', :name=>"Josh" }]
|
206
|
-
end
|
207
|
-
|
208
|
-
it 'performs scan on a table and returns items if there are multiple items but only one match' do
|
209
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '1', :name => 'Josh'})
|
210
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '2', :name => 'Justin'})
|
211
|
-
|
212
|
-
Dynamoid::Adapter.scan('dynamoid_tests_TestTable1', :name => 'Josh').should == [{ :id=> '1', :name=>"Josh" }]
|
213
|
-
end
|
214
|
-
|
215
|
-
it 'performs scan on a table and returns multiple items if there are multiple matches' do
|
216
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '1', :name => 'Josh'})
|
217
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '2', :name => 'Josh'})
|
218
|
-
|
219
|
-
Dynamoid::Adapter.scan('dynamoid_tests_TestTable1', :name => 'Josh').should include({:name=>"Josh", :id=>"2"}, {:name=>"Josh", :id=>"1"})
|
220
|
-
end
|
221
|
-
|
222
|
-
it 'performs scan on a table and returns all items if no criteria are specified' do
|
223
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '1', :name => 'Josh'})
|
224
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '2', :name => 'Josh'})
|
225
|
-
|
226
|
-
Dynamoid::Adapter.scan('dynamoid_tests_TestTable1', {}).should include({:name=>"Josh", :id=>"2"}, {:name=>"Josh", :id=>"1"})
|
227
|
-
end
|
206
|
+
results = Dynamoid::Adapter.batch_get_item(test_table1 => '1', test_table2 => '1')
|
207
|
+
results.size.should == 0
|
228
208
|
|
229
|
-
|
230
|
-
|
231
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable4', {:id => '1', :order => 1, :range => 1.0})
|
232
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable4', {:id => '1', :order => 2, :range => 2.0})
|
233
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable4', {:id => '1', :order => 3, :range => 3.0})
|
234
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable4', {:id => '1', :order => 4, :range => 4.0})
|
235
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable4', {:id => '1', :order => 5, :range => 5.0})
|
236
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable4', {:id => '1', :order => 6, :range => 6.0})
|
237
|
-
end
|
238
|
-
|
239
|
-
it 'performs query on a table with a range and selects items less than that is in the correct order, scan_index_forward true' do
|
240
|
-
query = Dynamoid::Adapter.query('dynamoid_tests_TestTable4', :hash_value => '1', :range_greater_than => 0, :scan_index_forward => true)
|
241
|
-
query[0].should == {:id => '1', :order => 1, :range => BigDecimal.new(1)}
|
242
|
-
query[1].should == {:id => '1', :order => 2, :range => BigDecimal.new(2)}
|
243
|
-
query[2].should == {:id => '1', :order => 3, :range => BigDecimal.new(3)}
|
244
|
-
query[3].should == {:id => '1', :order => 4, :range => BigDecimal.new(4)}
|
245
|
-
query[4].should == {:id => '1', :order => 5, :range => BigDecimal.new(5)}
|
246
|
-
query[5].should == {:id => '1', :order => 6, :range => BigDecimal.new(6)}
|
247
|
-
end
|
248
|
-
|
249
|
-
it 'performs query on a table with a range and selects items less than that is in the correct order, scan_index_forward false' do
|
250
|
-
query = Dynamoid::Adapter.query('dynamoid_tests_TestTable4', :hash_value => '1', :range_greater_than => 0, :scan_index_forward => false)
|
251
|
-
query[5].should == {:id => '1', :order => 1, :range => BigDecimal.new(1)}
|
252
|
-
query[4].should == {:id => '1', :order => 2, :range => BigDecimal.new(2)}
|
253
|
-
query[3].should == {:id => '1', :order => 3, :range => BigDecimal.new(3)}
|
254
|
-
query[2].should == {:id => '1', :order => 4, :range => BigDecimal.new(4)}
|
255
|
-
query[1].should == {:id => '1', :order => 5, :range => BigDecimal.new(5)}
|
256
|
-
query[0].should == {:id => '1', :order => 6, :range => BigDecimal.new(6)}
|
257
|
-
end
|
258
|
-
end
|
209
|
+
results[test_table1].should_not include({:name => 'Josh', :id => '1'})
|
210
|
+
results[test_table2].should_not include({:name => 'Justin', :id => '1'})
|
259
211
|
end
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
end
|
270
|
-
|
271
|
-
after(:all) do
|
272
|
-
Dynamoid::Config.partitioning = @previous_value
|
273
|
-
end
|
274
|
-
|
275
|
-
# Query
|
276
|
-
it 'performs query on a table and returns items' do
|
277
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '1.1', :name => 'Josh'})
|
278
|
-
|
279
|
-
Dynamoid::Adapter.query('dynamoid_tests_TestTable1', :hash_value => '1').first.should == { :id=> '1', :name=>"Josh" }
|
280
|
-
end
|
281
|
-
|
282
|
-
it 'performs query on a table and returns items if there are multiple items' do
|
283
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '1.1', :name => 'Josh'})
|
284
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '2.1', :name => 'Justin'})
|
285
|
-
|
286
|
-
Dynamoid::Adapter.query('dynamoid_tests_TestTable1', :hash_value => '1').first.should == { :id=> '1', :name=>"Josh" }
|
287
|
-
end
|
288
|
-
|
289
|
-
context 'range queries' do
|
290
|
-
before do
|
291
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable3', {:id => '1.1', :range => 1.0})
|
292
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable3', {:id => '1.1', :range => 3.0})
|
293
|
-
end
|
294
|
-
|
295
|
-
it 'performs query on a table with a range and selects items in a range' do
|
296
|
-
Dynamoid::Adapter.query('dynamoid_tests_TestTable3', :hash_value => '1', :range_value => 0.0..3.0).should =~ [{:id => '1', :range => BigDecimal.new(1)}, {:id => '1', :range => BigDecimal.new(3)}]
|
297
|
-
end
|
298
|
-
|
299
|
-
it 'performs query on a table with a range and selects items greater than' do
|
300
|
-
Dynamoid::Adapter.query('dynamoid_tests_TestTable3', :hash_value => '1', :range_greater_than => 1.0).should =~ [{:id => '1', :range => BigDecimal.new(3)}]
|
301
|
-
end
|
302
|
-
|
303
|
-
it 'performs query on a table with a range and selects items less than' do
|
304
|
-
Dynamoid::Adapter.query('dynamoid_tests_TestTable3', :hash_value => '1', :range_less_than => 2.0).should =~ [{:id => '1', :range => BigDecimal.new(1)}]
|
305
|
-
end
|
306
|
-
|
307
|
-
it 'performs query on a table with a range and selects items gte' do
|
308
|
-
Dynamoid::Adapter.query('dynamoid_tests_TestTable3', :hash_value => '1', :range_gte => 1.0).should =~ [{:id => '1', :range => BigDecimal.new(1)}, {:id => '1', :range => BigDecimal.new(3)}]
|
309
|
-
end
|
310
|
-
|
311
|
-
it 'performs query on a table with a range and selects items lte' do
|
312
|
-
Dynamoid::Adapter.query('dynamoid_tests_TestTable3', :hash_value => '1', :range_lte => 3.0).should =~ [{:id => '1', :range => BigDecimal.new(1)}, {:id => '1', :range => BigDecimal.new(3)}]
|
313
|
-
end
|
314
|
-
end
|
315
|
-
|
316
|
-
# Scan
|
317
|
-
it 'performs scan on a table and returns items' do
|
318
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '1.1', :name => 'Josh'})
|
319
|
-
|
320
|
-
Dynamoid::Adapter.scan('dynamoid_tests_TestTable1', :name => 'Josh').should == [{ :id=> '1', :name=>"Josh" }]
|
321
|
-
end
|
322
|
-
|
323
|
-
it 'performs scan on a table and returns items if there are multiple items but only one match' do
|
324
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '1.1', :name => 'Josh'})
|
325
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '2.1', :name => 'Justin'})
|
326
|
-
|
327
|
-
Dynamoid::Adapter.scan('dynamoid_tests_TestTable1', :name => 'Josh').should == [{ :id=> '1', :name=>"Josh" }]
|
328
|
-
end
|
329
|
-
|
330
|
-
it 'performs scan on a table and returns multiple items if there are multiple matches' do
|
331
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '1.1', :name => 'Josh'})
|
332
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '2.1', :name => 'Josh'})
|
333
|
-
|
334
|
-
Dynamoid::Adapter.scan('dynamoid_tests_TestTable1', :name => 'Josh').should include({:name=>"Josh", :id=>"2"}, {:name=>"Josh", :id=>"1"})
|
335
|
-
end
|
336
|
-
|
337
|
-
it 'performs scan on a table and returns all items if no criteria are specified' do
|
338
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '1.1', :name => 'Josh'})
|
339
|
-
Dynamoid::Adapter.put_item('dynamoid_tests_TestTable1', {:id => '2.1', :name => 'Josh'})
|
340
|
-
|
341
|
-
Dynamoid::Adapter.scan('dynamoid_tests_TestTable1', {}).should include({:name=>"Josh", :id=>"2"}, {:name=>"Josh", :id=>"1"})
|
342
|
-
end
|
212
|
+
|
213
|
+
it "performs BatchDeleteItem with multiple keys" do
|
214
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '1', :name => 'Josh'})
|
215
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '2', :name => 'Justin'})
|
216
|
+
|
217
|
+
Dynamoid::Adapter.batch_delete_item(test_table1 => ['1', '2'])
|
218
|
+
|
219
|
+
results = Dynamoid::Adapter.batch_get_item(test_table1 => ['1', '2'])
|
220
|
+
results.size.should == 0
|
343
221
|
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
# DescribeTable
|
377
|
-
|
378
|
-
# UpdateItem
|
379
|
-
|
380
|
-
# UpdateTable
|
222
|
+
results[test_table1].should_not include({:name => 'Josh', :id => '1'})
|
223
|
+
results[test_table1].should_not include({:name => 'Justin', :id => '2'})
|
224
|
+
end
|
225
|
+
|
226
|
+
it 'performs BatchDeleteItem with one ranged key' do
|
227
|
+
Dynamoid::Adapter.put_item(test_table3, {:id => '1', :name => 'Josh', :range => 1.0})
|
228
|
+
Dynamoid::Adapter.put_item(test_table3, {:id => '2', :name => 'Justin', :range => 2.0})
|
229
|
+
|
230
|
+
Dynamoid::Adapter.batch_delete_item(test_table3 => [['1', 1.0]])
|
231
|
+
results = Dynamoid::Adapter.batch_get_item(test_table3 => [['1', 1.0]])
|
232
|
+
results.size.should == 0
|
233
|
+
|
234
|
+
results[test_table3].should_not include({:name => 'Josh', :id => '1', :range => 1.0})
|
235
|
+
end
|
236
|
+
|
237
|
+
it 'performs BatchDeleteItem with multiple ranged keys' do
|
238
|
+
Dynamoid::Adapter.put_item(test_table3, {:id => '1', :name => 'Josh', :range => 1.0})
|
239
|
+
Dynamoid::Adapter.put_item(test_table3, {:id => '2', :name => 'Justin', :range => 2.0})
|
240
|
+
|
241
|
+
Dynamoid::Adapter.batch_delete_item(test_table3 => [['1', 1.0],['2', 2.0]])
|
242
|
+
results = Dynamoid::Adapter.batch_get_item(test_table3 => [['1', 1.0],['2', 2.0]])
|
243
|
+
results.size.should == 0
|
244
|
+
|
245
|
+
results[test_table3].should_not include({:name => 'Josh', :id => '1', :range => 1.0})
|
246
|
+
results[test_table3].should_not include({:name => 'Justin', :id => '2', :range => 2.0})
|
247
|
+
end
|
248
|
+
|
249
|
+
# ListTables
|
250
|
+
it 'performs ListTables' do
|
251
|
+
#Force creation of the tables
|
252
|
+
test_table1; test_table2; test_table3; test_table4
|
381
253
|
|
254
|
+
Dynamoid::Adapter.list_tables.should include test_table1
|
255
|
+
Dynamoid::Adapter.list_tables.should include test_table2
|
256
|
+
end
|
257
|
+
|
258
|
+
# Query
|
259
|
+
it 'performs query on a table and returns items' do
|
260
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '1', :name => 'Josh'})
|
261
|
+
|
262
|
+
Dynamoid::Adapter.query(test_table1, :hash_value => '1').should == { :id=> '1', :name=>"Josh" }
|
263
|
+
end
|
264
|
+
|
265
|
+
it 'performs query on a table and returns items if there are multiple items' do
|
266
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '1', :name => 'Josh'})
|
267
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '2', :name => 'Justin'})
|
268
|
+
|
269
|
+
Dynamoid::Adapter.query(test_table1, :hash_value => '1').should == { :id=> '1', :name=>"Josh" }
|
270
|
+
end
|
271
|
+
|
272
|
+
it_behaves_like 'range queries'
|
273
|
+
|
274
|
+
# Scan
|
275
|
+
it 'performs scan on a table and returns items' do
|
276
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '1', :name => 'Josh'})
|
277
|
+
|
278
|
+
Dynamoid::Adapter.scan(test_table1, :name => 'Josh').should == [{ :id=> '1', :name=>"Josh" }]
|
279
|
+
end
|
280
|
+
|
281
|
+
it 'performs scan on a table and returns items if there are multiple items but only one match' do
|
282
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '1', :name => 'Josh'})
|
283
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '2', :name => 'Justin'})
|
284
|
+
|
285
|
+
Dynamoid::Adapter.scan(test_table1, :name => 'Josh').should == [{ :id=> '1', :name=>"Josh" }]
|
286
|
+
end
|
287
|
+
|
288
|
+
it 'performs scan on a table and returns multiple items if there are multiple matches' do
|
289
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '1', :name => 'Josh'})
|
290
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '2', :name => 'Josh'})
|
291
|
+
|
292
|
+
Dynamoid::Adapter.scan(test_table1, :name => 'Josh').should include({:name=>"Josh", :id=>"2"}, {:name=>"Josh", :id=>"1"})
|
293
|
+
end
|
294
|
+
|
295
|
+
it 'performs scan on a table and returns all items if no criteria are specified' do
|
296
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '1', :name => 'Josh'})
|
297
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '2', :name => 'Josh'})
|
298
|
+
|
299
|
+
Dynamoid::Adapter.scan(test_table1, {}).should include({:name=>"Josh", :id=>"2"}, {:name=>"Josh", :id=>"1"})
|
300
|
+
end
|
301
|
+
|
302
|
+
it_behaves_like 'correct ordering'
|
303
|
+
end
|
304
|
+
|
305
|
+
context 'with a preexisting table with paritioning' do
|
306
|
+
before(:all) do
|
307
|
+
@previous_value = Dynamoid::Config.partitioning
|
308
|
+
Dynamoid::Config.partitioning = true
|
309
|
+
end
|
310
|
+
|
311
|
+
after(:all) do
|
312
|
+
Dynamoid::Config.partitioning = @previous_value
|
313
|
+
end
|
314
|
+
|
315
|
+
# Query
|
316
|
+
it 'performs query on a table and returns items' do
|
317
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '1.1', :name => 'Josh'})
|
318
|
+
|
319
|
+
Dynamoid::Adapter.query(test_table1, :hash_value => '1').first.should == { :id=> '1', :name=>"Josh" }
|
320
|
+
end
|
321
|
+
|
322
|
+
it 'performs query on a table and returns items if there are multiple items' do
|
323
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '1.1', :name => 'Josh'})
|
324
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '2.1', :name => 'Justin'})
|
325
|
+
|
326
|
+
Dynamoid::Adapter.query(test_table1, :hash_value => '1').first.should == { :id=> '1', :name=>"Josh" }
|
327
|
+
end
|
328
|
+
|
329
|
+
it_behaves_like 'range queries'
|
330
|
+
|
331
|
+
# Scan
|
332
|
+
it 'performs scan on a table and returns items' do
|
333
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '1.1', :name => 'Josh'})
|
334
|
+
|
335
|
+
Dynamoid::Adapter.scan(test_table1, :name => 'Josh').should == [{ :id=> '1', :name=>"Josh" }]
|
336
|
+
end
|
337
|
+
|
338
|
+
it 'performs scan on a table and returns items if there are multiple items but only one match' do
|
339
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '1.1', :name => 'Josh'})
|
340
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '2.1', :name => 'Justin'})
|
341
|
+
|
342
|
+
Dynamoid::Adapter.scan(test_table1, :name => 'Josh').should == [{ :id=> '1', :name=>"Josh" }]
|
343
|
+
end
|
344
|
+
|
345
|
+
it 'performs scan on a table and returns multiple items if there are multiple matches' do
|
346
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '1.1', :name => 'Josh'})
|
347
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '2.1', :name => 'Josh'})
|
348
|
+
|
349
|
+
Dynamoid::Adapter.scan(test_table1, :name => 'Josh').should include({:name=>"Josh", :id=>"2"}, {:name=>"Josh", :id=>"1"})
|
350
|
+
end
|
351
|
+
|
352
|
+
it 'performs scan on a table and returns all items if no criteria are specified' do
|
353
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '1.1', :name => 'Josh'})
|
354
|
+
Dynamoid::Adapter.put_item(test_table1, {:id => '2.1', :name => 'Josh'})
|
355
|
+
|
356
|
+
Dynamoid::Adapter.scan(test_table1, {}).should include({:name=>"Josh", :id=>"2"}, {:name=>"Josh", :id=>"1"})
|
357
|
+
end
|
358
|
+
|
359
|
+
it_behaves_like 'correct ordering'
|
382
360
|
end
|
361
|
+
|
362
|
+
# DescribeTable
|
363
|
+
|
364
|
+
# UpdateItem
|
365
|
+
|
366
|
+
# UpdateTable
|
383
367
|
end
|
@@ -90,9 +90,11 @@ describe "Dynamoid::Persistence" do
|
|
90
90
|
Address.undump(@address.send(:dump))[:options].should == hash
|
91
91
|
end
|
92
92
|
|
93
|
-
|
94
|
-
|
95
|
-
|
93
|
+
[true, false].each do |bool|
|
94
|
+
it "dumps a #{bool} boolean field" do
|
95
|
+
@address.deliverable = bool
|
96
|
+
Address.undump(@address.send(:dump))[:deliverable].should == bool
|
97
|
+
end
|
96
98
|
end
|
97
99
|
|
98
100
|
it 'raises on an invalid boolean value' do
|
@@ -158,21 +160,33 @@ describe "Dynamoid::Persistence" do
|
|
158
160
|
end
|
159
161
|
end
|
160
162
|
|
161
|
-
|
162
|
-
clazz
|
163
|
-
|
164
|
-
|
163
|
+
context 'unknown fields' do
|
164
|
+
let(:clazz) do
|
165
|
+
Class.new do
|
166
|
+
include Dynamoid::Document
|
167
|
+
table :name => :addresses
|
165
168
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
+
field :city
|
170
|
+
field :options, :serialized
|
171
|
+
field :deliverable, :bad_type_specifier
|
172
|
+
end
|
169
173
|
end
|
170
|
-
|
171
|
-
expect do
|
172
|
-
clazz.new(:deliverable => true).dump
|
173
|
-
end.to raise_error(ArgumentError)
|
174
|
-
end
|
175
174
|
|
175
|
+
it 'raises when undumping a column with an unknown field type' do
|
176
|
+
expect do
|
177
|
+
clazz.new(:deliverable => true) #undump is called here
|
178
|
+
end.to raise_error(ArgumentError)
|
179
|
+
end
|
180
|
+
|
181
|
+
it 'raises when dumping a column with an unknown field type' do
|
182
|
+
doc = clazz.new
|
183
|
+
doc.deliverable = true
|
184
|
+
expect do
|
185
|
+
doc.dump
|
186
|
+
end.to raise_error(ArgumentError)
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
176
190
|
context 'update' do
|
177
191
|
|
178
192
|
before :each do
|
data/spec/spec_helper.rb
CHANGED
@@ -7,17 +7,21 @@ require 'rspec'
|
|
7
7
|
require 'dynamoid'
|
8
8
|
require 'pry'
|
9
9
|
require 'mocha'
|
10
|
+
require 'aws-sdk'
|
10
11
|
|
11
12
|
ENV['ACCESS_KEY'] ||= 'abcd'
|
12
13
|
ENV['SECRET_KEY'] ||= '1234'
|
13
14
|
|
15
|
+
AWS.config({
|
16
|
+
:access_key_id => ENV['ACCESS_KEY'],
|
17
|
+
:secret_access_key => ENV['SECRET_KEY'],
|
18
|
+
:dynamo_db_endpoint => 'localhost',
|
19
|
+
:dynamo_db_port => '4567',
|
20
|
+
:use_ssl => false
|
21
|
+
})
|
22
|
+
|
14
23
|
Dynamoid.configure do |config|
|
15
24
|
config.adapter = 'aws_sdk'
|
16
|
-
config.access_key = ENV['ACCESS_KEY']
|
17
|
-
config.secret_key = ENV['SECRET_KEY']
|
18
|
-
config.endpoint = 'localhost'
|
19
|
-
config.port = '4567'
|
20
|
-
config.use_ssl = false
|
21
25
|
config.namespace = 'dynamoid_tests'
|
22
26
|
config.warn_on_scan = false
|
23
27
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dynamoid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activemodel
|
@@ -362,7 +362,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
362
362
|
version: '0'
|
363
363
|
segments:
|
364
364
|
- 0
|
365
|
-
hash:
|
365
|
+
hash: 4089934294152976145
|
366
366
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
367
367
|
none: false
|
368
368
|
requirements:
|
@@ -371,7 +371,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
371
371
|
version: '0'
|
372
372
|
requirements: []
|
373
373
|
rubyforge_project:
|
374
|
-
rubygems_version: 1.8.
|
374
|
+
rubygems_version: 1.8.23
|
375
375
|
signing_key:
|
376
376
|
specification_version: 3
|
377
377
|
summary: Dynamoid is an ORM for Amazon's DynamoDB
|