Chris@14
|
1 <?php
|
Chris@14
|
2 /*
|
Chris@14
|
3 * This file is part of PharIo\Version.
|
Chris@14
|
4 *
|
Chris@14
|
5 * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de>
|
Chris@14
|
6 *
|
Chris@14
|
7 * For the full copyright and license information, please view the LICENSE
|
Chris@14
|
8 * file that was distributed with this source code.
|
Chris@14
|
9 */
|
Chris@14
|
10
|
Chris@14
|
11 namespace PharIo\Version;
|
Chris@14
|
12
|
Chris@14
|
13 class VersionConstraintParser {
|
Chris@14
|
14 /**
|
Chris@14
|
15 * @param string $value
|
Chris@14
|
16 *
|
Chris@14
|
17 * @return VersionConstraint
|
Chris@14
|
18 *
|
Chris@14
|
19 * @throws UnsupportedVersionConstraintException
|
Chris@14
|
20 */
|
Chris@14
|
21 public function parse($value) {
|
Chris@14
|
22
|
Chris@14
|
23 if (strpos($value, '||') !== false) {
|
Chris@14
|
24 return $this->handleOrGroup($value);
|
Chris@14
|
25 }
|
Chris@14
|
26
|
Chris@14
|
27 if (!preg_match('/^[\^~\*]?[\d.\*]+$/', $value)) {
|
Chris@14
|
28 throw new UnsupportedVersionConstraintException(
|
Chris@14
|
29 sprintf('Version constraint %s is not supported.', $value)
|
Chris@14
|
30 );
|
Chris@14
|
31 }
|
Chris@14
|
32
|
Chris@14
|
33 switch ($value[0]) {
|
Chris@14
|
34 case '~':
|
Chris@14
|
35 return $this->handleTildeOperator($value);
|
Chris@14
|
36 case '^':
|
Chris@14
|
37 return $this->handleCaretOperator($value);
|
Chris@14
|
38 }
|
Chris@14
|
39
|
Chris@14
|
40 $version = new VersionConstraintValue($value);
|
Chris@14
|
41
|
Chris@14
|
42 if ($version->getMajor()->isAny()) {
|
Chris@14
|
43 return new AnyVersionConstraint();
|
Chris@14
|
44 }
|
Chris@14
|
45
|
Chris@14
|
46 if ($version->getMinor()->isAny()) {
|
Chris@14
|
47 return new SpecificMajorVersionConstraint(
|
Chris@14
|
48 $value,
|
Chris@14
|
49 $version->getMajor()->getValue()
|
Chris@14
|
50 );
|
Chris@14
|
51 }
|
Chris@14
|
52
|
Chris@14
|
53 if ($version->getPatch()->isAny()) {
|
Chris@14
|
54 return new SpecificMajorAndMinorVersionConstraint(
|
Chris@14
|
55 $value,
|
Chris@14
|
56 $version->getMajor()->getValue(),
|
Chris@14
|
57 $version->getMinor()->getValue()
|
Chris@14
|
58 );
|
Chris@14
|
59 }
|
Chris@14
|
60
|
Chris@14
|
61 return new ExactVersionConstraint($value);
|
Chris@14
|
62 }
|
Chris@14
|
63
|
Chris@14
|
64 /**
|
Chris@14
|
65 * @param $value
|
Chris@14
|
66 *
|
Chris@14
|
67 * @return OrVersionConstraintGroup
|
Chris@14
|
68 */
|
Chris@14
|
69 private function handleOrGroup($value) {
|
Chris@14
|
70 $constraints = [];
|
Chris@14
|
71
|
Chris@14
|
72 foreach (explode('||', $value) as $groupSegment) {
|
Chris@14
|
73 $constraints[] = $this->parse(trim($groupSegment));
|
Chris@14
|
74 }
|
Chris@14
|
75
|
Chris@14
|
76 return new OrVersionConstraintGroup($value, $constraints);
|
Chris@14
|
77 }
|
Chris@14
|
78
|
Chris@14
|
79 /**
|
Chris@14
|
80 * @param string $value
|
Chris@14
|
81 *
|
Chris@14
|
82 * @return AndVersionConstraintGroup
|
Chris@14
|
83 */
|
Chris@14
|
84 private function handleTildeOperator($value) {
|
Chris@14
|
85 $version = new Version(substr($value, 1));
|
Chris@14
|
86 $constraints = [
|
Chris@14
|
87 new GreaterThanOrEqualToVersionConstraint($value, $version)
|
Chris@14
|
88 ];
|
Chris@14
|
89
|
Chris@14
|
90 if ($version->getPatch()->isAny()) {
|
Chris@14
|
91 $constraints[] = new SpecificMajorVersionConstraint(
|
Chris@14
|
92 $value,
|
Chris@14
|
93 $version->getMajor()->getValue()
|
Chris@14
|
94 );
|
Chris@14
|
95 } else {
|
Chris@14
|
96 $constraints[] = new SpecificMajorAndMinorVersionConstraint(
|
Chris@14
|
97 $value,
|
Chris@14
|
98 $version->getMajor()->getValue(),
|
Chris@14
|
99 $version->getMinor()->getValue()
|
Chris@14
|
100 );
|
Chris@14
|
101 }
|
Chris@14
|
102
|
Chris@14
|
103 return new AndVersionConstraintGroup($value, $constraints);
|
Chris@14
|
104 }
|
Chris@14
|
105
|
Chris@14
|
106 /**
|
Chris@14
|
107 * @param string $value
|
Chris@14
|
108 *
|
Chris@14
|
109 * @return AndVersionConstraintGroup
|
Chris@14
|
110 */
|
Chris@14
|
111 private function handleCaretOperator($value) {
|
Chris@14
|
112 $version = new Version(substr($value, 1));
|
Chris@14
|
113
|
Chris@14
|
114 return new AndVersionConstraintGroup(
|
Chris@14
|
115 $value,
|
Chris@14
|
116 [
|
Chris@14
|
117 new GreaterThanOrEqualToVersionConstraint($value, $version),
|
Chris@14
|
118 new SpecificMajorVersionConstraint($value, $version->getMajor()->getValue())
|
Chris@14
|
119 ]
|
Chris@14
|
120 );
|
Chris@14
|
121 }
|
Chris@14
|
122 }
|