/**
  * @param AddonVersion
  * @return void
  * @throws \NetteAddons\DuplicateEntryException
  * @throws \PDOException
  */
 public function setVersionDependencies(AddonVersion $version)
 {
     foreach (AddonVersion::getLinkTypes() as $key => $type) {
         foreach ($version->{$key} as $packageName => $versionNumber) {
             if (strpos($packageName, '/') !== FALSE && ($dep = $this->findAddon($packageName))) {
                 $depId = $dep->getPrimary();
             } else {
                 $depId = NULL;
             }
             $this->createRow(array('versionId' => $version->id, 'dependencyId' => $depId, 'packageName' => $packageName, 'version' => $versionNumber, 'type' => $type));
         }
     }
 }
 /**
  * Creates Addon entity from Nette\Database row.
  *
  * @todo   Consider lazy loading for versions and tags.
  *
  * @param \Nette\Database\Table\ActiveRow
  * @param AddonVotes
  * @return Addon
  */
 public static function fromActiveRow(ActiveRow $row, AddonVotes $addonVotes = NULL)
 {
     $addon = new static();
     $addon->id = (int) $row->id;
     $addon->name = $row->name;
     $addon->composerVendor = $row->composerVendor;
     $addon->composerName = $row->composerName;
     $addon->userId = (int) $row->user->id;
     $addon->shortDescription = $row->shortDescription;
     $addon->description = $row->description;
     $addon->descriptionFormat = $row->descriptionFormat;
     $addon->defaultLicense = $row->defaultLicense;
     $addon->repository = $row->repository;
     $addon->repositoryHosting = $row->repositoryHosting;
     $addon->demo = $row->demo;
     $addon->updatedAt = $row->updatedAt ? DateTime::from($row->updatedAt) : NULL;
     $addon->deletedAt = $row->deletedAt;
     $addon->deletedBy = $row->ref('deletedBy');
     $addon->type = $row->type;
     $addon->stars = $row->stars;
     foreach ($row->related('versions') as $versionRow) {
         $version = AddonVersion::fromActiveRow($versionRow);
         $version->addon = $addon;
         $addon->versions[$version->version] = $version;
     }
     foreach ($row->related('tags') as $tagRow) {
         $addon->tags[$tagRow->tag->id] = Tag::fromActiveRow($tagRow->tag);
     }
     foreach ($row->related('addons_resources') as $resourceRow) {
         $addon->resources[$resourceRow->type] = $resourceRow->resource;
     }
     if ($addonVotes) {
         $addon->votes = $addonVotes->calculatePopularity($row);
     }
     return $addon;
 }
 /**
  * Imports versions from GitHub repository.
  *
  * @param \NetteAddons\Model\Addon
  * @return \NetteAddons\Model\AddonVersion[]
  * @throws \NetteAddons\IOException
  */
 public function importVersions(Addon $addon)
 {
     $versions = array();
     foreach ($this->getVersions() as $v => $hash) {
         $composer = $this->getComposerJson($hash);
         $version = new AddonVersion();
         $version->addon = $addon;
         // version
         if ($composer && isset($composer->version)) {
             $version->version = $composer->version;
             // warning: multiple tags may have the same composer version
         } else {
             $version->version = $v;
         }
         // license
         if ($composer && isset($composer->license)) {
             $version->license = implode(', ', (array) $composer->license);
         } else {
             $version->license = $addon->defaultLicense;
         }
         // package links
         if ($composer) {
             foreach (AddonVersion::getLinkTypes() as $key => $type) {
                 if (!empty($composer->{$type})) {
                     $version->{$key} = get_object_vars($composer->{$type});
                 }
             }
         }
         // time
         if ($composer && isset($composer->time)) {
             $version->updatedAt = new \DateTime($composer->time);
         } else {
             $version->updatedAt = new \DateTime($this->repository->getCommit($hash)->commit->author->date);
         }
         // dist
         $version->distType = 'zip';
         $version->distUrl = $this->repository->getArchiveLink('zip', $hash);
         // source
         $version->sourceType = 'git';
         $version->sourceUrl = $addon->repository;
         $version->sourceReference = $hash;
         // composer.json
         $version->composerJson = Utils\Composer::createComposerJson($version, $composer);
         $versions[$version->version] = $version;
         // ensures that versions are unique
     }
     return array_values($versions);
 }