Sha256: 5899f565cd0549b7b0d2a6bdd6b733da0e1fe8713dc9c4774d275e8ef39597fa

Contents?: true

Size: 1.63 KB

Versions: 17

Compression:

Stored size: 1.63 KB

Contents

module Overcommit::Hook::PreCommit
  # Check to see whether the schema file is in line with the migrations
  class RailsSchemaUpToDate < Base
    def run # rubocop:disable CyclomaticComplexity, PerceivedComplexity
      if migration_files.any? && schema_files.none?
        return :fail, "It looks like you're adding a migration, but did not update the schema file"
      elsif migration_files.none? && schema_files.any?
        return :fail, "You're trying to change the schema without adding a migration file"
      elsif migration_files.any? && schema_files.any?
        # Get the latest version from the migration filename. Use
        # `File.basename` to prevent finding numbers that could appear in
        # directories, such as the home directory of a user with a number in
        # their username.
        latest_version = migration_files.map do |file|
          File.basename(file)[/\d+/]
        end.sort.last

        schema     = schema_files.map { |file| File.read(file) }.join
        up_to_date = schema.include?(latest_version)

        unless up_to_date
          return :fail, "The latest migration version you're committing is " \
                       "#{latest_version}, but your schema file " \
                       "#{schema_files.join(' or ')} is on a different version."
        end
      end

      :pass
    end

    private

    def migration_files
      @migration_files ||= applicable_files.select do |file|
        file.match %r{db/migrate/.*\.rb}
      end
    end

    def schema_files
      @schema_files ||= applicable_files.select do |file|
        file.match %r{db/schema\.rb|db/structure.*\.sql}
      end
    end
  end
end

Version data entries

17 entries across 17 versions & 1 rubygems

Version Path
overcommit-0.36.0 lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb
overcommit-0.35.0 lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb
overcommit-0.34.2 lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb
overcommit-0.34.1 lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb
overcommit-0.34.0 lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb
overcommit-0.33.0 lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb
overcommit-0.32.0 lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb
overcommit-0.32.0.rc1 lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb
overcommit-0.31.0 lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb
overcommit-0.30.0 lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb
overcommit-0.29.1 lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb
overcommit-0.29.0 lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb
overcommit-0.28.0 lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb
overcommit-0.27.0 lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb
overcommit-0.26.0 lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb
overcommit-0.25.0 lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb
overcommit-0.24.0 lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb