Completed
Push — develop ( a26eb8...901acc )
by Baptiste
02:51
created

CsvWriter   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 61
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 9

Test Coverage

Coverage 96.55%

Importance

Changes 0
Metric Value
wmc 6
lcom 1
cbo 9
dl 0
loc 61
ccs 28
cts 29
cp 0.9655
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 9 2
A write() 0 19 2
B buildFile() 0 25 2
1
<?php
2
declare(strict_types = 1);
3
4
namespace Spreadsheet\Writer;
5
6
use Spreadsheet\{
7
    SpreadsheetInterface,
8
    Exception\InvalidArgumentException,
9
    SheetInterface,
10
    RowInterface,
11
    File\Csv
12
};
13
use Innmind\Filesystem\{
14
    FileInterface,
15
    Directory,
16
    Stream\Stream
17
};
18
19
final class CsvWriter implements WriterInterface
20
{
21
    private $delimiter;
22
    private $withHeader;
23
24 4
    public function __construct(string $delimiter, bool $withHeader)
25
    {
26 4
        if (empty($delimiter)) {
27
            throw new InvalidArgumentException;
28
        }
29
30 4
        $this->delimiter = $delimiter;
31 4
        $this->withHeader = $withHeader;
32 4
    }
33
34 3
    public function write(SpreadsheetInterface $spreadsheet): FileInterface
35
    {
36
        $directory = $spreadsheet
37 3
            ->sheets()
38 3
            ->reduce(
39 3
                new Directory($spreadsheet->name()),
40
                function(Directory $carry, string $name, SheetInterface $sheet): Directory {
41 3
                    return $carry->add($this->buildFile($sheet));
42 3
                }
43
            );
44
45 3
        if ($directory->count() === 1) {
46 2
            return $directory->get(
47 2
                $spreadsheet->sheets()->values()->first()->name().'.csv'
48
            );
49
        }
50
51 1
        return $directory;
52
    }
53
54 3
    private function buildFile(SheetInterface $sheet): FileInterface
55
    {
56 3
        $csv = fopen('php://temp', 'r+');
57
58 3
        if ($this->withHeader) {
59 2
            fputcsv($csv, $sheet->columns()->keys()->toPrimitive(), $this->delimiter);
60
        }
61
62
        $sheet
63 3
            ->rows()
64 3
            ->reduce(
65
                $csv,
66 3
                function($carry, $identifier, RowInterface $row) {
67 3
                    fputcsv(
68
                        $carry,
69 3
                        $row->cells()->values()->toPrimitive(),
70 3
                        $this->delimiter
71
                    );
72
73 3
                    return $carry;
74 3
                }
75
            );
76
77 3
        return new Csv($sheet->name(), new Stream($csv));
78
    }
79
}
80