/** * Execute the command * * @return void * * @since 1.0 */ public function execute() { // Display status $this->app->out('Parsing the Composer data.'); // Get the Composer data $helper = new Helper(); $packages = $helper->parseComposer(); // Insert the records into the database now foreach ($packages as $name => $package) { // Check to see if the package is already in the database $packageID = $this->db->setQuery($this->db->getQuery(true)->select($this->db->quoteName('id'))->from($this->db->quoteName('#__packages'))->where($this->db->quoteName('package') . ' = ' . $this->db->quote($name))->where($this->db->quoteName('version') . ' = ' . $this->db->quote($package['version'])))->loadResult(); // If not present, insert it if (!$packageID) { $this->db->setQuery($this->db->getQuery(true)->insert($this->db->quoteName('#__packages'))->columns(array($this->db->quoteName('package'), $this->db->quoteName('version')))->values($this->db->quote($name) . ', ' . $this->db->quote($package['version'])))->execute(); } } // Display status $this->app->out('Finished parsing Composer data.'); }
/** * Fetches the requested data * * @return array * * @since 1.0 */ public function getItems() { // Parse installed.json to get the currently installed packages, should always be the latest version $helper = new Helper(); $packages = $helper->parseComposer(); $reports = array(); // Get the package data for each of our packages $db = $this->getDb(); $query = $db->getQuery(true)->select('*')->from($db->quoteName('#__packages')); foreach ($packages as $name => $package) { $query->where($db->quoteName('package') . ' = ' . $db->quote($name) . ' AND ' . $db->quoteName('version') . ' = ' . $db->quote($package['version']), 'OR'); } $packs = $db->setQuery($query)->loadObjectList(); // Loop through the packs and get the reports foreach ($packs as $pack) { $query->clear()->select('*')->from($db->quoteName('#__test_results'))->where($db->quoteName('package_id') . ' = ' . (int) $pack->id)->order('id DESC')->setLimit(1); $result = $db->setQuery($query)->loadObject(); // If we didn't get any data, build a new object if (!$result) { $result = new \stdClass(); } else { if ($result->total_lines > 0) { $result->lines_percentage = round($result->lines_covered / $result->total_lines * 100, 2); } else { $result->lines_percentage = 0; } } $result->displayName = $helper->getPackageDisplayName($pack->package); $result->version = $pack->version; // For repos with -api appended, handle separately if (in_array($pack->package, ['facebook', 'github', 'google', 'linkedin', 'twitter', 'openstreetmap'])) { $result->repoName = $pack->package . '-api'; } else { $result->repoName = $pack->package; } $reports[$pack->package] = $result; } // Sort the array ksort($reports); return $reports; }
/** * Sanitize the system file path from the HTML coverage reports * * @param string $package Package name * * @return void * * @since 1.0 */ private function sanitizePaths($package) { // Display update to console $this->app->out('Sanitizing the file paths for the ' . $this->helper->getPackageDisplayName($package) . ' package code coverage report.'); // Get the files $files = new \DirectoryIterator(JPATH_ROOT . '/www/coverage/' . $package); /* @type $file \DirectoryIterator */ foreach ($files as $file) { // Only process HTML files if (!$file->isDot() && $file->getExtension() == 'html') { $data = file_get_contents(JPATH_ROOT . '/www/coverage/' . $package . '/' . $file->getFilename()); // Clean out the path now if ($package == 'datetime') { $data = str_replace(dirname(JPATH_ROOT) . '/Joomla-Framework/' . $package, '', $data); } else { $data = str_replace(JPATH_ROOT . '/vendor/joomla/' . $package, '', $data); } // Write the sanitized file back file_put_contents(JPATH_ROOT . '/www/coverage/' . $package . '/' . $file->getFilename(), $data); } } }