mince_dynamo_db 0.0.5 → 1.0.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.
data/Guardfile CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
5
  guard 'rspec', :version => 2 do
6
6
  watch(%r{^spec/lib/.+_spec\.rb$})
7
+ watch(%r{^lib/.+\.rb$})
8
+ watch(%r{^lib/mince_dynamo_db/.+\.rb$})
7
9
  watch(%r{^lib/(.+)\.rb}) { |m| "spec/lib/#{m[1]}_spec.rb" }
8
10
  watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
9
11
  watch(%r{^spec/support/shared_examples/(.+)\.rb$}) { "spec" }
@@ -0,0 +1,11 @@
1
+ module MinceDynamoDb
2
+ module DataSanitizer
3
+ def self.prepare_field_for_storage(field)
4
+ field.is_a?(Numeric) ? field : field.to_s
5
+ end
6
+
7
+ def self.prepare_hash_for_storage(hash)
8
+ hash.each{|key, value| hash[key] = prepare_field_for_storage(value) }
9
+ end
10
+ end
11
+ end
@@ -3,6 +3,7 @@ require 'digest'
3
3
  require 'active_support/hash_with_indifferent_access'
4
4
 
5
5
  require_relative 'connection'
6
+ require_relative 'data_sanitizer'
6
7
 
7
8
  module MinceDynamoDb # :nodoc:
8
9
  # = Mince DynamoDb Data Store
@@ -94,7 +95,7 @@ module MinceDynamoDb # :nodoc:
94
95
  # @param [Hash] hash a hash of data to be added to the collection
95
96
  def add(collection_name, hash)
96
97
  hash.delete_if{|k,v| v.nil? }
97
- items(collection_name).create(hash)
98
+ items(collection_name).create(sanitized_hash(hash))
98
99
  end
99
100
 
100
101
  # Replaces a record in the collection based on the primary key's value. The hash must contain a key, defined
@@ -104,7 +105,7 @@ module MinceDynamoDb # :nodoc:
104
105
  # @param [String] collection_name the name of the collection
105
106
  # @param [Hash] hash a hash to replace the record in the collection with
106
107
  def replace(collection_name, hash)
107
- items(collection_name).put(hash)
108
+ items(collection_name).put(sanitized_hash(hash))
108
109
  end
109
110
 
110
111
  # Gets all records that have the value for a given key.
@@ -164,7 +165,7 @@ module MinceDynamoDb # :nodoc:
164
165
  # @param [*] value_to_push the value to push to the array
165
166
  def push_to_array(collection_name, identifying_key, identifying_value, array_key, value_to_push)
166
167
  item = items(collection_name).where(identifying_key.to_s => identifying_value).first
167
- item.attributes.add(array_key => [value_to_push])
168
+ item.attributes.add(array_key => [sanitized_field(value_to_push)])
168
169
  end
169
170
 
170
171
  # Removes a value from a record's key that is an array
@@ -227,6 +228,14 @@ module MinceDynamoDb # :nodoc:
227
228
 
228
229
  private
229
230
 
231
+ def sanitized_field(field)
232
+ DataSanitizer.prepare_field_for_storage(field)
233
+ end
234
+
235
+ def sanitized_hash(hash)
236
+ DataSanitizer.prepare_hash_for_storage(hash)
237
+ end
238
+
230
239
  # Takes a DynamoDB item and returns the attributes of that item as a hash
231
240
  def to_hash(item)
232
241
  item.attributes.to_h if item
@@ -1,3 +1,3 @@
1
1
  module MinceDynamoDb
2
- VERSION = "0.0.5"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -0,0 +1,40 @@
1
+ require_relative '../../lib/mince_dynamo_db/data_sanitizer'
2
+
3
+ require 'date'
4
+
5
+ describe MinceDynamoDb::DataSanitizer do
6
+ it 'converts a Time object to a string' do
7
+ value = Time.now
8
+
9
+ described_class.prepare_field_for_storage(value).should == value.to_s
10
+ described_class.prepare_hash_for_storage({ field: value }).should == { field: value.to_s }
11
+ end
12
+
13
+ it 'does not convert a float' do
14
+ value = 3.2
15
+
16
+ described_class.prepare_field_for_storage(value).should == value
17
+ described_class.prepare_hash_for_storage({ field: value }).should == { field: value }
18
+ end
19
+
20
+ it 'does not convert a string' do
21
+ value = 'string'
22
+
23
+ described_class.prepare_field_for_storage(value).should == value
24
+ described_class.prepare_hash_for_storage({ field: value }).should == { field: value }
25
+ end
26
+
27
+ it 'does not convert an integer' do
28
+ value = 1
29
+
30
+ described_class.prepare_field_for_storage(value).should == value
31
+ described_class.prepare_hash_for_storage({ field: value }).should == { field: value }
32
+ end
33
+
34
+ it 'converts a Date object to a string' do
35
+ value = Date.today
36
+
37
+ described_class.prepare_field_for_storage(value).should == value.to_s
38
+ described_class.prepare_hash_for_storage({ field: value }).should == { field: value.to_s }
39
+ end
40
+ end
@@ -9,13 +9,17 @@ describe MinceDynamoDb::DataStore do
9
9
  let(:collection_name) { 'some_collection_name'}
