public function testCalculatedScore() { $bundleWithShortReadme = new Bundle(); $bundleWithShortReadme->setReadme('This is a very short (and quite useless) readme'); $bundle = new Bundle(); $bundle->setReadme(<<<README # KnpBundles Open-source code of the [knpbundles.com](http://knpbundles.com) website, written in Symfony2. Any ideas are welcome! [![Build Status](https://secure.travis-ci.org/KnpLabs/KnpBundles.png)](http://travis-ci.org/KnpLabs/KnpBundles) Please note that this service was previously called Symfony2Bundles but we had to change the name due to [trademark issues](http://knplabs.com/blog/symfony2bundles-becomes-knpbundle). README ); $tester = new ReadmeListener(); $tester->updateScore($bundleWithShortReadme); $bundleWithShortReadme->recalculateScore(); $tester->updateScore($bundle); $bundle->recalculateScore(); $this->assertEquals(0, $bundleWithShortReadme->getScore()); $this->assertEquals(5, $bundle->getScore()); }
/** * Delete all bundles from index */ public function deleteBundlesIndexes(Bundle $bundle = null) { $delete = $this->solarium->createUpdate(); $delete->addDeleteQuery(null !== $bundle ? $bundle->getFullName() : '*:*'); $delete->addCommit(); $this->solarium->update($delete); }
protected function execute(InputInterface $input, OutputInterface $output) { /** @var SolrIndexer $indexer */ $indexer = $this->getContainer()->get('knp_bundles.indexer.solr'); /** @var EntityManager $em */ $em = $this->getContainer()->get('doctrine')->getManager(); /** @var \Solarium_Client $solarium */ $solarium = $this->getContainer()->get('solarium.client'); /** @var EntityRepository $repository */ $repository = $em->getRepository('KnpBundlesBundle:Bundle'); $query = $solarium->createSelect(); $query->setFields(array('name', 'ownerName')); try { $hasMoreResults = true; $page = 1; while ($hasMoreResults) { $paginator = new Pagerfanta(new SolariumAdapter($solarium, $query)); $paginator->setMaxPerPage(50)->setCurrentPage($page, false, true); foreach ($paginator as $bundle) { $entity = $repository->findOneBy(array('name' => $bundle['name'])); if (!$entity) { $entity = new Bundle(); $entity->setName($bundle['name']); $entity->setOwnerName($bundle['ownerName']); $indexer->deleteBundlesIndexes($entity); $output->writeln(sprintf('The bundle "%s" was deleted from solr index.', $entity->getFullName())); } } $hasMoreResults = $paginator->getNbResults() == 50; $page++; } } catch (\Solarium_Client_HttpException $e) { throw new \Exception('Seems that our search engine is currently offline. Please check later.'); } }
public function testGlobalScore() { $dispatcher = new EventDispatcher(); $testers = array('Activity', 'Composer', 'Followers', 'KnpBundles', 'Readme', 'Travis'); foreach ($testers as $testerClass) { $fqcn = sprintf('\\Knp\\Bundle\\KnpBundlesBundle\\EventListener\\Scoring\\%sListener', $testerClass); $tester = new $fqcn(); $dispatcher->addListener(BundleEvent::UPDATE_SCORE, array($tester, 'onScoreUpdate')); } $bundle = new Bundle(); // activity (+4) $bundle->setLastCommitAt(new \DateTime('-10days')); // composer (+5) $bundle->setComposerName('bundle-composer-name'); // followers (+10) $bundle->setNbFollowers(10); // recommendation (+5) $bundle->addRecommender(new Developer()); // readme (+5) $bundle->setReadme(str_repeat('-', 500)); // travis (+10) $bundle->setUsesTravisCi(true); $bundle->setTravisCiBuildStatus(true); $dispatcher->dispatch(BundleEvent::UPDATE_SCORE, new BundleEvent($bundle)); $bundle->recalculateScore(); $this->assertEquals(39, $bundle->getScore()); }
/** * @param Bundle $bundle * @param integer $limit * * @return array */ public function findLastActivitiesForBundle(Bundle $bundle, $limit = 10) { $query = $this->queryLastActivities(null, $bundle->getId(), null); if (null !== $limit) { $query->setMaxResults($limit); } return $query->execute(); }
public function getCommits($nb) { $commits = $this->getGitRepo()->getCommits(12); foreach ($commits as $key => $commit) { $commits[$key]['url'] = $this->entity->getGithubUrl() . '/commit/' . $commit['id']; } return $commits; }
/** * Finds the Score object for a given date and bundle * * @param DateTime $date * @param Bundle $bundle * @return Score or null */ public function findOneByDateAndBundle(\DateTime $date, Bundle $bundle) { try { return $this->createQueryBuilder('s')->where('s.bundle = :bundle_id')->andWhere('s.date = :date')->setParameter('bundle_id', $bundle->getId())->setParameter('date', $date->format('Y-m-d'))->getQuery()->getSingleResult(); } catch (NoResultException $e) { return null; } }
/** * @dataProvider provideFollowers */ public function testFollowersScoreDetail($followers) { $bundle = new Bundle(); $bundle->setNbFollowers($followers); $tester = new FollowersListener(); $tester->updateScore($bundle); $bundle->recalculateScore(); // 1 follower = 1 point $this->assertEquals($followers, $bundle->getScore()); }
/** * @param Bundle $bundle * @param SolrIndexer $indexer * @param OutputInterface $output * @param boolean $verbose */ private function reindex(Bundle $bundle, $indexer, $output, $verbose) { if ($verbose) { $output->writeln('Indexing ' . $bundle->getFullName() . '...'); } try { $indexer->indexBundle($bundle); } catch (\Exception $e) { $output->writeln('<error>Exception: ' . $e->getMessage() . ', skipping bundle ' . $bundle->getFullName() . '.</error>'); } }
public function testUpdateComposerSuccess() { $repoEntity = new Bundle('knplabs/KnpMenuBundle'); $repo = $this->getRepo(); $gitRepo = $this->getGitRepoMock(); $gitRepo->expects($this->any())->method('hasFile')->with('composer.json')->will($this->returnValue(true)); $gitRepo->expects($this->any())->method('getFileContent')->with('composer.json')->will($this->returnValue('{"name": "knplabs/knp-menu-bundle"}')); $method = new \ReflectionMethod($repo, 'updateComposerFile'); $method->setAccessible(true); $method->invokeArgs($repo, array($gitRepo, $repoEntity)); $this->assertEquals($repoEntity->getComposerName(), 'knplabs/knp-menu-bundle'); }
/** * @test */ public function shouldNotCreateNewRepoWhenExists() { $bundle = new BundleEntity(); $bundle->setOwnerName('KnpLabs'); $bundle->setName('KnpBundles'); $expectedDir = $this->getExpectedDir(); $this->createRepoInExpectedLocation(); $repoManager = $this->getRepoManager(); $repoManager->expects($this->never())->method('cloneRepo'); $this->assertTrue(is_dir($expectedDir)); $this->assertInstanceOf('Knp\\Bundle\\KnpBundlesBundle\\Git\\Repo', $repoManager->getRepo($bundle)); }
public function testTravisBuildStatus() { $bundle = new Bundle(); $tester = new TravisListener(); $bundle->setTravisCiBuildStatus(false); $tester->updateScore($bundle); $bundle->recalculateScore(); $this->assertEquals(0, $bundle->getScore()); $bundle->setTravisCiBuildStatus(true); $tester->updateScore($bundle); $bundle->recalculateScore(); $this->assertEquals(5, $bundle->getScore()); }
/** * @Given /^the site has following bundles:$/ */ public function theSiteHasFollowingBundles(TableNode $table) { $entityManager = $this->getEntityManager(); foreach ($table->getHash() as $row) { $user = $this->users[$row['username']]; $bundle = new Entity\Bundle(); $bundle->fromArray(array('name' => $row['name'], 'user' => $user, 'username' => $user->getName(), 'description' => $row['description'], 'lastCommitAt' => new \DateTime($row['lastCommitAt']))); $bundle->setScore($row['score']); $this->setPrivateProperty($bundle, "trend1", $row['trend1']); $entityManager->persist($bundle); } $entityManager->flush(); }
public function testComposerScoreDetail() { $bundle = new Bundle(); $bundle->setComposerName(null); $tester = new ComposerListener(); $tester->updateScore($bundle); $bundle->recalculateScore(); $this->assertEquals(0, $bundle->getScore()); $bundle->setComposerName('composer-name-bundle'); $tester->updateScore($bundle); $bundle->recalculateScore(); $this->assertEquals(5, $bundle->getScore()); }
public function testRecommandationsScoreUpdate() { $bundle = new Bundle(); for ($index = 0; $index < 5; ++$index) { $user = new Developer(); $user->setName('Contributor #' . ($index + 1)); $bundle->addRecommender($user); } $tester = new KnpBundlesListener(); $tester->updateScore($bundle); $bundle->recalculateScore(); $this->assertEquals(25, $bundle->getScore()); }
public function testActivityScoreDetail() { $bundle = new Bundle(); $bundle->setLastCommitAt(new \DateTime('-10days')); $tester = new ActivityListener(); $tester->updateScore($bundle); $bundle->recalculateScore(); $this->assertEquals(4, $bundle->getScore()); $oldBundle = new Bundle(); $oldBundle->setLastCommitAt(new \DateTime('-45days')); $tester->updateScore($oldBundle); $oldBundle->recalculateScore(); $this->assertEquals(0, $oldBundle->getScore()); }
/** * @test */ public function shouldNotHaveChangesWithOnlyChangedScore() { $bundle = new Bundle('knplabs/KnpMenuBundle'); $bundle->setScore(1000); $bundle->setReadme('readme number one'); $bundle->setLastCommitAt(new \DateTime('-10 day')); $bundle->setNbFollowers(100); $bundle->setNbForks(10); $beforeChange = $bundle->getStatusHash(); $bundle->setScore(1100); $afterChange = $bundle->getStatusHash(); $this->assertEquals($beforeChange, $afterChange); }
public function setUp() { $kernel = static::createKernel(); $kernel->boot(); if ($kernel->getContainer()->getParameter('database_driver') == 'pdo_sqlite') { $this->markTestSkipped("The SQLite does not support joins."); } $this->em = $kernel->getContainer()->get('knp_bundles.entity_manager'); $fileLocator = new FileLocator(__DIR__ . '/fixtures/'); $path = $fileLocator->locate('trending-bundles.yml'); $data = Yaml::parse($path); $developer = new Developer(); $developer->setName('someName'); $developer->setScore(0); $this->em->persist($developer); foreach ($data['bundles'] as $bundleName => $bundleData) { $bundle = new Bundle('vendor/' . $bundleName); $bundle->setDescription('some description'); $bundle->setScore(100); $bundle->setOwner($developer); foreach ($bundleData['scores'] as $scoreData) { $bundle->setDescription(md5(time() . serialize($scoreData))); $score = new Score(); $score->setDate(new \DateTime($scoreData['date'])); $score->setBundle($bundle); $score->setValue($scoreData['value']); $this->em->persist($score); } $this->em->persist($bundle); } $this->em->flush(); }
public function load($manager) { $users = array(); $trilean = array(true, false, null); $i = 0; foreach ($this->names as $name => $fullName) { $i++; $user = new Entity\User(); $user->fromArray(array('name' => $name, 'email' => strtolower(str_replace(' ', '.', $fullName)) . '@foomail.bar', 'fullName' => $fullName, 'company' => $i % 2 ? 'Company ' . $i : null, 'location' => $i % 2 ? 'Location ' . $i : null, 'blog' => $i % 2 ? 'blog' . $i . '.com' : null, 'score' => 0)); $manager->persist($user); $users[] = $user; } foreach ($users as $i => $user) { $contributors = array(); $contributors[] = isset($users[$i + 1]) ? $users[$i + 1] : $users[0]; $contributors[] = isset($users[$i - 1]) ? $users[$i - 1] : $users[count($users) - 1]; $contributor = array_pop($contributors); $bundle = new Entity\Bundle(); $bundle->fromArray(array('name' => ucfirst($user->getName()) . 'FooBundle', 'username' => $user->getName(), 'user' => $user, 'description' => 'Description of my bundle', 'homepage' => $i % 2 ? 'Bundle' . $i . '.com' : null, 'readme' => str_repeat("README of the bundle number " . $i . "\n", 20), 'tags' => $i % 2 ? array('1.0', '1.1') : array(), 'usesTravisCi' => $i % 2 ? false : true, 'composerName' => $i % 2 ? null : 'knplabs/knp-menu-bundle', 'travisCiBuildStatus' => $i % 2 == 0 ? $trilean[$i % 3] : null, 'nbFollowers' => $i * 10, 'nbForks' => $i, 'lastCommitAt' => new \DateTime('-' . $i * 4 . ' day'), 'lastCommits' => array(array('author' => array('name' => $contributor->getFullName(), 'login' => $contributor->getName(), 'email' => $contributor->getEmail()), 'url' => 'http://github.com', 'committed_date' => '2010-05-16T09:58:32-09:00', 'authored_date' => '2010-05-16T09:58:32-09:00', 'message' => 'Fix something on this ' . 'Bundle'), array('author' => array('name' => $user->getFullName(), 'login' => $user->getName(), 'email' => $user->getEmail()), 'url' => 'http://github.com', 'committed_date' => '2010-05-16T09:58:32-07:00', 'authored_date' => '2010-05-16T09:58:32-07:00', 'message' => 'Commit something on this bundle')), 'isFork' => false, 'contributors' => array($contributor))); $manager->persist($bundle); // Add some scores for bundles $today = new \DateTime(); // We add a various number of scores for a given bundle $daysBefore = crc32($bundle->getName() . '-days') % 50; $maxScore = crc32($bundle->getName()) % 50; $previousScore = $maxScore; while ($daysBefore-- > 0) { $date = clone $today; $date->sub(new \DateInterval('P' . $daysBefore . 'D')); $score = new Entity\Score(); $score->setBundle($bundle); $score->setValue($previousScore + $daysBefore); $score->setDate($date); $manager->persist($score); $previousScore = $score->getValue(); } } $manager->flush(); }
/** * Updates repo based on status from travis. * * @param Bundle $bundle * * @return boolean */ public function update(Bundle $bundle) { $this->output->write(' Travis status:'); $response = $this->browser->get('http://travis-ci.org/' . $bundle->getOwnerName() . '/' . $bundle->getName() . '.json'); $status = json_decode($response->getContent(), true); if (JSON_ERROR_NONE === json_last_error()) { $lastBuildAt = new \DateTime(); $lastBuildAt->setTimestamp(strtotime($status['last_build_finished_at'])); // Only execute if date of last build is older than last update of bundle if ($lastBuildAt < $bundle->getUpdatedAt()) { $state = Activity::STATE_UNKNOWN; if (0 === $status['last_build_status']) { $bundle->setTravisCiBuildStatus(true); $state = Activity::STATE_OPEN; $this->output->write(' success'); } elseif (1 === $status['last_build_status']) { $bundle->setTravisCiBuildStatus(false); $state = Activity::STATE_CLOSED; $this->output->write(' failed'); } if (Activity::STATE_UNKNOWN !== $state) { $activity = new Activity(); $activity->setType(Activity::ACTIVITY_TYPE_TRAVIS_BUILD); $activity->setState($state); $activity->setBundle($bundle); return true; } } else { $this->output->write(' skipped'); return true; } } $bundle->setTravisCiBuildStatus(null); $this->output->write(' error'); return false; }
/** * {@inheritdoc} */ public function updateScore(Bundle $bundle) { $bundle->addScoreDetail('recommenders', 5 * $bundle->getNbRecommenders()); }
/** * Removes a specified bundle * * @param Bundle $bundle */ protected function removeBundle(Bundle $bundle) { $owner = $bundle->getOwner(); if ($owner instanceof Owner) { $owner->removeBundle($bundle); } // remove bundle from search index $this->indexer->deleteBundlesIndexes($bundle); $this->em->remove($bundle); $this->em->flush(); // @todo also delete folder if ($this->logger) { $this->logger->warn(sprintf('Bundle "%s" was deleted', $bundle->getName())); } }
/** * @Given /^the site has following bundles:$/ */ public function theSiteHasFollowingBundles(TableNode $table) { $entityManager = $this->getEntityManager(); $this->bundles = array(); foreach ($table->getHash() as $row) { if (isset($this->developers[$row['username']])) { $owner = $this->developers[$row['username']]; } elseif (isset($this->organizations[$row['username']])) { $owner = $this->organizations[$row['username']]; } else { continue; } $bundle = new Entity\Bundle(); $bundle->fromArray(array('name' => $row['name'], 'owner' => $owner, 'ownerName' => $owner->getName(), 'description' => $row['description'], 'readme' => isset($row['readme']) ? $row['readme'] : '', 'state' => isset($row['state']) ? $row['state'] : Entity\Bundle::STATE_UNKNOWN)); if (isset($row['license'])) { $bundle->setLicenseType($row['license']); } if (isset($row['createdAt'])) { $bundle->setCreatedAt(new \DateTime($row['createdAt'])); } if (isset($row['lastCommitAt'])) { $bundle->setLastCommitAt(new \DateTime($row['lastCommitAt'])); } $bundle->setScore($row['score']); $versionsHistory['dependencies']['dev-master'] = array('name' => 'friendsofsymfony/user-bundle', 'extra' => array('branch-alias' => array('dev-master' => '2.0.x-dev')), 'require' => array('php' => '>=5.3.2'), 'require-dev' => '', 'suggest' => ''); $bundle->setVersionsHistory($versionsHistory); $this->setPrivateProperty($bundle, "trend1", $row['trend1']); if (isset($row['recommendedBy'])) { $ownerNames = explode(',', $row['recommendedBy']); foreach ($ownerNames as $ownerName) { $owner = $this->developers[trim($ownerName)]; $bundle->addRecommender($owner); $owner->addRecommendedBundle($bundle); $entityManager->persist($owner); } } $entityManager->persist($bundle); $this->bundles[$bundle->getName()] = $bundle; } $entityManager->flush(); }
/** * {@inheritdoc} */ public function updateScore(Bundle $bundle) { $bundle->addScoreDetail('composer', $bundle->getComposerName() ? 5 : 0); }
/** * @param Bundle $bundle * * @return boolean */ public function removeRepo(Bundle $bundle) { if ($this->bundleUpdateProducer) { // Create a Message object $message = array('bundle_id' => $bundle->getId(), 'action' => 'remove'); // RabbitMQ, publish my message! $this->bundleUpdateProducer->publish(json_encode($message)); return true; } return false; }
/** * @test */ public function shouldNotUpdateVersionsHistoryWithWrongData() { $json = 'I am wrong json'; $bundle = new Bundle('KnpLabs/KnpMenuBundle'); $bundle->setComposerName('knplabs/knp-menu-bundle'); $httpClient = $this->getMockBuilder('Github\\HttpClient\\HttpClient')->setMethods(array('get'))->disableOriginalConstructor()->getMock(); $httpClient->expects($this->once())->method('get')->will($this->returnValue($json)); $githubRepo = $this->getRepo($httpClient); $githubRepo->updateVersionsHistory($bundle); $this->assertNull($bundle->getVersionsHistory()); }
private function tryToValidateWithComposerFile(Bundle $bundle, Contents $contentApi) { $validComposer = false; try { $file = $contentApi->show($bundle->getOwnerName(), $bundle->getName(), 'composer.json'); $composer = $this->decodeFileContent($file, true); if (JSON_ERROR_NONE === json_last_error()) { if (isset($composer['type']) && false !== strpos(strtolower($composer['type']), 'symfony')) { $validComposer = true; } if (isset($composer['autoload']['psr-0'])) { foreach ($composer['autoload']['psr-0'] as $key => $value) { if (preg_match('/\\\\(.*)(\\w*)Bundle$/', $key) > 0) { $validComposer = true; } } } if (isset($composer['autoload']['psr-4'])) { foreach ($composer['autoload']['psr-4'] as $key => $value) { if (preg_match('/\\\\(.*)(\\w*)Bundle$/', $key) > 0) { $validComposer = true; } } } } } catch (RuntimeException $e) { $validComposer = false; } return $validComposer; }
protected function makeBundle($manager, Entity\Owner $owner, $i, $contributor = null) { $trilean = array(true, false, null); $bundle = new Entity\Bundle(); $bundle->fromArray(array('name' => ucfirst($owner->getName()) . $i . 'FooBundle', 'description' => $this->descriptions[mt_rand(0, 4)], 'homepage' => $i % 2 ? 'Bundle' . $i . '.com' : null, 'readme' => str_replace('__BUNDLE__', "the bundle number: {$i}", $this->readme), 'usesTravisCi' => $i % 2 ? false : true, 'composerName' => $i % 2 ? null : 'knplabs/knp-menu-bundle', 'versionsHistory' => array('symfony' => array('dev-master' => '2.1.*', '1.2.0' => '2.0.*', '1.1.0' => '2.*'), 'dependencies' => array('dev-master' => array('name' => 'friendsofsymfony/user-bundle', 'extra' => array('branch-alias' => array('dev-master' => '2.0.x-dev')), 'require' => array('php' => '>=5.3.2', 'symfony/framework-bundle' => '>=2.1,<2.3-dev', 'symfony/security-bundle' => '>=2.1,<2.3-dev'), 'require-dev' => array('twig/twig' => '*', 'doctrine/doctrine-bundle' => '*', 'swiftmailer/swiftmailer' => '*', 'willdurand/propel-typehintable-behavior' => 'dev-master', 'symfony/validator' => '2.1.*', 'symfony/yaml' => '2.1.*'), 'suggest' => array('doctrine/couchdb-odm-bundle' => '*', 'doctrine/doctrine-bundle' => '*', 'doctrine/mongodb-odm-bundle' => '*')), '1.2.x-dev' => array('name' => 'friendsofsymfony/user-bundle', 'require' => array('php' => '>=5.3.2', 'symfony/framework-bundle' => '>=2.1,<2.3-dev', 'symfony/security-bundle' => '>=2.1,<2.3-dev'), 'require-dev' => '', 'suggest' => ''))), 'state' => $this->states[mt_rand(0, 3)], 'license' => $i % 4 == 0 ? 'Some pseudo license data' : null, 'licenseType' => $i % 3 == 0 ? $this->licenses[mt_rand(0, 2)] : null, 'travisCiBuildStatus' => $i % 2 == 0 ? $trilean[$i % 3] : null, 'nbFollowers' => $i * 10, 'nbForks' => $i, 'isFork' => false, 'contributors' => $contributor ? array($contributor) : array(), 'canonicalConfig' => $i % 2 == 0 ? $this->canonicalConfigDump : null, 'nbRecommenders' => rand(0, 90))); $commits = array(array('date' => '2010-05-16T09:58:32-09:00', 'author' => $owner instanceof Entity\Developer ? $owner->getName() : 'Random Person', 'message' => 'Fix something on this Bundle'), array('date' => '2010-05-16T09:58:32-07:00', 'author' => 'Fake Name', 'message' => 'Commit something on this bundle')); foreach ($commits as $commit) { $lastCommitAt = new \DateTime(); $lastCommitAt->setTimestamp(strtotime($commit['date'])); $bundle->setLastCommitAt($lastCommitAt); $activity = new Entity\Activity(); $activity->setType(Entity\Activity::ACTIVITY_TYPE_COMMIT); $activity->setMessage(strtok($commit['message'], "\n\r")); $activity->setCreatedAt($lastCommitAt); $activity->setBundle($bundle); if ($owner->getName() == $commit['author']) { $owner->setLastCommitAt($lastCommitAt); $activity->setDeveloper($owner); $activity->setBundleOwnerName(strtolower($owner->getName())); } else { $activity->setAuthor($commit['author']); $activity->setBundleOwnerName(strtolower($commit['author'])); } $manager->persist($activity); } $owner->addBundle($bundle); return $bundle; }
/** * {@inheritdoc} */ public function updateScore(Bundle $bundle) { $bundle->addScoreDetail('followers', $bundle->getNbFollowers()); }
/** * @param string $name * * @return Bundle */ private function createEmptyBundle($name) { $bundle = new Bundle(); $bundle->setName($name); return $bundle; }