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',
35 my $datetime_basic = {
37 'DateTime::Format::Strptime' => '1.2',
41 'Math::BigInt' => '1.80',
42 'Math::Base36' => '0.07',
51 my $rdbms_mssql_odbc = {
54 my $rdbms_mssql_sybase = {
57 my $rdbms_mssql_ado = {
60 my $rdbms_msaccess_odbc = {
63 my $rdbms_msaccess_ado = {
82 my $rdbms_informix = {
83 'DBD::Informix' => '0',
85 my $rdbms_sqlanywhere = {
86 'DBD::SQLAnywhere' => '0',
88 my $rdbms_sqlanywhere_odbc = {
91 my $rdbms_firebird = {
92 'DBD::Firebird' => '0',
94 my $rdbms_firebird_interbase = {
95 'DBD::InterBase' => '0',
97 my $rdbms_firebird_odbc = {
103 #'Module::Install::Pod::Inherit' => '0.01',
109 title => 'Storage::Replicated',
110 desc => 'Modules required for L<DBIx::Class::Storage::DBI::Replicated>',
117 'Test::Moose' => '0',
127 title => 'DBIx::Class::Admin',
128 desc => 'Modules required for the DBIx::Class administrative library',
136 'Getopt::Long::Descriptive' => '0.081',
137 'Text::CSV' => '1.16',
140 title => 'dbicadmin',
141 desc => 'Modules required for the CLI DBIx::Class interface dbicadmin',
147 'SQL::Translator' => '0.11006',
150 title => 'Storage::DBI::deploy()',
151 desc => 'Modules required for L<DBIx::Class::Storage::DBI/deploy> and L<DBIx::Class::Storage::DBI/deployment_statements>',
156 req => $id_shortener,
159 test_component_accessor => {
161 'Class::Unload' => '0.07',
167 'Test::Pod' => '1.41',
171 test_podcoverage => {
173 'Test::Pod::Coverage' => '1.08',
174 'Pod::Coverage' => '0.20',
180 'Test::NoTabs' => '0.9',
186 'Test::EOL' => '1.0',
190 test_prettydebug => {
196 'Test::Memory::Cycle' => '0',
197 'Devel::Cycle' => '1.10',
202 req => $datetime_basic,
210 'DateTime::Format::SQLite' => '0',
217 # t/inflate/datetime_mysql.t
218 # (doesn't need Mysql itself)
219 'DateTime::Format::MySQL' => '0',
226 # t/inflate/datetime_pg.t
227 # (doesn't need PG itself)
228 'DateTime::Format::Pg' => '0.16004',
235 'Class::DBI::Plugin::DeepAbstractSearch' => '0',
237 'Time::Piece::MySQL' => '0',
238 'Date::Simple' => '3.03',
242 # this is just for completeness as SQLite
243 # is a core dep of DBIC for testing
249 title => 'SQLite support',
250 desc => 'Modules required to connect to SQLite',
259 title => 'PostgreSQL support',
260 desc => 'Modules required to connect to PostgreSQL',
264 rdbms_mssql_odbc => {
269 title => 'MSSQL support via DBD::ODBC',
270 desc => 'Modules required to connect to MSSQL via DBD::ODBC',
274 rdbms_mssql_sybase => {
276 %$rdbms_mssql_sybase,
279 title => 'MSSQL support via DBD::Sybase',
280 desc => 'Modules required to connect to MSSQL via DBD::Sybase',
289 title => 'MSSQL support via DBD::ADO (Windows only)',
290 desc => 'Modules required to connect to MSSQL via DBD::ADO. This particular DBD is available on Windows only',
294 rdbms_msaccess_odbc => {
296 %$rdbms_msaccess_odbc,
299 title => 'MS Access support via DBD::ODBC',
300 desc => 'Modules required to connect to MS Access via DBD::ODBC',
304 rdbms_msaccess_ado => {
306 %$rdbms_msaccess_ado,
309 title => 'MS Access support via DBD::ADO (Windows only)',
310 desc => 'Modules required to connect to MS Access via DBD::ADO. This particular DBD is available on Windows only',
319 title => 'MySQL support',
320 desc => 'Modules required to connect to MySQL',
329 title => 'Oracle support',
330 desc => 'Modules required to connect to Oracle',
339 title => 'Sybase ASE support',
340 desc => 'Modules required to connect to Sybase ASE',
349 title => 'DB2 support',
350 desc => 'Modules required to connect to DB2',
359 title => 'DB2 on AS/400 support',
360 desc => 'Modules required to connect to DB2 on AS/400',
369 title => 'Informix support',
370 desc => 'Modules required to connect to Informix',
374 rdbms_sqlanywhere => {
379 title => 'SQLAnywhere support',
380 desc => 'Modules required to connect to SQLAnywhere',
384 rdbms_sqlanywhere_odbc => {
386 %$rdbms_sqlanywhere_odbc,
389 title => 'SQLAnywhere support via DBD::ODBC',
390 desc => 'Modules required to connect to SQLAnywhere via DBD::ODBC',
399 title => 'Firebird support',
400 desc => 'Modules required to connect to Firebird',
404 rdbms_firebird_interbase => {
406 %$rdbms_firebird_interbase,
409 title => 'Firebird support via DBD::InterBase',
410 desc => 'Modules required to connect to Firebird via DBD::InterBase',
414 rdbms_firebird_odbc => {
416 %$rdbms_firebird_odbc,
419 title => 'Firebird support via DBD::ODBC',
420 desc => 'Modules required to connect to Firebird via DBD::ODBC',
424 # the order does matter because the rdbms support group might require
425 # a different version that the test group
428 $ENV{DBICTEST_PG_DSN}
431 ($^O ne 'MSWin32' ? ('Sys::SigAction' => '0') : ()),
432 'DBD::Pg' => '2.009002',
437 test_rdbms_mssql_odbc => {
439 $ENV{DBICTEST_MSSQL_ODBC_DSN}
446 test_rdbms_mssql_ado => {
448 $ENV{DBICTEST_MSSQL_ADO_DSN}
455 test_rdbms_mssql_sybase => {
457 $ENV{DBICTEST_MSSQL_DSN}
459 %$rdbms_mssql_sybase,
464 test_rdbms_msaccess_odbc => {
466 $ENV{DBICTEST_MSACCESS_ODBC_DSN}
468 %$rdbms_msaccess_odbc,
475 test_rdbms_msaccess_ado => {
477 $ENV{DBICTEST_MSACCESS_ADO_DSN}
479 %$rdbms_msaccess_ado,
486 test_rdbms_mysql => {
488 $ENV{DBICTEST_MYSQL_DSN}
495 test_rdbms_oracle => {
497 $ENV{DBICTEST_ORA_DSN}
500 'DateTime::Format::Oracle' => '0',
501 'DBD::Oracle' => '1.24',
508 $ENV{DBICTEST_SYBASE_DSN}
517 $ENV{DBICTEST_DB2_DSN}
524 test_rdbms_db2_400 => {
526 $ENV{DBICTEST_DB2_400_DSN}
533 test_rdbms_informix => {
535 $ENV{DBICTEST_INFORMIX_DSN}
542 test_rdbms_sqlanywhere => {
544 $ENV{DBICTEST_SQLANYWHERE_DSN}
551 test_rdbms_sqlanywhere_odbc => {
553 $ENV{DBICTEST_SQLANYWHERE_ODBC_DSN}
555 %$rdbms_sqlanywhere_odbc,
560 test_rdbms_firebird => {
562 $ENV{DBICTEST_FIREBIRD_DSN}
569 test_rdbms_firebird_interbase => {
571 $ENV{DBICTEST_FIREBIRD_INTERBASE_DSN}
573 %$rdbms_firebird_interbase,
578 test_rdbms_firebird_odbc => {
580 $ENV{DBICTEST_FIREBIRD_ODBC_DSN}
582 %$rdbms_firebird_odbc,
589 $ENV{DBICTEST_MEMCACHED}
591 'Cache::Memcached' => 0,
600 my ($class, $group) = @_;
602 Carp::croak "req_list_for() expects a requirement group name"
605 my $deps = $reqs->{$group}{req}
606 or Carp::croak "Requirement group '$group' does not exist";
612 our %req_availability_cache;
614 my ($class, $group) = @_;
616 Carp::croak "req_ok_for() expects a requirement group name"
619 return $class->_check_deps($group)->{status};
622 sub req_missing_for {
623 my ($class, $group) = @_;
625 Carp::croak "req_missing_for() expects a requirement group name"
628 return $class->_check_deps($group)->{missing};
631 sub req_errorlist_for {
632 my ($class, $group) = @_;
634 Carp::croak "req_errorlist_for() expects a requirement group name"
637 return $class->_check_deps($group)->{errorlist};
641 my ($class, $group) = @_;
643 return $req_availability_cache{$group} ||= do {
645 my $deps = $class->req_list_for ($group);
648 for my $mod (keys %$deps) {
649 my $req_line = "require $mod;";
650 if (my $ver = $deps->{$mod}) {
651 $req_line .= "$mod->VERSION($ver);";
656 $errors{$mod} = $@ if $@;
662 my $missing = join (', ', map { $deps->{$_} ? "$_ >= $deps->{$_}" : $_ } (sort keys %errors) );
663 $missing .= " (see $class for details)" if $reqs->{$group}{pod};
666 errorlist => \%errors,
683 return { map { $_ => { %{ $reqs->{$_}{req} || {} } } } (keys %$reqs) };
686 # This is to be called by the author only (automatically in Makefile.PL)
688 my ($class, $distver) = @_;
690 my $modfn = __PACKAGE__ . '.pm';
691 $modfn =~ s/\:\:/\//g;
693 my $podfn = __FILE__;
694 $podfn =~ s/\.pm$/\.pod/;
697 eval { require DBIx::Class; DBIx::Class->VERSION; }
700 "\n\n---------------------------------------------------------------------\n" .
701 'Unable to load core DBIx::Class module to determine current version, '.
702 'possibly due to missing dependencies. Author-mode autodocumentation ' .
704 "\n\n---------------------------------------------------------------------\n"
707 my $sqltver = $class->req_list_for ('deploy')->{'SQL::Translator'}
708 or die "Hrmm? No sqlt dep?";
712 #########################################################################
713 ##################### A U T O G E N E R A T E D ########################
714 #########################################################################
716 # The contents of this POD file are auto-generated. Any changes you make
717 # will be lost. If you need to change the generated text edit _gen_pod()
718 # at the end of $modfn
722 "$class - Optional module dependency specifications (for module authors)",
725 Somewhere in your build-file (e.g. L<Module::Install>'s Makefile.PL):
729 configure_requires 'DBIx::Class' => '$distver';
733 my \$deploy_deps = $class->req_list_for('deploy');
735 for (keys %\$deploy_deps) {
736 requires \$_ => \$deploy_deps->{\$_};
741 Note that there are some caveats regarding C<configure_requires()>, more info
742 can be found at L<Module::Install/configure_requires>
744 '=head1 DESCRIPTION',
746 Some of the less-frequently used features of L<DBIx::Class> have external
747 module dependencies on their own. In order not to burden the average user
748 with modules he will never use, these optional dependencies are not included
749 in the base Makefile.PL. Instead an exception with a descriptive message is
750 thrown when a specific feature is missing one or several modules required for
751 its operation. This module is the central holding place for the current list
752 of such dependencies, for DBIx::Class core authors, and DBIx::Class extension
755 '=head1 CURRENT REQUIREMENT GROUPS',
757 Dependencies are organized in C<groups> and each group can list one or more
758 required modules, with an optional minimum version (or 0 for any version).
759 The group name can be used in the
763 for my $group (sort keys %$reqs) {
764 my $p = $reqs->{$group}{pod}
767 my $modlist = $reqs->{$group}{req}
770 next unless keys %$modlist;
773 "=head2 $p->{title}",
776 ( map { "=item * $_" . ($modlist->{$_} ? " >= $modlist->{$_}" : '') } (sort keys %$modlist) ),
778 "Requirement group: B<$group>",
784 '=head2 req_group_list',
786 '=item Arguments: none',
787 '=item Returns: \%list_of_requirement_groups',
790 This method should be used by DBIx::Class packagers, to get a hashref of all
791 dependencies keyed by dependency group. Each key (group name) can be supplied
792 to one of the group-specific methods below.
795 '=head2 req_list_for',
797 '=item Arguments: $group_name',
798 '=item Returns: \%list_of_module_version_pairs',
801 This method should be used by DBIx::Class extension authors, to determine the
802 version of modules a specific feature requires in the B<current> version of
803 DBIx::Class. See the L</SYNOPSIS> for a real-world
809 '=item Arguments: $group_name',
810 '=item Returns: 1|0',
813 Returns true or false depending on whether all modules required by
814 C<$group_name> are present on the system and loadable.
817 '=head2 req_missing_for',
819 '=item Arguments: $group_name',
820 '=item Returns: $error_message_string',
823 Returns a single line string suitable for inclusion in larger error messages.
824 This method would normally be used by DBIx::Class core-module author, to
825 indicate to the user that he needs to install specific modules before he will
826 be able to use a specific feature.
828 For example if some of the requirements for C<deploy> are not available,
829 the returned string could look like:
831 SQL::Translator >= $sqltver (see $class for details)
833 The author is expected to prepend the necessary text to this message before
834 returning the actual error seen by the user.
837 '=head2 req_errorlist_for',
839 '=item Arguments: $group_name',
840 '=item Returns: \%list_of_loaderrors_per_module',
843 Returns a hashref containing the actual errors that occured while attempting
844 to load each module in the requirement group.
847 'See L<DBIx::Class/CONTRIBUTORS>.',
849 'You may distribute this code under the same terms as Perl itself',
852 open (my $fh, '>', $podfn) or Carp::croak "Unable to write to $podfn: $!";
853 print $fh join ("\n\n", @chunks);