dynamoid 3.2.0 → 3.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +111 -1
  3. data/README.md +580 -241
  4. data/lib/dynamoid.rb +2 -0
  5. data/lib/dynamoid/adapter.rb +15 -15
  6. data/lib/dynamoid/adapter_plugin/aws_sdk_v3.rb +82 -102
  7. data/lib/dynamoid/adapter_plugin/aws_sdk_v3/batch_get_item.rb +108 -0
  8. data/lib/dynamoid/adapter_plugin/aws_sdk_v3/create_table.rb +29 -16
  9. data/lib/dynamoid/adapter_plugin/aws_sdk_v3/item_updater.rb +3 -2
  10. data/lib/dynamoid/adapter_plugin/aws_sdk_v3/middleware/backoff.rb +2 -2
  11. data/lib/dynamoid/adapter_plugin/aws_sdk_v3/middleware/limit.rb +2 -3
  12. data/lib/dynamoid/adapter_plugin/aws_sdk_v3/middleware/start_key.rb +2 -2
  13. data/lib/dynamoid/adapter_plugin/aws_sdk_v3/query.rb +15 -6
  14. data/lib/dynamoid/adapter_plugin/aws_sdk_v3/scan.rb +15 -5
  15. data/lib/dynamoid/adapter_plugin/aws_sdk_v3/table.rb +1 -0
  16. data/lib/dynamoid/adapter_plugin/aws_sdk_v3/until_past_table_status.rb +5 -3
  17. data/lib/dynamoid/application_time_zone.rb +1 -0
  18. data/lib/dynamoid/associations.rb +182 -19
  19. data/lib/dynamoid/associations/association.rb +4 -2
  20. data/lib/dynamoid/associations/belongs_to.rb +2 -1
  21. data/lib/dynamoid/associations/has_and_belongs_to_many.rb +2 -1
  22. data/lib/dynamoid/associations/has_many.rb +2 -1
  23. data/lib/dynamoid/associations/has_one.rb +2 -1
  24. data/lib/dynamoid/associations/many_association.rb +65 -22
  25. data/lib/dynamoid/associations/single_association.rb +28 -1
  26. data/lib/dynamoid/components.rb +8 -3
  27. data/lib/dynamoid/config.rb +16 -3
  28. data/lib/dynamoid/config/backoff_strategies/constant_backoff.rb +1 -0
  29. data/lib/dynamoid/config/backoff_strategies/exponential_backoff.rb +1 -0
  30. data/lib/dynamoid/config/options.rb +1 -0
  31. data/lib/dynamoid/criteria.rb +2 -1
  32. data/lib/dynamoid/criteria/chain.rb +418 -46
  33. data/lib/dynamoid/criteria/ignored_conditions_detector.rb +3 -3
  34. data/lib/dynamoid/criteria/key_fields_detector.rb +109 -32
  35. data/lib/dynamoid/criteria/nonexistent_fields_detector.rb +3 -2
  36. data/lib/dynamoid/criteria/overwritten_conditions_detector.rb +1 -1
  37. data/lib/dynamoid/dirty.rb +239 -32
  38. data/lib/dynamoid/document.rb +130 -251
  39. data/lib/dynamoid/dumping.rb +9 -0
  40. data/lib/dynamoid/dynamodb_time_zone.rb +1 -0
  41. data/lib/dynamoid/fields.rb +246 -20
  42. data/lib/dynamoid/finders.rb +69 -32
  43. data/lib/dynamoid/identity_map.rb +6 -0
  44. data/lib/dynamoid/indexes.rb +76 -17
  45. data/lib/dynamoid/loadable.rb +31 -0
  46. data/lib/dynamoid/log/formatter.rb +26 -0
  47. data/lib/dynamoid/middleware/identity_map.rb +1 -0
  48. data/lib/dynamoid/persistence.rb +592 -122
  49. data/lib/dynamoid/persistence/import.rb +73 -0
  50. data/lib/dynamoid/persistence/save.rb +64 -0
  51. data/lib/dynamoid/persistence/update_fields.rb +63 -0
  52. data/lib/dynamoid/persistence/upsert.rb +60 -0
  53. data/lib/dynamoid/primary_key_type_mapping.rb +1 -0
  54. data/lib/dynamoid/railtie.rb +1 -0
  55. data/lib/dynamoid/tasks.rb +3 -1
  56. data/lib/dynamoid/tasks/database.rb +1 -0
  57. data/lib/dynamoid/type_casting.rb +12 -2
  58. data/lib/dynamoid/undumping.rb +8 -0
  59. data/lib/dynamoid/validations.rb +2 -0
  60. data/lib/dynamoid/version.rb +1 -1
  61. metadata +49 -71
  62. data/.coveralls.yml +0 -1
  63. data/.document +0 -5
  64. data/.gitignore +0 -74
  65. data/.rspec +0 -2
  66. data/.rubocop.yml +0 -71
  67. data/.rubocop_todo.yml +0 -55
  68. data/.travis.yml +0 -41
  69. data/Appraisals +0 -28
  70. data/Gemfile +0 -8
  71. data/Rakefile +0 -46
  72. data/Vagrantfile +0 -29
  73. data/docker-compose.yml +0 -7
  74. data/dynamoid.gemspec +0 -57
  75. data/gemfiles/rails_4_2.gemfile +0 -11
  76. data/gemfiles/rails_5_0.gemfile +0 -10
  77. data/gemfiles/rails_5_1.gemfile +0 -10
  78. data/gemfiles/rails_5_2.gemfile +0 -10
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ module Dynamoid
6
+ module Persistence
7
+ # @private
8
+ class Import
9
+ def self.call(model_class, array_of_attributes)
10
+ new(model_class, array_of_attributes).call
11
+ end
12
+
13
+ def initialize(model_class, array_of_attributes)
14
+ @model_class = model_class
15
+ @array_of_attributes = array_of_attributes
16
+ end
17
+
18
+ def call
19
+ models = @array_of_attributes.map(&method(:build_model))
20
+
21
+ unless Dynamoid.config.backoff
22
+ import(models)
23
+ else
24
+ import_with_backoff(models)
25
+ end
26
+
27
+ models.each { |d| d.new_record = false }
28
+ models
29
+ end
30
+
31
+ private
32
+
33
+ def build_model(attributes)
34
+ attrs = attributes.symbolize_keys
35
+
36
+ if @model_class.timestamps_enabled?
37
+ time_now = DateTime.now.in_time_zone(Time.zone)
38
+ attrs[:created_at] ||= time_now
39
+ attrs[:updated_at] ||= time_now
40
+ end
41
+
42
+ @model_class.build(attrs).tap do |model|
43
+ model.hash_key = SecureRandom.uuid if model.hash_key.blank?
44
+ end
45
+ end
46
+
47
+ def import_with_backoff(models)
48
+ backoff = nil
49
+ table_name = @model_class.table_name
50
+ items = array_of_dumped_attributes(models)
51
+
52
+ Dynamoid.adapter.batch_write_item(table_name, items) do |has_unprocessed_items|
53
+ if has_unprocessed_items
54
+ backoff ||= Dynamoid.config.build_backoff
55
+ backoff.call
56
+ else
57
+ backoff = nil
58
+ end
59
+ end
60
+ end
61
+
62
+ def import(models)
63
+ Dynamoid.adapter.batch_write_item(@model_class.table_name, array_of_dumped_attributes(models))
64
+ end
65
+
66
+ def array_of_dumped_attributes(models)
67
+ models.map do |m|
68
+ Dumping.dump_attributes(m.attributes, @model_class.attributes)
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dynamoid
4
+ module Persistence
5
+ # @private
6
+ class Save
7
+ def self.call(model)
8
+ new(model).call
9
+ end
10
+
11
+ def initialize(model)
12
+ @model = model
13
+ end
14
+
15
+ def call
16
+ @model.hash_key = SecureRandom.uuid if @model.hash_key.blank?
17
+
18
+ # Add an optimistic locking check if the lock_version column exists
19
+ if @model.class.attributes[:lock_version]
20
+ @model.lock_version = (@model.lock_version || 0) + 1
21
+ end
22
+
23
+ attributes_dumped = Dumping.dump_attributes(@model.attributes, @model.class.attributes)
24
+ Dynamoid.adapter.write(@model.class.table_name, attributes_dumped, conditions_for_write)
25
+
26
+ @model.new_record = false
27
+ true
28
+ rescue Dynamoid::Errors::ConditionalCheckFailedException => e
29
+ if @model.new_record?
30
+ raise Dynamoid::Errors::RecordNotUnique.new(e, @model)
31
+ else
32
+ raise Dynamoid::Errors::StaleObjectError.new(@model, 'persist')
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ # Should be called after incrementing `lock_version` attribute
39
+ def conditions_for_write
40
+ conditions = {}
41
+
42
+ # Add an 'exists' check to prevent overwriting existing records with new ones
43
+ if @model.new_record?
44
+ conditions[:unless_exists] = [@model.class.hash_key]
45
+ if @model.range_key
46
+ conditions[:unless_exists] << @model.range_key
47
+ end
48
+ end
49
+
50
+ # Add an optimistic locking check if the lock_version column exists
51
+ if @model.class.attributes[:lock_version]
52
+ # Uses the original lock_version value from Dirty API
53
+ # in case user changed 'lock_version' manually
54
+ if @model.changes[:lock_version][0]
55
+ conditions[:if] ||= {}
56
+ conditions[:if][:lock_version] = @model.changes[:lock_version][0]
57
+ end
58
+ end
59
+
60
+ conditions
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dynamoid
4
+ module Persistence
5
+ # @private
6
+ class UpdateFields
7
+ def self.call(*args)
8
+ new(*args).call
9
+ end
10
+
11
+ def initialize(model_class, partition_key:, sort_key:, attributes:, conditions:)
12
+ @model_class = model_class
13
+ @partition_key = partition_key
14
+ @sort_key = sort_key
15
+ @attributes = attributes.symbolize_keys
16
+ @conditions = conditions
17
+ end
18
+
19
+ def call
20
+ if Dynamoid::Config.timestamps
21
+ @attributes[:updated_at] ||= DateTime.now.in_time_zone(Time.zone)
22
+ end
23
+
24
+ raw_attributes = update_item
25
+ @model_class.new(undump_attributes(raw_attributes))
26
+ rescue Dynamoid::Errors::ConditionalCheckFailedException
27
+ end
28
+
29
+ private
30
+
31
+ def update_item
32
+ Dynamoid.adapter.update_item(@model_class.table_name, @partition_key, options_to_update_item) do |t|
33
+ @attributes.each do |k, v|
34
+ value_casted = TypeCasting.cast_field(v, @model_class.attributes[k])
35
+ value_dumped = Dumping.dump_field(value_casted, @model_class.attributes[k])
36
+ t.set(k => value_dumped)
37
+ end
38
+ end
39
+ end
40
+
41
+ def undump_attributes(attributes)
42
+ Undumping.undump_attributes(attributes, @model_class.attributes)
43
+ end
44
+
45
+ def options_to_update_item
46
+ options = {}
47
+
48
+ if @model_class.range_key
49
+ value_casted = TypeCasting.cast_field(@sort_key, @model_class.attributes[@model_class.range_key])
50
+ value_dumped = Dumping.dump_field(value_casted, @model_class.attributes[@model_class.range_key])
51
+ options[:range_key] = value_dumped
52
+ end
53
+
54
+ conditions = @conditions.deep_dup
55
+ conditions[:if_exists] ||= {}
56
+ conditions[:if_exists][@model_class.hash_key] = @partition_key
57
+ options[:conditions] = conditions
58
+
59
+ options
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dynamoid
4
+ module Persistence
5
+ # @private
6
+ class Upsert
7
+ def self.call(*args)
8
+ new(*args).call
9
+ end
10
+
11
+ def initialize(model_class, partition_key:, sort_key:, attributes:, conditions:)
12
+ @model_class = model_class
13
+ @partition_key = partition_key
14
+ @sort_key = sort_key
15
+ @attributes = attributes.symbolize_keys
16
+ @conditions = conditions
17
+ end
18
+
19
+ def call
20
+ if Dynamoid::Config.timestamps
21
+ @attributes[:updated_at] ||= DateTime.now.in_time_zone(Time.zone)
22
+ end
23
+
24
+ raw_attributes = update_item
25
+ @model_class.new(undump_attributes(raw_attributes))
26
+ rescue Dynamoid::Errors::ConditionalCheckFailedException
27
+ end
28
+
29
+ private
30
+
31
+ def update_item
32
+ Dynamoid.adapter.update_item(@model_class.table_name, @partition_key, options_to_update_item) do |t|
33
+ @attributes.each do |k, v|
34
+ value_casted = TypeCasting.cast_field(v, @model_class.attributes[k])
35
+ value_dumped = Dumping.dump_field(value_casted, @model_class.attributes[k])
36
+
37
+ t.set(k => value_dumped)
38
+ end
39
+ end
40
+ end
41
+
42
+ def options_to_update_item
43
+ options = {}
44
+
45
+ if @model_class.range_key
46
+ value_casted = TypeCasting.cast_field(@sort_key, @model_class.attributes[@model_class.range_key])
47
+ value_dumped = Dumping.dump_field(value_casted, @model_class.attributes[@model_class.range_key])
48
+ options[:range_key] = value_dumped
49
+ end
50
+
51
+ options[:conditions] = @conditions
52
+ options
53
+ end
54
+
55
+ def undump_attributes(raw_attributes)
56
+ Undumping.undump_attributes(raw_attributes, @model_class.attributes)
57
+ end
58
+ end
59
+ end
60
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dynamoid
4
+ # @private
4
5
  class PrimaryKeyTypeMapping
