dynamoid 3.7.1 → 3.9.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 +246 -244
- data/LICENSE.txt +2 -2
- data/README.md +134 -55
- data/SECURITY.md +17 -0
- data/dynamoid.gemspec +66 -0
- data/lib/dynamoid/adapter.rb +7 -9
- data/lib/dynamoid/adapter_plugin/aws_sdk_v3/batch_get_item.rb +2 -2
- data/lib/dynamoid/adapter_plugin/aws_sdk_v3/execute_statement.rb +62 -0
- data/lib/dynamoid/adapter_plugin/aws_sdk_v3/item_updater.rb +29 -15
- data/lib/dynamoid/adapter_plugin/aws_sdk_v3/middleware/limit.rb +3 -0
- data/lib/dynamoid/adapter_plugin/aws_sdk_v3.rb +73 -59
- data/lib/dynamoid/associations/single_association.rb +28 -9
- data/lib/dynamoid/components.rb +2 -3
- data/lib/dynamoid/criteria/chain.rb +13 -9
- data/lib/dynamoid/criteria.rb +6 -7
- data/lib/dynamoid/dirty.rb +60 -63
- data/lib/dynamoid/document.rb +42 -12
- data/lib/dynamoid/errors.rb +2 -0
- data/lib/dynamoid/fields.rb +19 -37
- data/lib/dynamoid/finders.rb +9 -4
- data/lib/dynamoid/indexes.rb +45 -40
- data/lib/dynamoid/loadable.rb +6 -1
- data/lib/dynamoid/log/formatter.rb +19 -4
- data/lib/dynamoid/persistence/import.rb +4 -1
- data/lib/dynamoid/persistence/inc.rb +66 -0
- data/lib/dynamoid/persistence/save.rb +52 -5
- data/lib/dynamoid/persistence/update_fields.rb +1 -1
- data/lib/dynamoid/persistence/update_validations.rb +1 -1
- data/lib/dynamoid/persistence/upsert.rb +1 -1
- data/lib/dynamoid/persistence.rb +149 -61
- data/lib/dynamoid/undumping.rb +18 -0
- data/lib/dynamoid/validations.rb +6 -0
- data/lib/dynamoid/version.rb +1 -1
- data/lib/dynamoid.rb +1 -0
- metadata +30 -50
data/lib/dynamoid/persistence.rb
CHANGED
@@ -8,6 +8,7 @@ require 'dynamoid/persistence/import'
|
|
8
8
|
require 'dynamoid/persistence/update_fields'
|
9
9
|
require 'dynamoid/persistence/upsert'
|
10
10
|
require 'dynamoid/persistence/save'
|
11
|
+
require 'dynamoid/persistence/inc'
|
11
12
|
require 'dynamoid/persistence/update_validations'
|
12
13
|
|
13
14
|
# encoding: utf-8
|
@@ -112,8 +113,10 @@ module Dynamoid
|
|
112
113
|
|
113
114
|
if created_successfuly && self.options[:expires]
|
114
115
|
attribute = self.options[:expires][:field]
|
115
|
-
Dynamoid.adapter.update_time_to_live(table_name, attribute)
|
116
|
+
Dynamoid.adapter.update_time_to_live(options[:table_name], attribute)
|
116
117
|
end
|
118
|
+
|
119
|
+
self
|
117
120
|
end
|
118
121
|
|
119
122
|
# Deletes the table for the model.
|
@@ -122,8 +125,10 @@ module Dynamoid
|
|
122
125
|
# is deleted completely.
|
123
126
|
#
|
124
127
|
# Subsequent method calls for the same table will be ignored.
|
128
|
+
# @return [Model class] self
|
125
129
|
def delete_table
|
126
130
|
Dynamoid.adapter.delete_table(table_name)
|
131
|
+
self
|
127
132
|
end
|
128
133
|
|
129
134
|
# @private
|
@@ -365,32 +370,31 @@ module Dynamoid
|
|
365
370
|
#
|
366
371
|
# User.inc('1', 'Tylor', age: 2)
|
367
372
|
#
|
373
|
+
# It's an atomic operation it does not interfere with other write
|
374
|
+
# requests.
|
375
|
+
#
|
368
376
|
# Uses efficient low-level +UpdateItem+ operation and does only one HTTP
|
369
377
|
# request.
|
370
378
|
#
|
371
379
|
# Doesn't run validations and callbacks. Doesn't update +created_at+ and
|
372
380
|
# +updated_at+ as well.
|
373
381
|
#
|
382
|
+
# When `:touch` option is passed the timestamp columns are updating. If
|
383
|
+
# attribute names are passed, they are updated along with updated_at
|
384
|
+
# attribute:
|
385
|
+
#
|
386
|
+
# User.inc('1', age: 2, touch: true)
|
387
|
+
# User.inc('1', age: 2, touch: :viewed_at)
|
388
|
+
# User.inc('1', age: 2, touch: [:viewed_at, :accessed_at])
|
389
|
+
#
|
374
390
|
# @param hash_key_value [Scalar value] hash key
|
375
391
|
# @param range_key_value [Scalar value] range key (optional)
|
376
392
|
# @param counters [Hash] value to increase by
|
393
|
+
# @option counters [true | Symbol | Array[Symbol]] :touch to update update_at attribute and optionally the specified ones
|
394
|
+
# @return [Model class] self
|
377
395
|
def inc(hash_key_value, range_key_value = nil, counters)
|
378
|
-
|
379
|
-
|
380
|
-
value_dumped = Dumping.dump_field(value_casted, attributes[range_key])
|
381
|
-
{ range_key: value_dumped }
|
382
|
-
else
|
383
|
-
{}
|
384
|
-
end
|
385
|
-
|
386
|
-
Dynamoid.adapter.update_item(table_name, hash_key_value, options) do |t|
|
387
|
-
counters.each do |k, v|
|
388
|
-
value_casted = TypeCasting.cast_field(v, attributes[k])
|
389
|
-
value_dumped = Dumping.dump_field(value_casted, attributes[k])
|
390
|
-
|
391
|
-
t.add(k => value_dumped)
|
392
|
-
end
|
393
|
-
end
|
396
|
+
Inc.call(self, hash_key_value, range_key_value, counters)
|
397
|
+
self
|
394
398
|
end
|
395
399
|
end
|
396
400
|
|
@@ -400,16 +404,44 @@ module Dynamoid
|
|
400
404
|
#
|
401
405
|
# post.touch
|
402
406
|
#
|
403
|
-
# Can update
|
407
|
+
# Can update other fields in addition with the same timestamp if their
|
408
|
+
# names passed as arguments.
|
404
409
|
#
|
405
|
-
# user.touch(:last_login_at)
|
410
|
+
# user.touch(:last_login_at, :viewed_at)
|
406
411
|
#
|
407
|
-
#
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
412
|
+
# Some specific value can be used to save:
|
413
|
+
#
|
414
|
+
# user.touch(time: 1.hour.ago)
|
415
|
+
#
|
416
|
+
# No validation is performed and only +after_touch+ callback is called.
|
417
|
+
#
|
418
|
+
# The method must be used on a persisted object, otherwise
|
419
|
+
# +Dynamoid::Errors::Error+ will be thrown.
|
420
|
+
#
|
421
|
+
# @param names [*Symbol] a list of attribute names to update (optional)
|
422
|
+
# @param time [Time] datetime value that can be used instead of the current time (optional)
|
423
|
+
# @return [Dynamoid::Document] self
|
424
|
+
def touch(*names, time: nil)
|
425
|
+
if new_record?
|
426
|
+
raise Dynamoid::Errors::Error, 'cannot touch on a new or destroyed record object'
|
427
|
+
end
|
428
|
+
|
429
|
+
time_to_assign = time || DateTime.now
|
430
|
+
|
431
|
+
self.updated_at = time_to_assign
|
432
|
+
names.each do |name|
|
433
|
+
attributes[name] = time_to_assign
|
434
|
+
end
|
435
|
+
|
436
|
+
attribute_names = names.map(&:to_sym) + [:updated_at]
|
437
|
+
attributes_with_values = attributes.slice(*attribute_names)
|
438
|
+
|
439
|
+
run_callbacks :touch do
|
440
|
+
self.class.update_fields(hash_key, range_value, attributes_with_values)
|
441
|
+
clear_attribute_changes(attribute_names.map(&:to_s))
|
442
|
+
end
|
443
|
+
|
444
|
+
self
|
413
445
|
end
|
414
446
|
|
415
447
|
# Is this object persisted in DynamoDB?
|
@@ -476,18 +508,11 @@ module Dynamoid
|
|
476
508
|
# @since 0.2.0
|
477
509
|
def save(options = {})
|
478
510
|
self.class.create_table(sync: true)
|
511
|
+
create_or_update = new_record? ? :create : :update
|
479
512
|
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
run_callbacks(:create) do
|
484
|
-
run_callbacks(:save) do
|
485
|
-
Save.call(self)
|
486
|
-
end
|
487
|
-
end
|
488
|
-
else
|
489
|
-
run_callbacks(:save) do
|
490
|
-
Save.call(self)
|
513
|
+
run_callbacks(:save) do
|
514
|
+
run_callbacks(create_or_update) do
|
515
|
+
Save.call(self, touch: options[:touch])
|
491
516
|
end
|
492
517
|
end
|
493
518
|
end
|
@@ -532,21 +557,26 @@ module Dynamoid
|
|
532
557
|
#
|
533
558
|
# user.update_attribute(:last_name, 'Tylor')
|
534
559
|
#
|
560
|
+
# Validation is skipped.
|
561
|
+
#
|
535
562
|
# Raises a +Dynamoid::Errors::UnknownAttribute+ exception if any of the
|
536
563
|
# attributes is not on the model
|
537
564
|
#
|
538
565
|
# @param attribute [Symbol] attribute name to update
|
539
566
|
# @param value [Object] the value to assign it
|
540
567
|
# @return [Dynamoid::Document] self
|
568
|
+
#
|
541
569
|
# @since 0.2.0
|
542
570
|
def update_attribute(attribute, value)
|
571
|
+
# final implementation is in the Dynamoid::Validation module
|
543
572
|
write_attribute(attribute, value)
|
544
573
|
save
|
574
|
+
self
|
545
575
|
end
|
546
576
|
|
547
577
|
# Update a model.
|
548
578
|
#
|
549
|
-
#
|
579
|
+
# Doesn't run validation. Runs only +update+ callbacks. Reloads all attribute values.
|
550
580
|
#
|
551
581
|
# Accepts mandatory block in order to specify operations which will modify
|
552
582
|
# attributes. Supports following operations: +add+, +delete+ and +set+.
|
@@ -555,7 +585,7 @@ module Dynamoid
|
|
555
585
|
# collections if attribute is a collection (one of +array+, +set+ or
|
556
586
|
# +map+).
|
557
587
|
#
|
558
|
-
# user.update do |t|
|
588
|
+
# user.update! do |t|
|
559
589
|
# t.add(age: 1, followers_count: 5)
|
560
590
|
# t.add(hobbies: ['skying', 'climbing'])
|
561
591
|
# end
|
@@ -563,24 +593,28 @@ module Dynamoid
|
|
563
593
|
# Operation +delete+ is applied to collection attribute types and
|
564
594
|
# substructs one collection from another.
|
565
595
|
#
|
566
|
-
# user.update do |t|
|
596
|
+
# user.update! do |t|
|
567
597
|
# t.delete(hobbies: ['skying'])
|
568
598
|
# end
|
569
599
|
#
|
570
600
|
# Operation +set+ just changes an attribute value:
|
571
601
|
#
|
572
|
-
# user.update do |t|
|
602
|
+
# user.update! do |t|
|
573
603
|
# t.set(age: 21)
|
574
604
|
# end
|
575
605
|
#
|
576
|
-
# All the operations
|
606
|
+
# All the operations work like +ADD+, +DELETE+ and +PUT+ actions supported
|
577
607
|
# by +AttributeUpdates+
|
578
608
|
# {parameter}[https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.AttributeUpdates.html]
|
579
609
|
# of +UpdateItem+ operation.
|
580
610
|
#
|
611
|
+
# It's an atomic operation. So adding or deleting elements in a collection
|
612
|
+
# or incrementing or decrementing a numeric field is atomic and does not
|
613
|
+
# interfere with other write requests.
|
614
|
+
#
|
581
615
|
# Can update a model conditionaly:
|
582
616
|
#
|
583
|
-
# user.update(if: { age: 20 }) do |t|
|
617
|
+
# user.update!(if: { age: 20 }) do |t|
|
584
618
|
# t.add(age: 1)
|
585
619
|
# end
|
586
620
|
#
|
@@ -593,15 +627,24 @@ module Dynamoid
|
|
593
627
|
# fail.
|
594
628
|
#
|
595
629
|
# @param conditions [Hash] Conditions on model attributes to make a conditional update (optional)
|
630
|
+
# @return [Dynamoid::Document] self
|
596
631
|
def update!(conditions = {})
|
597
632
|
run_callbacks(:update) do
|
598
|
-
options =
|
633
|
+
options = {}
|
634
|
+
if range_key
|
635
|
+
value = read_attribute(range_key)
|
636
|
+
attribute_options = self.class.attributes[range_key]
|
637
|
+
options[:range_key] = Dumping.dump_field(value, attribute_options)
|
638
|
+
end
|
599
639
|
|
600
640
|
begin
|
601
|
-
|
641
|
+
table_name = self.class.table_name
|
642
|
+
update_item_options = options.merge(conditions: conditions)
|
643
|
+
|
644
|
+
new_attrs = Dynamoid.adapter.update_item(table_name, hash_key, update_item_options) do |t|
|
602
645
|
t.add(lock_version: 1) if self.class.attributes[:lock_version]
|
603
646
|
|
604
|
-
if
|
647
|
+
if self.class.timestamps_enabled?
|
605
648
|
time_now = DateTime.now.in_time_zone(Time.zone)
|
606
649
|
time_now_dumped = Dumping.dump_field(time_now, self.class.attributes[:updated_at])
|
607
650
|
t.set(updated_at: time_now_dumped)
|
@@ -614,11 +657,13 @@ module Dynamoid
|
|
614
657
|
raise Dynamoid::Errors::StaleObjectError.new(self, 'update')
|
615
658
|
end
|
616
659
|
end
|
660
|
+
|
661
|
+
self
|
617
662
|
end
|
618
663
|
|
619
664
|
# Update a model.
|
620
665
|
#
|
621
|
-
#
|
666
|
+
# Doesn't run validation. Runs only +update+ callbacks. Reloads all attribute values.
|
622
667
|
#
|
623
668
|
# Accepts mandatory block in order to specify operations which will modify
|
624
669
|
# attributes. Supports following operations: +add+, +delete+ and +set+.
|
@@ -639,6 +684,19 @@ module Dynamoid
|
|
639
684
|
# t.delete(hobbies: ['skying'])
|
640
685
|
# end
|
641
686
|
#
|
687
|
+
# If it's applied to a scalar attribute then the item's attribute is
|
688
|
+
# removed at all:
|
689
|
+
#
|
690
|
+
# user.update do |t|
|
691
|
+
# t.delete(age: nil)
|
692
|
+
# end
|
693
|
+
#
|
694
|
+
# or even without useless value at all:
|
695
|
+
#
|
696
|
+
# user.update do |t|
|
697
|
+
# t.delete(:age)
|
698
|
+
# end
|
699
|
+
#
|
642
700
|
# Operation +set+ just changes an attribute value:
|
643
701
|
#
|
644
702
|
# user.update do |t|
|
@@ -664,6 +722,7 @@ module Dynamoid
|
|
664
722
|
# fail.
|
665
723
|
#
|
666
724
|
# @param conditions [Hash] Conditions on model attributes to make a conditional update (optional)
|
725
|
+
# @return [true|false] - whether conditions are met and updating is successful
|
667
726
|
def update(conditions = {}, &block)
|
668
727
|
update!(conditions, &block)
|
669
728
|
true
|
@@ -696,14 +755,32 @@ module Dynamoid
|
|
696
755
|
# user.increment!(:followers_count)
|
697
756
|
# user.increment!(:followers_count, 2)
|
698
757
|
#
|
699
|
-
#
|
758
|
+
# Only `attribute` is saved. The model itself is not saved. So any other
|
759
|
+
# modified attributes will still be dirty. Validations and callbacks are
|
760
|
+
# skipped.
|
761
|
+
#
|
762
|
+
# When `:touch` option is passed the timestamp columns are updating. If
|
763
|
+
# attribute names are passed, they are updated along with updated_at
|
764
|
+
# attribute:
|
765
|
+
#
|
766
|
+
# user.increment!(:followers_count, touch: true)
|
767
|
+
# user.increment!(:followers_count, touch: :viewed_at)
|
768
|
+
# user.increment!(:followers_count, touch: [:viewed_at, :accessed_at])
|
700
769
|
#
|
701
770
|
# @param attribute [Symbol] attribute name
|
702
771
|
# @param by [Numeric] value to add (optional)
|
703
|
-
# @
|
704
|
-
|
772
|
+
# @param touch [true | Symbol | Array[Symbol]] to update update_at attribute and optionally the specified ones
|
773
|
+
# @return [Dynamoid::Document] self
|
774
|
+
def increment!(attribute, by = 1, touch: nil)
|
705
775
|
increment(attribute, by)
|
706
|
-
|
776
|
+
change = read_attribute(attribute) - (attribute_was(attribute) || 0)
|
777
|
+
|
778
|
+
run_callbacks :touch do
|
779
|
+
self.class.inc(hash_key, range_value, attribute => change, touch: touch)
|
780
|
+
clear_attribute_changes(attribute)
|
781
|
+
end
|
782
|
+
|
783
|
+
self
|
707
784
|
end
|
708
785
|
|
709
786
|
# Change numeric attribute value.
|
@@ -718,9 +795,7 @@ module Dynamoid
|
|
718
795
|
# @param by [Numeric] value to subtract (optional)
|
719
796
|
# @return [Dynamoid::Document] self
|
720
797
|
def decrement(attribute, by = 1)
|
721
|
-
|
722
|
-
self[attribute] -= by
|
723
|
-
self
|
798
|
+
increment(attribute, -by)
|
724
799
|
end
|
725
800
|
|
726
801
|
# Change numeric attribute value and save a model.
|
@@ -731,14 +806,24 @@ module Dynamoid
|
|
731
806
|
# user.decrement!(:followers_count)
|
732
807
|
# user.decrement!(:followers_count, 2)
|
733
808
|
#
|
734
|
-
#
|
809
|
+
# Only `attribute` is saved. The model itself is not saved. So any other
|
810
|
+
# modified attributes will still be dirty. Validations and callbacks are
|
811
|
+
# skipped.
|
812
|
+
#
|
813
|
+
# When `:touch` option is passed the timestamp columns are updating. If
|
814
|
+
# attribute names are passed, they are updated along with updated_at
|
815
|
+
# attribute:
|
816
|
+
#
|
817
|
+
# user.decrement!(:followers_count, touch: true)
|
818
|
+
# user.decrement!(:followers_count, touch: :viewed_at)
|
819
|
+
# user.decrement!(:followers_count, touch: [:viewed_at, :accessed_at])
|
735
820
|
#
|
736
821
|
# @param attribute [Symbol] attribute name
|
737
822
|
# @param by [Numeric] value to subtract (optional)
|
738
|
-
# @
|
739
|
-
|
740
|
-
|
741
|
-
|
823
|
+
# @param touch [true | Symbol | Array[Symbol]] to update update_at attribute and optionally the specified ones
|
824
|
+
# @return [Dynamoid::Document] self
|
825
|
+
def decrement!(attribute, by = 1, touch: nil)
|
826
|
+
increment!(attribute, -by, touch: touch)
|
742
827
|
end
|
743
828
|
|
744
829
|
# Delete a model.
|
@@ -748,9 +833,9 @@ module Dynamoid
|
|
748
833
|
# Supports optimistic locking with the +lock_version+ attribute and doesn't
|
749
834
|
# delete a model if it's already changed.
|
750
835
|
#
|
751
|
-
# Returns +
|
836
|
+
# Returns +self+ if deleted successfully and +false+ otherwise.
|
752
837
|
#
|
753
|
-
# @return [
|
838
|
+
# @return [Dynamoid::Document|false] whether deleted successfully
|
754
839
|
# @since 0.2.0
|
755
840
|
def destroy
|
756
841
|
ret = run_callbacks(:destroy) do
|
@@ -783,6 +868,7 @@ module Dynamoid
|
|
783
868
|
# Raises +Dynamoid::Errors::StaleObjectError+ exception if cannot delete a
|
784
869
|
# model.
|
785
870
|
#
|
871
|
+
# @return [Dynamoid::Document] self
|
786
872
|
# @since 0.2.0
|
787
873
|
def delete
|
788
874
|
options = range_key ? { range_key: Dumping.dump_field(read_attribute(range_key), self.class.attributes[range_key]) } : {}
|
@@ -803,9 +889,11 @@ module Dynamoid
|
|
803
889
|
|
804
890
|
Dynamoid.adapter.delete(self.class.table_name, hash_key, options)
|
805
891
|
|
806
|
-
self.class.associations.each do |name,
|
892
|
+
self.class.associations.each do |name, _options|
|
807
893
|
send(name).disassociate_source
|
808
894
|
end
|
895
|
+
|
896
|
+
self
|
809
897
|
rescue Dynamoid::Errors::ConditionalCheckFailedException
|
810
898
|
raise Dynamoid::Errors::StaleObjectError.new(self, 'delete')
|
811
899
|
end
|
data/lib/dynamoid/undumping.rb
CHANGED
@@ -236,9 +236,27 @@ module Dynamoid
|
|
236
236
|
end
|
237
237
|
|
238
238
|
class SerializedUndumper < Base
|
239
|
+
# We must use YAML.safe_load in Ruby 3.1 to handle serialized Set class
|
240
|
+
minimum_ruby_version = ->(version) { Gem::Version.new(RUBY_VERSION) >= Gem::Version.new(version) }
|
241
|
+
# Once we drop support for Rubies older than 2.6 we can remove this conditional (with major version bump)!
|
242
|
+
# YAML_SAFE_LOAD = minimum_ruby_version.call("2.6")
|
243
|
+
# But we don't want to change behavior for Ruby <= 3.0 that has been using the gem, without a major version bump
|
244
|
+
YAML_SAFE_LOAD = minimum_ruby_version.call('3.1')
|
245
|
+
|
239
246
|
def process(value)
|
240
247
|
if @options[:serializer]
|
241
248
|
@options[:serializer].load(value)
|
249
|
+
elsif YAML_SAFE_LOAD
|
250
|
+
# The classes listed in permitted classes are added to the default set of "safe loadable" classes.
|
251
|
+
# TrueClass
|
252
|
+
# FalseClass
|
253
|
+
# NilClass
|
254
|
+
# Integer
|
255
|
+
# Float
|
256
|
+
# String
|
257
|
+
# Array
|
258
|
+
# Hash
|
259
|
+
YAML.safe_load(value, permitted_classes: [Symbol, Set, Date, Time, DateTime])
|
242
260
|
else
|
243
261
|
YAML.load(value)
|
244
262
|
end
|
data/lib/dynamoid/validations.rb
CHANGED
@@ -38,6 +38,12 @@ module Dynamoid
|
|
38
38
|
self
|
39
39
|
end
|
40
40
|
|
41
|
+
def update_attribute(attribute, value)
|
42
|
+
write_attribute(attribute, value)
|
43
|
+
save(validate: false)
|
44
|
+
self
|
45
|
+
end
|
46
|
+
|
41
47
|
module ClassMethods
|
42
48
|
# Override validates_presence_of to handle false values as present.
|
43
49
|
#
|
data/lib/dynamoid/version.rb
CHANGED
data/lib/dynamoid.rb
CHANGED
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: 3.
|
4
|
+
version: 3.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josh Symonds
|
@@ -21,7 +21,7 @@ authors:
|
|
21
21
|
autorequire:
|
22
22
|
bindir: bin
|
23
23
|
cert_chain: []
|
24
|
-
date:
|
24
|
+
date: 2023-04-13 00:00:00.000000000 Z
|
25
25
|
dependencies:
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: activemodel
|
@@ -69,16 +69,16 @@ dependencies:
|
|
69
69
|
name: appraisal
|
70
70
|
requirement: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
|
-
- - "
|
72
|
+
- - ">="
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version: '
|
74
|
+
version: '0'
|
75
75
|
type: :development
|
76
76
|
prerelease: false
|
77
77
|
version_requirements: !ruby/object:Gem::Requirement
|
78
78
|
requirements:
|
79
|
-
- - "
|
79
|
+
- - ">="
|
80
80
|
- !ruby/object:Gem::Version
|
81
|
-
version: '
|
81
|
+
version: '0'
|
82
82
|
- !ruby/object:Gem::Dependency
|
83
83
|
name: bundler
|
84
84
|
requirement: !ruby/object:Gem::Requirement
|
@@ -93,34 +93,20 @@ dependencies:
|
|
93
93
|
- - ">="
|
94
94
|
- !ruby/object:Gem::Version
|
95
95
|
version: '0'
|
96
|
-
- !ruby/object:Gem::Dependency
|
97
|
-
name: coveralls
|
98
|
-
requirement: !ruby/object:Gem::Requirement
|
99
|
-
requirements:
|
100
|
-
- - "~>"
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
version: '0.8'
|
103
|
-
type: :development
|
104
|
-
prerelease: false
|
105
|
-
version_requirements: !ruby/object:Gem::Requirement
|
106
|
-
requirements:
|
107
|
-
- - "~>"
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: '0.8'
|
110
96
|
- !ruby/object:Gem::Dependency
|
111
97
|
name: pry
|
112
98
|
requirement: !ruby/object:Gem::Requirement
|
113
99
|
requirements:
|
114
100
|
- - "~>"
|
115
101
|
- !ruby/object:Gem::Version
|
116
|
-
version: 0.
|
102
|
+
version: '0.14'
|
117
103
|
type: :development
|
118
104
|
prerelease: false
|
119
105
|
version_requirements: !ruby/object:Gem::Requirement
|
120
106
|
requirements:
|
121
107
|
- - "~>"
|
122
108
|
- !ruby/object:Gem::Version
|
123
|
-
version: 0.
|
109
|
+
version: '0.14'
|
124
110
|
- !ruby/object:Gem::Dependency
|
125
111
|
name: rake
|
126
112
|
requirement: !ruby/object:Gem::Requirement
|
@@ -141,63 +127,49 @@ dependencies:
|
|
141
127
|
requirements:
|
142
128
|
- - "~>"
|
143
129
|
- !ruby/object:Gem::Version
|
144
|
-
version: '3.
|
130
|
+
version: '3.12'
|
145
131
|
type: :development
|
146
132
|
prerelease: false
|
147
133
|
version_requirements: !ruby/object:Gem::Requirement
|
148
134
|
requirements:
|
149
135
|
- - "~>"
|
150
136
|
- !ruby/object:Gem::Version
|
151
|
-
version: '3.
|
152
|
-
- !ruby/object:Gem::Dependency
|
153
|
-
name: rubocop
|
154
|
-
requirement: !ruby/object:Gem::Requirement
|
155
|
-
requirements:
|
156
|
-
- - ">="
|
157
|
-
- !ruby/object:Gem::Version
|
158
|
-
version: '0'
|
159
|
-
type: :development
|
160
|
-
prerelease: false
|
161
|
-
version_requirements: !ruby/object:Gem::Requirement
|
162
|
-
requirements:
|
163
|
-
- - ">="
|
164
|
-
- !ruby/object:Gem::Version
|
165
|
-
version: '0'
|
137
|
+
version: '3.12'
|
166
138
|
- !ruby/object:Gem::Dependency
|
167
|
-
name:
|
139
|
+
name: rubocop-lts
|
168
140
|
requirement: !ruby/object:Gem::Requirement
|
169
141
|
requirements:
|
170
142
|
- - "~>"
|
171
143
|
- !ruby/object:Gem::Version
|
172
|
-
version: '
|
144
|
+
version: '10.0'
|
173
145
|
type: :development
|
174
146
|
prerelease: false
|
175
147
|
version_requirements: !ruby/object:Gem::Requirement
|
176
148
|
requirements:
|
177
149
|
- - "~>"
|
178
150
|
- !ruby/object:Gem::Version
|
179
|
-
version: '
|
151
|
+
version: '10.0'
|
180
152
|
- !ruby/object:Gem::Dependency
|
181
153
|
name: yard
|
182
154
|
requirement: !ruby/object:Gem::Requirement
|
183
155
|
requirements:
|
184
|
-
- - "
|
156
|
+
- - ">="
|
185
157
|
- !ruby/object:Gem::Version
|
186
|
-
version: '0
|
158
|
+
version: '0'
|
187
159
|
type: :development
|
188
160
|
prerelease: false
|
189
161
|
version_requirements: !ruby/object:Gem::Requirement
|
190
162
|
requirements:
|
191
|
-
- - "
|
163
|
+
- - ">="
|
192
164
|
- !ruby/object:Gem::Version
|
193
|
-
version: '0
|
165
|
+
version: '0'
|
194
166
|
description: Dynamoid is an ORM for Amazon's DynamoDB that supports offline development,
|
195
167
|
associations, querying, and everything else you'd expect from an ActiveRecord-style
|
196
168
|
replacement.
|
197
169
|
email:
|
170
|
+
- andry.konchin@gmail.com
|
198
171
|
- peter.boling@gmail.com
|
199
172
|
- brian@stellaservice.com
|
200
|
-
- andry.konchin@gmail.com
|
201
173
|
executables: []
|
202
174
|
extensions: []
|
203
175
|
extra_rdoc_files: []
|
@@ -205,11 +177,14 @@ files:
|
|
205
177
|
- CHANGELOG.md
|
206
178
|
- LICENSE.txt
|
207
179
|
- README.md
|
180
|
+
- SECURITY.md
|
181
|
+
- dynamoid.gemspec
|
208
182
|
- lib/dynamoid.rb
|
209
183
|
- lib/dynamoid/adapter.rb
|
210
184
|
- lib/dynamoid/adapter_plugin/aws_sdk_v3.rb
|
211
185
|
- lib/dynamoid/adapter_plugin/aws_sdk_v3/batch_get_item.rb
|
212
186
|
- lib/dynamoid/adapter_plugin/aws_sdk_v3/create_table.rb
|
187
|
+
- lib/dynamoid/adapter_plugin/aws_sdk_v3/execute_statement.rb
|
213
188
|
- lib/dynamoid/adapter_plugin/aws_sdk_v3/item_updater.rb
|
214
189
|
- lib/dynamoid/adapter_plugin/aws_sdk_v3/middleware/backoff.rb
|
215
190
|
- lib/dynamoid/adapter_plugin/aws_sdk_v3/middleware/limit.rb
|
@@ -253,6 +228,7 @@ files:
|
|
253
228
|
- lib/dynamoid/middleware/identity_map.rb
|
254
229
|
- lib/dynamoid/persistence.rb
|
255
230
|
- lib/dynamoid/persistence/import.rb
|
231
|
+
- lib/dynamoid/persistence/inc.rb
|
256
232
|
- lib/dynamoid/persistence/save.rb
|
257
233
|
- lib/dynamoid/persistence/update_fields.rb
|
258
234
|
- lib/dynamoid/persistence/update_validations.rb
|
@@ -270,10 +246,14 @@ homepage: http://github.com/Dynamoid/dynamoid
|
|
270
246
|
licenses:
|
271
247
|
- MIT
|
272
248
|
metadata:
|
249
|
+
homepage_uri: http://github.com/Dynamoid/dynamoid
|
250
|
+
source_code_uri: https://github.com/Dynamoid/dynamoid/tree/v3.9.0
|
251
|
+
changelog_uri: https://github.com/Dynamoid/dynamoid/blob/v3.9.0/CHANGELOG.md
|
273
252
|
bug_tracker_uri: https://github.com/Dynamoid/dynamoid/issues
|
274
|
-
|
275
|
-
|
276
|
-
|
253
|
+
documentation_uri: https://www.rubydoc.info/gems/dynamoid/3.9.0
|
254
|
+
funding_uri: https://opencollective.com/dynamoid
|
255
|
+
wiki_uri: https://github.com/Dynamoid/dynamoid/wiki
|
256
|
+
rubygems_mfa_required: 'true'
|
277
257
|
post_install_message:
|
278
258
|
rdoc_options: []
|
279
259
|
require_paths:
|
@@ -289,7 +269,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
289
269
|
- !ruby/object:Gem::Version
|
290
270
|
version: '0'
|
291
271
|
requirements: []
|
292
|
-
rubygems_version: 3.
|
272
|
+
rubygems_version: 3.4.6
|
293
273
|
signing_key:
|
294
274
|
specification_version: 4
|
295
275
|
summary: Dynamoid is an ORM for Amazon's DynamoDB
|