File Coverage

blib/lib/Bubblegum/Functions.pm
Criterion Covered Total %
statement 69 111 62.1
branch 0 20 0.0
condition 1 14 7.1
subroutine 23 41 56.1
pod 19 19 100.0
total 112 205 54.6


line stmt bran cond sub pod time code
1             # ABSTRACT: Experimental Function Library for Bubblegum
2             package Bubblegum::Functions;
3              
4 1     1   1836265 use 5.10.0;
  1         4  
  1         54  
5              
6 1     1   6 use strict;
  1         2  
  1         38  
7 1     1   480622 use utf8::all;
  1         163807  
  1         11  
8 1     1   16461 use warnings;
  1         3  
  1         27  
9              
10 1     1   335723 use Bubblegum;
  1         50788  
  1         7  
11 1     1   2205349 use Bubblegum::Exception;
  1         2  
  1         31  
12 1     1   7 use Try::Tiny;
  1         2  
  1         80  
13              
14 1     1   6 use Class::Load ();
  1         2  
  1         15  
15 1     1   4 use Cwd ();
  1         2  
  1         13  
16 1     1   6 use Data::Dumper ();
  1         1  
  1         15  
17 1     1   5581 use DateTime::Tiny ();
  1         964  
  1         19  
18 1     1   999 use File::Find::Rule ();
  1         14953  
  1         29  
19 1     1   2443 use File::HomeDir ();
  1         14029  
  1         89  
20 1     1   22 use File::Spec ();
  1         2  
  1         11  
21 1     1   5 use File::Which ();
  1         2  
  1         11  
22 1     1   1217 use Path::Tiny ();
  1         10557  
  1         33  
23 1     1   59183 use Time::Format ();
  1         3287  
  1         27  
24 1     1   1148 use Time::ParseDate ();
  1         13582  
  1         34  
25 1     1   10771 use Type::Params ();
  1         22213  
  1         37  
26 1     1   13 use Types::Standard ();
  1         2  
  1         26  
27              
28 1     1   1825 use Hash::Merge::Simple 'merge';
  1         604  
  1         82  
29              
30 1     1   7 use base 'Exporter::Tiny';
  1         1  
  1         2195  
31              
32             our $VERSION = '0.04'; # VERSION
33              
34             our @EXPORT_OK = qw(
35             cwd
36             date
37             date_epoch
38             date_format
39             dump
40             file
41             find
42             here
43             home
44             load
45             merge
46             path
47             quote
48             raise
49             script
50             unquote
51             user
52             user_info
53             which
54             will
55             );
56              
57             sub cwd {
58 0     0 1 0 return Path::Tiny->cwd;
59             }
60              
61             sub date {
62 0   0 0 1 0 my $input = shift || 'now';
63 0         0 my $epoch = date_epoch($input, @_);
64 0 0       0 my $date = date_format($epoch) or return;
65 0         0 DateTime::Tiny->from_string($date);
66             }
67              
68             sub date_epoch {
69 0   0 0 1 0 my $input = shift || 'now';
70 0         0 my $epoch = [Time::ParseDate::parsedate $input, @_];
71 0   0     0 return $epoch->first || undef;
72             }
73              
74             sub date_format {
75 0 0   0 1 0 my $epoch = shift or return;
76 0   0     0 my $format = shift || 'yyyy-mm-ddThh:mm:ss';
77             # my $format = shift || 'yyyy-mm{on}-dd hh:mm{in}:ss tz'; # not atm
78 0         0 return Time::Format::time_format $format, $epoch;
79             }
80              
81             sub dump {
82 0     0 1 0 return Data::Dumper->new([shift])
83             ->Indent(1)->Sortkeys(1)->Terse(1)->Dump
84             }
85              
86             sub file {
87 0     0 1 0 goto &path;
88             }
89              
90             sub find {
91 0 0   0 1 0 my $spec = $_[-1] !~ /\*/ ? '*.*' : pop;
92 0         0 my $path = path(@_);
93 0         0 return [ map { path($_) }
  0         0  
94             File::Find::Rule->file()->name($spec)->in($path) ];
95             }
96              
97             sub here {
98 0     0 1 0 return path(
99             File::Spec->rel2abs(
100             join '', (File::Spec->splitpath((caller 1)[1]))[0,1]
101             )
102             );
103             }
104              
105             sub home {
106 0   0 0 1 0 my $user = $ENV{USER} // user();
107 0 0       0 my $func = $user ? 'users_home' : 'my_home';
108 0         0 return eval { path(File::HomeDir->can($func)->($user)) };
  0         0  
109             }
110              
111             sub load {
112 0     0 1 0 return Class::Load::load_class(@_);
113             }
114              
115             sub path {
116 0     0 1 0 return Path::Tiny::path(@_);
117             }
118              
119             sub quote {
120 0     0 1 0 my $string = shift;
121 0 0       0 return unless defined $string;
122 0         0 $string =~ s/(["\\])/\\$1/g;
123 0         0 return qq{"$string"};
124             }
125              
126             sub raise {
127 1     1 1 9980 my $class = 'Bubblegum::Exception';
128 1   33     34 @_ = ($class, message => shift // $@, data => shift);
129 1         41 goto $class->can('throw');
130             }
131              
132             sub script {
133 0     0 1   return file($0);
134             }
135              
136             sub unquote {
137 0     0 1   my $string = shift;
138 0 0         return unless defined $string;
139 0 0         return $string unless $string =~ s/^"(.*)"$/$1/g;
140 0           $string =~ s/\\\\/\\/g;
141 0           $string =~ s/\\"/"/g;
142 0           return $string;
143             }
144              
145             sub user {
146 0     0 1   return user_info()->first;
147             }
148              
149             sub user_info {
150 0     0 1   return [eval '(getpwuid $>)'];
151             }
152              
153             sub which {
154 0     0 1   return path(File::Which::which(@_));
155             }
156              
157             sub will {
158             return eval
159 0 0         sprintf 'sub {%s}', join ';',
160 0 0         map { /^\s*\$\w+$/ ? "my$_=shift" : "$_" }
161 0 0         map { /^\s*\@\w+$/ ? "my$_=\@_" : "$_" }
162 0     0 1   map { /^\s*\%\w+$/ ? "my$_=\@_" : "$_" }
163             split /;/, join ';', @_;
164             }
165              
166             1;
167              
168             __END__