Completed
Push — master ( 520f00...657555 )
by Julien
02:13
created

Version::sort()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 11
rs 9.4285
cc 1
eloc 6
nc 1
nop 1

1 Method

Rating   Name   Duplication   Size   Complexity  
A Version::getMinor() 0 4 1
1
<?php
2
3
/*
4
 * This file is part of semver/semver.
5
 *
6
 * (c) SemVer <https://github.com/git-pull-request>
7
 *
8
 * For the full copyright and license information, please view
9
 * the LICENSE file that was distributed with this source code.
10
 */
11
12
declare(strict_types=1);
13
14
namespace SemVer\SemVer;
15
16
use SemVer\SemVer\Exception\InvalidArgumentException;
17
18
/**
19
 * Definition of a Version according to Semantic Versioning 2.0.0.
20
 *
21
 * @link http://semver.org/
22
 */
23
final class Version
24
{
25
    /** @var string */
26
    private $build;
27
    /** @var int */
28
    private $major;
29
    /** @var int */
30
    private $minor;
31
    /** @var int */
32
    private $patch;
33
    /** @var string */
34
    private $preRelease;
35
36
    /**
37
     * @param int    $major
38
     * @param int    $minor
39
     * @param int    $patch
40
     * @param string $preRelease
41
     * @param string $build
42
     *
43
     * @throws \SemVer\SemVer\Exception\InvalidArgumentException
44
     */
45
    public function __construct(int $major, int $minor, int $patch, string $preRelease = '', string $build = '')
46
    {
47
        $this->major      = $major;
48
        $this->minor      = $minor;
49
        $this->patch      = $patch;
50
        $this->preRelease = $preRelease;
51
        $this->build      = $build;
52
53
        if ('' !== $this->preRelease && !preg_match('#^([0-9A-Za-z-]+\.)*[0-9A-Za-z-]+$#', $this->preRelease)) {
54
            throw new InvalidArgumentException(
55
                'The pre-release version is not compatible with rule 9 of the specifications.'
56
            );
57
        }
58
59
        if ('' !== $this->build && !preg_match('#^([0-9A-Za-z-]+\.)*[0-9A-Za-z-]+$#', $this->build)) {
60
            throw new InvalidArgumentException(
61
                'The build version is not compatible with rule 10 of the specifications.'
62
            );
63
        }
64
    }
65
66
    /** @return string */
67
    public function __toString() : string
68
    {
69
        $str = sprintf('%d.%d.%d', $this->major, $this->minor, $this->patch);
70
        if ('' !== $this->preRelease) {
71
            $str .= '-'.$this->preRelease;
72
        }
73
        if ('' !== $this->build) {
74
            $str .= '+'.$this->build;
75
        }
76
77
        return $str;
78
    }
79
80
    /**
81
     * @param string $version
82
     *
83
     * @throws InvalidArgumentException
84
     *
85
     * @return Version
86
     */
87
    public static function fromString(string $version) : Version
88
    {
89
        $patternMajor      = '(?P<major>[0-9]+)';
90
        $patternMinor      = '(?P<minor>[0-9]+)';
91
        $patternPatch      = '(?P<patch>[0-9]+)';
92
        $patternPreRelease = '(?:-(?P<prerelease>(?:[0-9A-Za-z-]+\.)*(?:[0-9A-Za-z-]+)))?';
93
        $patternBuild      = '(?:\+(?P<build>(?:[0-9A-Za-z-]+\.)*(?:[0-9A-Za-z-]+)))?';
94
95
        $pattern = '#^'.$patternMajor.'\.'.$patternMinor.'\.'.$patternPatch.$patternPreRelease.$patternBuild.'$#';
96
        if (!preg_match($pattern, $version, $matches)) {
97
            throw new InvalidArgumentException(sprintf('The string "%s" does not look like a version.', $version));
98
        }
99
100
        return new static(
101
            (int) $matches['major'],
102
            (int) $matches['minor'],
103
            (int) $matches['patch'],
104
            $matches['prerelease'] ?? '',
105
            $matches['build'] ?? ''
106
        );
107
    }
108
109
    /**
110
     * @return int
111
     */
112
    public function getMajor() : int
113
    {
114
        return $this->major;
115
    }
116
117
    /**
118
     * @return int
119
     */
120
    public function getMinor() : int
121
    {
122
        return $this->minor;
123
    }
124
125
    /**
126
     * @return int
127
     */
128
    public function getPatch() : int
129
    {
130
        return $this->patch;
131
    }
132
133
    /**
134
     * @return string
135
     */
136
    public function getPreRelease() : string
137
    {
138
        return $this->preRelease;
139
    }
140
141
    /**
142
     * @return string
143
     */
144
    public function getBuild() : string
145
    {
146
        return $this->build;
147
    }
148
149
    /**
150
     * @param Version $other
151
     *
152
     * @return bool
153
     */
154
    public function equals(Version $other) : bool
155
    {
156
        return 0 === VersionComparator::compare($this, $other);
157
    }
158
159
    /**
160
     * @param Version $other
161
     *
162
     * @return bool
163
     */
164
    public function greaterThan(Version $other) : bool
165
    {
166
        return 1 === VersionComparator::compare($this, $other);
167
    }
168
169
    /**
170
     * @param Version $other
171
     *
172
     * @return bool
173
     */
174
    public function greaterThanOrEqual(Version $other) : bool
175
    {
176
        return 0 <= VersionComparator::compare($this, $other);
177
    }
178
179
    /**
180
     * @param Version $other
181
     *
182
     * @return bool
183
     */
184
    public function lessThan(Version $other) : bool
185
    {
186
        return -1 === VersionComparator::compare($this, $other);
187
    }
188
189
    /**
190
     * @param Version $other
191
     *
192
     * @return bool
193
     */
194
    public function lessThanOrEqual(Version $other) : bool
195
    {
196
        return 0 >= VersionComparator::compare($this, $other);
197
    }
198
}
199