data_migrate 3.0.1 → 4.0.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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +6 -1
  3. data/.hound.yml +4 -0
  4. data/.overcommit.yml +21 -0
  5. data/.rspec +3 -0
  6. data/.rubocop.yml +2 -0
  7. data/.ruby-style.yml +1061 -0
  8. data/.travis.yml +16 -0
  9. data/Appraisals +17 -0
  10. data/Changelog.md +35 -0
  11. data/Gemfile.rails5 +5 -0
  12. data/Gemfile.rails5.1 +5 -0
  13. data/Gemfile.rails5.2 +5 -0
  14. data/README.md +58 -41
  15. data/data_migrate.gemspec +12 -1
  16. data/gemfiles/rails_4.1.gemfile +7 -0
  17. data/gemfiles/rails_4.2.gemfile +8 -0
  18. data/gemfiles/rails_5.0.gemfile +7 -0
  19. data/gemfiles/rails_5.1.gemfile +7 -0
  20. data/gemfiles/rails_5.2.gemfile +7 -0
  21. data/lib/data_migrate/data_migrator.rb +53 -8
  22. data/lib/data_migrate/data_migrator_five.rb +84 -0
  23. data/lib/data_migrate/data_schema.rb +63 -0
  24. data/lib/data_migrate/data_schema_migration.rb +1 -0
  25. data/lib/data_migrate/database_tasks.rb +82 -0
  26. data/lib/data_migrate/migration.rb +1 -1
  27. data/lib/data_migrate/migration_context.rb +90 -0
  28. data/lib/data_migrate/migration_five.rb +26 -0
  29. data/lib/data_migrate/railtie.rb +1 -1
  30. data/lib/data_migrate/schema_dumper.rb +42 -0
  31. data/lib/data_migrate/schema_migration.rb +31 -0
  32. data/lib/data_migrate/schema_migration_five.rb +31 -0
  33. data/lib/data_migrate/status_service.rb +65 -0
  34. data/lib/data_migrate/status_service_five.rb +48 -0
  35. data/lib/data_migrate/tasks/data_migrate_tasks.rb +25 -0
  36. data/lib/data_migrate/version.rb +1 -1
  37. data/lib/data_migrate.rb +30 -4
  38. data/lib/generators/data_migration/data_migration_generator.rb +17 -16
  39. data/lib/generators/data_migration/templates/data_migration.rb +4 -4
  40. data/screenshot.png +0 -0
  41. data/spec/data_migrate/data_migrator_spec.rb +50 -0
  42. data/spec/data_migrate/data_schema_migration_spec.rb +16 -0
  43. data/spec/data_migrate/data_spec.rb +87 -0
  44. data/spec/data_migrate/database_tasks_spec.rb +114 -0
  45. data/spec/data_migrate/migration.rb +19 -0
  46. data/spec/data_migrate/migration_context_spec.rb +107 -0
  47. data/spec/data_migrate/schema_dumper_spec.rb +46 -0
  48. data/spec/data_migrate/schema_migration_spec.rb +69 -0
  49. data/spec/data_migrate/status_service_spec.rb +93 -0
  50. data/spec/data_migrate/tasks/data_migrate_tasks_spec.rb +50 -0
  51. data/spec/db/4.2/20091231235959_some_name.rb +9 -0
  52. data/spec/db/4.2/20171231235959_super_update.rb +9 -0
  53. data/spec/db/5.0/20091231235959_some_name.rb +9 -0
  54. data/spec/db/5.0/20171231235959_super_update.rb +9 -0
  55. data/spec/db/data/20091231235959_some_name.rb +9 -0
  56. data/spec/db/data/20171231235959_super_update.rb +9 -0
  57. data/spec/db/migrate/4.2/20131111111111_late_migration.rb +9 -0
  58. data/spec/db/migrate/4.2/20202020202011_db_migration.rb +9 -0
  59. data/spec/db/migrate/5.0/20131111111111_late_migration.rb +9 -0
  60. data/spec/db/migrate/5.0/20202020202011_db_migration.rb +9 -0
  61. data/spec/db/migrate/5.2/20131111111111_late_migration.rb +9 -0
  62. data/spec/db/migrate/5.2/20202020202011_db_migration.rb +9 -0
  63. data/spec/generators/data_migration/data_migration_generator_spec.rb +27 -0
  64. data/spec/spec_helper.rb +9 -0
  65. data/tasks/databases.rake +69 -62
  66. metadata +221 -6
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DataMigrate
4
+ ##
5
+ # This class extends DatabaseTasks to add a data_schema_file method.
6
+ class DatabaseTasks
7
+ extend ActiveRecord::Tasks::DatabaseTasks
8
+
9
+ def self.data_schema_file
10
+ File.join(db_dir, "data_schema.rb")
11
+ end
12
+
13
+ def self.forward(step = 1)
14
+ DataMigrate::DataMigrator.assure_data_schema_table
15
+ migrations = pending_migrations.reverse.pop(step).reverse
16
+ migrations.each do | pending_migration |
17
+ if pending_migration[:kind] == :data
18
+ ActiveRecord::Migration.write("== %s %s" % ["Data", "=" * 71])
19
+ DataMigrate::DataMigrator.run(:up, data_migrations_path, pending_migration[:version])
20
+ elsif pending_migration[:kind] == :schema
21
+ ActiveRecord::Migration.write("== %s %s" % ["Schema", "=" * 69])
22
+ DataMigrate::SchemaMigration.run(:up, schema_migrations_path, pending_migration[:version])
23
+ end
24
+ end
25
+ end
26
+
27
+ def self.data_migrations_path
28
+ "db/data/"
29
+ end
30
+
31
+ def self.schema_migrations_path
32
+ "db/migrate/"
33
+ end
34
+
35
+ def self.pending_migrations
36
+ sort_migrations(pending_schema_migrations, pending_data_migrations)
37
+ end
38
+
39
+ def self.pending_data_migrations
40
+ data_migrations = DataMigrate::DataMigrator.migrations(data_migrations_path)
41
+ sort_migrations(DataMigrate::DataMigrator.new(:up, data_migrations ).
42
+ pending_migrations.map {|m| { version: m.version, kind: :data }})
43
+ end
44
+
45
+ def self.pending_schema_migrations
46
+ ::DataMigrate::SchemaMigration.pending_schema_migrations
47
+ end
48
+
49
+ def self.sort_migrations(set1, set2 = nil)
50
+ migrations = set1 + (set2 || [])
51
+ migrations.sort {|a, b| sort_string(a) <=> sort_string(b)}
52
+ end
53
+
54
+ def self.sort_string(migration)
55
+ "#{migration[:version]}_#{migration[:kind] == :data ? 1 : 0}"
56
+ end
57
+
58
+ def self.past_migrations(sort = nil)
59
+ sort = sort.downcase if sort
60
+ db_list_data =
61
+ if DataMigrate::DataSchemaMigration.table_exists?
62
+ DataMigrate::DataSchemaMigration.normalized_versions.sort
63
+ else
64
+ []
65
+ end
66
+ db_list_schema = ActiveRecord::SchemaMigration.normalized_versions.sort.sort
67
+ migrations = db_list_data.map do |d|
68
+ {
69
+ version: d.to_i, kind: :data
70
+ }
71
+ end +
72
+ db_list_schema.map do |d|
73
+ {
74
+ version: d.to_i, kind: :schema
75
+ }
76
+ end
77
+
78
+ sort == "asc" ? sort_migrations(migrations) : sort_migrations(migrations).reverse
79
+ end
80
+
81
+ end
82
+ end
@@ -11,7 +11,7 @@ module DataMigrate
11
11
  end
