Move replicated to Opt::Deps
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Optional / Dependencies.pm
CommitLineData
8057ed01 1package DBIx::Class::Optional::Dependencies;
2
3use warnings;
4use strict;
5
fb39747c 6use Carp;
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
11my $reqs = {
12 dist => {
13 #'Module::Install::Pod::Inherit' => '0.01',
14 },
15
16 replicated => {
fb39747c 17 'Moose' => '0.98',
18 'MooseX::Types' => '0.21',
8057ed01 19 'namespace::clean' => '0.11',
fb39747c 20 'Hash::Merge' => '0.11',
8057ed01 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
100sub all_optional_requirements {
101 return { map { %{ $_ || {} } } (values %$reqs) };
102}
103
fb39747c 104sub 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
117our %req_availability_cache;
118sub 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
129sub 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
140sub 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
151sub _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
8057ed01 1851;