File Coverage

blib/lib/Beam/Minion/Util.pm
Criterion Covered Total %
statement 61 63 96.8
branch 8 12 66.6
condition n/a
subroutine 14 14 100.0
pod 3 3 100.0
total 86 92 93.4


line stmt bran cond sub pod time code
1             package Beam::Minion::Util;
2             our $VERSION = '0.015';
3             # ABSTRACT: Utility functions for Beam::Minion
4              
5             #pod =head1 SYNOPSIS
6             #pod
7             #pod use Beam::Minion::Util qw( minion );
8             #pod
9             #pod my $minion = minion();
10             #pod my %attrs = minion_attrs();
11             #pod
12             #pod =head1 DESCRIPTION
13             #pod
14             #pod This module contains helper routines for L.
15             #pod
16             #pod =head1 SEE ALSO
17             #pod
18             #pod L
19             #pod
20             #pod =cut
21              
22 4     4   68366 use strict;
  4         19  
  4         131  
23 4     4   21 use warnings;
  4         6  
  4         112  
24 4     4   29 use Exporter qw( import );
  4         16  
  4         150  
25 4     4   1795 use Minion;
  4         779369  
  4         36  
26 4     4   2104 use Beam::Runner::Util qw( find_containers );
  4         49513  
  4         248  
27 4     4   37 use Scalar::Util qw( weaken );
  4         7  
  4         185  
28 4     4   2251 use Mojolicious;
  4         602738  
  4         48  
29 4     4   178 use Mojo::Log;
  4         10  
  4         36  
30 4     4   2613 use Beam::Wire;
  4         1887430  
  4         2661  
31              
32              
33             our @EXPORT_OK = qw( minion_init_args minion build_mojo_app );
34              
35             our %BACKEND = (
36             sqlite => 'SQLite',
37             postgres => 'Pg',
38             mongodb => 'MongoDB',
39             mysql => 'mysql',
40             );
41              
42             #pod =sub minion_init_args
43             #pod
44             #pod my %args = minion_init_args();
45             #pod
46             #pod Get the arguments needed to initialize a new Minion instance by parsing
47             #pod the C environment variable.
48             #pod
49             #pod This environment variable can take a few forms:
50             #pod
51             #pod =over
52             #pod
53             #pod =item
54             #pod
55             #pod A simple backend URL like C,
56             #pod C, C, or
57             #pod C. The following backends are supported:
58             #pod L, L,
59             #pod L, L.
60             #pod
61             #pod =item +
62             #pod
63             #pod A backend name and arguments, separated by C<+>, like
64             #pod C. Any backend may be used this way.
65             #pod
66             #pod If your backend requires more arguments, you can separate them with
67             #pod C<+>:
68             #pod
69             #pod # Configure the MySQL backend with a DBI DSN
70             #pod BEAM_MINION=mysql+dsn+dbi:mysql:minion
71             #pod
72             #pod =back
73             #pod
74             #pod =cut
75              
76             sub minion_init_args {
77             die "You must set the BEAM_MINION environment variable to the Minion database URL.\n"
78             . "See `perldoc Beam::Minion` for getting started instructions.\n"
79 12 100   12 1 2700 unless $ENV{BEAM_MINION};
80 9         43 my ( $backend, $url );
81 9 100       54 if ( $ENV{BEAM_MINION} =~ /^[^+:]+\+/ ) {
82 1         5 my @args = split /\+/, $ENV{BEAM_MINION};
83 1         18 return @args;
84             }
85 8         74 my ( $schema ) = $ENV{BEAM_MINION} =~ /^([^:]+)/;
86 8         87 return $BACKEND{ $schema }, $ENV{BEAM_MINION};
87             }
88              
89             #pod =sub minion
90             #pod
91             #pod my $minion = minion();
92             #pod
93             #pod Get a L instance as configured by the C environment
94             #pod variable (parsed by L).
95             #pod
96             #pod =cut
97              
98             sub minion {
99 7     7 1 46 return Minion->new( minion_init_args );
100             }
101              
102             #pod =sub build_mojo_app
103             #pod
104             #pod Build the L app that contains the L plugin
105             #pod (L) and tasks. This can then be given to
106             #pod one of the L classes to execute commands.
107             #pod
108             #pod =cut
109              
110             sub build_mojo_app {
111 4     4 1 60 my $app = Mojolicious->new(
112             log => Mojo::Log->new, # Log to STDERR
113             );
114              
115 4         56584 push @{$app->commands->namespaces}, 'Minion::Command';
  4         19  
116              
117 4         341 my $minion = minion();
118 2     2   157585 $app->helper(minion => sub {$minion});
  2         2669  
119              
120 2         276 my %container = find_containers();
121 2         1550 for my $container_name ( keys %container ) {
122 2         7 my $path = $container{ $container_name };
123 2         21 my $wire = Beam::Wire->new( file => $path );
124 2         86876 my $config = $wire->config;
125 2         23 for my $service_name ( keys %$config ) {
126 8 50       94 next unless $wire->is_meta( $config->{ $service_name }, 1 );
127             $minion->add_task( "$container_name:$service_name" => sub {
128 1     1   5510 my ( $job, @args ) = @_;
129 1         76 my $wire = Beam::Wire->new( file => $path );
130              
131 1         13873 my $obj = eval { $wire->get( $service_name, lifecycle => 'factory' ) };
  1         18  
132 1 50       5100 if ( $@ ) {
133 0         0 return $job->fail( { error => $@ } );
134             }
135              
136 1         6 my $exit = eval { $obj->run( @args ) };
  1         13  
137 1 50       17 if ( my $err = $@ ) {
138 0         0 return $job->fail( { error => $err } );
139             }
140              
141 1 50       16 my $method = $exit ? 'fail' : 'finish';
142 1         23 $job->$method( { exit => $exit } );
143 8         683 } );
144             }
145 2         45 undef $wire;
146             }
147              
148 2         49 return $app;
149             }
150              
151             1;
152              
153             __END__