/**
  * @param array $args
  * @return int
  */
 public function run(array $args = [])
 {
     /** @var ICollection|Addon[] $addons */
     $addons = $this->addonRepository->findComposers();
     // DO YOUR JOB ===============================================
     $counter = 0;
     foreach ($addons as $addon) {
         try {
             // Skip addon with bad data
             if ($extra = $addon->github->extra) {
                 if ($composer = $extra->get('composer', FALSE)) {
                     if (!isset($composer['name'])) {
                         throw new InvalidStateException('No composer name at ' . $addon->fullname);
                     }
                     list($owner, $repo) = explode('/', $composer['name']);
                     // Create composer entity if not exist
                     if (!$addon->composer) {
                         $addon->composer = new Composer();
                     }
                     // Basic info
                     $addon->composer->name = Arrays::get($composer, 'name', NULL);
                     $addon->composer->description = Arrays::get($composer, 'description', NULL);
                     $addon->composer->type = Arrays::get($composer, 'type', NULL);
                     // Downloads
                     if ($stats = $this->composer->repo($owner, $repo)) {
                         $addon->composer->downloads = Arrays::get($stats, ['package', 'downloads', 'total'], 0);
                     }
                     // Keywords
                     $keywords = Arrays::get($composer, 'keywords', []);
                     $addon->composer->keywords = $keywords ? implode(',', $keywords) : NULL;
                     // Persist
                     $this->addonRepository->persistAndFlush($addon);
                     // Increase counting
                     $counter++;
                 } else {
                     $this->log('Skip (composer) [no composer data]: ' . $addon->fullname);
                 }
             } else {
                 $this->log('Skip (composer) [no extra data]: ' . $addon->fullname);
             }
         } catch (Exception $e) {
             Debugger::log($e, Debugger::EXCEPTION);
             $this->log('Skip (composer) [exception]: ' . $e->getMessage());
         }
     }
     return $counter;
 }
 /**
  * @param array $args
  * @return bool
  */
 public function run(array $args = [])
 {
     /** @var ICollection|Addon[] $addons */
     $addons = $this->addonRepository->findComposers();
     // DO YOUR JOB ===============================================
     $counter = 0;
     foreach ($addons as $addon) {
         try {
             // Skip addon with bad data
             if ($extra = $addon->github->extra) {
                 if ($composer = $extra->get('composer', FALSE)) {
                     if (!isset($composer['name'])) {
                         throw new InvalidStateException('No composer name at ' . $addon->fullname);
                     }
                     list($owner, $repo) = explode('/', $composer['name']);
                     if ($stats = $this->composer->stats($owner, $repo)) {
                         $extra->set('composer-stats', ['all' => $stats]);
                     } else {
                         $this->log('Skip (composer stats) [no stats data]: ' . $addon->fullname);
                     }
                     // Persist
                     $this->addonRepository->persistAndFlush($addon);
                     // Increase counting
                     $counter++;
                 } else {
                     $this->log('Skip (composer stats) [no composer data]: ' . $addon->fullname);
                 }
             } else {
                 $this->log('Skip (composer stats) [no extra data]: ' . $addon->fullname);
             }
         } catch (Exception $e) {
             Debugger::log($e, Debugger::EXCEPTION);
             $this->log('Skip (composer stats) [exception]: ' . $e->getMessage());
         }
     }
     return $counter;
 }