Classes

Line coverage against cyclomatic complexity. Bubble size is the number of executable lines; hover for details, click to navigate.

0% 20% 40% 60% 80% 100% 0 20 40 60 Line Coverage (%) Cyclomatic Complexity App\Medal\MedalChecker — Coverage: 100.0% | Lines: 140 | Complexity: 16 App\Command\DemoAgentsCommand — Coverage: 98.6% | Lines: 139 | Complexity: 46 App\Timeline\TimelineChart — Coverage: 97.0% | Lines: 100 | Complexity: 50 App\Entity\AgentStat — Coverage: 100.0% | Lines: 90 | Complexity: 6 App\Command\TelegramTestCommand — Coverage: 88.2% | Lines: 85 | Complexity: 42 App\Command\SlackTestCommand — Coverage: 90.3% | Lines: 62 | Complexity: 26 App\LinkList\LinkListParser — Coverage: 98.3% | Lines: 59 | Complexity: 38 App\Import\AgentStatCsvImporter — Coverage: 98.3% | Lines: 58 | Complexity: 26 App\State\AgentProvider — Coverage: 79.3% | Lines: 58 | Complexity: 16 App\Entity\User — Coverage: 94.5% | Lines: 55 | Complexity: 36 App\Import\CustomMedalsJsonImporter — Coverage: 100.0% | Lines: 46 | Complexity: 30 App\Controller\System\LogviewController — Coverage: 97.5% | Lines: 40 | Complexity: 15 App\Timeline\TimelineBuilder — Coverage: 100.0% | Lines: 40 | Complexity: 18 App\Security\GoogleIdentityAuthenticator — Coverage: 97.0% | Lines: 33 | Complexity: 11 App\Controller\AgentStat\Import — Coverage: 96.9% | Lines: 32 | Complexity: 13 App\State\MeProcessor — Coverage: 96.8% | Lines: 31 | Complexity: 16 App\Security\GoogleApiTokenAuthenticator — Coverage: 89.7% | Lines: 29 | Complexity: 9 App\ApiResource\Bannergress — Coverage: 100.0% | Lines: 26 | Complexity: 5 App\Notifier\ChatText — Coverage: 96.2% | Lines: 26 | Complexity: 16 App\Repository\UserRepository — Coverage: 100.0% | Lines: 25 | Complexity: 5 App\Service\AvatarUpdater — Coverage: 100.0% | Lines: 25 | Complexity: 14 App\Controller\Agent\Read — Coverage: 100.0% | Lines: 23 | Complexity: 13 App\Form\TimelineEventType — Coverage: 100.0% | Lines: 23 | Complexity: 2 App\Log\ChatLogHandler — Coverage: 100.0% | Lines: 23 | Complexity: 13 App\Security\LoginFormAuthenticator — Coverage: 100.0% | Lines: 23 | Complexity: 7 App\Service\AgentStatService — Coverage: 82.6% | Lines: 23 | Complexity: 11 App\Bannergress\DoneBannerSync — Coverage: 100.0% | Lines: 22 | Complexity: 11 App\ApiResource\CustomMedals — Coverage: 100.0% | Lines: 21 | Complexity: 17 App\Notifier\ChatActivity — Coverage: 90.5% | Lines: 21 | Complexity: 14 App\Repository\AgentStatRepository — Coverage: 95.2% | Lines: 21 | Complexity: 8 App\Security\ApiTokenStore — Coverage: 100.0% | Lines: 21 | Complexity: 13 App\Controller\ProfileController — Coverage: 100.0% | Lines: 20 | Complexity: 5 App\Controller\AgentStat\Timeline — Coverage: 100.0% | Lines: 20 | Complexity: 4 App\Security\GoogleUserResolver — Coverage: 100.0% | Lines: 20 | Complexity: 10 App\Validator\NoOverlappingTravelValidator — Coverage: 90.0% | Lines: 20 | Complexity: 9 App\Bannergress\BannerMap — Coverage: 100.0% | Lines: 18 | Complexity: 8 App\Notifier\ChatSender — Coverage: 100.0% | Lines: 17 | Complexity: 10 App\State\UserPrivacyProvider — Coverage: 100.0% | Lines: 17 | Complexity: 2 App\Form\UserType — Coverage: 100.0% | Lines: 16 | Complexity: 2 App\Medal\Medal — Coverage: 100.0% | Lines: 15 | Complexity: 13 App\Repository\TimelineEventRepository — Coverage: 100.0% | Lines: 15 | Complexity: 4 App\State\MeProvider — Coverage: 93.3% | Lines: 15 | Complexity: 4 App\Controller\Agent\Timeline — Coverage: 100.0% | Lines: 14 | Complexity: 5 App\Timeline\TimelineEntry — Coverage: 100.0% | Lines: 14 | Complexity: 15 App\Controller\AgentStat\Index — Coverage: 100.0% | Lines: 12 | Complexity: 3 App\Controller\Banners\DoneAt — Coverage: 100.0% | Lines: 12 | Complexity: 8 App\Controller\User\Create — Coverage: 100.0% | Lines: 12 | Complexity: 3 App\Controller\Banners\Read — Coverage: 100.0% | Lines: 11 | Complexity: 4 App\Dto\AgentStatInput — Coverage: 90.9% | Lines: 11 | Complexity: 8 App\Log\BotTokenProcessor — Coverage: 100.0% | Lines: 11 | Complexity: 4 App\Controller\TimelineEvent\Update — Coverage: 100.0% | Lines: 10 | Complexity: 3 App\Controller\User\Update — Coverage: 100.0% | Lines: 10 | Complexity: 3 App\Security\FakeGoogleIdTokenVerifier — Coverage: 90.0% | Lines: 10 | Complexity: 7 App\Enum\ProfilePart — Coverage: 100.0% | Lines: 9 | Complexity: 9 App\Form\ProfileVisibilityType — Coverage: 100.0% | Lines: 9 | Complexity: 1 App\Form\StatsImportType — Coverage: 100.0% | Lines: 9 | Complexity: 1 App\Controller\Banners\Index — Coverage: 100.0% | Lines: 8 | Complexity: 2 App\Controller\Locale\Switcher — Coverage: 100.0% | Lines: 8 | Complexity: 2 App\Controller\Security\LoginFormController — Coverage: 100.0% | Lines: 8 | Complexity: 1 App\Controller\System\AboutController — Coverage: 100.0% | Lines: 8 | Complexity: 1 App\Doctrine\AgentStatOwnerExtension — Coverage: 87.5% | Lines: 8 | Complexity: 3 App\EventListener\ChooseVisibilityListener — Coverage: 100.0% | Lines: 8 | Complexity: 6 App\EventListener\LocaleListener — Coverage: 100.0% | Lines: 8 | Complexity: 4 App\LinkList\LinkListLoader — Coverage: 87.5% | Lines: 8 | Complexity: 3 App\Repository\DoneBannerRepository — Coverage: 100.0% | Lines: 7 | Complexity: 3 App\Security\GoogleIdTokenVerifier — Coverage: 0.0% | Lines: 7 | Complexity: 4 App\State\AgentStatProcessor — Coverage: 85.7% | Lines: 7 | Complexity: 3 App\Enum\UserRole — Coverage: 100.0% | Lines: 6 | Complexity: 6 App\Medal\CustomMedal — Coverage: 100.0% | Lines: 6 | Complexity: 6 App\State\TimelineEventProcessor — Coverage: 83.3% | Lines: 6 | Complexity: 3 App\Controller\Agent\Index — Coverage: 100.0% | Lines: 5 | Complexity: 1 App\Controller\AgentStat\Read — Coverage: 100.0% | Lines: 5 | Complexity: 1 App\Controller\TimelineEvent\Delete — Coverage: 100.0% | Lines: 5 | Complexity: 2 App\Controller\User\Delete — Coverage: 100.0% | Lines: 5 | Complexity: 2 App\Controller\User\Index — Coverage: 100.0% | Lines: 5 | Complexity: 1 App\Medal\CustomMedalTier — Coverage: 100.0% | Lines: 5 | Complexity: 4 App\Controller\Links\Index — Coverage: 100.0% | Lines: 4 | Complexity: 1 App\Medal\MedalLevel — Coverage: 100.0% | Lines: 4 | Complexity: 6 App\Security\DevGoogleIdTokenVerifier — Coverage: 100.0% | Lines: 4 | Complexity: 4 App\Security\Voter\AgentStatVoter — Coverage: 100.0% | Lines: 4 | Complexity: 4 App\Security\Voter\DoneBannerVoter — Coverage: 100.0% | Lines: 4 | Complexity: 4 App\Security\Voter\TimelineEventVoter — Coverage: 100.0% | Lines: 4 | Complexity: 4 App\Command\UserAdminCommand — Coverage: 100.0% | Lines: 3 | Complexity: 3 App\Controller\User\Read — Coverage: 100.0% | Lines: 3 | Complexity: 1 App\Entity\DoneBanner — Coverage: 100.0% | Lines: 2 | Complexity: 3 App\State\LinkListProvider — Coverage: 100.0% | Lines: 2 | Complexity: 2 App\ApiResource\Agent — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\ApiResource\LinkList — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\ApiResource\Me — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\ApiResource\UserPrivacy — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Controller\DefaultController — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Controller\Security\GoogleIdentityController — Coverage: 0.0% | Lines: 1 | Complexity: 1 App\Controller\Security\Logout — Coverage: 0.0% | Lines: 1 | Complexity: 1 App\Entity\TimelineEvent — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\LinkList\Link — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\LinkList\LinkSection — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Security\ApiToken — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Validator\NoOverlappingTravel — Coverage: 100.0% | Lines: 1 | Complexity: 1

