aa4701ffa6c2526e537bb2e5b3382115bff23565
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Optional / Dependencies.pm
1 package DBIx::Class::Optional::Dependencies;
2
3 use warnings;
4 use strict;
5
6 use Carp;
7
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
10
11 my $reqs = {
12   dist => {
13     #'Module::Install::Pod::Inherit' => '0.01',
14   },
15
16   replicated => {
17     'Moose'                     => '0.98',
18     'MooseX::Types'             => '0.21',
19     'namespace::clean'          => '0.11',
20     'Hash::Merge'               => '0.11',
21   },
22
23   admin => {
24   },
25
26   deploy => {
27     'SQL::Translator'           => '0.11002',
28   },
29
30   author => {
31     'Test::Pod'                 => '1.26',
32     'Test::Pod::Coverage'       => '1.08',
33     'Pod::Coverage'             => '0.20',
34     #'Test::NoTabs'              => '0.9',
35     #'Test::EOL'                 => '0.6',
36   },
37
38   core => {
39     # t/52cycle.t
40     'Test::Memory::Cycle'       => '0',
41     'Devel::Cycle'              => '1.10',
42
43     # t/36datetime.t
44     # t/60core.t
45     'DateTime::Format::SQLite'  => '0',
46
47     # t/96_is_deteministic_value.t
48     'DateTime::Format::Strptime'=> '0',
49   },
50
51   cdbicompat => {
52     'DBIx::ContextualFetch'     => '0',
53     'Class::DBI::Plugin::DeepAbstractSearch' => '0',
54     'Class::Trigger'            => '0',
55     'Time::Piece::MySQL'        => '0',
56     'Clone'                     => '0',
57     'Date::Simple'              => '3.03',
58   },
59
60   rdbms_pg => {
61     $ENV{DBICTEST_PG_DSN}
62       ? (
63         'Sys::SigAction'        => '0',
64         'DBD::Pg'               => '2.009002',
65         'DateTime::Format::Pg'  => '0',
66       ) : ()
67   },
68
69   rdbms_mysql => {
70     $ENV{DBICTEST_MYSQL_DSN}
71       ? (
72         'DateTime::Format::MySQL' => '0',
73         'DBD::mysql'              => '0',
74       ) : ()
75   },
76
77   rdbms_oracle => {
78
79     $ENV{DBICTEST_ORA_DSN}
80       ? (
81         'DateTime::Format::Oracle' => '0',
82       ) : ()
83   },
84
85   rdbms_ase => {
86     $ENV{DBICTEST_SYBASE_DSN}
87       ? (
88         'DateTime::Format::Sybase' => 0,
89       ) : ()
90   },
91
92   rdbms_asa => {
93     grep $_, @ENV{qw/DBICTEST_SYBASE_ASA_DSN DBICTEST_SYBASE_ASA_ODBC_DSN/}
94       ? (
95         'DateTime::Format::Strptime' => 0,
96       ) : ()
97   },
98 };
99
100 sub all_optional_requirements {
101   return { map { %{ $_ || {} } } (values %$reqs) };
102 }
103
104 sub req_list_for {
105   my ($class, $group) = @_;
106
107   die "req_list_for() expects a requirement group name"
108     unless $group;
109
110   my $deps = $reqs->{$group}
111     or die "Requirement group '$group' does not exist";
112
113   return { %$deps };
114 }
115
116
117 our %req_availability_cache;
118 sub req_ok_for {
119   my ($class, $group) = @_;
120
121   croak "req_ok_for() expects a requirement group name"
122     unless $group;
123
124   $class->_check_deps ($group) unless $req_availability_cache{$group};
125
126   return $req_availability_cache{$group}{status};
127 }
128
129 sub req_missing_for {
130   my ($class, $group) = @_;
131
132   croak "req_missing_for() expects a requirement group name"
133     unless $group;
134
135   $class->_check_deps ($group) unless $req_availability_cache{$group};
136
137   return $req_availability_cache{$group}{missing};
138 }
139
140 sub req_errorlist_for {
141   my ($class, $group) = @_;
142
143   croak "req_errorlist_for() expects a requirement group name"
144     unless $group;
145
146   $class->_check_deps ($group) unless $req_availability_cache{$group};
147
148   return $req_availability_cache{$group}{errorlist};
149 }
150
151 sub _check_deps {
152   my ($class, $group) = @_;
153
154   my $deps = $reqs->{$group}
155     or croak "Requirement group '$group' does not exist";
156
157   my %errors;
158   for my $mod (keys %$deps) {
159     if (my $ver = $deps->{$mod}) {
160       eval "use $mod $ver ()";
161     }
162     else {
163       eval "require $mod";
164     }
165
166     $errors{$mod} = $@ if $@;
167   }
168
169   if (keys %errors) {
170     $req_availability_cache{$group} = {
171       status => 0,
172       errorlist => { %errors },
173       missing => join (', ', map { $deps->{$_} ? "$_ >= $deps->{$_}" : $_ } (sort keys %errors) ),
174     };
175   }
176   else {
177     $req_availability_cache{$group} = {
178       status => 1,
179       errorlist => {},
180       missing => '',
181     };
182   }
183 }
184
185 1;