dynamoid 1.0.0 → 1.1.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +21 -0
- data/README.markdown +1 -0
- data/dynamoid.gemspec +15 -13
- data/lib/dynamoid/adapter_plugin/aws_sdk_v2.rb +49 -41
- data/lib/dynamoid/persistence.rb +18 -4
- metadata +31 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d03723c3178362472031077f90ef4d732c9f6a59
|
4
|
+
data.tar.gz: d5255b0e842355e872056f10c2619f9c9609e96a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de28cab30c3bd935e588f481986fddc5ad25e46a40a0e5a9675524e71e112f67333f2a663b8951253742b33e655ec556381834acf122c9cb484829c68beb48dc
|
7
|
+
data.tar.gz: 2514d74830f6f8fa4f427eb0ddbed13eec808aaa437a7cac7dc1772a8eb4592dbb1d35551b426cad71ed0e693e6c9d2d532f7d2d1949f72c59c6712136582615
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# 1.1.0
|
2
|
+
|
3
|
+
* Added support for optimistic locking on delete (PR #29, sumocoder)
|
4
|
+
* upgrade concurrent-ruby requirement to 1.0 (PR #31, keithmgould)
|
5
|
+
|
6
|
+
# 1.0.0
|
7
|
+
|
8
|
+
* Add support for AWS SDK v2.
|
9
|
+
* Add support for custom class type for fields.
|
10
|
+
* Remove partitioning support.
|
11
|
+
* Remove support for Dynamoid's (pseudo)indexes, now that DynamoDB offers
|
12
|
+
local and global indexes.
|
13
|
+
* Rename :float field type to :number.
|
14
|
+
* Rename Chain#limit to Chain#eval_limit.
|
15
|
+
|
16
|
+
Housekeeping:
|
17
|
+
|
18
|
+
* Switch from `fake_dynamo` for unit tests to DynamoDBLocal. This is the new authoritative
|
19
|
+
implementation of DynamoDB for testing, and it supports AWS SDK v2.
|
20
|
+
* Use Travis CI to auto-run unit tests on multiple Rubies.
|
21
|
+
* Randomize spec order.
|
data/README.markdown
CHANGED
@@ -364,6 +364,7 @@ Also, without contributors the project wouldn't be nearly as awesome. So many th
|
|
364
364
|
Running the tests is fairly simple. In one window, run `bin/start_dynamodblocal`, and in the other, use `rake`.
|
365
365
|
|
366
366
|
[](https://travis-ci.org/Dynamoid/Dynamoid)
|
367
|
+
[](https://coveralls.io/github/Dynamoid/Dynamoid?branch=master)
|
367
368
|
|
368
369
|
## Copyright
|
369
370
|
|
data/dynamoid.gemspec
CHANGED
@@ -2,20 +2,20 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "dynamoid"
|
5
|
-
s.version = "1.
|
5
|
+
s.version = "1.1.0"
|
6
6
|
|
7
7
|
# Keep in sync with README
|
8
|
-
s.authors =
|
9
|
-
Josh Symonds
|
10
|
-
Logan Bowers
|
11
|
-
Craig Heneveld
|
12
|
-
Anatha Kumaran
|
13
|
-
Jason Dew
|
14
|
-
Luis Arias
|
15
|
-
Stefan Neculai
|
16
|
-
Philip White
|
17
|
-
Peeyush Kumar
|
18
|
-
|
8
|
+
s.authors = [
|
9
|
+
'Josh Symonds',
|
10
|
+
'Logan Bowers',
|
11
|
+
'Craig Heneveld',
|
12
|
+
'Anatha Kumaran',
|
13
|
+
'Jason Dew',
|
14
|
+
'Luis Arias',
|
15
|
+
'Stefan Neculai',
|
16
|
+
'Philip White',
|
17
|
+
'Peeyush Kumar',
|
18
|
+
]
|
19
19
|
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."
|
20
20
|
s.extra_rdoc_files = [
|
21
21
|
"LICENSE.txt",
|
@@ -23,6 +23,7 @@ Gem::Specification.new do |s|
|
|
23
23
|
]
|
24
24
|
# file list is generated with `git ls-files | grep -v -E -e '^spec/' -e '^\.' -e 'bin/'`
|
25
25
|
s.files = %w(
|
26
|
+
CHANGELOG.md
|
26
27
|
Gemfile
|
27
28
|
LICENSE.txt
|
28
29
|
README.markdown
|
@@ -62,12 +63,13 @@ Gem::Specification.new do |s|
|
|
62
63
|
|
63
64
|
s.add_runtime_dependency(%q<activemodel>, ["~> 4"])
|
64
65
|
s.add_runtime_dependency(%q<aws-sdk-resources>, ["~> 2"])
|
65
|
-
s.add_runtime_dependency(%q<concurrent-ruby>, ["
|
66
|
+
s.add_runtime_dependency(%q<concurrent-ruby>, [">= 1.0"])
|
66
67
|
s.add_development_dependency(%q<rake>, [">= 0"])
|
67
68
|
s.add_development_dependency(%q<rspec>, ["~> 3"])
|
68
69
|
s.add_development_dependency(%q<bundler>, [">= 0"])
|
69
70
|
s.add_development_dependency(%q<yard>, [">= 0"])
|
70
71
|
s.add_development_dependency(%q<github-markup>, [">= 0"])
|
71
72
|
s.add_development_dependency(%q<pry>, [">= 0"])
|
73
|
+
s.add_development_dependency(%q<coveralls>, [">= 0"])
|
72
74
|
end
|
73
75
|
|
@@ -65,7 +65,7 @@ module Dynamoid
|
|
65
65
|
results = client.batch_get_item(
|
66
66
|
request_items: request_items
|
67
67
|
)
|
68
|
-
|
68
|
+
|
69
69
|
ret = Hash.new([].freeze) # Default for tables where no rows are returned
|
70
70
|
results.data[:responses].each do |table, rows|
|
71
71
|
ret[table] = rows.collect { |r| result_item_to_hash(r) }
|
@@ -107,14 +107,14 @@ module Dynamoid
|
|
107
107
|
read_capacity = options[:read_capacity] || Dynamoid::Config.read_capacity
|
108
108
|
write_capacity = options[:write_capacity] || Dynamoid::Config.write_capacity
|
109
109
|
range_key = options[:range_key]
|
110
|
-
|
110
|
+
|
111
111
|
key_schema = [
|
112
112
|
{ attribute_name: key.to_s, key_type: HASH_KEY }
|
113
113
|
]
|
114
|
-
key_schema << {
|
114
|
+
key_schema << {
|
115
115
|
attribute_name: range_key.keys.first.to_s, key_type: RANGE_KEY
|
116
116
|
} if(range_key)
|
117
|
-
|
117
|
+
|
118
118
|
#TODO: Provide support for number and binary hash key
|
119
119
|
attribute_definitions = [
|
120
120
|
{ attribute_name: key.to_s, attribute_type: 'S' }
|
@@ -122,10 +122,10 @@ module Dynamoid
|
|
122
122
|
attribute_definitions << {
|
123
123
|
attribute_name: range_key.keys.first.to_s, attribute_type: api_type(range_key.values.first)
|
124
124
|
} if(range_key)
|
125
|
-
|
125
|
+
|
126
126
|
client.create_table(table_name: table_name,
|
127
127
|
provisioned_throughput: {
|
128
|
-
read_capacity_units: read_capacity,
|
128
|
+
read_capacity_units: read_capacity,
|
129
129
|
write_capacity_units: write_capacity
|
130
130
|
},
|
131
131
|
key_schema: key_schema,
|
@@ -144,9 +144,17 @@ module Dynamoid
|
|
144
144
|
# @since 1.0.0
|
145
145
|
#
|
146
146
|
# @todo: Provide support for various options http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Client.html#delete_item-instance_method
|
147
|
-
def delete_item(table_name, key, options =
|
147
|
+
def delete_item(table_name, key, options = {})
|
148
|
+
range_key = options[:range_key]
|
149
|
+
conditions = options[:conditions]
|
148
150
|
table = describe_table(table_name)
|
149
|
-
client.delete_item(
|
151
|
+
client.delete_item(
|
152
|
+
table_name: table_name,
|
153
|
+
key: key_stanza(table, key, range_key),
|
154
|
+
expected: expected_stanza(conditions)
|
155
|
+
)
|
156
|
+
rescue Aws::DynamoDB::Errors::ConditionalCheckFailedException => e
|
157
|
+
raise Dynamoid::Errors::ConditionalCheckFailedException, e
|
150
158
|
end
|
151
159
|
|
152
160
|
# Deletes an entire table from DynamoDB.
|
@@ -231,7 +239,7 @@ module Dynamoid
|
|
231
239
|
# @todo: Provide support for various options http://docs.aws.amazon.com/sdkforruby/api/Aws/DynamoDB/Client.html#put_item-instance_method
|
232
240
|
def put_item(table_name, object, options = nil)
|
233
241
|
item = {}
|
234
|
-
|
242
|
+
|
235
243
|
object.each do |k, v|
|
236
244
|
next if v.nil? || (v.respond_to?(:empty?) && v.empty?)
|
237
245
|
item[k.to_s] = v
|
@@ -342,10 +350,10 @@ module Dynamoid
|
|
342
350
|
def scan(table_name, scan_hash, select_opts = {})
|
343
351
|
limit = select_opts.delete(:limit)
|
344
352
|
batch = select_opts.delete(:batch_size)
|
345
|
-
|
353
|
+
|
346
354
|
request = { table_name: table_name }
|
347
355
|
request[:limit] = batch || limit if batch || limit
|
348
|
-
request[:scan_filter] = scan_hash.reduce({}) do |memo, kvp|
|
356
|
+
request[:scan_filter] = scan_hash.reduce({}) do |memo, kvp|
|
349
357
|
memo[kvp[0].to_s] = {
|
350
358
|
attribute_value_list: [kvp[1]],
|
351
359
|
# TODO: Provide support for all comparison operators
|
@@ -369,7 +377,7 @@ module Dynamoid
|
|
369
377
|
end
|
370
378
|
end
|
371
379
|
end
|
372
|
-
|
380
|
+
|
373
381
|
|
374
382
|
#
|
375
383
|
# Truncates all records in the given table
|
@@ -381,7 +389,7 @@ module Dynamoid
|
|
381
389
|
table = describe_table(table_name)
|
382
390
|
hk = table.hash_key
|
383
391
|
rk = table.range_key
|
384
|
-
|
392
|
+
|
385
393
|
scan(table_name, {}, {}).each do |attributes|
|
386
394
|
opts = {range_key: attributes[rk.to_sym] } if rk
|
387
395
|
delete_item(table_name, attributes[hk], opts)
|
@@ -393,7 +401,7 @@ module Dynamoid
|
|
393
401
|
end
|
394
402
|
|
395
403
|
protected
|
396
|
-
|
404
|
+
|
397
405
|
STRING_TYPE = "S".freeze
|
398
406
|
NUM_TYPE = "N".freeze
|
399
407
|
BOOLEAN_TYPE = "B".freeze
|
@@ -418,7 +426,7 @@ module Dynamoid
|
|
418
426
|
key[table.range_key.to_s] = range_key if range_key
|
419
427
|
key
|
420
428
|
end
|
421
|
-
|
429
|
+
|
422
430
|
#
|
423
431
|
# @param [Hash] conditions Conditions to enforce on operation (e.g. { :if => { :count => 5 }, :unless_exists => ['id']})
|
424
432
|
# @return an Expected stanza for the given conditions hash
|
@@ -426,20 +434,20 @@ module Dynamoid
|
|
426
434
|
def expected_stanza(conditions = nil)
|
427
435
|
expected = Hash.new { |h,k| h[k] = {} }
|
428
436
|
return expected unless conditions
|
429
|
-
|
437
|
+
|
430
438
|
conditions[:unless_exists].try(:each) do |col|
|
431
439
|
expected[col.to_s][:exists] = false
|
432
440
|
end
|
433
441
|
conditions[:if].try(:each) do |col,val|
|
434
442
|
expected[col.to_s][:value] = val
|
435
443
|
end
|
436
|
-
|
444
|
+
|
437
445
|
expected
|
438
446
|
end
|
439
|
-
|
447
|
+
|
440
448
|
HASH_KEY = "HASH".freeze
|
441
449
|
RANGE_KEY = "RANGE".freeze
|
442
|
-
|
450
|
+
|
443
451
|
#
|
444
452
|
# New, semi-arbitrary API to get data on the table
|
445
453
|
#
|
@@ -448,7 +456,7 @@ module Dynamoid
|
|
448
456
|
table_cache[table_name] = Table.new(client.describe_table(table_name: table_name).data)
|
449
457
|
end
|
450
458
|
end
|
451
|
-
|
459
|
+
|
452
460
|
#
|
453
461
|
# Converts a hash returned by get_item, scan, etc. into a key-value hash
|
454
462
|
#
|
@@ -457,35 +465,35 @@ module Dynamoid
|
|
457
465
|
item.each { |k,v| r[k.to_sym] = v }
|
458
466
|
end
|
459
467
|
end
|
460
|
-
|
468
|
+
|
461
469
|
#
|
462
470
|
# Represents a table. Exposes data from the "DescribeTable" API call, and also
|
463
471
|
# provides methods for coercing values to the proper types based on the table's schema data
|
464
472
|
#
|
465
473
|
class Table
|
466
474
|
attr_reader :schema
|
467
|
-
|
475
|
+
|
468
476
|
#
|
469
477
|
# @param [Hash] schema Data returns from a "DescribeTable" call
|
470
478
|
#
|
471
479
|
def initialize(schema)
|
472
480
|
@schema = schema[:table]
|
473
481
|
end
|
474
|
-
|
482
|
+
|
475
483
|
def range_key
|
476
484
|
@range_key ||= schema[:key_schema].find { |d| d[:key_type] == RANGE_KEY }.try(:attribute_name)
|
477
485
|
end
|
478
|
-
|
486
|
+
|
479
487
|
def range_type
|
480
|
-
range_type ||= schema[:attribute_definitions].find { |d|
|
488
|
+
range_type ||= schema[:attribute_definitions].find { |d|
|
481
489
|
d[:attribute_name] == range_key
|
482
490
|
}.try(:fetch,:attribute_type, nil)
|
483
491
|
end
|
484
|
-
|
492
|
+
|
485
493
|
def hash_key
|
486
494
|
@hash_key ||= schema[:key_schema].find { |d| d[:key_type] == HASH_KEY }.try(:attribute_name).to_sym
|
487
495
|
end
|
488
|
-
|
496
|
+
|
489
497
|
#
|
490
498
|
# Returns the API type (e.g. "N", "S") for the given column, if the schema defines it,
|
491
499
|
# nil otherwise
|
@@ -500,31 +508,31 @@ module Dynamoid
|
|
500
508
|
schema[:item_count]
|
501
509
|
end
|
502
510
|
end
|
503
|
-
|
511
|
+
|
504
512
|
#
|
505
|
-
# Mimics behavior of the yielded object on DynamoDB's update_item API (high level).
|
513
|
+
# Mimics behavior of the yielded object on DynamoDB's update_item API (high level).
|
506
514
|
#
|
507
515
|
class ItemUpdater
|
508
516
|
attr_reader :table, :key, :range_key
|
509
|
-
|
517
|
+
|
510
518
|
def initialize(table, key, range_key = nil)
|
511
519
|
@table = table; @key = key, @range_key = range_key
|
512
520
|
@additions = {}
|
513
521
|
@deletions = {}
|
514
522
|
@updates = {}
|
515
523
|
end
|
516
|
-
|
524
|
+
|
517
525
|
#
|
518
|
-
# Adds the given values to the values already stored in the corresponding columns.
|
519
|
-
# The column must contain a Set or a number.
|
526
|
+
# Adds the given values to the values already stored in the corresponding columns.
|
527
|
+
# The column must contain a Set or a number.
|
520
528
|
#
|
521
|
-
# @param [Hash] vals keys of the hash are the columns to update, vals are the values to
|
529
|
+
# @param [Hash] vals keys of the hash are the columns to update, vals are the values to
|
522
530
|
# add. values must be a Set, Array, or Numeric
|
523
531
|
#
|
524
532
|
def add(values)
|
525
533
|
@additions.merge!(values)
|
526
534
|
end
|
527
|
-
|
535
|
+
|
528
536
|
#
|
529
537
|
# Removes values from the sets of the given columns
|
530
538
|
#
|
@@ -538,19 +546,19 @@ module Dynamoid
|
|
538
546
|
#
|
539
547
|
# Replaces the values of one or more attributes
|
540
548
|
#
|
541
|
-
def set(values)
|
549
|
+
def set(values)
|
542
550
|
@updates.merge!(values)
|
543
551
|
end
|
544
|
-
|
552
|
+
|
545
553
|
#
|
546
554
|
# Returns an AttributeUpdates hash suitable for passing to the V2 Client API
|
547
555
|
#
|
548
556
|
def to_h
|
549
557
|
ret = {}
|
550
|
-
|
558
|
+
|
551
559
|
@additions.each do |k,v|
|
552
|
-
ret[k.to_s] = {
|
553
|
-
action: ADD,
|
560
|
+
ret[k.to_s] = {
|
561
|
+
action: ADD,
|
554
562
|
value: v
|
555
563
|
}
|
556
564
|
end
|
@@ -569,7 +577,7 @@ module Dynamoid
|
|
569
577
|
|
570
578
|
ret
|
571
579
|
end
|
572
|
-
|
580
|
+
|
573
581
|
ADD = "ADD".freeze
|
574
582
|
DELETE = "DELETE".freeze
|
575
583
|
PUT = "PUT".freeze
|
data/lib/dynamoid/persistence.rb
CHANGED
@@ -171,8 +171,8 @@ module Dynamoid
|
|
171
171
|
end
|
172
172
|
|
173
173
|
#
|
174
|
-
# update!() will increment the lock_version if the table has the column, but will not check it. Thus, a concurrent save will
|
175
|
-
# never cause an update! to fail, but an update! may cause a concurrent save to fail.
|
174
|
+
# update!() will increment the lock_version if the table has the column, but will not check it. Thus, a concurrent save will
|
175
|
+
# never cause an update! to fail, but an update! may cause a concurrent save to fail.
|
176
176
|
#
|
177
177
|
#
|
178
178
|
def update!(conditions = {}, &block)
|
@@ -216,7 +216,21 @@ module Dynamoid
|
|
216
216
|
# @since 0.2.0
|
217
217
|
def delete
|
218
218
|
options = range_key ? {:range_key => dump_field(self.read_attribute(range_key), self.class.attributes[range_key])} : {}
|
219
|
+
|
220
|
+
# Add an optimistic locking check if the lock_version column exists
|
221
|
+
if(self.class.attributes[:lock_version])
|
222
|
+
conditions = {:if => {}}
|
223
|
+
conditions[:if][:lock_version] =
|
224
|
+
if changes[:lock_version].nil?
|
225
|
+
self.lock_version
|
226
|
+
else
|
227
|
+
changes[:lock_version][0]
|
228
|
+
end
|
229
|
+
options[:conditions] = conditions
|
230
|
+
end
|
219
231
|
Dynamoid.adapter.delete(self.class.table_name, self.hash_key, options)
|
232
|
+
rescue Dynamoid::Errors::ConditionalCheckFailedException
|
233
|
+
raise Dynamoid::Errors::StaleObjectError.new(self, 'delete')
|
220
234
|
end
|
221
235
|
|
222
236
|
# Dump this object's attributes into hash form, fit to be persisted into the datastore.
|
@@ -268,14 +282,14 @@ module Dynamoid
|
|
268
282
|
end
|
269
283
|
end
|
270
284
|
end
|
271
|
-
|
285
|
+
|
272
286
|
# Persist the object into the datastore. Assign it an id first if it doesn't have one.
|
273
287
|
#
|
274
288
|
# @since 0.2.0
|
275
289
|
def persist(conditions = nil)
|
276
290
|
run_callbacks(:save) do
|
277
291
|
self.hash_key = SecureRandom.uuid if self.hash_key.nil? || self.hash_key.blank?
|
278
|
-
|
292
|
+
|
279
293
|
# Add an exists check to prevent overwriting existing records with new ones
|
280
294
|
if(new_record?)
|
281
295
|
conditions ||= {}
|
metadata
CHANGED
@@ -1,31 +1,22 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dynamoid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- Josh
|
8
|
-
-
|
9
|
-
-
|
10
|
-
-
|
11
|
-
-
|
12
|
-
-
|
13
|
-
-
|
14
|
-
-
|
15
|
-
-
|
16
|
-
- Dew
|
17
|
-
- Luis
|
18
|
-
- Arias
|
19
|
-
- Stefan
|
20
|
-
- Neculai
|
21
|
-
- Philip
|
22
|
-
- White
|
23
|
-
- Peeyush
|
24
|
-
- Kumar
|
7
|
+
- Josh Symonds
|
8
|
+
- Logan Bowers
|
9
|
+
- Craig Heneveld
|
10
|
+
- Anatha Kumaran
|
11
|
+
- Jason Dew
|
12
|
+
- Luis Arias
|
13
|
+
- Stefan Neculai
|
14
|
+
- Philip White
|
15
|
+
- Peeyush Kumar
|
25
16
|
autorequire:
|
26
17
|
bindir: bin
|
27
18
|
cert_chain: []
|
28
|
-
date: 2015-
|
19
|
+
date: 2015-12-30 00:00:00.000000000 Z
|
29
20
|
dependencies:
|
30
21
|
- !ruby/object:Gem::Dependency
|
31
22
|
name: activemodel
|
@@ -59,16 +50,16 @@ dependencies:
|
|
59
50
|
name: concurrent-ruby
|
60
51
|
requirement: !ruby/object:Gem::Requirement
|
61
52
|
requirements:
|
62
|
-
- - "
|
53
|
+
- - ">="
|
63
54
|
- !ruby/object:Gem::Version
|
64
|
-
version: '0
|
55
|
+
version: '1.0'
|
65
56
|
type: :runtime
|
66
57
|
prerelease: false
|
67
58
|
version_requirements: !ruby/object:Gem::Requirement
|
68
59
|
requirements:
|
69
|
-
- - "
|
60
|
+
- - ">="
|
70
61
|
- !ruby/object:Gem::Version
|
71
|
-
version: '0
|
62
|
+
version: '1.0'
|
72
63
|
- !ruby/object:Gem::Dependency
|
73
64
|
name: rake
|
74
65
|
requirement: !ruby/object:Gem::Requirement
|
@@ -153,6 +144,20 @@ dependencies:
|
|
153
144
|
- - ">="
|
154
145
|
- !ruby/object:Gem::Version
|
155
146
|
version: '0'
|
147
|
+
- !ruby/object:Gem::Dependency
|
148
|
+
name: coveralls
|
149
|
+
requirement: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - ">="
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '0'
|
154
|
+
type: :development
|
155
|
+
prerelease: false
|
156
|
+
version_requirements: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - ">="
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
156
161
|
description: Dynamoid is an ORM for Amazon's DynamoDB that supports offline development,
|
157
162
|
associations, querying, and everything else you'd expect from an ActiveRecord-style
|
158
163
|
replacement.
|
@@ -163,6 +168,7 @@ extra_rdoc_files:
|
|
163
168
|
- LICENSE.txt
|
164
169
|
- README.markdown
|
165
170
|
files:
|
171
|
+
- CHANGELOG.md
|
166
172
|
- Gemfile
|
167
173
|
- LICENSE.txt
|
168
174
|
- README.markdown
|
@@ -213,7 +219,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
213
219
|
version: '0'
|
214
220
|
requirements: []
|
215
221
|
rubyforge_project:
|
216
|
-
rubygems_version: 2.
|
222
|
+
rubygems_version: 2.5.1
|
217
223
|
signing_key:
|
218
224
|
specification_version: 4
|
219
225
|
summary: Dynamoid is an ORM for Amazon's DynamoDB
|