class Neo4j::Migrations::Runner
Constants
- DOWN_MESSAGE
- FILE_MISSING
- INCOMPLETE_MESSAGE
- MIGRATION_DONE
- MIGRATION_RUNNING
- SEPARATOR
- STATUS_TABLE_FORMAT
- STATUS_TABLE_HEADER
- UP_MESSAGE
Public Class Methods
new(options = {})
click to toggle source
# File lib/neo4j/migrations/runner.rb 14 def initialize(options = {}) 15 @silenced = options[:silenced] || !!ENV['MIGRATIONS_SILENCED'] 16 label = SchemaMigration.mapped_label 17 label.create_constraint(:migration_id, type: :unique) unless label.constraint?(:migration_id) 18 @schema_migrations = SchemaMigration.all.to_a 19 @up_versions = SortedSet.new(@schema_migrations.map(&:migration_id)) 20 end
Private Class Methods
app_root()
click to toggle source
# File lib/neo4j/migrations/runner.rb 189 def app_root 190 defined?(Rails) ? Rails.root : Pathname.new('.') 191 end
files()
click to toggle source
# File lib/neo4j/migrations/runner.rb 179 def files 180 Dir[files_path].sort 181 end
files_path()
click to toggle source
# File lib/neo4j/migrations/runner.rb 185 def files_path 186 app_root.join('db', 'neo4j', 'migrate', '*.rb') 187 end
latest_migration()
click to toggle source
# File lib/neo4j/migrations/runner.rb 175 def latest_migration 176 migration_files.last 177 end
migration_files()
click to toggle source
# File lib/neo4j/migrations/runner.rb 171 def migration_files 172 files.map! { |file_path| MigrationFile.new(file_path) } 173 end
migration_files_versions()
click to toggle source
# File lib/neo4j/migrations/runner.rb 167 def migration_files_versions 168 migration_files.map!(&:version) 169 end
Public Instance Methods
all()
click to toggle source
# File lib/neo4j/migrations/runner.rb 22 def all 23 handle_incomplete_states! 24 migration_files.each do |migration_file| 25 next if up?(migration_file.version) 26 migrate(:up, migration_file) 27 end 28 end
complete_migration_versions()
click to toggle source
# File lib/neo4j/migrations/runner.rb 55 def complete_migration_versions 56 @schema_migrations.map(&:migration_id) 57 end
down(version)
click to toggle source
# File lib/neo4j/migrations/runner.rb 37 def down(version) 38 handle_incomplete_states! 39 migration_file = find_by_version!(version) 40 return unless up?(version) 41 migrate(:down, migration_file) 42 end
mark_versions_as_complete(versions)
click to toggle source
# File lib/neo4j/migrations/runner.rb 59 def mark_versions_as_complete(versions) 60 Neo4j::ActiveBase.new_query 61 .with('{versions} AS versions').params(versions: versions).break 62 .unwind(version: :versions).break 63 .merge('(:`Neo4j::Migrations::SchemaMigration` {migration_id: version})') 64 .exec 65 end
pending_migrations()
click to toggle source
# File lib/neo4j/migrations/runner.rb 51 def pending_migrations 52 all_migrations.select { |migration| !up?(migration) } 53 end
reset(version)
click to toggle source
# File lib/neo4j/migrations/runner.rb 83 def reset(version) 84 SchemaMigration.find_by!(migration_id: version).destroy 85 output "Migration #{version} reset." 86 end
resolve(version)
click to toggle source
# File lib/neo4j/migrations/runner.rb 78 def resolve(version) 79 SchemaMigration.find_by!(migration_id: version).update!(incomplete: false) 80 output "Migration #{version} resolved." 81 end
rollback(steps)
click to toggle source
# File lib/neo4j/migrations/runner.rb 44 def rollback(steps) 45 handle_incomplete_states! 46 @up_versions.to_a.reverse.first(steps).each do |version| 47 down(version) 48 end 49 end
status()
click to toggle source
# File lib/neo4j/migrations/runner.rb 67 def status 68 output STATUS_TABLE_FORMAT, *STATUS_TABLE_HEADER 69 output SEPARATOR 70 all_migrations.each do |version| 71 status = migration_status(version) 72 migration_file = find_by_version(version) 73 migration_name = migration_file ? migration_file.class_name : FILE_MISSING 74 output STATUS_TABLE_FORMAT, status, version, migration_name 75 end 76 end
up(version)
click to toggle source
# File lib/neo4j/migrations/runner.rb 30 def up(version) 31 handle_incomplete_states! 32 migration_file = find_by_version!(version) 33 return if up?(version) 34 migrate(:up, migration_file) 35 end
Private Instance Methods
all_migrations()
click to toggle source
# File lib/neo4j/migrations/runner.rb 156 def all_migrations 157 @up_versions + migration_files_versions 158 end
find_by_version(version)
click to toggle source
# File lib/neo4j/migrations/runner.rb 152 def find_by_version(version) 153 migration_files.find { |file| file.version == version } 154 end
find_by_version!(version)
click to toggle source
# File lib/neo4j/migrations/runner.rb 148 def find_by_version!(version) 149 find_by_version(version) || fail(UnknownMigrationVersionError, "No such migration #{version}") 150 end
handle_incomplete_states!()
click to toggle source
# File lib/neo4j/migrations/runner.rb 95 def handle_incomplete_states! 96 return unless incomplete_states.any? 97 incomplete_versions = incomplete_states.map(&:migration_id) 98 fail MigrationError, <<-MSG 99 There are migrations struck in an incomplete states, that could not be fixed automatically: 100 #{incomplete_versions.join('\n')} 101 This can happen when there's a critical error inside a migration. 102 103 If you think they were was completed correctly, run: 104 105 #{task_migration_messages('resolve', incomplete_versions)} 106 107 If you want to reset and run the migration again, run: 108 109 #{task_migration_messages('reset', incomplete_versions)} 110 111 MSG 112 end
incomplete_states()
click to toggle source
# File lib/neo4j/migrations/runner.rb 160 def incomplete_states 161 @incomplete_states ||= SortedSet.new(@schema_migrations.select(&:incomplete?)) 162 end
migrate(direction, migration_file)
click to toggle source
# File lib/neo4j/migrations/runner.rb 124 def migrate(direction, migration_file) 125 migration_message(direction, migration_file) do 126 migration = migration_file.create(silenced: @silenced) 127 migration.migrate(direction) 128 end 129 end
migration_message(direction, migration) { || ... }
click to toggle source
# File lib/neo4j/migrations/runner.rb 131 def migration_message(direction, migration) 132 output_migration_message "#{migration.version} #{migration.class_name}: #{MIGRATION_RUNNING[direction]}..." 133 time = format('%.4fs', yield) 134 output_migration_message "#{migration.version} #{migration.class_name}: #{MIGRATION_DONE[direction]} (#{time})" 135 output '' 136 end
migration_status(version)
click to toggle source
# File lib/neo4j/migrations/runner.rb 90 def migration_status(version) 91 return DOWN_MESSAGE unless up?(version) 92 incomplete_states.find { |v| v.migration_id == version } ? INCOMPLETE_MESSAGE : UP_MESSAGE 93 end
output(*string_format)
click to toggle source
# File lib/neo4j/migrations/runner.rb 138 def output(*string_format) 139 puts format(*string_format) unless @silenced 140 end
output_migration_message(message)
click to toggle source
# File lib/neo4j/migrations/runner.rb 142 def output_migration_message(message) 143 out = "== #{message} " 144 tail = '=' * [0, 80 - out.length].max 145 output "#{out}#{tail}" 146 end
task_migration_messages(type, versions)
click to toggle source
# File lib/neo4j/migrations/runner.rb 114 def task_migration_messages(type, versions) 115 versions.map do |version| 116 "rake neo4j:migrate:#{type} VERSION=#{version}" 117 end.join("\n") 118 end
up?(version)
click to toggle source
# File lib/neo4j/migrations/runner.rb 120 def up?(version) 121 @up_versions.include?(version) 122 end