Sorted by descending CRAP index.

Class CRAP Coverage
App\Timeline\TimelineChart5097.0%
App\Command\DemoAgentsCommand4698.6%
App\Command\TelegramTestCommand44.8788.2%
App\LinkList\LinkListParser3898.3%
App\Entity\User36.2194.5%
App\Import\CustomMedalsJsonImporter30100.0%
App\Command\SlackTestCommand26.6190.3%
App\Import\AgentStatCsvImporter2698.3%
App\Security\GoogleIdTokenVerifier200.0%
App\State\AgentProvider18.2779.3%
App\Timeline\TimelineBuilder18100.0%
App\ApiResource\CustomMedals17100.0%
App\Medal\MedalChecker16100.0%
App\Notifier\ChatText1696.2%
App\State\MeProcessor1696.8%
App\Controller\System\LogviewController1597.5%
App\Timeline\TimelineEntry15100.0%
App\Notifier\ChatActivity14.1790.5%
App\Service\AvatarUpdater14100.0%
App\Controller\Agent\Read13100.0%
App\Controller\AgentStat\Import1396.9%
App\Log\ChatLogHandler13100.0%
App\Medal\Medal13100.0%
App\Security\ApiTokenStore13100.0%
App\Service\AgentStatService11.6482.6%
App\Bannergress\DoneBannerSync11100.0%
App\Security\GoogleIdentityAuthenticator1197.0%
App\Notifier\ChatSender10100.0%
App\Security\GoogleUserResolver10100.0%
App\Security\GoogleApiTokenAuthenticator9.0989.7%
App\Validator\NoOverlappingTravelValidator9.0890.0%
App\Enum\ProfilePart9100.0%
App\Dto\AgentStatInput8.0590.9%
App\Bannergress\BannerMap8100.0%
App\Controller\Banners\DoneAt8100.0%
App\Repository\AgentStatRepository895.2%
App\Security\FakeGoogleIdTokenVerifier7.0590.0%
App\Security\LoginFormAuthenticator7100.0%
App\Entity\AgentStat6100.0%
App\Enum\UserRole6100.0%
App\EventListener\ChooseVisibilityListener6100.0%
App\Medal\CustomMedal6100.0%
App\Medal\MedalLevel6100.0%
App\ApiResource\Bannergress5100.0%
App\Controller\ProfileController5100.0%
App\Controller\Agent\Timeline5100.0%
App\Repository\UserRepository5100.0%
App\Controller\AgentStat\Timeline4100.0%
App\Controller\Banners\Read4100.0%
App\EventListener\LocaleListener4100.0%
App\Log\BotTokenProcessor4100.0%
App\Medal\CustomMedalTier4100.0%
App\Repository\TimelineEventRepository4100.0%
App\Security\DevGoogleIdTokenVerifier4100.0%
App\Security\Voter\AgentStatVoter4100.0%
App\Security\Voter\DoneBannerVoter4100.0%
App\Security\Voter\TimelineEventVoter4100.0%
App\State\MeProvider4.0093.3%
App\State\TimelineEventProcessor3.0483.3%
App\State\AgentStatProcessor3.0385.7%
App\Doctrine\AgentStatOwnerExtension3.0287.5%
App\LinkList\LinkListLoader3.0287.5%
App\Command\UserAdminCommand3100.0%
App\Controller\AgentStat\Index3100.0%
App\Controller\TimelineEvent\Update3100.0%
App\Controller\User\Create3100.0%
App\Controller\User\Update3100.0%
App\Entity\DoneBanner3100.0%
App\Repository\DoneBannerRepository3100.0%
App\Controller\Banners\Index2100.0%
App\Controller\Locale\Switcher2100.0%
App\Controller\Security\GoogleIdentityController20.0%
App\Controller\Security\Logout20.0%
App\Controller\TimelineEvent\Delete2100.0%
App\Controller\User\Delete2100.0%
App\Form\TimelineEventType2100.0%
App\Form\UserType2100.0%
App\State\LinkListProvider2100.0%
App\State\UserPrivacyProvider2100.0%
App\ApiResource\Agent1100.0%
App\ApiResource\LinkList1100.0%
App\ApiResource\Me1100.0%
App\ApiResource\UserPrivacy1100.0%
App\Controller\DefaultController1100.0%
App\Controller\Agent\Index1100.0%
App\Controller\AgentStat\Read1100.0%
App\Controller\Links\Index1100.0%
App\Controller\Security\LoginFormController1100.0%
App\Controller\System\AboutController1100.0%
App\Controller\User\Index1100.0%
App\Controller\User\Read1100.0%
App\Entity\TimelineEvent1100.0%
App\Form\ProfileVisibilityType1100.0%
App\Form\StatsImportType1100.0%
App\LinkList\Link1100.0%
App\LinkList\LinkSection1100.0%
App\Security\ApiToken1100.0%
App\Validator\NoOverlappingTravel1100.0%
App\Controller\BaseController0100.0%
App\Exception\AgentNameException0100.0%
App\Exception\StatsAlreadyAddedException0100.0%
App\Import\CsvImportResult0100.0%
App\Import\CustomMedalsImportResult0100.0%
App\Notifier\ChatFeed0100.0%

Methods

Line coverage against cyclomatic complexity. Bubble size is the number of executable lines; hover for details, click to navigate.

