From 5cdfcc97f690894ff3a19fc1d5910761d4cf0280 Mon Sep 17 00:00:00 2001 From: Maximilian Babescu Date: Thu, 27 Apr 2023 13:12:14 +0300 Subject: [PATCH] Adds a configuration flag to enable create_table on save --- lib/dynamoid/config.rb | 1 + lib/dynamoid/persistence.rb | 5 +++- spec/dynamoid/persistence_spec.rb | 47 +++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/lib/dynamoid/config.rb b/lib/dynamoid/config.rb index 07880bfd..34e2a710 100644 --- a/lib/dynamoid/config.rb +++ b/lib/dynamoid/config.rb @@ -59,6 +59,7 @@ module Config option :http_idle_timeout, default: nil # - default: 5 option :http_open_timeout, default: nil # - default: 15 option :http_read_timeout, default: nil # - default: 60 + option :create_table_on_save, default: true # The default logger for Dynamoid: either the Rails logger or just stdout. # diff --git a/lib/dynamoid/persistence.rb b/lib/dynamoid/persistence.rb index 399655df..c2baf40d 100644 --- a/lib/dynamoid/persistence.rb +++ b/lib/dynamoid/persistence.rb @@ -507,7 +507,10 @@ def persisted? # @return [true|false] Whether saving successful or not # @since 0.2.0 def save(options = {}) - self.class.create_table(sync: true) + if Dynamoid.config.create_table_on_save + self.class.create_table(sync: true) + end + create_or_update = new_record? ? :create : :update run_callbacks(:save) do diff --git a/spec/dynamoid/persistence_spec.rb b/spec/dynamoid/persistence_spec.rb index f1b96402..0d8522f7 100644 --- a/spec/dynamoid/persistence_spec.rb +++ b/spec/dynamoid/persistence_spec.rb @@ -2293,6 +2293,53 @@ def around_update_callback end.not_to change { obj.class.count } end + context 'when disable_create_table_on_save is false' do + before do + Dynamoid.configure do |config| + @original_create_table_on_save = config.create_table_on_save + config.create_table_on_save = false + end + end + + after do + Dynamoid.configure do |config| + config.create_table_on_save = @original_create_table_on_save + end + end + + it 'raises Aws::DynamoDB::Errors::ResourceNotFoundException error' do + model = klass.new + + expect(klass).not_to receive(:create_table) + + expect { model.save! }.to raise_error(Aws::DynamoDB::Errors::ResourceNotFoundException) + end + end + + context 'when disable_create_table_on_save is false and the table exists' do + before do + Dynamoid.configure do |config| + @original_create_table_on_save = config.create_table_on_save + config.create_table_on_save = false + end + klass.create_table + end + + after do + Dynamoid.configure do |config| + config.create_table_on_save = @original_create_table_on_save + end + end + + it 'persists the model' do + obj = klass.new(name: 'John') + obj.save + + expect(klass.exists?(obj.id)).to eq true + expect(klass.find(obj.id).name).to eq 'John' + end + end + describe 'partition key value' do it 'generates "id" for new model' do obj = klass.new