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.89',
42 'Math::Base36' => '0.07',
51 my $rdbms_mssql_odbc = {
54 my $rdbms_mssql_sybase = {
57 my $rdbms_mssql_ado = {
76 #'Module::Install::Pod::Inherit' => '0.01',
82 title => 'Storage::Replicated',
83 desc => 'Modules required for L<DBIx::Class::Storage::DBI::Replicated>',
100 title => 'DBIx::Class::Admin',
101 desc => 'Modules required for the DBIx::Class administrative library',
109 'Getopt::Long::Descriptive' => '0.081',
110 'Text::CSV' => '1.16',
113 title => 'dbicadmin',
114 desc => 'Modules required for the CLI DBIx::Class interface dbicadmin',
120 'SQL::Translator' => '0.11006',
123 title => 'Storage::DBI::deploy()',
124 desc => 'Modules required for L<DBIx::Class::Storage::DBI/deploy> and L<DBIx::Class::Storage::DBI/deployment_statements>',
129 req => $id_shortener,
134 'Test::Pod' => '1.41',
138 test_podcoverage => {
140 'Test::Pod::Coverage' => '1.08',
141 'Pod::Coverage' => '0.20',
147 'Test::NoTabs' => '0.9',
153 'Test::EOL' => '0.6',
157 test_prettydebug => {
163 'Test::Memory::Cycle' => '0',
164 'Devel::Cycle' => '1.10',
169 req => $datetime_basic,
177 'DateTime::Format::SQLite' => '0',
184 # t/inflate/datetime_mysql.t
185 # (doesn't need Mysql itself)
186 'DateTime::Format::MySQL' => '0',
193 # t/inflate/datetime_pg.t
194 # (doesn't need PG itself)
195 'DateTime::Format::Pg' => '0.16004',
201 'DBIx::ContextualFetch' => '0',
202 'Class::DBI::Plugin::DeepAbstractSearch' => '0',
203 'Class::Trigger' => '0',
204 'Time::Piece::MySQL' => '0',
206 'Date::Simple' => '3.03',
210 # this is just for completeness as SQLite
211 # is a core dep of DBIC for testing
217 title => 'SQLite support',
218 desc => 'Modules required to connect to SQLite',
227 title => 'PostgreSQL support',
228 desc => 'Modules required to connect to PostgreSQL',
232 rdbms_mssql_odbc => {
237 title => 'MSSQL support via DBD::ODBC',
238 desc => 'Modules required to connect to MSSQL via DBD::ODBC',
242 rdbms_mssql_sybase => {
244 %$rdbms_mssql_sybase,
247 title => 'MSSQL support via DBD::Sybase',
248 desc => 'Modules required to connect to MSSQL via DBD::Sybase',
257 title => 'MSSQL support via DBD::ADO (Windows only)',
258 desc => 'Modules required to connect to MSSQL via DBD::ADO. This particular DBD is available on Windows only',
267 title => 'MySQL support',
268 desc => 'Modules required to connect to MySQL',
277 title => 'Oracle support',
278 desc => 'Modules required to connect to Oracle',
287 title => 'Sybase ASE support',
288 desc => 'Modules required to connect to Sybase ASE',
297 title => 'DB2 support',
298 desc => 'Modules required to connect to DB2',
302 # the order does matter because the rdbms support group might require
303 # a different version that the test group
306 $ENV{DBICTEST_PG_DSN}
309 'Sys::SigAction' => '0',
310 'DBD::Pg' => '2.009002',
315 test_rdbms_mssql_odbc => {
317 $ENV{DBICTEST_MSSQL_ODBC_DSN}
324 test_rdbms_mssql_ado => {
326 $ENV{DBICTEST_MSSQL_ADO_DSN}
333 test_rdbms_mssql_sybase => {
335 $ENV{DBICTEST_MSSQL_DSN}
337 %$rdbms_mssql_sybase,
342 test_rdbms_mysql => {
344 $ENV{DBICTEST_MYSQL_DSN}
351 test_rdbms_oracle => {
353 $ENV{DBICTEST_ORA_DSN}
356 'DateTime::Format::Oracle' => '0',
357 'DBD::Oracle' => '1.24',
364 $ENV{DBICTEST_SYBASE_DSN}
367 'DateTime::Format::Sybase' => '0',
374 $ENV{DBICTEST_DB2_DSN}
383 $ENV{DBICTEST_MEMCACHED}
385 'Cache::Memcached' => 0,
394 my ($class, $group) = @_;
396 croak "req_list_for() expects a requirement group name"
399 my $deps = $reqs->{$group}{req}
400 or croak "Requirement group '$group' does not exist";
406 our %req_availability_cache;
408 my ($class, $group) = @_;
410 croak "req_ok_for() expects a requirement group name"
413 return $class->_check_deps($group)->{status};
416 sub req_missing_for {
417 my ($class, $group) = @_;
419 croak "req_missing_for() expects a requirement group name"
422 return $class->_check_deps($group)->{missing};
425 sub req_errorlist_for {
426 my ($class, $group) = @_;
428 croak "req_errorlist_for() expects a requirement group name"
431 return $class->_check_deps($group)->{errorlist};
435 my ($class, $group) = @_;
437 return $req_availability_cache{$group} ||= do {
439 my $deps = $class->req_list_for ($group);
442 for my $mod (keys %$deps) {
443 my $req_line = "require $mod;";
444 if (my $ver = $deps->{$mod}) {
445 $req_line .= "$mod->VERSION($ver);";
450 $errors{$mod} = $@ if $@;
456 my $missing = join (', ', map { $deps->{$_} ? "$_ >= $deps->{$_}" : $_ } (sort keys %errors) );
457 $missing .= " (see $class for details)" if $reqs->{$group}{pod};
460 errorlist => \%errors,
477 return { map { $_ => { %{ $reqs->{$_}{req} || {} } } } (keys %$reqs) };
480 # This is to be called by the author only (automatically in Makefile.PL)
482 my ($class, $distver) = @_;
484 my $modfn = __PACKAGE__ . '.pm';
485 $modfn =~ s/\:\:/\//g;
487 my $podfn = __FILE__;
488 $podfn =~ s/\.pm$/\.pod/;
491 eval { require DBIx::Class; DBIx::Class->VERSION; }
494 "\n\n---------------------------------------------------------------------\n" .
495 'Unable to load core DBIx::Class module to determine current version, '.
496 'possibly due to missing dependencies. Author-mode autodocumentation ' .
498 "\n\n---------------------------------------------------------------------\n"
501 my $sqltver = $class->req_list_for ('deploy')->{'SQL::Translator'}
502 or die "Hrmm? No sqlt dep?";
506 #########################################################################
507 ##################### A U T O G E N E R A T E D ########################
508 #########################################################################
510 # The contents of this POD file are auto-generated. Any changes you make
511 # will be lost. If you need to change the generated text edit _gen_pod()
512 # at the end of $modfn
516 "$class - Optional module dependency specifications (for module authors)",
519 Somewhere in your build-file (e.g. L<Module::Install>'s Makefile.PL):
523 configure_requires 'DBIx::Class' => '$distver';
527 my \$deploy_deps = $class->req_list_for('deploy');
529 for (keys %\$deploy_deps) {
530 requires \$_ => \$deploy_deps->{\$_};
535 Note that there are some caveats regarding C<configure_requires()>, more info
536 can be found at L<Module::Install/configure_requires>
538 '=head1 DESCRIPTION',
540 Some of the less-frequently used features of L<DBIx::Class> have external
541 module dependencies on their own. In order not to burden the average user
542 with modules he will never use, these optional dependencies are not included
543 in the base Makefile.PL. Instead an exception with a descriptive message is
544 thrown when a specific feature is missing one or several modules required for
545 its operation. This module is the central holding place for the current list
546 of such dependencies, for DBIx::Class core authors, and DBIx::Class extension
549 '=head1 CURRENT REQUIREMENT GROUPS',
551 Dependencies are organized in C<groups> and each group can list one or more
552 required modules, with an optional minimum version (or 0 for any version).
553 The group name can be used in the
557 for my $group (sort keys %$reqs) {
558 my $p = $reqs->{$group}{pod}
561 my $modlist = $reqs->{$group}{req}
564 next unless keys %$modlist;
567 "=head2 $p->{title}",
570 ( map { "=item * $_" . ($modlist->{$_} ? " >= $modlist->{$_}" : '') } (sort keys %$modlist) ),
572 "Requirement group: B<$group>",
578 '=head2 req_group_list',
580 '=item Arguments: none',
581 '=item Returns: \%list_of_requirement_groups',
584 This method should be used by DBIx::Class packagers, to get a hashref of all
585 dependencies keyed by dependency group. Each key (group name) can be supplied
586 to one of the group-specific methods below.
589 '=head2 req_list_for',
591 '=item Arguments: $group_name',
592 '=item Returns: \%list_of_module_version_pairs',
595 This method should be used by DBIx::Class extension authors, to determine the
596 version of modules a specific feature requires in the B<current> version of
597 DBIx::Class. See the L</SYNOPSIS> for a real-world
603 '=item Arguments: $group_name',
604 '=item Returns: 1|0',
607 Returns true or false depending on whether all modules required by
608 C<$group_name> are present on the system and loadable.
611 '=head2 req_missing_for',
613 '=item Arguments: $group_name',
614 '=item Returns: $error_message_string',
617 Returns a single line string suitable for inclusion in larger error messages.
618 This method would normally be used by DBIx::Class core-module author, to
619 indicate to the user that he needs to install specific modules before he will
620 be able to use a specific feature.
622 For example if some of the requirements for C<deploy> are not available,
623 the returned string could look like:
625 SQL::Translator >= $sqltver (see $class for details)
627 The author is expected to prepend the necessary text to this message before
628 returning the actual error seen by the user.
631 '=head2 req_errorlist_for',
633 '=item Arguments: $group_name',
634 '=item Returns: \%list_of_loaderrors_per_module',
637 Returns a hashref containing the actual errors that occured while attempting
638 to load each module in the requirement group.
641 'See L<DBIx::Class/CONTRIBUTORS>.',
643 'You may distribute this code under the same terms as Perl itself',
646 open (my $fh, '>', $podfn) or croak "Unable to write to $podfn: $!";
647 print $fh join ("\n\n", @chunks);