From: Arthur Axel 'fREW' Schmidt Date: Sat, 27 Mar 2010 09:29:31 +0000 (-0500) Subject: initial monotonic commit X-Git-Tag: v0.001000_01~41 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=dab1797def4543a19c02366b29215aeb1d27d3b4;p=dbsrgits%2FDBIx-Class-DeploymentHandler.git initial monotonic commit more todo --- diff --git a/TODO b/TODO index d1caeec..bdf791c 100644 --- a/TODO +++ b/TODO @@ -2,3 +2,4 @@ make recommended bundle (monotonic) run arbitrary perl from migration scripts make deploy_version_storage pod +consider renaming to_version so that upgrades are less confusing to talk about diff --git a/lib/DBIx/Class/DeploymentHandler/VersionHandler/Monotonic.pm b/lib/DBIx/Class/DeploymentHandler/VersionHandler/Monotonic.pm new file mode 100644 index 0000000..6e7c7c1 --- /dev/null +++ b/lib/DBIx/Class/DeploymentHandler/VersionHandler/Monotonic.pm @@ -0,0 +1,68 @@ +package DBIx::Class::DeploymentHandler::VersionHandler::Monotonic; +use Moose; +use Carp 'croak'; + +with 'DBIx::Class::DeploymentHandler::HandlesVersioning'; + +has schema_version => ( + isa => 'Int', + is => 'ro', + required => 1, +); + +has database_version => ( + isa => 'Int', + is => 'ro', + required => 1, +); + +has to_version => ( + isa => 'Int', + is => 'ro', + lazy_build => 1, +); + +sub _build_to_version { $_[0]->schema_version } + +has _version => ( + is => 'rw', + isa => 'Int', + lazy_build => 1, +); + +sub BUILD { + croak "you are trying to upgrade and your current version is greater\n". + "than the version you are trying to upgrade to. Either downgrade\n". + "or update your schema" if $_[0]->to_version < $_[0]->_version; +} + +sub _inc_version { $_[0]->_version($_[0]->_version + 1 ) } +sub _dec_version { $_[0]->_version($_[0]->_version - 1 ) } + +sub _build__version { $_[0]->database_version } + +sub previous_version_set { + my $self = shift; + return undef + if $self->to_version == $self->_version; + + $self->_dec_version; + return [$self->_version, $self->_version + 1]; +} + +sub next_version_set { + my $self = shift; + return undef + if $self->to_version == $self->_version; + + $self->_inc_version; + return [$self->_version - 1, $self->_version]; +} + +__PACKAGE__->meta->make_immutable; + +1; + +__END__ + +vim: ts=2 sw=2 expandtab diff --git a/t/version_handlers/monotonic.t b/t/version_handlers/monotonic.t new file mode 100644 index 0000000..a2e2e76 --- /dev/null +++ b/t/version_handlers/monotonic.t @@ -0,0 +1,96 @@ +#!perl + +use Test::More; +use Test::Exception; + +use lib 't/lib'; +use aliased + 'DBIx::Class::DeploymentHandler::VersionHandler::Monotonic'; + +{ + my $vh = Monotonic->new({ + schema_version => 2, + database_version => 1, + }); + + ok $vh, 'VersionHandler gets instantiated'; + + ok( + eq_array($vh->next_version_set, [1,2]), + 'first version pair works' + ); + ok( + !$vh->next_version_set, + 'next version set returns undef when we are done' + ); +} + +{ + my $vh = Monotonic->new({ + to_version => 1, + schema_version => 1, + database_version => 1, + }); + + ok $vh, 'VersionHandler gets instantiated'; + + ok( + !$vh->next_version_set, + 'next version set returns undef if we are at the version requested' + ); +} + +{ + my $vh = Monotonic->new({ + to_version => 5, + schema_version => 1, + database_version => 1, + }); + + ok $vh, 'VersionHandler gets instantiated'; + ok( + eq_array($vh->next_version_set, [1,2]), + 'first version pair works' + ); + ok( + eq_array($vh->previous_version_set, [1,2]), + 'doing previous version works' + ); + ok( + eq_array($vh->next_version_set, [1,2]), + 'first version pair works again' + ); + ok( + eq_array($vh->next_version_set, [2,3]), + 'second version pair works' + ); + ok( + eq_array($vh->next_version_set, [3,4]), + 'third version pair works' + ); + ok( + eq_array($vh->next_version_set, [4,5]), + 'fourth version pair works' + ); + ok( !$vh->next_version_set, 'no more versions after final pair' ); + ok( !$vh->next_version_set, 'still no more versions after final pair' ); +} + +dies_ok { + my $vh = Monotonic->new({ + schema_version => 2, + database_version => '1.1', + }); + $vh->next_vesion_set +} 'dies if database version not an Int'; + +dies_ok { + my $vh = Monotonic->new({ + to_version => 0, + schema_version => 1, + database_version => 1, + }); +} 'cannot request a version before the current version'; + +done_testing; +#vim: ts=2 sw=2 expandtab