0% 20% 40% 60% 80% 100% 0 2 4 6 8 10 Line Coverage (%) Cyclomatic Complexity App\Medal\MedalChecker::customMedals — Coverage: 100.0% | Lines: 85 | Complexity: 1 App\Entity\AgentStat::__construct — Coverage: 100.0% | Lines: 44 | Complexity: 1 App\Entity\AgentStat::getStats — Coverage: 100.0% | Lines: 42 | Complexity: 1 App\Timeline\TimelineChart::build — Coverage: 100.0% | Lines: 35 | Complexity: 9 App\Medal\MedalChecker::medals — Coverage: 100.0% | Lines: 29 | Complexity: 1 App\Command\DemoAgentsCommand::addStats — Coverage: 100.0% | Lines: 25 | Complexity: 5 App\Command\DemoAgentsCommand::__invoke — Coverage: 91.7% | Lines: 24 | Complexity: 6 App\Import\AgentStatCsvImporter::importRow — Coverage: 100.0% | Lines: 24 | Complexity: 8 App\Command\SlackTestCommand::__invoke — Coverage: 100.0% | Lines: 23 | Complexity: 7 App\Command\TelegramTestCommand::__invoke — Coverage: 100.0% | Lines: 22 | Complexity: 8 App\Controller\ProfileController::__invoke — Coverage: 100.0% | Lines: 20 | Complexity: 5 App\Controller\AgentStat\Timeline::__invoke — Coverage: 100.0% | Lines: 20 | Complexity: 4 App\Form\TimelineEventType::buildForm — Coverage: 100.0% | Lines: 20 | Complexity: 1 App\State\AgentProvider::item — Coverage: 100.0% | Lines: 19 | Complexity: 8 App\Validator\NoOverlappingTravelValidator::validate — Coverage: 89.5% | Lines: 19 | Complexity: 8 App\Command\SlackTestCommand::authTest — Coverage: 83.3% | Lines: 18 | Complexity: 7 App\Security\GoogleIdentityAuthenticator::authenticate — Coverage: 94.4% | Lines: 18 | Complexity: 6 App\State\MeProcessor::process — Coverage: 94.4% | Lines: 18 | Complexity: 5 App\Controller\Agent\Read::__invoke — Coverage: 100.0% | Lines: 17 | Complexity: 8 App\Timeline\TimelineBuilder::statEntry — Coverage: 100.0% | Lines: 17 | Complexity: 6 App\ApiResource\Bannergress::toArray — Coverage: 100.0% | Lines: 16 | Complexity: 1 App\Controller\System\LogviewController::parseLogEntries — Coverage: 100.0% | Lines: 16 | Complexity: 5 App\Import\AgentStatCsvImporter::import — Coverage: 100.0% | Lines: 16 | Complexity: 7 App\State\UserPrivacyProvider::provide — Coverage: 100.0% | Lines: 16 | Complexity: 1 App\Command\DemoAgentsCommand::removeDemoAgents — Coverage: 100.0% | Lines: 15 | Complexity: 3 App\Security\LoginFormAuthenticator::authenticate — Coverage: 100.0% | Lines: 15 | Complexity: 3 App\Controller\Agent\Timeline::__invoke — Coverage: 100.0% | Lines: 14 | Complexity: 5 App\LinkList\LinkListParser::parse — Coverage: 100.0% | Lines: 14 | Complexity: 5 App\Security\GoogleApiTokenAuthenticator::authenticate — Coverage: 85.7% | Lines: 14 | Complexity: 3 App\Service\AvatarUpdater::fetch — Coverage: 100.0% | Lines: 14 | Complexity: 4 App\State\MeProvider::provide — Coverage: 92.9% | Lines: 14 | Complexity: 3 App\Timeline\TimelineChart::monthTicks — Coverage: 100.0% | Lines: 14 | Complexity: 6 App\Bannergress\DoneBannerSync::replace — Coverage: 100.0% | Lines: 13 | Complexity: 5 App\Form\UserType::buildForm — Coverage: 100.0% | Lines: 13 | Complexity: 1 App\Notifier\ChatText::render — Coverage: 100.0% | Lines: 13 | Complexity: 5 App\Repository\TimelineEventRepository::findOverlappingTravel — Coverage: 100.0% | Lines: 13 | Complexity: 2 App\Command\DemoAgentsCommand::addDoneBanners — Coverage: 100.0% | Lines: 12 | Complexity: 3 App\Controller\AgentStat\Index::__invoke — Coverage: 100.0% | Lines: 12 | Complexity: 3 App\Controller\User\Create::__invoke — Coverage: 100.0% | Lines: 12 | Complexity: 3 App\Log\ChatLogHandler::handleBatch — Coverage: 100.0% | Lines: 12 | Complexity: 6 App\Medal\MedalChecker::customMedalTiers — Coverage: 100.0% | Lines: 12 | Complexity: 6 App\Repository\AgentStatRepository::findLatestByOwners — Coverage: 91.7% | Lines: 12 | Complexity: 3 App\Security\GoogleUserResolver::resolve — Coverage: 100.0% | Lines: 12 | Complexity: 3 App\State\AgentProvider::doneBanners — Coverage: 0.0% | Lines: 12 | Complexity: 1 App\State\AgentProvider::agent — Coverage: 100.0% | Lines: 12 | Complexity: 1 App\Command\DemoAgentsCommand::bannergress — Coverage: 100.0% | Lines: 11 | Complexity: 2 App\Command\SlackTestCommand::post — Coverage: 100.0% | Lines: 11 | Complexity: 3 App\Command\TelegramTestCommand::getMe — Coverage: 90.9% | Lines: 11 | Complexity: 4 App\Command\TelegramTestCommand::post — Coverage: 100.0% | Lines: 11 | Complexity: 3 App\Controller\AgentStat\Import::__invoke — Coverage: 100.0% | Lines: 11 | Complexity: 5 App\Controller\Banners\Read::__invoke — Coverage: 100.0% | Lines: 11 | Complexity: 4 App\Import\CustomMedalsJsonImporter::import — Coverage: 100.0% | Lines: 11 | Complexity: 3 App\Service\AgentStatService::create — Coverage: 63.6% | Lines: 11 | Complexity: 4 App\Service\AgentStatService::checkAgentName — Coverage: 100.0% | Lines: 11 | Complexity: 6 App\Timeline\TimelineBuilder::build — Coverage: 100.0% | Lines: 11 | Complexity: 6 App\Timeline\TimelineChart::timeRange — Coverage: 90.9% | Lines: 11 | Complexity: 6 App\Bannergress\BannerMap::point — Coverage: 100.0% | Lines: 10 | Complexity: 3 App\Controller\TimelineEvent\Update::__invoke — Coverage: 100.0% | Lines: 10 | Complexity: 3 App\Controller\User\Update::__invoke — Coverage: 100.0% | Lines: 10 | Complexity: 3 App\Security\GoogleApiTokenAuthenticator::unauthorized — Coverage: 100.0% | Lines: 10 | Complexity: 1 App\Timeline\TimelineChart::band — Coverage: 100.0% | Lines: 10 | Complexity: 2 App\Command\DemoAgentsCommand::newYearTravel — Coverage: 100.0% | Lines: 9 | Complexity: 6 App\Form\ProfileVisibilityType::buildForm — Coverage: 100.0% | Lines: 9 | Complexity: 1 App\Form\StatsImportType::buildForm — Coverage: 100.0% | Lines: 9 | Complexity: 1 App\Import\AgentStatCsvImporter::defaults — Coverage: 88.9% | Lines: 9 | Complexity: 4 App\Medal\MedalChecker::medalLevels — Coverage: 100.0% | Lines: 9 | Complexity: 4 App\Security\ApiTokenStore::fromSession — Coverage: 100.0% | Lines: 9 | Complexity: 6 App\Security\FakeGoogleIdTokenVerifier::verify — Coverage: 88.9% | Lines: 9 | Complexity: 4 App\Timeline\TimelineChart::niceRange — Coverage: 100.0% | Lines: 9 | Complexity: 6 App\ApiResource\Bannergress::fromArray — Coverage: 100.0% | Lines: 8 | Complexity: 1 App\Bannergress\DoneBannerSync::update — Coverage: 100.0% | Lines: 8 | Complexity: 5 App\Command\DemoAgentsCommand::banners — Coverage: 100.0% | Lines: 8 | Complexity: 1 App\Command\DemoAgentsCommand::addEvents — Coverage: 100.0% | Lines: 8 | Complexity: 4 App\Command\DemoAgentsCommand::avatar — Coverage: 100.0% | Lines: 8 | Complexity: 3 App\Controller\Banners\DoneAt::__invoke — Coverage: 100.0% | Lines: 8 | Complexity: 4 App\Controller\Banners\Index::__invoke — Coverage: 100.0% | Lines: 8 | Complexity: 2 App\Controller\Locale\Switcher::__invoke — Coverage: 100.0% | Lines: 8 | Complexity: 2 App\Controller\Security\LoginFormController::__invoke — Coverage: 100.0% | Lines: 8 | Complexity: 1 App\Controller\System\AboutController::__invoke — Coverage: 100.0% | Lines: 8 | Complexity: 1 App\Controller\System\LogviewController::__invoke — Coverage: 100.0% | Lines: 8 | Complexity: 2 App\Import\AgentStatCsvImporter::values — Coverage: 100.0% | Lines: 8 | Complexity: 6 App\Import\CustomMedalsJsonImporter::decode — Coverage: 100.0% | Lines: 8 | Complexity: 3 App\Import\CustomMedalsJsonImporter::merge — Coverage: 100.0% | Lines: 8 | Complexity: 4 App\Medal\Medal::badge — Coverage: 100.0% | Lines: 8 | Complexity: 7 App\Repository\UserRepository::findAllByAgentName — Coverage: 100.0% | Lines: 8 | Complexity: 1 App\Service\AvatarUpdater::update — Coverage: 100.0% | Lines: 8 | Complexity: 6 App\State\AgentProvider::provide — Coverage: 100.0% | Lines: 8 | Complexity: 4 App\Bannergress\BannerMap::points — Coverage: 100.0% | Lines: 7 | Complexity: 4 App\Command\TelegramTestCommand::chats — Coverage: 100.0% | Lines: 7 | Complexity: 4 App\Controller\System\LogviewController::readLines — Coverage: 100.0% | Lines: 7 | Complexity: 3 App\Doctrine\AgentStatOwnerExtension::applyToCollection — Coverage: 85.7% | Lines: 7 | Complexity: 2 App\Enum\ProfilePart::icon — Coverage: 100.0% | Lines: 7 | Complexity: 7 App\EventListener\ChooseVisibilityListener::__invoke — Coverage: 100.0% | Lines: 7 | Complexity: 5 App\EventListener\LocaleListener::__invoke — Coverage: 100.0% | Lines: 7 | Complexity: 3 App\LinkList\LinkListLoader::load — Coverage: 85.7% | Lines: 7 | Complexity: 2 App\LinkList\LinkListParser::listEntries — Coverage: 100.0% | Lines: 7 | Complexity: 4 App\LinkList\LinkListParser::text — Coverage: 100.0% | Lines: 7 | Complexity: 4 App\Log\ChatLogHandler::line — Coverage: 100.0% | Lines: 7 | Complexity: 3 App\Notifier\ChatActivity::statsUploaded — Coverage: 100.0% | Lines: 7 | Complexity: 3 App\Notifier\ChatSender::sendTo — Coverage: 100.0% | Lines: 7 | Complexity: 3 App\Security\ApiTokenStore::get — Coverage: 100.0% | Lines: 7 | Complexity: 4 App\Security\GoogleIdentityAuthenticator::onAuthenticationFailure — Coverage: 100.0% | Lines: 7 | Complexity: 1 App\Security\GoogleUserResolver::identity — Coverage: 100.0% | Lines: 7 | Complexity: 6 App\Timeline\TimelineBuilder::eventEntries — Coverage: 100.0% | Lines: 7 | Complexity: 2 App\ApiResource\CustomMedals::error — Coverage: 100.0% | Lines: 6 | Complexity: 9 App\Command\DemoAgentsCommand::pace — Coverage: 100.0% | Lines: 6 | Complexity: 5 App\Command\DemoAgentsCommand::event — Coverage: 100.0% | Lines: 6 | Complexity: 1 App\Command\SlackTestCommand::slackError — Coverage: 50.0% | Lines: 6 | Complexity: 4 App\Command\TelegramTestCommand::showSetup — Coverage: 100.0% | Lines: 6 | Complexity: 3 App\Command\TelegramTestCommand::listChats — Coverage: 66.7% | Lines: 6 | Complexity: 2 App\Command\TelegramTestCommand::call — Coverage: 50.0% | Lines: 6 | Complexity: 2 App\Command\TelegramTestCommand::telegramError — Coverage: 50.0% | Lines: 6 | Complexity: 4 App\Controller\AgentStat\Import::medalsImported — Coverage: 100.0% | Lines: 6 | Complexity: 2 App\Controller\System\LogviewController::closeEntry — Coverage: 83.3% | Lines: 6 | Complexity: 3 App\Dto\AgentStatInput::validateRanges — Coverage: 100.0% | Lines: 6 | Complexity: 5 App\Import\CustomMedalsJsonImporter::rank — Coverage: 100.0% | Lines: 6 | Complexity: 8 App\LinkList\LinkListParser::region — Coverage: 100.0% | Lines: 6 | Complexity: 4 App\LinkList\LinkListParser::description — Coverage: 100.0% | Lines: 6 | Complexity: 3 App\Notifier\ChatSender::send — Coverage: 100.0% | Lines: 6 | Complexity: 3 App\Repository\AgentStatRepository::findPrevious — Coverage: 100.0% | Lines: 6 | Complexity: 2 App\Repository\UserRepository::findOneByAgentName — Coverage: 100.0% | Lines: 6 | Complexity: 1 App\Repository\UserRepository::findVisibleAgents — Coverage: 100.0% | Lines: 6 | Complexity: 1 App\Security\GoogleIdTokenVerifier::verify — Coverage: 0.0% | Lines: 6 | Complexity: 3 App\Security\GoogleIdentityAuthenticator::onAuthenticationSuccess — Coverage: 100.0% | Lines: 6 | Complexity: 2 App\Security\LoginFormAuthenticator::onAuthenticationSuccess — Coverage: 100.0% | Lines: 6 | Complexity: 2 App\State\AgentProvider::row — Coverage: 100.0% | Lines: 6 | Complexity: 1 App\State\AgentStatProcessor::process — Coverage: 83.3% | Lines: 6 | Complexity: 2 App\State\MeProcessor::saveParts — Coverage: 100.0% | Lines: 6 | Complexity: 6 App\ApiResource\CustomMedals::validate — Coverage: 100.0% | Lines: 5 | Complexity: 4 App\Controller\Agent\Index::__invoke — Coverage: 100.0% | Lines: 5 | Complexity: 1 App\Controller\AgentStat\Import::importStats — Coverage: 80.0% | Lines: 5 | Complexity: 2 App\Controller\AgentStat\Import::statsImported — Coverage: 100.0% | Lines: 5 | Complexity: 2 App\Controller\AgentStat\Import::flashErrors — Coverage: 100.0% | Lines: 5 | Complexity: 2 App\Controller\AgentStat\Read::__invoke — Coverage: 100.0% | Lines: 5 | Complexity: 1 App\Controller\TimelineEvent\Delete::__invoke — Coverage: 100.0% | Lines: 5 | Complexity: 2 App\Controller\User\Delete::__invoke — Coverage: 100.0% | Lines: 5 | Complexity: 2 App\Controller\User\Index::__invoke — Coverage: 100.0% | Lines: 5 | Complexity: 1 App\Entity\User::chooseVisibleParts — Coverage: 100.0% | Lines: 5 | Complexity: 2 App\Import\CustomMedalsJsonImporter::importMedal — Coverage: 100.0% | Lines: 5 | Complexity: 5 App\LinkList\LinkListParser::entries — Coverage: 100.0% | Lines: 5 | Complexity: 4 App\LinkList\LinkListParser::link — Coverage: 100.0% | Lines: 5 | Complexity: 6 App\LinkList\LinkListParser::firstLink — Coverage: 80.0% | Lines: 5 | Complexity: 5 App\Log\BotTokenProcessor::__invoke — Coverage: 100.0% | Lines: 5 | Complexity: 1 App\Log\BotTokenProcessor::maskAll — Coverage: 100.0% | Lines: 5 | Complexity: 2 App\Medal\CustomMedal::image — Coverage: 100.0% | Lines: 5 | Complexity: 5 App\Medal\Medal::level — Coverage: 100.0% | Lines: 5 | Complexity: 3 App\Medal\MedalChecker::coreBadges — Coverage: 100.0% | Lines: 5 | Complexity: 4 App\Notifier\ChatActivity::send — Coverage: 80.0% | Lines: 5 | Complexity: 3 App\Repository\DoneBannerRepository::findDatedByOwner — Coverage: 100.0% | Lines: 5 | Complexity: 1 App\State\TimelineEventProcessor::process — Coverage: 80.0% | Lines: 5 | Complexity: 2 App\Timeline\TimelineChart::path — Coverage: 100.0% | Lines: 5 | Complexity: 2 App\Timeline\TimelineChart::compact — Coverage: 80.0% | Lines: 5 | Complexity: 4 App\ApiResource\CustomMedals::fromArray — Coverage: 100.0% | Lines: 4 | Complexity: 1 App\ApiResource\CustomMedals::toArray — Coverage: 100.0% | Lines: 4 | Complexity: 1 App\Command\DemoAgentsCommand::relativeEvent — Coverage: 100.0% | Lines: 4 | Complexity: 4 App\Command\TelegramTestCommand::chat — Coverage: 75.0% | Lines: 4 | Complexity: 4 App\Controller\Agent\Read::agent — Coverage: 100.0% | Lines: 4 | Complexity: 3 App\Controller\Banners\DoneAt::day — Coverage: 100.0% | Lines: 4 | Complexity: 4 App\Controller\Links\Index::__invoke — Coverage: 100.0% | Lines: 4 | Complexity: 1 App\Dto\AgentStatInput::getDateTime — Coverage: 75.0% | Lines: 4 | Complexity: 2 App\Entity\AgentStat::getFactionCode — Coverage: 100.0% | Lines: 4 | Complexity: 4 App\Entity\User::__serialize — Coverage: 100.0% | Lines: 4 | Complexity: 1 App\Import\CustomMedalsJsonImporter::known — Coverage: 100.0% | Lines: 4 | Complexity: 2 App\Notifier\ChatActivity::statsImported — Coverage: 75.0% | Lines: 4 | Complexity: 3 App\Notifier\ChatText::add — Coverage: 75.0% | Lines: 4 | Complexity: 2 App\Repository\UserRepository::findUsers — Coverage: 100.0% | Lines: 4 | Complexity: 1 App\Security\ApiTokenStore::store — Coverage: 100.0% | Lines: 4 | Complexity: 2 App\Timeline\TimelineBuilder::inTravel — Coverage: 100.0% | Lines: 4 | Complexity: 3 App\Timeline\TimelineEntry::kind — Coverage: 100.0% | Lines: 4 | Complexity: 5 App\Timeline\TimelineEntry::counts — Coverage: 100.0% | Lines: 4 | Complexity: 1 App\Command\SlackTestCommand::hint — Coverage: 100.0% | Lines: 3 | Complexity: 4 App\Command\TelegramTestCommand::hint — Coverage: 100.0% | Lines: 3 | Complexity: 3 App\Controller\System\LogviewController::openEntry — Coverage: 100.0% | Lines: 3 | Complexity: 2 App\Controller\User\Read::__invoke — Coverage: 100.0% | Lines: 3 | Complexity: 1 App\Entity\User::getRoles — Coverage: 100.0% | Lines: 3 | Complexity: 1 App\Entity\User::getParam — Coverage: 0.0% | Lines: 3 | Complexity: 2 App\Entity\User::getUserIdentifier — Coverage: 100.0% | Lines: 3 | Complexity: 2 App\Entity\User::isVisible — Coverage: 100.0% | Lines: 3 | Complexity: 3 App\Entity\User::setAvatar — Coverage: 100.0% | Lines: 3 | Complexity: 1 App\Enum\UserRole::cssClass — Coverage: 100.0% | Lines: 3 | Complexity: 3 App\Enum\UserRole::label — Coverage: 100.0% | Lines: 3 | Complexity: 3 App\Form\TimelineEventType::configureOptions — Coverage: 100.0% | Lines: 3 | Complexity: 1 App\Form\UserType::configureOptions — Coverage: 100.0% | Lines: 3 | Complexity: 1 App\Import\CustomMedalsJsonImporter::entries — Coverage: 100.0% | Lines: 3 | Complexity: 4 App\LinkList\LinkListParser::__construct — Coverage: 100.0% | Lines: 3 | Complexity: 1 App\Medal\CustomMedalTier::label — Coverage: 100.0% | Lines: 3 | Complexity: 2 App\Notifier\ChatSender::recipients — Coverage: 100.0% | Lines: 3 | Complexity: 3 App\Security\DevGoogleIdTokenVerifier::verify — Coverage: 100.0% | Lines: 3 | Complexity: 3 App\Security\Voter\AgentStatVoter::voteOnAttribute — Coverage: 100.0% | Lines: 3 | Complexity: 2 App\Security\Voter\DoneBannerVoter::voteOnAttribute — Coverage: 100.0% | Lines: 3 | Complexity: 2 App\Security\Voter\TimelineEventVoter::voteOnAttribute — Coverage: 100.0% | Lines: 3 | Complexity: 2 App\State\MeProcessor::saveBannergress — Coverage: 100.0% | Lines: 3 | Complexity: 1 App\State\MeProcessor::sentFields — Coverage: 100.0% | Lines: 3 | Complexity: 3 App\Timeline\TimelineChart::decimals — Coverage: 66.7% | Lines: 3 | Complexity: 3 App\Command\DemoAgentsCommand::shares — Coverage: 100.0% | Lines: 2 | Complexity: 2 App\Controller\Agent\Read::timelineCounts — Coverage: 100.0% | Lines: 2 | Complexity: 2 App\Entity\User::__unserialize — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Entity\User::setCustomMedals — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Entity\User::setBannergress — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Entity\User::setParams — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Entity\User::setIdentifier — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Entity\User::setGoogleId — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Entity\User::setAgentName — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Entity\User::isAgentName — Coverage: 100.0% | Lines: 2 | Complexity: 2 App\Entity\User::setRole — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Log\ChatLogHandler::handle — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Service\AvatarUpdater::isGooglePicture — Coverage: 100.0% | Lines: 2 | Complexity: 3 App\Timeline\TimelineChart::flag — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\Timeline\TimelineEntry::days — Coverage: 100.0% | Lines: 2 | Complexity: 1 App\ApiResource\Agent::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\ApiResource\Bannergress::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\ApiResource\Bannergress::fromStored — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\ApiResource\CustomMedals::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\ApiResource\CustomMedals::isKey — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\ApiResource\LinkList::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\ApiResource\Me::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\ApiResource\UserPrivacy::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Bannergress\BannerMap::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Bannergress\DoneBannerSync::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Command\DemoAgentsCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Command\SlackTestCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Command\TelegramTestCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Command\TelegramTestCommand::arrays — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\Command\TelegramTestCommand::string — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\Command\UserAdminCommand::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Command\UserAdminCommand::getRoles — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Command\UserAdminCommand::setRole — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Controller\DefaultController::__invoke — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Controller\Security\GoogleIdentityController::connectVerify — Coverage: 0.0% | Lines: 1 | Complexity: 1 App\Controller\Security\Logout::__invoke — Coverage: 0.0% | Lines: 1 | Complexity: 1 App\Doctrine\AgentStatOwnerExtension::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Dto\AgentStatInput::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Entity\DoneBanner::getUrl — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Entity\DoneBanner::getPictureUrl — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\Entity\TimelineEvent::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Entity\User::getParams — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Entity\User::getCustomMedals — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Entity\User::getBannergress — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Entity\User::getIdentifier — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Entity\User::getPassword — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Entity\User::getGoogleId — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Entity\User::getAgentName — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Entity\User::getVisibleParts — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Entity\User::getAvatar — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Entity\User::getVisibleAvatar — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\Entity\User::getAvatarSource — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Entity\User::getVisibilityChosenAt — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Entity\User::getRole — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Enum\ProfilePart::label — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Enum\ProfilePart::help — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\EventListener\ChooseVisibilityListener::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\EventListener\LocaleListener::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Import\AgentStatCsvImporter::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Import\CustomMedalsJsonImporter::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\LinkList\Link::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\LinkList\LinkListLoader::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\LinkList\LinkListParser::line — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\LinkList\LinkSection::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Log\BotTokenProcessor::mask — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Log\ChatLogHandler::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Log\ChatLogHandler::isPosted — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\Medal\CustomMedal::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Medal\CustomMedalTier::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Medal\CustomMedalTier::image — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Medal\Medal::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Medal\Medal::onyxCount — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\Medal\MedalLevel::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Medal\MedalLevel::badge — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\Medal\MedalLevel::levelName — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\Medal\MedalLevel::onyxCount — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Notifier\ChatActivity::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Notifier\ChatActivity::userRegistered — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Notifier\ChatActivity::reset — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Notifier\ChatActivity::agent — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Notifier\ChatActivity::userUrl — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Notifier\ChatSender::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Notifier\ChatText::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Notifier\ChatText::text — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Notifier\ChatText::bold — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Notifier\ChatText::code — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Notifier\ChatText::link — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Notifier\ChatText::plain — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Notifier\ChatText::forSlack — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Notifier\ChatText::forTelegram — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Notifier\ChatText::escapeSlack — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Repository\AgentStatRepository::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Repository\AgentStatRepository::findByOwner — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Repository\AgentStatRepository::has — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Repository\DoneBannerRepository::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Repository\DoneBannerRepository::findByOwner — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Repository\TimelineEventRepository::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Repository\TimelineEventRepository::findByOwner — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Repository\UserRepository::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Security\ApiToken::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Security\ApiTokenStore::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Security\DevGoogleIdTokenVerifier::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Security\FakeGoogleIdTokenVerifier::token — Coverage: 100.0% | Lines: 1 | Complexity: 3 App\Security\GoogleApiTokenAuthenticator::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Security\GoogleApiTokenAuthenticator::supports — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Security\GoogleApiTokenAuthenticator::onAuthenticationSuccess — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Security\GoogleApiTokenAuthenticator::onAuthenticationFailure — Coverage: 0.0% | Lines: 1 | Complexity: 1 App\Security\GoogleApiTokenAuthenticator::start — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Security\GoogleIdTokenVerifier::__construct — Coverage: 0.0% | Lines: 1 | Complexity: 1 App\Security\GoogleIdentityAuthenticator::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Security\GoogleIdentityAuthenticator::supports — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Security\GoogleUserResolver::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Security\LoginFormAuthenticator::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Security\LoginFormAuthenticator::getLoginUrl — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Security\Voter\AgentStatVoter::supports — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\Security\Voter\DoneBannerVoter::supports — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\Security\Voter\TimelineEventVoter::supports — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\Service\AgentStatService::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Service\AvatarUpdater::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\State\AgentProvider::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\State\AgentStatProcessor::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\State\LinkListProvider::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\State\LinkListProvider::provide — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\State\MeProcessor::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\State\MeProvider::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\State\TimelineEventProcessor::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\State\UserPrivacyProvider::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Timeline\TimelineBuilder::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Timeline\TimelineChart::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Timeline\TimelineChart::dense — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Timeline\TimelineChart::date — Coverage: 100.0% | Lines: 1 | Complexity: 3 App\Timeline\TimelineChart::within — Coverage: 100.0% | Lines: 1 | Complexity: 4 App\Timeline\TimelineChart::day — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Timeline\TimelineChart::startOf — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Timeline\TimelineEntry::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Timeline\TimelineEntry::withInTravel — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Timeline\TimelineEntry::isMilestone — Coverage: 100.0% | Lines: 1 | Complexity: 2 App\Timeline\TimelineEntry::isListed — Coverage: 100.0% | Lines: 1 | Complexity: 4 App\Validator\NoOverlappingTravel::getTargets — Coverage: 100.0% | Lines: 1 | Complexity: 1 App\Validator\NoOverlappingTravelValidator::__construct — Coverage: 100.0% | Lines: 1 | Complexity: 1

