BrowscapOrg::setType()   A
last analyzed

Complexity

Conditions 4
Paths 4

Size

Total Lines 19
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 19
rs 9.2
cc 4
eloc 15
nc 4
nop 1
1
<?php
2
declare(strict_types=1);
3
4
namespace Crossjoin\Browscap\Source\Ini;
5
6
use Crossjoin\Browscap\Exception\SourceConditionNotSatisfiedException;
7
use Crossjoin\Browscap\Exception\SourceUnavailableException;
8
use Crossjoin\Browscap\Exception\UnexpectedValueException;
9
use Crossjoin\Browscap\Source\DownloadAbstract;
10
use Crossjoin\Browscap\Source\SourceFactoryInterface;
11
use Crossjoin\Browscap\Source\SourceInterface;
12
use Crossjoin\Browscap\Type;
13
14
/**
15
 * Class BrowscapOrg
16
 *
17
 * @package Crossjoin\Browscap\Source\Ini
18
 * @author Christoph Ziegenberg <[email protected]>
19
 * @link https://github.com/crossjoin/browscap
20
 */
21
class BrowscapOrg extends DownloadAbstract implements SourceInterface, SourceFactoryInterface
22
{
23
    use DataSetsFromContentTrait { getContent as private getContentIgnore; }
24
25
    const BASE_URI = 'http://browscap.org';
26
27
    /**
28
     * @var int
29
     */
30
    protected $type;
31
32
    /**
33
     * BrowscapOrg constructor.
34
     *
35
     * @param int $type
36
     * @param array $clientOptions
37
     *
38
     * @throws SourceConditionNotSatisfiedException
39
     * @throws UnexpectedValueException
40
     */
41
    public function __construct(int $type = Type::STANDARD, array $clientOptions = [])
42
    {
43
        $this->setType($type);
44
        parent::__construct($this->getSourceUri(), $clientOptions);
45
    }
46
47
    /**
48
     * @inheritdoc
49
     *
50
     * @throws SourceUnavailableException
51
     * @throws \RuntimeException
52
     */
53
    public function getReleaseTime() : int
54
    {
55
        $stream = $this->loadContent(self::BASE_URI . '/version');
56
57
        if (!$stream->isReadable()) {
58
            throw new SourceUnavailableException('Source stream is not readable.', 1459162265);
59
        }
60
61
        return max(0, strtotime($stream->getContents()));
62
    }
63
64
    /**
65
     * @inheritdoc
66
     *
67
     * @throws SourceUnavailableException
68
     * @throws \RuntimeException
69
     */
70
    public function getVersion() : int
71
    {
72
        $stream = $this->loadContent(self::BASE_URI . '/version-number');
73
74
        if (!$stream->isReadable()) {
75
            throw new SourceUnavailableException('Source stream is not readable.', 1459162266);
76
        }
77
78
        return (int)$stream->getContents();
79
    }
80
81
    /**
82
     * @param int $type
83
     *
84
     * @throws UnexpectedValueException
85
     */
86
    protected function setType(int $type)
87
    {
88
        switch ($type) {
89
            case Type::LITE:
90
                $sourceType = 'Lite_PHP_BrowscapINI';
91
                break;
92
            case Type::FULL:
93
                $sourceType = 'Full_PHP_BrowscapINI';
94
                break;
95
            case Type::STANDARD:
96
                $sourceType = 'PHP_BrowscapINI';
97
                break;
98
            default:
99
                throw new UnexpectedValueException("Invalid value '$type' for argument 'type'.");
0 ignored issues
show
Coding Style Best Practice introduced by
As per coding-style, please use concatenation or sprintf for the variable $type instead of interpolation.

It is generally a best practice as it is often more readable to use concatenation instead of interpolation for variables inside strings.

// Instead of
$x = "foo $bar $baz";

// Better use either
$x = "foo " . $bar . " " . $baz;
$x = sprintf("foo %s %s", $bar, $baz);
Loading history...
100
        }
101
102
        $this->type = $type;
103
        $this->setSourceUri(self::BASE_URI . '/stream?q=' . $sourceType);
104
    }
105
106
    /**
107
     * @inheritdoc
108
     */
109
    public function getType() : int
110
    {
111
        return $this->type;
112
    }
113
114
    /**
115
     * Needs to be defined again, because the trait used here replaces
116
     * the method of the parent class.
117
     *
118
     * @inheritdoc
119
     */
120
    public function getContent() : \Generator
121
    {
122
        return parent::getContent();
123
    }
124
}
125