From: Rafael Kitover Date: Thu, 24 Dec 2009 11:03:15 +0000 (+0000) Subject: implemented "naming" accessor, got rid of Loader/Compat/v0_040.pm X-Git-Tag: 0.04999_13~23^2~2 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=a8d229ff7be314991d1aa88122073f7102641ee9;p=dbsrgits%2FDBIx-Class-Schema-Loader.git implemented "naming" accessor, got rid of Loader/Compat/v0_040.pm --- diff --git a/TODO-BACKCOMPAT b/TODO-BACKCOMPAT index 5b50091..3321a1f 100644 --- a/TODO-BACKCOMPAT +++ b/TODO-BACKCOMPAT @@ -13,9 +13,6 @@ SL Backcompat Plan: *** backcompat tests -These are still failing: -* t/backcompat/0.04006/23dumpmore.t - Need a comprehensive backcompat.t *** Write ::Manual::UpgradingFrom0.04006 POD diff --git a/lib/DBIx/Class/Schema/Loader.pm b/lib/DBIx/Class/Schema/Loader.pm index 30b4b23..d34ed6c 100644 --- a/lib/DBIx/Class/Schema/Loader.pm +++ b/lib/DBIx/Class/Schema/Loader.pm @@ -13,7 +13,9 @@ use Scalar::Util qw/ weaken /; our $VERSION = '0.04999_12'; __PACKAGE__->mk_classaccessor('_loader_args' => {}); -__PACKAGE__->mk_classaccessors(qw/dump_to_dir _loader_invoked _loader loader_class/); +__PACKAGE__->mk_classaccessors(qw/ + dump_to_dir _loader_invoked _loader loader_class naming +/); =head1 NAME @@ -150,6 +152,7 @@ sub _invoke_loader { $args->{schema_class} = $class; weaken($args->{schema}) if ref $self; $args->{dump_directory} ||= $self->dump_to_dir; + $args->{naming} = $self->naming; # XXX this only works for relative storage_type, like ::DBI ... my $impl = $self->loader_class @@ -285,16 +288,23 @@ Examples: sub import { my $self = shift; + return if !@_; + + my $cpkg = (caller)[0]; + foreach my $opt (@_) { if($opt =~ m{^dump_to_dir:(.*)$}) { $self->dump_to_dir($1) } elsif($opt eq 'make_schema_at') { no strict 'refs'; - my $cpkg = (caller)[0]; *{"${cpkg}::make_schema_at"} = \&make_schema_at; } + elsif($opt eq 'naming') { + no strict 'refs'; + *{"${cpkg}::naming"} = sub { $self->naming(@_) }; + } } } @@ -370,6 +380,24 @@ Returns a list of the new monikers added. sub rescan { my $self = shift; $self->_loader->rescan($self) } +=head2 naming + +=over 4 + +=item Arguments: \%opts | $ver + +=back + +Controls the naming options for backward compatibility, see +L for details. + +To upgrade a dynamic schema, use: + + __PACKAGE__->naming('current'); + +Can be imported into your dump script and called as a function as well: + + naming('v4'); =head1 KNOWN ISSUES diff --git a/lib/DBIx/Class/Schema/Loader/Base.pm b/lib/DBIx/Class/Schema/Loader/Base.pm index 47a4d6f..2d28c2c 100644 --- a/lib/DBIx/Class/Schema/Loader/Base.pm +++ b/lib/DBIx/Class/Schema/Loader/Base.pm @@ -49,6 +49,7 @@ __PACKAGE__->mk_ro_accessors(qw/ classes monikers dynamic + naming /); __PACKAGE__->mk_accessors(qw/ @@ -97,7 +98,21 @@ overwriting a dump made with an earlier version. The option also takes a hashref: - naming => { relationships => 'v5', results => 'v4' } + naming => { relationships => 'v5', monikers => 'v4' } + +The keys are: + +=over 4 + +=item relationships + +How to name relationship accessors. + +=item monikers + +How to name Result classes. + +=back The values can be: @@ -331,6 +346,14 @@ sub new { $self->version_to_dump($DBIx::Class::Schema::Loader::VERSION); $self->schema_version_to_dump($DBIx::Class::Schema::Loader::VERSION); + if (not ref $self->naming && defined $self->naming) { + my $naming_ver = $self->naming;; + $self->{naming} = { + relationships => $naming_ver, + monikers => $naming_ver, + }; + } + $self->_check_back_compat; $self; @@ -339,21 +362,14 @@ sub new { sub _check_back_compat { my ($self) = @_; -# dynamic schemas will always be in 0.04006 mode +# dynamic schemas will always be in 0.04006 mode, unless overridden if ($self->dynamic) { - no strict 'refs'; - my $class = ref $self || $self; - require DBIx::Class::Schema::Loader::Compat::v0_040; - - @{"${class}::ISA"} = map { - $_ eq 'DBIx::Class::Schema::Loader::Base' ? - 'DBIx::Class::Schema::Loader::Compat::v0_040' : - $_ - } @{"${class}::ISA"}; - - Class::C3::reinitialize; # just in case, though no one is likely to dump a dynamic schema $self->schema_version_to_dump('0.04006'); + + $self->naming->{relationships} ||= 'v4'; + $self->naming->{monikers} ||= 'v4'; + return; } @@ -367,24 +383,16 @@ sub _check_back_compat { while (<$fh>) { if (/^# Created by DBIx::Class::Schema::Loader v((\d+)\.(\d+))/) { my $real_ver = $1; - my $ver = "v${2}_${3}"; - while (1) { - my $compat_class = "DBIx::Class::Schema::Loader::Compat::${ver}"; - if ($self->load_optional_class($compat_class)) { - no strict 'refs'; - my $class = ref $self || $self; - - @{"${class}::ISA"} = map { - $_ eq 'DBIx::Class::Schema::Loader::Base' ? - $compat_class : $_ - } @{"${class}::ISA"}; - - Class::C3::reinitialize; - $self->schema_version_to_dump($real_ver); - last; - } - $ver =~ s/\d\z// or last; - } + + $self->schema_version_to_dump($real_ver); + + # XXX when we go past .0 this will need fixing + my ($v) = $real_ver =~ /([1-9])/; + $v = "v$v"; + + $self->naming->{relationships} ||= $v; + $self->naming->{monikers} ||= $v; + last; } } @@ -510,6 +518,14 @@ sub _relbuilder { return if $self->{skip_relationships}; + if ($self->naming->{relationships} eq 'v4') { + require DBIx::Class::Schema::Loader::RelBuilder::Compat::v0_040; + return $self->{relbuilder} ||= + DBIx::Class::Schema::Loader::RelBuilder::Compat::v0_040->new( + $self->schema, $self->inflect_plural, $self->inflect_singular + ); + } + $self->{relbuilder} ||= DBIx::Class::Schema::Loader::RelBuilder->new( $self->schema, $self->inflect_plural, $self->inflect_singular ); @@ -947,6 +963,10 @@ sub tables { sub _default_table2moniker { my ($self, $table) = @_; + if ($self->naming->{monikers} eq 'v4') { + return join '', map ucfirst, split /[\W_]+/, lc $table; + } + return join '', map ucfirst, split /[\W_]+/, Lingua::EN::Inflect::Number::to_S(lc $table); } diff --git a/lib/DBIx/Class/Schema/Loader/Compat/v0_040.pm b/lib/DBIx/Class/Schema/Loader/Compat/v0_040.pm deleted file mode 100644 index 2dca0f4..0000000 --- a/lib/DBIx/Class/Schema/Loader/Compat/v0_040.pm +++ /dev/null @@ -1,38 +0,0 @@ -package DBIx::Class::Schema::Loader::Compat::v0_040; - -use strict; -use warnings; -use Class::C3; - -use base 'DBIx::Class::Schema::Loader::Base'; - -use DBIx::Class::Schema::Loader::RelBuilder::Compat::v0_040; - -# Make a moniker from a table -sub _default_table2moniker { - my ($self, $table) = @_; - - return join '', map ucfirst, split /[\W_]+/, lc $table; -} - -sub _relbuilder { - my ($self) = @_; - $self->{relbuilder} ||= - DBIx::Class::Schema::Loader::RelBuilder::Compat::v0_040->new( - $self->schema, $self->inflect_plural, $self->inflect_singular - ); -} - -1; - -=head1 NAME - -DBIx::Class::Schema::Loader::Compat::v0_040 - Compatibility for DBIx::Class::Schema::Loader -version 0.04006 - -=head1 DESCRIPTION - -Dumps from the old version are auto-detected, and the compat layer is turned -on. See also L. - -=cut diff --git a/lib/DBIx/Class/Schema/Loader/RelBuilder/Compat/v0_040.pm b/lib/DBIx/Class/Schema/Loader/RelBuilder/Compat/v0_040.pm index 63e2a14..cc33c90 100644 --- a/lib/DBIx/Class/Schema/Loader/RelBuilder/Compat/v0_040.pm +++ b/lib/DBIx/Class/Schema/Loader/RelBuilder/Compat/v0_040.pm @@ -39,6 +39,6 @@ compatibility with DBIx::Class::Schema::Loader version 0.04006 =head1 DESCRIPTION -Loaded by L. +See L. =cut