dynamoid 3.3.0 → 3.4.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 +23 -0
- data/README.md +96 -28
- data/lib/dynamoid/adapter.rb +5 -1
- data/lib/dynamoid/adapter_plugin/aws_sdk_v3.rb +26 -5
- data/lib/dynamoid/adapter_plugin/aws_sdk_v3/create_table.rb +11 -4
- data/lib/dynamoid/components.rb +1 -0
- data/lib/dynamoid/config.rb +13 -1
- data/lib/dynamoid/document.rb +10 -5
- data/lib/dynamoid/fields.rb +37 -5
- data/lib/dynamoid/persistence.rb +7 -1
- data/lib/dynamoid/persistence/import.rb +1 -1
- data/lib/dynamoid/version.rb +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7dd36d27f502c400c3275bf584ce8eba095b32732db1b9567ad9a3ceac64eb50
|
4
|
+
data.tar.gz: '084f10baa66c9d22febfaa884f410be5222774283d58fda3f237c7b9b204c572'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 43ac82ed7d651e4b92845bf08f372ca57bf7b3bde0c3f49a3afbc7b6cbd1125574938472d6041627882e82c90379e5063ecd285d0092761cb4a5c209f9041510
|
7
|
+
data.tar.gz: 2a7f71ed8470bfce21a0b1c761d99681f02bbd797be65b2a4fe21ea72c54b7c22e52571f43ddcbedf980ab24ac26a4b54df1c41fd464f2cc1bdd7ac10817df33
|
data/CHANGELOG.md
CHANGED
@@ -12,6 +12,29 @@
|
|
12
12
|
|
13
13
|
|
14
14
|
|
15
|
+
# 3.4.0
|
16
|
+
|
17
|
+
## Features
|
18
|
+
* Feature: [#386](https://github.com/Dynamoid/dynamoid/pull/386) Disable timestamps fields on a table level with new
|
19
|
+
table option `timestamps`
|
20
|
+
* Feature: [#387](https://github.com/Dynamoid/dynamoid/pull/387) Add TTL support with table option `expires`
|
21
|
+
* Feature: [#393](https://github.com/Dynamoid/dynamoid/pull/393) Support pre-configured credentials with new config
|
22
|
+
option `credentials` (@emmajhyde)
|
23
|
+
* Feature: [#397](https://github.com/Dynamoid/dynamoid/pull/397) Configure on-demand table capacity mode with `capacity_mode` option
|
24
|
+
|
25
|
+
## Improvements
|
26
|
+
* Improvement: [#388](https://github.com/Dynamoid/dynamoid/pull/388) Minor memory optimization - don't allocate excessive
|
27
|
+
hash (@arjes)
|
28
|
+
|
29
|
+
## Fixes
|
30
|
+
|
31
|
+
Fix: [#382](https://github.com/Dynamoid/dynamoid/pull/382) Fixed deprecation warning about `Module#parent_name` in Rails 6 (@tmandke)
|
32
|
+
Fix: Typos in Readme.md (@romeuhcf)
|
33
|
+
|
34
|
+
---
|
35
|
+
|
36
|
+
|
37
|
+
|
15
38
|
# 3.3.0
|
16
39
|
|
17
40
|
## Features
|
data/README.md
CHANGED
@@ -34,7 +34,7 @@ Gemfile:
|
|
34
34
|
```ruby
|
35
35
|
gem 'dynamoid'
|
36
36
|
```
|
37
|
-
##
|
37
|
+
## Prerequisites
|
38
38
|
|
39
39
|
Dynamoid depends on the aws-sdk, and this is tested on the current
|
40
40
|
version of aws-sdk (~> 3), rails (>= 4). Hence the configuration as
|
@@ -80,6 +80,27 @@ Dynamoid.configure do |config|
|
|
80
80
|
end
|
81
81
|
```
|
82
82
|
|
83
|
+
Additionally, if you would like to pass in pre-configured AWS credentials
|
84
|
+
(e.g. you have an IAM role credential, you configure your credentials
|
85
|
+
elsewhere in your project, etc.), you may do so:
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
require 'dynamoid'
|
89
|
+
|
90
|
+
credentials = Aws::AssumeRoleCredentials.new(
|
91
|
+
region: region,
|
92
|
+
access_key_id: key,
|
93
|
+
secret_access_key: secret,
|
94
|
+
role_arn: role_arn,
|
95
|
+
role_session_name: 'our-session'
|
96
|
+
)
|
97
|
+
|
98
|
+
Dynamoid.configure do |config|
|
99
|
+
config.region = 'us-west-2',
|
100
|
+
config.credentials = credentials
|
101
|
+
end
|
102
|
+
```
|
103
|
+
|
83
104
|
For a full list of the DDB regions, you can go
|
84
105
|
[here](http://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_region).
|
85
106
|
|
@@ -143,6 +164,47 @@ won't change its hash key, which it expects will be `user_id`. If this
|
|
143
164
|
table doesn't exist yet, however, Dynamoid will create it with these
|
144
165
|
options.
|
145
166
|
|
167
|
+
There is a basic support of DynamoDB's [Time To Live (TTL)
|
168
|
+
mechanism](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html).
|
169
|
+
If you declare a field as TTL field - it will be initialised if doesn't
|
170
|
+
have value yet. Default value is current time + specified seconds.
|
171
|
+
|
172
|
+
```ruby
|
173
|
+
class User
|
174
|
+
include Dynamoid::Document
|
175
|
+
|
176
|
+
table expires: { field: :ttl, after: 60 }
|
177
|
+
|
178
|
+
field :ttl, :integer
|
179
|
+
end
|
180
|
+
```
|
181
|
+
|
182
|
+
Field used to store expiration time (e.g. `ttl`) should be declared
|
183
|
+
explicitly and should have numeric type (`integer`, `number`) only.
|
184
|
+
`datetime` type is also possible but only if it's stored as number
|
185
|
+
(there is a way to store time as a string also).
|
186
|
+
|
187
|
+
It's also possible to override a global option `Dynamoid::Config.timestamps`
|
188
|
+
on a table level:
|
189
|
+
|
190
|
+
```ruby
|
191
|
+
table timestamps: false
|
192
|
+
```
|
193
|
+
|
194
|
+
This option controls generation of timestamp fields
|
195
|
+
`created_at`/`updated_at`.
|
196
|
+
|
197
|
+
It's also possible to override table capacity mode configured globally
|
198
|
+
with table level option `capacity_mode`. Valid values are
|
199
|
+
`:provisioned`, `:on_demand` and `nil`:
|
200
|
+
|
201
|
+
```ruby
|
202
|
+
table capacity_mode: :on_demand
|
203
|
+
```
|
204
|
+
|
205
|
+
If table capacity mode is on-demand, another related table-level options
|
206
|
+
`read_capacity` and `write_capacity` will be ignored.
|
207
|
+
|
146
208
|
### Fields
|
147
209
|
|
148
210
|
You'll have to define all the fields on the model and the data type of
|
@@ -165,8 +227,8 @@ backward-compatibility of the serialized representation.
|
|
165
227
|
|
166
228
|
The boolean fields are stored as DynamoDB boolean values by default.
|
167
229
|
Dynamoid can store boolean values as strings as well - `'t'` and `'f'`.
|
168
|
-
So if you want to change default format of boolean field you can
|
169
|
-
achieve this with `store_as_native_boolean` field option:
|
230
|
+
So if you want to change the default format of boolean field you can
|
231
|
+
easily achieve this with `store_as_native_boolean` field option:
|
170
232
|
|
171
233
|
```ruby
|
172
234
|
class Document
|
@@ -513,7 +575,7 @@ c.my_new_type
|
|
513
575
|
|
514
576
|
### Type casting
|
515
577
|
|
516
|
-
Dynamid supports type casting and
|
578
|
+
Dynamid supports type casting and tries to do it in the most convenient
|
517
579
|
way. Values for all fields (except custom type) are coerced to declared
|
518
580
|
field types.
|
519
581
|
|
@@ -551,7 +613,7 @@ well.
|
|
551
613
|
|
552
614
|
### Dirty API
|
553
615
|
|
554
|
-
Dynamoid supports Dirty API which
|
616
|
+
Dynamoid supports Dirty API which equivalents to [Rails 5.2
|
555
617
|
`ActiveModel::Dirty`](https://api.rubyonrails.org/v5.2/classes/ActiveModel/Dirty.html).
|
556
618
|
There is only one limitation - change in place of field isn't detected
|
557
619
|
automatically.
|
@@ -624,7 +686,7 @@ to relational database engines.
|
|
624
686
|
|
625
687
|
**WARNING:** There is a limitation of conditions passed to `where`
|
626
688
|
method. Only one condition for some particular field could be specified.
|
627
|
-
The last one only will be
|
689
|
+
The last one only will be applied and others will be ignored. E.g. in
|
628
690
|
examples:
|
629
691
|
|
630
692
|
```ruby
|
@@ -714,7 +776,7 @@ commands.
|
|
714
776
|
At times it can be useful to rely on DynamoDB [low-level
|
715
777
|
pagination](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.html#Query.Pagination)
|
716
778
|
instead of fixed pages sizes. Each page results in a single Query or
|
717
|
-
Scan call to
|
779
|
+
Scan call to DynamoDB, but returns an unknown number of records.
|
718
780
|
|
719
781
|
Access to the native DynamoDB pages can be obtained via the
|
720
782
|
`find_by_pages` method, which yields arrays of records.
|
@@ -729,7 +791,7 @@ is a hash including a key `:last_evaluated_key`. The value of this key
|
|
729
791
|
can be used for the `start` method to fetch the next page of records.
|
730
792
|
|
731
793
|
This way it can be used for instance to implement efficiently pagination
|
732
|
-
in web-
|
794
|
+
in web-applications:
|
733
795
|
|
734
796
|
```ruby
|
735
797
|
class UserController < ApplicationController
|
@@ -774,7 +836,7 @@ Address.where('postcode.null': false)
|
|
774
836
|
Address.where('postcode.not_null': true)
|
775
837
|
```
|
776
838
|
|
777
|
-
**WARNING:** Please take into
|
839
|
+
**WARNING:** Please take into account that `NULL` and `NOT_NULL`
|
778
840
|
operators check attribute presence in a document, not value. So if
|
779
841
|
attribute `postcode`'s value is `NULL`, `NULL` operator will return
|
780
842
|
false because attribute exists even if has `NULL` value.
|
@@ -831,7 +893,7 @@ User.where("created_at.lt": DateTime.now - 1.day).all
|
|
831
893
|
|
832
894
|
It also supports `gte` and `lte`. Turning those into symbols and
|
833
895
|
allowing a Rails SQL-style string syntax is in the works. You can only
|
834
|
-
have one range argument per query, because of DynamoDB
|
896
|
+
have one range argument per query, because of DynamoDB inherent
|
835
897
|
limitations, so use it sensibly!
|
836
898
|
|
837
899
|
|
@@ -839,7 +901,7 @@ limitations, so use it sensibly!
|
|
839
901
|
|
840
902
|
In order to update document you can use high level methods
|
841
903
|
`#update_attributes`, `#update_attribute` and `.update`. They run
|
842
|
-
validation and
|
904
|
+
validation and callbacks.
|
843
905
|
|
844
906
|
```ruby
|
845
907
|
Address.find(id).update_attributes(city: 'Chicago')
|
@@ -855,12 +917,12 @@ it runs `update` callbacks). All of them support conditional updates.
|
|
855
917
|
doesn't exist.
|
856
918
|
|
857
919
|
```ruby
|
858
|
-
|
920
|
+
Address.find(id).update do |i|
|
859
921
|
i.set city: 'Chicago'
|
860
922
|
i.add latitude: 100
|
861
923
|
i.delete set_of_numbers: 10
|
862
924
|
end
|
863
|
-
|
925
|
+
Address.find(id).update(if: { deliverable: true }) do |i|
|
864
926
|
i.set city: 'Chicago'
|
865
927
|
end
|
866
928
|
Address.update_fields(id, city: 'Chicago')
|
@@ -872,7 +934,7 @@ Address.upsert(id, { city: 'Chicago' }, if: { deliverable: true })
|
|
872
934
|
### Deleting
|
873
935
|
|
874
936
|
In order to delete some items `delete_all` method should be used. Any
|
875
|
-
callback
|
937
|
+
callback won't be called. Items delete in efficient way in batch.
|
876
938
|
|
877
939
|
```ruby
|
878
940
|
Address.where(city: 'London').delete_all
|
@@ -893,17 +955,17 @@ class User
|
|
893
955
|
end
|
894
956
|
```
|
895
957
|
|
896
|
-
There are following options:
|
958
|
+
There are the following options:
|
897
959
|
* `hash_key` - is used as hash key of an index,
|
898
960
|
* `range_key` - is used as range key of an index,
|
899
961
|
* `projected_attributes` - list of fields to store in an index or has a
|
900
|
-
|
962
|
+
predefined value `:keys_only`, `:all`; `:keys_only` is a default,
|
901
963
|
* `name` - an index will be created with this name when a table is
|
902
964
|
created; by default name is generated and contains table name and keys
|
903
965
|
names,
|
904
|
-
* `read_capacity` - is used when table
|
966
|
+
* `read_capacity` - is used when table created and used as an index
|
905
967
|
capacity; by default equals `Dynamoid::Config.read_capacity`,
|
906
|
-
* `write_capacity` - is used when table
|
968
|
+
* `write_capacity` - is used when table created and used as an index
|
907
969
|
capacity; by default equals `Dynamoid::Config.write_capacity`
|
908
970
|
|
909
971
|
The only mandatory option is `name`.
|
@@ -954,7 +1016,7 @@ on the base table*
|
|
954
1016
|
|
955
1017
|
Listed below are all configuration options.
|
956
1018
|
|
957
|
-
* `adapter` -
|
1019
|
+
* `adapter` - useful only for the gem developers to switch to a new
|
958
1020
|
adapter. Default and the only available value is `aws_sdk_v3`
|
959
1021
|
* `namespace` - prefix for table names, default is
|
960
1022
|
`dynamoid_#{application_name}_#{environment}` for Rails application
|
@@ -962,15 +1024,21 @@ Listed below are all configuration options.
|
|
962
1024
|
* `logger` - by default it's a `Rails.logger` in Rails application and
|
963
1025
|
`stdout` otherwise. You can disable logging by setting `nil` or
|
964
1026
|
`false` values. Set `true` value to use defaults
|
965
|
-
* `access_key` - DynamoDb custom
|
966
|
-
AWS credentials if they present
|
967
|
-
* `secret_key` - DynamoDb custom
|
968
|
-
AWS credentials if they present
|
1027
|
+
* `access_key` - DynamoDb custom access key for AWS credentials, override global
|
1028
|
+
AWS credentials if they're present
|
1029
|
+
* `secret_key` - DynamoDb custom secret key for AWS credentials, override global
|
1030
|
+
AWS credentials if they're present
|
1031
|
+
* `credentials` - DynamoDb custom pre-configured credentials, override global
|
1032
|
+
AWS credentials if they're present
|
969
1033
|
* `region` - DynamoDb custom credentials for AWS, override global AWS
|
970
|
-
credentials if they present
|
1034
|
+
credentials if they're present
|
971
1035
|
* `batch_size` - when you try to load multiple items at once with
|
972
1036
|
* `batch_get_item` call Dynamoid loads them not with one api call but
|
973
1037
|
piece by piece. Default is 100 items
|
1038
|
+
* `capacity_mode` - used at a table creation and means whether a table
|
1039
|
+
read/write capacity mode will be on-demand or provisioned. Allowed
|
1040
|
+
values are `:on_demand` and `:provisioned`. Default value is `nil` which
|
1041
|
+
means provisioned mode will be used.
|
974
1042
|
* `read_capacity` - is used at table or indices creation. Default is 100
|
975
1043
|
(units)
|
976
1044
|
* `write_capacity` - is used at table or indices creation. Default is 20
|
@@ -984,7 +1052,7 @@ Listed below are all configuration options.
|
|
984
1052
|
when referring to them. Isn't thread safe. Default is `false`.
|
985
1053
|
`Use Dynamoid::Middleware::IdentityMap` to clear identity map for each HTTP request
|
986
1054
|
* `timestamps` - by default Dynamoid sets `created_at` and `updated_at`
|
987
|
-
fields for model
|
1055
|
+
fields for model creation and updating. You can disable this
|
988
1056
|
behavior by setting `false` value
|
989
1057
|
* `sync_retry_max_times` - when Dynamoid creates or deletes table
|
990
1058
|
synchronously it checks for completion specified times. Default is 60
|
@@ -1024,7 +1092,7 @@ Listed below are all configuration options.
|
|
1024
1092
|
100-continue HTTP response before sending the request body. Default
|
1025
1093
|
option value is `nil`. If not specified effected value is `1`
|
1026
1094
|
* `http_idle_timeout`: The number of seconds an HTTP connection is
|
1027
|
-
allowed to sit
|
1095
|
+
allowed to sit idle before it is considered stale. Default option
|
1028
1096
|
value is `nil`. If not specified effected value is `5`
|
1029
1097
|
* `http_open_timeout`: The number of seconds to wait when opening a HTTP
|
1030
1098
|
session. Default option value is `nil`. If not specified effected
|
@@ -1056,7 +1124,7 @@ reload the row (so that it will pick up the newest values), and try the
|
|
1056
1124
|
save again.
|
1057
1125
|
|
1058
1126
|
Calls to `update` and `update!` also increment the `lock_version`,
|
1059
|
-
however they do not check the existing value. This guarantees that a
|
1127
|
+
however, they do not check the existing value. This guarantees that a
|
1060
1128
|
update operation will raise an exception in a concurrent save operation,
|
1061
1129
|
however a save operation will never cause an update to fail. Thus,
|
1062
1130
|
`update` is useful & safe only for doing atomic operations (e.g.
|
@@ -1102,7 +1170,7 @@ Dynamoid.configure do |config|
|
|
1102
1170
|
end
|
1103
1171
|
```
|
1104
1172
|
|
1105
|
-
You can use your own strategy in following way:
|
1173
|
+
You can use your own strategy in the following way:
|
1106
1174
|
|
1107
1175
|
```ruby
|
1108
1176
|
Dynamoid.configure do |config|
|
data/lib/dynamoid/adapter.rb
CHANGED
@@ -124,8 +124,12 @@ module Dynamoid
|
|
124
124
|
|
125
125
|
def create_table(table_name, key, options = {})
|
126
126
|
unless tables.include?(table_name)
|
127
|
-
|
127
|
+
result = nil
|
128
|
+
benchmark('Create Table') { result = adapter.create_table(table_name, key, options) }
|
128
129
|
tables << table_name
|
130
|
+
result
|
131
|
+
else
|
132
|
+
false
|
129
133
|
end
|
130
134
|
end
|
131
135
|
|
@@ -75,11 +75,18 @@ module Dynamoid
|
|
75
75
|
(Dynamoid::Config.settings.compact.keys & CONNECTION_CONFIG_OPTIONS).each do |option|
|
76
76
|
@connection_hash[option] = Dynamoid::Config.send(option)
|
77
77
|
end
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
78
|
+
|
79
|
+
# if credentials are passed, they already contain access key & secret key
|
80
|
+
if Dynamoid::Config.credentials?
|
81
|
+
connection_hash[:credentials] = Dynamoid::Config.credentials
|
82
|
+
else
|
83
|
+
# otherwise, pass access key & secret key for credentials creation
|
84
|
+
if Dynamoid::Config.access_key?
|
85
|
+
connection_hash[:access_key_id] = Dynamoid::Config.access_key
|
86
|
+
end
|
87
|
+
if Dynamoid::Config.secret_key?
|
88
|
+
connection_hash[:secret_access_key] = Dynamoid::Config.secret_key
|
89
|
+
end
|
83
90
|
end
|
84
91
|
|
85
92
|
# https://github.com/aws/aws-sdk-ruby/blob/master/gems/aws-sdk-core/lib/aws-sdk-core/plugins/logging.rb
|
@@ -246,8 +253,22 @@ module Dynamoid
|
|
246
253
|
def create_table(table_name, key = :id, options = {})
|
247
254
|
Dynamoid.logger.info "Creating #{table_name} table. This could take a while."
|
248
255
|
CreateTable.new(client, table_name, key, options).call
|
256
|
+
true
|
249
257
|
rescue Aws::DynamoDB::Errors::ResourceInUseException => e
|
250
258
|
Dynamoid.logger.error "Table #{table_name} cannot be created as it already exists"
|
259
|
+
false
|
260
|
+
end
|
261
|
+
|
262
|
+
def update_time_to_live(table_name:, attribute:)
|
263
|
+
request = {
|
264
|
+
table_name: table_name,
|
265
|
+
time_to_live_specification: {
|
266
|
+
attribute_name: attribute,
|
267
|
+
enabled: true,
|
268
|
+
}
|
269
|
+
}
|
270
|
+
|
271
|
+
client.update_time_to_live(request)
|
251
272
|
end
|
252
273
|
|
253
274
|
# Create a table on DynamoDB *synchronously*.
|
@@ -16,6 +16,7 @@ module Dynamoid
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def call
|
19
|
+
billing_mode = options[:billing_mode]
|
19
20
|
read_capacity = options[:read_capacity] || Dynamoid::Config.read_capacity
|
20
21
|
write_capacity = options[:write_capacity] || Dynamoid::Config.write_capacity
|
21
22
|
|
@@ -41,14 +42,20 @@ module Dynamoid
|
|
41
42
|
|
42
43
|
client_opts = {
|
43
44
|
table_name: table_name,
|
44
|
-
provisioned_throughput: {
|
45
|
-
read_capacity_units: read_capacity,
|
46
|
-
write_capacity_units: write_capacity
|
47
|
-
},
|
48
45
|
key_schema: key_schema,
|
49
46
|
attribute_definitions: attribute_definitions
|
50
47
|
}
|
51
48
|
|
49
|
+
if billing_mode == :on_demand
|
50
|
+
client_opts[:billing_mode] = 'PAY_PER_REQUEST'
|
51
|
+
else
|
52
|
+
client_opts[:billing_mode] = 'PROVISIONED'
|
53
|
+
client_opts[:provisioned_throughput] = {
|
54
|
+
read_capacity_units: read_capacity,
|
55
|
+
write_capacity_units: write_capacity
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
52
59
|
if ls_indexes.present?
|
53
60
|
client_opts[:local_secondary_indexes] = ls_indexes.map do |index|
|
54
61
|
index_to_aws_hash(index)
|
data/lib/dynamoid/components.rb
CHANGED
data/lib/dynamoid/config.rb
CHANGED
@@ -10,6 +10,15 @@ require 'dynamoid/config/backoff_strategies/exponential_backoff'
|
|
10
10
|
module Dynamoid
|
11
11
|
# Contains all the basic configuration information required for Dynamoid: both sensible defaults and required fields.
|
12
12
|
module Config
|
13
|
+
# @since 3.3.1
|
14
|
+
DEFAULT_NAMESPACE = if defined?(Rails)
|
15
|
+
klass = Rails.application.class
|
16
|
+
app_name = Rails::VERSION::MAJOR >= 6 ? klass.module_parent_name : klass.parent_name
|
17
|
+
"dynamoid_#{app_name}_#{Rails.env}".freeze
|
18
|
+
else
|
19
|
+
'dynamoid'.freeze
|
20
|
+
end
|
21
|
+
|
13
22
|
extend self
|
14
23
|
|
15
24
|
extend Options
|
@@ -17,11 +26,13 @@ module Dynamoid
|
|
17
26
|
|
18
27
|
# All the default options.
|
19
28
|
option :adapter, default: 'aws_sdk_v3'
|
20
|
-
option :namespace, default:
|
29
|
+
option :namespace, default: DEFAULT_NAMESPACE
|
21
30
|
option :access_key, default: nil
|
22
31
|
option :secret_key, default: nil
|
32
|
+
option :credentials, default: nil
|
23
33
|
option :region, default: nil
|
24
34
|
option :batch_size, default: 100
|
35
|
+
option :capacity_mode, default: nil
|
25
36
|
option :read_capacity, default: 100
|
26
37
|
option :write_capacity, default: 20
|
27
38
|
option :warn_on_scan, default: true
|
@@ -84,5 +95,6 @@ module Dynamoid
|
|
84
95
|
backoff_strategies[backoff].call
|
85
96
|
end
|
86
97
|
end
|
98
|
+
|
87
99
|
end
|
88
100
|
end
|
data/lib/dynamoid/document.rb
CHANGED
@@ -51,6 +51,13 @@ module Dynamoid #:nodoc:
|
|
51
51
|
options[:write_capacity] || Dynamoid::Config.write_capacity
|
52
52
|
end
|
53
53
|
|
54
|
+
|
55
|
+
# Returns the billing (capacity) mode for this table.
|
56
|
+
# Could be either :provisioned or :on_demand
|
57
|
+
def capacity_mode
|
58
|
+
options[:capacity_mode] || Dynamoid::Config.capacity_mode
|
59
|
+
end
|
60
|
+
|
54
61
|
# Returns the field name used to support STI for this table.
|
55
62
|
def inheritance_field
|
56
63
|
options[:inheritance_field] || :type
|
@@ -138,13 +145,11 @@ module Dynamoid #:nodoc:
|
|
138
145
|
@associations ||= {}
|
139
146
|
@attributes_before_type_cast ||= {}
|
140
147
|
|
141
|
-
attrs_with_defaults = self.class.attributes.
|
148
|
+
attrs_with_defaults = self.class.attributes.each_with_object({}) do |(attribute, options), res|
|
142
149
|
if attrs.key?(attribute)
|
143
|
-
res
|
150
|
+
res[attribute] = attrs[attribute]
|
144
151
|
elsif options.key?(:default)
|
145
|
-
res
|
146
|
-
else
|
147
|
-
res
|
152
|
+
res[attribute] = evaluate_default_value(options[:default])
|
148
153
|
end
|
149
154
|
end
|
150
155
|
|
data/lib/dynamoid/fields.rb
CHANGED
@@ -21,8 +21,11 @@ module Dynamoid #:nodoc:
|
|
21
21
|
class_attribute :range_key
|
22
22
|
|
23
23
|
self.attributes = {}
|
24
|
-
|
25
|
-
|
24
|
+
|
25
|
+
# Timestamp fields could be disabled later in `table` method call.
|
26
|
+
# So let's declare them here and remove them later if it will be necessary
|
27
|
+
field :created_at, :datetime if Dynamoid::Config.timestamps
|
28
|
+
field :updated_at, :datetime if Dynamoid::Config.timestamps
|
26
29
|
|
27
30
|
field :id # Default primary key
|
28
31
|
end
|
@@ -75,12 +78,24 @@ module Dynamoid #:nodoc:
|
|
75
78
|
self.range_key = name
|
76
79
|
end
|
77
80
|
|
78
|
-
def table(
|
81
|
+
def table(options)
|
79
82
|
# a default 'id' column is created when Dynamoid::Document is included
|
80
83
|
unless attributes.key? hash_key
|
81
84
|
remove_field :id
|
82
85
|
field(hash_key)
|
83
86
|
end
|
87
|
+
|
88
|
+
if options[:timestamps] && !Dynamoid::Config.timestamps
|
89
|
+
# Timestamp fields weren't declared in `included` hook because they
|
90
|
+
# are disabled globaly
|
91
|
+
field :created_at, :datetime
|
92
|
+
field :updated_at, :datetime
|
93
|
+
elsif options[:timestamps] == false && Dynamoid::Config.timestamps
|
94
|
+
# Timestamp fields were declared in `included` hook but they are
|
95
|
+
# disabled for a table
|
96
|
+
remove_field :created_at
|
97
|
+
remove_field :updated_at
|
98
|
+
end
|
84
99
|
end
|
85
100
|
|
86
101
|
def remove_field(field)
|
@@ -99,6 +114,10 @@ module Dynamoid #:nodoc:
|
|
99
114
|
end
|
100
115
|
end
|
101
116
|
|
117
|
+
def timestamps_enabled?
|
118
|
+
options[:timestamps] || (options[:timestamps].nil? && Dynamoid::Config.timestamps)
|
119
|
+
end
|
120
|
+
|
102
121
|
private
|
103
122
|
|
104
123
|
def generated_methods
|
@@ -166,18 +185,31 @@ module Dynamoid #:nodoc:
|
|
166
185
|
#
|
167
186
|
# @since 0.2.0
|
168
187
|
def set_created_at
|
169
|
-
self.created_at ||= DateTime.now.in_time_zone(Time.zone) if
|
188
|
+
self.created_at ||= DateTime.now.in_time_zone(Time.zone) if self.class.timestamps_enabled?
|
170
189
|
end
|
171
190
|
|
172
191
|
# Automatically called during the save callback to set the updated_at time.
|
173
192
|
#
|
174
193
|
# @since 0.2.0
|
175
194
|
def set_updated_at
|
176
|
-
if
|
195
|
+
if self.class.timestamps_enabled? && !updated_at_changed?
|
177
196
|
self.updated_at = DateTime.now.in_time_zone(Time.zone)
|
178
197
|
end
|
179
198
|
end
|
180
199
|
|
200
|
+
def set_expires_field
|
201
|
+
options = self.class.options[:expires]
|
202
|
+
|
203
|
+
if options.present?
|
204
|
+
name = options[:field]
|
205
|
+
seconds = options[:after]
|
206
|
+
|
207
|
+
if self[name].blank?
|
208
|
+
send("#{name}=", Time.now.to_i + seconds)
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
181
213
|
def set_inheritance_field
|
182
214
|
# actually it does only following logic:
|
183
215
|
# self.type ||= self.class.name if self.class.attributes[:type]
|
data/lib/dynamoid/persistence.rb
CHANGED
@@ -46,6 +46,7 @@ module Dynamoid
|
|
46
46
|
options = {
|
47
47
|
id: hash_key,
|
48
48
|
table_name: table_name,
|
49
|
+
billing_mode: capacity_mode,
|
49
50
|
write_capacity: write_capacity,
|
50
51
|
read_capacity: read_capacity,
|
51
52
|
range_key: range_key_hash,
|
@@ -54,7 +55,12 @@ module Dynamoid
|
|
54
55
|
global_secondary_indexes: global_secondary_indexes.values
|
55
56
|
}.merge(options)
|
56
57
|
|
57
|
-
Dynamoid.adapter.create_table(options[:table_name], options[:id], options)
|
58
|
+
created_successfuly = Dynamoid.adapter.create_table(options[:table_name], options[:id], options)
|
59
|
+
|
60
|
+
if created_successfuly && self.options[:expires]
|
61
|
+
attribute = self.options[:expires][:field]
|
62
|
+
Dynamoid.adapter.update_time_to_live(table_name: table_name, attribute: attribute)
|
63
|
+
end
|
58
64
|
end
|
59
65
|
|
60
66
|
# Deletes the table for the model
|
@@ -32,7 +32,7 @@ module Dynamoid
|
|
32
32
|
def build_model(attributes)
|
33
33
|
attrs = attributes.symbolize_keys
|
34
34
|
|
35
|
-
if
|
35
|
+
if @model_class.timestamps_enabled?
|
36
36
|
time_now = DateTime.now.in_time_zone(Time.zone)
|
37
37
|
attrs[:created_at] ||= time_now
|
38
38
|
attrs[:updated_at] ||= time_now
|
data/lib/dynamoid/version.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.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josh Symonds
|
@@ -21,7 +21,7 @@ authors:
|
|
21
21
|
autorequire:
|
22
22
|
bindir: exe
|
23
23
|
cert_chain: []
|
24
|
-
date: 2019-
|
24
|
+
date: 2019-11-30 00:00:00.000000000 Z
|
25
25
|
dependencies:
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: activemodel
|
@@ -315,8 +315,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
315
315
|
- !ruby/object:Gem::Version
|
316
316
|
version: '0'
|
317
317
|
requirements: []
|
318
|
-
|
319
|
-
rubygems_version: 2.7.6
|
318
|
+
rubygems_version: 3.0.3
|
320
319
|
signing_key:
|
321
320
|
specification_version: 4
|
322
321
|
summary: Dynamoid is an ORM for Amazon's DynamoDB
|