You are here

final class ProjectRelease in Drupal 10

Same name and namespace in other branches
  1. 9 core/modules/update/src/ProjectRelease.php \Drupal\update\ProjectRelease

Provides a project release value object.

Hierarchy

Expanded class hierarchy of ProjectRelease

4 files declare their use of ProjectRelease
ProjectReleaseTest.php in core/modules/update/tests/src/Unit/ProjectReleaseTest.php
update.compare.inc in core/modules/update/update.compare.inc
Code required only when comparing available updates to existing data.
update.report.inc in core/modules/update/update.report.inc
Code required only when rendering the available updates report.
UpdateManagerUpdate.php in core/modules/update/src/Form/UpdateManagerUpdate.php

File

core/modules/update/src/ProjectRelease.php, line 15

Namespace

Drupal\update
View source
final class ProjectRelease {

  /**
   * Whether the release is compatible with the site's Drupal core version.
   *
   * @var bool
   */
  private $coreCompatible;

  /**
   * The core compatibility message or NULL if not set.
   *
   * @var string|null
   */
  private $coreCompatibilityMessage;

  /**
   * The download URL or NULL if none is available.
   *
   * @var string|null
   */
  private $downloadUrl;

  /**
   * The URL for the release.
   *
   * @var string
   */
  private $releaseUrl;

  /**
   * The release types or NULL if not set.
   *
   * @var string[]|null
   */
  private $releaseTypes;

  /**
   * Whether the release is published.
   *
   * @var bool
   */
  private $published;

  /**
   * The release version.
   *
   * @var string
   */
  private $version;

  /**
   * The release date as a Unix timestamp or NULL if no date was set.
   *
   * @var int|null
   */
  private $date;

  /**
   * Constructs a ProjectRelease object.
   *
   * @param bool $published
   *   Whether the release is published.
   * @param string $version
   *   The release version.
   * @param string $release_url
   *   The URL for the release.
   * @param string[]|null $release_types
   *   The release types or NULL if not set.
   * @param bool|null $core_compatible
   *   Whether the release is compatible with the site's version of Drupal core.
   * @param string|null $core_compatibility_message
   *   The core compatibility message or NULL if not set.
   * @param string|null $download_url
   *   The download URL or NULL if not available.
   * @param int|null $date
   *   The release date in Unix timestamp format.
   */
  private function __construct(bool $published, string $version, string $release_url, ?array $release_types, ?bool $core_compatible, ?string $core_compatibility_message, ?string $download_url, ?int $date) {
    $this->published = $published;
    $this->version = $version;
    $this->releaseUrl = $release_url;
    $this->releaseTypes = $release_types;
    $this->coreCompatible = $core_compatible;
    $this->coreCompatibilityMessage = $core_compatibility_message;
    $this->downloadUrl = $download_url;
    $this->date = $date;
  }

  /**
   * Creates a ProjectRelease instance from an array.
   *
   * @param array $release_data
   *   The project release data as returned by update_get_available().
   *
   * @return \Drupal\update\ProjectRelease
   *   The ProjectRelease instance.
   *
   * @throws \UnexpectedValueException
   *   Thrown if project release data is not valid.
   *
   * @see \update_get_available()
   */
  public static function createFromArray(array $release_data) : ProjectRelease {
    static::validateReleaseData($release_data);
    return new ProjectRelease($release_data['status'] === 'published', $release_data['version'], $release_data['release_link'], $release_data['terms']['Release type'] ?? NULL, $release_data['core_compatible'] ?? NULL, $release_data['core_compatibility_message'] ?? NULL, $release_data['download_link'] ?? NULL, $release_data['date'] ?? NULL);
  }

  /**
   * Validates the project release data.
   *
   * @param array $data
   *   The project release data.
   *
   * @throws \UnexpectedValueException
   *   Thrown if project release data is not valid.
   */
  private static function validateReleaseData(array $data) : void {
    $not_blank_constraints = [
      new Type('string'),
      new NotBlank(),
    ];
    $collection_constraint = new Collection([
      'fields' => [
        'version' => $not_blank_constraints,
        'date' => new Optional([
          new Type('numeric'),
        ]),
        'core_compatible' => new Optional([
          new Type('boolean'),
        ]),
        'core_compatibility_message' => new Optional($not_blank_constraints),
        'status' => new Choice([
          'published',
          'unpublished',
        ]),
        'download_link' => new Optional($not_blank_constraints),
        'release_link' => $not_blank_constraints,
        'terms' => new Optional([
          new Type('array'),
          new Collection([
            'Release type' => new Optional([
              new Type('array'),
            ]),
          ]),
        ]),
      ],
      'allowExtraFields' => TRUE,
    ]);
    $violations = Validation::createValidator()
      ->validate($data, $collection_constraint);
    if (count($violations)) {
      foreach ($violations as $violation) {
        $violation_messages[] = "Field " . $violation
          ->getPropertyPath() . ": " . $violation
          ->getMessage();
      }
      throw new \UnexpectedValueException('Malformed release data: ' . implode(",\n", $violation_messages));
    }
  }

  /**
   * Gets the project version.
   *
   * @return string
   *   The project version.
   */
  public function getVersion() : string {
    return $this->version;
  }

  /**
   * Gets the release date if set.
   *
   * @return int|null
   *   The date of the release or null if no date is available.
   */
  public function getDate() : ?int {
    return $this->date;
  }

  /**
   * Determines if the release is a security release.
   *
   * @return bool
   *   TRUE if the release is security release, or FALSE otherwise.
   */
  public function isSecurityRelease() : bool {
    return $this
      ->isReleaseType('Security update');
  }

  /**
   * Determines if the release is unsupported.
   *
   * @return bool
   *   TRUE if the release is unsupported, or FALSE otherwise.
   */
  public function isUnsupported() : bool {
    return $this
      ->isReleaseType('Unsupported');
  }

  /**
   * Determines if the release is insecure.
   *
   * @return bool
   *   TRUE if the release is insecure, or FALSE otherwise.
   */
  public function isInsecure() : bool {
    return $this
      ->isReleaseType('Insecure');
  }

  /**
   * Determines if the release is matches a type.
   *
   * @param string $type
   *   The release type.
   *
   * @return bool
   *   TRUE if the release matches the type, or FALSE otherwise.
   */
  private function isReleaseType(string $type) : bool {
    return $this->releaseTypes && in_array($type, $this->releaseTypes, TRUE);
  }

  /**
   * Determines if the release is published.
   *
   * @return bool
   *   TRUE if the release is published, or FALSE otherwise.
   */
  public function isPublished() : bool {
    return $this->published;
  }

  /**
   * Determines whether release is compatible the site's version of Drupal core.
   *
   * @return bool|null
   *   Whether the release is compatible or NULL if no data is set.
   */
  public function isCoreCompatible() : ?bool {
    return $this->coreCompatible;
  }

  /**
   * Gets the core compatibility message for the site's version of Drupal core.
   *
   * @return string|null
   *   The core compatibility message or NULL if none is available.
   */
  public function getCoreCompatibilityMessage() : ?string {
    return $this->coreCompatibilityMessage;
  }

  /**
   * Gets the download URL of the release.
   *
   * @return string|null
   *   The download URL or NULL if none is available.
   */
  public function getDownloadUrl() : ?string {
    return $this->downloadUrl;
  }

  /**
   * Gets the URL of the release.
   *
   * @return string
   *   The URL of the release.
   */
  public function getReleaseUrl() : string {
    return $this->releaseUrl;
  }

}

Members