Skip to content

Commit

Permalink
Move user version calculation to Repository
Browse files Browse the repository at this point in the history
  • Loading branch information
aldesantis committed Dec 29, 2017
1 parent 6ad7761 commit 77885ad
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 28 deletions.
43 changes: 36 additions & 7 deletions lib/pragma/migration/repository.rb
Expand Up @@ -8,29 +8,58 @@ def sorted_versions
versions.dup
end

def migrations_since(user_version)
@versions.select { |version| version > user_version }.flat_map(&:migrations)
def user_version_proc
@user_version_proc ||= begin
lambda do |request|
request.get_header('X-Api-Version')
end
end
end

def migration_active?(user_version, migration)
@versions.any? do |version|
version > user_version && version.migration?(migration)
def migrations_since(request_or_version)
user_version = if request_or_version.is_a?(Rack::Request)
user_version_from(request_or_version)
else
request_or_version
end

@versions.select { |version| version > user_version }.flat_map(&:migrations)
end

def migrations_applying_to(request, user_version:)
migrations_since(user_version).select do |migration|
def migrations_for(request)
migrations_since(request).select do |migration|
migration.applies_to?(request)
end
end

def migration_active?(migration, request: nil, user_version: nil)
unless request || user_version
fail ArgumentError, 'You must pass one of :request or :user_version'
end

user_version ||= user_version_from(request)

@versions.any? do |version|
version > user_version && version.migration?(migration)
end
end

protected

def user_version_from(request)
user_version = user_version_proc.call(request)
sorted_versions.include?(user_version) ? user_version : sorted_versions.last
end

def version(number, migrations = [])
versions << Version.new(number, migrations)
sort_versions
end

def user_version(&block)
@user_version_proc = block
end

private

def versions
Expand Down
15 changes: 4 additions & 11 deletions lib/pragma/migration/runner.rb
Expand Up @@ -3,34 +3,27 @@
module Pragma
module Migration
class Runner
attr_reader :repository, :user_version
attr_reader :repository

def initialize(repository:, user_version:)
def initialize(repository)
@repository = repository
@user_version = user_version
end

def run_upwards(request)
migrations_for(request).each do |migration|
repository.migrations_for(request).each do |migration|
request = migration.new.up(request)
end

request
end

def run_downwards(request, response)
migrations_for(request).reverse.each do |migration|
repository.migrations_for(request).reverse.each do |migration|
response = migration.new.down(response)
end

response
end

private

def migrations_for(request)
repository.migrations_applying_to(request, user_version: user_version)
end
end
end
end
14 changes: 7 additions & 7 deletions spec/pragma/migration/repository_spec.rb
Expand Up @@ -56,15 +56,15 @@
end

it 'returns false when the migration is not active' do
expect(repository.migration_active?('2017-12-25', migration1)).to eq(false)
expect(repository.migration_active?(migration1, user_version: '2017-12-25')).to eq(false)
end

it 'returns true when the migration is active' do
expect(repository.migration_active?('2017-12-25', migration2)).to eq(true)
expect(repository.migration_active?(migration2, user_version: '2017-12-25')).to eq(true)
end
end

describe '.migrations_applying_to' do
describe '.migrations_for' do
let(:migration1) do
Class.new(Pragma::Migration::Base) do
apply_to '/api/v1/articles/*'
Expand All @@ -91,10 +91,10 @@
end

it 'returns the migrations applying to the current request' do
expect(repository.migrations_applying_to(
Rack::Request.new('PATH_INFO' => '/api/v1/articles/1'),
user_version: '2017-12-25'
)).to eq([migration2])
expect(repository.migrations_for(Rack::Request.new(
'PATH_INFO' => '/api/v1/articles/1',
'X-Api-Version' => '2017-12-25'
))).to eq([migration2])
end
end
end
8 changes: 5 additions & 3 deletions spec/pragma/migration/runner_spec.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true

RSpec.describe Pragma::Migration::Runner do
subject { described_class.new(repository: repository, user_version: user_version) }
subject { described_class.new(repository) }

let(:repository) do
Class.new(Pragma::Migration::Repository) do
Expand Down Expand Up @@ -90,7 +90,8 @@ def down(response)
let(:request) do
Rack::Request.new(
'PATH_INFO' => '/api/v1/articles/1',
'rack.input' => ''
'rack.input' => '',
'X-Api-Version' => '2017-12-25'
).tap do |r|
{
'author_id' => 'test_id',
Expand All @@ -115,7 +116,8 @@ def down(response)
let(:request) do
Rack::Request.new(
'PATH_INFO' => '/api/v1/articles/1',
'rack.input' => ''
'rack.input' => '',
'X-Api-Version' => '2017-12-25'
).tap do |r|
{
'author_id' => 'test_id',
Expand Down

0 comments on commit 77885ad

Please sign in to comment.