File Coverage

blib/lib/TablesRole/Source/CSVDATA.pm
Criterion Covered Total %
statement 53 53 100.0
branch 4 6 66.6
condition n/a
subroutine 11 11 100.0
pod 0 8 0.0
total 68 78 87.1


line stmt bran cond sub pod time code
1             package TablesRole::Source::CSVDATA;
2              
3             our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
4             our $DATE = '2020-06-01'; # DATE
5             our $DIST = 'TablesRoles-Standard'; # DIST
6             our $VERSION = '0.001'; # VERSION
7              
8 1     1   412 use Role::Tiny;
  1         2  
  1         4  
9 1     1   134 use Role::Tiny::With;
  1         2  
  1         43  
10             with 'TablesRole::Spec::Basic';
11              
12             sub new {
13 1     1   5 no strict 'refs';
  1         2  
  1         428  
14 1     1 0 844 require Text::CSV_XS;
15              
16 1         15102 my $class = shift;
17              
18 1         2 my $fh = \*{"$class\::DATA"};
  1         7  
19 1         3 my $fhpos_data_begin = tell $fh;
20              
21 1         5 my $parser = Text::CSV_XS->new({binary=>1});
22              
23 1 50       139 my $columns = $parser->getline($fh)
24             or die "Can't read columns from first row of CSV";
25 1         32 my $fhpos_datarow_begin = tell $fh;
26              
27 1         9 bless {
28             fh => $fh,
29             fhpos_data_begin => $fhpos_data_begin,
30             fhpos_datarow_begin => $fhpos_datarow_begin,
31             parser => $parser,
32             columns => $columns,
33             i => 0, # iterator
34             }, $class;
35             }
36              
37             sub as_csv {
38 1     1 0 6 my $self = shift;
39              
40 1         4 my $fh = $self->{fh};
41 1         2 my $oldpos = tell $fh;
42 1         12 seek $fh, $self->{fhpos_data_begin}, 0;
43 1         19 $self->{i} = -1;
44 1         4 local $/;
45 1         26 scalar <$fh>;
46             }
47              
48             sub get_column_count {
49 1     1 0 3 my $self = shift;
50              
51 1         2 scalar @{ $self->{columns} };
  1         4  
52             }
53              
54             sub get_column_names {
55 1     1 0 2 my $self = shift;
56 1         2 @{ $self->{columns} };
  1         7  
57             }
58              
59             sub get_row_arrayref {
60 9     9 0 14 my $self = shift;
61 9         10 my $fh = $self->{fh};
62 9         171 my $row = $self->{parser}->getline($fh);
63 9 100       223 return unless $row;
64 8         14 $self->{i}++;
65 8         25 $row;
66             }
67              
68             sub get_row_count {
69 1     1 0 3 my $self = shift;
70              
71 1         2 1 while my $row = $self->get_row_arrayref;
72 1         5 $self->{i};
73             }
74              
75             sub get_row_hashref {
76 2     2 0 4 my $self = shift;
77 2         5 my $row_arrayref = $self->get_row_arrayref;
78 2 50       7 return unless $row_arrayref;
79              
80             # convert to hashref
81 2         4 my $row_hashref = {};
82 2         3 my $columns = $self->{columns};
83 2         3 for my $i (0 .. $#{$columns}) {
  2         7  
84 6         14 $row_hashref->{ $columns->[$i] } = $row_arrayref->[$i];
85             }
86 2         12 $row_hashref;
87             }
88              
89             sub reset_iterator {
90 2     2 0 5 my $self = shift;
91 2         2 my $fh = $self->{fh};
92 2         20 seek $fh, $self->{fhpos_datarow_begin}, 0;
93 2         7 $self->{i} = 0;
94             }
95              
96             1;
97             # ABSTRACT: Role to access table data from CSV in DATA section
98              
99             __END__