5
6
  def self.dynamodb_type(type, options)
6
7
  if type.is_a?(Class)
@@ -3,6 +3,7 @@
3
3
  if defined? Rails
4
4
 
5
5
  module Dynamoid
6
+ # @private
6
7
  class Railtie < Rails::Railtie
7
8
  rake_tasks do
8
9
  Dir[File.join(File.dirname(__FILE__), 'tasks/*.rake')].each { |f| load f }
@@ -1 +1,3 @@
1
- load "dynamoid/tasks/database.rake"
1
+ # frozen_string_literal: true
2
+
3
+ load 'dynamoid/tasks/database.rake'
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dynamoid
4
+ # @private
4
5
  module Tasks
5
6
  module Database
6
7
  module_function
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dynamoid
4
+ # @private
4
5
  module TypeCasting
5
6
  def self.cast_attributes(attributes, attributes_options)
6
7
  {}.tap do |h|
@@ -35,6 +36,7 @@ module Dynamoid
35
36
  when :raw then RawTypeCaster
36
37
  when :serialized then SerializedTypeCaster
37
38
  when :boolean then BooleanTypeCaster
39
+ when :binary then BinaryTypeCaster
38
40
  when Class then CustomTypeCaster
39
41
  end
40
42
 
@@ -215,8 +217,6 @@ module Dynamoid
215
217
  value.to_hash
