Spreadsheet::getParser()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 6
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 3
1
<?php
2
3
namespace Linio\Component\SpreadsheetParser;
4
5
use Doctrine\Common\Inflector\Inflector;
6
use Linio\Component\SpreadsheetParser\Exception\FileNotFoundException;
7
use Linio\Component\SpreadsheetParser\Exception\InvalidFileTypeException;
8
use Linio\Component\SpreadsheetParser\Parser\ParserInterface;
9
10
class Spreadsheet
11
{
12
    const TYPE_XLSX = 'xlsx';
13
    const TYPE_CSV = 'csv';
14
15
    /**
16
     * @var ParserInterface
17
     */
18
    protected $parser;
19
20
    /**
21
     * @param $filePath
22
     * @param string $fileType
0 ignored issues
show
Documentation introduced by
Should the type for parameter $fileType not be string|null?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
23
     * @param array $options
24
     *
25
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
26
     *
27
     * @throws FileNotFoundException
28
     * @throws InvalidFileTypeException
29
     */
30
    public function __construct($filePath, $fileType = null, array $options = [])
31
    {
32
        if (!file_exists($filePath)) {
33
            throw new FileNotFoundException('File not found: ' . $filePath);
34
        }
35
36
        if (!$fileType) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $fileType of type string|null is loosely compared to false; this is ambiguous if the string can be empty. You might want to explicitly use === null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
37
            $fileType = $this->getFileExtension($filePath);
38
        }
39
40
        if (!in_array($fileType, [static::TYPE_CSV, static::TYPE_XLSX])) {
41
            throw new InvalidFileTypeException('Invalid file type: ' . $fileType);
42
        }
43
44
        $this->parser = $this->getParser($filePath, $fileType, $options);
45
    }
46
47
    /**
48
     * @return bool
49
     */
50
    public function open()
0 ignored issues
show
Coding Style introduced by
function open() does not seem to conform to the naming convention (^(?:is|has|should|may|supports)).

This check examines a number of code elements and verifies that they conform to the given naming conventions.

You can set conventions for local variables, abstract classes, utility classes, constant, properties, methods, parameters, interfaces, classes, exceptions and special methods.

Loading history...
51
    {
52
        return $this->parser->open();
53
    }
54
55
    /**
56
     * @return array|false
57
     */
58
    public function getColumnNames()
59
    {
60
        return $this->parser->getColumnNames();
61
    }
62
63
    /**
64
     * @param int $numRows
65
     *
66
     * @return array
67
     */
68
    public function getData($numRows = 0)
69
    {
70
        return $this->parser->getData($numRows);
71
    }
72
73
    /**
74
     * @return bool
75
     */
76
    public function close()
0 ignored issues
show
Coding Style introduced by
function close() does not seem to conform to the naming convention (^(?:is|has|should|may|supports)).

This check examines a number of code elements and verifies that they conform to the given naming conventions.

You can set conventions for local variables, abstract classes, utility classes, constant, properties, methods, parameters, interfaces, classes, exceptions and special methods.

Loading history...
77
    {
78
        return $this->parser->close();
79
    }
80
81
    /**
82
     * @param string $filePath
83
     * @param string $fileType
84
     * @param array $options
85
     *
86
     * @return ParserInterface
87
     */
88
    protected function getParser($filePath, $fileType, array $options = [])
89
    {
90
        $parserClass = sprintf('%s\\Parser\\%sParser', __NAMESPACE__, Inflector::classify($fileType));
91
92
        return new $parserClass($filePath, $options);
93
    }
94
95
    /**
96
     * @param string $filePath
97
     *
98
     * @return string
99
     */
100
    protected function getFileExtension($filePath)
101
    {
102
        return substr(strrchr($filePath, '.'), 1);
103
    }
104
}
105