Skip to content

Commit

Permalink
Merge branch 'master' of github.com:tsucchi/p5-Test-DataLoader
Browse files Browse the repository at this point in the history
  • Loading branch information
tsucchi committed Mar 4, 2016
2 parents 5c01325 + ab3544f commit 6c35d32
Show file tree
Hide file tree
Showing 7 changed files with 121 additions and 97 deletions.
64 changes: 2 additions & 62 deletions Build.PL
Original file line number Diff line number Diff line change
Expand Up @@ -4,69 +4,9 @@
# =========================================================================

use 5.008_001;

use strict;
use warnings;
use utf8;

use Module::Build;
use File::Basename;
use File::Spec;
use CPAN::Meta;
use CPAN::Meta::Prereqs;

my %args = (
license => 'perl',
dynamic_config => 0,

configure_requires => {
'Module::Build' => 0.38,
},

name => 'Test-DataLoader',
module_name => 'Test::DataLoader',
allow_pureperl => 0,

script_files => [glob('script/*'), glob('bin/*')],
c_source => [qw()],
PL_files => {},

test_files => ((-d '.git' || $ENV{RELEASE_TESTING}) && -d 'xt') ? 't/ xt/' : 't/',
recursive_test_files => 1,


);
if (-d 'share') {
$args{share_dir} = 'share';
}
use Module::Build::Tiny 0.035;

my $builder = Module::Build->subclass(
class => 'MyBuilder',
code => q{
sub ACTION_distmeta {
die "Do not run distmeta. Install Minilla and `minil install` instead.\n";
}
sub ACTION_installdeps {
die "Do not run installdeps. Run `cpanm --installdeps .` instead.\n";
}
}
)->new(%args);
$builder->create_build_script();
Build_PL();