216
218
  elsif value.respond_to? :to_h
217
219
  value.to_h
218
- else
219
- nil
220
220
  end
221
221
  end
222
222
  end
@@ -285,6 +285,16 @@ module Dynamoid
285
285
  end
286
286
  end
287
287
 
288
+ class BinaryTypeCaster < Base
289
+ def process(value)
290
+ if value.is_a? String
291
+ value.dup
292
+ else
293
+ value.to_s
294
+ end
295
+ end
296
+ end
297
+
288
298
  class CustomTypeCaster < Base
289
299
  end
290
300
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dynamoid
4
+ # @private
4
5
  module Undumping
5
6
  def self.undump_attributes(attributes, attributes_options)
6
7
  {}.tap do |h|
@@ -38,6 +39,7 @@ module Dynamoid
38
39
  when :raw then RawUndumper
39
40
  when :serialized then SerializedUndumper
40
41
  when :boolean then BooleanUndumper
42
+ when :binary then BinaryUndumper
41
43
  when Class then CustomTypeUndumper
42
44
  end
43
45
 
@@ -262,6 +264,12 @@ module Dynamoid
262
264
  end
263
265
  end
264
266
 
267
+ class BinaryUndumper < Base
268
+ def process(value)
269
+ Base64.strict_decode64(value)
270
+ end
271
+ end
272
+
265
273
  class CustomTypeUndumper < Base