12
12
 
13
13
  def table_name
14
- ActiveRecord::Base.table_name_prefix + 'data_migrations' + ActiveRecord::Base.table_name_suffix
14
+ ActiveRecord::Base.table_name_prefix + "data_migrations" + ActiveRecord::Base.table_name_suffix
15
15
  end
16
16
 
17
17
  def index_name
@@ -0,0 +1,90 @@
1
+ module DataMigrate
2
+ class MigrationContext < ActiveRecord::MigrationContext
3
+ def initialize(migrations_paths = "db/data")
4
+ @migrations_paths = migrations_paths || "db/data"
5
+ end
6
+
7
+ def up(target_version = nil)
8
+ selected_migrations = if block_given?
9
+ migrations.select { |m| yield m }
10
+ else
11
+ migrations
12
+ end
13
+
14
+ DataMigrator.new(:up, selected_migrations, target_version).migrate
15
+ end
16
+
17
+ def down(target_version = nil)
18
+ selected_migrations =
19
+ if block_given?
20
+ migrations.select { |m| yield m }
21
+ else
22
+ migrations
23
+ end
24
+
25
+ DataMigrator.new(:down, selected_migrations, target_version).migrate
26
+ end
27
+
28
+ def run(direction, target_version)
29
+ DataMigrator.new(direction, migrations, target_version).run
30
+ end
31
+
32
+ def current_version
33
+ get_all_versions.max || 0
34
+ rescue ActiveRecord::NoDatabaseError
35
+ end
36
+
37
+ def migration_files
38
+ paths = Array(migrations_paths)
39
+ Dir[*paths.flat_map { |path| "#{path}/**/[0-9]*_*.rb" }]
40
+ end
41
+
42
+ def migrations_status
43
+ db_list = DataSchemaMigration.normalized_versions
44
+
45
+ file_list = migration_files.map do |file|
46
+ version, name, scope = parse_migration_filename(file)
47
+ raise ActiveRecord::IllegalMigrationNameError.new(file) unless version
48
+ version = ActiveRecord::SchemaMigration.normalize_migration_number(version)
49
+ status = db_list.delete(version) ? "up" : "down"
50
+ [status, version, (name + scope).humanize]
51
+ end.compact
52
+
53
+ db_list.map! do |version|
54
+ ["up", version, "********** NO FILE **********"]
55
+ end
56
+
57
+ (db_list + file_list).sort_by { |_, version, _| version }
58
+ end
59
+
60
+ private
61
+
62
+ def get_all_versions
63
+ if DataMigrate::DataSchemaMigration.table_exists?
64
+ DataSchemaMigration.normalized_versions.map(&:to_i)
65
+ else
66
+ []
67
+ end
68
+ end
69
+
70
+ def move(direction, steps)
71
+ migrator = DataMigrator.new(direction, migrations)
72
+
73
+ if current_version != 0 && !migrator.current_migration
74
+ raise ActiveRecord::UnknownMigrationVersionError.new(current_version)
75
+ end
76
+
77
+ start_index =
78
+ if current_version.zero?
79
+ 0
80
+ else
81
+ migrator.migrations.index(migrator.current_migration)
82
+ end
83
+
84
+ finish = migrator.migrations[start_index + steps]
85
+ version = finish ? finish.version : 0
86
+ send(direction, version)
87
+ end
88
+
89
+ end
90
+ end
@@ -0,0 +1,26 @@
1
+ module DataMigrate
2
+ class MigrationFive < ::ActiveRecord::Migration[5.0]
3
+
4
+ class << self
5
+ def check_pending!(connection = ::ActiveRecord::Base.connection)
6
+ raise ActiveRecord::PendingMigrationError if DataMigrator::Migrator.needs_migration?(connection)
7
+ end
8
+
9
+ def migrate(direction)
10
+ new.migrate direction
11
+ end
12
+
13
+ def table_name
14
+ ActiveRecord::Base.table_name_prefix + 'data_migrations' + ActiveRecord::Base.table_name_suffix
15
+ end
16
+
17
+ def index_name
18
+ "#{table_name_prefix}unique_data_migrations#{table_name_suffix}"
19
+ end
20
+ end
21
+
22
+ def initialize(name = self.class.name, version = nil)
23
+ super(name, version)
24
+ end
25
+ end
26
+ end
@@ -1,5 +1,5 @@
1
1
  module DataMigrate