Sorted by descending CRAP index.

Method CRAP Coverage
App\Security\GoogleIdTokenVerifier::verify120.0%
App\ApiResource\CustomMedals::error9100.0%
App\Timeline\TimelineChart::build9100.0%
App\Validator\NoOverlappingTravelValidator::validate8.0789.5%
App\Command\TelegramTestCommand::__invoke8100.0%
App\Controller\Agent\Read::__invoke8100.0%
App\Import\AgentStatCsvImporter::importRow8100.0%
App\Import\CustomMedalsJsonImporter::rank8100.0%
App\State\AgentProvider::item8100.0%
App\Command\SlackTestCommand::authTest7.2383.3%
App\Command\SlackTestCommand::__invoke7100.0%
App\Enum\ProfilePart::icon7100.0%
App\Import\AgentStatCsvImporter::import7100.0%
App\Medal\Medal::badge7100.0%
App\Timeline\TimelineChart::timeRange6.0390.9%
App\Command\DemoAgentsCommand::__invoke6.0291.7%
App\Security\GoogleIdentityAuthenticator::authenticate6.0194.4%
App\Command\DemoAgentsCommand::newYearTravel6100.0%
App\Command\SlackTestCommand::slackError6.0050.0%
App\Command\TelegramTestCommand::telegramError6.0050.0%
App\Entity\User::getParam60.0%
App\Import\AgentStatCsvImporter::values6100.0%
App\LinkList\LinkListParser::link6100.0%
App\Log\ChatLogHandler::handleBatch6100.0%
App\Medal\MedalChecker::customMedalTiers6100.0%
App\Security\ApiTokenStore::fromSession6100.0%
App\Security\GoogleUserResolver::identity6100.0%
App\Service\AgentStatService::checkAgentName6100.0%
App\Service\AvatarUpdater::update6100.0%
App\State\MeProcessor::saveParts6100.0%
App\Timeline\TimelineBuilder::build6100.0%
App\Timeline\TimelineBuilder::statEntry6100.0%
App\Timeline\TimelineChart::niceRange6100.0%
App\Timeline\TimelineChart::monthTicks6100.0%
App\LinkList\LinkListParser::firstLink5.2080.0%
App\Bannergress\DoneBannerSync::replace5100.0%
App\Bannergress\DoneBannerSync::update5100.0%
App\Command\DemoAgentsCommand::addStats5100.0%
App\Command\DemoAgentsCommand::pace5100.0%
App\Controller\ProfileController::__invoke5100.0%
App\Controller\Agent\Timeline::__invoke5100.0%
App\Controller\AgentStat\Import::__invoke5100.0%
App\Controller\System\LogviewController::parseLogEntries5100.0%
App\Dto\AgentStatInput::validateRanges5100.0%
App\EventListener\ChooseVisibilityListener::__invoke5100.0%
App\Import\CustomMedalsJsonImporter::importMedal5100.0%
App\LinkList\LinkListParser::parse5100.0%
App\Medal\CustomMedal::image5100.0%
App\Notifier\ChatText::render5100.0%
App\State\MeProcessor::process5.0094.4%
App\Timeline\TimelineEntry::kind5100.0%
App\Service\AgentStatService::create4.7763.6%
App\Command\TelegramTestCommand::chat4.2575.0%
App\Timeline\TimelineChart::compact4.1380.0%
App\Import\AgentStatCsvImporter::defaults4.0288.9%
App\Security\FakeGoogleIdTokenVerifier::verify4.0288.9%
App\Command\TelegramTestCommand::getMe4.0190.9%
App\ApiResource\CustomMedals::validate4100.0%
App\Bannergress\BannerMap::points4100.0%
App\Command\DemoAgentsCommand::addEvents4100.0%
App\Command\DemoAgentsCommand::relativeEvent4100.0%
App\Command\SlackTestCommand::hint4100.0%
App\Command\TelegramTestCommand::chats4100.0%
App\Controller\AgentStat\Timeline::__invoke4100.0%
App\Controller\Banners\DoneAt::__invoke4100.0%
App\Controller\Banners\DoneAt::day4100.0%
App\Controller\Banners\Read::__invoke4100.0%
App\Entity\AgentStat::getFactionCode4100.0%
App\Import\CustomMedalsJsonImporter::entries4100.0%
App\Import\CustomMedalsJsonImporter::merge4100.0%
App\LinkList\LinkListParser::entries4100.0%
App\LinkList\LinkListParser::listEntries4100.0%
App\LinkList\LinkListParser::region4100.0%
App\LinkList\LinkListParser::text4100.0%
App\Medal\MedalChecker::medalLevels4100.0%
App\Medal\MedalChecker::coreBadges4100.0%
App\Security\ApiTokenStore::get4100.0%
App\Service\AvatarUpdater::fetch4100.0%
App\State\AgentProvider::provide4100.0%
App\Timeline\TimelineChart::within4100.0%
App\Timeline\TimelineEntry::isListed4100.0%
App\Timeline\TimelineChart::decimals3.3366.7%
App\Notifier\ChatActivity::statsImported3.1475.0%
App\Notifier\ChatActivity::send3.0780.0%
App\Controller\System\LogviewController::closeEntry3.0483.3%
App\Security\GoogleApiTokenAuthenticator::authenticate3.0385.7%
App\Repository\AgentStatRepository::findLatestByOwners3.0191.7%
App\Bannergress\BannerMap::point3100.0%
App\Command\DemoAgentsCommand::removeDemoAgents3100.0%
App\Command\DemoAgentsCommand::addDoneBanners3100.0%
App\Command\DemoAgentsCommand::avatar3100.0%
App\Command\SlackTestCommand::post3100.0%
App\Command\TelegramTestCommand::showSetup3100.0%
App\Command\TelegramTestCommand::post3100.0%
App\Command\TelegramTestCommand::hint3100.0%
App\Controller\Agent\Read::agent3100.0%
App\Controller\AgentStat\Index::__invoke3100.0%
App\Controller\System\LogviewController::readLines3100.0%
App\Controller\TimelineEvent\Update::__invoke3100.0%
App\Controller\User\Create::__invoke3100.0%
App\Controller\User\Update::__invoke3100.0%
App\Entity\User::isVisible3100.0%
App\Enum\UserRole::cssClass3100.0%
App\Enum\UserRole::label3100.0%
App\EventListener\LocaleListener::__invoke3100.0%
App\Import\CustomMedalsJsonImporter::import3100.0%
App\Import\CustomMedalsJsonImporter::decode3100.0%
App\LinkList\LinkListParser::description3100.0%
App\Log\ChatLogHandler::line3100.0%
App\Medal\Medal::level3100.0%
App\Notifier\ChatActivity::statsUploaded3100.0%
App\Notifier\ChatSender::recipients3100.0%
App\Notifier\ChatSender::send3100.0%
App\Notifier\ChatSender::sendTo3100.0%
App\Security\DevGoogleIdTokenVerifier::verify3100.0%
App\Security\FakeGoogleIdTokenVerifier::token3100.0%
App\Security\GoogleUserResolver::resolve3100.0%
App\Security\LoginFormAuthenticator::authenticate3100.0%
App\Service\AvatarUpdater::isGooglePicture3100.0%
App\State\MeProcessor::sentFields3100.0%
App\State\MeProvider::provide3.0092.9%
App\Timeline\TimelineBuilder::inTravel3100.0%
App\Timeline\TimelineChart::date3100.0%
App\Command\TelegramTestCommand::call2.5050.0%
App\Command\TelegramTestCommand::listChats2.1566.7%
App\Dto\AgentStatInput::getDateTime2.0675.0%
App\Notifier\ChatText::add2.0675.0%
App\Controller\AgentStat\Import::importStats2.0380.0%
App\State\TimelineEventProcessor::process2.0380.0%
App\State\AgentStatProcessor::process2.0283.3%
App\Doctrine\AgentStatOwnerExtension::applyToCollection2.0185.7%
App\LinkList\LinkListLoader::load2.0185.7%
App\ApiResource\Bannergress::fromStored2100.0%
App\Command\DemoAgentsCommand::bannergress2100.0%
App\Command\DemoAgentsCommand::shares2100.0%
App\Command\TelegramTestCommand::arrays2100.0%
App\Command\TelegramTestCommand::string2100.0%
App\Controller\Agent\Read::timelineCounts2100.0%
App\Controller\AgentStat\Import::statsImported2100.0%
App\Controller\AgentStat\Import::medalsImported2100.0%
App\Controller\AgentStat\Import::flashErrors2100.0%
App\Controller\Banners\Index::__invoke2100.0%
App\Controller\Locale\Switcher::__invoke2100.0%
App\Controller\Security\GoogleIdentityController::connectVerify20.0%
App\Controller\Security\Logout::__invoke20.0%
App\Controller\System\LogviewController::__invoke2100.0%
App\Controller\System\LogviewController::openEntry2100.0%
App\Controller\TimelineEvent\Delete::__invoke2100.0%
App\Controller\User\Delete::__invoke2100.0%
App\Entity\DoneBanner::getPictureUrl2100.0%
App\Entity\User::getUserIdentifier2100.0%
App\Entity\User::isAgentName2100.0%
App\Entity\User::chooseVisibleParts2100.0%
App\Entity\User::getVisibleAvatar2100.0%
App\Import\CustomMedalsJsonImporter::known2100.0%
App\LinkList\LinkListParser::line2100.0%
App\Log\BotTokenProcessor::maskAll2100.0%
App\Log\ChatLogHandler::isPosted2100.0%
App\Medal\CustomMedalTier::label2100.0%
App\Medal\Medal::onyxCount2100.0%
App\Medal\MedalLevel::badge2100.0%
App\Medal\MedalLevel::levelName2100.0%
App\Repository\AgentStatRepository::findPrevious2100.0%
App\Repository\TimelineEventRepository::findOverlappingTravel2100.0%
App\Security\ApiTokenStore::store2100.0%
App\Security\GoogleApiTokenAuthenticator::onAuthenticationFailure20.0%
App\Security\GoogleIdTokenVerifier::__construct20.0%
App\Security\GoogleIdentityAuthenticator::onAuthenticationSuccess2100.0%
App\Security\LoginFormAuthenticator::onAuthenticationSuccess2100.0%
App\Security\Voter\AgentStatVoter::supports2100.0%
App\Security\Voter\AgentStatVoter::voteOnAttribute2100.0%
App\Security\Voter\DoneBannerVoter::supports2100.0%
App\Security\Voter\DoneBannerVoter::voteOnAttribute2100.0%
App\Security\Voter\TimelineEventVoter::supports2100.0%
App\Security\Voter\TimelineEventVoter::voteOnAttribute2100.0%
App\State\AgentProvider::doneBanners20.0%
App\Timeline\TimelineBuilder::eventEntries2100.0%
App\Timeline\TimelineChart::path2100.0%
App\Timeline\TimelineChart::band2100.0%
App\Timeline\TimelineEntry::isMilestone2100.0%
App\ApiResource\Agent::__construct1100.0%
App\ApiResource\Bannergress::__construct1100.0%
App\ApiResource\Bannergress::fromArray1100.0%
App\ApiResource\Bannergress::toArray1100.0%
App\ApiResource\CustomMedals::__construct1100.0%
App\ApiResource\CustomMedals::fromArray1100.0%
App\ApiResource\CustomMedals::toArray1100.0%
App\ApiResource\CustomMedals::isKey1100.0%
App\ApiResource\LinkList::__construct1100.0%
App\ApiResource\Me::__construct1100.0%
App\ApiResource\UserPrivacy::__construct1100.0%
App\Bannergress\BannerMap::__construct1100.0%
App\Bannergress\DoneBannerSync::__construct1100.0%
App\Command\DemoAgentsCommand::__construct1100.0%
App\Command\DemoAgentsCommand::banners1100.0%
App\Command\DemoAgentsCommand::event1100.0%
App\Command\SlackTestCommand::__construct1100.0%
App\Command\TelegramTestCommand::__construct1100.0%
App\Command\UserAdminCommand::__construct1100.0%
App\Command\UserAdminCommand::getRoles1100.0%
App\Command\UserAdminCommand::setRole1100.0%
App\Controller\DefaultController::__invoke1100.0%
App\Controller\Agent\Index::__invoke1100.0%
App\Controller\AgentStat\Read::__invoke1100.0%
App\Controller\Links\Index::__invoke1100.0%
App\Controller\Security\LoginFormController::__invoke1100.0%
App\Controller\System\AboutController::__invoke1100.0%
App\Controller\User\Index::__invoke1100.0%
App\Controller\User\Read::__invoke1100.0%
App\Doctrine\AgentStatOwnerExtension::__construct1100.0%
App\Dto\AgentStatInput::__construct1100.0%
App\Entity\AgentStat::__construct1100.0%
App\Entity\AgentStat::getStats1100.0%
App\Entity\DoneBanner::getUrl1100.0%
App\Entity\TimelineEvent::__construct1100.0%
App\Entity\User::__serialize1100.0%
App\Entity\User::__unserialize1100.0%
App\Entity\User::getRoles1100.0%
App\Entity\User::getParams1100.0%
App\Entity\User::getCustomMedals1100.0%
App\Entity\User::setCustomMedals1100.0%
App\Entity\User::getBannergress1100.0%
App\Entity\User::setBannergress1100.0%
App\Entity\User::setParams1100.0%
App\Entity\User::getIdentifier1100.0%
App\Entity\User::setIdentifier1100.0%
App\Entity\User::getPassword1100.0%
App\Entity\User::getGoogleId1100.0%
App\Entity\User::setGoogleId1100.0%
App\Entity\User::getAgentName1100.0%
App\Entity\User::setAgentName1100.0%
App\Entity\User::getVisibleParts1100.0%
App\Entity\User::getAvatar1100.0%
App\Entity\User::getAvatarSource1100.0%
App\Entity\User::setAvatar1100.0%
App\Entity\User::getVisibilityChosenAt1100.0%
App\Entity\User::setRole1100.0%
App\Entity\User::getRole1100.0%
App\Enum\ProfilePart::label1100.0%
App\Enum\ProfilePart::help1100.0%
App\EventListener\ChooseVisibilityListener::__construct1100.0%
App\EventListener\LocaleListener::__construct1100.0%
App\Form\ProfileVisibilityType::buildForm1100.0%
App\Form\StatsImportType::buildForm1100.0%
App\Form\TimelineEventType::buildForm1100.0%
App\Form\TimelineEventType::configureOptions1100.0%
App\Form\UserType::buildForm1100.0%
App\Form\UserType::configureOptions1100.0%
App\Import\AgentStatCsvImporter::__construct1100.0%
App\Import\CustomMedalsJsonImporter::__construct1100.0%
App\LinkList\Link::__construct1100.0%
App\LinkList\LinkListLoader::__construct1100.0%
App\LinkList\LinkListParser::__construct1100.0%
App\LinkList\LinkSection::__construct1100.0%
App\Log\BotTokenProcessor::__invoke1100.0%
App\Log\BotTokenProcessor::mask1100.0%
App\Log\ChatLogHandler::__construct1100.0%
App\Log\ChatLogHandler::handle1100.0%
App\Medal\CustomMedal::__construct1100.0%
App\Medal\CustomMedalTier::__construct1100.0%
App\Medal\CustomMedalTier::image1100.0%
App\Medal\Medal::__construct1100.0%
App\Medal\MedalChecker::medals1100.0%
App\Medal\MedalChecker::customMedals1100.0%
App\Medal\MedalLevel::__construct1100.0%
App\Medal\MedalLevel::onyxCount1100.0%
App\Notifier\ChatActivity::__construct1100.0%
App\Notifier\ChatActivity::userRegistered1100.0%
App\Notifier\ChatActivity::reset1100.0%
App\Notifier\ChatActivity::agent1100.0%
App\Notifier\ChatActivity::userUrl1100.0%
App\Notifier\ChatSender::__construct1100.0%
App\Notifier\ChatText::__construct1100.0%
App\Notifier\ChatText::text1100.0%
App\Notifier\ChatText::bold1100.0%
App\Notifier\ChatText::code1100.0%
App\Notifier\ChatText::link1100.0%
App\Notifier\ChatText::plain1100.0%
App\Notifier\ChatText::forSlack1100.0%
App\Notifier\ChatText::forTelegram1100.0%
App\Notifier\ChatText::escapeSlack1100.0%
App\Repository\AgentStatRepository::__construct1100.0%
App\Repository\AgentStatRepository::findByOwner1100.0%
App\Repository\AgentStatRepository::has1100.0%
App\Repository\DoneBannerRepository::__construct1100.0%
App\Repository\DoneBannerRepository::findByOwner1100.0%
App\Repository\DoneBannerRepository::findDatedByOwner1100.0%
App\Repository\TimelineEventRepository::__construct1100.0%
App\Repository\TimelineEventRepository::findByOwner1100.0%
App\Repository\UserRepository::__construct1100.0%
App\Repository\UserRepository::findOneByAgentName1100.0%
App\Repository\UserRepository::findUsers1100.0%
App\Repository\UserRepository::findVisibleAgents1100.0%
App\Repository\UserRepository::findAllByAgentName1100.0%
App\Security\ApiToken::__construct1100.0%
App\Security\ApiTokenStore::__construct1100.0%
App\Security\DevGoogleIdTokenVerifier::__construct1100.0%
App\Security\GoogleApiTokenAuthenticator::__construct1100.0%
App\Security\GoogleApiTokenAuthenticator::supports1100.0%
App\Security\GoogleApiTokenAuthenticator::onAuthenticationSuccess1100.0%
App\Security\GoogleApiTokenAuthenticator::start1100.0%
App\Security\GoogleApiTokenAuthenticator::unauthorized1100.0%
App\Security\GoogleIdentityAuthenticator::__construct1100.0%
App\Security\GoogleIdentityAuthenticator::supports1100.0%
App\Security\GoogleIdentityAuthenticator::onAuthenticationFailure1100.0%
App\Security\GoogleUserResolver::__construct1100.0%
App\Security\LoginFormAuthenticator::__construct1100.0%
App\Security\LoginFormAuthenticator::getLoginUrl1100.0%
App\Service\AgentStatService::__construct1100.0%
App\Service\AvatarUpdater::__construct1100.0%
App\State\AgentProvider::__construct1100.0%
App\State\AgentProvider::agent1100.0%
App\State\AgentProvider::row1100.0%
App\State\AgentStatProcessor::__construct1100.0%
App\State\LinkListProvider::__construct1100.0%
App\State\LinkListProvider::provide1100.0%
App\State\MeProcessor::__construct1100.0%
App\State\MeProcessor::saveBannergress1100.0%
App\State\MeProvider::__construct1100.0%
App\State\TimelineEventProcessor::__construct1100.0%
App\State\UserPrivacyProvider::__construct1100.0%
App\State\UserPrivacyProvider::provide1100.0%
App\Timeline\TimelineBuilder::__construct1100.0%
App\Timeline\TimelineChart::__construct1100.0%
App\Timeline\TimelineChart::dense1100.0%
App\Timeline\TimelineChart::day1100.0%
App\Timeline\TimelineChart::startOf1100.0%
App\Timeline\TimelineChart::flag1100.0%
App\Timeline\TimelineEntry::__construct1100.0%
App\Timeline\TimelineEntry::counts1100.0%
App\Timeline\TimelineEntry::days1100.0%
App\Timeline\TimelineEntry::withInTravel1100.0%
App\Validator\NoOverlappingTravel::getTargets1100.0%
App\Validator\NoOverlappingTravelValidator::__construct1100.0%