fix table count test in common tests, inc version for dev release, add extra tests...
Rafael Kitover [Sun, 29 Nov 2009 17:49:40 +0000 (17:49 +0000)]
22 files changed:
Makefile.PL
README [deleted file]
lib/DBIx/Class/Schema/Loader.pm
lib/DBIx/Class/Schema/Loader/Base.pm
lib/DBIx/Class/Schema/Loader/DBI.pm
lib/DBIx/Class/Schema/Loader/DBI/DB2.pm
lib/DBIx/Class/Schema/Loader/DBI/MSSQL.pm
lib/DBIx/Class/Schema/Loader/DBI/ODBC.pm
lib/DBIx/Class/Schema/Loader/DBI/ODBC/Microsoft_SQL_Server.pm
lib/DBIx/Class/Schema/Loader/DBI/Oracle.pm
lib/DBIx/Class/Schema/Loader/DBI/Pg.pm
lib/DBIx/Class/Schema/Loader/DBI/SQLite.pm
lib/DBIx/Class/Schema/Loader/DBI/Sybase.pm
lib/DBIx/Class/Schema/Loader/DBI/Sybase/Common.pm
lib/DBIx/Class/Schema/Loader/DBI/Sybase/Microsoft_SQL_Server.pm
lib/DBIx/Class/Schema/Loader/DBI/Writing.pm
lib/DBIx/Class/Schema/Loader/DBI/mysql.pm
lib/DBIx/Class/Schema/Loader/RelBuilder.pm
t/12pg_common.t
t/20invocations.t
t/22dump.t
t/lib/dbixcsl_common_tests.pm

index 7baf854..62ffddc 100644 (file)
@@ -123,10 +123,12 @@ for(my $i = 0; $i <= $#$_features - 1; $i += 2) {
 }
 
 # Rebuild README for maintainers
