Completed
Push — master ( 657555...34005f )
by Julien
02:03
created

Version.php (5 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

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
0 ignored issues
show
function equals() 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...
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
0 ignored issues
show
function greaterThan() 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...
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
0 ignored issues
show
function greaterThanOrEqual() 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...
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
0 ignored issues
show
function lessThan() 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...
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
0 ignored issues
show
function lessThanOrEqual() 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...
195
    {
196
        return 0 >= VersionComparator::compare($this, $other);
197
    }
198
}
199