266
274
  def process(value)
267
275
  field_class = @options[:type]
@@ -10,6 +10,7 @@ module Dynamoid
10
10
 
11
11
  # Override save to provide validation support.
12
12
  #
13
+ # @private
13
14
  # @since 0.2.0
14
15
  def save(options = {})
15
16
  options.reverse_merge!(validate: true)
@@ -28,6 +29,7 @@ module Dynamoid
28
29
 
29
30
  # Raise an error unless this object is valid.
30
31
  #
32
+ # @private
31
33
  # @since 0.2.0
32
34
  def save!
33
35
  raise Dynamoid::Errors::DocumentNotValid, self unless valid?
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dynamoid
4
- VERSION = '3.2.0'
4
+ VERSION = '3.6.0'
5
5
  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: 3.2.0
4
+ version: 3.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Symonds
@@ -19,9 +19,9 @@ authors:
19
19
  - Peter Boling
20
20
  - Andrew Konchin
21
21
  autorequire:
22
- bindir: exe
22
+ bindir: bin
23
23
  cert_chain: []
24
- date: 2019-05-15 00:00:00.000000000 Z
24
+ date: 2020-07-13 00:00:00.000000000 Z
25
25
  dependencies:
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: activemodel
@@ -43,14 +43,14 @@ dependencies:
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '1'
46
+ version: '1.0'
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '1'
53
+ version: '1.0'
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: concurrent-ruby
56
56
  requirement: !ruby/object:Gem::Requirement