10
10
  let(:primary_key) { mock 'primary key'}
11
11
  let(:mock_id) { mock 'id' }
12
- let(:data) { { :_id => mock_id}}
12
+ let(:data) { { :_id => mock_id, time_field: mock('time field')}}
13
+ let(:sanitized_data) { mock 'sanitized data' }
14
+ let(:sanitized_time) { mock 'sanitized time' }
15
+ let(:sanitized_id) { mock 'sanitized id' }
13
16
  let(:return_data) { mock 'return data', attributes: attributes }
14
17
  let(:attributes) { mock 'attributes', to_h: hash }
15
18
  let(:hash) { mock 'hash' }
16
19
  let(:items) { mock 'items' }
17
20
 
18
21
  before do
22
+ MinceDynamoDb::DataSanitizer.stub(:prepare_hash_for_storage).with(data).and_return(sanitized_data)
19
23
  MinceDynamoDb::Connection.stub(:instance => mince_dynamo_db_connection)
20
24
  end
21
25
 
@@ -45,7 +49,7 @@ describe MinceDynamoDb::DataStore do
45
49
  end
46
50
 
47
51
  it 'can write to the collection' do
48
- items.should_receive(:create).with(data).and_return(return_data)
52
+ items.should_receive(:create).with(sanitized_data).and_return(return_data)
49
53
 
50
54
  subject.add(collection_name, data).should == return_data
51
55
  end
@@ -60,7 +64,7 @@ describe MinceDynamoDb::DataStore do
60
64
  end
61
65
 
62
66
  it 'can replace a record' do
63
- items.should_receive(:put).with(data)
67
+ items.should_receive(:put).with(sanitized_data)
64
68
 
65
69
  subject.replace(collection_name, data)
66
70
  end
@@ -118,10 +122,13 @@ describe MinceDynamoDb::DataStore do
118
122
  end
119
123
 
120
124
  it 'can push a value to an array for a specific record' do
125
+ value_to_push = mock 'value to push to the record'
126
+ sanitized_value_to_push = mock 'sanitized value to push to the record'
127
+ MinceDynamoDb::DataSanitizer.stub(:prepare_field_for_storage).with(value_to_push).and_return(sanitized_value_to_push)
121
128
  items.should_receive(:where).with("key" => "value").and_return([return_data])
122
- attributes.should_receive(:add).with(:array_key => ["value_to_push"])
129
+ attributes.should_receive(:add).with(:array_key => [sanitized_value_to_push])
123
130
 
124
- subject.push_to_array(collection_name, :key, "value", :array_key, "value_to_push")
131
+ subject.push_to_array(collection_name, :key, "value", :array_key, value_to_push)
125
132
  end
126
133
 
127
134
  it 'can remove a value from an array for a specific record' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mince_dynamo_db
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 1.0.0
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: 2012-06-20 00:00:00.000000000 Z
12
+ date: 2012-07-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aws-sdk
@@ -123,11 +123,13 @@ files:
123
123
  - Rakefile
124
124
  - lib/mince_dynamo_db.rb
125
125
  - lib/mince_dynamo_db/connection.rb
126
+ - lib/mince_dynamo_db/data_sanitizer.rb
126
127
  - lib/mince_dynamo_db/data_store.rb
127
128
  - lib/mince_dynamo_db/version.rb
128
129
  - mince_dynamo_db.gemspec
129
130
  - spec/integration/persisting_to_dynamodb_test.rb
130
131
  - spec/lib/connection_spec.rb
132
+ - spec/lib/data_sanitizer_spec.rb
131
133
  - spec/lib/data_store_spec.rb
132
134
  - spec/support/aws_example.yml
133
135
  homepage: https://github.com/coffeencoke/mince_dynamo_db
@@ -157,6 +159,7 @@ summary: Lightweight ORM for Amazon's DynamoDB with Ruby Apps
157
159
  test_files:
158
160
  - spec/integration/persisting_to_dynamodb_test.rb
159
161
  - spec/lib/connection_spec.rb
162
+ - spec/lib/data_sanitizer_spec.rb
160
163
  - spec/lib/data_store_spec.rb
161
164
  - spec/support/aws_example.yml
162
165
  has_rdoc: