All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- #944 Fix
#deleteand#destroymethods and set#destroyed?properly when operations fail - #987 Fix checking that a primary key is given in transactional methods
#saveand#destroy
- #941 Support table ARN and add option
:arnfor thetablemethod to specify a table belonged to specific AWS account - #943 Implement
deleteclass method - #945 Implement
#update_attribute!method - #947 Allow skipping default model fields generation and add option
:skip_generating_fieldsfor thetablemethod to specify field names - #988 Add Ruby 4.0 and Rails 8.1 in CI
- #849 Fixed saving a field of custom type when it implements both
.dynamoid_dump()and#dynamoid_dumpmethod and use the former one. A proper behaviour is to use adapter's .dynamoid_dump method instead of a value's #dynamoid_dump method. - #851 Fixed Dirty API and don't require custom types to implement
#==method. Add field option:comparable. - #913 Fixed saving partition keys of Dynamoid-specific types (e.g.
dateordatetime) and always convert them into a proper DynamoDB type - #917 Fixed transactional write operations when primary key is of non-native DynamoDB type
- #927 Multiple fixes in transactional and non-transactional write methods and finders:
- Changed non-transactional method
#findand raiseMissingHashKeywhen a given partition key isnil - Fixed non-transactional method
#save!and raiseRecordNotSavedwhen a callback throws:abortand terminates the process - Check whether partition and sort key are specified in the non-transactional persistence methods and raise a proper exception (
MissingHashKeyorMissingRangeKey) - Fixed methods
#inc,#increment!and#decrement!,#updateand#update!to not create a new item when an item with specified primary key is already deleted - Fixed method
#update_attributeto not raiseStaleObjectErrorwhen an item with specified primary key is already deleted - Fixed method
#wherewith condition on a:serializedfield to not raise an exception
- Changed non-transactional method
- #910 Added
key_typeoption to thetablemethod to change type of a partition key field (@ogidow) - #916 Added new
error_on_scanconfig option to raises an error and prevent table scans (DynamoDB'sScanoperation) (@aaronalberg) - #926 Implemented read transactions (using DynamoDB's
TransactGetItemsoperation)
- #846 Changed transactional
update_fields()method to accept a block and support low-level operationsset,add,delete,remove(similar to the non-transactional#update()method) (@ckhsponge)
- #829 Fixed saving of in-place field changes
- #812 Restored sanitizing of attribute names in
#whereconditions - #721 Fixed code examples in README.md (@ndjndj)
- #688 Implemented write transactions (using DynamoDB's
TransactWriteItemsoperation) (@ckhsponge) - #794 Added new config option
store_empty_string_as_nil - #828 Added Ruby 3.4, Rails 8.0 and Rails 7.2 in CI
- #832 Support String condition expressions with
#where - #822 Support binary type natively. Also added new config option
store_binary_as_native(@dalibor)
- #681 Fixed saving persisted model and deleting attributes with
nilvalue ifconfig.store_attribute_with_nil_valueisfalse - #716, #691, #687, #660 Numerous fixes in README.md and RDoc documentation (@ndjndj, @kiharito, @dunkOnIT)
- #656 Added a
create_table_on_saveconfiguration flag to create table on save (@imaximix) - #697 Ensure Ruby 3.3 and Rails 7.1 versions are supported and added them on CI
- #655 Support multiple
wherein the same chain with multiple conditions for the same field
- #610 Specs in JRuby; Support for JRuby 9.4.0.0 (@pboling)
- #624 Fixed
#increment!/#decrement!methods and made them compatible with Rails counterparts - #626 Fixed saving empty Set and String and replacing with
nilin#update,#update!,.update_fields, and.upsertmethods - #628 Fixed
.importmethod to mark persisted model attributes as not changed/not dirty - #632 Fixed
#savecalled withtouch: falseoption to setupdated_atattribute even for a new record (to comply with Rails) - #634 Fixed model callbacks:
- changed order of
saveandcreate/updatecallbacks -savecallbacks are outer for thecreate/updateones - removed
before_initializeandaround_initializecallbacks - there should be onlyafter_initializeone
- changed order of
- #634 Fixed
#touchmethod compatibility with a Rails counterpart:- don't save other modified attributes - only timestamps
- don't perform validation and don't call
save/create/updatecallbacks - accept a list of attribute names, but not one name
- accept a
:timeoption
- #611 Add
rubocop-md(@pboling) - #612 Add
rubocop-rspec(@pboling) - #613 Add
rubocop-performanceandrubocop-rake(@pboling)- Added
funding_uriset to open collective: https://opencollective.com/dynamoid - Added
required_ruby_versionas>= 2.3.0(which was already the minimum supported version of Ruby)
- Added
- #616 Upgrade
simplecov(& removecoveralls) (@pboling)- Setup GitHub actions for Code Coverage
- Setup GitHub actions for RuboCop linting
- Automate coverage feedback on Pull Requests via GitHub Actions and CodeCov
- #618 Upgrade README Badges (@pboling)
- #624 Added
:touchoption for.incmethod to be more compatible with the Rails counterpart method.update_counters - #627 Made the following methods in the Dirty API public (to comply with Rails):
clear_changes_informationchanges_appliedclear_attribute_changes
- #630 Added
Dynamoid::Adapter#executemethod to run PartiQL queries - #634 Added
after_touchcallback and run it in the following methods:#touch#increment!#decrement!
- #642 Run specs on CI against Ruby 3.2
- #645 Added
after_findcallback
- #610 Switch to
rubocop-lts(@pboling) - #633 Change
#inspectmethod to return only attributes - #623 Optimized performance of persisting to send only changed attributes in a request to DynamoDB
- #525 Don't mark an attribute as changed if new assigned value equals the old one (@a5-stable)
- Minor changes in the documentation:
- #527 Fix
update_fieldsandupsertmethods - take into account the table-specifictimestampsoption for setting theupdated_atattribute (@oieioi) - #533 Allow attribute with custom type to be used as a partition or sort key of DynamoDB index (@rahul342)
- #558 Change the way how a filename is derived from a model class name in a warning about using the Scan operation (@a5-stable)
- #567 Fix
#reloadand mark a reloaded model as persisted - #573 Fix proxying of method calls with keyword arguments called on an association for Ruby 2.7 and above (@xeger)
- #579 Fix
create_tablemethod when atable_nameoption passed in case a model has TTL setting enabled (@ta1kt0me) - #591 Multiple fixes:
- Fix
#updateand#update!- take into account the table-specifictimestampsoption for setting theupdated_atattribute - Fix
#update_attribute- skip validation - Return
selfin some public methods to enable methods chaining
- Fix
- #601 Fix
#firstand#pluckmethods: do not mutate query parameters and affect other query methods.
- #531 Run
before_updateandafter_updatecallbacks at saving a model (@a5-stable) - #536 Modernization
- Support for Ruby 3.1
- Support for Rails 7.0
- Keep a Changelog Format
- #484 Fix model deletion - update cached foreign keys in associated models when delete a model
- #492 Fix using
:datefield as an index hash/range key (@yoshida-eth0) - #503 Fix explicit forcing index with
#with_indexmethod when perform Scan operation (@bmalinconico) - #511 Fix
BatchGetItemoperation when partial result returned (so there are unprocessed keys) and table has a range key. The fix affects.find_allmethod only (@Bajena)
- #476 Added
#with_indexmethod to force an index in query (@bmalinconico) - #481 Added
aliasoption to thefieldmethod to declare a field alias and use more conventional name to set and get value
- #482 Support Ruby 3.0 and Rails 6.1
- #461 Allow to delete item attribute with
#updatemethod (@jkirsteins) - #463 Raise
UnknownAttributeexception when specified not declared attribute name (@AlexGascon)
- #480 Repair
.consistent/.delete_all/.destroy_allcalls directly on a model class - #484 Fix broken foreign keys after model deleting (@kkan)
- Fixed in Readme.md: #470 (@rromanchuk), #473 (@Rulikkk)
- #458 Added
binaryfield type - #459 Added
log_formatterconfig option and changed default logging format
- #423 Added warning when generated for a field methods override existing ones
- #429 Added
raise_erroroption forfindmethod - #440 Optimized performance of
firstmethod when there are only conditions on key attribute in a query (@mrkamel) - #445 Support
limitparameter infirstmethod (@mrkamel) - #454 Added block argument to
create/create!methods - #456 Detect when
findmethod requires a range key argument and raiseDynamoid::Errors::MissingRangeKeyexception if it's missing - YARD documentation:
- added missing documentation so now all the public methods are documented
- hid all the private methods and classes
- #450 Got rid of
null-loggergem to make Dynamoid dependencies license suitable for commercial use (@yakjuly)
- #425 Fixed typos in the README.md file (@omarsotillo)
- #432 Support tables that use "hash_key" as their partition key name (@remomueller)
- #434 Support tables that have attribute with name "range_value"
- #453 Fixed issue with using
typeattribute as a GSI hash key
- #405 Added
update!class method (@UrsaDK) - #408 Added
ActiveSupportload hook onDynamoidload (@aaronmallen) - #422 Added
.pluckmethod
- #410 Fixed creating GSI when table uses on-demand capacity provisioning (@icy-arctic-fox)
- #414 Fixed lazy table creation
- #415 Fixed RubyDoc comment (@walkersumida)
- #420 Fixed
#persisted?for deleted/destroyed models
- #416 Improved speed of Adapter's
truncatemethod. It now uses#batch_delete_itemmethod (@TheSmartnik) - #421 Added
touch: falseoption of the #save method - #423 Added warning when generated for a field methods override existing ones
- Fix: #398 Fix broken configuration
- Feature: #386 Disable timestamps fields on a table level with new
table option
timestamps - Feature: #387 Add TTL support with table option
expires - Feature: #393 Support pre-configured credentials with new config
option
credentials(@emmajhyde) - Feature: #397 Configure on-demand table capacity mode with
capacity_modeoption
- Improvement: #388 Minor memory optimization - don't allocate excessive hash (@arjes)
- Fix: #382 Fixed deprecation warning about
Module#parent_namein Rails 6 (@tmandke) - Fix: Typos in Readme.md (@romeuhcf)
- #374 Add
#projectquery method to load only specified fields
- #359 Add support of
NULLandNOT_NULLoperators - #360 Add
store_attribute_with_nil_valueconfig option - #368 Support Rails 6 (RC1)
- #357 Fix synchronous table creation issue
- #362 Fix issue with selecting Global Secondary Index (@atyndall)
- #368 Repair
#previous_changesmethod from Dirty API - #373 Fix threadsafety of loading
Dynamoid::Adapter(@tsub)
- #341, #342 Add
find_by_pagesmethod to provide access to DynamoDB query result pagination mechanism (@bmalinconico, @arjes) - #354 Add
mapfield type
- #340 Improve selecting more optimal GSI for Query operation - choose GSI with sort key if it's used in criteria (@ryz310)
- #351 Add warnings about nonexistent fields in
whereconditions - #352 Add warning about skipped conditions
- #356 Simplify requiring Rake tasks in non-Rails application
- Readme.md. Minor improvements and Fixed (@cabello)
- #302 Add methods similar to
ActiveRecord::AttributeMethods::BeforeTypeCast:- method
attributes_before_type_cast - method
read_attribte_before_type_cast - methods
<name>_before_type_cast
- method
- #303 Add
#update_attributes!method - #304 Add
inheritance_fieldoption forDocument.tablemethod to specify column name for supporting STI and storing class name - #305 Add increment/decrement methods:
#increment#increment!#decrement#decrement!.inc
- #307 Allow to declare type of elements in
array/setfields withofoption. Only scalar types are supported as well as custom types - #312 Add Ability to specify network timeout connection settings (@lulu-ulul)
- #313 Add support for backoff in scan and query (@bonty)
- #314 Re-implement
countforwhere-chain query efficiently. So nowwhere(...).countdoesn't load all the documents, just statistics
- #298 Fix
rawfield storing when value is a Hash with non-string keys - #299 Fix
rawfields - skip empty strings and sets - #309 Fix loading of a document that contains not declared in model class fields
- #310 Fix
Adapter#list_tablesmethod to return names of all tables, not just first page (@knovoselic) - #311 Fix
consistent_readoption of.find(@kokuyouwind) - #319 Repair consistent reading for
find_all - #317 Fix
create_tablesrake task
- BREAKING #267 Upgrade AWS SDK to V3
- BREAKING #268 Drop support of old Ruby versions. Support Ruby since 2.3 version
- BREAKING #268 Drop support of old Rails versions. Support Rails since 4.2 version
- BREAKING #278 Add type casting for finders (
find,find_by_idandfind_all) - BREAKING #279 Change default value of
application_timezoneconfig option from:localto:utc - BREAKING #288 Add
store_boolean_as_nativeconfig option and set it totrueby default. So all boolean fields are stored not as string't'and'f'but as native boolean values now - BREAKING #289 Add
dynamodb_timezoneconfig option and set it to:utcby default. So now alldateanddatetimefields stored in string format will be converted to UTC time zone by default - #261 Improve documentation (@walkersumida)
- #264 Improve documentation (@xbx)
- #278 Add Rails-like type casting
- #281 Deprecate dynamic finders,
find_all,find_by_id,find_by_composite_key,find_all_by_composite_keyandfind_all_by_secondary_index - #285 Set timestamps (
created_atandupdated_at) inupsert,update_fields,importandupdatemethods - #286 Disable scan warning when intentionally loading all items from a collection (@knovoselic)
- Bug: #275 Fix custom type serialization/deserialization
- Bug: #283 Fix using string formats for partition and sort keys of
date/datetimetype - Bug: #283 Fix type declaration of custom type fields. Returned by
.dynamoid_field_typevalue is treated as Dynamoid's type now - Bug: #287 Fix logging disabling (@ghiculescu)
- Feature: #256 Support Rails 5.2 (@andrykonchin)
- Bug: #255 Fix Vagrant RVM configuration and upgrade to Ruby 2.4.1 (@richardhsu)
- Feature: #221 Add field declaration option
ofto specify the type ofsetelements (@pratik60) - Feature: #223 Add field declaration option
store_as_stringto storedatetimeas ISO-8601 formatted strings (@william101) - Feature: #228 Add field declaration option
store_as_stringto storedateas ISO-8601 formatted strings (@andrykonchin) - Feature: #229 Support hash argument for
startchain method (@mnussbaumer) - Feature: #236 Change log level from
infotodebugfor benchmark logging (@kicktheken) - Feature: #239 Add methods for low-level updating:
.update,.update_fieldsand.upsert(@andrykonchin) - Feature: #243 Support
necondition operator (@andrykonchin) - Feature: #246 Added support of backoff in batch operations (@andrykonchin)
- added global config options
backoffandbackoff_strategiesto configure backoff - added
constantandexponentialbuilt-in backoff strategies .find_alland.importsupport new backoff options
- added global config options
- Bug: #216 Fix global index detection in queries with conditions other than equal (@andrykonchin)
- Bug: #224 Fix how
containsoperator works withsetandarrayfield types (@andrykonchin) - Bug: #225 Fix equal conditions for
arrayfields (@andrykonchin) - Bug: #229 Repair support
startchain method on Scan operation (@mnussbaumer) - Bug: #238 Fix default value of
models_dirconfig option (@baloran) - Bug: #244 Allow to pass empty strings and sets to
.import(@andrykonchin) - Bug: #246 Batch operations (
batch_write_itemandbatch_read_item) handle unprocessed items themselves (@andrykonchin) - Bug: #250 Update outdated warning message about inefficient query and missing indices (@andrykonchin)
- Bug: 252 Don't loose nanoseconds when store DateTime as float number
Breaking changes in this release generally bring Dynamoid behavior closer to the Rails-way.
- #199 Added
Document.importmethod (@andrykonchin) - #212 Add foreign_key option (@andrykonchin)
- #213 Support Boolean raw type (@andrykonchin)
- BREAKING #186 Consistent behavior for
Model.where({}).all(@andrykonchin)- <= 1.3.x behaviour -
- load lazily if user specified batch size
- load all collection into memory otherwise
- New behaviour -
- always return lazy evaluated collection
- It means Model.where({}).all returns Enumerator instead of Array.
- If you need Array interface you have to convert collection to Array manually with to_a method call
- <= 1.3.x behaviour -
- BREAKING #195 Failed
#findreturns error (@andrykonchin)- <= 1.3.x behaviour - find returns nil or smaller array.
- New behaviour - it raises RecordNotFound if one or more records can not be found for the requested ids
- BREAKING #196 Return value of
#save(@andrykonchin)- <= 1.3.x behaviour - save returns self if model is saved successfully
- New behaviour - it returns true
- #185
where, finders and friends take into account STI (single table inheritance) now (@andrykonchin)- query will return items of the model class and all subclasses
- #190 Allow passing options to range when defining attributes of the document (@richardhsu)
- Allows for serialized fields and passing the serializer option.
- #198 Enhanced
#createand#create!to allow multiple document creation like#import(@andrykonchin)User.create([{name: 'Josh'}, {name: 'Nick'}])
- #205 Use batch deletion via
batch_write_itemfordelete_all(@andrykonchin) - #205 Rename
Chain#destroy_allasChain#delete_all, to better match Rails conventions when no callbacks are run (@andrykonchin)- kept the old name as an alias, for backwards compatibility
- #207 Added slicing by 25 requests in #batch_write_item (@andrykonchin)
- #211 Improved Vagrant setup for testing (@richardhsu)
- Improved Documentation (@pboling, @andrykonchin)
- #191, #192 Support lambdas as fix for value types were not able to be used as default values (@andrykonchin)(@richardhsu)
- #202 Fix several issues with associations (@andrykonchin)
- setting
nilvalue raises an exception - document doesn't keep assigned model and loads it from the storage
- delete call doesn't update cached ids of associated models
- fix clearing old
has_manyassociation while add model to newhas_manyassociation
- setting
- #204 Fixed issue where
Document.where(:"id.in" => [])would doQueryoperation instead ofScan(@andrykonchin)- Fixed
Chain#key_present?
- Fixed
- #205 Fixed
delete_all(@andrykonchin)- Fixed exception when makes scan and sort key is declared in model
- Fixed exception when makes scan and any condition is specified in where clause (like Document.where().delete_all)
- Fixed exception when makes query and sort key isn't declared in model
- #207 Fixed
#deletemethod for caseadapter.delete(table_name, [1, 2, 3], range_key: 1)(@andrykonchin)
- Added
Chain#lastmethod (@andrykonchin) - Added
datefield type (@andrykonchin) - Added
application_timezoneconfig option (@andrykonchin) - Support condition operators for non-key fields for Query request (@andrykonchin)
- Support condition operators for Scan request (@andrykonchin)
- Support additional operators
in,contains,not_contains(@andrykonchin) - Support type casting in
whereclause (@andrykonchin) - Allow consistent reading for Scan request (@andrykonchin)
- Add
Chain#scan_limit(@richardhsu) - Support batch loading for Query requests (@richardhsu)
- Support querying Global/Local Secondary Indices in
whereclause (@richardhsu)
- Use Query instead of Scan if there are no conditions for sort (range) key in where clause (@andrykonchin)
- Rename
Chain#eval_limitto#record_limit(@richardhsu) - Only query on GSI if projects all attributes in
whereclause (@richardhsu)
- Fix incorrect applying of default field value (#36 and #117, @andrykonchin)
- Fix sync table creation/deletion (#160, @mirokuxy)
- Allow to override document timestamps (@andrykonchin)
- Fix storing empty array as nil (#8, @andrykonchin)
- Fix
limithandling for Query requests (#85, @richardhsu) - Fix
limithandling for Scan requests (#85, @richardhsu) - Fix paginating for Query requests (@richardhsu)
- Fix paginating for Scan requests (@richardhsu)
- Fix
batch_get_itemmethod call for integer partition key (@mudasirraza)
- Allow configuration of the Dynamoid models directory, as not everyone keeps non AR models in app/models
- Dynamoid::Config.models_dir = "app/whatever"
- Fix migrations by stopping the loading of all rails models outside the rails env.
- Implements #135
- dump values for :integer, :string, :boolean fields passed to where query
- e.g. You can search for booleans with any of:
[true, false, "t", "f", "true", "false"]
- e.g. You can search for booleans with any of:
- dump values for :integer, :string, :boolean fields passed to where query
- Adds support for Rails 5 without warnings.
- Adds rake tasks for working with a DynamoDB database:
- rake dynamoid:create_tables
- rake dynamoid:ping
- Automatically requires the Railtie when in Rails (which loads the rake tasks)
- Prevent duplicate entries in Dynamoid.included_models
- Added wwtd and appraisal to spec suite for easier verification of the compatibility matrix
- Support is now officially Ruby 2.0+, (including JRuby 9000) and Rails 4.0+
- Fixed specs (@AlexNisnevich & @pboling)
- Fix
blank?andpresent?behavior for single associations (#110, @AlexNisnevich & @bayesimpact) - Support BatchGet for more than 100 items (#80, @getninjas)
- Add ability to specify connection settings specific to Dynamoid (#116, @NielsKSchjoedt)
- Adds Support for Rails 5! (#109, @gastzars)
- Table Namespace Fix (#79, @alexperto)
- Improve Testing Docs (#103, @tadast)
- Query All Items by Looping (#102, @richardhsu)
- Store document in DocumentNotValid error for easier debugging (#98, holyketzer)
- Better support for raw datatype (#104, @OpenGov)
- Fix associative tables with non-id primary keys (#86, @everett-wetchler)
- Remove accidental Gemfile.lock; fix .gitignore (#95, @pboling)
- Allow options to put_items (#95, @alexperto)
- Support range key in secondary index queries (#95, @pboling)
- Better handling of options generally (#95, @pboling)
- Support for batch_delete_item API (#95, @pboling)
- Support for batch_write_item API (#95, @alexperto)
- Add create_table_syncronously, and sync: option to regular create_table (@pboling)
- make required for tables created with secondary indexes
- Expose and fix truncate method on adapter (#52, @pcorpet)
- Enable saving without updating timestamps (#58, @cignoir)
- Fix projected attributes by checking for :include (#56, @yoshida_tetsuhiro)
- Make behavior of association where method closer to AR by cloning instead of modifying (#51, @pcorpet)
- Add boolean field presence validator (#50, @pcorpet)
- Add association build method (#49, @pcorpet)
- Fix association create method (#47, #48, @pcorpet)
- Support range_between (#42, @ayemos)
- Fix problems with range query (#42, @ayemos)
- Don't prefix table names when namespace is nil (#40, @brenden)
- Added basic secondary index support (#34, @sumocoder)
- Fix query attribute behavior for booleans (#35, @amirmanji)
- Ignore unknown fields on model initialize (PR #33, @sumocoder)
- Added support for optimistic locking on delete (PR #29, @sumocoder)
- upgrade concurrent-ruby requirement to 1.0 (PR #31, @keithmgould)
- Add support for AWS SDK v2.
- Add support for custom class type for fields.
- Remove partitioning support.
- Remove support for Dynamoid's (pseudo)indexes, now that DynamoDB offers local and global indexes.
- Rename :float field type to :number.
- Rename Chain#limit to Chain#eval_limit.
Housekeeping:
- Switch from
fake_dynamofor unit tests to DynamoDBLocal. This is the new authoritative implementation of DynamoDB for testing, and it supports AWS SDK v2. - Use Travis CI to auto-run unit tests on multiple Rubies.
- Randomize spec order.