File Coverage

lib/Redis/JobQueue/Util.pm
Criterion Covered Total %
statement 38 39 97.4
branch 10 14 71.4
condition 3 8 37.5
subroutine 9 9 100.0
pod 2 2 100.0
total 62 72 86.1


line stmt bran cond sub pod time code
1             package Redis::JobQueue::Util;
2              
3             =head1 NAME
4              
5             Redis::JobQueue::Util - String manipulation utilities.
6              
7             =head1 VERSION
8              
9             This documentation refers to C version 1.18
10              
11             =cut
12              
13             #-- Pragmas --------------------------------------------------------------------
14              
15 63     63   1380 use 5.010;
  63         142  
16 63     63   216 use strict;
  63         59  
  63         1091  
17 63     63   171 use warnings;
  63         67  
  63         2239  
18              
19             # ENVIRONMENT ------------------------------------------------------------------
20              
21             our $VERSION = '1.18';
22              
23 63         2309 use Exporter qw(
24             import
25 63     63   188 );
  63         58  
26              
27             our @EXPORT_OK = qw(
28             &format_message
29             &format_reference
30             );
31              
32             #-- load the modules -----------------------------------------------------------
33              
34 63     63   216 use overload;
  63         59  
  63         400  
35 63     63   3124 use Carp;
  63         79  
  63         2762  
36 63     63   767 use Data::Dumper ();
  63         4755  
  63         17438  
37              
38             #-- declarations ---------------------------------------------------------------
39              
40             =head1 SYNOPSIS
41              
42             use 5.010;
43             use strict;
44             use warnings;
45              
46             use Redis::CappedCollection::Util qw( format_message );
47             $string = format_message( 'Object %d loaded. Status: %s', $id, $message );
48              
49             =head1 DESCRIPTION
50              
51             String manipulation utilities.
52              
53             =cut
54              
55             #-- public functions -----------------------------------------------------------
56              
57             =head1 EXPORTED FUNCTIONS
58              
59             Use these functions by importing them into your package or by calling a fully-qualified method name.
60              
61             =cut
62              
63             =head2 format_reference
64              
65             say format_reference( $object );
66              
67             Dumps reference using preconfigured L. Produces less verbose
68             output than default L settings.
69              
70             =cut
71              
72             my $dumper;
73             my $empty_array = [];
74              
75             sub format_reference {
76 4     4 1 4 my ( $value ) = @_;
77              
78 4 100       8 unless( $dumper ) {
79 1         7 $dumper = Data::Dumper->new( $empty_array )
80             ->Indent( 0 )
81             ->Terse( 1 )
82             ->Quotekeys( 0 )
83             ->Sortkeys( 1 )
84             ->Useperl( 1 ) # XS version seems to have a bug which sometimes results in modification of original object
85             # ->Sparseseen( 1 ) # speed up since we don't use "Seen" hash
86             ;
87             }
88              
89 4         50 my $r;
90 4 50 33     9 if (
91             overload::Overloaded( $value ) &&
92             overload::Method( $value, '""' )
93             ) {
94 0         0 $r = "$value"; # force stringification
95             } else {
96 4         129 $r = $dumper->Values( [ $value ] )->Dump;
97 4         384 $dumper->Reset->Values( $empty_array );
98             }
99              
100 4         51 return $r;
101             }
102              
103             =head2 format_message
104              
105             $string = format_message( 'Object %d loaded. Status: %s', $id, $message );
106              
107             Returns string formatted using printf-style syntax.
108              
109             If there are more than one argument and the first argument contains C<%...>
110             conversions, arguments are converted to a string message using C. In this case, undefined
111             values are printed as C<< >> and references are converted to strings using L.
112              
113             =cut
114             sub format_message {
115 9   50 9 1 6019 my $format = shift // return;
116              
117 9         10 my $got = scalar @_;
118              
119 9 50 33     45 return $format unless $got && $format =~ /\%/;
120              
121 9         6 my $expected = 0;
122 9         46 while ( $format =~ /(%%|%[^%])/g ) {
123 9 50       22 next if $1 eq '%%'; # don't count escape sequence
124 9         22 ++$expected;
125             }
126              
127 9 50       12 Carp::cluck "Wrong number of arguments: $expected vs $got" unless $got == $expected;
128              
129             return sprintf $format, map {
130 9 100       12 !defined $_
  9 100       48  
131             ? ''
132             : ref $_
133             ? format_reference( $_ )
134             : $_
135             } @_;
136             }
137              
138             #-- private functions ----------------------------------------------------------
139              
140             1;
141              
142             __END__