You are here

class StabilityFlags in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 vendor/wikimedia/composer-merge-plugin/src/Merge/StabilityFlags.php \Wikimedia\Composer\Merge\StabilityFlags

Adapted from Composer's RootPackageLoader::extractStabilityFlags @author Bryan Davis <bd808@bd808.com>

Hierarchy

Expanded class hierarchy of StabilityFlags

File

vendor/wikimedia/composer-merge-plugin/src/Merge/StabilityFlags.php, line 20

Namespace

Wikimedia\Composer\Merge
View source
class StabilityFlags {

  /**
   * @var array Current package name => stability mappings
   */
  protected $stabilityFlags;

  /**
   * @var int Current default minimum stability
   */
  protected $minimumStability;

  /**
   * @var string Regex to extract an explict stability flag (eg '@dev')
   */
  protected $explicitStabilityRe;

  /**
   * @param array $stabilityFlags Current package name => stability mappings
   * @param int $minimumStability Current default minimum stability
   */
  public function __construct(array $stabilityFlags = array(), $minimumStability = BasePackage::STABILITY_STABLE) {
    $this->stabilityFlags = $stabilityFlags;
    $this->minimumStability = $this
      ->getStabilityInt($minimumStability);
    $this->explicitStabilityRe = '/^[^@]*?@(' . implode('|', array_keys(BasePackage::$stabilities)) . ')$/i';
  }

  /**
   * Get the stability value for a given string.
   *
   * @param string $name Stability name
   * @return int Stability value
   */
  protected function getStabilityInt($name) {
    $name = VersionParser::normalizeStability($name);
    return isset(BasePackage::$stabilities[$name]) ? BasePackage::$stabilities[$name] : BasePackage::STABILITY_STABLE;
  }

  /**
   * Extract and merge stability flags from the given collection of
   * requires with another collection of stability flags.
   *
   * @param array $requires New package name => link mappings
   * @return array Unified package name => stability mappings
   */
  public function extractAll(array $requires) {
    $flags = array();
    foreach ($requires as $name => $link) {
      $name = strtolower($name);
      $version = $link
        ->getPrettyConstraint();
      $stability = $this
        ->getExplicitStability($version);
      if ($stability === null) {
        $stability = $this
          ->getParsedStability($version);
      }
      $flags[$name] = max($stability, $this
        ->getCurrentStability($name));
    }

    // Filter out null stability values
    return array_filter($flags, function ($v) {
      return $v !== null;
    });
  }

  /**
   * Extract the most unstable explicit stability (eg '@dev') from a version
   * specification.
   *
   * @param string $version
   * @return int|null Stability or null if no explict stability found
   */
  protected function getExplicitStability($version) {
    $found = null;
    $constraints = $this
      ->splitConstraints($version);
    foreach ($constraints as $constraint) {
      if (preg_match($this->explicitStabilityRe, $constraint, $match)) {
        $stability = $this
          ->getStabilityInt($match[1]);
        $found = max($stability, $found);
      }
    }
    return $found;
  }

  /**
   * Split a version specification into a list of version constraints.
   *
   * @param string $version
   * @return array
   */
  protected function splitConstraints($version) {
    $found = array();
    $orConstraints = preg_split('/\\s*\\|\\|?\\s*/', trim($version));
    foreach ($orConstraints as $constraints) {
      $andConstraints = preg_split('/(?<!^|as|[=>< ,]) *(?<!-)[, ](?!-) *(?!,|as|$)/', $constraints);
      foreach ($andConstraints as $constraint) {
        $found[] = $constraint;
      }
    }
    return $found;
  }

  /**
   * Get the stability of a version
   *
   * @param string $version
   * @return int|null Stability or null if STABLE or less than minimum
   */
  protected function getParsedStability($version) {

    // Drop aliasing if used
    $version = preg_replace('/^([^,\\s@]+) as .+$/', '$1', $version);
    $stability = $this
      ->getStabilityInt(VersionParser::parseStability($version));
    if ($stability === BasePackage::STABILITY_STABLE || $this->minimumStability > $stability) {

      // Ignore if 'stable' or more stable than the global
      // minimum
      $stability = null;
    }
    return $stability;
  }

  /**
   * Get the current stability of a given package.
   *
   * @param string $name
   * @return int|null Stability of null if not set
   */
  protected function getCurrentStability($name) {
    return isset($this->stabilityFlags[$name]) ? $this->stabilityFlags[$name] : null;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
StabilityFlags::$explicitStabilityRe protected property
StabilityFlags::$minimumStability protected property
StabilityFlags::$stabilityFlags protected property
StabilityFlags::extractAll public function Extract and merge stability flags from the given collection of requires with another collection of stability flags.
StabilityFlags::getCurrentStability protected function Get the current stability of a given package.
StabilityFlags::getExplicitStability protected function Extract the most unstable explicit stability (eg '@dev') from a version specification.
StabilityFlags::getParsedStability protected function Get the stability of a version
StabilityFlags::getStabilityInt protected function Get the stability value for a given string.
StabilityFlags::splitConstraints protected function Split a version specification into a list of version constraints.
StabilityFlags::__construct public function