1 package DBIx::Class::Optional::Dependencies;
8 # NO EXTERNAL NON-5.8.1 CORE DEPENDENCIES EVER (e.g. C::A::G)
9 # This module is to be loaded by Makefile.PM on a pristine system
11 # POD is generated automatically by calling _gen_pod from the
12 # Makefile.PL in $AUTHOR mode
15 'JSON::Any' => '1.22',
20 'MooseX::Types' => '0.21',
30 'MooseX::Types::Path::Class' => '0.05',
31 'MooseX::Types::JSON' => '0.02',
32 'namespace::autoclean' => '0.09',
38 'Getopt::Long::Descriptive' => '0.081',
39 'Text::CSV' => '1.16',
42 my $datetime_basic = {
44 'DateTime::Format::Strptime' => '1.2',
48 'Math::BigInt' => '1.80',
49 'Math::Base36' => '0.07',
58 my $rdbms_mssql_odbc = {
61 my $rdbms_mssql_sybase = {
64 my $rdbms_mssql_ado = {
67 my $rdbms_msaccess_odbc = {
70 my $rdbms_msaccess_ado = {
89 my $rdbms_informix = {
90 'DBD::Informix' => '0',
92 my $rdbms_sqlanywhere = {
93 'DBD::SQLAnywhere' => '0',
95 my $rdbms_sqlanywhere_odbc = {
98 my $rdbms_firebird = {
99 'DBD::Firebird' => '0',
101 my $rdbms_firebird_interbase = {
102 'DBD::InterBase' => '0',
104 my $rdbms_firebird_odbc = {
109 'SQL::Statement' => '1.33',
115 'SQL::Statement' => '1.33',
119 'SQL::Statement' => '1.33',
123 'SQL::Statement' => '1.33',
125 my $rdbms_ss_anydata = {
126 ### XXX: DBD::AnyData 0.110 and DBI 1.623 conflict! ###
127 'DBD::AnyData' => '0',
128 'SQL::Statement' => '1.33',
130 my $rdbms_ss_treedata = {
131 ### XXX: DBD::AnyData 0.110 and DBI 1.623 conflict! ###
132 'DBD::TreeData' => '0',
133 'SQL::Statement' => '1.33',
140 title => 'Storage::Replicated',
141 desc => 'Modules required for L<DBIx::Class::Storage::DBI::Replicated>',
148 'Test::Moose' => '0',
158 title => 'DBIx::Class::Admin',
159 desc => 'Modules required for the DBIx::Class administrative library',
168 title => 'dbicadmin',
169 desc => 'Modules required for the CLI DBIx::Class interface dbicadmin',
175 'SQL::Translator' => '0.11016',
178 title => 'Storage::DBI::deploy()',
179 desc => 'Modules required for L<DBIx::Class::Storage::DBI/deploy> and L<DBIx::Class::Storage::DBI/deployment_statements>',
184 req => $id_shortener,
187 test_component_accessor => {
189 'Class::Unload' => '0.07',
195 'Test::Pod' => '1.41',
199 test_podcoverage => {
201 'Test::Pod::Coverage' => '1.08',
202 'Pod::Coverage' => '0.20',
208 'Test::EOL' => '1.0',
209 'Test::NoTabs' => '0.9',
215 'Test::Strict' => '0.20',
219 test_prettydebug => {
223 test_admin_script => {
229 # for t/admin/10script.t
230 ? ('Win32::ShellQuote' => 0)
231 # DWIW does not compile (./configure even) on win32
232 : ('JSON::DWIW' => 0 )
239 'Test::Memory::Cycle' => '0',
240 'Devel::Cycle' => '1.10',
245 req => $datetime_basic,
253 'DateTime::Format::SQLite' => '0',
260 # t/inflate/datetime_mysql.t
261 # (doesn't need Mysql itself)
262 'DateTime::Format::MySQL' => '0',
269 # t/inflate/datetime_pg.t
270 # (doesn't need PG itself)
271 'DateTime::Format::Pg' => '0.16004',
277 'Class::DBI::Plugin::DeepAbstractSearch' => '0',
279 'Time::Piece::MySQL' => '0',
280 'Date::Simple' => '3.03',
284 # this is just for completeness as SQLite
285 # is a core dep of DBIC for testing
291 title => 'SQLite support',
292 desc => 'Modules required to connect to SQLite',
298 # when changing this list make sure to adjust xt/optional_deps.t
302 title => 'PostgreSQL support',
303 desc => 'Modules required to connect to PostgreSQL',
307 rdbms_mssql_odbc => {
312 title => 'MSSQL support via DBD::ODBC',
313 desc => 'Modules required to connect to MSSQL via DBD::ODBC',
317 rdbms_mssql_sybase => {
319 %$rdbms_mssql_sybase,
322 title => 'MSSQL support via DBD::Sybase',
323 desc => 'Modules required to connect to MSSQL via DBD::Sybase',
332 title => 'MSSQL support via DBD::ADO (Windows only)',
333 desc => 'Modules required to connect to MSSQL via DBD::ADO. This particular DBD is available on Windows only',
337 rdbms_msaccess_odbc => {
339 %$rdbms_msaccess_odbc,
342 title => 'MS Access support via DBD::ODBC',
343 desc => 'Modules required to connect to MS Access via DBD::ODBC',
347 rdbms_msaccess_ado => {
349 %$rdbms_msaccess_ado,
352 title => 'MS Access support via DBD::ADO (Windows only)',
353 desc => 'Modules required to connect to MS Access via DBD::ADO. This particular DBD is available on Windows only',
362 title => 'MySQL support',
363 desc => 'Modules required to connect to MySQL',
372 title => 'Oracle support',
373 desc => 'Modules required to connect to Oracle',
382 title => 'Sybase ASE support',
383 desc => 'Modules required to connect to Sybase ASE',
392 title => 'DB2 support',
393 desc => 'Modules required to connect to DB2',
402 title => 'DB2 on AS/400 support',
403 desc => 'Modules required to connect to DB2 on AS/400',
412 title => 'Informix support',
413 desc => 'Modules required to connect to Informix',
417 rdbms_sqlanywhere => {
422 title => 'SQLAnywhere support',
423 desc => 'Modules required to connect to SQLAnywhere',
427 rdbms_sqlanywhere_odbc => {
429 %$rdbms_sqlanywhere_odbc,
432 title => 'SQLAnywhere support via DBD::ODBC',
433 desc => 'Modules required to connect to SQLAnywhere via DBD::ODBC',
442 title => 'Firebird support',
443 desc => 'Modules required to connect to Firebird',
447 rdbms_firebird_interbase => {
449 %$rdbms_firebird_interbase,
452 title => 'Firebird support via DBD::InterBase',
453 desc => 'Modules required to connect to Firebird via DBD::InterBase',
457 rdbms_firebird_odbc => {
459 %$rdbms_firebird_odbc,
462 title => 'Firebird support via DBD::ODBC',
463 desc => 'Modules required to connect to Firebird via DBD::ODBC',
472 title => 'CSV support via DBD::CSV',
473 desc => 'Modules required to connect to CSV files via DBD::CSV',
482 title => 'ML/DBM support via DBD::DBM',
483 desc => 'Modules required to connect to DBM & MLDBM files via DBD::DBM',
492 title => 'PO support via DBD::PO',
493 desc => 'Modules required to connect to PO files via DBD::PO',
502 title => 'System tables interface support via DBD::Sys',
503 desc => 'Modules required to connect to system tables via DBD::Sys',
507 rdbms_ss_anydata => {
512 title => 'Abstract flat data support via DBD::AnyData',
513 desc => 'Modules required to connect to abstract flat data via DBD::AnyData',
517 rdbms_ss_treedata => {
522 title => 'Abstract tree data support via DBD::TreeData',
523 desc => 'Modules required to connect to abstract tree data via DBD::TreeData',
527 # the order does matter because the rdbms support group might require
528 # a different version that the test group
531 $ENV{DBICTEST_PG_DSN}
533 # when changing this list make sure to adjust xt/optional_deps.t
535 ($^O ne 'MSWin32' ? ('Sys::SigAction' => '0') : ()),
536 'DBD::Pg' => '2.009002',
541 test_rdbms_mssql_odbc => {
543 $ENV{DBICTEST_MSSQL_ODBC_DSN}
550 test_rdbms_mssql_ado => {
552 $ENV{DBICTEST_MSSQL_ADO_DSN}
559 test_rdbms_mssql_sybase => {
561 $ENV{DBICTEST_MSSQL_DSN}
563 %$rdbms_mssql_sybase,
568 test_rdbms_msaccess_odbc => {
570 $ENV{DBICTEST_MSACCESS_ODBC_DSN}
572 %$rdbms_msaccess_odbc,
579 test_rdbms_msaccess_ado => {
581 $ENV{DBICTEST_MSACCESS_ADO_DSN}
583 %$rdbms_msaccess_ado,
590 test_rdbms_mysql => {
592 $ENV{DBICTEST_MYSQL_DSN}
599 test_rdbms_oracle => {
601 $ENV{DBICTEST_ORA_DSN}
604 'DateTime::Format::Oracle' => '0',
605 'DBD::Oracle' => '1.24',
612 $ENV{DBICTEST_SYBASE_DSN}
621 $ENV{DBICTEST_DB2_DSN}
628 test_rdbms_db2_400 => {
630 $ENV{DBICTEST_DB2_400_DSN}
637 test_rdbms_informix => {
639 $ENV{DBICTEST_INFORMIX_DSN}
646 test_rdbms_sqlanywhere => {
648 $ENV{DBICTEST_SQLANYWHERE_DSN}
655 test_rdbms_sqlanywhere_odbc => {
657 $ENV{DBICTEST_SQLANYWHERE_ODBC_DSN}
659 %$rdbms_sqlanywhere_odbc,
664 test_rdbms_firebird => {
666 $ENV{DBICTEST_FIREBIRD_DSN}
673 test_rdbms_firebird_interbase => {
675 $ENV{DBICTEST_FIREBIRD_INTERBASE_DSN}
677 %$rdbms_firebird_interbase,
682 test_rdbms_firebird_odbc => {
684 $ENV{DBICTEST_FIREBIRD_ODBC_DSN}
686 %$rdbms_firebird_odbc,
691 test_rdbms_ss_csv => {
697 test_rdbms_ss_dbm => {
703 test_rdbms_ss_po => {
705 $ENV{DBICTEST_DBD_PO}
712 test_rdbms_ss_sys => {
714 $ENV{DBICTEST_DBD_SYS}
721 test_rdbms_ss_anydata => {
723 $ENV{DBICTEST_DBD_ANYDATA}
730 test_rdbms_ss_treedata => {
732 $ENV{DBICTEST_DBD_TREEDATA}
741 $ENV{DBICTEST_MEMCACHED}
743 'Cache::Memcached' => 0,
750 'ExtUtils::MakeMaker' => '6.64',
751 'Pod::Inherit' => '0.90',
758 'CPAN::Uploader' => '0.103001',
764 our %req_availability_cache;
767 my ($class, $group) = @_;
769 Carp::croak "req_list_for() expects a requirement group name"
772 my $deps = $reqs->{$group}{req}
773 or Carp::croak "Requirement group '$group' does not exist";
779 sub die_unless_req_ok_for {
780 my ($class, $group) = @_;
782 Carp::croak "die_unless_req_ok_for() expects a requirement group name"
785 $class->_check_deps($group)->{status}
786 or die sprintf( "Required modules missing, unable to continue: %s\n", $class->_check_deps($group)->{missing} );
790 my ($class, $group) = @_;
792 Carp::croak "req_ok_for() expects a requirement group name"
795 return $class->_check_deps($group)->{status};
798 sub req_missing_for {
799 my ($class, $group) = @_;
801 Carp::croak "req_missing_for() expects a requirement group name"
804 return $class->_check_deps($group)->{missing};
807 sub req_errorlist_for {
808 my ($class, $group) = @_;
810 Carp::croak "req_errorlist_for() expects a requirement group name"
813 return $class->_check_deps($group)->{errorlist};
817 my ($class, $group) = @_;
819 return $req_availability_cache{$group} ||= do {
821 my $deps = $class->req_list_for ($group);
824 for my $mod (keys %$deps) {
825 my $req_line = "require $mod;";
826 if (my $ver = $deps->{$mod}) {
827 $req_line .= "$mod->VERSION($ver);";
832 $errors{$mod} = $@ if $@;
838 my $missing = join (', ', map { $deps->{$_} ? "$_ >= $deps->{$_}" : $_ } (sort keys %errors) );
839 $missing .= " (see $class for details)" if $reqs->{$group}{pod};
842 errorlist => \%errors,
859 return { map { $_ => { %{ $reqs->{$_}{req} || {} } } } (keys %$reqs) };
862 # This is to be called by the author only (automatically in Makefile.PL)
864 my ($class, $distver, $pod_dir) = @_;
866 die "No POD root dir supplied" unless $pod_dir;
869 eval { require DBIx::Class; DBIx::Class->VERSION; }
872 "\n\n---------------------------------------------------------------------\n" .
873 'Unable to load core DBIx::Class module to determine current version, '.
874 'possibly due to missing dependencies. Author-mode autodocumentation ' .
876 "\n\n---------------------------------------------------------------------\n"
879 # do not ask for a recent version, use 1.x API calls
880 # this *may* execute on a smoker with old perl or whatnot
883 (my $modfn = __PACKAGE__ . '.pm') =~ s|::|/|g;
885 (my $podfn = "$pod_dir/$modfn") =~ s/\.pm$/\.pod/;
886 (my $dir = $podfn) =~ s|/[^/]+$||;
888 File::Path::mkpath([$dir]);
890 my $sqltver = $class->req_list_for ('deploy')->{'SQL::Translator'}
891 or die "Hrmm? No sqlt dep?";
895 #########################################################################
896 ##################### A U T O G E N E R A T E D ########################
897 #########################################################################
899 # The contents of this POD file are auto-generated. Any changes you make
900 # will be lost. If you need to change the generated text edit _gen_pod()
901 # at the end of $modfn
905 "$class - Optional module dependency specifications (for module authors)",
908 Somewhere in your build-file (e.g. L<Module::Install>'s Makefile.PL):
912 configure_requires 'DBIx::Class' => '$distver';
916 my \$deploy_deps = $class->req_list_for('deploy');
918 for (keys %\$deploy_deps) {
919 requires \$_ => \$deploy_deps->{\$_};
924 Note that there are some caveats regarding C<configure_requires()>, more info
925 can be found at L<Module::Install/configure_requires>
927 '=head1 DESCRIPTION',
929 Some of the less-frequently used features of L<DBIx::Class> have external
930 module dependencies on their own. In order not to burden the average user
931 with modules he will never use, these optional dependencies are not included
932 in the base Makefile.PL. Instead an exception with a descriptive message is
933 thrown when a specific feature is missing one or several modules required for
934 its operation. This module is the central holding place for the current list
935 of such dependencies, for DBIx::Class core authors, and DBIx::Class extension
938 '=head1 CURRENT REQUIREMENT GROUPS',
940 Dependencies are organized in C<groups> and each group can list one or more
941 required modules, with an optional minimum version (or 0 for any version).
942 The group name can be used in the
946 for my $group (sort keys %$reqs) {
947 my $p = $reqs->{$group}{pod}
950 my $modlist = $reqs->{$group}{req}
953 next unless keys %$modlist;
956 "=head2 $p->{title}",
959 ( map { "=item * $_" . ($modlist->{$_} ? " >= $modlist->{$_}" : '') } (sort keys %$modlist) ),
961 "Requirement group: B<$group>",
967 '=head2 req_group_list',
969 '=item Arguments: none',
970 '=item Return Value: \%list_of_requirement_groups',
973 This method should be used by DBIx::Class packagers, to get a hashref of all
974 dependencies keyed by dependency group. Each key (group name) can be supplied
975 to one of the group-specific methods below.
978 '=head2 req_list_for',
980 '=item Arguments: $group_name',
981 '=item Return Value: \%list_of_module_version_pairs',
984 This method should be used by DBIx::Class extension authors, to determine the
985 version of modules a specific feature requires in the B<current> version of
986 DBIx::Class. See the L</SYNOPSIS> for a real-world
992 '=item Arguments: $group_name',
993 '=item Return Value: 1|0',
996 Returns true or false depending on whether all modules required by
997 C<$group_name> are present on the system and loadable.
1000 '=head2 req_missing_for',
1002 '=item Arguments: $group_name',
1003 '=item Return Value: $error_message_string',
1006 Returns a single line string suitable for inclusion in larger error messages.
1007 This method would normally be used by DBIx::Class core-module author, to
1008 indicate to the user that he needs to install specific modules before he will
1009 be able to use a specific feature.
1011 For example if some of the requirements for C<deploy> are not available,
1012 the returned string could look like:
1014 SQL::Translator >= $sqltver (see $class for details)
1016 The author is expected to prepend the necessary text to this message before
1017 returning the actual error seen by the user.
1020 '=head2 die_unless_req_ok_for',
1022 '=item Arguments: $group_name',
1025 Checks if L</req_ok_for> passes for the supplied C<$group_name>, and
1026 in case of failure throws an exception including the information
1027 from L</req_missing_for>.
1030 '=head2 req_errorlist_for',
1032 '=item Arguments: $group_name',
1033 '=item Return Value: \%list_of_loaderrors_per_module',
1036 Returns a hashref containing the actual errors that occured while attempting
1037 to load each module in the requirement group.
1040 'See L<DBIx::Class/CONTRIBUTORS>.',
1042 'You may distribute this code under the same terms as Perl itself',
1045 open (my $fh, '>', $podfn) or Carp::croak "Unable to write to $podfn: $!";
1046 print $fh join ("\n\n", @chunks);