my $mbmeta = CPAN::Meta->load_file('MYMETA.json');
my $meta = CPAN::Meta->load_file('META.json');
my $prereqs_hash = CPAN::Meta::Prereqs->new(
$meta->prereqs
)->with_merged_prereqs(
CPAN::Meta::Prereqs->new($mbmeta->prereqs)
)->as_string_hash;
my $mymeta = CPAN::Meta->new(
{
%{$meta->as_struct},
prereqs => $prereqs_hash
}
);
print "Merging cpanfile prereqs to MYMETA.yml\n";
$mymeta->save('MYMETA.yml', { version => 1.4 });
print "Merging cpanfile prereqs to MYMETA.json\n";
$mymeta->save('MYMETA.json', { version => 2 });
5 changes: 3 additions & 2 deletions META.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"Takuya Tsuchida <tsucchi {at} cpan.org>"
],
"dynamic_config" : 0,
"generated_by" : "Minilla/v0.14.1, CPAN::Meta::Converter version 2.140640",
"generated_by" : "Minilla/v3.0.1, CPAN::Meta::Converter version 2.141170",
"license" : [
"perl_5"
],
Expand All @@ -30,7 +30,8 @@
"requires" : {
"CPAN::Meta" : "0",
"CPAN::Meta::Prereqs" : "0",
"Module::Build" : "0.38",
"Module::Build" : "0",
"Module::Build::Tiny" : "0.035",
"perl" : "5.008_001"
}
},
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[![Build Status](https://travis-ci.org/tsucchi/p5-Test-DataLoader.png?branch=master)](https://travis-ci.org/tsucchi/p5-Test-DataLoader) [![Coverage Status](https://coveralls.io/repos/tsucchi/p5-Test-DataLoader/badge.png?branch=master)](https://coveralls.io/r/tsucchi/p5-Test-DataLoader?branch=master)
[![Build Status](https://travis-ci.org/tsucchi/p5-Test-DataLoader.svg?branch=master)](https://travis-ci.org/tsucchi/p5-Test-DataLoader) [![Coverage Status](https://img.shields.io/coveralls/tsucchi/p5-Test-DataLoader/master.svg?style=flat)](https://coveralls.io/r/tsucchi/p5-Test-DataLoader?branch=master)
# NAME

Test::DataLoader - Load testdata into database
Expand Down
1 change: 1 addition & 0 deletions cpanfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ requires 'Otogiri::Plugin', '0.02';
requires 'Otogiri::Plugin::DeleteCascade';
requires 'parent';
requires 'perl', '5.008';
requires 'List::MoreUtils';

on configure => sub {
requires 'CPAN::Meta';
Expand Down
101 changes: 69 additions & 32 deletions lib/Test/DataLoader.pm
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@ use DBIx::Inspector;
use Otogiri;
use Otogiri::Plugin;
use File::Basename qw();
use File::Spec;
use List::MoreUtils qw(all);

use Class::Accessor::Lite (
ro => ['teardown_style', 'txn_manager', 'db', 'inspector'],
ro => ['teardown_style', 'txn_manager', 'db', 'inspector', 'base_dir', 'autoload_files'],
rw => ['loaded', 'key_names', 'cleared'],
);

Expand All @@ -36,6 +38,8 @@ sub new {
loaded => [],
key_names => {},
teardown_style => $teardown_style,
base_dir => $args{base_dir} || '',
autoload_files => {},
cleared => 1,
};
bless $self, $class;
Expand All @@ -50,17 +54,33 @@ sub load {
my ($self, $table_name, $data_id, $option_href) = @_;

my $txn = $self->txn_manager;

if( $self->teardown_style eq $rollback_teardown && !$txn->in_transaction ) {
$txn->txn_begin();
}

if ( $self->base_dir && !$self->autoload_files->{$table_name} ) {
$self->add_by_file("${table_name}.pl");
$self->autoload_files->{$table_name} = 1;
}

my ($data_href, $pk_names_aref) = $self->find_data($table_name, $data_id, $option_href);
$pk_names_aref = $self->detect_primary_key($table_name) if ( !defined $pk_names_aref );

if ( !defined $pk_names_aref ) {
$pk_names_aref = $self->detect_primary_key($table_name);
}

my $pk_href = $self->pk_href($data_href, $pk_names_aref);
Carp::croak "primary key is not defined" if ( !defined $pk_href || !%{ $pk_href } );

$self->db->delete_cascade($table_name, $pk_href);
if ( !defined $pk_href || !%{ $pk_href } ) {
Carp::croak "primary key is not defined";
}

if ( all { defined $_ } values %{ $pk_href } ) {
$self->db->delete($table_name, $pk_href);
}
$self->db->fast_insert($table_name, $data_href);

for my $pk_name ( @{ $pk_names_aref || [] } ) {
if ( !defined $pk_href->{$pk_name} ) {
my $id = $self->db->last_insert_id();
Expand All @@ -69,7 +89,7 @@ sub load {
}
}
if ( $self->teardown_style eq $delete_teardown ) {
$self->_add_loaded($table_name, $data_id, $option_href);
$self->_add_loaded($table_name, $pk_href);
}
$self->cleared(0);

Expand All @@ -81,11 +101,22 @@ sub load {

sub add_by_file {
my ($self, $file_name) = @_;
Carp::croak("$file_name is not exist") if ( !-e $file_name );
Carp::croak("$file_name is not .pl file") if ( $file_name !~ qr/\.pl$/ );

if ( $self->base_dir ) {
$file_name = File::Spec->catfile($self->base_dir, $file_name);
}

if ( !-e $file_name ) {
Carp::croak("$file_name is not exist");
}
elsif ( $file_name !~ qr/\.pl$/ ) {
Carp::croak("$file_name is not .pl file");
}

my $value = do($file_name);
Carp::croak($@) if ( $@ );
if ( $@ ) {
Carp::croak($@);
}

if( !defined $value->{table_name} ) {
($value->{table_name} = File::Basename::basename($file_name)) =~ s/\.pl$//;
Expand All @@ -98,13 +129,22 @@ sub _add_data {

my $table_name = $value->{table_name};
my $key = $value->{unique_keys};
Carp::croak("can't determin primary key") if ( !defined $key || ref $key ne 'ARRAY' );

$key = [$key] if ( ref $key->[0] ne 'ARRAY' );
if ( !defined $key || ref $key ne 'ARRAY' ) {
Carp::croak("can't determin primary key");
}

if ( ref $key->[0] ne 'ARRAY' ) {
$key = [$key];
}

$self->set_unique_keys($table_name, @{ $key });

my $data = $value->{data};
Carp::croak("data not found") if ( !defined $data );

if ( !defined $data ) {
Carp::croak("data not found");
}

for my $datum_key ( sort keys %{ $data } ) {
$self->add($table_name, $datum_key, $data->{$datum_key});
Expand All @@ -113,11 +153,17 @@ sub _add_data {

sub find_data {
my ($self, $table_name, $data_id, $option_href) = @_;

my ($data_href, $pk_names_aref) = @{ $self->{data}->{$table_name}->{$data_id} };
$pk_names_aref = $self->key_names->{$table_name}->[0] if ( !defined $pk_names_aref );

if ( !defined $pk_names_aref ) {
$pk_names_aref = $self->key_names->{$table_name}->[0];
}

for my $key ( keys %{ $option_href || {} } ) {
$data_href->{$key} = $option_href->{$key};
}

return ($data_href, $pk_names_aref) if ( wantarray() );
return $data_href;
}
Expand All @@ -130,20 +176,9 @@ sub pk_href {
}

sub _add_loaded {
my ($self, $table_name, $data_id, $option_href) = @_;
my ($data_href, $pk_aref) = $self->find_data($table_name, $data_id, $option_href);
my ($self, $table_name, $pk_href) = @_;

if( defined $pk_aref ) {
push @{ $self->loaded }, [$table_name, $data_href, $pk_aref];
}
elsif( defined $self->key_names->{$table_name} ) {
for my $pk_aref ( @{ $self->key_names->{$table_name} } ) {
push @{ $self->loaded }, [$table_name, $data_href, $pk_aref];
}
}
else {
Carp::croak("primary key is not defined in $table_name : $data_id");
}
push @{ $self->loaded }, [$table_name, $pk_href];
}

sub clear {
Expand Down Expand Up @@ -180,13 +215,12 @@ sub _do_delete_teardown {

sub _delete_each {
my ($self, $datum) = @_;
my ($table_name, $data_href, $pk_aref) = @{ $datum };

return if ( !defined $pk_aref || !@{ $pk_aref } );
my ($table_name, $pk_href) = @{ $datum };

my %pk = map{ $_ => $data_href->{$_} } @{ $pk_aref };
Carp::croak "Primary Key is not defined" if ( !%pk );
$self->db->delete_cascade($table_name, \%pk);
if ( !defined $pk_href || !%{ $pk_href } ) {
return
}
$self->db->delete_cascade($table_name, $pk_href);
}

sub set_unique_keys {
Expand All @@ -206,7 +240,10 @@ sub detect_primary_key {

sub DESTROY {
my ($self) = @_;
Carp::carp("clear was not called") if ( !$self->cleared );

if ( !$self->cleared ) {
Carp::carp("clear was not called");
}
$self->clear;
}

Expand Down
17 changes: 17 additions & 0 deletions t/01_load.t
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,23 @@ subtest 'load twice but record is only 1(deleted before insert)', sub {
$data->clear;
};

subtest 'load using auto_increment (deleted is not issued because PK value is different)', sub {
my $data = prepare( teardown => $Test::DataLoader::delete_teardown );
$data->add('employee', 1, {
name => 'aaa',
});
$data->load('employee', 1);
$data->load('employee', 1);
$data->load('employee', 1);

my $db = $data->db;
my @rows = $db->select('employee', { });
is( scalar(@rows), 3);

$data->clear;
};



subtest 'load with return value', sub {
my $data = prepare();
Expand Down
28 changes: 28 additions & 0 deletions t/03_external_file.t
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,34 @@ subtest 'add by external file and load', sub {
$data->clear;
};

subtest 'add_by_file with using base_dir option', sub {
my $data = prepare( base_dir => 't/file');

$data->add_by_file('employee.pl');
$data->load('employee', 1);

my $db = $data->db;
my $row = $db->single('employee', { id => 123 });
is( $row->{name}, 'aaa');

$data->clear;
};

subtest 'autoload', sub {
my $data = prepare( base_dir => 't/file');

#$data->add_by_file('employee.pl'); # this file is loaded automatically
$data->load('employee', 1);

my $db = $data->db;
my $row = $db->single('employee', { id => 123 });
is( $row->{name}, 'aaa');

$data->clear;
};





done_testing;

0 comments on commit 6c35d32

Please sign in to comment.