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