@@ -65,34 +65,20 @@ dependencies:
65
65
  - - ">="
66
66
  - !ruby/object:Gem::Version
67
67
  version: '1.0'
68
- - !ruby/object:Gem::Dependency
69
- name: null-logger
70
- requirement: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - ">="
73
- - !ruby/object:Gem::Version
74
- version: '0'
75
- type: :runtime
76
- prerelease: false
77
- version_requirements: !ruby/object:Gem::Requirement
78
- requirements:
79
- - - ">="
80
- - !ruby/object:Gem::Version
81
- version: '0'
82
68
  - !ruby/object:Gem::Dependency
83
69
  name: appraisal
84
70
  requirement: !ruby/object:Gem::Requirement
85
71
  requirements:
86
- - - ">="
72
+ - - "~>"
87
73
  - !ruby/object:Gem::Version
88
- version: '0'
74
+ version: '2.2'
89
75
  type: :development
90
76
  prerelease: false
91
77
  version_requirements: !ruby/object:Gem::Requirement
92
78
  requirements:
93
- - - ">="
79
+ - - "~>"
94
80
  - !ruby/object:Gem::Version
95
- version: '0'
81
+ version: '2.2'
96
82
  - !ruby/object:Gem::Dependency
97
83
  name: bundler
98
84
  requirement: !ruby/object:Gem::Requirement
@@ -111,58 +97,58 @@ dependencies:
111
97
  name: coveralls
112
98
  requirement: !ruby/object:Gem::Requirement
113
99
  requirements:
114
- - - ">="
100
+ - - "~>"
115
101
  - !ruby/object:Gem::Version
116
- version: '0'
102
+ version: '0.8'
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.8'
124
110
  - !ruby/object:Gem::Dependency
125
111
  name: pry
126
112
  requirement: !ruby/object:Gem::Requirement
127
113
  requirements:
128
- - - ">="
114
+ - - "~>"
129
115
  - !ruby/object:Gem::Version
130
- version: '0'
116
+ version: 0.12.0
131
117
  type: :development
132
118
  prerelease: false
133
119
  version_requirements: !ruby/object:Gem::Requirement
134
120
  requirements:
135
- - - ">="
121
+ - - "~>"
136
122
  - !ruby/object:Gem::Version
137
- version: '0'
123
+ version: 0.12.0
138
124
  - !ruby/object:Gem::Dependency
139
125
  name: rake
140
126
  requirement: !ruby/object:Gem::Requirement
141
127
  requirements:
142
- - - ">="
128
+ - - "~>"
143
129
  - !ruby/object:Gem::Version
144
- version: '0'
130
+ version: '13.0'
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: '0'
137
+ version: '13.0'
152
138
  - !ruby/object:Gem::Dependency
153
139
  name: rspec
154
140
  requirement: !ruby/object:Gem::Requirement
155
141
  requirements:
156
- - - ">="
142
+ - - "~>"
157
143
  - !ruby/object:Gem::Version
158
- version: '0'
144
+ version: '3.9'
159
145
  type: :development
160
146
  prerelease: false
161
147
  version_requirements: !ruby/object:Gem::Requirement
162
148
  requirements:
163
- - - ">="
149
+ - - "~>"
164
150
  - !ruby/object:Gem::Version
165
- version: '0'
151
+ version: '3.9'
166
152
  - !ruby/object:Gem::Dependency
167
153
  name: rubocop
168
154
  requirement: !ruby/object:Gem::Requirement
@@ -181,65 +167,48 @@ dependencies:
181
167
  name: wwtd
182
168
  requirement: !ruby/object:Gem::Requirement
183
169
  requirements:
184
- - - ">="
170
+ - - "~>"
185
171
  - !ruby/object:Gem::Version
186
- version: '0'
172
+ version: '1.4'
187
173
  type: :development
188
174
  prerelease: false
189
175
  version_requirements: !ruby/object:Gem::Requirement
190
176
  requirements:
191
- - - ">="
177
+ - - "~>"
192
178
  - !ruby/object:Gem::Version
193
- version: '0'
179
+ version: '1.4'
194
180
  - !ruby/object:Gem::Dependency
195
181
  name: yard
196
182
  requirement: !ruby/object:Gem::Requirement
197
183
  requirements:
198
- - - ">="
184
+ - - "~>"
199
185
  - !ruby/object:Gem::Version
