From 604d779ba2151f90ff868dec3a33430408478126 Mon Sep 17 00:00:00 2001 From: Victor Leong Date: Wed, 3 Aug 2022 19:59:35 +0900 Subject: [PATCH 01/14] misc: handle deprecation --- lib/generators/drafting/migration/migration_generator.rb | 2 +- .../generators/drafting/migration/migration_generator_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/generators/drafting/migration/migration_generator.rb b/lib/generators/drafting/migration/migration_generator.rb index 1262460..c350de7 100644 --- a/lib/generators/drafting/migration/migration_generator.rb +++ b/lib/generators/drafting/migration/migration_generator.rb @@ -14,7 +14,7 @@ def create_migration_file end def self.next_migration_number(dirname) - if ActiveRecord::Base.timestamped_migrations + if ActiveRecord.timestamped_migrations # ensure timestamp of the multiple migration files generated # will be different timestamp = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i diff --git a/spec/lib/generators/drafting/migration/migration_generator_spec.rb b/spec/lib/generators/drafting/migration/migration_generator_spec.rb index c89a388..f19978b 100644 --- a/spec/lib/generators/drafting/migration/migration_generator_spec.rb +++ b/spec/lib/generators/drafting/migration/migration_generator_spec.rb @@ -19,7 +19,7 @@ module Drafting ].each do |test_suite| describe test_suite[:configuration] do before :each do - ActiveRecord::Base.timestamped_migrations = test_suite[:timestamped_migrations] + ActiveRecord.timestamped_migrations = test_suite[:timestamped_migrations] end describe 'new app' do From 5932d4887a373e4238586d88d466890ccd563467 Mon Sep 17 00:00:00 2001 From: Victor Leong Date: Wed, 3 Aug 2022 20:00:00 +0900 Subject: [PATCH 02/14] refactor: use metaprogramming to generate files --- lib/generators/drafting/migration/migration_generator.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/generators/drafting/migration/migration_generator.rb b/lib/generators/drafting/migration/migration_generator.rb index c350de7..e6d1cb4 100644 --- a/lib/generators/drafting/migration/migration_generator.rb +++ b/lib/generators/drafting/migration/migration_generator.rb @@ -9,8 +9,10 @@ class MigrationGenerator < Rails::Generators::Base source_root File.expand_path('../templates', __FILE__) def create_migration_file - migration_template 'migration.rb', 'db/migrate/drafting_migration.rb' - migration_template 'non_user_migration.rb', 'db/migrate/non_user_drafting_migration.rb' + Dir.glob("#{MigrationGenerator.source_root}/*.rb").each do |abs_path| + filename = File.basename(abs_path) + migration_template filename, "db/migrate/#{filename.gsub('migration.rb', 'drafting_migration.rb')}" + end end def self.next_migration_number(dirname) From 48a4026dc8e75eb0441d3634057e2ccab746c7f6 Mon Sep 17 00:00:00 2001 From: Victor Leong Date: Thu, 4 Aug 2022 17:48:24 +0900 Subject: [PATCH 03/14] check migration file name --- lib/drafting/version.rb | 4 ++++ .../drafting/migration/migration_generator.rb | 3 +++ .../migration/migration_generator_spec.rb | 17 +++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/lib/drafting/version.rb b/lib/drafting/version.rb index d211b4e..3eda834 100644 --- a/lib/drafting/version.rb +++ b/lib/drafting/version.rb @@ -1,3 +1,7 @@ module Drafting VERSION = "0.5.1" + + def self.root + File.expand_path '../../..', __FILE__ + end end diff --git a/lib/generators/drafting/migration/migration_generator.rb b/lib/generators/drafting/migration/migration_generator.rb index e6d1cb4..aa50ad2 100644 --- a/lib/generators/drafting/migration/migration_generator.rb +++ b/lib/generators/drafting/migration/migration_generator.rb @@ -11,6 +11,9 @@ class MigrationGenerator < Rails::Generators::Base def create_migration_file Dir.glob("#{MigrationGenerator.source_root}/*.rb").each do |abs_path| filename = File.basename(abs_path) + + raise 'Migration file named wrongly' if filename !~ /migration.rb$/ + migration_template filename, "db/migrate/#{filename.gsub('migration.rb', 'drafting_migration.rb')}" end end diff --git a/spec/lib/generators/drafting/migration/migration_generator_spec.rb b/spec/lib/generators/drafting/migration/migration_generator_spec.rb index f19978b..9646740 100644 --- a/spec/lib/generators/drafting/migration/migration_generator_spec.rb +++ b/spec/lib/generators/drafting/migration/migration_generator_spec.rb @@ -77,6 +77,23 @@ module Drafting /class NonUserDraftingMigration < Drafting::MIGRATION_BASE_CLASS/ end end + + describe 'migration file not ending with "migration.rb"' do + let!(:filename) { "#{Drafting.root}/lib/generators/drafting/migration/templates/something.rb" } + + before :each do + prepare_destination + FileUtils.touch(filename) + end + + after :each do + FileUtils.rm(filename) + end + + it 'should raise error' do + expect { run_generator }.to raise_error('Migration file named wrongly') + end + end end end end From 4212e8bfb357a3ee8a237327cd58c69e5015a4a4 Mon Sep 17 00:00:00 2001 From: Victor Leong Date: Thu, 4 Aug 2022 17:57:08 +0900 Subject: [PATCH 04/14] change the name of the migration file to fit the class name of the migration --- .../drafting/migration/migration_generator.rb | 4 +--- .../{migration.rb => drafting_migration.rb} | 0 ...ration.rb => non_user_drafting_migration.rb} | 0 .../migration/migration_generator_spec.rb | 17 ----------------- spec/spec_helper.rb | 6 ++++-- 5 files changed, 5 insertions(+), 22 deletions(-) rename lib/generators/drafting/migration/templates/{migration.rb => drafting_migration.rb} (100%) rename lib/generators/drafting/migration/templates/{non_user_migration.rb => non_user_drafting_migration.rb} (100%) diff --git a/lib/generators/drafting/migration/migration_generator.rb b/lib/generators/drafting/migration/migration_generator.rb index aa50ad2..185fa5a 100644 --- a/lib/generators/drafting/migration/migration_generator.rb +++ b/lib/generators/drafting/migration/migration_generator.rb @@ -12,9 +12,7 @@ def create_migration_file Dir.glob("#{MigrationGenerator.source_root}/*.rb").each do |abs_path| filename = File.basename(abs_path) - raise 'Migration file named wrongly' if filename !~ /migration.rb$/ - - migration_template filename, "db/migrate/#{filename.gsub('migration.rb', 'drafting_migration.rb')}" + migration_template filename, "db/migrate/#{filename}" end end diff --git a/lib/generators/drafting/migration/templates/migration.rb b/lib/generators/drafting/migration/templates/drafting_migration.rb similarity index 100% rename from lib/generators/drafting/migration/templates/migration.rb rename to lib/generators/drafting/migration/templates/drafting_migration.rb diff --git a/lib/generators/drafting/migration/templates/non_user_migration.rb b/lib/generators/drafting/migration/templates/non_user_drafting_migration.rb similarity index 100% rename from lib/generators/drafting/migration/templates/non_user_migration.rb rename to lib/generators/drafting/migration/templates/non_user_drafting_migration.rb diff --git a/spec/lib/generators/drafting/migration/migration_generator_spec.rb b/spec/lib/generators/drafting/migration/migration_generator_spec.rb index 9646740..f19978b 100644 --- a/spec/lib/generators/drafting/migration/migration_generator_spec.rb +++ b/spec/lib/generators/drafting/migration/migration_generator_spec.rb @@ -77,23 +77,6 @@ module Drafting /class NonUserDraftingMigration < Drafting::MIGRATION_BASE_CLASS/ end end - - describe 'migration file not ending with "migration.rb"' do - let!(:filename) { "#{Drafting.root}/lib/generators/drafting/migration/templates/something.rb" } - - before :each do - prepare_destination - FileUtils.touch(filename) - end - - after :each do - FileUtils.rm(filename) - end - - it 'should raise error' do - expect { run_generator }.to raise_error('Migration file named wrongly') - end - end end end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 7878cb8..e200f28 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -11,8 +11,10 @@ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__) require 'drafting' -require 'generators/drafting/migration/templates/migration.rb' -require 'generators/drafting/migration/templates/non_user_migration.rb' + +Dir["#{Drafting.root}/lib/generators/drafting/migration/templates/*.rb"].each do |filename| + require filename +end require 'factory_bot' FactoryBot.find_definitions From 8c1d829d0957e3bae7fadf2ef81631ac6f5119dd Mon Sep 17 00:00:00 2001 From: Victor Leong Date: Thu, 4 Aug 2022 18:28:24 +0900 Subject: [PATCH 05/14] use numbered migration template files to organise the order of migration files generated --- lib/generators/drafting/migration/migration_generator.rb | 5 +++-- .../{drafting_migration.rb => 0-drafting_migration.rb} | 0 ...rafting_migration.rb => 1-non_user_drafting_migration.rb} | 0 3 files changed, 3 insertions(+), 2 deletions(-) rename lib/generators/drafting/migration/templates/{drafting_migration.rb => 0-drafting_migration.rb} (100%) rename lib/generators/drafting/migration/templates/{non_user_drafting_migration.rb => 1-non_user_drafting_migration.rb} (100%) diff --git a/lib/generators/drafting/migration/migration_generator.rb b/lib/generators/drafting/migration/migration_generator.rb index 185fa5a..5018e74 100644 --- a/lib/generators/drafting/migration/migration_generator.rb +++ b/lib/generators/drafting/migration/migration_generator.rb @@ -10,9 +10,10 @@ class MigrationGenerator < Rails::Generators::Base def create_migration_file Dir.glob("#{MigrationGenerator.source_root}/*.rb").each do |abs_path| - filename = File.basename(abs_path) + basename = File.basename(abs_path) + filename = basename.split('-').last - migration_template filename, "db/migrate/#{filename}" + migration_template basename, "db/migrate/#{filename}" end end diff --git a/lib/generators/drafting/migration/templates/drafting_migration.rb b/lib/generators/drafting/migration/templates/0-drafting_migration.rb similarity index 100% rename from lib/generators/drafting/migration/templates/drafting_migration.rb rename to lib/generators/drafting/migration/templates/0-drafting_migration.rb diff --git a/lib/generators/drafting/migration/templates/non_user_drafting_migration.rb b/lib/generators/drafting/migration/templates/1-non_user_drafting_migration.rb similarity index 100% rename from lib/generators/drafting/migration/templates/non_user_drafting_migration.rb rename to lib/generators/drafting/migration/templates/1-non_user_drafting_migration.rb From dbe31b8d364eb49482ede7fd74da85fead4a4c99 Mon Sep 17 00:00:00 2001 From: Victor Leong Date: Thu, 4 Aug 2022 18:34:37 +0900 Subject: [PATCH 06/14] check against migration file naming --- .../drafting/migration/migration_generator.rb | 6 +++++- .../migration/migration_generator_spec.rb | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/generators/drafting/migration/migration_generator.rb b/lib/generators/drafting/migration/migration_generator.rb index 5018e74..e0ee5c8 100644 --- a/lib/generators/drafting/migration/migration_generator.rb +++ b/lib/generators/drafting/migration/migration_generator.rb @@ -11,8 +11,12 @@ class MigrationGenerator < Rails::Generators::Base def create_migration_file Dir.glob("#{MigrationGenerator.source_root}/*.rb").each do |abs_path| basename = File.basename(abs_path) - filename = basename.split('-').last + # these numbers will keep the migration files generated in order + # for backwards compatibility, do not change the order of existing migration file templates + raise 'Migration file should start with a number' if basename !~ /^[\d]+\-.*/ + + filename = basename.split('-').last migration_template basename, "db/migrate/#{filename}" end end diff --git a/spec/lib/generators/drafting/migration/migration_generator_spec.rb b/spec/lib/generators/drafting/migration/migration_generator_spec.rb index f19978b..616a89d 100644 --- a/spec/lib/generators/drafting/migration/migration_generator_spec.rb +++ b/spec/lib/generators/drafting/migration/migration_generator_spec.rb @@ -77,6 +77,23 @@ module Drafting /class NonUserDraftingMigration < Drafting::MIGRATION_BASE_CLASS/ end end + + describe 'migration file not starting with "-"' do + let!(:filename) { "#{Drafting.root}/lib/generators/drafting/migration/templates/something.rb" } + + before :each do + prepare_destination + FileUtils.touch(filename) + end + + after :each do + FileUtils.rm(filename) + end + + it 'should raise error' do + expect { run_generator }.to raise_error('Migration file should start with a number') + end + end end end end From e2b1630722fd40af399d0ba55357177b44dbc22d Mon Sep 17 00:00:00 2001 From: Victor Leong Date: Fri, 5 Aug 2022 09:02:27 +0900 Subject: [PATCH 07/14] add metadata migration file --- lib/drafting/draft.rb | 5 ++ .../drafting/migration/migration_generator.rb | 34 ++++---- ...ing_migration.rb => drafting_migration.rb} | 0 .../templates/metadata_drafting_migration.rb | 9 +++ ...tion.rb => non_user_drafting_migration.rb} | 0 .../migration/migration_generator_spec.rb | 79 +++++++++---------- 6 files changed, 71 insertions(+), 56 deletions(-) rename lib/generators/drafting/migration/templates/{0-drafting_migration.rb => drafting_migration.rb} (100%) create mode 100644 lib/generators/drafting/migration/templates/metadata_drafting_migration.rb rename lib/generators/drafting/migration/templates/{1-non_user_drafting_migration.rb => non_user_drafting_migration.rb} (100%) diff --git a/lib/drafting/draft.rb b/lib/drafting/draft.rb index 47dbbce..51e53b0 100644 --- a/lib/drafting/draft.rb +++ b/lib/drafting/draft.rb @@ -4,6 +4,11 @@ class Draft < ActiveRecord::Base validates_presence_of :data, :target_type + store :metadata, accessors: %i[ + title + description + ], coder: JSON + def restore target_type.constantize.from_draft(self) end diff --git a/lib/generators/drafting/migration/migration_generator.rb b/lib/generators/drafting/migration/migration_generator.rb index e0ee5c8..55102a6 100644 --- a/lib/generators/drafting/migration/migration_generator.rb +++ b/lib/generators/drafting/migration/migration_generator.rb @@ -8,27 +8,31 @@ class MigrationGenerator < Rails::Generators::Base desc 'Generates migration for Drafting' source_root File.expand_path('../templates', __FILE__) - def create_migration_file - Dir.glob("#{MigrationGenerator.source_root}/*.rb").each do |abs_path| - basename = File.basename(abs_path) + # TODO: make these methods metaprogramming + def create_migration_file1 + migration_template 'drafting_migration.rb', "db/migrate/drafting_migration.rb" + end - # these numbers will keep the migration files generated in order - # for backwards compatibility, do not change the order of existing migration file templates - raise 'Migration file should start with a number' if basename !~ /^[\d]+\-.*/ + def create_migration_file2 + migration_template 'non_user_drafting_migration.rb', "db/migrate/non_user_drafting_migration.rb" + end - filename = basename.split('-').last - migration_template basename, "db/migrate/#{filename}" - end + def create_migration_file3 + migration_template 'metadata_drafting_migration.rb', "db/migrate/metadata_drafting_migration.rb" end def self.next_migration_number(dirname) - if ActiveRecord.timestamped_migrations - # ensure timestamp of the multiple migration files generated - # will be different - timestamp = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i - timestamp += 1 if current_migration_number(dirname) == timestamp + format = '%Y%m%d%H%M%S' + + # check if migration number already a timestamp for timestamped migrations + # strptime throws error, and rescue handles if not the case + DateTime.strptime(current_migration_number(dirname).to_s, format) - timestamp + (DateTime.parse(current_migration_number(dirname).to_s) + 1.second).strftime(format) + rescue ArgumentError + if ActiveRecord::Base.timestamped_migrations + # this will only run the first migration file is generated + Time.now.utc.strftime("%Y%m%d%H%M%S").to_i else "%.3d" % (current_migration_number(dirname) + 1) end diff --git a/lib/generators/drafting/migration/templates/0-drafting_migration.rb b/lib/generators/drafting/migration/templates/drafting_migration.rb similarity index 100% rename from lib/generators/drafting/migration/templates/0-drafting_migration.rb rename to lib/generators/drafting/migration/templates/drafting_migration.rb diff --git a/lib/generators/drafting/migration/templates/metadata_drafting_migration.rb b/lib/generators/drafting/migration/templates/metadata_drafting_migration.rb new file mode 100644 index 0000000..7dfa85f --- /dev/null +++ b/lib/generators/drafting/migration/templates/metadata_drafting_migration.rb @@ -0,0 +1,9 @@ +class MetadataDraftingMigration < Drafting::MIGRATION_BASE_CLASS + def self.up + add_column :drafts, :metadata, :text + end + + def self.down + remove_column :drafts, :metadata + end +end diff --git a/lib/generators/drafting/migration/templates/1-non_user_drafting_migration.rb b/lib/generators/drafting/migration/templates/non_user_drafting_migration.rb similarity index 100% rename from lib/generators/drafting/migration/templates/1-non_user_drafting_migration.rb rename to lib/generators/drafting/migration/templates/non_user_drafting_migration.rb diff --git a/spec/lib/generators/drafting/migration/migration_generator_spec.rb b/spec/lib/generators/drafting/migration/migration_generator_spec.rb index 616a89d..8ffe1c7 100644 --- a/spec/lib/generators/drafting/migration/migration_generator_spec.rb +++ b/spec/lib/generators/drafting/migration/migration_generator_spec.rb @@ -19,7 +19,7 @@ module Drafting ].each do |test_suite| describe test_suite[:configuration] do before :each do - ActiveRecord.timestamped_migrations = test_suite[:timestamped_migrations] + ActiveRecord::Base.timestamped_migrations = test_suite[:timestamped_migrations] end describe 'new app' do @@ -28,26 +28,31 @@ module Drafting run_generator end - it "creates two installation db migration" do + it 'creates 3 installation db migration files in order eventually' do migration_files = Dir.glob("#{root_dir}/db/migrate/*drafting*.rb").sort - assert_equal migration_files.count, 2 + assert_equal migration_files.count, 3 assert_file migration_files[0], /class DraftingMigration < Drafting::MIGRATION_BASE_CLASS/ assert_file migration_files[1], /class NonUserDraftingMigration < Drafting::MIGRATION_BASE_CLASS/ + assert_file migration_files[2], + /class MetadataDraftingMigration < Drafting::MIGRATION_BASE_CLASS/ end it "creates migration files of different timestamp" do migration_files = Dir.glob("#{root_dir}/db/migrate/*drafting*.rb").sort - migration_no1 = File.basename(migration_files[0]).split("_").first - migration_no2 = File.basename(migration_files[1]).split("_").first + # TODO: there has to be a better way to do this + timestamps = migration_files.map do |migration_file| + File.basename(migration_file).split("_").first + end - assert_not_equal migration_no1, migration_no2 + assert_equal timestamps.size, 3 + assert_equal timestamps.uniq.size, 3 end end @@ -55,43 +60,35 @@ module Drafting before :each do prepare_destination run_generator - FileUtils.rm Dir.glob("#{root_dir}/db/migrate/*non_user_drafting_migration.rb") - - migration_files = - Dir.glob("#{root_dir}/db/migrate/*drafting*.rb").sort - expect(migration_files.count).to eq 1 - assert_file migration_files[0], - /class DraftingMigration < Drafting::MIGRATION_BASE_CLASS/ - - run_generator - end - - it "creates only one more db migration" do - migration_files = - Dir.glob("#{root_dir}/db/migrate/*drafting*.rb").sort - expect(migration_files.count).to eq 2 - - assert_file migration_files[0], - /class DraftingMigration < Drafting::MIGRATION_BASE_CLASS/ - assert_file migration_files[1], - /class NonUserDraftingMigration < Drafting::MIGRATION_BASE_CLASS/ - end - end - - describe 'migration file not starting with "-"' do - let!(:filename) { "#{Drafting.root}/lib/generators/drafting/migration/templates/something.rb" } - - before :each do - prepare_destination - FileUtils.touch(filename) - end - - after :each do - FileUtils.rm(filename) end - it 'should raise error' do - expect { run_generator }.to raise_error('Migration file should start with a number') + describe 'from 0.5.x' do + before :each do + FileUtils.rm Dir.glob("#{root_dir}/db/migrate/*non_user_drafting_migration.rb") + FileUtils.rm Dir.glob("#{root_dir}/db/migrate/*metadata_drafting_migration.rb") + + migration_files = + Dir.glob("#{root_dir}/db/migrate/*drafting*.rb").sort + expect(migration_files.count).to eq 1 + assert_file migration_files[0], + /class DraftingMigration < Drafting::MIGRATION_BASE_CLASS/ + + run_generator + end + + it 'creates 3 installation db migration files in order eventually' do + migration_files = + Dir.glob("#{root_dir}/db/migrate/*drafting*.rb").sort + + assert_equal migration_files.count, 3 + + assert_file migration_files[0], + /class DraftingMigration < Drafting::MIGRATION_BASE_CLASS/ + assert_file migration_files[1], + /class NonUserDraftingMigration < Drafting::MIGRATION_BASE_CLASS/ + assert_file migration_files[2], + /class MetadataDraftingMigration < Drafting::MIGRATION_BASE_CLASS/ + end end end end From 4584e3f3bcce827c28d70766fab44fb2491b908e Mon Sep 17 00:00:00 2001 From: Victor Leong Date: Fri, 5 Aug 2022 10:12:28 +0900 Subject: [PATCH 08/14] fix specs with Draft.reset_column_information --- bin/console | 7 ++++++- lib/drafting/instance_methods.rb | 8 +++++--- .../migration/templates/metadata_drafting_migration.rb | 1 + spec/drafting/draft_spec.rb | 2 +- spec/drafting/instance_methods_spec.rb | 7 +++++++ spec/spec_helper.rb | 4 ++++ 6 files changed, 24 insertions(+), 5 deletions(-) diff --git a/bin/console b/bin/console index b29aea3..82a419e 100755 --- a/bin/console +++ b/bin/console @@ -4,7 +4,9 @@ require "bundler/setup" require "drafting" $LOAD_PATH.unshift(File.expand_path('..', File.dirname(__FILE__))) -require 'lib/generators/drafting/migration/templates/migration.rb' +Dir["#{Drafting.root}/lib/generators/drafting/migration/templates/*.rb"].each do |filename| + require filename +end require 'spec/support/spec_migration.rb' require 'spec/models/user' @@ -24,7 +26,10 @@ ActiveRecord::Base.configurations = YAML.load_file('spec/database.yml') ActiveRecord::Base.establish_connection(:sqlite) ActiveRecord::Migration.verbose = false +# TODO: make this metaprogramming DraftingMigration.up +NonUserMigration.up +MetadataMigration.up SpecMigration.up require "irb" diff --git a/lib/drafting/instance_methods.rb b/lib/drafting/instance_methods.rb index 0e511ec..82571c9 100644 --- a/lib/drafting/instance_methods.rb +++ b/lib/drafting/instance_methods.rb @@ -1,6 +1,6 @@ module Drafting module InstanceMethods - def save_draft(user=nil) + def save_draft(user=nil, title=nil, description=nil) return false unless self.new_record? draft = Draft.find_by_id(self.draft_id) || Draft.new @@ -10,16 +10,18 @@ def save_draft(user=nil) draft.user_id = user.try(:id) draft.user_type = user.try(:class).try(:name) draft.parent = self.send(self.class.draft_parent) if self.class.draft_parent + draft.title = title + draft.description = description result = draft.save self.draft_id = draft.id if result result end - def update_draft(user, attributes) + def update_draft(user, attributes, title=nil, description=nil) with_transaction_returning_status do assign_attributes(attributes) - save_draft(user) + save_draft(user, title, description) end end diff --git a/lib/generators/drafting/migration/templates/metadata_drafting_migration.rb b/lib/generators/drafting/migration/templates/metadata_drafting_migration.rb index 7dfa85f..f4ba06d 100644 --- a/lib/generators/drafting/migration/templates/metadata_drafting_migration.rb +++ b/lib/generators/drafting/migration/templates/metadata_drafting_migration.rb @@ -1,6 +1,7 @@ class MetadataDraftingMigration < Drafting::MIGRATION_BASE_CLASS def self.up add_column :drafts, :metadata, :text + Draft.reset_column_information end def self.down diff --git a/spec/drafting/draft_spec.rb b/spec/drafting/draft_spec.rb index d7b4bbd..59b8f7e 100644 --- a/spec/drafting/draft_spec.rb +++ b/spec/drafting/draft_spec.rb @@ -20,7 +20,7 @@ before do Draft.delete_all - message1.save_draft(user) + message1.save_draft(user, 'Title1', 'Description1') message2.save_draft(user) end diff --git a/spec/drafting/instance_methods_spec.rb b/spec/drafting/instance_methods_spec.rb index a7b65da..7607183 100644 --- a/spec/drafting/instance_methods_spec.rb +++ b/spec/drafting/instance_methods_spec.rb @@ -77,6 +77,13 @@ expect(draft.user_id).to eq(admin_user.id) end + it 'should save title & description on draft' do + message.save_draft(nil, 'Message Title', 'Message Description') + draft = Draft.find(message.draft_id) + expect(draft.title).to eq 'Message Title' + expect(draft.description).to eq 'Message Description' + end + it 'should store extra attributes to Draft' do message.priority = 5 message.save_draft(user) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index e200f28..f5de10b 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -35,7 +35,9 @@ RSpec.configure do |config| config.after(:suite) do + # TODO: make this metaprogramming SpecMigration.down + MetadataDraftingMigration.down NonUserDraftingMigration.down DraftingMigration.down end @@ -47,8 +49,10 @@ def setup_db ActiveRecord::Base.establish_connection(:sqlite) ActiveRecord::Migration.verbose = false + # TODO: make this metaprogramming DraftingMigration.up NonUserDraftingMigration.up + MetadataDraftingMigration.up SpecMigration.up end From d474a3fbb9cb7876163f2f04742f37fb7535cc89 Mon Sep 17 00:00:00 2001 From: Victor Leong Date: Sat, 6 Aug 2022 06:33:38 +0900 Subject: [PATCH 09/14] validate filenames --- .../drafting/migration/migration_generator.rb | 17 +++++++++++++++++ ...ing_migration.rb => 0-drafting_migration.rb} | 0 ...tion.rb => 1-non_user_drafting_migration.rb} | 0 ...tion.rb => 2-metadata_drafting_migration.rb} | 0 .../migration/migration_generator_spec.rb | 17 +++++++++++++++++ 5 files changed, 34 insertions(+) rename lib/generators/drafting/migration/templates/{drafting_migration.rb => 0-drafting_migration.rb} (100%) rename lib/generators/drafting/migration/templates/{non_user_drafting_migration.rb => 1-non_user_drafting_migration.rb} (100%) rename lib/generators/drafting/migration/templates/{metadata_drafting_migration.rb => 2-metadata_drafting_migration.rb} (100%) diff --git a/lib/generators/drafting/migration/migration_generator.rb b/lib/generators/drafting/migration/migration_generator.rb index 55102a6..890df7e 100644 --- a/lib/generators/drafting/migration/migration_generator.rb +++ b/lib/generators/drafting/migration/migration_generator.rb @@ -8,6 +8,17 @@ class MigrationGenerator < Rails::Generators::Base desc 'Generates migration for Drafting' source_root File.expand_path('../templates', __FILE__) + def validation + Drafting::MigrationGenerator.loop_through_migration_files do |abs_path| + basename = File.basename(abs_path) + filename = basename.split('-').last + + # these numbers will keep the migration files generated in order + # for backwards compatibility, do NOT change the order of existing migration file templates🙏 + raise 'Migration files should start with a number followed by a dash' if basename !~ /^[\d]+\-.*/ + end + end + # TODO: make these methods metaprogramming def create_migration_file1 migration_template 'drafting_migration.rb', "db/migrate/drafting_migration.rb" @@ -21,6 +32,12 @@ def create_migration_file3 migration_template 'metadata_drafting_migration.rb', "db/migrate/metadata_drafting_migration.rb" end + def self.loop_through_migration_files + Dir.glob("#{MigrationGenerator.source_root}/*.rb").each do |abs_path| + yield abs_path + end + end + def self.next_migration_number(dirname) format = '%Y%m%d%H%M%S' diff --git a/lib/generators/drafting/migration/templates/drafting_migration.rb b/lib/generators/drafting/migration/templates/0-drafting_migration.rb similarity index 100% rename from lib/generators/drafting/migration/templates/drafting_migration.rb rename to lib/generators/drafting/migration/templates/0-drafting_migration.rb diff --git a/lib/generators/drafting/migration/templates/non_user_drafting_migration.rb b/lib/generators/drafting/migration/templates/1-non_user_drafting_migration.rb similarity index 100% rename from lib/generators/drafting/migration/templates/non_user_drafting_migration.rb rename to lib/generators/drafting/migration/templates/1-non_user_drafting_migration.rb diff --git a/lib/generators/drafting/migration/templates/metadata_drafting_migration.rb b/lib/generators/drafting/migration/templates/2-metadata_drafting_migration.rb similarity index 100% rename from lib/generators/drafting/migration/templates/metadata_drafting_migration.rb rename to lib/generators/drafting/migration/templates/2-metadata_drafting_migration.rb diff --git a/spec/lib/generators/drafting/migration/migration_generator_spec.rb b/spec/lib/generators/drafting/migration/migration_generator_spec.rb index 8ffe1c7..671161d 100644 --- a/spec/lib/generators/drafting/migration/migration_generator_spec.rb +++ b/spec/lib/generators/drafting/migration/migration_generator_spec.rb @@ -91,6 +91,23 @@ module Drafting end end end + + describe 'migration file not starting with "-"' do + let!(:filename) { "#{Drafting.root}/lib/generators/drafting/migration/templates/something.rb" } + + before :each do + prepare_destination + FileUtils.touch(filename) + end + + after :each do + FileUtils.rm(filename) + end + + it 'should raise error' do + expect { run_generator }.to raise_error('Migration files should start with a number followed by a dash') + end + end end end end From 6db672c32b7ee626cce9d1b69693529f16a78429 Mon Sep 17 00:00:00 2001 From: Victor Leong Date: Sat, 6 Aug 2022 06:51:17 +0900 Subject: [PATCH 10/14] use metaprogramming to generate migration methods --- .../drafting/migration/migration_generator.rb | 40 ++++++++++--------- .../migration/migration_generator_spec.rb | 2 +- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/lib/generators/drafting/migration/migration_generator.rb b/lib/generators/drafting/migration/migration_generator.rb index 890df7e..1a797a3 100644 --- a/lib/generators/drafting/migration/migration_generator.rb +++ b/lib/generators/drafting/migration/migration_generator.rb @@ -8,33 +8,35 @@ class MigrationGenerator < Rails::Generators::Base desc 'Generates migration for Drafting' source_root File.expand_path('../templates', __FILE__) - def validation - Drafting::MigrationGenerator.loop_through_migration_files do |abs_path| - basename = File.basename(abs_path) - filename = basename.split('-').last + def self.loop_through_migration_files + Dir.glob("#{MigrationGenerator.source_root}/*.rb").each_with_index do |abs_path, index| + original_filename = File.basename(abs_path) + filename = original_filename.split('-').last - # these numbers will keep the migration files generated in order - # for backwards compatibility, do NOT change the order of existing migration file templates🙏 - raise 'Migration files should start with a number followed by a dash' if basename !~ /^[\d]+\-.*/ + yield original_filename, filename, index end end - # TODO: make these methods metaprogramming - def create_migration_file1 - migration_template 'drafting_migration.rb', "db/migrate/drafting_migration.rb" + def validation + Drafting::MigrationGenerator.loop_through_migration_files do |original_filename| + # these numbers will keep the migration files generated in order + # for backwards compatibility, do NOT change the order of existing migration file templates🙏 + raise 'Migration files should start with a number followed by a dash to dictate the order of migration files to be generated' if original_filename !~ /^[\d]+\-.*/ + end end - def create_migration_file2 - migration_template 'non_user_drafting_migration.rb', "db/migrate/non_user_drafting_migration.rb" - end + ######### + # USAGE # + ######### - def create_migration_file3 - migration_template 'metadata_drafting_migration.rb', "db/migrate/metadata_drafting_migration.rb" - end + # Instance methods in this Generator will run in sequence (starting from `validation` above👆) + # The methods generated dynamically below will create the migration file in order + # This order is dictated by the number prefix in the name of the migration template files + # naming format should follow: `-custom_name_drafting_migration.rb` - def self.loop_through_migration_files - Dir.glob("#{MigrationGenerator.source_root}/*.rb").each do |abs_path| - yield abs_path + loop_through_migration_files do |original_filename, filename, index| + define_method "create_migration_file#{index}" do + migration_template original_filename, "db/migrate/#{filename}" end end diff --git a/spec/lib/generators/drafting/migration/migration_generator_spec.rb b/spec/lib/generators/drafting/migration/migration_generator_spec.rb index 671161d..39e6c96 100644 --- a/spec/lib/generators/drafting/migration/migration_generator_spec.rb +++ b/spec/lib/generators/drafting/migration/migration_generator_spec.rb @@ -105,7 +105,7 @@ module Drafting end it 'should raise error' do - expect { run_generator }.to raise_error('Migration files should start with a number followed by a dash') + expect { run_generator }.to raise_error('Migration files should start with a number followed by a dash to dictate the order of migration files to be generated') end end end From 86235fc94d50b43f34ea77999043bb812bc40573 Mon Sep 17 00:00:00 2001 From: Victor Leong Date: Sat, 6 Aug 2022 07:11:54 +0900 Subject: [PATCH 11/14] refactor common test --- .../migration/migration_generator_spec.rb | 35 ++++++++----------- spec/support/shared/examples/migrations.rb | 15 ++++++++ 2 files changed, 29 insertions(+), 21 deletions(-) create mode 100644 spec/support/shared/examples/migrations.rb diff --git a/spec/lib/generators/drafting/migration/migration_generator_spec.rb b/spec/lib/generators/drafting/migration/migration_generator_spec.rb index 39e6c96..3ade631 100644 --- a/spec/lib/generators/drafting/migration/migration_generator_spec.rb +++ b/spec/lib/generators/drafting/migration/migration_generator_spec.rb @@ -28,25 +28,12 @@ module Drafting run_generator end - it 'creates 3 installation db migration files in order eventually' do - migration_files = - Dir.glob("#{root_dir}/db/migrate/*drafting*.rb").sort - - assert_equal migration_files.count, 3 - - assert_file migration_files[0], - /class DraftingMigration < Drafting::MIGRATION_BASE_CLASS/ - assert_file migration_files[1], - /class NonUserDraftingMigration < Drafting::MIGRATION_BASE_CLASS/ - assert_file migration_files[2], - /class MetadataDraftingMigration < Drafting::MIGRATION_BASE_CLASS/ - end + include_examples 'eventual output', root_dir it "creates migration files of different timestamp" do migration_files = Dir.glob("#{root_dir}/db/migrate/*drafting*.rb").sort - # TODO: there has to be a better way to do this timestamps = migration_files.map do |migration_file| File.basename(migration_file).split("_").first end @@ -62,7 +49,7 @@ module Drafting run_generator end - describe 'from 0.5.x' do + describe 'before 0.5.x' do before :each do FileUtils.rm Dir.glob("#{root_dir}/db/migrate/*non_user_drafting_migration.rb") FileUtils.rm Dir.glob("#{root_dir}/db/migrate/*metadata_drafting_migration.rb") @@ -76,19 +63,25 @@ module Drafting run_generator end - it 'creates 3 installation db migration files in order eventually' do - migration_files = - Dir.glob("#{root_dir}/db/migrate/*drafting*.rb").sort + include_examples 'eventual output', root_dir + end - assert_equal migration_files.count, 3 + describe 'after 0.5.x' do + before :each do + FileUtils.rm Dir.glob("#{root_dir}/db/migrate/*metadata_drafting_migration.rb") + migration_files = + Dir.glob("#{root_dir}/db/migrate/*drafting*.rb").sort + expect(migration_files.count).to eq 2 assert_file migration_files[0], /class DraftingMigration < Drafting::MIGRATION_BASE_CLASS/ assert_file migration_files[1], /class NonUserDraftingMigration < Drafting::MIGRATION_BASE_CLASS/ - assert_file migration_files[2], - /class MetadataDraftingMigration < Drafting::MIGRATION_BASE_CLASS/ + + run_generator end + + include_examples 'eventual output', root_dir end end diff --git a/spec/support/shared/examples/migrations.rb b/spec/support/shared/examples/migrations.rb new file mode 100644 index 0000000..018cff8 --- /dev/null +++ b/spec/support/shared/examples/migrations.rb @@ -0,0 +1,15 @@ +RSpec.shared_examples 'eventual output' do |root_dir| + it 'creates 3 installation db migration files in order eventually' do + migration_files = + Dir.glob("#{root_dir}/db/migrate/*drafting*.rb").sort + + assert_equal migration_files.count, 3 + + assert_file migration_files[0], + /class DraftingMigration < Drafting::MIGRATION_BASE_CLASS/ + assert_file migration_files[1], + /class NonUserDraftingMigration < Drafting::MIGRATION_BASE_CLASS/ + assert_file migration_files[2], + /class MetadataDraftingMigration < Drafting::MIGRATION_BASE_CLASS/ + end +end From 460a5c1929d7fdb6013c3e6464c013ba6db9d53c Mon Sep 17 00:00:00 2001 From: Victor Leong Date: Sat, 6 Aug 2022 07:28:05 +0900 Subject: [PATCH 12/14] use metaprogramming to generate migration files --- bin/console | 7 ++-- .../drafting/migration/migration_generator.rb | 2 +- .../migration/migration_generator_spec.rb | 37 +++++++++++++++---- spec/spec_helper.rb | 13 +++---- 4 files changed, 39 insertions(+), 20 deletions(-) diff --git a/bin/console b/bin/console index 82a419e..265a0ce 100755 --- a/bin/console +++ b/bin/console @@ -26,10 +26,9 @@ ActiveRecord::Base.configurations = YAML.load_file('spec/database.yml') ActiveRecord::Base.establish_connection(:sqlite) ActiveRecord::Migration.verbose = false -# TODO: make this metaprogramming -DraftingMigration.up -NonUserMigration.up -MetadataMigration.up +Object.constants.grep(/DraftingMigration$/).each do |const| + Object.const_get(const).up +end SpecMigration.up require "irb" diff --git a/lib/generators/drafting/migration/migration_generator.rb b/lib/generators/drafting/migration/migration_generator.rb index 1a797a3..93057b9 100644 --- a/lib/generators/drafting/migration/migration_generator.rb +++ b/lib/generators/drafting/migration/migration_generator.rb @@ -21,7 +21,7 @@ def validation Drafting::MigrationGenerator.loop_through_migration_files do |original_filename| # these numbers will keep the migration files generated in order # for backwards compatibility, do NOT change the order of existing migration file templates🙏 - raise 'Migration files should start with a number followed by a dash to dictate the order of migration files to be generated' if original_filename !~ /^[\d]+\-.*/ + raise 'Migration files should start with a number followed by a dash to dictate the order of migration files to be generated' if original_filename !~ /^[\d]+\-.*drafting_migration\.rb/ end end diff --git a/spec/lib/generators/drafting/migration/migration_generator_spec.rb b/spec/lib/generators/drafting/migration/migration_generator_spec.rb index 3ade631..a0f596d 100644 --- a/spec/lib/generators/drafting/migration/migration_generator_spec.rb +++ b/spec/lib/generators/drafting/migration/migration_generator_spec.rb @@ -85,20 +85,41 @@ module Drafting end end - describe 'migration file not starting with "-"' do - let!(:filename) { "#{Drafting.root}/lib/generators/drafting/migration/templates/something.rb" } - + describe 'wrongly named migration files' do before :each do prepare_destination - FileUtils.touch(filename) end - after :each do - FileUtils.rm(filename) + describe 'not starting with "-"' do + let!(:filename) { "#{Drafting.root}/lib/generators/drafting/migration/templates/something_drafting_migration.rb" } + + before :each do + FileUtils.touch(filename) + end + + after :each do + FileUtils.rm(filename) + end + + it 'should raise error' do + expect { run_generator }.to raise_error('Migration files should start with a number followed by a dash to dictate the order of migration files to be generated') + end end - it 'should raise error' do - expect { run_generator }.to raise_error('Migration files should start with a number followed by a dash to dictate the order of migration files to be generated') + describe 'not ending with "drafting_migration.rb"' do + let!(:filename) { "#{Drafting.root}/lib/generators/drafting/migration/templates/something_migration.rb" } + + before :each do + FileUtils.touch(filename) + end + + after :each do + FileUtils.rm(filename) + end + + it 'should raise error' do + expect { run_generator }.to raise_error('Migration files should start with a number followed by a dash to dictate the order of migration files to be generated') + end end end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index f5de10b..4d9c166 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -37,9 +37,9 @@ config.after(:suite) do # TODO: make this metaprogramming SpecMigration.down - MetadataDraftingMigration.down - NonUserDraftingMigration.down - DraftingMigration.down + Object.constants.grep(/DraftingMigration$/).reverse.each do |const| + Object.const_get(const).down + end end end @@ -49,10 +49,9 @@ def setup_db ActiveRecord::Base.establish_connection(:sqlite) ActiveRecord::Migration.verbose = false - # TODO: make this metaprogramming - DraftingMigration.up - NonUserDraftingMigration.up - MetadataDraftingMigration.up + Object.constants.grep(/DraftingMigration$/).each do |const| + Object.const_get(const).up + end SpecMigration.up end From 2c9df372421424c39c6a248ffa50e2e5aa7de698 Mon Sep 17 00:00:00 2001 From: Victor Leong Date: Sat, 6 Aug 2022 08:35:46 +0900 Subject: [PATCH 13/14] implement open ended metadata --- README.md | 35 ++++++++++++++++++-- lib/drafting/draft.rb | 22 ++++++++++--- lib/drafting/instance_methods.rb | 12 ++++--- lib/drafting/version.rb | 2 +- spec/drafting/instance_methods_spec.rb | 45 +++++++++++++++++++++++--- 5 files changed, 98 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 53ea2b6..a80bce0 100644 --- a/README.md +++ b/README.md @@ -66,16 +66,45 @@ drafts = Message.drafts(current_user) messages = drafts.restore_all ``` -### Migration +### Migrations & Their Features + +If you are upgrading from previous versions, simply run `rails g drafting:migration` again to generate the mising migration files. #### 0.5.x Starting from 0.5.x, you will be able to save drafts under a non `User` model as such: -``` + +```ruby message.save_draft(author) ``` -If you are upgrading from previous versions, simply run `rails g drafting:migration` again to generate the mising migration files. +#### 0.6.x + +Starting from 0.6.x, you will be able to save metadata to your `draft` (eg. to label your drafts) as such: + +```ruby +message.save_draft(author, { title: 'Final Draft 2022-08-06' }) +draft = Draft.find(message.draft_id) +draft.title # => 'Final Draft 2022-08-06' + +message.update_draft( + author, + { content: 'New content for message' }, + { + title: 'Final Final Draft 2022-08-06', + version: '1.123' + } +) +message.content # => 'New content for message' +draft = Draft.find(message.draft_id) +draft.title # => 'Final Final Draft 2022-08-06' +draft.version # => '1.123' +draft.version = '1.5' +draft.save +draft.reload.version # => '1.5' +``` + +Note that the `metadata` on the draft is essentially a [Rails store](https://api.rubyonrails.org/classes/ActiveRecord/Store.html) whose keys are dynamically generated according to your application needs. They are generated on the fly via `method_missing`. ### Linking to parent instance diff --git a/lib/drafting/draft.rb b/lib/drafting/draft.rb index 51e53b0..f3bad0d 100644 --- a/lib/drafting/draft.rb +++ b/lib/drafting/draft.rb @@ -4,10 +4,7 @@ class Draft < ActiveRecord::Base validates_presence_of :data, :target_type - store :metadata, accessors: %i[ - title - description - ], coder: JSON + store :metadata, accessors: [], coder: JSON def restore target_type.constantize.from_draft(self) @@ -16,4 +13,21 @@ def restore def self.restore_all find_each.map(&:restore) end + + private + + def method_missing(name, *args) + method_name = name.to_s + if method_name !~ /[a-z0-9_]+=?$/ + super + else + # TODO: executing on instance's class, not on it's eigenclass, so that store_accessors are permanent in application lifecycle, good idea? 🤔 + Draft.store_accessor :metadata, method_name.gsub('=', "").to_sym + public_send(name, *args) + end + end + + def respond_to_missing?(sym, include_private) + true + end end diff --git a/lib/drafting/instance_methods.rb b/lib/drafting/instance_methods.rb index 82571c9..672bc31 100644 --- a/lib/drafting/instance_methods.rb +++ b/lib/drafting/instance_methods.rb @@ -1,6 +1,6 @@ module Drafting module InstanceMethods - def save_draft(user=nil, title=nil, description=nil) + def save_draft(user=nil, metadata={}) return false unless self.new_record? draft = Draft.find_by_id(self.draft_id) || Draft.new @@ -10,18 +10,20 @@ def save_draft(user=nil, title=nil, description=nil) draft.user_id = user.try(:id) draft.user_type = user.try(:class).try(:name) draft.parent = self.send(self.class.draft_parent) if self.class.draft_parent - draft.title = title - draft.description = description + metadata = metadata.with_indifferent_access + metadata.each_key do |key| + draft.public_send("#{key}=", metadata[key]) + end result = draft.save self.draft_id = draft.id if result result end - def update_draft(user, attributes, title=nil, description=nil) + def update_draft(user, attributes, metadata={}) with_transaction_returning_status do assign_attributes(attributes) - save_draft(user, title, description) + save_draft(user, metadata) end end diff --git a/lib/drafting/version.rb b/lib/drafting/version.rb index 3eda834..98fd687 100644 --- a/lib/drafting/version.rb +++ b/lib/drafting/version.rb @@ -1,5 +1,5 @@ module Drafting - VERSION = "0.5.1" + VERSION = "0.6.0" def self.root File.expand_path '../../..', __FILE__ diff --git a/spec/drafting/instance_methods_spec.rb b/spec/drafting/instance_methods_spec.rb index 7607183..340b4ba 100644 --- a/spec/drafting/instance_methods_spec.rb +++ b/spec/drafting/instance_methods_spec.rb @@ -77,11 +77,21 @@ expect(draft.user_id).to eq(admin_user.id) end - it 'should save title & description on draft' do - message.save_draft(nil, 'Message Title', 'Message Description') + it 'should save metadata on draft and allow changes' do + message.save_draft( + nil, + { + title: 'Message Title', + sub_title: 'Message SubTitle' + } + ) draft = Draft.find(message.draft_id) expect(draft.title).to eq 'Message Title' - expect(draft.description).to eq 'Message Description' + expect(draft.sub_title).to eq 'Message SubTitle' + + draft.title = 'New Title' + draft.save + expect(draft.reload.title).to eq 'New Title' end it 'should store extra attributes to Draft' do @@ -92,7 +102,7 @@ expect(draft.restore.priority).to eq(5) end - it 'should store assocations to Draft' do + it 'should store associations to Draft' do message = topic.messages.build user: user, content: 'foo' message.tags.build name: 'important' message.tags.build name: 'ruby' @@ -125,7 +135,7 @@ end describe 'update_draft' do - it 'should update existing Draft object' do + it 'should update existing Draft object (without metadata)' do message.save_draft(user) expect { @@ -136,6 +146,31 @@ draft = Draft.find(message.draft_id) expect(draft.restore.attributes).to eq(message.attributes) end + + it 'should update existing Draft object (with metadata)' do + message.save_draft(user) + + expect { + message.update_draft( + user, + { content: 'bar' }, + { + title: 'Message Title', + sub_title: 'Message SubTitle' + } + ) + }.to change(Draft, :count).by(0).and \ + change(Message, :count).by(0) + + draft = Draft.find(message.draft_id) + expect(draft.title).to eq 'Message Title' + expect(draft.sub_title).to eq 'Message SubTitle' + expect(draft.restore.attributes).to eq(message.attributes) + + draft.title = 'New Title' + draft.save + expect(draft.reload.title).to eq 'New Title' + end end describe 'clear_draft' do From fb78aa74fab406195c50bdb2489f91cb77551bc5 Mon Sep 17 00:00:00 2001 From: Victor Leong Date: Sat, 6 Aug 2022 08:53:48 +0900 Subject: [PATCH 14/14] fix migration order in specs --- bin/console | 4 ++-- .../drafting/migration/migration_generator.rb | 8 ++++++-- spec/drafting/draft_spec.rb | 2 +- spec/spec_helper.rb | 10 +++++----- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/bin/console b/bin/console index 265a0ce..8f2d48a 100755 --- a/bin/console +++ b/bin/console @@ -26,8 +26,8 @@ ActiveRecord::Base.configurations = YAML.load_file('spec/database.yml') ActiveRecord::Base.establish_connection(:sqlite) ActiveRecord::Migration.verbose = false -Object.constants.grep(/DraftingMigration$/).each do |const| - Object.const_get(const).up +Drafting::MigrationGenerator.loop_through_migration_files do |_, filename| + Object.const_get(filename.gsub('.rb', '').camelize).up end SpecMigration.up diff --git a/lib/generators/drafting/migration/migration_generator.rb b/lib/generators/drafting/migration/migration_generator.rb index 93057b9..8c4d43b 100644 --- a/lib/generators/drafting/migration/migration_generator.rb +++ b/lib/generators/drafting/migration/migration_generator.rb @@ -8,8 +8,12 @@ class MigrationGenerator < Rails::Generators::Base desc 'Generates migration for Drafting' source_root File.expand_path('../templates', __FILE__) - def self.loop_through_migration_files - Dir.glob("#{MigrationGenerator.source_root}/*.rb").each_with_index do |abs_path, index| + def self.loop_through_migration_files(reverse: false) + files = Dir.glob("#{MigrationGenerator.source_root}/*.rb") + + files = files.reverse if reverse + + files.each_with_index do |abs_path, index| original_filename = File.basename(abs_path) filename = original_filename.split('-').last diff --git a/spec/drafting/draft_spec.rb b/spec/drafting/draft_spec.rb index 59b8f7e..20f3ddf 100644 --- a/spec/drafting/draft_spec.rb +++ b/spec/drafting/draft_spec.rb @@ -20,7 +20,7 @@ before do Draft.delete_all - message1.save_draft(user, 'Title1', 'Description1') + message1.save_draft(user, title: 'Title1') message2.save_draft(user) end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 4d9c166..93ef169 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -12,6 +12,7 @@ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__) require 'drafting' +require "#{Drafting.root}/lib/generators/drafting/migration/migration_generator" Dir["#{Drafting.root}/lib/generators/drafting/migration/templates/*.rb"].each do |filename| require filename end @@ -35,10 +36,9 @@ RSpec.configure do |config| config.after(:suite) do - # TODO: make this metaprogramming SpecMigration.down - Object.constants.grep(/DraftingMigration$/).reverse.each do |const| - Object.const_get(const).down + Drafting::MigrationGenerator.loop_through_migration_files(reverse: true) do |_, filename| + Object.const_get(filename.gsub('.rb', '').camelize).down end end end @@ -49,8 +49,8 @@ def setup_db ActiveRecord::Base.establish_connection(:sqlite) ActiveRecord::Migration.verbose = false - Object.constants.grep(/DraftingMigration$/).each do |const| - Object.const_get(const).up + Drafting::MigrationGenerator.loop_through_migration_files do |_, filename| + Object.const_get(filename.gsub('.rb', '').camelize).up end SpecMigration.up end