2nd Pass
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Optional / Dependencies.pm
CommitLineData
8057ed01 1package DBIx::Class::Optional::Dependencies;
2
3use warnings;
4use strict;
5
9c1700e3 6use Carp ();
fb39747c 7
8# NO EXTERNAL NON-5.8.1 CORE DEPENDENCIES EVER (e.g. C::A::G)
8057ed01 9# This module is to be loaded by Makefile.PM on a pristine system
10
f6b26571 11# POD is generated automatically by calling _gen_pod from the
12# Makefile.PL in $AUTHOR mode
13
2a2a7b23 14my $json_any = {
15 'JSON::Any' => '1.22',
16};
17
2b48ebff 18my $moose_basic = {
68de9438 19 'Moose' => '0.98',
20 'MooseX::Types' => '0.21',
21};
22
23my $replicated = {
24 %$moose_basic,
2b48ebff 25};
26
ebcd0e4f 27my $admin_basic = {
28 %$moose_basic,
2a2a7b23 29 %$json_any,
68de9438 30 'MooseX::Types::Path::Class' => '0.05',
31 'MooseX::Types::JSON' => '0.02',
68de9438 32 'namespace::autoclean' => '0.09',
33};
34
a0361822 35my $admin_script = {
36 %$moose_basic,
37 %$admin_basic,
38 'Getopt::Long::Descriptive' => '0.081',
39 'Text::CSV' => '1.16',
40};
41
68de9438 42my $datetime_basic = {
43 'DateTime' => '0.55',
44 'DateTime::Format::Strptime' => '1.2',
ebcd0e4f 45};
46
c7d50a7d 47my $id_shortener = {
26022fb5 48 'Math::BigInt' => '1.80',
c7d50a7d 49 'Math::Base36' => '0.07',
50};
51
be68095d 52my $rdbms_sqlite = {
53 'DBD::SQLite' => '0',
54};
55my $rdbms_pg = {
56 'DBD::Pg' => '0',
57};
58my $rdbms_mssql_odbc = {
59 'DBD::ODBC' => '0',
60};
61my $rdbms_mssql_sybase = {
62 'DBD::Sybase' => '0',
63};
56dca25f 64my $rdbms_mssql_ado = {
65 'DBD::ADO' => '0',
66};
726c8f65 67my $rdbms_msaccess_odbc = {
68 'DBD::ODBC' => '0',
69};
70my $rdbms_msaccess_ado = {
71 'DBD::ADO' => '0',
72};
be68095d 73my $rdbms_mysql = {
74 'DBD::mysql' => '0',
75};
76my $rdbms_oracle = {
77 'DBD::Oracle' => '0',
78 %$id_shortener,
79};
80my $rdbms_ase = {
81 'DBD::Sybase' => '0',
82};
83my $rdbms_db2 = {
84 'DBD::DB2' => '0',
85};
199fbc45 86my $rdbms_db2_400 = {
87 'DBD::ODBC' => '0',
88};
89my $rdbms_informix = {
90 'DBD::Informix' => '0',
91};
92my $rdbms_sqlanywhere = {
93 'DBD::SQLAnywhere' => '0',
94};
95my $rdbms_sqlanywhere_odbc = {
96 'DBD::ODBC' => '0',
97};
98my $rdbms_firebird = {
99 'DBD::Firebird' => '0',
100};
101my $rdbms_firebird_interbase = {
102 'DBD::InterBase' => '0',
103};
e02b39b4 104my $rdbms_firebird_odbc = {
105 'DBD::ODBC' => '0',
106};
ac50f57b 107my $rdbms_ss_csv = {
108 'DBD::CSV' => '0',
109 'SQL::Statement' => '1.33',
110};
111my $rdbms_ss_dbm = {
112 'DBD::DBM' => '0',
113 'MLDBM' => '0',
7606fd62 114 'BerkeleyDB' => '0',
ac50f57b 115 'SQL::Statement' => '1.33',
116};
117my $rdbms_ss_po = {
118 'DBD::PO' => '0',
119 'SQL::Statement' => '1.33',
120};
121my $rdbms_ss_sys = {
122 'DBD::Sys' => '0',
123 'SQL::Statement' => '1.33',
124};
125my $rdbms_ss_anydata = {
126 ### XXX: DBD::AnyData 0.110 and DBI 1.623 conflict! ###
127 'DBD::AnyData' => '0',
128 'SQL::Statement' => '1.33',
129};
130my $rdbms_ss_treedata = {
131 ### XXX: DBD::AnyData 0.110 and DBI 1.623 conflict! ###
132 'DBD::TreeData' => '0',
133 'SQL::Statement' => '1.33',
134};
be68095d 135
8057ed01 136my $reqs = {
8057ed01 137 replicated => {
68de9438 138 req => $replicated,
f6b26571 139 pod => {
140 title => 'Storage::Replicated',
141 desc => 'Modules required for L<DBIx::Class::Storage::DBI::Replicated>',
142 },
8057ed01 143 },
144
68de9438 145 test_replicated => {
146 req => {
147 %$replicated,
148 'Test::Moose' => '0',
149 },
150 },
151
152
8057ed01 153 admin => {
2b48ebff 154 req => {
ebcd0e4f 155 %$admin_basic,
156 },
157 pod => {
158 title => 'DBIx::Class::Admin',
159 desc => 'Modules required for the DBIx::Class administrative library',
160 },
161 },
162
a4a02f15 163 admin_script => {
ebcd0e4f 164 req => {
a0361822 165 %$admin_script,
2b48ebff 166 },
e144415f 167 pod => {
168 title => 'dbicadmin',
169 desc => 'Modules required for the CLI DBIx::Class interface dbicadmin',
170 },
8057ed01 171 },
172
173 deploy => {
f6b26571 174 req => {
7536c92b 175 'SQL::Translator' => '0.11016',
f6b26571 176 },
177 pod => {
178 title => 'Storage::DBI::deploy()',
c7d50a7d 179 desc => 'Modules required for L<DBIx::Class::Storage::DBI/deploy> and L<DBIx::Class::Storage::DBI/deployment_statements>',
f6b26571 180 },
8057ed01 181 },
182
c7d50a7d 183 id_shortener => {
184 req => $id_shortener,
185 },
186
0d374214 187 test_component_accessor => {
188 req => {
189 'Class::Unload' => '0.07',
190 },
191 },
192
a109c954 193 test_pod => {
f6b26571 194 req => {
14d17d71 195 'Test::Pod' => '1.41',
a109c954 196 },
197 },
198
199 test_podcoverage => {
200 req => {
f6b26571 201 'Test::Pod::Coverage' => '1.08',
202 'Pod::Coverage' => '0.20',
a109c954 203 },
204 },
205
ffce4b65 206 test_whitespace => {
a109c954 207 req => {
8273e845 208 'Test::EOL' => '1.0',
ffce4b65 209 'Test::NoTabs' => '0.9',
f6b26571 210 },
8057ed01 211 },
212
4a233f30 213 test_strictures => {
214 req => {
b2c1212f 215 'Test::Strict' => '0.20',
4a233f30 216 },
217 },
218
2a2a7b23 219 test_prettydebug => {
220 req => $json_any,
221 },
222
99503754 223 test_admin_script => {
224 req => {
225 %$admin_script,
226 'JSON' => 0,
227 'JSON::XS' => 0,
228 $^O eq 'MSWin32'
229 # for t/admin/10script.t
230 ? ('Win32::ShellQuote' => 0)
231 # DWIW does not compile (./configure even) on win32
232 : ('JSON::DWIW' => 0 )
233 ,
234 }
235 },
236
226d1c35 237 test_leaks => {
f6b26571 238 req => {
f6b26571 239 'Test::Memory::Cycle' => '0',
240 'Devel::Cycle' => '1.10',
a109c954 241 },
242 },
f6b26571 243
68de9438 244 test_dt => {
245 req => $datetime_basic,
246 },
247
248 test_dt_sqlite => {
a109c954 249 req => {
68de9438 250 %$datetime_basic,
f6b26571 251 # t/36datetime.t
252 # t/60core.t
253 'DateTime::Format::SQLite' => '0',
68de9438 254 },
255 },
f6b26571 256
68de9438 257 test_dt_mysql => {
258 req => {
259 %$datetime_basic,
9c92bb1c 260 # t/inflate/datetime_mysql.t
261 # (doesn't need Mysql itself)
68de9438 262 'DateTime::Format::MySQL' => '0',
263 },
264 },
9c92bb1c 265
68de9438 266 test_dt_pg => {
267 req => {
268 %$datetime_basic,
9c92bb1c 269 # t/inflate/datetime_pg.t
270 # (doesn't need PG itself)
ab35aeab 271 'DateTime::Format::Pg' => '0.16004',
f6b26571 272 },
8057ed01 273 },
274
68de9438 275 test_cdbicompat => {
f6b26571 276 req => {
f6b26571 277 'Class::DBI::Plugin::DeepAbstractSearch' => '0',
d9bd5195 278 %$datetime_basic,
f6b26571 279 'Time::Piece::MySQL' => '0',
f6b26571 280 'Date::Simple' => '3.03',
281 },
8057ed01 282 },
283
be68095d 284 # this is just for completeness as SQLite
285 # is a core dep of DBIC for testing
286 rdbms_sqlite => {
287 req => {
288 %$rdbms_sqlite,
289 },
290 pod => {
291 title => 'SQLite support',
292 desc => 'Modules required to connect to SQLite',
293 },
294 },
295
296 rdbms_pg => {
297 req => {
a4fc1239 298 # when changing this list make sure to adjust xt/optional_deps.t
be68095d 299 %$rdbms_pg,
300 },
301 pod => {
302 title => 'PostgreSQL support',
303 desc => 'Modules required to connect to PostgreSQL',
304 },
305 },
306
307 rdbms_mssql_odbc => {
308 req => {
309 %$rdbms_mssql_odbc,
310 },
311 pod => {
312 title => 'MSSQL support via DBD::ODBC',
313 desc => 'Modules required to connect to MSSQL via DBD::ODBC',
314 },
315 },
316
317 rdbms_mssql_sybase => {
318 req => {
319 %$rdbms_mssql_sybase,
320 },
321 pod => {
322 title => 'MSSQL support via DBD::Sybase',
56dca25f 323 desc => 'Modules required to connect to MSSQL via DBD::Sybase',
324 },
325 },
326
327 rdbms_mssql_ado => {
328 req => {
329 %$rdbms_mssql_ado,
330 },
331 pod => {
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',
be68095d 334 },
335 },
336
726c8f65 337 rdbms_msaccess_odbc => {
338 req => {
339 %$rdbms_msaccess_odbc,
340 },
341 pod => {
342 title => 'MS Access support via DBD::ODBC',
343 desc => 'Modules required to connect to MS Access via DBD::ODBC',
344 },
345 },
346
347 rdbms_msaccess_ado => {
348 req => {
349 %$rdbms_msaccess_ado,
350 },
351 pod => {
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',
354 },
355 },
356
be68095d 357 rdbms_mysql => {
358 req => {
359 %$rdbms_mysql,
360 },
361 pod => {
362 title => 'MySQL support',
363 desc => 'Modules required to connect to MySQL',
364 },
365 },
366
367 rdbms_oracle => {
368 req => {
369 %$rdbms_oracle,
370 },
371 pod => {
372 title => 'Oracle support',
373 desc => 'Modules required to connect to Oracle',
374 },
375 },
376
377 rdbms_ase => {
378 req => {
379 %$rdbms_ase,
380 },
381 pod => {
382 title => 'Sybase ASE support',
383 desc => 'Modules required to connect to Sybase ASE',
384 },
385 },
386
387 rdbms_db2 => {
388 req => {
389 %$rdbms_db2,
390 },
391 pod => {
392 title => 'DB2 support',
393 desc => 'Modules required to connect to DB2',
394 },
395 },
396
199fbc45 397 rdbms_db2_400 => {
398 req => {
399 %$rdbms_db2_400,
400 },
401 pod => {
402 title => 'DB2 on AS/400 support',
403 desc => 'Modules required to connect to DB2 on AS/400',
404 },
405 },
406
407 rdbms_informix => {
408 req => {
409 %$rdbms_informix,
410 },
411 pod => {
412 title => 'Informix support',
413 desc => 'Modules required to connect to Informix',
414 },
8273e845 415 },
199fbc45 416
417 rdbms_sqlanywhere => {
418 req => {
419 %$rdbms_sqlanywhere,
420 },
421 pod => {
422 title => 'SQLAnywhere support',
423 desc => 'Modules required to connect to SQLAnywhere',
424 },
8273e845 425 },
199fbc45 426
427 rdbms_sqlanywhere_odbc => {
428 req => {
429 %$rdbms_sqlanywhere_odbc,
430 },
431 pod => {
432 title => 'SQLAnywhere support via DBD::ODBC',
433 desc => 'Modules required to connect to SQLAnywhere via DBD::ODBC',
434 },
8273e845 435 },
199fbc45 436
437 rdbms_firebird => {
438 req => {
439 %$rdbms_firebird,
440 },
441 pod => {
442 title => 'Firebird support',
443 desc => 'Modules required to connect to Firebird',
444 },
8273e845 445 },
199fbc45 446
447 rdbms_firebird_interbase => {
448 req => {
449 %$rdbms_firebird_interbase,
450 },
451 pod => {
452 title => 'Firebird support via DBD::InterBase',
453 desc => 'Modules required to connect to Firebird via DBD::InterBase',
454 },
8273e845 455 },
199fbc45 456
457 rdbms_firebird_odbc => {
458 req => {
459 %$rdbms_firebird_odbc,
460 },
461 pod => {
462 title => 'Firebird support via DBD::ODBC',
463 desc => 'Modules required to connect to Firebird via DBD::ODBC',
464 },
8273e845 465 },
199fbc45 466
ac50f57b 467 rdbms_ss_csv => {
468 req => {
469 %$rdbms_ss_csv,
470 },
471 pod => {
472 title => 'CSV support via DBD::CSV',
473 desc => 'Modules required to connect to CSV files via DBD::CSV',
474 },
475 },
476
477 rdbms_ss_dbm => {
478 req => {
479 %$rdbms_ss_dbm,
480 },
481 pod => {
482 title => 'ML/DBM support via DBD::DBM',
483 desc => 'Modules required to connect to DBM & MLDBM files via DBD::DBM',
484 },
485 },
486
487 rdbms_ss_po => {
488 req => {
489 %$rdbms_ss_po,
490 },
491 pod => {
492 title => 'PO support via DBD::PO',
493 desc => 'Modules required to connect to PO files via DBD::PO',
494 },
495 },
496
497 rdbms_ss_sys => {
498 req => {
499 %$rdbms_ss_sys,
500 },
501 pod => {
502 title => 'System tables interface support via DBD::Sys',
503 desc => 'Modules required to connect to system tables via DBD::Sys',
504 },
505 },
506
507 rdbms_ss_anydata => {
508 req => {
509 %$rdbms_ss_anydata,
510 },
511 pod => {
512 title => 'Abstract flat data support via DBD::AnyData',
513 desc => 'Modules required to connect to abstract flat data via DBD::AnyData',
514 },
515 },
516
517 rdbms_ss_treedata => {
518 req => {
519 %$rdbms_ss_treedata,
520 },
521 pod => {
522 title => 'Abstract tree data support via DBD::TreeData',
523 desc => 'Modules required to connect to abstract tree data via DBD::TreeData',
524 },
525 },
526
be68095d 527# the order does matter because the rdbms support group might require
528# a different version that the test group
68de9438 529 test_rdbms_pg => {
f6b26571 530 req => {
531 $ENV{DBICTEST_PG_DSN}
532 ? (
a4fc1239 533 # when changing this list make sure to adjust xt/optional_deps.t
be68095d 534 %$rdbms_pg,
b9d84a2d 535 ($^O ne 'MSWin32' ? ('Sys::SigAction' => '0') : ()),
f6b26571 536 'DBD::Pg' => '2.009002',
f6b26571 537 ) : ()
538 },
8057ed01 539 },
540
afae8507 541 test_rdbms_mssql_odbc => {
542 req => {
543 $ENV{DBICTEST_MSSQL_ODBC_DSN}
544 ? (
be68095d 545 %$rdbms_mssql_odbc,
afae8507 546 ) : ()
547 },
548 },
549
56dca25f 550 test_rdbms_mssql_ado => {
551 req => {
552 $ENV{DBICTEST_MSSQL_ADO_DSN}
553 ? (
554 %$rdbms_mssql_ado,
555 ) : ()
556 },
557 },
558
afae8507 559 test_rdbms_mssql_sybase => {
560 req => {
561 $ENV{DBICTEST_MSSQL_DSN}
562 ? (
be68095d 563 %$rdbms_mssql_sybase,
afae8507 564 ) : ()
565 },
566 },
567
726c8f65 568 test_rdbms_msaccess_odbc => {
569 req => {
570 $ENV{DBICTEST_MSACCESS_ODBC_DSN}
571 ? (
572 %$rdbms_msaccess_odbc,
573 %$datetime_basic,
574 'Data::GUID' => '0',
575 ) : ()
576 },
577 },
578
579 test_rdbms_msaccess_ado => {
580 req => {
581 $ENV{DBICTEST_MSACCESS_ADO_DSN}
582 ? (
583 %$rdbms_msaccess_ado,
584 %$datetime_basic,
585 'Data::GUID' => 0,
586 ) : ()
587 },
588 },
589
68de9438 590 test_rdbms_mysql => {
f6b26571 591 req => {
592 $ENV{DBICTEST_MYSQL_DSN}
593 ? (
be68095d 594 %$rdbms_mysql,
f6b26571 595 ) : ()
596 },
8057ed01 597 },
598
68de9438 599 test_rdbms_oracle => {
f6b26571 600 req => {
601 $ENV{DBICTEST_ORA_DSN}
602 ? (
be68095d 603 %$rdbms_oracle,
f6b26571 604 'DateTime::Format::Oracle' => '0',
e1b7e9b4 605 'DBD::Oracle' => '1.24',
f6b26571 606 ) : ()
607 },
8057ed01 608 },
609
68de9438 610 test_rdbms_ase => {
f6b26571 611 req => {
612 $ENV{DBICTEST_SYBASE_DSN}
613 ? (
be68095d 614 %$rdbms_ase,
f6b26571 615 ) : ()
616 },
8057ed01 617 },
618
68de9438 619 test_rdbms_db2 => {
f58a165c 620 req => {
621 $ENV{DBICTEST_DB2_DSN}
622 ? (
be68095d 623 %$rdbms_db2,
f58a165c 624 ) : ()
625 },
626 },
627
199fbc45 628 test_rdbms_db2_400 => {
629 req => {
630 $ENV{DBICTEST_DB2_400_DSN}
631 ? (
632 %$rdbms_db2_400,
633 ) : ()
634 },
635 },
636
637 test_rdbms_informix => {
638 req => {
639 $ENV{DBICTEST_INFORMIX_DSN}
640 ? (
641 %$rdbms_informix,
642 ) : ()
643 },
644 },
645
646 test_rdbms_sqlanywhere => {
647 req => {
648 $ENV{DBICTEST_SQLANYWHERE_DSN}
649 ? (
650 %$rdbms_sqlanywhere,
651 ) : ()
652 },
653 },
654
655 test_rdbms_sqlanywhere_odbc => {
656 req => {
657 $ENV{DBICTEST_SQLANYWHERE_ODBC_DSN}
658 ? (
659 %$rdbms_sqlanywhere_odbc,
660 ) : ()
661 },
662 },
663
664 test_rdbms_firebird => {
665 req => {
666 $ENV{DBICTEST_FIREBIRD_DSN}
667 ? (
668 %$rdbms_firebird,
669 ) : ()
670 },
671 },
672
673 test_rdbms_firebird_interbase => {
674 req => {
675 $ENV{DBICTEST_FIREBIRD_INTERBASE_DSN}
676 ? (
677 %$rdbms_firebird_interbase,
678 ) : ()
679 },
680 },
681
e02b39b4 682 test_rdbms_firebird_odbc => {
683 req => {
684 $ENV{DBICTEST_FIREBIRD_ODBC_DSN}
685 ? (
686 %$rdbms_firebird_odbc,
687 ) : ()
688 },
689 },
690
ac50f57b 691 test_rdbms_ss_csv => {
692 req => {
693 %$rdbms_ss_csv,
694 },
695 },
696
697 test_rdbms_ss_dbm => {
698 req => {
699 %$rdbms_ss_dbm,
700 },
701 },
702
703 test_rdbms_ss_po => {
704 req => {
705 $ENV{DBICTEST_DBD_PO}
706 ? (
707 %$rdbms_ss_po,
708 ) : ()
709 },
710 },
711
712 test_rdbms_ss_sys => {
713 req => {
714 $ENV{DBICTEST_DBD_SYS}
715 ? (
716 %$rdbms_ss_sys,
717 ) : ()
718 },
719 },
720
721 test_rdbms_ss_anydata => {
722 req => {
723 $ENV{DBICTEST_DBD_ANYDATA}
724 ? (
725 %$rdbms_ss_anydata,
726 ) : ()
727 },
728 },
729
730 test_rdbms_ss_treedata => {
731 req => {
732 $ENV{DBICTEST_DBD_TREEDATA}
733 ? (
734 %$rdbms_ss_treedata,
735 ) : ()
736 },
737 },
738
42168332 739 test_memcached => {
740 req => {
741 $ENV{DBICTEST_MEMCACHED}
742 ? (
743 'Cache::Memcached' => 0,
744 ) : ()
745 },
746 },
747
344f1f52 748 dist_dir => {
749 req => {
b81d8515 750 'ExtUtils::MakeMaker' => '6.64',
751 'Pod::Inherit' => '0.90',
752 'Pod::Tree' => '0',
344f1f52 753 }
754 },
755
756 dist_upload => {
757 req => {
758 'CPAN::Uploader' => '0.103001',
759 },
760 },
761
8057ed01 762};
763
344f1f52 764our %req_availability_cache;
f6b26571 765
fb39747c 766sub req_list_for {
767 my ($class, $group) = @_;
768
9c1700e3 769 Carp::croak "req_list_for() expects a requirement group name"
fb39747c 770 unless $group;
771
f6b26571 772 my $deps = $reqs->{$group}{req}
9c1700e3 773 or Carp::croak "Requirement group '$group' does not exist";
fb39747c 774
775 return { %$deps };
776}
777
778
344f1f52 779sub die_unless_req_ok_for {
780 my ($class, $group) = @_;
781
782 Carp::croak "die_unless_req_ok_for() expects a requirement group name"
783 unless $group;
784
785 $class->_check_deps($group)->{status}
786 or die sprintf( "Required modules missing, unable to continue: %s\n", $class->_check_deps($group)->{missing} );
787}
788
fb39747c 789sub req_ok_for {
790 my ($class, $group) = @_;
791
9c1700e3 792 Carp::croak "req_ok_for() expects a requirement group name"
fb39747c 793 unless $group;
794
d8799bab 795 return $class->_check_deps($group)->{status};
fb39747c 796}
797
798sub req_missing_for {
799 my ($class, $group) = @_;
800
9c1700e3 801 Carp::croak "req_missing_for() expects a requirement group name"
fb39747c 802 unless $group;
803
d8799bab 804 return $class->_check_deps($group)->{missing};
fb39747c 805}
806
807sub req_errorlist_for {
808 my ($class, $group) = @_;
809
9c1700e3 810 Carp::croak "req_errorlist_for() expects a requirement group name"
fb39747c 811 unless $group;
812
d8799bab 813 return $class->_check_deps($group)->{errorlist};
fb39747c 814}
815
816sub _check_deps {
817 my ($class, $group) = @_;
818
d8799bab 819 return $req_availability_cache{$group} ||= do {
820
821 my $deps = $class->req_list_for ($group);
822
823 my %errors;
824 for my $mod (keys %$deps) {
825 my $req_line = "require $mod;";
826 if (my $ver = $deps->{$mod}) {
827 $req_line .= "$mod->VERSION($ver);";
828 }
829
830 eval $req_line;
831
832 $errors{$mod} = $@ if $@;
833 }
834
835 my $res;
fb39747c 836
d8799bab 837 if (keys %errors) {
838 my $missing = join (', ', map { $deps->{$_} ? "$_ >= $deps->{$_}" : $_ } (sort keys %errors) );
839 $missing .= " (see $class for details)" if $reqs->{$group}{pod};
840 $res = {
841 status => 0,
842 errorlist => \%errors,
843 missing => $missing,
844 };
fb39747c 845 }
846 else {
d8799bab 847 $res = {
848 status => 1,
849 errorlist => {},
850 missing => '',
851 };
fb39747c 852 }
853
d8799bab 854 $res;
855 };
fb39747c 856}
857
e3fc11e1 858sub req_group_list {
859 return { map { $_ => { %{ $reqs->{$_}{req} || {} } } } (keys %$reqs) };
860}
861
862# This is to be called by the author only (automatically in Makefile.PL)
f6b26571 863sub _gen_pod {
47589465 864 my ($class, $distver, $pod_dir) = @_;
31fa1764 865
47589465 866 die "No POD root dir supplied" unless $pod_dir;
31fa1764 867
ccebe1f1 868 $distver ||=
31fa1764 869 eval { require DBIx::Class; DBIx::Class->VERSION; }
870 ||
ccebe1f1 871 die
31fa1764 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 ' .
875"halted\n\n" . $@ .
876"\n\n---------------------------------------------------------------------\n"
31fa1764 877 ;
878
3d4c5a84 879 # do not ask for a recent version, use 1.x API calls
47589465 880 # this *may* execute on a smoker with old perl or whatnot
881 require File::Path;
882
883 (my $modfn = __PACKAGE__ . '.pm') =~ s|::|/|g;
884
885 (my $podfn = "$pod_dir/$modfn") =~ s/\.pm$/\.pod/;
886 (my $dir = $podfn) =~ s|/[^/]+$||;
887
888 File::Path::mkpath([$dir]);
889
e3fc11e1 890 my $sqltver = $class->req_list_for ('deploy')->{'SQL::Translator'}
891 or die "Hrmm? No sqlt dep?";
7e3dc46f 892
f6b26571 893 my @chunks = (
6343a203 894 <<"EOC",
af4ac504 895#########################################################################
896##################### A U T O G E N E R A T E D ########################
897#########################################################################
898#
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
902#
903EOC
f6b26571 904 '=head1 NAME',
7e3dc46f 905 "$class - Optional module dependency specifications (for module authors)",
e3fc11e1 906 '=head1 SYNOPSIS',
d8799bab 907 <<"EOS",
7e3dc46f 908Somewhere in your build-file (e.g. L<Module::Install>'s Makefile.PL):
909
910 ...
911
912 configure_requires 'DBIx::Class' => '$distver';
913
914 require $class;
915
be68095d 916 my \$deploy_deps = $class->req_list_for('deploy');
7e3dc46f 917
918 for (keys %\$deploy_deps) {
919 requires \$_ => \$deploy_deps->{\$_};
920 }
921
922 ...
923
924Note that there are some caveats regarding C<configure_requires()>, more info
925can be found at L<Module::Install/configure_requires>
926EOS
f6b26571 927 '=head1 DESCRIPTION',
928 <<'EOD',
929Some of the less-frequently used features of L<DBIx::Class> have external
930module dependencies on their own. In order not to burden the average user
931with modules he will never use, these optional dependencies are not included
932in the base Makefile.PL. Instead an exception with a descriptive message is
933thrown when a specific feature is missing one or several modules required for
934its operation. This module is the central holding place for the current list
7e3dc46f 935of such dependencies, for DBIx::Class core authors, and DBIx::Class extension
936authors alike.
f6b26571 937EOD
938 '=head1 CURRENT REQUIREMENT GROUPS',
939 <<'EOD',
940Dependencies are organized in C<groups> and each group can list one or more
941required modules, with an optional minimum version (or 0 for any version).
ecb68746 942The group name can be used in the
f6b26571 943EOD
944 );
945
946 for my $group (sort keys %$reqs) {
947 my $p = $reqs->{$group}{pod}
948 or next;
949
950 my $modlist = $reqs->{$group}{req}
951 or next;
952
953 next unless keys %$modlist;
954
955 push @chunks, (
956 "=head2 $p->{title}",
957 "$p->{desc}",
958 '=over',
959 ( map { "=item * $_" . ($modlist->{$_} ? " >= $modlist->{$_}" : '') } (sort keys %$modlist) ),
960 '=back',
961 "Requirement group: B<$group>",
962 );
963 }
964
965 push @chunks, (
966 '=head1 METHODS',
e3fc11e1 967 '=head2 req_group_list',
968 '=over',
d8799bab 969 '=item Arguments: none',
fb13a49f 970 '=item Return Value: \%list_of_requirement_groups',
e3fc11e1 971 '=back',
d8799bab 972 <<'EOD',
e3fc11e1 973This method should be used by DBIx::Class packagers, to get a hashref of all
974dependencies keyed by dependency group. Each key (group name) can be supplied
975to one of the group-specific methods below.
976EOD
977
f6b26571 978 '=head2 req_list_for',
979 '=over',
980 '=item Arguments: $group_name',
fb13a49f 981 '=item Return Value: \%list_of_module_version_pairs',
f6b26571 982 '=back',
d8799bab 983 <<'EOD',
f6b26571 984This method should be used by DBIx::Class extension authors, to determine the
7e3dc46f 985version of modules a specific feature requires in the B<current> version of
e3fc11e1 986DBIx::Class. See the L</SYNOPSIS> for a real-world
7e3dc46f 987example.
f6b26571 988EOD
989
990 '=head2 req_ok_for',
991 '=over',
992 '=item Arguments: $group_name',
fb13a49f 993 '=item Return Value: 1|0',
f6b26571 994 '=back',
d8799bab 995 <<'EOD',
996Returns true or false depending on whether all modules required by
997C<$group_name> are present on the system and loadable.
998EOD
f6b26571 999
1000 '=head2 req_missing_for',
1001 '=over',
1002 '=item Arguments: $group_name',
fb13a49f 1003 '=item Return Value: $error_message_string',
f6b26571 1004 '=back',
d8799bab 1005 <<"EOD",
f6b26571 1006Returns a single line string suitable for inclusion in larger error messages.
1007This method would normally be used by DBIx::Class core-module author, to
1008indicate to the user that he needs to install specific modules before he will
1009be able to use a specific feature.
1010
e3fc11e1 1011For example if some of the requirements for C<deploy> are not available,
1012the returned string could look like:
f6b26571 1013
e3fc11e1 1014 SQL::Translator >= $sqltver (see $class for details)
f6b26571 1015
1016The author is expected to prepend the necessary text to this message before
1017returning the actual error seen by the user.
1018EOD
1019
344f1f52 1020 '=head2 die_unless_req_ok_for',
1021 '=over',
1022 '=item Arguments: $group_name',
1023 '=back',
1024 <<'EOD',
1025Checks if L</req_ok_for> passes for the supplied C<$group_name>, and
1026in case of failure throws an exception including the information
1027from L</req_missing_for>.
1028EOD
1029
f6b26571 1030 '=head2 req_errorlist_for',
1031 '=over',
1032 '=item Arguments: $group_name',
fb13a49f 1033 '=item Return Value: \%list_of_loaderrors_per_module',
f6b26571 1034 '=back',
1035 <<'EOD',
1036Returns a hashref containing the actual errors that occured while attempting
1037to load each module in the requirement group.
1038EOD
fb8ae353 1039 '=head1 AUTHOR',
1040 'See L<DBIx::Class/CONTRIBUTORS>.',
1041 '=head1 LICENSE',
1042 'You may distribute this code under the same terms as Perl itself',
f6b26571 1043 );
1044
9c1700e3 1045 open (my $fh, '>', $podfn) or Carp::croak "Unable to write to $podfn: $!";
f6b26571 1046 print $fh join ("\n\n", @chunks);
47589465 1047 print $fh "\n";
f6b26571 1048 close ($fh);
1049}
1050
8057ed01 10511;