200
- version: '0'
186
+ version: '0.9'
201
187
  type: :development
202
188
  prerelease: false
203
189
  version_requirements: !ruby/object:Gem::Requirement
204
190
  requirements:
205
- - - ">="
191
+ - - "~>"
206
192
  - !ruby/object:Gem::Version
207
- version: '0'
193
+ version: '0.9'
208
194
  description: Dynamoid is an ORM for Amazon's DynamoDB that supports offline development,
209
195
  associations, querying, and everything else you'd expect from an ActiveRecord-style
210
196
  replacement.
211
197
  email:
212
198
  - peter.boling@gmail.com
213
199
  - brian@stellaservice.com
200
+ - andry.konchin@gmail.com
214
201
  executables: []
215
202
  extensions: []
216
- extra_rdoc_files:
217
- - LICENSE.txt
218
- - README.md
203
+ extra_rdoc_files: []
219
204
  files:
220
- - ".coveralls.yml"
221
- - ".document"
222
- - ".gitignore"
223
- - ".rspec"
224
- - ".rubocop.yml"
225
- - ".rubocop_todo.yml"
226
- - ".travis.yml"
227
- - Appraisals
228
205
  - CHANGELOG.md
229
- - Gemfile
230
206
  - LICENSE.txt
231
207
  - README.md
232
- - Rakefile
233
- - Vagrantfile
234
- - docker-compose.yml
235
- - dynamoid.gemspec
236
- - gemfiles/rails_4_2.gemfile
237
- - gemfiles/rails_5_0.gemfile
238
- - gemfiles/rails_5_1.gemfile
239
- - gemfiles/rails_5_2.gemfile
240
208
  - lib/dynamoid.rb
241
209
  - lib/dynamoid/adapter.rb
242
210
  - lib/dynamoid/adapter_plugin/aws_sdk_v3.rb
211
+ - lib/dynamoid/adapter_plugin/aws_sdk_v3/batch_get_item.rb
243
212
  - lib/dynamoid/adapter_plugin/aws_sdk_v3/create_table.rb
244
213
  - lib/dynamoid/adapter_plugin/aws_sdk_v3/item_updater.rb
245
214
  - lib/dynamoid/adapter_plugin/aws_sdk_v3/middleware/backoff.rb
@@ -278,8 +247,14 @@ files:
278
247
  - lib/dynamoid/finders.rb
279
248
  - lib/dynamoid/identity_map.rb
280
249
  - lib/dynamoid/indexes.rb
250
+ - lib/dynamoid/loadable.rb
251
+ - lib/dynamoid/log/formatter.rb
281
252
  - lib/dynamoid/middleware/identity_map.rb
282
253
  - lib/dynamoid/persistence.rb
254
+ - lib/dynamoid/persistence/import.rb
255
+ - lib/dynamoid/persistence/save.rb
256
+ - lib/dynamoid/persistence/update_fields.rb
257
+ - lib/dynamoid/persistence/upsert.rb
283
258
  - lib/dynamoid/primary_key_type_mapping.rb
284
259
  - lib/dynamoid/railtie.rb
285
260
  - lib/dynamoid/tasks.rb
@@ -289,10 +264,14 @@ files:
289
264
  - lib/dynamoid/undumping.rb
290
265
  - lib/dynamoid/validations.rb
291
266
  - lib/dynamoid/version.rb
292
- homepage: http://github.com/Dynamoid/Dynamoid
267
+ homepage: http://github.com/Dynamoid/dynamoid
293
268
  licenses:
294
269
  - MIT
295
- metadata: {}
270
+ metadata:
271
+ bug_tracker_uri: https://github.com/Dynamoid/dynamoid/issues
272
+ changelog_uri: https://github.com/Dynamoid/dynamoid/tree/v3.6.0/CHANGELOG.md
273
+ source_code_uri: https://github.com/Dynamoid/dynamoid/tree/v3.6.0
274
+ documentation_uri: https://rubydoc.info/gems/dynamoid/3.6.0
296
275
  post_install_message:
297
276
  rdoc_options: []
298
277
  require_paths:
@@ -308,8 +287,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
308
287
  - !ruby/object:Gem::Version
309
288
  version: '0'
310
289
  requirements: []
311
- rubyforge_project:
312
- rubygems_version: 2.7.6
290
+ rubygems_version: 3.1.2
313
291
  signing_key:
314
292
  specification_version: 4
315
293
  summary: Dynamoid is an ORM for Amazon's DynamoDB