Skip to content

Commit

Permalink
Basic functionality seems done-ish
Browse files Browse the repository at this point in the history
  • Loading branch information
frodwith committed Nov 10, 2010
1 parent 6d78c22 commit 2b3441c
Show file tree
Hide file tree
Showing 9 changed files with 146 additions and 54 deletions.
15 changes: 0 additions & 15 deletions lib/WebGUI/Install/Command/count.pm

This file was deleted.

35 changes: 35 additions & 0 deletions lib/WebGUI/Install/Definition.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package WebGUI::Install::Definition;

my %packages;

sub pkg_hash {
my $pkg = shift;
$packages{$pkg} ||= {};
}

sub setter {
my $name = shift;
return sub {
my $pkg = shift;
return sub {
my ($version, $code) = @_;
pkg_hash($pkg)->{$version}->{$name} = $code;
};
};
}

use Sub::Exporter -setup => {
exports => [
upgrade => setter('upgrade'),
downgrade => setter('downgrade'),
version_info => sub {
my $pkg = shift;
return sub { pkg_hash($pkg) }
},
],
groups => {
default => [qw(upgrade downgrade version_info)],
}
};

1;
6 changes: 3 additions & 3 deletions lib/WebGUI/Install/Module.pm
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ around BUILDARGS => sub {
my ($super, $class, $session, $pkg) = @_;
return $class->$super(
session => $session,
package => $class->extension_name($pkg),
package => $class->definition_name($pkg),
);
};

Expand Down Expand Up @@ -80,11 +80,11 @@ sub load_package {
eval "require $pkg" or die $@;
}

sub extension_name {
sub definition_name {
my ($class, $name) = @_;
return $name =~ /^\+/
? substr($name, 1)
: "WebGUI::Install::Extension::$name";
: "WebGUI::Install::Definition::$name";
}

sub upgrade {
Expand Down
32 changes: 32 additions & 0 deletions t/define.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
my ($upgrade_1, $downgrade_2, $upgrade_4, $downgrade_4)
= map { sub {} } (1..4);

{
package TestDefinition;
use WebGUI::Install::Definition;

upgrade '0.01' => $upgrade_1;
downgrade '0.02' => $downgrade_2;
upgrade '0.04' => $upgrade_4;
downgrade '0.04' => $downgrade_4;
}

use warnings;
use strict;

use Test::More tests => 1;

is_deeply(
TestDefinition->version_info, {
'0.01' => {
upgrade => $upgrade_1,
},
'0.02' => {
downgrade => $downgrade_2,
},
'0.04' => {
upgrade => $upgrade_4,
downgrade => $downgrade_4,
},
}
);
10 changes: 10 additions & 0 deletions t/defname.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
use warnings;
use strict;

use Test::More tests => 2;
use WebGUI::Install::Module;

sub trans { WebGUI::Install::Module->definition_name(shift) }

is trans('Foo'), 'WebGUI::Install::Definition::Foo';
is trans('+Something::Else'), 'Something::Else';
22 changes: 22 additions & 0 deletions t/lib/WebGUI/Install/Definition/Test.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package WebGUI::Install::Definition::Test;

# We're not using the DSL cause we want to test that separately

my ($first, $second);

sub first { $first }
sub second { $second }

my %info = (
'0.01' => {
upgrade => sub { $first = 1 },
downgrade => sub { undef $first },
},
'0.03' => {
upgrade => sub { $second = 1 },
downgrade => sub { undef $second },
},
);
sub version_info { \%info }

1;
17 changes: 17 additions & 0 deletions t/lib/WebGUI/Install/Module/Test.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package WebGUI::Install::Module::Test;

use Moose;
extends 'WebGUI::Install::Module';

my %versions;

sub read_current_version {
my $self = shift; $versions{$self->package}
}

sub write_current_version {
my $self = shift;
$versions{$self->package} = shift;
}

1;
16 changes: 16 additions & 0 deletions t/target_version.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
use warnings;
use strict;

use Test::More tests => 6;
use WebGUI::Install::Module;

my $session = bless {}, 'WebGUI::Session';
my $module = WebGUI::Install::Module->new($session, 'Test');

# A bit silly perhaps.
is $module->target_version, '0.03';
is $module->target_version('0'), 0;
is $module->target_version('0.01'), '0.01';
is $module->target_version('0.02'), '0.02';
is $module->target_version('0.03'), '0.03';
is $module->target_version('0.04'), '0.04';
47 changes: 11 additions & 36 deletions t/updown.t
Original file line number Diff line number Diff line change
@@ -1,51 +1,26 @@
{
package TestModule;
use Moose;
extends 'WebGUI::Install::Module';

my $version = '0';
sub read_current_version { $version }
sub write_current_version { $version = shift }
}

my ($first, $second);

{
package WebGUI::Install::Extension::Fantastic;

use WebGUI::Install::Extension;

my %info = (
'0.01' => {
upgrade => sub { $first = 1 },
downgrade => sub { undef $first },
},
'0.03' => {
upgrade => sub { $second = 1 },
downgrade => sub { undef $second },
},
);
sub version_info { \%info }
}

package main;
use warnings;
use strict;
use Test::More;
use WebGUI::Install::Module;
use WebGUI::Install::Module::Test;

# Hopefully we keep session from being used at all. We can mock stuff with
# Test::MockObject later if we need to.
my $session = bless {}, 'WebGUI::Session';
my $module = TestModule->new($session, 'Fantastic');
my $module = WebGUI::Install::Module::Test->new($session, 'Test');
$module->write_current_version(0);

my $ext = 'WebGUI::Install::Definition::Test';

sub test_version {
my ($v, $f, $s) = @_;
$module->up_or_downgrade($v);
is $first, $f, "$v: first";
is $second, $s, "$v: second";
is $ext->first, $f, "$v: first";
is $ext->second, $s, "$v: second";
is $module->current_version, $v, "$v: version";
}
ok !defined $first;
ok !defined $second;
ok !defined $ext->first;
ok !defined $ext->second;
test_version '0.02' => 1, undef;
test_version 0 => undef, undef;
test_version '0.03', 1, 1;
Expand Down

0 comments on commit 2b3441c

Please sign in to comment.