kill deprecated options/methods, make relationship loading the default
Brandon Black [Tue, 12 Sep 2006 19:28:42 +0000 (19:28 +0000)]
lib/DBIx/Class/Schema/Loader.pm
lib/DBIx/Class/Schema/Loader/Base.pm
lib/DBIx/Class/Schema/Loader/DBI/DB2.pm
lib/DBIx/Class/Schema/Loader/DBI/Pg.pm
lib/DBIx/Class/Schema/Loader/DBI/SQLite.pm
lib/DBIx/Class/Schema/Loader/DBI/mysql.pm
t/20invocations.t
t/22dump.t
t/lib/dbixcsl_common_tests.pm

index f5e2509..bbc8fd3 100644 (file)
@@ -15,8 +15,8 @@ use Scalar::Util qw/ weaken /;
 our $VERSION = '0.03999_01';
 
 __PACKAGE__->mk_classaccessor('dump_to_dir');
-__PACKAGE__->mk_classaccessor('loader');
-__PACKAGE__->mk_classaccessor('_loader_args');
+__PACKAGE__->mk_classaccessor('_loader_args' => {});
+__PACKAGE__->mk_classaccessor('_loader_invoked');
 
 =head1 NAME
 
@@ -28,7 +28,6 @@ DBIx::Class::Schema::Loader - Dynamic definition of a DBIx::Class::Schema
   use base qw/DBIx::Class::Schema::Loader/;
 
   __PACKAGE__->loader_options(
-      relationships           => 1,
       constraint              => '^foo.*',
       # debug                 => 1,
   );
@@ -66,9 +65,8 @@ than to be what you use in the long term for a complex database/project.
 
 That being said, transitioning your code from a Schema generated by this
 module to one that doesn't use this module should be straightforward and
-painless (as long as you're not using any methods that are now deprecated
-in this document), so don't shy away from it just for fears of the
-transition down the road.
+painless, so don't shy away from it just for fears of the transition down
+the road.
 
 =head1 METHODS
 
@@ -79,17 +77,10 @@ detailed information on all of the arguments, most of which are
 only useful in fairly complex scenarios, see the
 L<DBIx::Class::Schema::Loader::Base> documentation.
 
-This method is *required* at this time, for backwards compatibility
-reasons.  If you do not wish to change any options, just call it
-with an empty argument list during schema class initialization.
-
-Setting these options explicitly via this method B<after> calling
-C<connection> is deprecated and will stop working in version 0.04000.
-For now the code merely warns about this condition.
-
-The preferred way of doing things is to either call C<loader_options>
-before any connection is made, or embed the C<loader_options> in
-the connection information itself as shown below.
+One must call C<loader_options> before any connection is made,
+or embed the C<loader_options> in the connection information itself
+as shown below.  Setting C<loader_options> after the connection has
+already been made is useless.
 
 =cut
 
@@ -97,18 +88,7 @@ sub loader_options {
     my $self = shift;
     
     my %args = (ref $_[0] eq 'HASH') ? %{$_[0]} : @_;
-
-    my $class = ref $self || $self;
-    $args{schema} = $self;
-    $args{schema_class} = $class;
-    weaken($args{schema}) if ref $self;
-
     $self->_loader_args(\%args);
-    if($self->storage && !$class->loader) {
-        warn "Do not set loader_options after specifying the connection info,"
-           . " this will be unsupported in 0.04000";
-        $self->_invoke_loader;
-    }
 
     $self;
 }