2
- class Railtie < Rails::Railtie
2
+ class Railtie < ::Rails::Railtie
3
3
  generators = config.respond_to?(:app_generators) ? config.app_generators : config.generators
4
4
 
5
5
  rake_tasks do
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DataMigrate
4
+ ##
5
+ # Provides the capability to write the current data schema version to
6
+ # the data_schema file Based on ActiveRecord::SchemaDumper
7
+ class SchemaDumper
8
+ private_class_method :new
9
+
10
+ class << self
11
+ def dump(connection = ActiveRecord::Base.connection, stream = STDOUT)
12
+ new(connection).dump(stream)
13
+ stream
14
+ end
15
+ end
16
+
17
+ def dump(stream)
18
+ define_params = @version ? "version: #{@version}" : ""
19
+
20
+ if stream.respond_to?(:external_encoding) && stream.external_encoding
21
+ stream.puts "# encoding: #{stream.external_encoding.name}"
22
+ end
23
+
24
+ stream.puts "DataMigrate::Data.define(#{define_params})"
25
+
26
+ stream
27
+ end
28
+
29
+ private
30
+
31
+ def initialize(connection)
32
+ @connection = connection
33
+ all_versions = DataSchemaMigration.normalized_versions
34
+
35
+ @version = begin
36
+ all_versions.max
37
+ rescue StandardError
38
+ 0
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,31 @@
1
+ module DataMigrate
2
+ # Helper class to getting access to db schema
3
+ # to allow data/schema combiation tasks
4
+ class SchemaMigration
5
+ def self.pending_schema_migrations
6
+ all_migrations = DataMigrate::DataMigrator.migrations(migrations_paths)
7
+ sort_migrations(
8
+ ActiveRecord::Migrator.new(:up, all_migrations).
9
+ pending_migrations.
10
+ map {|m| { version: m.version, kind: :schema }}
11
+ )
12
+ end
13
+
14
+ def self.run(direction, migration_paths, version)
15
+ ActiveRecord::Migrator.run(direction, migration_paths, version)
16
+ end
17
+
18
+ def self.sort_migrations(set1, set2 = nil)
19
+ migrations = set1 + (set2 || [])
20
+ migrations.sort {|a, b| sort_string(a) <=> sort_string(b)}
21
+ end
22
+
23
+ def self.migrations_paths
24
+ Rails.application.config.paths["db/migrate"].to_a
25
+ end
26
+
27
+ def self.sort_string(migration)
28
+ "#{migration[:version]}_#{migration[:kind] == :data ? 1 : 0}"
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ module DataMigrate
2
+ # Helper class to getting access to db schema
3
+ # to allow data/schema combiation tasks
4
+ class SchemaMigration
5
+ def self.pending_schema_migrations
6
+ all_migrations = ActiveRecord::MigrationContext.new(migrations_paths).migrations
7
+ sort_migrations(
8
+ ActiveRecord::Migrator.new(:up, all_migrations).
9
+ pending_migrations.
10
+ map {|m| { version: m.version, kind: :schema }}
11
+ )
12
+ end
13
+
14
+ def self.run(direction, migration_paths, version)
15
+ ActiveRecord::MigrationContext.new(migration_paths).run(direction, version)
16
+ end
17
+
18
+ def self.sort_migrations(set1, set2 = nil)
19
+ migrations = set1 + (set2 || [])
20
+ migrations.sort {|a, b| sort_string(a) <=> sort_string(b)}
21
+ end
22
+
23
+ def self.migrations_paths
24
+ Rails.application.config.paths["db/migrate"].to_a
25
+ end
26
+
27
+ def self.sort_string(migration)
28
+ "#{migration[:version]}_#{migration[:kind] == :data ? 1 : 0}"
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,65 @@
1
+ module DataMigrate
2
+ class StatusService
3
+ class << self
4
+ def dump(connection = ActiveRecord::Base.connection, stream = STDOUT)
5
+ new(connection).dump(stream)
6
+ stream
7
+ end
8
+ end
9
+
10
+ def initialize(connection)
11
+ @connection = connection
12
+ end
13
+
14
+ def root_folder
15
+ Rails.root
16
+ end
17
+
18
+ def dump(stream)
19
+ unless @connection.table_exists?(table_name)
20
+ stream.puts "Data migrations table does not exist yet."
21
+ return
22
+ end
23
+ sql = "SELECT version FROM #{DataMigrate::DataMigrator.schema_migrations_table_name}"
24
+ db_list = ActiveRecord::Base.connection.select_values(sql)
25
+ output(stream, db_list)
26
+ end
27
+
28
+ private
29
+
30
+ def table_name
31
+ DataMigrate::DataMigrator.schema_migrations_table_name
32
+ end
33
+
34
+ def output(stream, db_list)
35
+ stream.puts "#{"Status".center(8)} #{"Migration ID".ljust(14)} Migration Name"
36
+ stream.puts "-" * 50
37
+ list = migration_files(db_list) + migration_list(db_list)
38
+ list.sort! {|line1, line2| line1[1] <=> line2[1]}
39
+ list.each do |file|
40
+ stream.puts "#{file[0].center(8)} #{file[1].ljust(14)} #{file[2]}"
41
+ end
42
+ stream.puts
43
+ end
44
+
45
+ def migration_list(db_list)
46
+ list = []
47
+ db_list.each do |version|
48
+ list << ["up", version, "********** NO FILE *************"]
49
+ end
50
+ list
51
+ end
52
+
53
+ def migration_files(db_list)
54
+ file_list = []
55
+ Dir.foreach(File.join(root_folder, "db", "data")) do |file|
56
+ # only files matching "20091231235959_some_name.rb" pattern
57
+ if match_data = DataMigrate::DataMigrator.match(file)
58
+ status = db_list.delete(match_data[1]) ? "up" : "down"
59
+ file_list << [status, match_data[1], match_data[2].humanize]
60
+ end
61
+ end
62
+ file_list
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,48 @@
1
+ module DataMigrate
2
+ class StatusService
3
+ class << self
4
+ def dump(connection = ActiveRecord::Base.connection, stream = STDOUT)
5
+ new(connection).dump(stream)
6
+ stream
7
+ end
8
+ end
9
+
10
+ def initialize(connection)
11
+ @connection = connection
12
+ end
13
+
14
+ def root_folder
15
+ Rails.root
16
+ end
17
+
18
+ def dump(stream)
19
+ output(stream)
20
+ end
21
+
22
+ private
23
+
24
+ def table_name
25
+ DataMigrate::DataSchemaMigration.table_name
26
+ end
27
+
28
+ def output(stream)
29
+ unless DataMigrate::DataSchemaMigration.table_exists?
30
+ stream.puts "Data migrations table does not exist yet."
31
+ return
32
+ end
33
+
34
+ # output
35
+ stream.puts "\ndatabase: #{ActiveRecord::Base.connection_config[:database]}\n\n"
36
+ stream.puts "#{'Status'.center(8)} #{'Migration ID'.ljust(14)} Migration Name"
37
+ stream.puts "-" * 50
38
+ db_list.each do |status, version, name|
39
+ stream.puts "#{status.center(8)} #{version.ljust(14)} #{name}"
40
+ end
41
+ stream.puts
42
+ end
43
+
44
+ def db_list
45
+ DataMigrate::DataMigrator.migrations_status
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,25 @@
1
+ module DataMigrate
2
+ module Tasks
3
+ module DataMigrateTasks
4
+ extend self
5
+ def migrations_paths
6
+ @migrations_paths ||= begin
7
+ if Rails.application && Rails.application.paths["data/migrate"]
8
+ Rails.application.paths["data/migrate"].to_a
9
+ end
10
+ end
11
+ end
12
+
13
+ def migrate
14
+ DataMigrate::DataMigrator.assure_data_schema_table
15
+ target_version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
16
+ if Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR == 2
17
+ DataMigrate::MigrationContext.new(migrations_paths).migrate(target_version)
18
+ else
19
+ paths = migrations_paths || "db/data/"
20
+ DataMigrate::DataMigrator.migrate(paths, ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,3 +1,3 @@
1
1
  module DataMigrate
2
- VERSION = '3.0.1'.freeze
2
+ VERSION = "4.0.0".freeze
3
3
  end
data/lib/data_migrate.rb CHANGED
@@ -1,4 +1,30 @@
1
- require File.join(File.dirname(__FILE__), 'data_migrate', 'data_migrator')
2
- require File.join(File.dirname(__FILE__), 'data_migrate', 'data_schema_migration')
3
- require File.join(File.dirname(__FILE__), 'data_migrate', 'migration')
4
- require File.join(File.dirname(__FILE__), 'data_migrate', 'railtie')
1
+ # frozen_string_literal: true
2
+
3
+ if Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR == 2
4
+ require File.join(File.dirname(__FILE__), "data_migrate", "data_migrator_five")
5
+ else
6
+ require File.join(File.dirname(__FILE__), "data_migrate", "data_migrator")
7
+ end
8
+ require File.join(File.dirname(__FILE__), "data_migrate",
9
+ "data_schema_migration")
10
+ require File.join(File.dirname(__FILE__), "data_migrate", "data_schema")
11
+ require File.join(File.dirname(__FILE__), "data_migrate", "database_tasks")
12
+ require File.join(File.dirname(__FILE__), "data_migrate", "schema_dumper")
13
+ if Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR == 2
14
+ require File.join(File.dirname(__FILE__), "data_migrate", "status_service_five")
15
+ require File.join(File.dirname(__FILE__), "data_migrate", "schema_migration_five")
16
+ else
17
+ require File.join(File.dirname(__FILE__), "data_migrate", "status_service")
18
+ require File.join(File.dirname(__FILE__), "data_migrate", "schema_migration")
19
+ end
20
+ if Rails::VERSION::MAJOR == 5
21
+ if Rails::VERSION::MINOR == 2
22
+ require File.join(File.dirname(__FILE__), "data_migrate", "migration_context")
23
+ else
24
+ require File.join(File.dirname(__FILE__), "data_migrate", "migration_five")
25
+ end
26
+ else
27
+ require File.join(File.dirname(__FILE__), "data_migrate", "migration")
28
+ end
29
+ require File.join(File.dirname(__FILE__), "data_migrate", "railtie")
30
+ require File.join(File.dirname(__FILE__), "data_migrate", "tasks/data_migrate_tasks")
@@ -1,38 +1,39 @@
1
- require 'generators/data_migrate'
2
- require 'rails/generators'
3
- require 'rails/generators/migration'
1
+ require "generators/data_migrate"
2
+ require "rails/generators"
3
+ require "rails/generators/active_record/migration"
4
+ require "rails/generators/migration"
4
5
 
5
6
  module DataMigrate
6
7
  module Generators
7
8
  class DataMigrationGenerator < Rails::Generators::NamedBase
8
9
  namespace "data_migration"
9
- include Rails::Generators::Migration
10
+ include ActiveRecord::Generators::Migration
10
11
 
11
- argument :attributes, type: :array, default: [], banner: 'field:type field:type'
12
+ argument :attributes, type: :array, default: [], banner: "field:type field:type"
12
13
 
13
14
  def create_data_migration
14
15
  set_local_assigns!
15
- migration_template 'data_migration.rb', "db/data/#{file_name}.rb"
16
+ migration_template "data_migration.rb", "db/data/#{file_name}.rb"
16
17
  end
17
18
 
18
19
  protected
19
20
 
20
- attr_reader :migration_action
21
-
22
- def self.next_migration_number(dirname)
23
- if ActiveRecord::Base.timestamped_migrations
24
- Time.new.utc.strftime("%Y%m%d%H%M%S")
25
- else
26
- "%.3d" % (current_migration_number(dirname) + 1)
27
- end
28
- end
29
-
30
21
  def set_local_assigns!
31
22
  if file_name =~ /^(add|remove)_.*_(?:to|from)_(.*)/
32
23
  @migration_action = $1
33
24
  @table_name = $2.pluralize
34
25
  end
35
26
  end
27
+
28
+ def migration_base_class_name
29
+ if ActiveRecord.version >= Gem::Version.new("5.0")
30
+ "ActiveRecord::Migration[#{ActiveRecord::Migration.current_version}]"
31
+ elsif ActiveRecord.version >= Gem::Version.new("5.2")
32
+ "DataMigrate::MigrationContext"
33
+ else
34
+ "ActiveRecord::Migration"
35
+ end
36
+ end
36
37
  end
37
38
  end
38
39
  end
@@ -1,8 +1,8 @@
1
- class <%= migration_class_name %> < ActiveRecord::Migration
2
- def self.up
1
+ class <%= migration_class_name %> < <%= migration_base_class_name %>
2
+ def up
3
3
  end
4
4
 
5
- def self.down
5
+ def down
6
6
  raise ActiveRecord::IrreversibleMigration
7
7
  end
8
- end
8
+ end
data/screenshot.png ADDED
Binary file
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ describe DataMigrate::DataMigrator do
4
+ let(:subject) { DataMigrate::DataMigrator }
5
+ let(:db_config) do
6
+ {
7
+ adapter: "sqlite3",
8
+ database: "spec/db/test.db"
9
+ }
10
+ end
11
+
12
+ describe :assure_data_schema_table do
13
+ before do
14
+ allow(subject).to receive(:db_config) { db_config }.at_least(:once)
15
+ ActiveRecord::Base.establish_connection(db_config)
16
+ end
17
+
18
+ after do
19
+ ActiveRecord::Migration.drop_table("data_migrations")
20
+ end
21
+
22
+ it do
23
+ expect(
24
+ ActiveRecord::Base.connection.table_exists?("data_migrations")
25
+ ).to eq false
26
+ subject.assure_data_schema_table
27
+ expect(
28
+ ActiveRecord::Base.connection.table_exists?("data_migrations")
29
+ ).to eq true
30
+ end
31
+ end
32
+
33
+ describe :match do
34
+ context "when the file does not match" do
35
+ it "returns nil" do
36
+ expect(subject.match("not_a_data_migration_file")).to be_nil
37
+ end
38
+ end
39
+
40
+ context "when the file matches" do
41
+ it "returns a valid MatchData object" do
42
+ match_data = subject.match("20091231235959_some_name.rb")
43
+
44
+ expect(match_data[0]).to eq "20091231235959_some_name.rb"
45
+ expect(match_data[1]).to eq "20091231235959"
46
+ expect(match_data[2]).to eq "some_name"
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe DataMigrate::DataSchemaMigration do
4
+ let(:subject) { DataMigrate::DataSchemaMigration }
5
+ describe :table_name do
6
+ it "returns correct table name" do
7
+ expect(subject.table_name).to eq("data_migrations")
8
+ end
9
+ end
10
+
11
+ describe :index_name do
12
+ it "returns correct index name" do
13
+ expect(subject.index_name).to eq("unique_data_migrations")
14
+ end
15
+ end
16
+ end