diff --git a/Adapter/BaseMessageAdapter.php b/Adapter/BaseMessageAdapter.php index 42a4e21..d0914f6 100644 --- a/Adapter/BaseMessageAdapter.php +++ b/Adapter/BaseMessageAdapter.php @@ -57,7 +57,8 @@ protected function renderTwigTemplate($data, $user, $template) */ public function format(NotificationInterface $notification) { - $notification->setChannel($this->channelName); + // @TODO: $this->channelName + // $notification->setChannel($this->channelName); $templateArray = $notification->getTemplateArray(); if (!empty($this->twig) && !empty($templateArray)) { diff --git a/Adapter/DatabaseMessageAdapter.php b/Adapter/DatabaseMessageAdapter.php index 3b116ad..8b8803a 100644 --- a/Adapter/DatabaseMessageAdapter.php +++ b/Adapter/DatabaseMessageAdapter.php @@ -18,10 +18,13 @@ public function __construct(DatabaseNotificationManager $databaseNotificationMan } /** - * Generates a message object + * Generates a Message object * * @param NotificationInterface $notification - * @return \IrishDan\NotificationBundle\Message\Message + * + * @return \IrishDan\NotificationBundle\Message\Message|MessageInterface|void + * + * @throws \IrishDan\NotificationBundle\Exception\MessageFormatException */ public function format(NotificationInterface $notification) { @@ -57,6 +60,8 @@ public function dispatch(MessageInterface $message) return true; } + // @todo: return something use full or throw exception is better + return false; } } \ No newline at end of file diff --git a/Adapter/MailMessageAdapter.php b/Adapter/MailMessageAdapter.php index fdbbd4c..0a7a2b0 100644 --- a/Adapter/MailMessageAdapter.php +++ b/Adapter/MailMessageAdapter.php @@ -23,7 +23,7 @@ public function __construct(\Swift_Mailer $mailer) */ public function format(NotificationInterface $notification) { - $notification->setChannel($this->channelName); + // $notification->setChannel($this->channelName); parent::format($notification); /** @var EmailableInterface $notifiable */ @@ -75,8 +75,10 @@ public function dispatch(MessageInterface $message) $dispatchData = $message->getDispatchData(); $messageData = $message->getMessageData(); - $mail = \Swift_Message::newInstance() - ->setSubject($messageData['title']) + // has been remocved in swiftmailer 6.0.0, + // @TODO updatebundle depenedencies to reflex this. + // $mail = \Swift_Message::newInstance() + $mail = (new \Swift_Message($messageData['title'])) ->setBody($messageData['body']); $mail->setFrom($dispatchData['from']); diff --git a/Broadcast/Broadcaster.php b/Broadcast/Broadcaster.php index d2015c3..dbe6721 100644 --- a/Broadcast/Broadcaster.php +++ b/Broadcast/Broadcaster.php @@ -52,7 +52,7 @@ public function broadcast(NotificationInterface $notification) $notification->setChannel($this->channelName); // Format and send the broadcast. - $this->channel->setDispatchToEvent(false); + $this->channel->setDispatchAsEvent(false); $this->channel->formatAndDispatch($notification); } } \ No newline at end of file diff --git a/Channel/BaseChannel.php b/Channel/BaseChannel.php index 07e7ed8..87bf759 100644 --- a/Channel/BaseChannel.php +++ b/Channel/BaseChannel.php @@ -27,6 +27,7 @@ abstract class BaseChannel implements ChannelInterface public function __construct(array $channelConfiguration = [], $channelName = null, MessageAdapterInterface $adapter = null) { $this->channelConfiguration = $channelConfiguration; + $this->channelName = $channelName; if (!empty($adapter)) { @@ -38,6 +39,27 @@ public function __construct(array $channelConfiguration = [], $channelName = nul } } + /** + * @param array $channelConfiguration + */ + public function setChannelConfiguration(array $channelConfiguration): void + { + $this->channelConfiguration = $channelConfiguration; + } + + /** + * @param mixed $channelName + */ + public function setChannelName(string $channelName): void + { + $this->channelName = $channelName; + } + + public function setAdapter(MessageAdapterInterface $adapter): void + { + $this->adapter = $adapter; + } + /** * @return mixed */ diff --git a/Channel/DirectChannel.php b/Channel/Channel.php similarity index 51% rename from Channel/DirectChannel.php rename to Channel/Channel.php index f77ddf5..f891532 100644 --- a/Channel/DirectChannel.php +++ b/Channel/Channel.php @@ -4,6 +4,7 @@ use IrishDan\NotificationBundle\Event\MessageCreatedEvent; use IrishDan\NotificationBundle\Event\MessageDispatchedEvent; +use IrishDan\NotificationBundle\Event\NotificationReadyToFormatEvent; use IrishDan\NotificationBundle\Exception\MessageDispatchException; use IrishDan\NotificationBundle\Exception\MessageFormatException; use IrishDan\NotificationBundle\Message\MessageInterface; @@ -12,40 +13,68 @@ /** - * Class DirectChannel + * Class Channel * * @package NotificationBundle\Channel */ -class DirectChannel extends BaseChannel implements ChannelInterface +class Channel extends BaseChannel implements ChannelInterface { /** * @var */ protected $eventDispatcher; - protected $dispatchToEvent = true; + protected $formatToEvent = false; + protected $dispatchToEvent = false; - public function setDispatchToEvent($dispatchToEvent) + /** + * @param $dispatchToEvent + */ + public function setDispatchAsEvent(bool $dispatchToEvent): void { $this->dispatchToEvent = $dispatchToEvent; } + /** + * @param $dispatchToEvent + */ + public function setFormatAsEvent(bool $formatToEvent): void + { + $this->formatToEvent = $formatToEvent; + } + + /** + * @param EventDispatcherInterface $eventDispatcher + */ public function setEventDispatcher(EventDispatcherInterface $eventDispatcher) { $this->eventDispatcher = $eventDispatcher; } - public function formatAndDispatch(NotificationInterface $notification) + public function formatAndDispatch(NotificationInterface $notification, $dispatchReadyEvent = true) { + // Channels can be configured to format and dispatch either directly.. + // or via events.. + // Using events allows for the hooking into the formatting and dispatching.. + // process, perhaps t offload these process to a queue worker. + if ($this->dispatchToEvent && $dispatchReadyEvent) { + $readyEvent = new NotificationReadyToFormatEvent($notification); + $this->eventDispatcher->dispatch(NotificationReadyToFormatEvent::NAME, $readyEvent); + + return; + } + + // Format the message.. + // Creates a message object for each recipient + // If twig enabled will use twig to render the message $message = $this->format($notification); - if (!empty($this->eventDispatcher) && $this->dispatchToEvent) { - $messageEvent = new MessageCreatedEvent($message); - $this->eventDispatcher->dispatch(MessageCreatedEvent::NAME, $messageEvent); + // Dispatch the message.. + // Sends the message to the destination.. + $this->dispatch($message); - return true; - } else { - return $this->dispatch($message); - } + $message->setStatus('sent'); + + return $message; } public function format(NotificationInterface $notification) @@ -54,6 +83,11 @@ public function format(NotificationInterface $notification) // Do the formatting. $message = $this->adapter->format($notification); + if (!empty($this->eventDispatcher)) { + $messageEvent = new MessageCreatedEvent($message); + $this->eventDispatcher->dispatch(MessageCreatedEvent::NAME, $messageEvent); + } + return $message; } catch (\Exception $e) { throw new MessageFormatException( @@ -69,8 +103,8 @@ public function dispatch(MessageInterface $message) $sent = $this->adapter->dispatch($message); if ($sent && !empty($this->eventDispatcher)) { - $event = new MessageDispatchedEvent($message); - $this->eventDispatcher->dispatch(MessageDispatchedEvent::NAME, $event); + $messageEvent = new MessageDispatchedEvent($message); + $this->eventDispatcher->dispatch(MessageDispatchedEvent::NAME, $messageEvent); } return $sent; diff --git a/Channel/ChannelInterface.php b/Channel/ChannelInterface.php index c384465..da4c42c 100644 --- a/Channel/ChannelInterface.php +++ b/Channel/ChannelInterface.php @@ -2,6 +2,7 @@ namespace IrishDan\NotificationBundle\Channel; +use IrishDan\NotificationBundle\Adapter\MessageAdapterInterface; use IrishDan\NotificationBundle\Message\MessageInterface; use IrishDan\NotificationBundle\Notification\NotificationInterface; @@ -19,7 +20,13 @@ interface ChannelInterface * @param NotificationInterface $notification * @return boolean */ - public function formatAndDispatch(NotificationInterface $notification); + public function formatAndDispatch(NotificationInterface $notification, $dispatchReadyEvent = true); public function channelName(); + + public function setAdapter(MessageAdapterInterface $adapter): void; + + public function setChannelName(string $channelName): void; + + public function setChannelConfiguration(array $config): void; } \ No newline at end of file diff --git a/Channel/EventChannel.php b/Channel/EventChannel.php index 2cd37d3..f77bdd9 100644 --- a/Channel/EventChannel.php +++ b/Channel/EventChannel.php @@ -12,59 +12,43 @@ use Symfony\Component\EventDispatcher\EventDispatcherInterface; /** - * Class DirectChannel + * Class EventChannel + * + * This type of channel dispatched events when each Message + * is created.. + * and when each Message is dispatched * * @package NotificationBundle\Channel */ class EventChannel extends BaseChannel implements ChannelInterface { + /** + * An array of all available adapters. + * + * @var array + */ private $adapters = []; private $eventDispatcher; - public function formatAndDispatch(NotificationInterface $notification) - { - return false; - } - + /** + * @param $key + * @param MessageAdapterInterface $adapter + * @param array $config + */ public function setAdapters($key, MessageAdapterInterface $adapter, array $config) { - $adapter->setChannelName($key); + // $adapter->setChannelName($key); $adapter->setConfiguration($config); $this->adapters[$key] = $adapter; } - public function __construct(EventDispatcherInterface $eventDispatcher) - { - parent::__construct(); - $this->eventDispatcher = $eventDispatcher; - } - - public function dispatchFromEvent(MessageCreatedEvent $event) - { - $message = $event->getMessage(); - $this->dispatch($message); - } - - public function dispatch(MessageInterface $message) + /** + * @param NotificationInterface $notification + * @return bool + */ + public function formatAndDispatch(NotificationInterface $notification) { - $dispatcherKey = $message->getChannel(); - - // Dispatch the message - try { - if (!empty($this->adapters[$dispatcherKey])) { - $this->adapters[$dispatcherKey]->dispatch($message); - - // Dispatch the message event - $messageEvent = new MessageDispatchedEvent($message); - $this->eventDispatcher->dispatch(MessageDispatchedEvent::NAME, $messageEvent); - } else { - throw new MessageDispatchException( - sprintf('No adapter available with key "%s"', $dispatcherKey) - ); - } - } catch (\Exception $exception) { - throw new MessageDispatchException($exception->getMessage()); - } + return false; } } diff --git a/ChannelManager.php b/ChannelManager.php index ba5cf1f..776c5d1 100644 --- a/ChannelManager.php +++ b/ChannelManager.php @@ -2,13 +2,13 @@ namespace IrishDan\NotificationBundle; - use IrishDan\NotificationBundle\Channel\ChannelInterface; use IrishDan\NotificationBundle\Event\NotificationFailedEvent; use IrishDan\NotificationBundle\Event\NotificationSentEvent; use IrishDan\NotificationBundle\Notification\NotifiableInterface; use IrishDan\NotificationBundle\Notification\NotificationInterface; use IrishDan\NotificationBundle\Event\NotificationSendingEvent; +use Ramsey\Uuid\Uuid; use Symfony\Component\EventDispatcher\EventDispatcherInterface; /** @@ -60,10 +60,10 @@ public function sendNow(array $recipients, NotificationInterface $notification) // Set a uuid so notifications from different channels can be grouped. // Needed when marking as read across all channels. - $uuid = uniqid(); + $uuid = Uuid::uuid4(); foreach ($recipients as $notifiable) { - // Get all of the channels the notification would like to be send on. + // Get all of the channels the notification would like to be sent on. // Then check each channel against what is configured in the system, // and which channels the notifiable is subscribed to. $viaChannels = $notification->getChannels(); @@ -77,8 +77,8 @@ public function sendNow(array $recipients, NotificationInterface $notification) try { // Dispatch sending event. - $sendingEvent = new NotificationSendingEvent($currentNotification); - $this->eventDispatcher->dispatch(NotificationSendingEvent::NAME, $sendingEvent); + // $sendingEvent = new NotificationSendingEvent($currentNotification); + // $this->eventDispatcher->dispatch(NotificationSendingEvent::NAME, $sendingEvent); $response = $this->channels[$channel]->formatAndDispatch($currentNotification); @@ -110,13 +110,14 @@ public function sendNow(array $recipients, NotificationInterface $notification) protected function shouldSendNotification(NotifiableInterface $notifiable, NotificationInterface $notification, $channel) { $notifiableChannels = $notifiable->getSubscribedChannels(); - $configuredChannels = $notification->getChannels(); + $notificationChannels = $notification->getChannels(); if ( - in_array($channel, $configuredChannels) + in_array($channel, $notificationChannels) && in_array($channel, $notifiableChannels) + //@TODO: Sometimes its 'mail' other times its 'email', check the maker command. && in_array($channel, $this->configuredChannels) - && in_array($channel, array_keys($this->channels)) + // && in_array($channel, array_keys($this->channels)) ) { return true; } diff --git a/Command/CreateDatabaseNotificationCommand.php b/Command/CreateDatabaseNotificationCommand.php index 19b1635..17c3bf5 100644 --- a/Command/CreateDatabaseNotificationCommand.php +++ b/Command/CreateDatabaseNotificationCommand.php @@ -3,7 +3,7 @@ namespace IrishDan\NotificationBundle\Command; use IrishDan\NotificationBundle\Generator\DatabaseNotificationGenerator; -use Sensio\Bundle\GeneratorBundle\Command\GeneratorCommand; +use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; @@ -12,7 +12,8 @@ use Symfony\Component\Console\Style\SymfonyStyle; -class CreateDatabaseNotificationCommand extends GeneratorCommand +// class CreateDatabaseNotificationCommand extends GeneratorCommand +class CreateDatabaseNotificationCommand extends Command { private $entityName; diff --git a/Command/CreateNotificationCommand.php b/Command/CreateNotificationCommand.php index 7cba94a..889457c 100644 --- a/Command/CreateNotificationCommand.php +++ b/Command/CreateNotificationCommand.php @@ -3,7 +3,8 @@ namespace IrishDan\NotificationBundle\Command; use IrishDan\NotificationBundle\Generator\NotificationGenerator; -use Sensio\Bundle\GeneratorBundle\Command\GeneratorCommand; +// use Sensio\Bundle\GeneratorBundle\Command\GeneratorCommand; +use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; @@ -12,7 +13,8 @@ use Symfony\Component\Console\Style\SymfonyStyle; -class CreateNotificationCommand extends GeneratorCommand +// class CreateNotificationCommand extends GeneratorCommand +class CreateNotificationCommand extends Command { private $channels; private $channelTemplates = []; diff --git a/DependencyInjection/AdapterPass.php b/DependencyInjection/AdapterPass.php new file mode 100644 index 0000000..fd666bb --- /dev/null +++ b/DependencyInjection/AdapterPass.php @@ -0,0 +1,40 @@ +has('notification.channel_subscriber')) { + return; + } + + // Add all adapters to the subscriber so ot can handle + // any type of message. + $subscriberDefinition = $container->findDefinition('notification.channel_subscriber'); + + // find all service IDs with the app.mail_transport tag. + // @TODO: Inject only the adapters that are used + $taggedServices = $container->findTaggedServiceIds('notification.adapter'); + + foreach ($taggedServices as $id => $tags) { + $def = $container->getDefinition($id); + $class = $container->getParameterBag()->resolveValue($def->getClass()); + + if (!is_subclass_of($class, MessageAdapterInterface::class)) { + throw new \InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $id, MakerInterface::class)); + } + + $subscriberDefinition->addMethodCall('addAdapter', [$id, new Reference($id)]); + } + } +} \ No newline at end of file diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index b256954..c268aa6 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -15,27 +15,44 @@ */ class Configuration implements ConfigurationInterface { - private $defaultAdapterTypes; + private $defaultAdapterTypes = [ + 'mail', + 'logger', + 'database', + 'nexmo', + 'pusher', + 'slack', + 'custom' + ]; private $broadcasters; public function __construct(array $defaultAdapterTypes = [], $broadcasters = []) { - $this->defaultAdapterTypes = $defaultAdapterTypes; + // @TODO: Nothing is passed in so no services defined... + // $this->defaultAdapterTypes = $defaultAdapterTypes; $this->broadcasters = $broadcasters; } private function addChannelsSection(ArrayNodeDefinition $node) { - $channelNodeBuilder = $node - ->children() + if (!empty($this->defaultAdapterTypes)) { + $channelNodeBuilder = $node + ->children() + ->booleanNode('use_default_message_subscriber') + ->defaultTrue() + ->end() ->arrayNode('channels') ->performNoDeepMerging() ->children(); - $factory = new ChannelFactory(); - foreach ($this->defaultAdapterTypes as $type) { - $factoryNode = $channelNodeBuilder->arrayNode($type)->canBeUnset(); - $factory->addConfiguration($factoryNode, $type); + $factory = new ChannelFactory(); + foreach ($this->defaultAdapterTypes as $type) { + $factoryNode = $channelNodeBuilder->arrayNode($type)->canBeUnset(); + $factory->addConfiguration($factoryNode, $type); + } + + // all for custom channels. + // $factory->addCustomChannel() } } diff --git a/DependencyInjection/Factory/ChannelFactory.php b/DependencyInjection/Factory/ChannelFactory.php index 5e2e8b9..ed9bbf8 100644 --- a/DependencyInjection/Factory/ChannelFactory.php +++ b/DependencyInjection/Factory/ChannelFactory.php @@ -12,12 +12,14 @@ class ChannelFactory protected $channelKey; protected $adapterName; protected $adapterConfiguration; + protected $adapterConfigurationId; public function getChannelKeyAdapterMap() { return [ 'channel' => $this->channelKey, 'adapter' => $this->adapterName, + 'config_id' => $this->adapterConfigurationId, 'config' => $this->adapterConfiguration, ]; } @@ -39,12 +41,17 @@ public function create(ContainerBuilder $container, $channel, array $config, $ty $eventDispatcher = new Reference('event_dispatcher'); $parameterName = 'notification.channel.' . $channel . '.configuration'; + + if (!$container->hasParameter($parameterName)) { $container->setParameter($parameterName, $config); } $definition = new Definition(); - $definition->setClass('IrishDan\NotificationBundle\Channel\DirectChannel'); + + // Create a Channel or an EventChannel depending on the config. + + $definition->setClass('IrishDan\NotificationBundle\Channel\Channel'); $definition->setArguments( [ '%' . $parameterName . '%', @@ -59,12 +66,19 @@ public function create(ContainerBuilder $container, $channel, array $config, $ty ] ); - $definition->addMethodCall('setDispatchToEvent', [empty($config['direct_dispatch'])]); + // @TODO We need to allow for both formatting and dispatching to be offloaded else where via events + // @TODO The architecture used by event channel might be better suited to this. eg + // every notification goes through the direct channel + // + + // $definition->addMethodCall('setFormatAsEvent', [$config['channel_type'] === 'event']); + $definition->addMethodCall('setDispatchAsEvent', [$config['channel_type'] === 'event']); $serviceName = 'notification.channel.' . $channel; $container->setDefinition($serviceName, $definition); - $this->adapterConfiguration = $parameterName; + $this->adapterConfigurationId = $parameterName; + $this->adapterConfiguration = $config; $this->adapterName = $adapterName; $this->channelKey = $type; @@ -77,6 +91,10 @@ public function addConfiguration(ArrayNodeDefinition $node, $type) case 'mail': $node ->children() + ->enumNode('channel_type') + ->values(['direct', 'event']) + ->defaultValue('direct') + ->end() ->scalarNode('default_sender')->defaultValue('')->end() ->arrayNode('cc')->end() ->arrayNode('bcc')->end() @@ -86,12 +104,19 @@ public function addConfiguration(ArrayNodeDefinition $node, $type) case 'database': $node ->children() - ->scalarNode('entity')->defaultValue('AppBundle:Notification')->end() + ->enumNode('channel_type') + ->values(['direct', 'event']) + ->end() + ->scalarNode('entity')->defaultValue('App:Notification')->end() ->end(); break; case 'pusher': $node ->children() + ->enumNode('channel_type') + ->values(['direct', 'event']) + ->defaultValue('direct') + ->end() ->scalarNode('auth_key')->defaultValue('')->end() ->scalarNode('secret')->defaultValue('')->end() ->scalarNode('app_id')->defaultValue('')->end() @@ -104,6 +129,10 @@ public function addConfiguration(ArrayNodeDefinition $node, $type) case 'nexmo': $node ->children() + ->enumNode('channel_type') + ->values(['direct', 'event']) + ->defaultValue('direct') + ->end() ->scalarNode('api_key')->defaultValue('')->end() ->scalarNode('api_secret')->defaultValue('')->end() ->scalarNode('from')->defaultValue('')->end() @@ -112,12 +141,20 @@ public function addConfiguration(ArrayNodeDefinition $node, $type) case 'slack': $node ->children() + ->enumNode('channel_type') + ->values(['direct', 'event']) + ->defaultValue('direct') + ->end() ->scalarNode('webhook')->defaultNull()->end() ->end(); break; case 'logger': $node ->children() + ->enumNode('channel_type') + ->values(['direct', 'event']) + ->defaultValue('direct') + ->end() ->scalarNode('severity')->defaultValue('info')->end() ->end(); break; diff --git a/DependencyInjection/NotificationExtension.php b/DependencyInjection/NotificationExtension.php index 08c164e..ded7294 100644 --- a/DependencyInjection/NotificationExtension.php +++ b/DependencyInjection/NotificationExtension.php @@ -5,6 +5,7 @@ use IrishDan\NotificationBundle\DependencyInjection\Factory\BroadcasterFactory; use IrishDan\NotificationBundle\DependencyInjection\Factory\ChannelFactory; use Symfony\Component\Config\FileLocator; +use Symfony\Component\DependencyInjection\Compiler\PassConfig; use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; use Symfony\Component\DependencyInjection\Reference; @@ -27,6 +28,7 @@ protected function setChannelAdapterMapping(array $maps) { $this->channelKeyAdapterMappings[$maps['channel']] = [ 'adapter' => $maps['adapter'], + 'config_id' => $maps['config_id'], 'config' => $maps['config'], ]; } @@ -45,7 +47,13 @@ public function load(array $configs, ContainerBuilder $container) $config = array_merge($config, $subConfig); } + // Create the adapterless channel + $this->createChannel($container, 'notification.channel'); + + $enabledChannels = []; + + // For each enabled channel build a channel service.. if (!empty($config['channels'])) { foreach ($config['channels'] as $channel => $channelConfig) { $enabledChannels[] = $channel; @@ -77,7 +85,7 @@ public function load(array $configs, ContainerBuilder $container) } // Create the Event driven channel service - $this->createEventDrivenChannel($container); + // $this->createEventDrivenChannel($container); // @TODO: Check that required parameters are set. foreach ($this->defaultAdapters as $type) { @@ -86,19 +94,38 @@ public function load(array $configs, ContainerBuilder $container) $container->setParameter('notification.channel.' . $type . '.enabled', false); } } + + // Build the message crud listener unless its set to false + // @TODO: Add this to documentation + if ($config['use_default_message_subscriber']) { + $this->createNotificationChannelSubscriber($container); + } } - private function createEventDrivenChannel(ContainerBuilder $container) - { + private function createNotificationChannelSubscriber(ContainerBuilder $container) { $definition = new Definition(); - $definition->setClass('IrishDan\NotificationBundle\Channel\EventChannel'); - $definition->setArguments([new Reference('event_dispatcher')]); + $definition->setClass('IrishDan\NotificationBundle\Subscriber\NotificationChannelSubscriber'); - foreach ($this->channelKeyAdapterMappings as $key => $channel) { - $definition->addMethodCall('setAdapters', [$key, new Reference($channel['adapter']), $container->getParameter($channel['config'])]); - } + // $config = []; + // foreach ($this->channelKeyAdapterMappings as $channel => $data) { + // $config[$channel] = $data['config']; + // } + // create a paramater with all of the channel data. + $container->setParameter('notification.channel_adapter_map', $this->channelKeyAdapterMappings); - $container->setDefinition('notification.channel.event_channel', $definition); + $definition->setArguments([new Reference('event_dispatcher'), new Reference('notification.channel'), '%notification.channel_adapter_map%']); + $definition->addTag('kernel.event_subscriber'); + + $container->setDefinition('notification.channel_subscriber', $definition); + } + + private function createChannel(ContainerBuilder $container, string $id, $adapter = null) + { + $definition = new Definition(); + $definition->setClass('IrishDan\NotificationBundle\Channel\Channel'); + $definition->addMethodCall('setEventDispatcher', [new Reference('event_dispatcher')]); + + $container->setDefinition($id, $definition); } private function createChannelService($channel, ContainerBuilder $container, array $config) @@ -124,6 +151,8 @@ private function createNotificationManagerService(ContainerBuilder $container) new Reference('notification.database_notification_manager'), ] ); + $definition->setPublic(true); + $container->setDefinition('notification.manager', $definition); } diff --git a/Event/NotificationReadyToFormatEvent.php b/Event/NotificationReadyToFormatEvent.php new file mode 100644 index 0000000..c107439 --- /dev/null +++ b/Event/NotificationReadyToFormatEvent.php @@ -0,0 +1,22 @@ +notification = $notification; + } + + public function getNotification() + { + return $this->notification; + } +} \ No newline at end of file diff --git a/Maker/DatabaseNotificationMaker.php b/Maker/DatabaseNotificationMaker.php new file mode 100644 index 0000000..ab0e0c0 --- /dev/null +++ b/Maker/DatabaseNotificationMaker.php @@ -0,0 +1,70 @@ +channels = $channels; + } + + public static function getCommandName(): string + { + return 'make:database-notification'; + } + + + public function configureCommand(Command $command, InputConfiguration $inputConf) + { + $command + ->setDescription('Creates a new doctrine entity class for use as a database notification') + // ->addArgument('name', InputArgument::OPTIONAL, 'The name of the notification class (e.g. NewUserNotification)') + ->setHelp(file_get_contents(__DIR__.'/../Resources/help/MakeDatabaseNotification.txt')) + ; + } + + public function generate(InputInterface $input, ConsoleStyle $io, Generator $generator) + { + $voterClassNameDetails = $generator->createClassNameDetails( + 'Notification', + 'Entity\\', + 'Entity' + ); + + $generator->generateClass( + $voterClassNameDetails->getFullName(), + __DIR__.'/../Resources/skeleton/notification/DatabaseNotification.tpl.php', + [] + ); + + $generator->writeChanges(); + + $this->writeSuccessMessage($io); + + $io->text([ + 'Next: Open your notification and add your logic.' + ]); + } + + public function configureDependencies(DependencyBuilder $dependencies) + { + // $dependencies->addClassDependency( + // Voter::class, + // 'security' + // ); + } +} \ No newline at end of file diff --git a/Maker/NotificationMaker.php b/Maker/NotificationMaker.php new file mode 100644 index 0000000..3da174a --- /dev/null +++ b/Maker/NotificationMaker.php @@ -0,0 +1,80 @@ +channels = $channels; + } + + public static function getCommandName(): string + { + return 'make:notification'; + } + + + public function configureCommand(Command $command, InputConfiguration $inputConf) + { + $command + ->setDescription('Creates a new notification class') + ->addArgument('name', InputArgument::OPTIONAL, 'The name of the notification class (e.g. NewUserNotification)') + ->setHelp(file_get_contents(__DIR__.'/../Resources/help/MakeNotification.txt')) + ; + } + + public function generate(InputInterface $input, ConsoleStyle $io, Generator $generator) + { + // Create The notification class + // ask if create twig templates perhaps?? + // Use the configured channels to determine which channels to include in the class, or... + // ..ask user which of the enabled channels to use for the notification... + + // Broadcasts could be to a mailing list also + // Broadcasts are for notifications to places that are not notifiables.. + // eg mailing lists, mercure, push notifications etc etc + + $voterClassNameDetails = $generator->createClassNameDetails( + $input->getArgument('name'), + 'Notification\\', + 'Notification' + ); + + $generator->generateClass( + $voterClassNameDetails->getFullName(), + __DIR__.'/../Resources/skeleton/notification/Notification.tpl.php', + [] + ); + + $generator->writeChanges(); + + $this->writeSuccessMessage($io); + + $io->text([ + 'Next: Open your notification and add your logic.' + ]); + } + + public function configureDependencies(DependencyBuilder $dependencies) + { + // $dependencies->addClassDependency( + // Voter::class, + // 'security' + // ); + } +} \ No newline at end of file diff --git a/Message/BaseMessage.php b/Message/BaseMessage.php index 70af818..761074f 100644 --- a/Message/BaseMessage.php +++ b/Message/BaseMessage.php @@ -9,18 +9,10 @@ */ abstract class BaseMessage implements MessageInterface { - /** - * @var - */ private $dispatchData; - /** - * @var - */ private $messageData; - /** - * @var - */ private $channel; + private $status; /** * @return mixed @@ -102,4 +94,20 @@ public function getRecipient() return 'NA'; } + + /** + * @return mixed + */ + public function getStatus() + { + return $this->status; + } + + /** + * @param mixed $status + */ + public function setStatus($status): void + { + $this->status = $status; + } } \ No newline at end of file diff --git a/Message/MessageInterface.php b/Message/MessageInterface.php index 2da7ef3..7e32b9b 100644 --- a/Message/MessageInterface.php +++ b/Message/MessageInterface.php @@ -4,7 +4,9 @@ /** * Interface MessageInterface + * * Message objects should contain all the information required by a channel to successfully send the message. + * * This information is divided as such: * 1 - Message data * Contains the actual contents of the message. @@ -14,7 +16,7 @@ * This data is retrieved with the getDispatchData method. * 3 - The Channel name * Multiple channels can use the same type of adapter so it is necessary to know what channel the message is intended for - * This data is retrieved with the getChannel method. + * This data is retrieved with the getChannel method. * * @package IrishDan\NotificationBundle\Message */ diff --git a/NotificationBundle.php b/NotificationBundle.php index 580ef41..f07b179 100644 --- a/NotificationBundle.php +++ b/NotificationBundle.php @@ -2,8 +2,15 @@ namespace IrishDan\NotificationBundle; +use IrishDan\NotificationBundle\DependencyInjection\AdapterPass; +use Symfony\Component\DependencyInjection\Compiler\PassConfig; +use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; class NotificationBundle extends Bundle { + public function build(ContainerBuilder $container) + { + $container->addCompilerPass(new AdapterPass(),PassConfig::TYPE_BEFORE_OPTIMIZATION, 10); + } } diff --git a/NotificationManager.php b/NotificationManager.php index d49fad9..2556d2c 100644 --- a/NotificationManager.php +++ b/NotificationManager.php @@ -11,6 +11,7 @@ /** * Class NotificationManager + * * This the primary public service. * From here all notifications can be dispatched. * Essentially is just a wrapper around the ContainerManager and DatabaseNotificationManager diff --git a/README.md b/README.md index ea2007c..cd33803 100644 --- a/README.md +++ b/README.md @@ -52,25 +52,26 @@ To enable a channel simple add its configuration to your config.yml ```yml # app/config/config.yml notification: - mail: - default_sender: 'hi@jim.bob' - database: - entity: 'AppBundle:Notification' - pusher: - app_id: "12" - auth_key: "1111SECURE222KEY" - secret: "SeCrEt" - cluster: "eu" - encrypted: true - event: 'notification' - channel_name: 'private-direct_' # This is a private channel - slack: - nexmo: - api_key: 7654321 - api_secret: oiCHOIoi - from: "YourApp" - logger: - severity: 'info' + channels + mail: + default_sender: 'hi@jim.bob' + database: + entity: 'App:Notification' + pusher: + app_id: "12" + auth_key: "1111SECURE222KEY" + secret: "SeCrEt" + cluster: "eu" + encrypted: true + event: 'notification' + channel_name: 'private-direct_' # This is a private channel + slack: + nexmo: + api_key: 7654321 + api_secret: oiCHOIoi + from: "YourApp" + logger: + severity: 'info' ``` It's also possible to create [custom channels](Resources/doc/channels.md) or [alter an existing channel's behavior](Resources/doc/channels.md) @@ -225,4 +226,10 @@ For more advanced setup read the Documentation ## Attribution -- This bundle was inspired by the [Laravel](https://laravel.com/) notification system \ No newline at end of file +- This bundle was inspired by the [Laravel](https://laravel.com/) notification system + +- TODO: +Should add Notification directory to exclude... +App\: + resource: '../src/*' + exclude: '../src/{Entity,Migrations,Tests,Notification}' \ No newline at end of file diff --git a/Repository/NotificationRepository.php b/Repository/NotificationRepository.php index 34aa7ec..d9a0460 100644 --- a/Repository/NotificationRepository.php +++ b/Repository/NotificationRepository.php @@ -2,11 +2,19 @@ namespace IrishDan\NotificationBundle\Repository; -use Doctrine\ORM\EntityRepository; +use App\Entity\Notification; +use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; +use Doctrine\Common\Persistence\ManagerRegistry; use IrishDan\NotificationBundle\DatabaseNotifiableInterface; -class NotificationRepository extends EntityRepository implements DatabaseNotificationRepositoryInterface +class NotificationRepository extends ServiceEntityRepository implements DatabaseNotificationRepositoryInterface { + public function __construct(ManagerRegistry $registry) + { + // @TODO: Get the calss name from the config + parent::__construct($registry, Notification::class); + } + public function getNotificationsCount(DatabaseNotifiableInterface $user, $status = '') { $dq = $this->createQueryBuilder('n') diff --git a/Resources/config/routing.yml b/Resources/config/routing.yml index 9392fc5..6f63e8e 100644 --- a/Resources/config/routing.yml +++ b/Resources/config/routing.yml @@ -1,4 +1,4 @@ -# Route for generating images +# Route for pusher authentication notification.pusher_auth: path: /pusher/auth defaults: { _controller: NotificationBundle:PusherAuth:connect } diff --git a/Resources/config/services.yml b/Resources/config/services.yml index 4c2c601..b86c195 100644 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -13,7 +13,9 @@ services: arguments: [ '@notification.database_notification_manager'] public: false calls: - - [setTemplating, ['@twig']] + - [setTemplating, ['@twig']] # @TODO: This needs defined only if configured + tags: + - { name: notification.adapter } notification.adapter.mail: class: IrishDan\NotificationBundle\Adapter\MailMessageAdapter @@ -21,6 +23,8 @@ services: public: false calls: - [setTemplating, ['@twig']] + tags: + - { name: notification.adapter } notification.adapter.pusher: class: IrishDan\NotificationBundle\Adapter\PusherMessageAdapter @@ -28,6 +32,8 @@ services: public: false calls: - [setTemplating, ['@twig']] + tags: + - { name: notification.adapter } notification.adapter.nexmo: class: IrishDan\NotificationBundle\Adapter\NexmoMessageAdapter @@ -35,17 +41,23 @@ services: public: false calls: - [setTemplating, ['@twig']] + tags: + - { name: notification.adapter } notification.adapter.slack: class: IrishDan\NotificationBundle\Adapter\SlackWebhookMessageAdapter public: false calls: - [setTemplating, ['@twig']] + tags: + - { name: notification.adapter } notification.adapter.logger: class: IrishDan\NotificationBundle\Adapter\LoggerMessageAdapter arguments: [ '@logger' ] public: false + tags: + - { name: notification.adapter } # Voters notification.pusher_channel_voter: @@ -64,28 +76,49 @@ services: - { name: twig.extension } # Commands - notification.command.generate_notification: - class: IrishDan\NotificationBundle\Command\CreateNotificationCommand - calls: - - [setEnabledChannels, ['%notification.available_channels%']] - tags: - - { name: console.command } + # notification.command.generate_notification: + # class: IrishDan\NotificationBundle\Command\CreateNotificationCommand + # calls: + # - [setEnabledChannels, ['%notification.available_channels%']] + # tags: + # - { name: console.command } - notification.command.generate_database_notification: - class: IrishDan\NotificationBundle\Command\CreateDatabaseNotificationCommand - calls: - - [setEntityName, ['%notification.channel.database.configuration%']] - tags: - - { name: console.command } + # notification.command.generate_database_notification: + # class: IrishDan\NotificationBundle\Command\CreateDatabaseNotificationCommand + # calls: + # - [setEntityName, ['%notification.channel.database.configuration%']] + # tags: + # - { name: console.command } # Event subscribers - notification.message_crud_subscriber: - class: IrishDan\NotificationBundle\EventListener\MessageCRUDSubscriber - arguments: [ '@notification.channel.event_channel', '@logger'] - tags: - - { name: kernel.event_subscriber } + # notification.channel_subscriber: + # class: IrishDan\NotificationBundle\EventListener\MessageCRUDSubscriber + # arguments: [ '@notification.channel.event_channel', '@logger'] + # tags: + # - { name: kernel.event_subscriber } # Broadcasting notification.broadcast.notifiable: public: false - class: IrishDan\NotificationBundle\Broadcast\Broadcast \ No newline at end of file + class: IrishDan\NotificationBundle\Broadcast\Broadcast + + # Maker commands + notification.notification_maker: + public: true + class: IrishDan\NotificationBundle\Maker\NotificationMaker + tags: + - { name: maker.command } + + notification.database_notification_maker: + public: true + class: IrishDan\NotificationBundle\Maker\DatabaseNotificationMaker + tags: + - { name: maker.command } + + # vendor bundle: should not be using autowiring etc... + IrishDan\NotificationBundle\Repository\NotificationRepository: + autowire: true + tags: ['doctrine.repository_service'] + + # Aliases + IrishDan\NotificationBundle\NotificationManager: '@notification.manager' \ No newline at end of file diff --git a/Resources/help/MakeDatabaseNotification.txt b/Resources/help/MakeDatabaseNotification.txt new file mode 100644 index 0000000..71d10ac --- /dev/null +++ b/Resources/help/MakeDatabaseNotification.txt @@ -0,0 +1,5 @@ +The %command.name% command generates a new security voter. + +php %command.full_name% BlogPostVoter + +If the argument is missing, the command will ask for the class name interactively. diff --git a/Resources/help/MakeNotification.txt b/Resources/help/MakeNotification.txt new file mode 100644 index 0000000..71d10ac --- /dev/null +++ b/Resources/help/MakeNotification.txt @@ -0,0 +1,5 @@ +The %command.name% command generates a new security voter. + +php %command.full_name% BlogPostVoter + +If the argument is missing, the command will ask for the class name interactively. diff --git a/Resources/skeleton/notification/DatabaseNotification.php.twig b/Resources/skeleton/notification/DatabaseNotification.tpl.php similarity index 94% rename from Resources/skeleton/notification/DatabaseNotification.php.twig rename to Resources/skeleton/notification/DatabaseNotification.tpl.php index a339a3d..ed58f8a 100644 --- a/Resources/skeleton/notification/DatabaseNotification.php.twig +++ b/Resources/skeleton/notification/DatabaseNotification.tpl.php @@ -1,14 +1,13 @@ - - -namespace AppBundle\Entity; +namespace ; use Doctrine\ORM\Mapping as ORM; use IrishDan\NotificationBundle\Notification\DatabaseNotificationInterface; use IrishDan\NotificationBundle\Notification\NotifiableInterface; /** - * @ORM\Table(name="notification") + * @ORM\Table(name="notifications") * @ORM\Entity(repositoryClass="NotificationBundle\Repository\NotificationRepository") * @ORM\HasLifecycleCallbacks() */ @@ -20,44 +19,53 @@ class Notification implements DatabaseNotificationInterface * @ORM\Column(type="integer") */ private $id; + /** * @ORM\Column(type="guid") */ private $uuid; + /** * @ORM\ManyToOne(targetEntity="User") * @ORM\JoinColumn(nullable=false) */ private $notifiable; + /** * @ORM\Column(type="string", unique=false) */ private $type; + /** * @ORM\Column(type="string", unique=false) */ private $title; + /** * @var string * @ORM\Column(name="body", type="text", nullable=true) */ private $body; + /** * @var string - * @ORM\Column(name="body", type="json_array", nullable=true) + * @ORM\Column(name="data", type="json_array", nullable=true) */ private $data; + /** - * Starting date and time + * Read at date and time * * @var \DateTime * @ORM\Column(name="read_at", type="datetime", nullable=true) */ private $readAt; + /** * @ORM\Column(type="datetime", unique=false, nullable=true) */ private $created; + /** * @var \DateTime * @ORM\Column(name="updated", type="datetime") @@ -179,7 +187,7 @@ public function getReadAt() /** * @param \DateTime $readAt */ - public function setReadAt($readAt) + public function setReadAt(\DateTime $readAt) { $this->readAt = $readAt; } diff --git a/Resources/skeleton/notification/Notification.php.twig b/Resources/skeleton/notification/Notification.tpl.php similarity index 80% rename from Resources/skeleton/notification/Notification.php.twig rename to Resources/skeleton/notification/Notification.tpl.php index 2a384b6..4751681 100644 --- a/Resources/skeleton/notification/Notification.php.twig +++ b/Resources/skeleton/notification/Notification.tpl.php @@ -1,23 +1,17 @@ - -namespace {{ namespace }}\Notification; +namespace ; -{% block use_statements %} use IrishDan\NotificationBundle\Notification\NotificationInterface; use IrishDan\NotificationBundle\Notification\NotifiableInterface; -{% endblock use_statements %} -{% block class_definition %} /** - * Class {{ class_name }} - * - * @package {{ namespace }}\Notification - */ -class {{ class_name }} implements NotificationInterface -{% endblock class_definition %} +* Class +* +* @package \Notification +*/ +class implements NotificationInterface { -{% block class_body %} - protected $data = [ 'title' => 'New member', 'body' => 'New member, %s, just joined', @@ -46,6 +40,18 @@ class {{ class_name }} implements NotificationInterface */ protected $uuid; + /** + * {name} constructor. + * + * @param array $data + */ + public function __construct(array $data = []) + { + foreach ($data as $name => $value) { + $this->addData($name, $value); + } + } + /** * Sets the channel that this notification instance is sent using * @@ -65,8 +71,8 @@ public function getUuid() } /** - * @param string $uuid - */ + * @param string $uuid + */ public function setUuid($uuid) { $this->uuid = $uuid; @@ -106,7 +112,8 @@ public function setNotifiable(NotifiableInterface $notifiable) */ public function getChannels() { - return ['{{ channels |join("', '") }}']; + // @TODO: Use enabled channels... + return ['mail']; } /** @@ -134,5 +141,7 @@ public function setDataArray(array $data) $this->data = $data; } -{% endblock class_body %} -} \ No newline at end of file + public function addData($name, $data) { + $this->data[$name] = $data; + } +} diff --git a/Subscriber/NotificationChannelSubscriber.php b/Subscriber/NotificationChannelSubscriber.php new file mode 100644 index 0000000..ec2efa0 --- /dev/null +++ b/Subscriber/NotificationChannelSubscriber.php @@ -0,0 +1,92 @@ +eventDispatcher = $eventDispatcher; + $this->adapterlessChannel = $adapterlessChannel; + $this->channelConfigMap = $channelConfigMap; + } + + + /** + * @return array + */ + public static function getSubscribedEvents() + { + return [ + NotificationReadyToFormatEvent::NAME => 'formatMessageFromEvent' + ]; + } + + /** + * @param $key + * @param MessageAdapterInterface $adapter + * @param array $config + */ + public function addAdapter($key, MessageAdapterInterface $adapter, array $config = []) + { + $adapter->setChannelName($key); + $this->adapters[$key] = $adapter; + } + + + public function formatMessageFromEvent(NotificationReadyToFormatEvent $event) + { + $notification = $event->getNotification(); + + // get the adapter name from the + // $adapterKey = $message->getChannel(); + $adapterKey = $this->channelConfigMap[$notification->getChannel()]['adapter']; + $channelConfiguration = $this->channelConfigMap[$notification->getChannel()]['config']; + + // Get the adapter for this channel + // and inject it into the adapterless channel + // disable dispatching to events also... + if (!empty($this->adapters[$adapterKey])) { + $adapter = $this->adapters[$adapterKey]; + + // Below could be refactored into a an abstract class for use in a queue worker or else where + $this->adapterlessChannel->setAdapter($adapter); + $this->adapterlessChannel->setChannelConfiguration($channelConfiguration); + + $message = $this->adapterlessChannel->formatAndDispatch($notification, false); + // @TODO: Event... + + } else { + throw new MessageDispatchException( + sprintf('No adapter available with key "%s"', $adapterKey) + ); + } + } +} diff --git a/Test/Broadcast/BroadcasterTest.php b/Test/Broadcast/BroadcasterTest.php index f6dfe63..41aa4cb 100644 --- a/Test/Broadcast/BroadcasterTest.php +++ b/Test/Broadcast/BroadcasterTest.php @@ -19,11 +19,11 @@ public function testBroadcast() ]; $channel = $this->getMockBuilder(ChannelInterface::class) - ->setMethods(['channelName', 'setDispatchToEvent', 'formatAndDispatch']) + ->setMethods(['channelName', 'setDispatchAsEvent', 'formatAndDispatch']) ->disableOriginalConstructor() ->getMock(); $channel->expects($this->once())->method('channelName'); - $channel->expects($this->once())->method('setDispatchToEvent'); + $channel->expects($this->once())->method('setDispatchAsEvent'); $channel->expects($this->once())->method('formatAndDispatch'); $notification = $this->getMockBuilder(NotificationInterface::class) diff --git a/Test/Channel/DirectChannelTest.php b/Test/Channel/DirectChannelTest.php index 7ec81b5..b900bd1 100644 --- a/Test/Channel/DirectChannelTest.php +++ b/Test/Channel/DirectChannelTest.php @@ -2,11 +2,11 @@ namespace IrishDan\NotificationBundle\Test\Channel; -use IrishDan\NotificationBundle\Channel\DirectChannel; +use IrishDan\NotificationBundle\Channel\Channel; use IrishDan\NotificationBundle\Test\Adapter\DummyAdapter; use IrishDan\NotificationBundle\Test\NotificationTestCase; -class DirectChannelTest extends NotificationTestCase +class ChannelTest extends NotificationTestCase { protected $notification; @@ -19,7 +19,7 @@ public function getChannel($adapter) $channelName = 'test_channel'; - return new DirectChannel($config, $channelName, $adapter); + return new Channel($config, $channelName, $adapter); } public function setUp() diff --git a/composer.json b/composer.json index f5fe0ca..8315390 100644 --- a/composer.json +++ b/composer.json @@ -11,8 +11,8 @@ ], "require": { "php": ">=7.1", - "symfony/framework-bundle": "4.1.0 ", - "symfony/security": "^4.1.0" + "symfony/framework-bundle": "^4.0.0 ", + "symfony/security": "^4.0.0" }, "require-dev": { "phpunit/phpunit": "~4.8", diff --git a/composer.lock b/composer.lock deleted file mode 100644 index 63cea89..0000000 --- a/composer.lock +++ /dev/null @@ -1,4330 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", - "This file is @generated automatically" - ], - "hash": "b7b62421b684bff2d367857870159f95", - "content-hash": "46455132d6e97322238c80a97ce03721", - "packages": [ - { - "name": "paragonie/random_compat", - "version": "v2.0.10", - "source": { - "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/634bae8e911eefa89c1abfbf1b66da679ac8f54d", - "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d", - "shasum": "" - }, - "require": { - "php": ">=5.2.0" - }, - "require-dev": { - "phpunit/phpunit": "4.*|5.*" - }, - "suggest": { - "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." - }, - "type": "library", - "autoload": { - "files": [ - "lib/random.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com" - } - ], - "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", - "keywords": [ - "csprng", - "pseudorandom", - "random" - ], - "time": "2017-03-13 16:27:32" - }, - { - "name": "psr/cache", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "78c5a01ddbf11cf731f1338a4f5aba23b14d5b47" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/78c5a01ddbf11cf731f1338a4f5aba23b14d5b47", - "reference": "78c5a01ddbf11cf731f1338a4f5aba23b14d5b47", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "time": "2016-10-13 14:48:10" - }, - { - "name": "psr/container", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "2cc4a01788191489dc7459446ba832fa79a216a7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/2cc4a01788191489dc7459446ba832fa79a216a7", - "reference": "2cc4a01788191489dc7459446ba832fa79a216a7", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "time": "2017-06-28 15:35:32" - }, - { - "name": "psr/log", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", - "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "time": "2016-10-10 12:19:37" - }, - { - "name": "psr/simple-cache", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/753fa598e8f3b9966c886fe13f370baa45ef0e24", - "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for simple caching", - "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" - ], - "time": "2017-01-02 13:31:39" - }, - { - "name": "sensio/generator-bundle", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sensiolabs/SensioGeneratorBundle.git", - "reference": "8ed13441e69fa0674fe3b2c69861be6d60bf5cb3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/8ed13441e69fa0674fe3b2c69861be6d60bf5cb3", - "reference": "8ed13441e69fa0674fe3b2c69861be6d60bf5cb3", - "shasum": "" - }, - "require": { - "symfony/console": "~2.7|~3.0", - "symfony/framework-bundle": "~2.7|~3.0", - "symfony/process": "~2.7|~3.0", - "symfony/yaml": "~2.7|~3.0", - "twig/twig": "^1.28.2|^2.0" - }, - "require-dev": { - "doctrine/orm": "~2.4", - "symfony/doctrine-bridge": "~2.7|~3.0", - "symfony/filesystem": "~2.7|~3.0", - "symfony/phpunit-bridge": "^3.3" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Sensio\\Bundle\\GeneratorBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "This bundle generates code for you", - "time": "2017-07-23 07:08:53" - }, - { - "name": "swiftmailer/swiftmailer", - "version": "5.x-dev", - "source": { - "type": "git", - "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "0dcea9240098b05c2415e189221f0eed514d8cb7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/0dcea9240098b05c2415e189221f0eed514d8cb7", - "reference": "0dcea9240098b05c2415e189221f0eed514d8cb7", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "mockery/mockery": "~0.9.1", - "symfony/phpunit-bridge": "~3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.4-dev" - } - }, - "autoload": { - "files": [ - "lib/swift_required.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Corbyn" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Swiftmailer, free feature-rich PHP mailer", - "homepage": "http://swiftmailer.symfony.com", - "keywords": [ - "email", - "mail", - "mailer" - ], - "time": "2017-08-22 22:04:30" - }, - { - "name": "symfony/asset", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/asset.git", - "reference": "5602d93545b86c9999e1f6c7e35b4f386b56ee55" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/5602d93545b86c9999e1f6c7e35b4f386b56ee55", - "reference": "5602d93545b86c9999e1f6c7e35b4f386b56ee55", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "require-dev": { - "symfony/http-foundation": "~2.8|~3.0|~4.0", - "symfony/http-kernel": "~2.8|~3.0|~4.0" - }, - "suggest": { - "symfony/http-foundation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Asset\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Asset Component", - "homepage": "https://symfony.com", - "time": "2017-08-03 09:34:20" - }, - { - "name": "symfony/cache", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache.git", - "reference": "dc33fc5a3cc14fbd9850ff861be5d9ce826eeb67" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/dc33fc5a3cc14fbd9850ff861be5d9ce826eeb67", - "reference": "dc33fc5a3cc14fbd9850ff861be5d9ce826eeb67", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "psr/cache": "~1.0", - "psr/log": "~1.0", - "psr/simple-cache": "^1.0" - }, - "conflict": { - "symfony/var-dumper": "<3.3" - }, - "provide": { - "psr/cache-implementation": "1.0", - "psr/simple-cache-implementation": "1.0" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/cache": "~1.6", - "doctrine/dbal": "~2.4", - "predis/predis": "~1.0" - }, - "suggest": { - "symfony/polyfill-apcu": "For using ApcuAdapter on HHVM" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Cache\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Cache component with PSR-6, PSR-16, and tags", - "homepage": "https://symfony.com", - "keywords": [ - "caching", - "psr6" - ], - "time": "2017-08-07 11:18:35" - }, - { - "name": "symfony/class-loader", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/symfony/class-loader.git", - "reference": "1635a4c8fe16fba0c13b3e3a8ab5cb502c4a2ed1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/class-loader/zipball/1635a4c8fe16fba0c13b3e3a8ab5cb502c4a2ed1", - "reference": "1635a4c8fe16fba0c13b3e3a8ab5cb502c4a2ed1", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "require-dev": { - "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/polyfill-apcu": "~1.1" - }, - "suggest": { - "symfony/polyfill-apcu": "For using ApcClassLoader on HHVM" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\ClassLoader\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony ClassLoader Component", - "homepage": "https://symfony.com", - "time": "2017-08-03 09:34:20" - }, - { - "name": "symfony/config", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "d668d8c0502d2b485c00d107db65fdbc56c26282" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/d668d8c0502d2b485c00d107db65fdbc56c26282", - "reference": "d668d8c0502d2b485c00d107db65fdbc56c26282", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/filesystem": "~2.8|~3.0|~4.0" - }, - "conflict": { - "symfony/dependency-injection": "<3.3", - "symfony/finder": "<3.3" - }, - "require-dev": { - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/finder": "~3.3|~4.0", - "symfony/yaml": "~3.0|~4.0" - }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Config Component", - "homepage": "https://symfony.com", - "time": "2017-08-05 17:34:46" - }, - { - "name": "symfony/console", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "b789be584eeefa72bcc0d726b6da451e5d24a6df" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/b789be584eeefa72bcc0d726b6da451e5d24a6df", - "reference": "b789be584eeefa72bcc0d726b6da451e5d24a6df", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/debug": "~2.8|~3.0|~4.0", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/dependency-injection": "<3.3", - "symfony/process": "<3.3" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~3.3|~4.0", - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", - "symfony/lock": "~3.4|~4.0", - "symfony/process": "~3.3|~4.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Console Component", - "homepage": "https://symfony.com", - "time": "2017-08-24 14:43:56" - }, - { - "name": "symfony/debug", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "50bda5b4b8641616d45254c6855bcd45f2f64187" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/50bda5b4b8641616d45254c6855bcd45f2f64187", - "reference": "50bda5b4b8641616d45254c6855bcd45f2f64187", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "psr/log": "~1.0" - }, - "conflict": { - "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" - }, - "require-dev": { - "symfony/http-kernel": "~2.8|~3.0|~4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Debug\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Debug Component", - "homepage": "https://symfony.com", - "time": "2017-08-10 07:07:17" - }, - { - "name": "symfony/dependency-injection", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/dependency-injection.git", - "reference": "bc11e2bbe6cc1c21feb172e1ae79aef24006efbd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/bc11e2bbe6cc1c21feb172e1ae79aef24006efbd", - "reference": "bc11e2bbe6cc1c21feb172e1ae79aef24006efbd", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "psr/container": "^1.0" - }, - "conflict": { - "symfony/config": "<3.3.1", - "symfony/finder": "<3.3", - "symfony/proxy-manager-bridge": "<3.4", - "symfony/yaml": "<3.4" - }, - "provide": { - "psr/container-implementation": "1.0" - }, - "require-dev": { - "symfony/config": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/yaml": "~3.4|~4.0" - }, - "suggest": { - "symfony/config": "", - "symfony/expression-language": "For using expressions in service container configuration", - "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", - "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", - "symfony/yaml": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\DependencyInjection\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony DependencyInjection Component", - "homepage": "https://symfony.com", - "time": "2017-08-22 22:02:44" - }, - { - "name": "symfony/event-dispatcher", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "cd8b015f859e6b60933324db00067c2f060b4d18" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/cd8b015f859e6b60933324db00067c2f060b4d18", - "reference": "cd8b015f859e6b60933324db00067c2f060b4d18", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "conflict": { - "symfony/dependency-injection": "<3.3" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony EventDispatcher Component", - "homepage": "https://symfony.com", - "time": "2017-08-03 09:34:20" - }, - { - "name": "symfony/filesystem", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "e4d366b620c8b6e2d4977c154f6a1d5b416db4dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/e4d366b620c8b6e2d4977c154f6a1d5b416db4dd", - "reference": "e4d366b620c8b6e2d4977c154f6a1d5b416db4dd", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Filesystem Component", - "homepage": "https://symfony.com", - "time": "2017-08-03 09:34:20" - }, - { - "name": "symfony/finder", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "bf0450cfe7282c5f06539c4733ba64273e91e918" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/bf0450cfe7282c5f06539c4733ba64273e91e918", - "reference": "bf0450cfe7282c5f06539c4733ba64273e91e918", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Finder Component", - "homepage": "https://symfony.com", - "time": "2017-08-03 09:34:20" - }, - { - "name": "symfony/framework-bundle", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/framework-bundle.git", - "reference": "2210dccd158658d64cbad45d1e9e6a1c313d3855" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/2210dccd158658d64cbad45d1e9e6a1c313d3855", - "reference": "2210dccd158658d64cbad45d1e9e6a1c313d3855", - "shasum": "" - }, - "require": { - "ext-xml": "*", - "php": "^5.5.9|>=7.0.8", - "symfony/cache": "~3.4|~4.0", - "symfony/class-loader": "~3.2", - "symfony/config": "~3.3|~4.0", - "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "^3.3.1|~4.0", - "symfony/filesystem": "~2.8|~3.0|~4.0", - "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "~3.3|~4.0", - "symfony/http-kernel": "~3.4|~4.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/routing": "~3.4|~4.0" - }, - "conflict": { - "phpdocumentor/reflection-docblock": "<3.0", - "phpdocumentor/type-resolver": "<0.2.0", - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", - "symfony/asset": "<3.3", - "symfony/console": "<3.4", - "symfony/form": "<3.3", - "symfony/property-info": "<3.3", - "symfony/serializer": "<3.3", - "symfony/translation": "<3.4", - "symfony/validator": "<3.4", - "symfony/workflow": "<3.3" - }, - "require-dev": { - "doctrine/annotations": "~1.0", - "doctrine/cache": "~1.0", - "fig/link-util": "^1.0", - "phpdocumentor/reflection-docblock": "^3.0|^4.0", - "symfony/asset": "~3.3|~4.0", - "symfony/browser-kit": "~2.8|~3.0|~4.0", - "symfony/console": "~3.4|~4.0", - "symfony/css-selector": "~2.8|~3.0|~4.0", - "symfony/dom-crawler": "~2.8|~3.0|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/form": "~3.3|~4.0", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/process": "~2.8|~3.0|~4.0", - "symfony/property-info": "~3.3|~4.0", - "symfony/security": "~2.8|~3.0|~4.0", - "symfony/security-core": "~3.2|~4.0", - "symfony/security-csrf": "~2.8|~3.0|~4.0", - "symfony/serializer": "~3.3|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0", - "symfony/templating": "~2.8|~3.0|~4.0", - "symfony/translation": "~3.4|~4.0", - "symfony/validator": "~3.4|~4.0", - "symfony/var-dumper": "~3.3|~4.0", - "symfony/web-link": "~3.3|~4.0", - "symfony/workflow": "~3.3|~4.0", - "symfony/yaml": "~3.2|~4.0", - "twig/twig": "~1.34|~2.4" - }, - "suggest": { - "ext-apcu": "For best performance of the system caches", - "symfony/console": "For using the console commands", - "symfony/form": "For using forms", - "symfony/property-info": "For using the property_info service", - "symfony/serializer": "For using the serializer service", - "symfony/validator": "For using validation", - "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", - "symfony/yaml": "For using the debug:config and lint:yaml commands" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bundle\\FrameworkBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony FrameworkBundle", - "homepage": "https://symfony.com", - "time": "2017-08-24 21:10:36" - }, - { - "name": "symfony/http-foundation", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "9cc8019b5d013f3b0dda7f1ba5596677229562b9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9cc8019b5d013f3b0dda7f1ba5596677229562b9", - "reference": "9cc8019b5d013f3b0dda7f1ba5596677229562b9", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-mbstring": "~1.1" - }, - "require-dev": { - "symfony/expression-language": "~2.8|~3.0|~4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony HttpFoundation Component", - "homepage": "https://symfony.com", - "time": "2017-08-22 20:48:27" - }, - { - "name": "symfony/http-kernel", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-kernel.git", - "reference": "caadce32fad406ca89dca1b7d6156dbdef422170" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/caadce32fad406ca89dca1b7d6156dbdef422170", - "reference": "caadce32fad406ca89dca1b7d6156dbdef422170", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "psr/log": "~1.0", - "symfony/debug": "~2.8|~3.0|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "~3.3|~4.0" - }, - "conflict": { - "symfony/config": "<2.8", - "symfony/dependency-injection": "<3.4", - "symfony/var-dumper": "<3.3", - "twig/twig": "<1.34|<2.4,>=2" - }, - "require-dev": { - "psr/cache": "~1.0", - "symfony/browser-kit": "~2.8|~3.0|~4.0", - "symfony/class-loader": "~2.8|~3.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/console": "~2.8|~3.0|~4.0", - "symfony/css-selector": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "~3.4|~4.0", - "symfony/dom-crawler": "~2.8|~3.0|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/process": "~2.8|~3.0|~4.0", - "symfony/routing": "~2.8|~3.0|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0", - "symfony/templating": "~2.8|~3.0|~4.0", - "symfony/translation": "~2.8|~3.0|~4.0", - "symfony/var-dumper": "~3.3|~4.0" - }, - "suggest": { - "symfony/browser-kit": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "", - "symfony/finder": "", - "symfony/var-dumper": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpKernel\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony HttpKernel Component", - "homepage": "https://symfony.com", - "time": "2017-08-18 11:51:16" - }, - { - "name": "symfony/inflector", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/inflector.git", - "reference": "8b7161c60d9481f8564df09987fe51e7edfadfce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/inflector/zipball/8b7161c60d9481f8564df09987fe51e7edfadfce", - "reference": "8b7161c60d9481f8564df09987fe51e7edfadfce", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Inflector\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Inflector Component", - "homepage": "https://symfony.com", - "keywords": [ - "inflection", - "pluralize", - "singularize", - "string", - "symfony", - "words" - ], - "time": "2017-08-03 09:34:20" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "7c8fae0ac1d216eb54349e6a8baa57d515fe8803" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7c8fae0ac1d216eb54349e6a8baa57d515fe8803", - "reference": "7c8fae0ac1d216eb54349e6a8baa57d515fe8803", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.5-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "time": "2017-06-14 15:44:48" - }, - { - "name": "symfony/polyfill-php56", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php56.git", - "reference": "e85ebdef569b84e8709864e1a290c40f156b30ca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/e85ebdef569b84e8709864e1a290c40f156b30ca", - "reference": "e85ebdef569b84e8709864e1a290c40f156b30ca", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/polyfill-util": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.5-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php56\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "time": "2017-06-14 15:44:48" - }, - { - "name": "symfony/polyfill-php70", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "b6482e68974486984f59449ecea1fbbb22ff840f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/b6482e68974486984f59449ecea1fbbb22ff840f", - "reference": "b6482e68974486984f59449ecea1fbbb22ff840f", - "shasum": "" - }, - "require": { - "paragonie/random_compat": "~1.0|~2.0", - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.5-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php70\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "time": "2017-06-14 15:44:48" - }, - { - "name": "symfony/polyfill-util", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-util.git", - "reference": "67925d1cf0b84bd234a83bebf26d4eb281744c6d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/67925d1cf0b84bd234a83bebf26d4eb281744c6d", - "reference": "67925d1cf0b84bd234a83bebf26d4eb281744c6d", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.5-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Util\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony utilities for portability of PHP codes", - "homepage": "https://symfony.com", - "keywords": [ - "compat", - "compatibility", - "polyfill", - "shim" - ], - "time": "2017-07-05 15:09:33" - }, - { - "name": "symfony/process", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "9794f948d9af3be0157185051275d78b24d68b92" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/9794f948d9af3be0157185051275d78b24d68b92", - "reference": "9794f948d9af3be0157185051275d78b24d68b92", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Process Component", - "homepage": "https://symfony.com", - "time": "2017-08-03 09:34:20" - }, - { - "name": "symfony/property-access", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/property-access.git", - "reference": "20735a225c19b15f24b4d8c34e3494ef6cbba00c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/20735a225c19b15f24b4d8c34e3494ef6cbba00c", - "reference": "20735a225c19b15f24b4d8c34e3494ef6cbba00c", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/inflector": "~3.1|~4.0", - "symfony/polyfill-php70": "~1.0" - }, - "require-dev": { - "symfony/cache": "~3.1|~4.0" - }, - "suggest": { - "psr/cache-implementation": "To cache access methods." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\PropertyAccess\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony PropertyAccess Component", - "homepage": "https://symfony.com", - "keywords": [ - "access", - "array", - "extraction", - "index", - "injection", - "object", - "property", - "property path", - "reflection" - ], - "time": "2017-08-03 09:34:20" - }, - { - "name": "symfony/routing", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "fe0e162d79eaae602276a1a84939819c7308fb86" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/fe0e162d79eaae602276a1a84939819c7308fb86", - "reference": "fe0e162d79eaae602276a1a84939819c7308fb86", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "conflict": { - "symfony/config": "<2.8", - "symfony/dependency-injection": "<3.3", - "symfony/yaml": "<3.3" - }, - "require-dev": { - "doctrine/annotations": "~1.0", - "doctrine/common": "~2.2", - "psr/log": "~1.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "~2.8|~3.0|~4.0", - "symfony/yaml": "~3.3|~4.0" - }, - "suggest": { - "doctrine/annotations": "For using the annotation loader", - "symfony/config": "For using the all-in-one router or any loader", - "symfony/dependency-injection": "For loading routes from a service", - "symfony/expression-language": "For using expression matching", - "symfony/http-foundation": "For using a Symfony Request object", - "symfony/yaml": "For using the YAML loader" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Routing\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Routing Component", - "homepage": "https://symfony.com", - "keywords": [ - "router", - "routing", - "uri", - "url" - ], - "time": "2017-08-16 16:25:34" - }, - { - "name": "symfony/security", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/security.git", - "reference": "02681c43d66eb214154eca2c52e6e5d32e9ad386" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/security/zipball/02681c43d66eb214154eca2c52e6e5d32e9ad386", - "reference": "02681c43d66eb214154eca2c52e6e5d32e9ad386", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "~2.8|~3.0|~4.0", - "symfony/http-kernel": "~3.3|~4.0", - "symfony/polyfill-php56": "~1.0", - "symfony/polyfill-php70": "~1.0", - "symfony/polyfill-util": "~1.0", - "symfony/property-access": "~2.8|~3.0|~4.0" - }, - "replace": { - "symfony/security-core": "self.version", - "symfony/security-csrf": "self.version", - "symfony/security-guard": "self.version", - "symfony/security-http": "self.version" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/ldap": "~3.1|~4.0", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/routing": "~2.8|~3.0|~4.0", - "symfony/validator": "^3.2.5|~4.0" - }, - "suggest": { - "symfony/expression-language": "For using the expression voter", - "symfony/form": "", - "symfony/ldap": "For using the LDAP user and authentication providers", - "symfony/routing": "For using the HttpUtils class to create sub-requests, redirect the user, and match URLs", - "symfony/validator": "For using the user password constraint" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Security\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Security Component", - "homepage": "https://symfony.com", - "time": "2017-08-06 13:42:33" - }, - { - "name": "symfony/swiftmailer-bundle", - "version": "2.6.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/swiftmailer-bundle.git", - "reference": "11555c338f3c367b0a1bd2f024a53aa813f4ce00" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/11555c338f3c367b0a1bd2f024a53aa813f4ce00", - "reference": "11555c338f3c367b0a1bd2f024a53aa813f4ce00", - "shasum": "" - }, - "require": { - "php": ">=5.3.2", - "swiftmailer/swiftmailer": "~4.2|~5.0", - "symfony/config": "~2.7|~3.0", - "symfony/dependency-injection": "~2.7|~3.0", - "symfony/http-kernel": "~2.7|~3.0" - }, - "require-dev": { - "symfony/console": "~2.7|~3.0", - "symfony/framework-bundle": "~2.7|~3.0", - "symfony/phpunit-bridge": "~3.3@dev", - "symfony/yaml": "~2.7|~3.0" - }, - "suggest": { - "psr/log": "Allows logging" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bundle\\SwiftmailerBundle\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony SwiftmailerBundle", - "homepage": "http://symfony.com", - "time": "2017-07-22 07:18:13" - }, - { - "name": "symfony/templating", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/templating.git", - "reference": "0be43fb218def6dd79ab888927403dcf119b09f7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/templating/zipball/0be43fb218def6dd79ab888927403dcf119b09f7", - "reference": "0be43fb218def6dd79ab888927403dcf119b09f7", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "require-dev": { - "psr/log": "~1.0" - }, - "suggest": { - "psr/log": "For using debug logging in loaders" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Templating\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Templating Component", - "homepage": "https://symfony.com", - "time": "2017-08-03 09:34:20" - }, - { - "name": "symfony/twig-bridge", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-bridge.git", - "reference": "e29c8daa9ad9aac2a717dea3378cddb20a7a5f15" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/e29c8daa9ad9aac2a717dea3378cddb20a7a5f15", - "reference": "e29c8daa9ad9aac2a717dea3378cddb20a7a5f15", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "twig/twig": "~1.34|~2.4" - }, - "conflict": { - "symfony/console": "<3.4", - "symfony/form": "<3.2.10|~3.3,<3.3.3" - }, - "require-dev": { - "fig/link-util": "^1.0", - "symfony/asset": "~2.8|~3.0|~4.0", - "symfony/console": "~3.4|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/form": "^3.2.10|^3.3.3|~4.0", - "symfony/http-kernel": "~3.2|~4.0", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/routing": "~2.8|~3.0|~4.0", - "symfony/security": "~2.8|~3.0|~4.0", - "symfony/security-acl": "~2.8|~3.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0", - "symfony/templating": "~2.8|~3.0|~4.0", - "symfony/translation": "~2.8|~3.0|~4.0", - "symfony/var-dumper": "~2.8.10|~3.1.4|~3.2|~4.0", - "symfony/web-link": "~3.3|~4.0", - "symfony/yaml": "~2.8|~3.0|~4.0" - }, - "suggest": { - "symfony/asset": "For using the AssetExtension", - "symfony/expression-language": "For using the ExpressionExtension", - "symfony/finder": "", - "symfony/form": "For using the FormExtension", - "symfony/http-kernel": "For using the HttpKernelExtension", - "symfony/routing": "For using the RoutingExtension", - "symfony/security": "For using the SecurityExtension", - "symfony/stopwatch": "For using the StopwatchExtension", - "symfony/templating": "For using the TwigEngine", - "symfony/translation": "For using the TranslationExtension", - "symfony/var-dumper": "For using the DumpExtension", - "symfony/web-link": "For using the WebLinkExtension", - "symfony/yaml": "For using the YamlExtension" - }, - "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bridge\\Twig\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Twig Bridge", - "homepage": "https://symfony.com", - "time": "2017-08-24 14:43:56" - }, - { - "name": "symfony/twig-bundle", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-bundle.git", - "reference": "64b3feb6c4a98badcf6297abc0bcb70c18dde358" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/64b3feb6c4a98badcf6297abc0bcb70c18dde358", - "reference": "64b3feb6c4a98badcf6297abc0bcb70c18dde358", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/config": "~3.2|~4.0", - "symfony/http-foundation": "~2.8|~3.0|~4.0", - "symfony/http-kernel": "^3.3|~4.0", - "symfony/twig-bridge": "^3.3|~4.0", - "twig/twig": "~1.34|~2.4" - }, - "conflict": { - "symfony/dependency-injection": "<3.3" - }, - "require-dev": { - "doctrine/annotations": "~1.0", - "doctrine/cache": "~1.0", - "symfony/asset": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/form": "~2.8|~3.0|~4.0", - "symfony/framework-bundle": "^3.2.8|~4.0", - "symfony/routing": "~2.8|~3.0|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0", - "symfony/templating": "~2.8|~3.0|~4.0", - "symfony/web-link": "~3.3|~4.0", - "symfony/yaml": "~2.8|~3.0|~4.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bundle\\TwigBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony TwigBundle", - "homepage": "https://symfony.com", - "time": "2017-08-22 21:55:52" - }, - { - "name": "symfony/yaml", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "5a58daa633a14651d7b2a34613c9b62c02faf873" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/5a58daa633a14651d7b2a34613c9b62c02faf873", - "reference": "5a58daa633a14651d7b2a34613c9b62c02faf873", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "conflict": { - "symfony/console": "<3.4" - }, - "require-dev": { - "symfony/console": "~3.4|~4.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com", - "time": "2017-08-24 14:43:56" - }, - { - "name": "twig/twig", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "cd06d3c69619dcf5bfdbfe5d1f18923389a5bd43" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/cd06d3c69619dcf5bfdbfe5d1f18923389a5bd43", - "reference": "cd06d3c69619dcf5bfdbfe5d1f18923389a5bd43", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "psr/container": "^1.0", - "symfony/debug": "~2.7", - "symfony/phpunit-bridge": "~3.3@dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.35-dev" - } - }, - "autoload": { - "psr-0": { - "Twig_": "lib/" - }, - "psr-4": { - "Twig\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" - }, - { - "name": "Twig Team", - "homepage": "http://twig.sensiolabs.org/contributors", - "role": "Contributors" - } - ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "http://twig.sensiolabs.org", - "keywords": [ - "templating" - ], - "time": "2017-08-19 17:37:14" - } - ], - "packages-dev": [ - { - "name": "doctrine/annotations", - "version": "v1.4.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "54cacc9b81758b14e3ce750f205a393d52339e97" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/54cacc9b81758b14e3ce750f205a393d52339e97", - "reference": "54cacc9b81758b14e3ce750f205a393d52339e97", - "shasum": "" - }, - "require": { - "doctrine/lexer": "1.*", - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "doctrine/cache": "1.*", - "phpunit/phpunit": "^5.7" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "annotations", - "docblock", - "parser" - ], - "time": "2017-02-24 16:22:25" - }, - { - "name": "doctrine/cache", - "version": "1.6.x-dev", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "eb152c5100571c7a45470ff2a35095ab3f3b900b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/eb152c5100571c7a45470ff2a35095ab3f3b900b", - "reference": "eb152c5100571c7a45470ff2a35095ab3f3b900b", - "shasum": "" - }, - "require": { - "php": "~5.5|~7.0" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "phpunit/phpunit": "~4.8|~5.0", - "predis/predis": "~1.0", - "satooshi/php-coveralls": "~0.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.6.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Caching library offering an object-oriented API for many cache backends", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "cache", - "caching" - ], - "time": "2017-07-22 12:49:21" - }, - { - "name": "doctrine/collections", - "version": "v1.4.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/collections.git", - "reference": "1a4fb7e902202c33cce8c55989b945612943c2ba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/1a4fb7e902202c33cce8c55989b945612943c2ba", - "reference": "1a4fb7e902202c33cce8c55989b945612943c2ba", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "doctrine/coding-standard": "~0.1@dev", - "phpunit/phpunit": "^5.7" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\Collections\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Collections Abstraction library", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "array", - "collections", - "iterator" - ], - "time": "2017-01-03 10:49:41" - }, - { - "name": "doctrine/common", - "version": "2.7.x-dev", - "source": { - "type": "git", - "url": "https://github.com/doctrine/common.git", - "reference": "df88fc88463a60f228a8233acf3fa8664897229c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/df88fc88463a60f228a8233acf3fa8664897229c", - "reference": "df88fc88463a60f228a8233acf3fa8664897229c", - "shasum": "" - }, - "require": { - "doctrine/annotations": "1.*", - "doctrine/cache": "1.*", - "doctrine/collections": "1.*", - "doctrine/inflector": "1.*", - "doctrine/lexer": "1.*", - "php": "~5.6|~7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.4.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Common Library for Doctrine projects", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "annotations", - "collections", - "eventmanager", - "persistence", - "spl" - ], - "time": "2017-07-22 08:35:55" - }, - { - "name": "doctrine/dbal", - "version": "2.5.x-dev", - "source": { - "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "9315e61c4c525167fbcc963c38ef136f691c99e9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/9315e61c4c525167fbcc963c38ef136f691c99e9", - "reference": "9315e61c4c525167fbcc963c38ef136f691c99e9", - "shasum": "" - }, - "require": { - "doctrine/common": ">=2.4,<2.8-dev", - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "4.*", - "symfony/console": "2.*||^3.0" - }, - "suggest": { - "symfony/console": "For helpful console commands such as SQL execution and import of files." - }, - "bin": [ - "bin/doctrine-dbal" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.5.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\DBAL\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Database Abstraction Layer", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "database", - "dbal", - "persistence", - "queryobject" - ], - "time": "2017-07-22 20:45:23" - }, - { - "name": "doctrine/doctrine-bundle", - "version": "1.6.8", - "source": { - "type": "git", - "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "6e96577cbbdbb5b6dcca2ff203d665976b51beb0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/6e96577cbbdbb5b6dcca2ff203d665976b51beb0", - "reference": "6e96577cbbdbb5b6dcca2ff203d665976b51beb0", - "shasum": "" - }, - "require": { - "doctrine/dbal": "~2.3", - "doctrine/doctrine-cache-bundle": "~1.2", - "jdorn/sql-formatter": "~1.1", - "php": ">=5.5.9", - "symfony/console": "~2.7|~3.0|~4.0", - "symfony/dependency-injection": "~2.7|~3.0|~4.0", - "symfony/doctrine-bridge": "~2.7|~3.0|~4.0", - "symfony/framework-bundle": "~2.7|~3.0|~4.0" - }, - "require-dev": { - "doctrine/orm": "~2.3", - "phpunit/phpunit": "~4", - "satooshi/php-coveralls": "^1.0", - "symfony/phpunit-bridge": "~2.7|~3.0|~4.0", - "symfony/property-info": "~2.8|~3.0|~4.0", - "symfony/validator": "~2.7|~3.0|~4.0", - "symfony/yaml": "~2.7|~3.0|~4.0", - "twig/twig": "~1.12|~2.0" - }, - "suggest": { - "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", - "symfony/web-profiler-bundle": "To use the data collector." - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "1.6.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Bundle\\DoctrineBundle\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Doctrine Project", - "homepage": "http://www.doctrine-project.org/" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony DoctrineBundle", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "database", - "dbal", - "orm", - "persistence" - ], - "time": "2017-05-18 08:15:18" - }, - { - "name": "doctrine/doctrine-cache-bundle", - "version": "1.3.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/DoctrineCacheBundle.git", - "reference": "18c600a9b82f6454d2e81ca4957cdd56a1cf3504" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/18c600a9b82f6454d2e81ca4957cdd56a1cf3504", - "reference": "18c600a9b82f6454d2e81ca4957cdd56a1cf3504", - "shasum": "" - }, - "require": { - "doctrine/cache": "^1.4.2", - "doctrine/inflector": "~1.0", - "php": ">=5.3.2", - "symfony/doctrine-bridge": "~2.2|~3.0" - }, - "require-dev": { - "instaclick/coding-standard": "~1.1", - "instaclick/object-calisthenics-sniffs": "dev-master", - "instaclick/symfony2-coding-standard": "dev-remaster", - "phpunit/phpunit": "~4", - "predis/predis": "~0.8", - "satooshi/php-coveralls": "~0.6.1", - "squizlabs/php_codesniffer": "~1.5", - "symfony/console": "~2.2|~3.0", - "symfony/finder": "~2.2|~3.0", - "symfony/framework-bundle": "~2.2|~3.0", - "symfony/phpunit-bridge": "~2.7|~3.0", - "symfony/security-acl": "~2.3|~3.0", - "symfony/validator": "~2.2|~3.0", - "symfony/yaml": "~2.2|~3.0" - }, - "suggest": { - "symfony/security-acl": "For using this bundle to cache ACLs" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Bundle\\DoctrineCacheBundle\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Fabio B. Silva", - "email": "fabio.bat.silva@gmail.com" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@hotmail.com" - }, - { - "name": "Doctrine Project", - "homepage": "http://www.doctrine-project.org/" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony Bundle for Doctrine Cache", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "cache", - "caching" - ], - "time": "2016-01-26 17:28:51" - }, - { - "name": "doctrine/inflector", - "version": "1.1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "90b2128806bfde671b6952ab8bea493942c1fdae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae", - "reference": "90b2128806bfde671b6952ab8bea493942c1fdae", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "4.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\Inflector\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Common String Manipulations with regard to casing and singular/plural rules.", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "inflection", - "pluralize", - "singularize", - "string" - ], - "time": "2015-11-06 14:35:42" - }, - { - "name": "doctrine/instantiator", - "version": "1.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", - "shasum": "" - }, - "require": { - "php": ">=5.3,<8.0-DEV" - }, - "require-dev": { - "athletic/athletic": "~0.1.8", - "ext-pdo": "*", - "ext-phar": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", - "keywords": [ - "constructor", - "instantiate" - ], - "time": "2015-06-14 21:17:01" - }, - { - "name": "doctrine/lexer", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "cc709ba91eee09540091ad5a5f2616727662e41b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/cc709ba91eee09540091ad5a5f2616727662e41b", - "reference": "cc709ba91eee09540091ad5a5f2616727662e41b", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "lexer", - "parser" - ], - "time": "2017-07-24 09:37:08" - }, - { - "name": "doctrine/orm", - "version": "2.5.x-dev", - "source": { - "type": "git", - "url": "https://github.com/doctrine/doctrine2.git", - "reference": "36dc28d43eeacf37faa23cbb441ae226a1fb0ee9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/36dc28d43eeacf37faa23cbb441ae226a1fb0ee9", - "reference": "36dc28d43eeacf37faa23cbb441ae226a1fb0ee9", - "shasum": "" - }, - "require": { - "doctrine/cache": "~1.4", - "doctrine/collections": "~1.2", - "doctrine/common": ">=2.5-dev,<2.9-dev", - "doctrine/dbal": ">=2.5-dev,<2.7-dev", - "doctrine/instantiator": "^1.0.1", - "ext-pdo": "*", - "php": ">=5.4", - "symfony/console": "~2.5|~3.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0", - "symfony/yaml": "~2.3|~3.0" - }, - "suggest": { - "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" - }, - "bin": [ - "bin/doctrine", - "bin/doctrine.php" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\ORM\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Object-Relational-Mapper for PHP", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "database", - "orm" - ], - "time": "2017-08-19 16:47:32" - }, - { - "name": "jdorn/sql-formatter", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/jdorn/sql-formatter.git", - "reference": "7ef9b85961956aa572413693e1194b60f50ab9ab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/7ef9b85961956aa572413693e1194b60f50ab9ab", - "reference": "7ef9b85961956aa572413693e1194b60f50ab9ab", - "shasum": "" - }, - "require": { - "php": ">=5.2.4" - }, - "require-dev": { - "phpunit/phpunit": "3.7.*" - }, - "bin": [ - "bin/sql-formatter" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "lib" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jeremy Dorn", - "email": "jeremy@jeremydorn.com", - "homepage": "http://jeremydorn.com/" - } - ], - "description": "a PHP SQL highlighting library", - "homepage": "https://github.com/jdorn/sql-formatter/", - "keywords": [ - "highlight", - "sql" - ], - "time": "2015-08-30 16:36:01" - }, - { - "name": "monolog/monolog", - "version": "1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4", - "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "psr/log": "~1.0" - }, - "provide": { - "psr/log-implementation": "1.0.0" - }, - "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", - "doctrine/couchdb": "~1.0@dev", - "graylog2/gelf-php": "~1.0", - "jakub-onderka/php-parallel-lint": "0.9", - "php-amqplib/php-amqplib": "~2.4", - "php-console/php-console": "^3.1.3", - "phpunit/phpunit": "~4.5", - "phpunit/phpunit-mock-objects": "2.3.0", - "ruflin/elastica": ">=0.90 <3.0", - "sentry/sentry": "^0.13", - "swiftmailer/swiftmailer": "^5.3|^6.0" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-mongo": "Allow sending log messages to a MongoDB server", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "php-console/php-console": "Allow sending log messages to Google Chrome", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server", - "sentry/sentry": "Allow sending log messages to a Sentry server" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Monolog\\": "src/Monolog" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "http://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ], - "time": "2017-06-19 01:22:40" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "a046af61c36e9162372f205de091a1cab7340f1c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/a046af61c36e9162372f205de091a1cab7340f1c", - "reference": "a046af61c36e9162372f205de091a1cab7340f1c", - "shasum": "" - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "phpunit/phpunit": "^4.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "time": "2017-04-30 11:58:12" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "3.2.2", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "4aada1f93c72c35e22fb1383b47fee43b8f1d157" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/4aada1f93c72c35e22fb1383b47fee43b8f1d157", - "reference": "4aada1f93c72c35e22fb1383b47fee43b8f1d157", - "shasum": "" - }, - "require": { - "php": ">=5.5", - "phpdocumentor/reflection-common": "^1.0@dev", - "phpdocumentor/type-resolver": "^0.3.0", - "webmozart/assert": "^1.0" - }, - "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^4.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2017-08-08 06:39:58" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "0.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "fb3933512008d8162b3cdf9e18dba9309b7c3773" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/fb3933512008d8162b3cdf9e18dba9309b7c3773", - "reference": "fb3933512008d8162b3cdf9e18dba9309b7c3773", - "shasum": "" - }, - "require": { - "php": "^5.5 || ^7.0", - "phpdocumentor/reflection-common": "^1.0" - }, - "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^5.2||^4.8.24" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "time": "2017-06-03 08:32:36" - }, - { - "name": "phpspec/prophecy", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "420d44c5534bbf269e85e6213446e8284d53c6c7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/420d44c5534bbf269e85e6213446e8284d53c6c7", - "reference": "420d44c5534bbf269e85e6213446e8284d53c6c7", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", - "sebastian/comparator": "^1.1|^2.0", - "sebastian/recursion-context": "^1.0|^2.0|^3.0" - }, - "require-dev": { - "phpspec/phpspec": "^2.5|^3.2", - "phpunit/phpunit": "^4.8 || ^5.6.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.7.x-dev" - } - }, - "autoload": { - "psr-0": { - "Prophecy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "time": "2017-07-19 07:44:25" - }, - { - "name": "phpunit/php-code-coverage", - "version": "2.2.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "phpunit/php-file-iterator": "~1.3", - "phpunit/php-text-template": "~1.2", - "phpunit/php-token-stream": "~1.3", - "sebastian/environment": "^1.3.2", - "sebastian/version": "~1.0" - }, - "require-dev": { - "ext-xdebug": ">=2.1.4", - "phpunit/phpunit": "~4" - }, - "suggest": { - "ext-dom": "*", - "ext-xdebug": ">=2.2.1", - "ext-xmlwriter": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "time": "2015-10-06 15:47:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5", - "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "time": "2016-10-03 07:40:28" - }, - { - "name": "phpunit/php-text-template", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "time": "2015-06-21 13:50:34" - }, - { - "name": "phpunit/php-timer", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "d107f347d368dd8a384601398280c7c608390ab7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/d107f347d368dd8a384601398280c7c608390ab7", - "reference": "d107f347d368dd8a384601398280c7c608390ab7", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "time": "2017-03-07 15:42:04" - }, - { - "name": "phpunit/php-token-stream", - "version": "1.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "958103f327daef5dd0bb328dec53e0a9e43cfaf7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/958103f327daef5dd0bb328dec53e0a9e43cfaf7", - "reference": "958103f327daef5dd0bb328dec53e0a9e43cfaf7", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "time": "2017-03-07 08:21:50" - }, - { - "name": "phpunit/phpunit", - "version": "4.8.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "18e5f52e8412d23e739f7d8744e177039860e800" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/18e5f52e8412d23e739f7d8744e177039860e800", - "reference": "18e5f52e8412d23e739f7d8744e177039860e800", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=5.3.3", - "phpspec/prophecy": "^1.3.1", - "phpunit/php-code-coverage": "~2.1", - "phpunit/php-file-iterator": "~1.4", - "phpunit/php-text-template": "~1.2", - "phpunit/php-timer": "^1.0.6", - "phpunit/phpunit-mock-objects": "~2.3", - "sebastian/comparator": "~1.2.2", - "sebastian/diff": "~1.2", - "sebastian/environment": "~1.3", - "sebastian/exporter": "~1.2", - "sebastian/global-state": "~1.0", - "sebastian/version": "~1.0", - "symfony/yaml": "~2.1|~3.0" - }, - "suggest": { - "phpunit/php-invoker": "~1.1" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.8.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "time": "2017-06-23 12:44:27" - }, - { - "name": "phpunit/phpunit-mock-objects", - "version": "2.3.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": ">=5.3.3", - "phpunit/php-text-template": "~1.2", - "sebastian/exporter": "~1.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "suggest": { - "ext-soap": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Mock Object library for PHPUnit", - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", - "keywords": [ - "mock", - "xunit" - ], - "time": "2015-10-02 06:51:40" - }, - { - "name": "pusher/pusher-php-server", - "version": "2.x-dev", - "source": { - "type": "git", - "url": "https://github.com/pusher/pusher-http-php.git", - "reference": "9f721dd7b0ab88aa24197f43d34a83c8d2c5d13d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pusher/pusher-http-php/zipball/9f721dd7b0ab88aa24197f43d34a83c8d2c5d13d", - "reference": "9f721dd7b0ab88aa24197f43d34a83c8d2c5d13d", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "php": ">=5.2" - }, - "require-dev": { - "phpunit/phpunit": "~4" - }, - "type": "library", - "autoload": { - "classmap": [ - "lib/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Library for interacting with the Pusher REST API", - "homepage": "https://github.com/pusher/pusher-php-server", - "keywords": [ - "events", - "php-pusher-server", - "publish", - "pusher", - "realtime", - "rest", - "trigger" - ], - "time": "2016-03-16 19:51:22" - }, - { - "name": "sebastian/comparator", - "version": "1.2.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "18a5d97c25f408f48acaf6d1b9f4079314c5996a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/18a5d97c25f408f48acaf6d1b9f4079314c5996a", - "reference": "18a5d97c25f408f48acaf6d1b9f4079314c5996a", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/diff": "~1.2", - "sebastian/exporter": "~1.2 || ~2.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "http://www.github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "time": "2017-03-07 10:34:43" - }, - { - "name": "sebastian/diff", - "version": "1.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4", - "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff" - ], - "time": "2017-05-22 07:24:03" - }, - { - "name": "sebastian/environment", - "version": "1.3.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "67f55699c2810ff0f2cc47478bbdeda8567e68ee" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/67f55699c2810ff0f2cc47478bbdeda8567e68ee", - "reference": "67f55699c2810ff0f2cc47478bbdeda8567e68ee", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "time": "2017-02-28 08:18:59" - }, - { - "name": "sebastian/exporter", - "version": "1.2.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "dcd43bcc0fd3551bd2ede0081882d549bb78225d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/dcd43bcc0fd3551bd2ede0081882d549bb78225d", - "reference": "dcd43bcc0fd3551bd2ede0081882d549bb78225d", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0", - "sebastian/recursion-context": "^1.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "time": "2017-02-26 13:09:30" - }, - { - "name": "sebastian/global-state", - "version": "1.1.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "cea85a84b00f2795341ebbbca4fa396347f2494e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/cea85a84b00f2795341ebbbca4fa396347f2494e", - "reference": "cea85a84b00f2795341ebbbca4fa396347f2494e", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2|~5.0" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "time": "2017-02-23 14:11:06" - }, - { - "name": "sebastian/recursion-context", - "version": "1.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7", - "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2016-10-03 07:41:43" - }, - { - "name": "sebastian/version", - "version": "1.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", - "shasum": "" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "time": "2015-06-21 13:59:46" - }, - { - "name": "symfony/doctrine-bridge", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "b5a0c2a4d1cb6721be2647d0c0bdddd43d05d243" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/b5a0c2a4d1cb6721be2647d0c0bdddd43d05d243", - "reference": "b5a0c2a4d1cb6721be2647d0c0bdddd43d05d243", - "shasum": "" - }, - "require": { - "doctrine/common": "~2.4", - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", - "symfony/dependency-injection": "<3.4" - }, - "require-dev": { - "doctrine/data-fixtures": "1.0.*", - "doctrine/dbal": "~2.4", - "doctrine/orm": "^2.4.5", - "symfony/dependency-injection": "~3.4|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/form": "^3.2.5|~4.0", - "symfony/http-kernel": "~2.8|~3.0|~4.0", - "symfony/property-access": "~2.8|~3.0|~4.0", - "symfony/property-info": "~2.8|3.0|~4.0", - "symfony/proxy-manager-bridge": "~2.8|~3.0|~4.0", - "symfony/security": "~2.8|~3.0|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0", - "symfony/translation": "~2.8|~3.0|~4.0", - "symfony/validator": "^3.2.5|~4.0" - }, - "suggest": { - "doctrine/data-fixtures": "", - "doctrine/dbal": "", - "doctrine/orm": "", - "symfony/form": "", - "symfony/property-info": "", - "symfony/validator": "" - }, - "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bridge\\Doctrine\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Doctrine Bridge", - "homepage": "https://symfony.com", - "time": "2017-08-07 16:48:44" - }, - { - "name": "symfony/monolog-bridge", - "version": "3.4.x-dev", - "source": { - "type": "git", - "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "8232b197868ee487ba3509eb96f9c823bc69e15d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/8232b197868ee487ba3509eb96f9c823bc69e15d", - "reference": "8232b197868ee487ba3509eb96f9c823bc69e15d", - "shasum": "" - }, - "require": { - "monolog/monolog": "~1.19", - "php": "^5.5.9|>=7.0.8", - "symfony/http-kernel": "~2.8|~3.0|~4.0" - }, - "conflict": { - "symfony/http-foundation": "<3.3" - }, - "require-dev": { - "symfony/console": "~2.8|~3.0|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", - "symfony/security-core": "~2.8|~3.0|~4.0", - "symfony/var-dumper": "~3.3|~4.0" - }, - "suggest": { - "symfony/console": "For the possibility to show log messages in console commands depending on verbosity settings. You need version ~2.3 of the console for it.", - "symfony/event-dispatcher": "Needed when using log messages in console commands.", - "symfony/http-kernel": "For using the debugging handlers together with the response life cycle of the HTTP kernel." - }, - "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bridge\\Monolog\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Monolog Bridge", - "homepage": "https://symfony.com", - "time": "2017-08-03 09:34:20" - }, - { - "name": "symfony/monolog-bundle", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/symfony/monolog-bundle.git", - "reference": "c9fb33a8446a05e676a07ced73bca67ef052c3ac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/c9fb33a8446a05e676a07ced73bca67ef052c3ac", - "reference": "c9fb33a8446a05e676a07ced73bca67ef052c3ac", - "shasum": "" - }, - "require": { - "monolog/monolog": "~1.22", - "php": ">=5.3.2", - "symfony/config": "~2.7|~3.0|~4.0", - "symfony/dependency-injection": "~2.7|~3.0|~4.0", - "symfony/http-kernel": "~2.7|~3.0|~4.0", - "symfony/monolog-bridge": "~2.7|~3.0|~4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8", - "symfony/console": "~2.3|~3.0|~4.0", - "symfony/yaml": "~2.3|~3.0|~4.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bundle\\MonologBundle\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony MonologBundle", - "homepage": "http://symfony.com", - "keywords": [ - "log", - "logging" - ], - "time": "2017-05-18 08:23:53" - }, - { - "name": "webmozart/assert", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "4a8bf11547e139e77b651365113fc12850c43d9a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/4a8bf11547e139e77b651365113fc12850c43d9a", - "reference": "4a8bf11547e139e77b651365113fc12850c43d9a", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "time": "2016-11-23 20:04:41" - } - ], - "aliases": [], - "minimum-stability": "dev", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=5.6.4" - }, - "platform-dev": [] -}