@@ -117,7 +97,13 @@ sub _invoke_loader {
     my $self = shift;
     my $class = ref $self || $self;
 
-    $self->_loader_args->{dump_directory} ||= $self->dump_to_dir;
+    my $args = $self->_loader_args;
+
+    # set up the schema/schema_class arguments
+    $args->{schema} = $self;
+    $args->{schema_class} = $class;
+    weaken($args->{schema}) if ref $self;
+    $args->{dump_directory} ||= $self->dump_to_dir;
 
     # XXX this only works for relative storage_type, like ::DBI ...
     my $impl = "DBIx::Class::Schema::Loader" . $self->storage_type;
@@ -125,10 +111,8 @@ sub _invoke_loader {
       croak qq/Could not load storage_type loader "$impl": / .
             qq/"$UNIVERSAL::require::ERROR"/;
 
-    # XXX in the future when we get rid of ->loader, the next two
-    # lines can be replaced by "$impl->new(%{$self->_loader_args})->load;"
-    $class->loader($impl->new(%{$self->_loader_args}));
-    $class->loader->load;
+    $impl->new(%$args)->load;
+    $self->_loader_invoked(1);
 
     $self;
 }
@@ -159,7 +143,7 @@ sub connection {
     $self = $self->next::method(@_);
 
     my $class = ref $self || $self;
-    if($self->_loader_args && !$class->loader) {
+    if(!$class->_loader_invoked) {
         $self->_invoke_loader
     }
 
@@ -270,19 +254,19 @@ illustrated in these Examples:
     use DBIx::Class::Schema::Loader qw/ make_schema_at /;
     make_schema_at(
         'New::Schema::Name',
-        { relationships => 1, debug => 1 },
+        { debug => 1 },
         [ 'dbi:Pg:dbname="foo"','postgres' ],
     );
 
     # Complex: dump loaded schema to disk, all from the commandline:
-    perl -MDBIx::Class::Schema::Loader=make_schema_at,dump_to_dir:./lib -e 'make_schema_at("New::Schema::Name", { relationships => 1 }, [ "dbi:Pg:dbname=foo","postgres" ])'
+    perl -MDBIx::Class::Schema::Loader=make_schema_at,dump_to_dir:./lib -e 'make_schema_at("New::Schema::Name", { debug => 1 }, [ "dbi:Pg:dbname=foo","postgres" ])'
 
     # Same, but inside a script, and using a different way to specify the
     # dump directory:
     use DBIx::Class::Schema::Loader qw/ make_schema_at /;
     make_schema_at(
         'New::Schema::Name',
-        { relationships => 1, debug => 1, dump_directory => './lib' },
+        { debug => 1, dump_directory => './lib' },
         [ 'dbi:Pg:dbname="foo"','postgres' ],
     );
 
@@ -310,7 +294,6 @@ replace the DB::Main with the following code:
   use base qw/DBIx::Class::Schema::Loader/;
 
   __PACKAGE__->loader_options(
-      relationships => 1,
       debug         => 1,
   );
   __PACKAGE__->connection('dbi:SQLite:example.db');
@@ -320,89 +303,6 @@ replace the DB::Main with the following code:
 and remove the Main directory tree (optional).  Every thing else
 should work the same
 
-=head1 DEPRECATED METHODS
-
-You don't need to read anything in this section unless you're upgrading
-code that was written against pre-0.03 versions of this module.  This
-version is intended to be backwards-compatible with pre-0.03 code, but
-will issue warnings about your usage of deprecated features/methods.
-
-B<All of these deprecated methods will dissappear in version 0.04000>,
-and converting code that uses these methods should be trivial.
-
-=head2 load_from_connection
-
-This deprecated method is now roughly an alias for L</loader_options>.
-
-For now, using this method will invoke the legacy behavior for
-backwards compatibility, and merely emit a warning about upgrading
-your code.
-
-It also reverts the default inflection scheme to
-use L<Lingua::EN::Inflect> just like pre-0.03 versions of this
-module did.
-
-You can force these legacy inflections with the
-option L<DBIx::Class::Schema::Loader::Base/legacy_default_inflections>,
-even after switch over to the preferred L</loader_options> way of doing
-things.  That option will not go away until at least 0.05.
-
-See the source of this method for more details.
-
-=cut
-
-sub load_from_connection {
-    my ($self, %args) = @_;
-
-    my $cmds_ver = $Catalyst::Model::DBIC::Schema::VERSION;
-    if($cmds_ver) {
-        if($cmds_ver < 0.14) {
-            warn 'You should upgrade your installation of'
-               . ' Catalyst::Model::DBIC::Schema to 0.14 or higher, then:';
-        }
-        warn 'You should regenerate your Model files, which may eliminate'
-           . ' the following deprecation warning:';
-    }
-    warn 'load_from_connection deprecated, and will dissappear in 0.04000, '
-       . 'please [re-]read the [new] DBIx::Class::Schema::Loader '
-       . 'documentation';
-
-    # Support the old connect_info / dsn / etc args...
-    $args{connect_info} = [
-        delete $args{dsn},
-        delete $args{user},
-        delete $args{password},
-        delete $args{options},
-    ] if $args{dsn};
-
-    $self->connection(@{delete $args{connect_info}})
-        if $args{connect_info};
-
-    $self->loader_options('legacy_default_inflections' => 1, %args);
-}
-
-=head2 loader
-
-This is an accessor in the generated Schema class for accessing
-the L<DBIx::Class::Schema::Loader::Base> -based loader object
-that was used during construction.  See the
-L<DBIx::Class::Schema::Loader::Base> docs for more information
-on the available loader methods there.
-
-This accessor is deprecated.  Do not use it.  Anything you can
-get from C<loader>, you can get via the normal L<DBIx::Class::Schema>
-methods, and your code will be more robust and forward-thinking
-for doing so.
-
-If you're already using C<loader> in your code, make an effort
-to get rid of it.  If you think you've found a situation where it
-is necessary, let me know and we'll see what we can do to remedy
-that situation.
-
-In some future version, this accessor *will* disappear.  It was
-apparently quite a design/API mistake to ever have exposed it to
-user-land in the first place, all things considered.
-
 =head1 KNOWN ISSUES
 
 =head2 Multiple Database Schemas
index 47d9654..0cb8cff 100644 (file)
@@ -24,7 +24,7 @@ __PACKAGE__->mk_ro_accessors(qw/
                                 left_base_classes
                                 components
                                 resultset_components
-                                relationships
+                                skip_relationships
                                 moniker_map
                                 inflect_singular
                                 inflect_plural
@@ -58,9 +58,10 @@ classes, and implements the common functionality between them.
 These constructor options are the base options for
 L<DBIx::Class::Schema::Loader/loader_opts>.  Available constructor options are:
 
-=head2 relationships
+=head2 skip_relationships
 
-Try to automatically detect/setup has_a and has_many relationships.
+Skip setting up relationships.  The default is to attempt the loading
+of relationships.
 
 =head2 debug
 
@@ -181,25 +182,6 @@ If set to a true value, the dumping code will overwrite existing files.
 The default is false, which means the dumping code will skip the already
 existing files.
 
-=head1 DEPRECATED CONSTRUCTOR OPTIONS
-
-B<These will be removed in version 0.04000 !!!>
-
-=head2 inflect_map
-
-Equivalent to L</inflect_plural>.
-
-=head2 inflect
-
-Equivalent to L</inflect_plural>.
-
-=head2 connect_info, dsn, user, password, options
-
-You connect these schemas the same way you would any L<DBIx::Class::Schema>,
-which is by calling either C<connect> or C<connection> on a schema class
-or object.  These options are only supported via the deprecated
-C<load_from_connection> interface, which is also being removed in 0.04000.
-
 =head1 METHODS
 
 None of these methods are intended for direct invocation by regular
@@ -248,14 +230,6 @@ sub new {
     $self->{monikers} = {};
     $self->{classes} = {};
 
-    # Support deprecated arguments
-    for(qw/inflect_map inflect/) {
-        warn "Argument $_ is deprecated in favor of 'inflect_plural'"
-           . ", and will be removed in 0.04000"
-                if $self->{$_};
-    }
-    $self->{inflect_plural} ||= $self->{inflect_map} || $self->{inflect};
-
     $self->{schema_class} ||= ( ref $self->{schema} || $self->{schema} );
     $self->{schema} ||= $self->{schema_class};
 
@@ -313,7 +287,7 @@ sub load {
     my $self = shift;
 
     $self->_load_classes;
-    $self->_load_relationships if $self->relationships;
+    $self->_load_relationships if ! $self->skip_relationships;
     $self->_load_external;
     $self->_dump_to_dir if $self->dump_directory;
 
index 68cc311..f029457 100644 (file)
@@ -17,10 +17,7 @@ DBIx::Class::Schema::Loader::DBI::DB2 - DBIx::Class::Schema::Loader::DBI DB2 Imp
   package My::Schema;
   use base qw/DBIx::Class::Schema::Loader/;
 
-  __PACKAGE__->loader_options(
-    relationships => 1,
-    db_schema     => "MYSCHEMA",
-  );
+  __PACKAGE__->loader_options( db_schema => "MYSCHEMA" );
 
   1;
 
index 1bd3d4a..5f4ae7c 100644 (file)
@@ -18,9 +18,7 @@ PostgreSQL Implementation.
   package My::Schema;
   use base qw/DBIx::Class::Schema::Loader/;
 
-  __PACKAGE__->loader_options(
-    relationships => 1,
-  );
+  __PACKAGE__->loader_options( debug => 1 );
 
   1;
 
index 62f90a3..6b8eaf0 100644 (file)
@@ -18,7 +18,7 @@ DBIx::Class::Schema::Loader::DBI::SQLite - DBIx::Class::Schema::Loader::DBI SQLi
   package My::Schema;
   use base qw/DBIx::Class::Schema::Loader/;
 
-  __PACKAGE__->loader_optoins( relationships => 1 );
+  __PACKAGE__->loader_options( debug => 1 );
 
   1;
 
index 832b836..0f5a1f2 100644 (file)
@@ -17,9 +17,7 @@ DBIx::Class::Schema::Loader::DBI::mysql - DBIx::Class::Schema::Loader::DBI mysql
   package My::Schema;
   use base qw/DBIx::Class::Schema::Loader/;
 
-  __PACKAGE__->load_from_connection(
-    relationships => 1,
-  );
+  __PACKAGE__->loader_options( debug => 1 );
 
   1;
 
index 22b0836..fdab791 100644 (file)
@@ -21,49 +21,16 @@ sub test_schema {
 }
 
 my @invocations = (
-    'deprecated_one' => sub {
-        package DBICTest::Schema::1;
-        use base qw/ DBIx::Class::Schema::Loader /;
-        __PACKAGE__->connection($make_dbictest_db::dsn);
-        __PACKAGE__->load_from_connection( relationships => 1 );
-        __PACKAGE__;
-    },
-    'deprecated_two' => sub {
-        package DBICTest::Schema::2;
-        use base qw/ DBIx::Class::Schema::Loader /;
-        __PACKAGE__->load_from_connection(
-            relationships => 1,
-            connect_info => [ $make_dbictest_db::dsn ],
-        );
-        __PACKAGE__;
-    },
-    'deprecated_three' => sub {
-        package DBICTest::Schema::3;
-        use base qw/ DBIx::Class::Schema::Loader /;
-        __PACKAGE__->load_from_connection(
-            relationships => 1,
-            dsn => $make_dbictest_db::dsn,
-        );
-        __PACKAGE__;
-    },
-    'deprecated_four' => sub {
-        package DBICTest::Schema::4;
-        use base qw/ DBIx::Class::Schema::Loader /;
-        __PACKAGE__->connection($make_dbictest_db::dsn);
-        __PACKAGE__->loader_options( relationships => 1 );
-        __PACKAGE__;
-    },
     'hardcode' => sub {
         package DBICTest::Schema::5;
         use base qw/ DBIx::Class::Schema::Loader /;
-        __PACKAGE__->loader_options( relationships => 1 );
         __PACKAGE__->connection($make_dbictest_db::dsn);
         __PACKAGE__;
     },
     'normal' => sub {
         package DBICTest::Schema::6;
         use base qw/ DBIx::Class::Schema::Loader /;
-        __PACKAGE__->loader_options( relationships => 1 );
+        __PACKAGE__->loader_options();
         __PACKAGE__->connect($make_dbictest_db::dsn);
     },
     'make_schema_at' => sub {
index 47106a9..ba5eda3 100644 (file)
@@ -32,7 +32,7 @@ rmtree($dump_path, 1, 1);
 eval { DBICTest::Schema::1->connect($make_dbictest_db::dsn) };
 ok(!$@, 'no death with dump_directory set') or diag "Dump failed: $@";
 
-DBICTest::Schema::1->loader(undef);
+DBICTest::Schema::1->_loader_invoked(undef);
 
 SKIP: {
   skip "ActiveState perl produces additional warnings", 5
@@ -58,7 +58,7 @@ eval { DBICTest::Schema::2->connect($make_dbictest_db::dsn) };
 ok(!$@, 'no death with dump_directory set (overwrite1)')
     or diag "Dump failed: $@";
 
-DBICTest::Schema::2->loader(undef);
+DBICTest::Schema::2->_loader_invoked(undef);
 eval { DBICTest::Schema::2->connect($make_dbictest_db::dsn) };
 ok(!$@, 'no death with dump_directory set (overwrite2)')
     or diag "Dump failed: $@";
index 3a86855..6747d18 100644 (file)
@@ -100,8 +100,13 @@ sub run_tests {
     }
 
     my $conn = $schema_class->clone;
-    my $monikers = $schema_class->loader->monikers;
-    my $classes = $schema_class->loader->classes;
+    my $monikers = {};
+    my $classes = {};
+    foreach my $source_name ($schema_class->sources) {
+        my $table_name = $schema_class->source($source_name)->from;
+        $monikers->{$table_name} = $source_name;
+        $classes->{$table_name} = $schema_class . q{::} . $source_name;
+    }
 
     my $moniker1 = $monikers->{loader_test1};
     my $class1   = $classes->{loader_test1};