annotate vendor/phar-io/version/src/VersionConstraintParser.php @ 5:12f9dff5fda9 tip

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