-if(-e 'MANIFEST.SKIP') {
+if ($Module::Install::AUTHOR) {
     system("pod2text lib/DBIx/Class/Schema/Loader.pm > README");
 }
 
+realclean_files 'README';
+
 resources 'IRC'         => 'irc://irc.perl.org/#dbix-class';
 resources 'license'     => 'http://dev.perl.org/licenses/';
 resources 'repository'  => 'http://dev.catalyst.perl.org/repos/bast/branches/DBIx-Class-Schema-Loader/current/';
diff --git a/README b/README
deleted file mode 100644 (file)
index a827290..0000000
--- a/README
+++ /dev/null
@@ -1,241 +0,0 @@
-NAME
-    DBIx::Class::Schema::Loader - Dynamic definition of a
-    DBIx::Class::Schema
-
-SYNOPSIS
-      ### use this module to generate a set of class files
-
-      # in a script
-      use DBIx::Class::Schema::Loader qw/ make_schema_at /;
-      make_schema_at(
-          'My::Schema',
-          { debug => 1,
-            dump_directory => './lib',
-          },
-          [ 'dbi:Pg:dbname="foo"', 'myuser', 'mypassword' ],
-      );
-
-      # from the command line or a shell script with dbicdump (distributed
-      # with this module).  Do `perldoc dbicdump` for usage.
-      dbicdump -o dump_directory=./lib \
-               -o debug=1 \
-               My::Schema \
-               'dbi:Pg:dbname=foo' \
-               myuser \
-               mypassword
-
-      ### or generate and load classes at runtime
-      # note: this technique is not recommended
-      # for use in production code
-
-      package My::Schema;
-      use base qw/DBIx::Class::Schema::Loader/;
-
-      __PACKAGE__->loader_options(
-          constraint              => '^foo.*',
-          # debug                 => 1,
-      );
-
-      #### in application code elsewhere:
-
-      use My::Schema;
-
-      my $schema1 = My::Schema->connect( $dsn, $user, $password, $attrs);
-      # -or-
-      my $schema1 = "My::Schema"; $schema1->connection(as above);
-
-DESCRIPTION
-    DBIx::Class::Schema::Loader automates the definition of a
-    DBIx::Class::Schema by scanning database table definitions and setting
-    up the columns, primary keys, and relationships.
-
-    DBIx::Class::Schema::Loader currently supports only the DBI storage
-    type. It has explicit support for DBD::Pg, DBD::mysql, DBD::DB2,
-    DBD::SQLite, and DBD::Oracle. Other DBI drivers may function to a
-    greater or lesser degree with this loader, depending on how much of the
-    DBI spec they implement, and how standard their implementation is.
-
-    Patches to make other DBDs work correctly welcome.
-
-    See DBIx::Class::Schema::Loader::DBI::Writing for notes on writing your
-    own vendor-specific subclass for an unsupported DBD driver.
-
-    This module requires DBIx::Class 0.07006 or later, and obsoletes the
-    older DBIx::Class::Loader.
-
-    This module is designed more to get you up and running quickly against
-    an existing database, or to be effective for simple situations, rather
-    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, so don't shy away from it just for fears of the transition
-    down the road.
-
-METHODS
-  loader_class
-    Argument: $loader_class
-
-    Set the loader class to be instantiated when "connection" is called. If
-    the classname starts with "::", "DBIx::Class::Schema::Loader" is
-    prepended. Defaults to "storage_type" in DBIx::Class::Schema (which must
-    start with "::" when using DBIx::Class::Schema::Loader).
-
-    This is mostly useful for subclassing existing loaders or in conjunction
-    with "dump_to_dir".
-
-  loader_options
-    Argument: \%loader_options
-
-    Example in Synopsis above demonstrates a few common arguments. For
-    detailed information on all of the arguments, most of which are only
-    useful in fairly complex scenarios, see the
-    DBIx::Class::Schema::Loader::Base documentation.
-
-    If you intend to use "loader_options", you must call "loader_options"
-    before any connection is made, or embed the "loader_options" in the
-    connection information itself as shown below. Setting "loader_options"
-    after the connection has already been made is useless.
-
-  connection
-    Arguments: @args
-    Return Value: $new_schema
-
-    See "connection" in DBIx::Class::Schema for basic usage.
-
-    If the final argument is a hashref, and it contains the keys
-    "loader_options" or "loader_class", those keys will be deleted, and
-    their values value will be used for the loader options or class,
-    respectively, just as if set via the "loader_options" or "loader_class"
-    methods above.
-
-    The actual auto-loading operation (the heart of this module) will be
-    invoked as soon as the connection information is defined.
-
-  clone
-    See "clone" in DBIx::Class::Schema.
-
-  dump_to_dir
-    Argument: $directory
-
-    Calling this as a class method on either DBIx::Class::Schema::Loader or
-    any derived schema class will cause all schemas to dump manual versions
-    of themselves to the named directory when they are loaded. In order to
-    be effective, this must be set before defining a connection on this
-    schema class or any derived object (as the loading happens as soon as
-    both a connection and loader_options are set, and only once per class).
-
-    See "dump_directory" in DBIx::Class::Schema::Loader::Base for more
-    details on the dumping mechanism.
-
-    This can also be set at module import time via the import option
-    "dump_to_dir:/foo/bar" to DBIx::Class::Schema::Loader, where "/foo/bar"
-    is the target directory.
-
-    Examples:
-
-        # My::Schema isa DBIx::Class::Schema::Loader, and has connection info
-        #   hardcoded in the class itself:
-        perl -MDBIx::Class::Schema::Loader=dump_to_dir:/foo/bar -MMy::Schema -e1
-
-        # Same, but no hard-coded connection, so we must provide one:
-        perl -MDBIx::Class::Schema::Loader=dump_to_dir:/foo/bar -MMy::Schema -e 'My::Schema->connection("dbi:Pg:dbname=foo", ...)'
-
-        # Or as a class method, as long as you get it done *before* defining a
-        #  connection on this schema class or any derived object:
-        use My::Schema;
-        My::Schema->dump_to_dir('/foo/bar');
-        My::Schema->connection(........);
-
-        # Or as a class method on the DBIx::Class::Schema::Loader itself, which affects all
-        #   derived schemas
-        use My::Schema;
-        use My::OtherSchema;
-        DBIx::Class::Schema::Loader->dump_to_dir('/foo/bar');
-        My::Schema->connection(.......);
-        My::OtherSchema->connection(.......);
-
-        # Another alternative to the above:
-        use DBIx::Class::Schema::Loader qw| dump_to_dir:/foo/bar |;
-        use My::Schema;
-        use My::OtherSchema;
-        My::Schema->connection(.......);
-        My::OtherSchema->connection(.......);
-
-  make_schema_at
-    Arguments: $schema_class_name, \%loader_options, \@connect_info
-    Return Value: $schema_class_name
-
-    This function creates a DBIx::Class schema from an existing RDBMS
-    schema. With the "dump_directory" option, generates a set of DBIx::Class
-    classes from an existing database schema read from the given dsn.
-    Without a "dump_directory", creates schema classes in memory at runtime
-    without generating on-disk class files.
-
-    For a complete list of supported loader_options, see
-    DBIx::Class::Schema::Loader::Base
-
-    This function can be imported in the usual way, as illustrated in these
-    Examples:
-
-        # Simple example, creates as a new class 'New::Schema::Name' in
-        #  memory in the running perl interpreter.
-        use DBIx::Class::Schema::Loader qw/ make_schema_at /;
-        make_schema_at(
-            'New::Schema::Name',
-            { debug => 1 },
-            [ 'dbi:Pg:dbname="foo"','postgres' ],
-        );
-
-        # Inside a script, specifying a dump directory in which to write
-        # class files
-        use DBIx::Class::Schema::Loader qw/ make_schema_at /;
-        make_schema_at(
-            'New::Schema::Name',
-            { debug => 1, dump_directory => './lib' },
-            [ 'dbi:Pg:dbname="foo"','postgres' ],
-        );
-
-  rescan
-    Return Value: @new_monikers
-
-    Re-scans the database for newly added tables since the initial load, and
-    adds them to the schema at runtime, including relationships, etc. Does
-    not process drops or changes.
-
-    Returns a list of the new monikers added.
-
-KNOWN ISSUES
-  Multiple Database Schemas
-    Currently the loader is limited to working within a single schema (using
-    the underlying RDBMS's definition of "schema"). If you have a
-    multi-schema database with inter-schema relationships (which is easy to
-    do in PostgreSQL or DB2 for instance), you currently can only
-    automatically load the tables of one schema, and relationships to tables
-    in other schemas will be silently ignored.
-
-    At some point in the future, an intelligent way around this might be
-    devised, probably by allowing the "db_schema" option to be an arrayref
-    of schemas to load.
-
-    In "normal" DBIx::Class::Schema usage, manually-defined source classes
-    and relationships have no problems crossing vendor schemas.
-
-AUTHOR
-    Brandon Black, "blblack@gmail.com"
-
-    Based on DBIx::Class::Loader by Sebastian Riedel
-
-    Based upon the work of IKEBE Tomohiro
-
-THANK YOU
-    Matt S Trout, all of the #dbix-class folks, and everyone who's ever sent
-    in a bug report or suggestion.
-
-LICENSE
-    This library is free software; you can redistribute it and/or modify it
-    under the same terms as Perl itself.
-
-SEE ALSO
-    DBIx::Class, DBIx::Class::Manual::ExampleSchema
-
index 3ffa38d..2aab638 100644 (file)
@@ -10,7 +10,7 @@ use Scalar::Util qw/ weaken /;
 # Always remember to do all digits for the version even if they're 0
 # i.e. first release of 0.XX *must* be 0.XX000. This avoids fBSD ports
 # brain damage and presumably various other packaging systems too
-our $VERSION = '0.04999_10';
+our $VERSION = '0.04999_11';
 
 __PACKAGE__->mk_classaccessor('_loader_args' => {});
 __PACKAGE__->mk_classaccessors(qw/dump_to_dir _loader_invoked _loader loader_class/);
@@ -418,6 +418,8 @@ Robert Bohne <rbo@openserv.org>
 
 ribasushi: Peter Rabbitson <rabbit+dbic@rabbit.us>
 
+gugu: Andrey Kostenko <a.kostenko@rambler-co.ru>
+
 ... and lots of other folks. If we forgot you, please write the current
 maintainer or RT.
 
index b0cba0c..8d64358 100644 (file)
@@ -16,7 +16,7 @@ use File::Temp qw//;
 use Class::Unload;
 require DBIx::Class;
 
-our $VERSION = '0.04999_10';
+our $VERSION = '0.04999_11';
 
 __PACKAGE__->mk_ro_accessors(qw/
                                 schema
index 3e648bf..2b65659 100644 (file)
@@ -6,7 +6,7 @@ use base qw/DBIx::Class::Schema::Loader::Base/;
 use Class::C3;
 use Carp::Clan qw/^DBIx::Class/;
 
-our $VERSION = '0.04999_10';
+our $VERSION = '0.04999_11';
 
 =head1 NAME
 
index f8c0629..b6d9945 100644 (file)
@@ -6,7 +6,7 @@ use base 'DBIx::Class::Schema::Loader::DBI';
 use Carp::Clan qw/^DBIx::Class/;
 use Class::C3;
 
-our $VERSION = '0.04999_10';
+our $VERSION = '0.04999_11';
 
 =head1 NAME
 
index 72a0d27..8b7f122 100644 (file)
@@ -9,7 +9,7 @@ use base qw/
 use Carp::Clan qw/^DBIx::Class/;
 use Class::C3;
 
-our $VERSION = '0.04999_10';
+our $VERSION = '0.04999_11';
 
 =head1 NAME
 
index 557dae6..198a486 100644 (file)
@@ -6,7 +6,7 @@ use base 'DBIx::Class::Schema::Loader::DBI';
 use Carp::Clan qw/^DBIx::Class/;
 use Class::C3;
 
-our $VERSION = '0.04999_10';
+our $VERSION = '0.04999_11';
 
 =head1 NAME
 
index a4a9f14..f5654f8 100644 (file)
@@ -6,7 +6,7 @@ use base 'DBIx::Class::Schema::Loader::DBI::MSSQL';
 use Carp::Clan qw/^DBIx::Class/;
 use Class::C3;
 
-our $VERSION = '0.04999_10';
+our $VERSION = '0.04999_11';
 
 =head1 NAME
 
index 13a2cea..b362d0e 100644 (file)
@@ -6,7 +6,7 @@ use base 'DBIx::Class::Schema::Loader::DBI';
 use Carp::Clan qw/^DBIx::Class/;
 use Class::C3;
 
-our $VERSION = '0.04999_10';
+our $VERSION = '0.04999_11';
 
 =head1 NAME
 
index aa72058..efc6c68 100644 (file)
@@ -6,7 +6,7 @@ use base 'DBIx::Class::Schema::Loader::DBI';
 use Carp::Clan qw/^DBIx::Class/;
 use Class::C3;
 
-our $VERSION = '0.04999_10';
+our $VERSION = '0.04999_11';
 
 =head1 NAME
 
index 195b6d9..347f952 100644 (file)
@@ -7,7 +7,7 @@ use Carp::Clan qw/^DBIx::Class/;
 use Text::Balanced qw( extract_bracketed );
 use Class::C3;
 
-our $VERSION = '0.04999_10';
+our $VERSION = '0.04999_11';
 
 =head1 NAME
 
index 9220e6f..aaf6970 100644 (file)
@@ -9,7 +9,7 @@ use base qw/
 use Carp::Clan qw/^DBIx::Class/;
 use Class::C3;
 
-our $VERSION = '0.04999_10';
+our $VERSION = '0.04999_11';
 
 =head1 NAME
 
index ec276c0..ff6e0ed 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 use Carp::Clan qw/^DBIx::Class/;
 use Class::C3;
 
-our $VERSION = '0.04999_10';
+our $VERSION = '0.04999_11';
 
 =head1 NAME
 
index a0e3aa6..f76fefc 100644 (file)
@@ -6,7 +6,7 @@ use base 'DBIx::Class::Schema::Loader::DBI::MSSQL';
 use Carp::Clan qw/^DBIx::Class/;
 use Class::C3;
 
-our $VERSION = '0.04999_10';
+our $VERSION = '0.04999_11';
 
 =head1 NAME
 
index 7f1ae64..5d17f29 100644 (file)
@@ -1,7 +1,7 @@
 package DBIx::Class::Schema::Loader::DBI::Writing;
 use strict;
 
-our $VERSION = '0.04999_10';
+our $VERSION = '0.04999_11';
 
 # Empty. POD only.
 
index b603eb4..e229604 100644 (file)
@@ -6,7 +6,7 @@ use base 'DBIx::Class::Schema::Loader::DBI';
 use Carp::Clan qw/^DBIx::Class/;
 use Class::C3;
 
-our $VERSION = '0.04999_10';
+our $VERSION = '0.04999_11';
 
 =head1 NAME
 
index c67f81a..46e81ed 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 use Carp::Clan qw/^DBIx::Class/;
 use Lingua::EN::Inflect::Number ();
 
-our $VERSION = '0.04999_10';
+our $VERSION = '0.04999_11';
 
 =head1 NAME
 
index 21e83ec..963ba0d 100644 (file)
@@ -1,6 +1,7 @@
 use strict;
 use lib qw(t/lib);
 use dbixcsl_common_tests;
+use Test::More;
 
 my $dsn      = $ENV{DBICTEST_PG_DSN} || '';
 my $user     = $ENV{DBICTEST_PG_USER} || '';
@@ -12,6 +13,41 @@ my $tester = dbixcsl_common_tests->new(
     dsn         => $dsn,
     user        => $user,
     password    => $password,
+    extra       => {
+        create => [
+            q{
+                CREATE TABLE pg_loader_test1 (
+                    id SERIAL NOT NULL PRIMARY KEY,
+                    value VARCHAR(100)
+                )
+            },
+            q{
+                COMMENT ON TABLE pg_loader_test1 IS 'The Table'
+            },
+            q{
+                COMMENT ON COLUMN pg_loader_test1.value IS 'The Column'
+            },
+        ],
+        drop  => [ qw/ pg_loader_test1 / ],
+        count => 2,
+        run   => sub {
+            my ($schema, $monikers, $classes) = @_;
+
+            my $class    = $classes->{pg_loader_test1};
+            my $filename = $schema->_loader->_get_dump_filename($class);
+
+            my $code = do {
+                local ($/, @ARGV) = (undef, $filename);
+                <>;
+            };
+
+            like $code, qr/^=head1 NAME\n\n^$class - The Table\n\n^=cut\n/m,
+                'table comment';
+
+            like $code, qr/^=head2 value\n\nThe Column\n\n/m,
+                'column comment';
+        },
+    },
 );
 
 if( !$dsn || !$user ) {
index c818842..3c59d9d 100644 (file)
@@ -3,6 +3,10 @@ use Test::More;
 use lib qw(t/lib);
 use make_dbictest_db;
 
+local $SIG{__WARN__} = sub {
+    warn $_[0] unless $_[0] =~ /really_erase_my_files/
+};
+
 # Takes a $schema as input, runs 4 basic tests
 sub test_schema {
     my ($testname, $schema) = @_;
index a10c483..671021e 100644 (file)
@@ -6,6 +6,11 @@ use make_dbictest_db;
 
 my $dump_path = './t/_dump';
 
+local $SIG{__WARN__} = sub {
+    warn $_[0] unless $_[0] =~
+        /really_erase_my_files|Dumping manual schema|Schema dump completed/;
+};
+
 {
     package DBICTest::Schema::1;
     use base qw/ DBIx::Class::Schema::Loader /;
index 54c4049..c7a78de 100644 (file)
@@ -73,6 +73,11 @@ sub run_tests {
     $self->drop_tables;
 }
 
+# defined in sub create
+my (@statements, @statements_reltests, @statements_advanced,
+    @statements_advanced_sqlite, @statements_inline_rels,
+    @statements_implicit_rels);
+
 sub setup_schema {
     my $self = shift;
     my @connect_info = @_;
@@ -115,8 +120,19 @@ sub setup_schema {
        my $file_count;
        find sub { return if -d; $file_count++ }, $DUMP_DIR;
 
-       is $file_count, 34, 'correct number of files generated';
-       exit if $file_count != 34;
+       my $expected_count = 34;
+
+       $expected_count += @{ $self->{extra}{drop} || [] };
+
+       $expected_count -= grep /CREATE TABLE/, @statements_inline_rels
+           if $self->{no_inline_rels};
+
+       $expected_count -= grep /CREATE TABLE/, @statements_implicit_rels
+           if $self->{no_implicit_rels};
+
+       is $file_count, $expected_count, 'correct number of files generated';
+
+       exit if $file_count != $expected_count;
 
        my $warn_count = 2;
        $warn_count++ if grep /ResultSetManager/, @loader_warnings;
@@ -655,7 +671,17 @@ sub test_schema {
         my $before_digest = $digest->digest;
 
         my $dbh = $self->dbconnect(1);
-        $dbh->do($_) for @statements_rescan;
+
+        {
+            # Silence annoying but harmless postgres "NOTICE:  CREATE TABLE..."
+            local $SIG{__WARN__} = sub {
+                my $msg = shift;
+                print STDERR $msg unless $msg =~ m{^NOTICE:\s+CREATE TABLE};
+            };
+
+            $dbh->do($_) for @statements_rescan;
+        }
+
         $dbh->disconnect;
 
         sleep 1;
@@ -726,7 +752,7 @@ sub create {
     $self->{_created} = 1;
 
     my $make_auto_inc = $self->{auto_inc_cb} || sub {};
-    my @statements = (
+    @statements = (
         qq{
             CREATE TABLE loader_test1s (
                 id $self->{auto_inc_pk},
@@ -769,7 +795,7 @@ sub create {
         },
     );
 
-    my @statements_reltests = (
+    @statements_reltests = (
         qq{
             CREATE TABLE loader_test3 (
                 id INTEGER NOT NULL PRIMARY KEY,
@@ -1028,7 +1054,7 @@ sub create {
         q{ INSERT INTO loader_test34 (id,rel1) VALUES (1,2) },
     );
 
-    my @statements_advanced = (
+    @statements_advanced = (
         qq{
             CREATE TABLE loader_test10 (
                 id10 $self->{auto_inc_pk},
@@ -1053,7 +1079,7 @@ sub create {
          q{ REFERENCES loader_test11 (id11) }),
     );
 
-    my @statements_advanced_sqlite = (
+    @statements_advanced_sqlite = (
         qq{
             CREATE TABLE loader_test10 (
                 id10 $self->{auto_inc_pk},
@@ -1076,7 +1102,7 @@ sub create {
          q{ loader_test11 INTEGER REFERENCES loader_test11 (id11) }),
     );
 
-    my @statements_inline_rels = (
+    @statements_inline_rels = (
         qq{
             CREATE TABLE loader_test12 (
                 id INTEGER NOT NULL PRIMARY KEY,
@@ -1100,7 +1126,7 @@ sub create {
     );
 
 
-    my @statements_implicit_rels = (
+    @statements_implicit_rels = (
         qq{
             CREATE TABLE loader_test14 (
                 id INTEGER NOT NULL PRIMARY KEY,