├── .gitignore ├── .scrutinizer.yml ├── .travis.yml ├── CacheWarmer └── AspectCacheWarmer.php ├── Command ├── CacheWarmupCommand.php ├── DebugAdvisorCommand.php └── DebugAspectCommand.php ├── DependencyInjection ├── Compiler │ └── AspectCollectorPass.php ├── Configuration.php └── GoAopExtension.php ├── GoAopBundle.php ├── Kernel └── AspectSymfonyKernel.php ├── README.md ├── Resources ├── config │ ├── commands.xml │ ├── schema │ │ └── configuration-1.0.0.xsd │ └── services.xml └── meta │ └── LICENSE ├── Tests ├── CacheWarmer │ └── AspectCacheWarmerTest.php ├── Command │ ├── CacheWarmupCommandTest.php │ ├── DebugAdvisorCommandTest.php │ └── DebugAspectCommandTest.php ├── DependencyInjection │ ├── Compiler │ │ └── AspectCollectorPassTest.php │ ├── ConfigurationTest.php │ └── GoAopExtensionTest.php ├── Fixtures │ ├── config │ │ ├── empty.xml │ │ ├── full.xml │ │ └── full.yml │ ├── mock │ │ ├── AopComposerLoader.php │ │ └── DebugClassLoader.php │ └── project │ │ ├── app │ │ ├── AppKernel.php │ │ └── config │ │ │ └── config.yml │ │ ├── bin │ │ └── console │ │ ├── src │ │ ├── Annotation │ │ │ └── Loggable.php │ │ ├── Application │ │ │ └── Main.php │ │ └── Aspect │ │ │ └── LoggingAspect.php │ │ └── var │ │ ├── cache │ │ └── .gitkeep │ │ └── logs │ │ └── .gitkeep ├── GoAopBundleTest.php └── Kernel │ └── AspectSymfonyKernelTest.php ├── composer.json ├── composer.lock └── phpunit.xml /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor/ 2 | /build/ 3 | /Tests/Fixtures/project/var/cache/* 4 | /Tests/Fixtures/project/var/logs/* 5 | -------------------------------------------------------------------------------- /.scrutinizer.yml: -------------------------------------------------------------------------------- 1 | filter: 2 | excluded_paths: [vendor/*, Tests/*, bin/*, Resources/] 3 | checks: 4 | php: true 5 | tools: 6 | external_code_coverage: 7 | timeout: 600 8 | php_sim: true 9 | php_mess_detector: true 10 | php_cs_fixer: true 11 | php_analyzer: true 12 | php_code_sniffer: true 13 | sensiolabs_security_checker: true 14 | php_loc: 15 | enabled: true 16 | excluded_dirs: [vendor] 17 | php_pdepend: 18 | enabled: true 19 | excluded_dirs: [vendor, Tests, bin] -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | php: 4 | - 5.6 5 | - 7.0 6 | - 7.1 7 | 8 | sudo: false 9 | 10 | env: 11 | - SYMFONY_VERSION=v3 12 | - SYMFONY_VERSION=v4 13 | 14 | matrix: 15 | exclude: 16 | - php: 5.6 17 | env: SYMFONY_VERSION=v4 18 | - php: 7.0 19 | env: SYMFONY_VERSION=v4 20 | 21 | cache: 22 | directories: 23 | - $HOME/.composer/cache/files 24 | 25 | before_install: 26 | - composer self-update 27 | 28 | install: 29 | - if [ "$SYMFONY_VERSION" != "" ]; then composer require "dunglas/symfony-lock:${SYMFONY_VERSION}" --no-update; fi; 30 | - composer update --prefer-source 31 | 32 | script: vendor/bin/phpunit --coverage-clover=coverage.clover -------------------------------------------------------------------------------- /CacheWarmer/AspectCacheWarmer.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * This source file is subject to the license that is bundled 8 | * with this source code in the file LICENSE. 9 | */ 10 | 11 | namespace Go\Symfony\GoAopBundle\CacheWarmer; 12 | 13 | 14 | use Go\Core\AspectKernel; 15 | use Go\Instrument\ClassLoading\CachePathManager; 16 | use Go\Instrument\ClassLoading\SourceTransformingLoader; 17 | use Go\Instrument\FileSystem\Enumerator; 18 | use Go\Instrument\Transformer\FilterInjectorTransformer; 19 | use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmer; 20 | 21 | /** 22 | * Warming the cache with injected advices 23 | * 24 | * NB: in some cases hierarchy analysis can trigger "Fatal Error: class XXX not found". This is means, that there is 25 | * some class with unresolved parent classes. To avoid this issue, just exclude bad classes from analysis via 26 | * 'excludePaths' configuration option. 27 | */ 28 | class AspectCacheWarmer extends CacheWarmer 29 | { 30 | /** 31 | * Instance of aspect kernel 32 | * 33 | * @var AspectKernel 34 | */ 35 | private $aspectKernel; 36 | 37 | /** 38 | * @var CachePathManager 39 | */ 40 | private $cachePathManager; 41 | 42 | /** 43 | * @param AspectKernel $aspectKernel 44 | * @param CachePathManager $cachePathManager 45 | */ 46 | public function __construct(AspectKernel $aspectKernel, CachePathManager $cachePathManager) 47 | { 48 | $this->aspectKernel = $aspectKernel; 49 | $this->cachePathManager = $cachePathManager; 50 | } 51 | 52 | /** 53 | * Checks whether this warmer is optional or not. 54 | * 55 | * Optional warmers can be ignored on certain conditions. 56 | * 57 | * A warmer should return true if the cache can be 58 | * generated incrementally and on-demand. 59 | * 60 | * @return bool true if the warmer is optional, false otherwise 61 | */ 62 | public function isOptional() 63 | { 64 | return false; 65 | } 66 | 67 | /** 68 | * Warms up the cache. 69 | * 70 | * @param string $cacheDir The cache directory 71 | */ 72 | public function warmUp($cacheDir) 73 | { 74 | $options = $this->aspectKernel->getOptions(); 75 | $oldCacheDir = $this->cachePathManager->getCacheDir(); 76 | 77 | $this->cachePathManager->setCacheDir($cacheDir.'/aspect'); 78 | 79 | $enumerator = new Enumerator($options['appDir'], $options['includePaths'], $options['excludePaths']); 80 | $iterator = $enumerator->enumerate(); 81 | 82 | set_error_handler(function ($errno, $errstr, $errfile, $errline) { 83 | throw new \ErrorException($errstr, $errno, 0, $errfile, $errline); 84 | }); 85 | 86 | foreach ($iterator as $file) { 87 | $realPath = $file->getRealPath(); 88 | try { 89 | // This will trigger creation of cache 90 | file_get_contents( 91 | FilterInjectorTransformer::PHP_FILTER_READ. 92 | SourceTransformingLoader::FILTER_IDENTIFIER. 93 | "/resource=" . $realPath 94 | ); 95 | } catch (\Exception $e) { 96 | /* noop */ 97 | } 98 | } 99 | 100 | restore_error_handler(); 101 | $this->cachePathManager->flushCacheState(); 102 | $this->cachePathManager->setCacheDir($oldCacheDir); 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /Command/CacheWarmupCommand.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * This source file is subject to the license that is bundled 8 | * with this source code in the file LICENSE. 9 | */ 10 | 11 | namespace Go\Symfony\GoAopBundle\Command; 12 | 13 | use Go\Core\AspectKernel; 14 | use Symfony\Component\Console\Input\InputInterface; 15 | use Symfony\Component\Console\Output\OutputInterface; 16 | use Go\Console\Command\CacheWarmupCommand as BaseCommand; 17 | 18 | /** 19 | * Console command for warming the cache 20 | * 21 | * @codeCoverageIgnore 22 | */ 23 | class CacheWarmupCommand extends BaseCommand 24 | { 25 | public function __construct(AspectKernel $aspectKernel) 26 | { 27 | parent::__construct(null); 28 | $this->aspectKernel = $aspectKernel; 29 | } 30 | 31 | /** 32 | * {@inheritdoc} 33 | */ 34 | protected function configure() 35 | { 36 | parent::configure(); 37 | $arguments = $this->getDefinition()->getArguments(); 38 | unset($arguments['loader']); 39 | $this->getDefinition()->setArguments($arguments); 40 | } 41 | 42 | /** 43 | * {@inheritdoc} 44 | */ 45 | protected function loadAspectKernel(InputInterface $input, OutputInterface $output) 46 | { 47 | /* noop */ 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Command/DebugAdvisorCommand.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * This source file is subject to the license that is bundled 8 | * with this source code in the file LICENSE. 9 | */ 10 | 11 | namespace Go\Symfony\GoAopBundle\Command; 12 | 13 | use Go\Core\AspectKernel; 14 | use Symfony\Component\Console\Input\InputInterface; 15 | use Symfony\Component\Console\Output\OutputInterface; 16 | use Go\Console\Command\DebugAdvisorCommand as BaseCommand; 17 | 18 | /** 19 | * Console command to debug an advisors 20 | * 21 | * @codeCoverageIgnore 22 | */ 23 | class DebugAdvisorCommand extends BaseCommand 24 | { 25 | public function __construct(AspectKernel $aspectKernel) 26 | { 27 | parent::__construct(null); 28 | $this->aspectKernel = $aspectKernel; 29 | } 30 | 31 | /** 32 | * {@inheritdoc} 33 | */ 34 | protected function configure() 35 | { 36 | parent::configure(); 37 | $arguments = $this->getDefinition()->getArguments(); 38 | unset($arguments['loader']); 39 | $this->getDefinition()->setArguments($arguments); 40 | } 41 | 42 | /** 43 | * {@inheritdoc} 44 | */ 45 | protected function loadAspectKernel(InputInterface $input, OutputInterface $output) 46 | { 47 | /* noop */ 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Command/DebugAspectCommand.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * This source file is subject to the license that is bundled 8 | * with this source code in the file LICENSE. 9 | */ 10 | 11 | namespace Go\Symfony\GoAopBundle\Command; 12 | 13 | use Go\Core\AspectKernel; 14 | use Symfony\Component\Console\Input\InputInterface; 15 | use Symfony\Component\Console\Output\OutputInterface; 16 | use Go\Console\Command\DebugAspectCommand as BaseCommand; 17 | 18 | /** 19 | * Class DebugAspectCommand 20 | * 21 | * Console command for querying an information about aspects 22 | * 23 | * @codeCoverageIgnore 24 | */ 25 | class DebugAspectCommand extends BaseCommand 26 | { 27 | public function __construct(AspectKernel $aspectKernel) 28 | { 29 | parent::__construct(null); 30 | $this->aspectKernel = $aspectKernel; 31 | } 32 | 33 | /** 34 | * {@inheritdoc} 35 | */ 36 | protected function configure() 37 | { 38 | parent::configure(); 39 | $arguments = $this->getDefinition()->getArguments(); 40 | unset($arguments['loader']); 41 | $this->getDefinition()->setArguments($arguments); 42 | } 43 | 44 | /** 45 | * {@inheritdoc} 46 | */ 47 | protected function loadAspectKernel(InputInterface $input, OutputInterface $output) 48 | { 49 | /* noop */ 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /DependencyInjection/Compiler/AspectCollectorPass.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * This source file is subject to the license that is bundled 8 | * with this source code in the file LICENSE. 9 | */ 10 | 11 | namespace Go\Symfony\GoAopBundle\DependencyInjection\Compiler; 12 | 13 | use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; 14 | use Symfony\Component\DependencyInjection\ContainerBuilder; 15 | use Symfony\Component\DependencyInjection\Reference; 16 | 17 | /** 18 | * Collects all aspects into the one single parameter 19 | */ 20 | class AspectCollectorPass implements CompilerPassInterface 21 | { 22 | /** 23 | * {@inheritdoc} 24 | */ 25 | public function process(ContainerBuilder $container) 26 | { 27 | if (!$container->hasDefinition('goaop.aspect.container')) { 28 | return; 29 | } 30 | 31 | $aspectIds = $container->findTaggedServiceIds('goaop.aspect'); 32 | $aspectContainer = $container->getDefinition('goaop.aspect.container'); 33 | foreach ($aspectIds as $aspectId => $aspectTags) { 34 | $aspectContainer->addMethodCall('registerAspect', array(new Reference($aspectId))); 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /DependencyInjection/Configuration.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * This source file is subject to the license that is bundled 8 | * with this source code in the file LICENSE. 9 | */ 10 | 11 | namespace Go\Symfony\GoAopBundle\DependencyInjection; 12 | 13 | 14 | use Go\Aop\Features; 15 | use Go\Symfony\GoAopBundle\Kernel\AspectSymfonyKernel; 16 | use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; 17 | use Symfony\Component\Config\Definition\Builder\TreeBuilder; 18 | use Symfony\Component\Config\Definition\ConfigurationInterface; 19 | use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException; 20 | use Symfony\Component\HttpKernel\Kernel; 21 | 22 | class Configuration implements ConfigurationInterface 23 | { 24 | const CONFIGURATION_ROOT_NODE = 'go_aop'; 25 | 26 | /** 27 | * Generates the configuration tree builder. 28 | * 29 | * @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder 30 | */ 31 | public function getConfigTreeBuilder() 32 | { 33 | $treeBuilder = new TreeBuilder(self::CONFIGURATION_ROOT_NODE); 34 | $rootNode = $this->getRootNode($treeBuilder); 35 | $features = (new \ReflectionClass('Go\Aop\Features'))->getConstants(); 36 | 37 | $rootNode 38 | ->children() 39 | ->booleanNode('cache_warmer')->defaultTrue()->end() 40 | ->booleanNode('doctrine_support')->defaultFalse()->end() 41 | ->arrayNode('options') 42 | ->addDefaultsIfNotSet() 43 | ->fixXmlConfig('feature', 'features') 44 | ->fixXmlConfig('include_path', 'include_paths') 45 | ->fixXmlConfig('exclude_path', 'exclude_paths') 46 | ->children() 47 | ->scalarNode('features') 48 | ->beforeNormalization() 49 | ->ifArray() 50 | ->then(function ($v) use ($features) { 51 | $featureMask = 0; 52 | foreach ($v as $featureName) { 53 | $featureName = strtoupper($featureName); 54 | if (!isset($features[$featureName])) { 55 | throw new InvalidConfigurationException("Uknown feature: {$featureName}"); 56 | } 57 | $featureMask |= $features[$featureName]; 58 | } 59 | 60 | return $featureMask; 61 | }) 62 | ->end() 63 | ->defaultValue(0) 64 | ->end() 65 | ->scalarNode('app_dir')->defaultValue('%kernel.root_dir%/../src')->end() 66 | ->scalarNode('cache_dir')->defaultValue('%kernel.cache_dir%/aspect')->end() 67 | ->scalarNode('cache_file_mode')->end() 68 | ->booleanNode('debug')->defaultValue('%kernel.debug%')->end() 69 | ->scalarNode('container_class')->end() 70 | ->arrayNode('include_paths') 71 | ->prototype('scalar')->end() 72 | ->end() 73 | ->arrayNode('exclude_paths') 74 | ->prototype('scalar')->end() 75 | ->end() 76 | ->end() 77 | ->end() 78 | ->end() 79 | ; 80 | 81 | return $treeBuilder; 82 | } 83 | 84 | /** 85 | * @param TreeBuilder $treeBuilder 86 | * 87 | * @return ArrayNodeDefinition 88 | */ 89 | private function getRootNode(TreeBuilder $treeBuilder) 90 | { 91 | if (Kernel::VERSION_ID >= 40200) { 92 | return $treeBuilder->getRootNode(); 93 | } 94 | 95 | return $treeBuilder->root(self::CONFIGURATION_ROOT_NODE); 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /DependencyInjection/GoAopExtension.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * This source file is subject to the license that is bundled 8 | * with this source code in the file LICENSE. 9 | */ 10 | 11 | namespace Go\Symfony\GoAopBundle\DependencyInjection; 12 | 13 | 14 | use Go\Aop\Aspect; 15 | use Symfony\Component\Config\FileLocator; 16 | use Symfony\Component\DependencyInjection\ContainerBuilder; 17 | use Symfony\Component\HttpKernel\DependencyInjection\Extension; 18 | use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; 19 | 20 | class GoAopExtension extends Extension 21 | { 22 | /** 23 | * {@inheritdoc} 24 | */ 25 | public function getNamespace() 26 | { 27 | return 'http://go.aopphp.com/xsd-schema/go-aop-bundle'; 28 | } 29 | 30 | /** 31 | * {@inheritdoc} 32 | */ 33 | public function getXsdValidationBasePath() 34 | { 35 | return __DIR__ . '/../Resources/config/schema'; 36 | } 37 | 38 | /** 39 | * Loads a specific configuration. 40 | * 41 | * @param array $config An array of configuration values 42 | * @param ContainerBuilder $container A ContainerBuilder instance 43 | * 44 | * @throws \InvalidArgumentException When provided tag is not defined in this extension 45 | * 46 | * @api 47 | */ 48 | public function load(array $config, ContainerBuilder $container) 49 | { 50 | $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); 51 | $loader->load('services.xml'); 52 | $loader->load('commands.xml'); 53 | 54 | $configurator = new Configuration(); 55 | $config = $this->processConfiguration($configurator, $config); 56 | 57 | $normalizedOptions = array(); 58 | foreach ($config['options'] as $optionKey => $value) { 59 | // this will convert 'under_scores' into 'underScores' 60 | $optionKey = lcfirst(str_replace(' ', '', ucwords(str_replace('_', ' ', $optionKey)))); 61 | $normalizedOptions[$optionKey] = $value; 62 | } 63 | $container->setParameter('goaop.options', $normalizedOptions); 64 | 65 | if ($config['cache_warmer']) { 66 | $definition = $container->getDefinition('goaop.cache.warmer'); 67 | $definition->addTag('kernel.cache_warmer'); 68 | } 69 | 70 | if ($config['doctrine_support']) { 71 | $container 72 | ->getDefinition('goaop.bridge.doctrine.metadata_load_interceptor') 73 | ->addTag('doctrine.event_subscriber'); 74 | } 75 | 76 | // Service autoconfiguration is available in Symfony 3.3+ 77 | if (method_exists($container, 'registerForAutoconfiguration')) { 78 | $container 79 | ->registerForAutoconfiguration(Aspect::class) 80 | ->addTag('goaop.aspect'); 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /GoAopBundle.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * This source file is subject to the license that is bundled 8 | * with this source code in the file LICENSE. 9 | */ 10 | 11 | namespace Go\Symfony\GoAopBundle; 12 | 13 | 14 | use Go\Instrument\ClassLoading\AopComposerLoader; 15 | use Go\Symfony\GoAopBundle\DependencyInjection\Compiler\AspectCollectorPass; 16 | use Symfony\Component\Debug\DebugClassLoader; 17 | use Symfony\Component\DependencyInjection\ContainerBuilder; 18 | use Symfony\Component\HttpKernel\Bundle\Bundle; 19 | 20 | class GoAopBundle extends Bundle 21 | { 22 | /** 23 | * {@inheritdoc} 24 | */ 25 | public function build(ContainerBuilder $container) 26 | { 27 | $bundles = $container->getParameter('kernel.bundles'); 28 | $firstBundle = key($bundles); 29 | if ($firstBundle !== $this->name) { 30 | $message = "Please move the {$this->name} initialization to the top in your Kernel->init()"; 31 | throw new \InvalidArgumentException($message); 32 | } 33 | 34 | $container->addCompilerPass(new AspectCollectorPass()); 35 | } 36 | 37 | /** 38 | * {@inheritdoc} 39 | */ 40 | public function boot() 41 | { 42 | // it is a quick way to check if loader was enabled 43 | $wasDebugEnabled = class_exists(DebugClassLoader::class, false); 44 | if ($wasDebugEnabled) { 45 | // disable temporary to apply AOP loader first 46 | DebugClassLoader::disable(); 47 | } 48 | $this->container->get('goaop.aspect.container'); 49 | if (!AopComposerLoader::wasInitialized()) { 50 | throw new \RuntimeException("Initialization of AOP loader was failed, probably due to Debug::enable()"); 51 | } 52 | if ($wasDebugEnabled) { 53 | DebugClassLoader::enable(); 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /Kernel/AspectSymfonyKernel.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * This source file is subject to the license that is bundled 8 | * with this source code in the file LICENSE. 9 | */ 10 | 11 | namespace Go\Symfony\GoAopBundle\Kernel; 12 | 13 | use Go\Core\AspectContainer; 14 | use Go\Core\AspectKernel; 15 | use Go\Instrument\ClassLoading\AopComposerLoader; 16 | use Symfony\Component\Debug\DebugClassLoader; 17 | 18 | class AspectSymfonyKernel extends AspectKernel 19 | { 20 | /** 21 | * Configure an AspectContainer with advisors, aspects and pointcuts 22 | * 23 | * @param AspectContainer $container 24 | * 25 | * @return void 26 | */ 27 | protected function configureAop(AspectContainer $container) 28 | { 29 | /* noop */ 30 | } 31 | 32 | /** 33 | * Cache warmer in SF doesn't call Bundle::boot, so we need to duplicate this logic one more time 34 | * 35 | * @inheritDoc 36 | */ 37 | public function init(array $options = []) 38 | { 39 | // it is a quick way to check if loader was enabled 40 | $wasDebugEnabled = class_exists(DebugClassLoader::class, false); 41 | if ($wasDebugEnabled) { 42 | // disable temporary to apply AOP loader first 43 | DebugClassLoader::disable(); 44 | } 45 | parent::init($options); 46 | 47 | if (!AopComposerLoader::wasInitialized()) { 48 | throw new \RuntimeException("Initialization of AOP loader was failed, probably due to Debug::enable()"); 49 | } 50 | if ($wasDebugEnabled) { 51 | DebugClassLoader::enable(); 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | GoAopBundle 2 | ============== 3 | 4 | [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/goaop/goaop-symfony-bundle/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/goaop/goaop-symfony-bundle/?branch=master) 5 | [![Travis branch](https://img.shields.io/travis/goaop/goaop-symfony-bundle/master.svg)](https://travis-ci.org/goaop/goaop-symfony-bundle.svg?branch=master) 6 | [![GitHub release](https://img.shields.io/github/release/goaop/goaop-symfony-bundle.svg)](https://github.com/goaop/goaop-symfony-bundle/releases/latest) 7 | [![Minimum PHP Version](http://img.shields.io/badge/php-%3E%3D%205.5-8892BF.svg)](https://php.net/) 8 | [![License](https://img.shields.io/packagist/l/goaop/goaop-symfony-bundle.svg)](https://packagist.org/packages/goaop/goaop-symfony-bundle) 9 | 10 | The GoAopBundle adds support for Aspect-Oriented Programming via Go! AOP Framework for Symfony2 applications. 11 | **Symfony 3.4 and upper versions are not supported!** Global rewrite of bundle is required to make it working for newer versions of Symfony. 12 | 13 | Overview 14 | -------- 15 | 16 | Aspect-Oriented Paradigm allows to extend the standard Object-Oriented Paradigm with special instruments for effective solving of cross-cutting concerns in your application. This code is typically present everywhere in your application (for example, logging, caching, monitoring, etc) and there is no easy way to fix this without AOP. 17 | 18 | AOP defines new instruments for developers, they are: 19 | 20 | * Joinpoint - place in your code that can be used for interception, for example, execution of single public method or accessing of single object property. 21 | * Pointcut is a list of joinpoints defined with a special regexp-like expression for your source code, for example, all public and protected methods in the concrete class or namespace. 22 | * Advice is an additional callback that will be called before, after or around concrete joinpoint. For PHP each advice is represented as a `\Closure` instance, wrapped into the interceptor object. 23 | * Aspect is a special class that combines pointcuts and advices together, each pointcut is defined as an annotation and each advice is a method inside this aspect. 24 | 25 | You can read more about AOP in different sources, there are good articles for Java language and they can be applied for PHP too, because it's general paradigm. 26 | 27 | Installation 28 | ------------ 29 | 30 | GoAopBundle can be easily installed with composer. Just ask a composer to download the bundle with dependencies by running the command: 31 | 32 | ```bash 33 | $ composer require goaop/goaop-symfony-bundle 34 | ``` 35 | 36 | Versions 1.x are for Symfony >=2.0,<2.7 37 | Versions 2.x(master) are for Symfony >= 2.7 and 3.x 38 | 39 | Then enable the bundle in the kernel: 40 | ```php 41 | // app/AppKernel.php 42 | 43 | public function registerBundles() 44 | { 45 | $bundles = array( 46 | new Go\Symfony\GoAopBundle\GoAopBundle(), 47 | // ... 48 | ); 49 | } 50 | ``` 51 | Make sure that bundle is the first item in this list. This is required for the AOP engine to work correctly. 52 | 53 | Configuration 54 | ------------- 55 | 56 | Configuration for bundle is required for additional tuning of AOP kernel and source code whitelistsing/blacklisting. 57 | 58 | ```yaml 59 | # app/config/config.yml 60 | go_aop: 61 | # This setting enables or disables an automatic AOP cache warming in the application. 62 | # By default, cache_warmer is enabled (true), disable it only if you have serious issues with 63 | # cache warming process. 64 | cache_warmer: true 65 | 66 | # This setting enables or disables workaround for weaving of Doctrine ORM entities. By default, 67 | # it is disabled. If you are using Doctrine ORM and you are using AOP to weave Doctrine entities, 68 | # enable this feature. For details about this known issue, see https://github.com/goaop/framework/issues/327 69 | doctrine_support: false 70 | 71 | # Additional settings for the Go! AOP kernel initialization 72 | options: 73 | # Debug mode for the AOP, enable it for debugging and switch off for production mode to have a 74 | # better runtime performance for your application 75 | debug: %kernel.debug% 76 | 77 | # Application root directory, AOP will be applied ONLY to the files in this directory, by default it's 78 | # src/ directory of your application. 79 | app_dir: "%kernel.root_dir%/../src" 80 | 81 | # AOP cache directory where all transformed files will be stored. 82 | cache_dir: %kernel.cache_dir%/aspect 83 | 84 | # Whitelist is array of directories where AOP should be enabled, leave it empty to process all files 85 | include_paths: [] 86 | 87 | # Exclude list is array of directories where AOP should NOT be enabled, leave it empty to process all files 88 | exclude_paths: [] 89 | 90 | # AOP container class name can be used for extending AOP engine or services adjustment 91 | container_class: ~ 92 | 93 | # List of enabled features for AOP kernel, this allows to enable function interception, support for 94 | # read-only file systems, etc. Each item should be a name of constant from the `Go\Aop\Features` class. 95 | features: [] 96 | 97 | ``` 98 | 99 | XML format is supported for configuration of this bundle as well, for XML format please use provided 100 | [XML schema file](Resources/config/schema/configuration-1.0.0.xsd). 101 | 102 | Defining new aspects 103 | -------------------- 104 | 105 | Aspects are services in the Symfony2 apllications and loaded into the AOP container with the help of compiler pass that collects all services tagged with `goaop.aspect` tag. Here is an example how to implement a logging aspect that will log information about public method invocations in the src/ directory. 106 | 107 | 108 | Definition of aspect class with pointuct and logging advice 109 | ```php 110 | logger = $logger; 132 | } 133 | 134 | /** 135 | * Writes a log info before method execution 136 | * 137 | * @param MethodInvocation $invocation 138 | * @Before("execution(public **->*(*))") 139 | */ 140 | public function beforeMethod(MethodInvocation $invocation) 141 | { 142 | $this->logger->info($invocation, $invocation->getArguments()); 143 | } 144 | } 145 | ``` 146 | 147 | Registration of aspect in the container: 148 | 149 | ```yaml 150 | services: 151 | logging.aspect: 152 | class: App\Aspect\LoggingAspect 153 | arguments: ["@logger"] 154 | tags: 155 | - { name: goaop.aspect } 156 | ``` 157 | 158 | If you're using Symfony 3.3+ with autowired and autoconfigured services, your aspects will be 159 | registered automatically. 160 | 161 | Known issues and workarounds 162 | ---------------------------- 163 | 164 | - By default, it is not possible to weave Doctrine ORM entities without additional configuration 165 | (see [https://github.com/goaop/framework/issues/327](https://github.com/goaop/framework/issues/327)). 166 | However, this bundle delivers workaround that can be easily enabled in configuration (see section 167 | about configuration in text above). Workaround is disabled by default in order to save some performances. 168 | - It is possible to get into circular reference issue when registering an aspect which has dependency on 169 | service that uses weaved class, or depends on service that has weaved class. Currently, detection of 170 | such scenario is not implemented, however, there are two workarounds: 171 | - Instead of injecting weaved service in aspect, you can inject either service container or service 172 | locator (see [https://symfony.com/doc/master/service_container/service_locators.html](https://symfony.com/doc/master/service_container/service_locators.html)). 173 | - Instead of injecting weaved service in aspect, you can define weaved service as "lazy" that will 174 | inject its lazy loading proxy (see [https://symfony.com/doc/current/service_container/lazy_services.html](https://symfony.com/doc/current/service_container/lazy_services.html)). 175 | 176 | 177 | 178 | License 179 | ------- 180 | 181 | This bundle is under the MIT license. See the complete license in the bundle: 182 | 183 | Resources/meta/LICENSE 184 | -------------------------------------------------------------------------------- /Resources/config/commands.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Resources/config/schema/configuration-1.0.0.xsd: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /Resources/config/services.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | %goaop.options% 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | aspect.cache.path.manager 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /Resources/meta/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016 Lisachenko Alexander 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Tests/CacheWarmer/AspectCacheWarmerTest.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * This source file is subject to the license that is bundled 8 | * with this source code in the file LICENSE. 9 | */ 10 | 11 | namespace Go\Symfony\GoAopBundle\Tests\CacheWarmer; 12 | 13 | use Go\Aop\Proxy; 14 | use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; 15 | use Symfony\Component\Filesystem\Filesystem; 16 | use Go\Symfony\GoAopBundle\Tests\TestProject\Application\Main; 17 | 18 | /** 19 | * Class AspectCacheWarmerTest 20 | */ 21 | class AspectCacheWarmerTest extends WebTestCase 22 | { 23 | protected $cacheDir = __DIR__.'/../Fixtures/project/var/cache/test'; 24 | 25 | public function setUp() 26 | { 27 | $filesystem = new Filesystem(); 28 | 29 | if ($filesystem->exists($this->cacheDir)) { 30 | $filesystem->remove($this->cacheDir); 31 | } 32 | } 33 | 34 | /** 35 | * @test 36 | * @runInSeparateProcess 37 | */ 38 | public function itWarmsUpCache() 39 | { 40 | $this->assertFalse(file_exists($this->cacheDir)); 41 | 42 | self::bootKernel(); 43 | 44 | $this->assertTrue(file_exists($this->cacheDir.'/aspect/_proxies/Application/Main.php')); 45 | $this->assertTrue(file_exists($this->cacheDir.'/aspect/Application/Main.php')); 46 | 47 | $reflection = new \ReflectionClass(Main::class); 48 | $this->assertTrue($reflection->implementsInterface(Proxy::class)); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /Tests/Command/CacheWarmupCommandTest.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * This source file is subject to the license that is bundled 8 | * with this source code in the file LICENSE. 9 | */ 10 | 11 | namespace Go\Symfony\GoAopBundle\Tests\Command; 12 | 13 | use PHPUnit\Framework\TestCase; 14 | use Symfony\Component\Filesystem\Filesystem; 15 | use Symfony\Component\Process\Process; 16 | 17 | /** 18 | * Class CacheWarmupCommandTest 19 | */ 20 | class CacheWarmupCommandTest extends TestCase 21 | { 22 | protected $aspectCacheDir = __DIR__.'/../Fixtures/project/var/cache/test/aspect'; 23 | 24 | public function setUp() 25 | { 26 | $filesystem = new Filesystem(); 27 | 28 | if ($filesystem->exists($this->aspectCacheDir)) { 29 | $filesystem->remove($this->aspectCacheDir); 30 | } 31 | } 32 | 33 | /** 34 | * @test 35 | * @runInSeparateProcess 36 | */ 37 | public function itWarmsUpCache() 38 | { 39 | $this->assertFalse(file_exists($this->aspectCacheDir)); 40 | 41 | $process = new Process(sprintf('php %s cache:warmup:aop', realpath(__DIR__.'/../Fixtures/project/bin/console'))); 42 | $process->run(); 43 | 44 | $this->assertTrue($process->isSuccessful(), 'Unable to execute "cache:warmup:aop" command.'); 45 | 46 | $this->assertTrue(file_exists($this->aspectCacheDir.'/_proxies/Application/Main.php')); 47 | $this->assertTrue(file_exists($this->aspectCacheDir.'/Application/Main.php')); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Tests/Command/DebugAdvisorCommandTest.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * This source file is subject to the license that is bundled 8 | * with this source code in the file LICENSE. 9 | */ 10 | 11 | namespace Go\Symfony\GoAopBundle\Tests\Command; 12 | 13 | use PHPUnit\Framework\TestCase; 14 | use Symfony\Component\Process\Process; 15 | 16 | class DebugAdvisorCommandTest extends TestCase 17 | { 18 | public function setUp() 19 | { 20 | $process = new Process(sprintf('php %s cache:warmup:aop', realpath(__DIR__.'/../Fixtures/project/bin/console'))); 21 | $process->run(); 22 | 23 | $this->assertTrue($process->isSuccessful(), 'Unable to execute "cache:warmup:aop" command.'); 24 | } 25 | 26 | /** 27 | * @test 28 | * @runInSeparateProcess 29 | */ 30 | public function itDisplaysAdvisorsDebugInfo() 31 | { 32 | $process = new Process(sprintf('php %s debug:advisor', realpath(__DIR__.'/../Fixtures/project/bin/console'))); 33 | $process->run(); 34 | 35 | $this->assertTrue($process->isSuccessful(), 'Unable to execute "debug:advisor" command.'); 36 | 37 | $output = $process->getOutput(); 38 | 39 | $expected = [ 40 | 'List of registered advisors in the container', 41 | 'Go\Symfony\GoAopBundle\Tests\TestProject\Aspect\LoggingAspect->beforeMethod', 42 | '@execution(Go\Symfony\GoAopBundle\Tests\TestProject\Annotation\Loggable)', 43 | ]; 44 | 45 | foreach ($expected as $string) { 46 | $this->assertContains($string, $output); 47 | } 48 | } 49 | 50 | /** 51 | * @test 52 | * @runInSeparateProcess 53 | */ 54 | public function itDisplaysStatedAdvisorDebugInfo() 55 | { 56 | $process = new Process(sprintf('php %s debug:advisor --advisor="Go\Symfony\GoAopBundle\Tests\TestProject\Aspect\LoggingAspect->beforeMethod"', realpath(__DIR__.'/../Fixtures/project/bin/console'))); 57 | $process->run(); 58 | 59 | $this->assertTrue($process->isSuccessful(), 'Unable to execute "debug:advisor" command.'); 60 | 61 | $output = $process->getOutput(); 62 | 63 | $expected = [ 64 | 'Total 3 files to analyze.', 65 | '-> matching method Go\Symfony\GoAopBundle\Tests\TestProject\Application\Main->doSomething', 66 | ]; 67 | 68 | foreach ($expected as $string) { 69 | $this->assertContains($string, $output); 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /Tests/Command/DebugAspectCommandTest.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * This source file is subject to the license that is bundled 8 | * with this source code in the file LICENSE. 9 | */ 10 | 11 | namespace Go\Symfony\GoAopBundle\Tests\Command; 12 | 13 | use PHPUnit\Framework\TestCase; 14 | use Symfony\Component\Process\Process; 15 | 16 | /** 17 | * Class DebugAspectCommandTest 18 | */ 19 | class DebugAspectCommandTest extends TestCase 20 | { 21 | public function setUp() 22 | { 23 | $process = new Process(sprintf('php %s cache:warmup:aop', realpath(__DIR__.'/../Fixtures/project/bin/console'))); 24 | $process->run(); 25 | 26 | $this->assertTrue($process->isSuccessful(), 'Unable to execute "cache:warmup:aop" command.'); 27 | } 28 | 29 | /** 30 | * @test 31 | * @runInSeparateProcess 32 | */ 33 | public function itDisplaysAspectsDebugInfo() 34 | { 35 | $process = new Process(sprintf('php %s debug:aspect', realpath(__DIR__.'/../Fixtures/project/bin/console'))); 36 | $process->run(); 37 | 38 | $this->assertTrue($process->isSuccessful(), 'Unable to execute "debug:aspect" command.'); 39 | 40 | $output = $process->getOutput(); 41 | 42 | $expected = [ 43 | 'Go\Symfony\GoAopBundle\Kernel\AspectSymfonyKernel has following enabled aspects', 44 | 'Go\Symfony\GoAopBundle\Tests\TestProject\Aspect\LoggingAspect', 45 | 'Go\Symfony\GoAopBundle\Tests\TestProject\Aspect\LoggingAspect->beforeMethod' 46 | ]; 47 | 48 | foreach ($expected as $string) { 49 | $this->assertContains($string, $output); 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /Tests/DependencyInjection/Compiler/AspectCollectorPassTest.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * This source file is subject to the license that is bundled 8 | * with this source code in the file LICENSE. 9 | */ 10 | 11 | namespace Go\Symfony\GoAopBundle\Tests\DependencyInjection\Compiler; 12 | 13 | use Go\Symfony\GoAopBundle\DependencyInjection\Compiler\AspectCollectorPass; 14 | use Matthias\SymfonyDependencyInjectionTest\PhpUnit\AbstractCompilerPassTestCase; 15 | use Symfony\Component\DependencyInjection\ContainerBuilder; 16 | use Symfony\Component\DependencyInjection\Definition; 17 | use Symfony\Component\DependencyInjection\Reference; 18 | 19 | /** 20 | * Class AspectCollectorPassTest 21 | */ 22 | class AspectCollectorPassTest extends AbstractCompilerPassTestCase 23 | { 24 | /** 25 | * @test 26 | */ 27 | public function itRegistersAspects() 28 | { 29 | $this->setDefinition('goaop.aspect.container', new Definition()); 30 | 31 | $someAspect = new Definition(); 32 | $someAspect->addTag('goaop.aspect'); 33 | $this->setDefinition('some_aspect', $someAspect); 34 | 35 | $someOtherAspect = new Definition(); 36 | $someOtherAspect->addTag('goaop.aspect'); 37 | $this->setDefinition('some_other_aspect', $someOtherAspect); 38 | 39 | $this->compile(); 40 | 41 | $this->assertContainerBuilderHasServiceDefinitionWithMethodCall('goaop.aspect.container', 'registerAspect', [new Reference('some_aspect')], 0); 42 | $this->assertContainerBuilderHasServiceDefinitionWithMethodCall('goaop.aspect.container', 'registerAspect', [new Reference('some_other_aspect')], 1); 43 | } 44 | 45 | /** 46 | * {@inheritdoc} 47 | */ 48 | protected function registerCompilerPass(ContainerBuilder $container) 49 | { 50 | $container->addCompilerPass(new AspectCollectorPass()); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /Tests/DependencyInjection/ConfigurationTest.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * This source file is subject to the license that is bundled 8 | * with this source code in the file LICENSE. 9 | */ 10 | 11 | namespace Go\Symfony\GoAopBundle\Tests\DependencyInjection; 12 | 13 | use Go\Symfony\GoAopBundle\DependencyInjection\Configuration; 14 | use Go\Symfony\GoAopBundle\DependencyInjection\GoAopExtension; 15 | use Matthias\SymfonyDependencyInjectionTest\PhpUnit\AbstractExtensionConfigurationTestCase; 16 | 17 | /** 18 | * Class ConfigurationTest 19 | */ 20 | class ConfigurationTest extends AbstractExtensionConfigurationTestCase 21 | { 22 | /** 23 | * @test 24 | */ 25 | public function itHasReasonableDefaults() 26 | { 27 | $expectedConfiguration = [ 28 | 'cache_warmer' => true, 29 | 'doctrine_support' => false, 30 | 'options' => [ 31 | 'features' => 0, 32 | 'app_dir' => '%kernel.root_dir%/../src', 33 | 'cache_dir' => '%kernel.cache_dir%/aspect', 34 | 'debug' => '%kernel.debug%', 35 | 'include_paths' => [], 36 | 'exclude_paths' => [], 37 | ], 38 | ]; 39 | 40 | $sources = [ 41 | __DIR__ . '/../Fixtures/config/empty.xml', 42 | ]; 43 | 44 | $this->assertProcessedConfigurationEquals($expectedConfiguration, $sources); 45 | } 46 | 47 | /** 48 | * @test 49 | */ 50 | public function itCanBeFullyConfiguredViaYml() 51 | { 52 | $expectedConfiguration = [ 53 | 'cache_warmer' => false, 54 | 'doctrine_support' => true, 55 | 'options' => [ 56 | 'debug' => false, 57 | 'features' => 7, 58 | 'app_dir' => '/my/app/dir', 59 | 'cache_dir' => '/my/cache/dir', 60 | 'include_paths' => [ 61 | '/path/to/include', 62 | '/other/path/to/include', 63 | ], 64 | 'exclude_paths' => [ 65 | '/path/to/exclude', 66 | '/other/path/to/exclude', 67 | ], 68 | 'container_class' => 'Container\Class', 69 | ], 70 | ]; 71 | 72 | $sources = [ 73 | __DIR__ . '/../Fixtures/config/full.yml', 74 | ]; 75 | 76 | $this->assertProcessedConfigurationEquals($expectedConfiguration, $sources); 77 | } 78 | 79 | /** 80 | * @test 81 | */ 82 | public function itCanBeFullyConfiguredViaXml() 83 | { 84 | $expectedConfiguration = [ 85 | 'cache_warmer' => false, 86 | 'doctrine_support' => true, 87 | 'options' => [ 88 | 'debug' => false, 89 | 'features' => 7, 90 | 'app_dir' => '/my/app/dir', 91 | 'cache_dir' => '/my/cache/dir', 92 | 'include_paths' => [ 93 | '/path/to/include', 94 | '/other/path/to/include', 95 | ], 96 | 'exclude_paths' => [ 97 | '/path/to/exclude', 98 | '/other/path/to/exclude', 99 | ], 100 | 'container_class' => 'Container\Class', 101 | ], 102 | ]; 103 | 104 | $sources = [ 105 | __DIR__ . '/../Fixtures/config/full.xml', 106 | ]; 107 | 108 | $this->assertProcessedConfigurationEquals($expectedConfiguration, $sources); 109 | } 110 | 111 | /** 112 | * {@inheritdoc} 113 | */ 114 | protected function getContainerExtension() 115 | { 116 | return new GoAopExtension(); 117 | } 118 | 119 | /** 120 | * {@inheritdoc} 121 | */ 122 | protected function getConfiguration() 123 | { 124 | return new Configuration(); 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /Tests/DependencyInjection/GoAopExtensionTest.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * This source file is subject to the license that is bundled 8 | * with this source code in the file LICENSE. 9 | */ 10 | 11 | namespace Go\Symfony\GoAopBundle\Tests\DependencyInjection; 12 | 13 | use Go\Aop\Aspect; 14 | use Go\Symfony\GoAopBundle\DependencyInjection\GoAopExtension; 15 | use Matthias\SymfonyDependencyInjectionTest\PhpUnit\AbstractExtensionTestCase; 16 | 17 | /** 18 | * Class GoAopExtensionTest 19 | */ 20 | class GoAopExtensionTest extends AbstractExtensionTestCase 21 | { 22 | /** 23 | * @test 24 | */ 25 | public function itLoadsServices() 26 | { 27 | $this->load(); 28 | 29 | $expectedServices = [ 30 | 'goaop.aspect.kernel', 31 | 'goaop.aspect.container', 32 | 'goaop.cache.path.manager', 33 | 'goaop.cache.warmer', 34 | 'goaop.command.warmup', 35 | 'goaop.command.debug_advisor', 36 | 'goaop.command.debug_aspect', 37 | 'goaop.bridge.doctrine.metadata_load_interceptor', 38 | ]; 39 | 40 | foreach ($expectedServices as $id) { 41 | $this->assertContainerBuilderHasService($id); 42 | } 43 | 44 | $this->assertEquals(count($expectedServices), count(array_filter($this->container->getDefinitions(), function ($id) { 45 | return 0 === strpos($id, 'goaop.'); 46 | }, ARRAY_FILTER_USE_KEY))); 47 | } 48 | 49 | /** 50 | * @test 51 | */ 52 | public function itNormalizesAndSetsAspectKernelOptions() 53 | { 54 | $this->load(); 55 | 56 | $this->assertEquals([ 57 | 'features' => 0, 58 | 'appDir' => '%kernel.root_dir%/../src', 59 | 'cacheDir' => '%kernel.cache_dir%/aspect', 60 | 'debug' => '%kernel.debug%', 61 | 'includePaths' => [], 62 | 'excludePaths' => [], 63 | ], $this->container->getParameter('goaop.options')); 64 | } 65 | 66 | /** 67 | * @test 68 | */ 69 | public function itDisablesCacheWarmer() 70 | { 71 | $this->load([ 72 | 'cache_warmer' => false, 73 | ]); 74 | 75 | $definition = $this->container->getDefinition('goaop.cache.warmer'); 76 | 77 | $this->assertFalse($definition->hasTag('kernel.cache_warmer')); 78 | } 79 | 80 | /** 81 | * @test 82 | */ 83 | public function itEnablesDoctrineSupport() 84 | { 85 | $this->load([ 86 | 'doctrine_support' => true, 87 | ]); 88 | 89 | $this->assertContainerBuilderHasServiceDefinitionWithTag('goaop.bridge.doctrine.metadata_load_interceptor', 'doctrine.event_subscriber'); 90 | } 91 | 92 | /** 93 | * @test 94 | */ 95 | public function itRegistersAspectInterfaceForAutoconfiguration() 96 | { 97 | if (!method_exists($this->container, 'getAutoconfiguredInstanceof')) { 98 | $this->markTestSkipped('Service autoconfiguration is available in Symfony 3.3+'); 99 | } 100 | 101 | $this->load(); 102 | 103 | $autoconfigure = $this->container->getAutoconfiguredInstanceof(); 104 | 105 | $this->assertTrue($autoconfigure[Aspect::class]->hasTag('goaop.aspect')); 106 | } 107 | 108 | /** 109 | * {@inheritdoc} 110 | */ 111 | protected function getContainerExtensions() 112 | { 113 | return [ 114 | new GoAopExtension(), 115 | ]; 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /Tests/Fixtures/config/empty.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /Tests/Fixtures/config/full.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 14 | false 15 | 16 | true 17 | 18 | 19 | 20 | false 21 | /my/app/dir 22 | /my/cache/dir 23 | 24 | /path/to/include 25 | /other/path/to/include 26 | 27 | /path/to/exclude 28 | /other/path/to/exclude 29 | 30 | Container\Class 31 | 32 | INTERCEPT_FUNCTIONS 33 | INTERCEPT_INCLUDES 34 | INTERCEPT_INITIALIZATIONS 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /Tests/Fixtures/config/full.yml: -------------------------------------------------------------------------------- 1 | go_aop: 2 | cache_warmer: false 3 | doctrine_support: true 4 | options: 5 | debug: false 6 | app_dir: /my/app/dir 7 | cache_dir: /my/cache/dir 8 | include_paths: 9 | - /path/to/include 10 | - /other/path/to/include 11 | exclude_paths: 12 | - /path/to/exclude 13 | - /other/path/to/exclude 14 | container_class: Container\Class 15 | features: 16 | - INTERCEPT_FUNCTIONS 17 | - INTERCEPT_INITIALIZATIONS 18 | - INTERCEPT_INCLUDES -------------------------------------------------------------------------------- /Tests/Fixtures/mock/AopComposerLoader.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * This source file is subject to the license that is bundled 8 | * with this source code in the file LICENSE. 9 | */ 10 | 11 | namespace Go\Instrument\ClassLoading; 12 | 13 | /** 14 | * Class AopComposerLoader 15 | * 16 | * A mock class for testing initialization flow. 17 | */ 18 | class AopComposerLoader 19 | { 20 | public static $initialized = true; 21 | 22 | public static function init() { /* noop */ } 23 | 24 | public static function wasInitialized() 25 | { 26 | return self::$initialized; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Tests/Fixtures/mock/DebugClassLoader.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * This source file is subject to the license that is bundled 8 | * with this source code in the file LICENSE. 9 | */ 10 | 11 | namespace Symfony\Component\Debug; 12 | 13 | /** 14 | * Class DebugClassLoader 15 | * 16 | * A mock class for testing initialization flow. 17 | */ 18 | class DebugClassLoader 19 | { 20 | public static $enabled = false; 21 | public static $invocations = []; 22 | 23 | public static function enable() 24 | { 25 | self::$enabled = true; 26 | self::$invocations[] = 'enable'; 27 | } 28 | 29 | public static function disable() 30 | { 31 | self::$enabled = false; 32 | self::$invocations[] = 'disable'; 33 | } 34 | 35 | public static function reset() 36 | { 37 | self::$enabled = false; 38 | self::$invocations = []; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Tests/Fixtures/project/app/AppKernel.php: -------------------------------------------------------------------------------- 1 | getEnvironment(); 24 | } 25 | 26 | public function getLogDir() 27 | { 28 | return dirname(__DIR__).'/var/logs'; 29 | } 30 | 31 | public function registerContainerConfiguration(LoaderInterface $loader) 32 | { 33 | $loader->load($this->getRootDir().'/config/config.yml'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Tests/Fixtures/project/app/config/config.yml: -------------------------------------------------------------------------------- 1 | framework: 2 | test: ~ 3 | session: 4 | storage_id: session.storage.mock_file 5 | profiler: 6 | collect: false 7 | secret: not_so_secret 8 | default_locale: en 9 | trusted_hosts: ~ 10 | fragments: ~ 11 | http_method_override: true 12 | assets: false 13 | 14 | services: 15 | logger: 16 | class: Psr\Log\NullLogger 17 | 18 | logging.aspect: 19 | class: Go\Symfony\GoAopBundle\Tests\TestProject\Aspect\LoggingAspect 20 | arguments: ["@logger"] 21 | tags: 22 | - { name: goaop.aspect } 23 | -------------------------------------------------------------------------------- /Tests/Fixtures/project/bin/console: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | run($input); 20 | -------------------------------------------------------------------------------- /Tests/Fixtures/project/src/Annotation/Loggable.php: -------------------------------------------------------------------------------- 1 | logger = $logger; 23 | } 24 | 25 | /** 26 | * Writes a log info before method execution 27 | * 28 | * @param MethodInvocation $invocation 29 | * @Before("@execution(Go\Symfony\GoAopBundle\Tests\TestProject\Annotation\Loggable)") 30 | */ 31 | public function beforeMethod(MethodInvocation $invocation) 32 | { 33 | $this->logger->info($invocation, $invocation->getArguments()); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Tests/Fixtures/project/var/cache/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/goaop/goaop-symfony-bundle/76f41a21139b4aac1c618dbfb2369ddab9d7a839/Tests/Fixtures/project/var/cache/.gitkeep -------------------------------------------------------------------------------- /Tests/Fixtures/project/var/logs/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/goaop/goaop-symfony-bundle/76f41a21139b4aac1c618dbfb2369ddab9d7a839/Tests/Fixtures/project/var/logs/.gitkeep -------------------------------------------------------------------------------- /Tests/GoAopBundleTest.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * This source file is subject to the license that is bundled 8 | * with this source code in the file LICENSE. 9 | */ 10 | 11 | namespace Go\Symfony\GoAopBundle\Tests; 12 | 13 | use Go\Instrument\ClassLoading\AopComposerLoader; 14 | use Go\Symfony\GoAopBundle\DependencyInjection\Compiler\AspectCollectorPass; 15 | use Go\Symfony\GoAopBundle\GoAopBundle; 16 | use PHPUnit\Framework\TestCase; 17 | use Symfony\Component\Debug\DebugClassLoader; 18 | use Symfony\Component\DependencyInjection\ContainerBuilder; 19 | use Symfony\Component\DependencyInjection\ContainerInterface; 20 | 21 | /** 22 | * Class GoAopBundleTest 23 | */ 24 | class GoAopBundleTest extends TestCase 25 | { 26 | /** 27 | * @test 28 | * @expectedException \InvalidArgumentException 29 | */ 30 | public function itThrowsExceptionWhenBundleIsNotRegisteredAsFirstBundle() 31 | { 32 | $container = $this->getMockBuilder(ContainerBuilder::class)->getMock(); 33 | 34 | $container 35 | ->method('getParameter') 36 | ->with('kernel.bundles') 37 | ->willReturn(['ArbitraryBundleName' => 'A bundle']); 38 | 39 | $bundle = new GoAopBundle(); 40 | 41 | $bundle->getName(); // invoke resolution of bundle name 42 | 43 | $bundle->build($container); 44 | } 45 | 46 | /** 47 | * @test 48 | */ 49 | public function itRegistersAspectCollectorPassPass() 50 | { 51 | $container = $this->getMockBuilder(ContainerBuilder::class)->getMock(); 52 | 53 | $container 54 | ->method('getParameter') 55 | ->with('kernel.bundles') 56 | ->willReturn(['GoAopBundle' => 'A bundle']); 57 | 58 | $container 59 | ->expects($spy = $this->exactly(1)) 60 | ->method('addCompilerPass'); 61 | 62 | $bundle = new GoAopBundle(); 63 | 64 | $bundle->getName(); // invoke resolution of bundle name 65 | 66 | $bundle->build($container); 67 | 68 | $invocation = $spy->getInvocations()[0]; 69 | $this->assertInstanceOf(AspectCollectorPass::class, $invocation->parameters[0]); 70 | } 71 | 72 | /** 73 | * @test 74 | * @runInSeparateProcess 75 | */ 76 | public function itBoots() 77 | { 78 | require_once __DIR__.'/Fixtures/mock/DebugClassLoader.php'; 79 | require_once __DIR__.'/Fixtures/mock/AopComposerLoader.php'; 80 | 81 | $container = $this->getMockBuilder(ContainerInterface::class)->getMock(); 82 | 83 | $container 84 | ->expects($this->once()) 85 | ->method('get') 86 | ->with('goaop.aspect.container'); 87 | 88 | $bundle = new GoAopBundle(); 89 | $bundle->setContainer($container); 90 | 91 | DebugClassLoader::reset(); 92 | DebugClassLoader::enable(); 93 | $this->assertTrue(DebugClassLoader::$enabled); 94 | 95 | $bundle->boot(); 96 | 97 | $this->assertTrue(DebugClassLoader::$enabled); 98 | $this->assertEquals(['enable', 'disable', 'enable'], DebugClassLoader::$invocations); 99 | } 100 | 101 | /** 102 | * @test 103 | * @runInSeparateProcess 104 | * @expectedException \RuntimeException 105 | * @expectedExceptionMessage Initialization of AOP loader was failed, probably due to Debug::enable() 106 | */ 107 | public function itThrowsExceptionOnBootWithoutAopComposerLoader() 108 | { 109 | require_once __DIR__.'/Fixtures/mock/DebugClassLoader.php'; 110 | require_once __DIR__.'/Fixtures/mock/AopComposerLoader.php'; 111 | 112 | $container = $this->getMockBuilder(ContainerInterface::class)->getMock(); 113 | 114 | $container 115 | ->expects($this->once()) 116 | ->method('get') 117 | ->with('goaop.aspect.container'); 118 | 119 | $bundle = new GoAopBundle(); 120 | $bundle->setContainer($container); 121 | 122 | AopComposerLoader::$initialized = false; 123 | 124 | $bundle->boot(); 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /Tests/Kernel/AspectSymfonyKernelTest.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * This source file is subject to the license that is bundled 8 | * with this source code in the file LICENSE. 9 | */ 10 | 11 | namespace Go\Symfony\GoAopBundle\Tests\Kernel; 12 | 13 | use Go\Instrument\ClassLoading\AopComposerLoader; 14 | use Go\Symfony\GoAopBundle\Kernel\AspectSymfonyKernel; 15 | use PHPUnit\Framework\TestCase; 16 | use Symfony\Component\Debug\DebugClassLoader; 17 | 18 | /** 19 | * Class AspectSymfonyKernelTest 20 | */ 21 | class AspectSymfonyKernelTest extends TestCase 22 | { 23 | /** 24 | * @test 25 | * @runInSeparateProcess 26 | */ 27 | public function itInitializesAspectKernel() 28 | { 29 | require_once __DIR__ . '/../Fixtures/mock/DebugClassLoader.php'; 30 | 31 | DebugClassLoader::reset(); 32 | DebugClassLoader::enable(); 33 | $this->assertTrue(DebugClassLoader::$enabled); 34 | 35 | AspectSymfonyKernel::getInstance()->init([ 36 | 'appDir' => __DIR__, 37 | 'cacheDir' => sys_get_temp_dir(), 38 | ]); 39 | 40 | $this->assertTrue(DebugClassLoader::$enabled); 41 | $this->assertEquals(['enable', 'disable', 'enable'], DebugClassLoader::$invocations); 42 | } 43 | 44 | /** 45 | * @test 46 | * @runInSeparateProcess 47 | * @expectedException \RuntimeException 48 | * @expectedExceptionMessage Initialization of AOP loader was failed, probably due to Debug::enable() 49 | */ 50 | public function itThrowsExceptionWhenIntializationIsImpossible() 51 | { 52 | require_once __DIR__ . '/../Fixtures/mock/DebugClassLoader.php'; 53 | require_once __DIR__ . '/../Fixtures/mock/AopComposerLoader.php'; 54 | 55 | AopComposerLoader::$initialized = false; 56 | 57 | AspectSymfonyKernel::getInstance()->init([ 58 | 'appDir' => __DIR__, 59 | 'cacheDir' => sys_get_temp_dir(), 60 | ]); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "goaop/goaop-symfony-bundle", 3 | "description": "Integration bridge for Go! AOP framework", 4 | "type": "symfony-bundle", 5 | "require": { 6 | "goaop/framework": "^2.1.2", 7 | "symfony/framework-bundle": "^2.6|^3.0|^4.0|^5.0", 8 | "symfony/console": "^2.6|^3.0|^4.0" 9 | }, 10 | "require-dev": { 11 | "phpunit/phpunit": "^5.7", 12 | "symfony/phpunit-bridge": "^3.3.4|^4.0", 13 | "symfony/debug": "^2.7|^3.0|^4.0", 14 | "matthiasnoback/symfony-dependency-injection-test": "^1.1.0", 15 | "doctrine/orm": "^2.5", 16 | "symfony/filesystem": "^2.8|^3.0|^4.0", 17 | "symfony/process": "^3.3|^4.0", 18 | "symfony/expression-language": "^3.3|^4.0", 19 | "roave/security-advisories": "dev-master" 20 | }, 21 | "license": "MIT", 22 | "authors": [ 23 | { 24 | "name": "Lisachenko Alexander", 25 | "email": "lisachenko.it@gmail.com" 26 | } 27 | ], 28 | "autoload": { 29 | "psr-4": { 30 | "Go\\Symfony\\GoAopBundle\\": "./" 31 | }, 32 | "exclude-from-classmap": [ "./Tests/" ] 33 | }, 34 | "autoload-dev": { 35 | "psr-4": { 36 | "": "./Tests/Fixtures/project/app/", 37 | "Go\\Symfony\\GoAopBundle\\Tests\\TestProject\\": "./Tests/Fixtures/project/src/" 38 | } 39 | }, 40 | "extra": { 41 | "branch-alias": { 42 | "dev-master": "2.x-dev" 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "49b5ffc682a405ef19eb0071bff87b0f", 8 | "packages": [ 9 | { 10 | "name": "doctrine/annotations", 11 | "version": "v1.6.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/doctrine/annotations.git", 15 | "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5", 20 | "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "doctrine/lexer": "1.*", 25 | "php": "^7.1" 26 | }, 27 | "require-dev": { 28 | "doctrine/cache": "1.*", 29 | "phpunit/phpunit": "^6.4" 30 | }, 31 | "type": "library", 32 | "extra": { 33 | "branch-alias": { 34 | "dev-master": "1.6.x-dev" 35 | } 36 | }, 37 | "autoload": { 38 | "psr-4": { 39 | "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" 40 | } 41 | }, 42 | "notification-url": "https://packagist.org/downloads/", 43 | "license": [ 44 | "MIT" 45 | ], 46 | "authors": [ 47 | { 48 | "name": "Roman Borschel", 49 | "email": "roman@code-factory.org" 50 | }, 51 | { 52 | "name": "Benjamin Eberlei", 53 | "email": "kontakt@beberlei.de" 54 | }, 55 | { 56 | "name": "Guilherme Blanco", 57 | "email": "guilhermeblanco@gmail.com" 58 | }, 59 | { 60 | "name": "Jonathan Wage", 61 | "email": "jonwage@gmail.com" 62 | }, 63 | { 64 | "name": "Johannes Schmitt", 65 | "email": "schmittjoh@gmail.com" 66 | } 67 | ], 68 | "description": "Docblock Annotations Parser", 69 | "homepage": "http://www.doctrine-project.org", 70 | "keywords": [ 71 | "annotations", 72 | "docblock", 73 | "parser" 74 | ], 75 | "time": "2017-12-06T07:11:42+00:00" 76 | }, 77 | { 78 | "name": "doctrine/lexer", 79 | "version": "v1.0.1", 80 | "source": { 81 | "type": "git", 82 | "url": "https://github.com/doctrine/lexer.git", 83 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" 84 | }, 85 | "dist": { 86 | "type": "zip", 87 | "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", 88 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", 89 | "shasum": "" 90 | }, 91 | "require": { 92 | "php": ">=5.3.2" 93 | }, 94 | "type": "library", 95 | "extra": { 96 | "branch-alias": { 97 | "dev-master": "1.0.x-dev" 98 | } 99 | }, 100 | "autoload": { 101 | "psr-0": { 102 | "Doctrine\\Common\\Lexer\\": "lib/" 103 | } 104 | }, 105 | "notification-url": "https://packagist.org/downloads/", 106 | "license": [ 107 | "MIT" 108 | ], 109 | "authors": [ 110 | { 111 | "name": "Roman Borschel", 112 | "email": "roman@code-factory.org" 113 | }, 114 | { 115 | "name": "Guilherme Blanco", 116 | "email": "guilhermeblanco@gmail.com" 117 | }, 118 | { 119 | "name": "Johannes Schmitt", 120 | "email": "schmittjoh@gmail.com" 121 | } 122 | ], 123 | "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", 124 | "homepage": "http://www.doctrine-project.org", 125 | "keywords": [ 126 | "lexer", 127 | "parser" 128 | ], 129 | "time": "2014-09-09T13:34:57+00:00" 130 | }, 131 | { 132 | "name": "goaop/framework", 133 | "version": "2.1.2", 134 | "source": { 135 | "type": "git", 136 | "url": "https://github.com/goaop/framework.git", 137 | "reference": "6e2a0fe13c1943db02a67588cfd27692bddaffa5" 138 | }, 139 | "dist": { 140 | "type": "zip", 141 | "url": "https://api.github.com/repos/goaop/framework/zipball/6e2a0fe13c1943db02a67588cfd27692bddaffa5", 142 | "reference": "6e2a0fe13c1943db02a67588cfd27692bddaffa5", 143 | "shasum": "" 144 | }, 145 | "require": { 146 | "doctrine/annotations": "~1.0", 147 | "goaop/parser-reflection": "~1.2", 148 | "jakubledl/dissect": "~1.0", 149 | "php": ">=5.6.0" 150 | }, 151 | "require-dev": { 152 | "adlawson/vfs": "^0.12", 153 | "doctrine/orm": "^2.5", 154 | "phpunit/phpunit": "^4.8", 155 | "symfony/console": "^2.7|^3.0" 156 | }, 157 | "suggest": { 158 | "symfony/console": "Enables the usage of the command-line tool." 159 | }, 160 | "bin": [ 161 | "bin/aspect" 162 | ], 163 | "type": "library", 164 | "extra": { 165 | "branch-alias": { 166 | "dev-master": "2.0-dev" 167 | } 168 | }, 169 | "autoload": { 170 | "psr-4": { 171 | "Go\\": "src/" 172 | } 173 | }, 174 | "notification-url": "https://packagist.org/downloads/", 175 | "license": [ 176 | "MIT" 177 | ], 178 | "authors": [ 179 | { 180 | "name": "Lisachenko Alexander", 181 | "homepage": "https://github.com/lisachenko" 182 | } 183 | ], 184 | "description": "Framework for aspect-oriented programming in PHP.", 185 | "homepage": "http://go.aopphp.com/", 186 | "keywords": [ 187 | "aop", 188 | "aspect", 189 | "library", 190 | "php" 191 | ], 192 | "time": "2017-07-12T11:46:25+00:00" 193 | }, 194 | { 195 | "name": "goaop/parser-reflection", 196 | "version": "1.4.0", 197 | "source": { 198 | "type": "git", 199 | "url": "https://github.com/goaop/parser-reflection.git", 200 | "reference": "adfc38fee63014880932ebcc4810871b8e33edc9" 201 | }, 202 | "dist": { 203 | "type": "zip", 204 | "url": "https://api.github.com/repos/goaop/parser-reflection/zipball/adfc38fee63014880932ebcc4810871b8e33edc9", 205 | "reference": "adfc38fee63014880932ebcc4810871b8e33edc9", 206 | "shasum": "" 207 | }, 208 | "require": { 209 | "nikic/php-parser": "^1.2|^2.0|^3.0", 210 | "php": ">=5.6.0" 211 | }, 212 | "require-dev": { 213 | "phpunit/phpunit": "~4.0" 214 | }, 215 | "type": "library", 216 | "extra": { 217 | "branch-alias": { 218 | "dev-master": "1.x-dev" 219 | } 220 | }, 221 | "autoload": { 222 | "psr-4": { 223 | "Go\\ParserReflection\\": "src" 224 | }, 225 | "files": [ 226 | "src/bootstrap.php" 227 | ], 228 | "exclude-from-classmap": [ 229 | "/tests/" 230 | ] 231 | }, 232 | "notification-url": "https://packagist.org/downloads/", 233 | "license": [ 234 | "MIT" 235 | ], 236 | "authors": [ 237 | { 238 | "name": "Alexander Lisachenko", 239 | "email": "lisachenko.it@gmail.com" 240 | } 241 | ], 242 | "description": "Provides reflection information, based on raw source", 243 | "time": "2017-09-03T14:59:13+00:00" 244 | }, 245 | { 246 | "name": "jakubledl/dissect", 247 | "version": "v1.0.1", 248 | "source": { 249 | "type": "git", 250 | "url": "https://github.com/jakubledl/dissect.git", 251 | "reference": "d3a391de31e45a247e95cef6cf58a91c05af67c4" 252 | }, 253 | "dist": { 254 | "type": "zip", 255 | "url": "https://api.github.com/repos/jakubledl/dissect/zipball/d3a391de31e45a247e95cef6cf58a91c05af67c4", 256 | "reference": "d3a391de31e45a247e95cef6cf58a91c05af67c4", 257 | "shasum": "" 258 | }, 259 | "require": { 260 | "php": ">=5.3.3" 261 | }, 262 | "require-dev": { 263 | "symfony/console": "~2.1" 264 | }, 265 | "suggest": { 266 | "symfony/console": "for the command-line tool" 267 | }, 268 | "bin": [ 269 | "bin/dissect.php", 270 | "bin/dissect" 271 | ], 272 | "type": "library", 273 | "autoload": { 274 | "psr-0": { 275 | "Dissect": [ 276 | "src/" 277 | ] 278 | } 279 | }, 280 | "notification-url": "https://packagist.org/downloads/", 281 | "license": [ 282 | "unlicense" 283 | ], 284 | "authors": [ 285 | { 286 | "name": "Jakub Lédl", 287 | "email": "jakubledl@gmail.com" 288 | } 289 | ], 290 | "description": "Lexing and parsing in pure PHP", 291 | "homepage": "https://github.com/jakubledl/dissect", 292 | "keywords": [ 293 | "ast", 294 | "lexing", 295 | "parser", 296 | "parsing" 297 | ], 298 | "time": "2013-01-29T21:29:14+00:00" 299 | }, 300 | { 301 | "name": "nikic/php-parser", 302 | "version": "v3.1.2", 303 | "source": { 304 | "type": "git", 305 | "url": "https://github.com/nikic/PHP-Parser.git", 306 | "reference": "08131e7ff29de6bb9f12275c7d35df71f25f4d89" 307 | }, 308 | "dist": { 309 | "type": "zip", 310 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/08131e7ff29de6bb9f12275c7d35df71f25f4d89", 311 | "reference": "08131e7ff29de6bb9f12275c7d35df71f25f4d89", 312 | "shasum": "" 313 | }, 314 | "require": { 315 | "ext-tokenizer": "*", 316 | "php": ">=5.5" 317 | }, 318 | "require-dev": { 319 | "phpunit/phpunit": "~4.0|~5.0" 320 | }, 321 | "bin": [ 322 | "bin/php-parse" 323 | ], 324 | "type": "library", 325 | "extra": { 326 | "branch-alias": { 327 | "dev-master": "3.0-dev" 328 | } 329 | }, 330 | "autoload": { 331 | "psr-4": { 332 | "PhpParser\\": "lib/PhpParser" 333 | } 334 | }, 335 | "notification-url": "https://packagist.org/downloads/", 336 | "license": [ 337 | "BSD-3-Clause" 338 | ], 339 | "authors": [ 340 | { 341 | "name": "Nikita Popov" 342 | } 343 | ], 344 | "description": "A PHP parser written in PHP", 345 | "keywords": [ 346 | "parser", 347 | "php" 348 | ], 349 | "time": "2017-11-04T11:48:34+00:00" 350 | }, 351 | { 352 | "name": "psr/cache", 353 | "version": "1.0.1", 354 | "source": { 355 | "type": "git", 356 | "url": "https://github.com/php-fig/cache.git", 357 | "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" 358 | }, 359 | "dist": { 360 | "type": "zip", 361 | "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", 362 | "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", 363 | "shasum": "" 364 | }, 365 | "require": { 366 | "php": ">=5.3.0" 367 | }, 368 | "type": "library", 369 | "extra": { 370 | "branch-alias": { 371 | "dev-master": "1.0.x-dev" 372 | } 373 | }, 374 | "autoload": { 375 | "psr-4": { 376 | "Psr\\Cache\\": "src/" 377 | } 378 | }, 379 | "notification-url": "https://packagist.org/downloads/", 380 | "license": [ 381 | "MIT" 382 | ], 383 | "authors": [ 384 | { 385 | "name": "PHP-FIG", 386 | "homepage": "http://www.php-fig.org/" 387 | } 388 | ], 389 | "description": "Common interface for caching libraries", 390 | "keywords": [ 391 | "cache", 392 | "psr", 393 | "psr-6" 394 | ], 395 | "time": "2016-08-06T20:24:11+00:00" 396 | }, 397 | { 398 | "name": "psr/container", 399 | "version": "1.0.0", 400 | "source": { 401 | "type": "git", 402 | "url": "https://github.com/php-fig/container.git", 403 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" 404 | }, 405 | "dist": { 406 | "type": "zip", 407 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 408 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 409 | "shasum": "" 410 | }, 411 | "require": { 412 | "php": ">=5.3.0" 413 | }, 414 | "type": "library", 415 | "extra": { 416 | "branch-alias": { 417 | "dev-master": "1.0.x-dev" 418 | } 419 | }, 420 | "autoload": { 421 | "psr-4": { 422 | "Psr\\Container\\": "src/" 423 | } 424 | }, 425 | "notification-url": "https://packagist.org/downloads/", 426 | "license": [ 427 | "MIT" 428 | ], 429 | "authors": [ 430 | { 431 | "name": "PHP-FIG", 432 | "homepage": "http://www.php-fig.org/" 433 | } 434 | ], 435 | "description": "Common Container Interface (PHP FIG PSR-11)", 436 | "homepage": "https://github.com/php-fig/container", 437 | "keywords": [ 438 | "PSR-11", 439 | "container", 440 | "container-interface", 441 | "container-interop", 442 | "psr" 443 | ], 444 | "time": "2017-02-14T16:28:37+00:00" 445 | }, 446 | { 447 | "name": "psr/log", 448 | "version": "1.0.2", 449 | "source": { 450 | "type": "git", 451 | "url": "https://github.com/php-fig/log.git", 452 | "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" 453 | }, 454 | "dist": { 455 | "type": "zip", 456 | "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", 457 | "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", 458 | "shasum": "" 459 | }, 460 | "require": { 461 | "php": ">=5.3.0" 462 | }, 463 | "type": "library", 464 | "extra": { 465 | "branch-alias": { 466 | "dev-master": "1.0.x-dev" 467 | } 468 | }, 469 | "autoload": { 470 | "psr-4": { 471 | "Psr\\Log\\": "Psr/Log/" 472 | } 473 | }, 474 | "notification-url": "https://packagist.org/downloads/", 475 | "license": [ 476 | "MIT" 477 | ], 478 | "authors": [ 479 | { 480 | "name": "PHP-FIG", 481 | "homepage": "http://www.php-fig.org/" 482 | } 483 | ], 484 | "description": "Common interface for logging libraries", 485 | "homepage": "https://github.com/php-fig/log", 486 | "keywords": [ 487 | "log", 488 | "psr", 489 | "psr-3" 490 | ], 491 | "time": "2016-10-10T12:19:37+00:00" 492 | }, 493 | { 494 | "name": "psr/simple-cache", 495 | "version": "1.0.0", 496 | "source": { 497 | "type": "git", 498 | "url": "https://github.com/php-fig/simple-cache.git", 499 | "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24" 500 | }, 501 | "dist": { 502 | "type": "zip", 503 | "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/753fa598e8f3b9966c886fe13f370baa45ef0e24", 504 | "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24", 505 | "shasum": "" 506 | }, 507 | "require": { 508 | "php": ">=5.3.0" 509 | }, 510 | "type": "library", 511 | "extra": { 512 | "branch-alias": { 513 | "dev-master": "1.0.x-dev" 514 | } 515 | }, 516 | "autoload": { 517 | "psr-4": { 518 | "Psr\\SimpleCache\\": "src/" 519 | } 520 | }, 521 | "notification-url": "https://packagist.org/downloads/", 522 | "license": [ 523 | "MIT" 524 | ], 525 | "authors": [ 526 | { 527 | "name": "PHP-FIG", 528 | "homepage": "http://www.php-fig.org/" 529 | } 530 | ], 531 | "description": "Common interfaces for simple caching", 532 | "keywords": [ 533 | "cache", 534 | "caching", 535 | "psr", 536 | "psr-16", 537 | "simple-cache" 538 | ], 539 | "time": "2017-01-02T13:31:39+00:00" 540 | }, 541 | { 542 | "name": "roave/security-advisories", 543 | "version": "dev-master", 544 | "source": { 545 | "type": "git", 546 | "url": "https://github.com/Roave/SecurityAdvisories.git", 547 | "reference": "40b035345ed34a4cc92c842f60a6cc739101542f" 548 | }, 549 | "dist": { 550 | "type": "zip", 551 | "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/40b035345ed34a4cc92c842f60a6cc739101542f", 552 | "reference": "40b035345ed34a4cc92c842f60a6cc739101542f", 553 | "shasum": "" 554 | }, 555 | "conflict": { 556 | "adodb/adodb-php": "<5.20.6", 557 | "amphp/artax": "<1.0.6|>=2,<2.0.6", 558 | "aws/aws-sdk-php": ">=3,<3.2.1", 559 | "bugsnag/bugsnag-laravel": ">=2,<2.0.2", 560 | "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.0.15|>=3.1,<3.1.4", 561 | "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", 562 | "cartalyst/sentry": "<=2.1.6", 563 | "codeigniter/framework": "<=3.0.6", 564 | "composer/composer": "<=1.0.0-alpha11", 565 | "contao-components/mediaelement": ">=2.14.2,<2.21.1", 566 | "contao/core": ">=2,<3.5.31", 567 | "contao/core-bundle": ">=4,<4.4.8", 568 | "contao/listing-bundle": ">=4,<4.4.8", 569 | "doctrine/annotations": ">=1,<1.2.7", 570 | "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", 571 | "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", 572 | "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", 573 | "doctrine/doctrine-bundle": "<1.5.2", 574 | "doctrine/doctrine-module": "<=0.7.1", 575 | "doctrine/mongodb-odm": ">=1,<1.0.2", 576 | "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", 577 | "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", 578 | "dompdf/dompdf": ">=0.6,<0.6.2", 579 | "drupal/core": ">=8,<8.3.7", 580 | "drupal/drupal": ">=8,<8.3.7", 581 | "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.2|>=5.4,<5.4.10.1|>=2017.8,<2017.8.1.1", 582 | "firebase/php-jwt": "<2", 583 | "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", 584 | "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", 585 | "gree/jose": "<=2.2", 586 | "gregwar/rst": "<1.0.3", 587 | "guzzlehttp/guzzle": ">=6,<6.2.1|>=4.0.0-rc2,<4.2.4|>=5,<5.3.1", 588 | "illuminate/auth": ">=4,<4.0.99|>=4.1,<4.1.26", 589 | "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29", 590 | "joomla/session": "<1.3.1", 591 | "laravel/framework": ">=4,<4.0.99|>=4.1,<4.1.29", 592 | "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", 593 | "magento/magento1ce": ">=1.5.0.1,<1.9.3.2", 594 | "magento/magento1ee": ">=1.9,<1.14.3.2", 595 | "magento/magento2ce": ">=2,<2.2", 596 | "monolog/monolog": ">=1.8,<1.12", 597 | "namshi/jose": "<2.2", 598 | "onelogin/php-saml": "<2.10.4", 599 | "oro/crm": ">=1.7,<1.7.4", 600 | "oro/platform": ">=1.7,<1.7.4", 601 | "phpmailer/phpmailer": ">=5,<5.2.24", 602 | "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", 603 | "phpxmlrpc/extras": "<6.0.1", 604 | "pusher/pusher-php-server": "<2.2.1", 605 | "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", 606 | "shopware/shopware": "<5.2.25", 607 | "silverstripe/cms": ">=3,<=3.0.11|>=3.1,<3.1.11", 608 | "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", 609 | "silverstripe/framework": ">=3,<3.3", 610 | "silverstripe/userforms": "<3", 611 | "simplesamlphp/saml2": "<1.8.1|>=1.9,<1.9.1|>=1.10,<1.10.3|>=2,<2.3.3", 612 | "simplesamlphp/simplesamlphp": "<1.14.16", 613 | "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", 614 | "socalnick/scn-social-auth": "<1.15.2", 615 | "squizlabs/php_codesniffer": ">=1,<2.8.1", 616 | "swiftmailer/swiftmailer": ">=4,<5.4.5", 617 | "symfony/dependency-injection": ">=2,<2.0.17", 618 | "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", 619 | "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2", 620 | "symfony/http-foundation": ">=2,<2.3.27|>=2.4,<2.5.11|>=2.6,<2.6.6", 621 | "symfony/http-kernel": ">=2,<2.3.29|>=2.4,<2.5.12|>=2.6,<2.6.8", 622 | "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", 623 | "symfony/routing": ">=2,<2.0.19", 624 | "symfony/security": ">=2,<2.0.25|>=2.1,<2.1.13|>=2.2,<2.2.9|>=2.3,<2.3.37|>=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8.23,<2.8.25|>=3.2.10,<3.2.12|>=3.3.3,<3.3.5", 625 | "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.6|>=2.8.23,<2.8.25|>=3,<3.0.6|>=3.2.10,<3.2.12|>=3.3.3,<3.3.5", 626 | "symfony/security-csrf": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", 627 | "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", 628 | "symfony/serializer": ">=2,<2.0.11", 629 | "symfony/symfony": ">=2,<2.3.41|>=2.4,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", 630 | "symfony/translation": ">=2,<2.0.17", 631 | "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", 632 | "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", 633 | "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", 634 | "thelia/backoffice-default-template": ">=2.1,<2.1.2", 635 | "thelia/thelia": ">=2.1,<2.1.2|>=2.1.0-beta1,<2.1.3", 636 | "twig/twig": "<1.20", 637 | "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.22|>=8,<8.7.5", 638 | "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", 639 | "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", 640 | "willdurand/js-translation-bundle": "<2.1.1", 641 | "yiisoft/yii": ">=1.1.14,<1.1.15", 642 | "yiisoft/yii2": "<2.0.5", 643 | "yiisoft/yii2-bootstrap": "<2.0.4", 644 | "yiisoft/yii2-dev": "<2.0.4", 645 | "yiisoft/yii2-gii": "<2.0.4", 646 | "yiisoft/yii2-jui": "<2.0.4", 647 | "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", 648 | "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", 649 | "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", 650 | "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", 651 | "zendframework/zend-diactoros": ">=1,<1.0.4", 652 | "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", 653 | "zendframework/zend-http": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.3,<2.3.8|>=2.4,<2.4.1", 654 | "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", 655 | "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", 656 | "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", 657 | "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", 658 | "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", 659 | "zendframework/zend-validator": ">=2.3,<2.3.6", 660 | "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", 661 | "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", 662 | "zendframework/zendframework": ">=2,<2.4.11|>=2.5,<2.5.1", 663 | "zendframework/zendframework1": "<1.12.20", 664 | "zendframework/zendopenid": ">=2,<2.0.2", 665 | "zendframework/zendxml": ">=1,<1.0.1", 666 | "zetacomponents/mail": "<1.8.2", 667 | "zf-commons/zfc-user": "<1.2.2", 668 | "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", 669 | "zfr/zfr-oauth2-server-module": "<0.1.2" 670 | }, 671 | "type": "metapackage", 672 | "notification-url": "https://packagist.org/downloads/", 673 | "license": [ 674 | "MIT" 675 | ], 676 | "authors": [ 677 | { 678 | "name": "Marco Pivetta", 679 | "email": "ocramius@gmail.com", 680 | "role": "maintainer" 681 | } 682 | ], 683 | "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", 684 | "time": "2017-12-12T00:38:43+00:00" 685 | }, 686 | { 687 | "name": "symfony/cache", 688 | "version": "v4.0.2", 689 | "source": { 690 | "type": "git", 691 | "url": "https://github.com/symfony/cache.git", 692 | "reference": "d00351f230ca037ca13f6fec3411e002043f7421" 693 | }, 694 | "dist": { 695 | "type": "zip", 696 | "url": "https://api.github.com/repos/symfony/cache/zipball/d00351f230ca037ca13f6fec3411e002043f7421", 697 | "reference": "d00351f230ca037ca13f6fec3411e002043f7421", 698 | "shasum": "" 699 | }, 700 | "require": { 701 | "php": "^7.1.3", 702 | "psr/cache": "~1.0", 703 | "psr/log": "~1.0", 704 | "psr/simple-cache": "^1.0" 705 | }, 706 | "conflict": { 707 | "symfony/var-dumper": "<3.4" 708 | }, 709 | "provide": { 710 | "psr/cache-implementation": "1.0", 711 | "psr/simple-cache-implementation": "1.0" 712 | }, 713 | "require-dev": { 714 | "cache/integration-tests": "dev-master", 715 | "doctrine/cache": "~1.6", 716 | "doctrine/dbal": "~2.4", 717 | "predis/predis": "~1.0" 718 | }, 719 | "type": "library", 720 | "extra": { 721 | "branch-alias": { 722 | "dev-master": "4.0-dev" 723 | } 724 | }, 725 | "autoload": { 726 | "psr-4": { 727 | "Symfony\\Component\\Cache\\": "" 728 | }, 729 | "exclude-from-classmap": [ 730 | "/Tests/" 731 | ] 732 | }, 733 | "notification-url": "https://packagist.org/downloads/", 734 | "license": [ 735 | "MIT" 736 | ], 737 | "authors": [ 738 | { 739 | "name": "Nicolas Grekas", 740 | "email": "p@tchwork.com" 741 | }, 742 | { 743 | "name": "Symfony Community", 744 | "homepage": "https://symfony.com/contributors" 745 | } 746 | ], 747 | "description": "Symfony Cache component with PSR-6, PSR-16, and tags", 748 | "homepage": "https://symfony.com", 749 | "keywords": [ 750 | "caching", 751 | "psr6" 752 | ], 753 | "time": "2017-12-08T16:11:45+00:00" 754 | }, 755 | { 756 | "name": "symfony/config", 757 | "version": "v4.0.2", 758 | "source": { 759 | "type": "git", 760 | "url": "https://github.com/symfony/config.git", 761 | "reference": "0356e6d5298e9e72212c0bad65c2f1b49e42d622" 762 | }, 763 | "dist": { 764 | "type": "zip", 765 | "url": "https://api.github.com/repos/symfony/config/zipball/0356e6d5298e9e72212c0bad65c2f1b49e42d622", 766 | "reference": "0356e6d5298e9e72212c0bad65c2f1b49e42d622", 767 | "shasum": "" 768 | }, 769 | "require": { 770 | "php": "^7.1.3", 771 | "symfony/filesystem": "~3.4|~4.0" 772 | }, 773 | "conflict": { 774 | "symfony/finder": "<3.4" 775 | }, 776 | "require-dev": { 777 | "symfony/finder": "~3.4|~4.0", 778 | "symfony/yaml": "~3.4|~4.0" 779 | }, 780 | "suggest": { 781 | "symfony/yaml": "To use the yaml reference dumper" 782 | }, 783 | "type": "library", 784 | "extra": { 785 | "branch-alias": { 786 | "dev-master": "4.0-dev" 787 | } 788 | }, 789 | "autoload": { 790 | "psr-4": { 791 | "Symfony\\Component\\Config\\": "" 792 | }, 793 | "exclude-from-classmap": [ 794 | "/Tests/" 795 | ] 796 | }, 797 | "notification-url": "https://packagist.org/downloads/", 798 | "license": [ 799 | "MIT" 800 | ], 801 | "authors": [ 802 | { 803 | "name": "Fabien Potencier", 804 | "email": "fabien@symfony.com" 805 | }, 806 | { 807 | "name": "Symfony Community", 808 | "homepage": "https://symfony.com/contributors" 809 | } 810 | ], 811 | "description": "Symfony Config Component", 812 | "homepage": "https://symfony.com", 813 | "time": "2017-12-14T19:48:22+00:00" 814 | }, 815 | { 816 | "name": "symfony/console", 817 | "version": "v4.0.2", 818 | "source": { 819 | "type": "git", 820 | "url": "https://github.com/symfony/console.git", 821 | "reference": "de8cf039eacdec59d83f7def67e3b8ff5ed46714" 822 | }, 823 | "dist": { 824 | "type": "zip", 825 | "url": "https://api.github.com/repos/symfony/console/zipball/de8cf039eacdec59d83f7def67e3b8ff5ed46714", 826 | "reference": "de8cf039eacdec59d83f7def67e3b8ff5ed46714", 827 | "shasum": "" 828 | }, 829 | "require": { 830 | "php": "^7.1.3", 831 | "symfony/polyfill-mbstring": "~1.0" 832 | }, 833 | "conflict": { 834 | "symfony/dependency-injection": "<3.4", 835 | "symfony/process": "<3.3" 836 | }, 837 | "require-dev": { 838 | "psr/log": "~1.0", 839 | "symfony/config": "~3.4|~4.0", 840 | "symfony/dependency-injection": "~3.4|~4.0", 841 | "symfony/event-dispatcher": "~3.4|~4.0", 842 | "symfony/lock": "~3.4|~4.0", 843 | "symfony/process": "~3.4|~4.0" 844 | }, 845 | "suggest": { 846 | "psr/log": "For using the console logger", 847 | "symfony/event-dispatcher": "", 848 | "symfony/lock": "", 849 | "symfony/process": "" 850 | }, 851 | "type": "library", 852 | "extra": { 853 | "branch-alias": { 854 | "dev-master": "4.0-dev" 855 | } 856 | }, 857 | "autoload": { 858 | "psr-4": { 859 | "Symfony\\Component\\Console\\": "" 860 | }, 861 | "exclude-from-classmap": [ 862 | "/Tests/" 863 | ] 864 | }, 865 | "notification-url": "https://packagist.org/downloads/", 866 | "license": [ 867 | "MIT" 868 | ], 869 | "authors": [ 870 | { 871 | "name": "Fabien Potencier", 872 | "email": "fabien@symfony.com" 873 | }, 874 | { 875 | "name": "Symfony Community", 876 | "homepage": "https://symfony.com/contributors" 877 | } 878 | ], 879 | "description": "Symfony Console Component", 880 | "homepage": "https://symfony.com", 881 | "time": "2017-12-14T19:48:22+00:00" 882 | }, 883 | { 884 | "name": "symfony/debug", 885 | "version": "v4.0.2", 886 | "source": { 887 | "type": "git", 888 | "url": "https://github.com/symfony/debug.git", 889 | "reference": "8c3e709209ce3b952a31c0f4a31ac7703c3d0226" 890 | }, 891 | "dist": { 892 | "type": "zip", 893 | "url": "https://api.github.com/repos/symfony/debug/zipball/8c3e709209ce3b952a31c0f4a31ac7703c3d0226", 894 | "reference": "8c3e709209ce3b952a31c0f4a31ac7703c3d0226", 895 | "shasum": "" 896 | }, 897 | "require": { 898 | "php": "^7.1.3", 899 | "psr/log": "~1.0" 900 | }, 901 | "conflict": { 902 | "symfony/http-kernel": "<3.4" 903 | }, 904 | "require-dev": { 905 | "symfony/http-kernel": "~3.4|~4.0" 906 | }, 907 | "type": "library", 908 | "extra": { 909 | "branch-alias": { 910 | "dev-master": "4.0-dev" 911 | } 912 | }, 913 | "autoload": { 914 | "psr-4": { 915 | "Symfony\\Component\\Debug\\": "" 916 | }, 917 | "exclude-from-classmap": [ 918 | "/Tests/" 919 | ] 920 | }, 921 | "notification-url": "https://packagist.org/downloads/", 922 | "license": [ 923 | "MIT" 924 | ], 925 | "authors": [ 926 | { 927 | "name": "Fabien Potencier", 928 | "email": "fabien@symfony.com" 929 | }, 930 | { 931 | "name": "Symfony Community", 932 | "homepage": "https://symfony.com/contributors" 933 | } 934 | ], 935 | "description": "Symfony Debug Component", 936 | "homepage": "https://symfony.com", 937 | "time": "2017-12-12T08:41:51+00:00" 938 | }, 939 | { 940 | "name": "symfony/dependency-injection", 941 | "version": "v4.0.2", 942 | "source": { 943 | "type": "git", 944 | "url": "https://github.com/symfony/dependency-injection.git", 945 | "reference": "d2fa088b5fd7d429974a36bf1a9846b912d9d124" 946 | }, 947 | "dist": { 948 | "type": "zip", 949 | "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/d2fa088b5fd7d429974a36bf1a9846b912d9d124", 950 | "reference": "d2fa088b5fd7d429974a36bf1a9846b912d9d124", 951 | "shasum": "" 952 | }, 953 | "require": { 954 | "php": "^7.1.3", 955 | "psr/container": "^1.0" 956 | }, 957 | "conflict": { 958 | "symfony/config": "<3.4", 959 | "symfony/finder": "<3.4", 960 | "symfony/proxy-manager-bridge": "<3.4", 961 | "symfony/yaml": "<3.4" 962 | }, 963 | "provide": { 964 | "psr/container-implementation": "1.0" 965 | }, 966 | "require-dev": { 967 | "symfony/config": "~3.4|~4.0", 968 | "symfony/expression-language": "~3.4|~4.0", 969 | "symfony/yaml": "~3.4|~4.0" 970 | }, 971 | "suggest": { 972 | "symfony/config": "", 973 | "symfony/expression-language": "For using expressions in service container configuration", 974 | "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", 975 | "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", 976 | "symfony/yaml": "" 977 | }, 978 | "type": "library", 979 | "extra": { 980 | "branch-alias": { 981 | "dev-master": "4.0-dev" 982 | } 983 | }, 984 | "autoload": { 985 | "psr-4": { 986 | "Symfony\\Component\\DependencyInjection\\": "" 987 | }, 988 | "exclude-from-classmap": [ 989 | "/Tests/" 990 | ] 991 | }, 992 | "notification-url": "https://packagist.org/downloads/", 993 | "license": [ 994 | "MIT" 995 | ], 996 | "authors": [ 997 | { 998 | "name": "Fabien Potencier", 999 | "email": "fabien@symfony.com" 1000 | }, 1001 | { 1002 | "name": "Symfony Community", 1003 | "homepage": "https://symfony.com/contributors" 1004 | } 1005 | ], 1006 | "description": "Symfony DependencyInjection Component", 1007 | "homepage": "https://symfony.com", 1008 | "time": "2017-12-14T19:48:22+00:00" 1009 | }, 1010 | { 1011 | "name": "symfony/event-dispatcher", 1012 | "version": "v4.0.2", 1013 | "source": { 1014 | "type": "git", 1015 | "url": "https://github.com/symfony/event-dispatcher.git", 1016 | "reference": "d4face19ed8002eec8280bc1c5ec18130472bf43" 1017 | }, 1018 | "dist": { 1019 | "type": "zip", 1020 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d4face19ed8002eec8280bc1c5ec18130472bf43", 1021 | "reference": "d4face19ed8002eec8280bc1c5ec18130472bf43", 1022 | "shasum": "" 1023 | }, 1024 | "require": { 1025 | "php": "^7.1.3" 1026 | }, 1027 | "conflict": { 1028 | "symfony/dependency-injection": "<3.4" 1029 | }, 1030 | "require-dev": { 1031 | "psr/log": "~1.0", 1032 | "symfony/config": "~3.4|~4.0", 1033 | "symfony/dependency-injection": "~3.4|~4.0", 1034 | "symfony/expression-language": "~3.4|~4.0", 1035 | "symfony/stopwatch": "~3.4|~4.0" 1036 | }, 1037 | "suggest": { 1038 | "symfony/dependency-injection": "", 1039 | "symfony/http-kernel": "" 1040 | }, 1041 | "type": "library", 1042 | "extra": { 1043 | "branch-alias": { 1044 | "dev-master": "4.0-dev" 1045 | } 1046 | }, 1047 | "autoload": { 1048 | "psr-4": { 1049 | "Symfony\\Component\\EventDispatcher\\": "" 1050 | }, 1051 | "exclude-from-classmap": [ 1052 | "/Tests/" 1053 | ] 1054 | }, 1055 | "notification-url": "https://packagist.org/downloads/", 1056 | "license": [ 1057 | "MIT" 1058 | ], 1059 | "authors": [ 1060 | { 1061 | "name": "Fabien Potencier", 1062 | "email": "fabien@symfony.com" 1063 | }, 1064 | { 1065 | "name": "Symfony Community", 1066 | "homepage": "https://symfony.com/contributors" 1067 | } 1068 | ], 1069 | "description": "Symfony EventDispatcher Component", 1070 | "homepage": "https://symfony.com", 1071 | "time": "2017-12-14T19:48:22+00:00" 1072 | }, 1073 | { 1074 | "name": "symfony/filesystem", 1075 | "version": "v4.0.2", 1076 | "source": { 1077 | "type": "git", 1078 | "url": "https://github.com/symfony/filesystem.git", 1079 | "reference": "8c2868641d0c4885eee9c12a89c2b695eb1985cd" 1080 | }, 1081 | "dist": { 1082 | "type": "zip", 1083 | "url": "https://api.github.com/repos/symfony/filesystem/zipball/8c2868641d0c4885eee9c12a89c2b695eb1985cd", 1084 | "reference": "8c2868641d0c4885eee9c12a89c2b695eb1985cd", 1085 | "shasum": "" 1086 | }, 1087 | "require": { 1088 | "php": "^7.1.3" 1089 | }, 1090 | "type": "library", 1091 | "extra": { 1092 | "branch-alias": { 1093 | "dev-master": "4.0-dev" 1094 | } 1095 | }, 1096 | "autoload": { 1097 | "psr-4": { 1098 | "Symfony\\Component\\Filesystem\\": "" 1099 | }, 1100 | "exclude-from-classmap": [ 1101 | "/Tests/" 1102 | ] 1103 | }, 1104 | "notification-url": "https://packagist.org/downloads/", 1105 | "license": [ 1106 | "MIT" 1107 | ], 1108 | "authors": [ 1109 | { 1110 | "name": "Fabien Potencier", 1111 | "email": "fabien@symfony.com" 1112 | }, 1113 | { 1114 | "name": "Symfony Community", 1115 | "homepage": "https://symfony.com/contributors" 1116 | } 1117 | ], 1118 | "description": "Symfony Filesystem Component", 1119 | "homepage": "https://symfony.com", 1120 | "time": "2017-12-14T19:48:22+00:00" 1121 | }, 1122 | { 1123 | "name": "symfony/finder", 1124 | "version": "v4.0.2", 1125 | "source": { 1126 | "type": "git", 1127 | "url": "https://github.com/symfony/finder.git", 1128 | "reference": "c9cdda4dc4a3182d8d6daeebce4a25fef078ea4c" 1129 | }, 1130 | "dist": { 1131 | "type": "zip", 1132 | "url": "https://api.github.com/repos/symfony/finder/zipball/c9cdda4dc4a3182d8d6daeebce4a25fef078ea4c", 1133 | "reference": "c9cdda4dc4a3182d8d6daeebce4a25fef078ea4c", 1134 | "shasum": "" 1135 | }, 1136 | "require": { 1137 | "php": "^7.1.3" 1138 | }, 1139 | "type": "library", 1140 | "extra": { 1141 | "branch-alias": { 1142 | "dev-master": "4.0-dev" 1143 | } 1144 | }, 1145 | "autoload": { 1146 | "psr-4": { 1147 | "Symfony\\Component\\Finder\\": "" 1148 | }, 1149 | "exclude-from-classmap": [ 1150 | "/Tests/" 1151 | ] 1152 | }, 1153 | "notification-url": "https://packagist.org/downloads/", 1154 | "license": [ 1155 | "MIT" 1156 | ], 1157 | "authors": [ 1158 | { 1159 | "name": "Fabien Potencier", 1160 | "email": "fabien@symfony.com" 1161 | }, 1162 | { 1163 | "name": "Symfony Community", 1164 | "homepage": "https://symfony.com/contributors" 1165 | } 1166 | ], 1167 | "description": "Symfony Finder Component", 1168 | "homepage": "https://symfony.com", 1169 | "time": "2017-11-07T14:45:01+00:00" 1170 | }, 1171 | { 1172 | "name": "symfony/framework-bundle", 1173 | "version": "v4.0.2", 1174 | "source": { 1175 | "type": "git", 1176 | "url": "https://github.com/symfony/framework-bundle.git", 1177 | "reference": "82e45a486a2cbdab5d43512bea10af1681dcd8e2" 1178 | }, 1179 | "dist": { 1180 | "type": "zip", 1181 | "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/82e45a486a2cbdab5d43512bea10af1681dcd8e2", 1182 | "reference": "82e45a486a2cbdab5d43512bea10af1681dcd8e2", 1183 | "shasum": "" 1184 | }, 1185 | "require": { 1186 | "ext-xml": "*", 1187 | "php": "^7.1.3", 1188 | "symfony/cache": "~3.4|~4.0", 1189 | "symfony/config": "~3.4|~4.0", 1190 | "symfony/dependency-injection": "~3.4|~4.0", 1191 | "symfony/event-dispatcher": "~3.4|~4.0", 1192 | "symfony/filesystem": "~3.4|~4.0", 1193 | "symfony/finder": "~3.4|~4.0", 1194 | "symfony/http-foundation": "~3.4|~4.0", 1195 | "symfony/http-kernel": "~3.4|~4.0", 1196 | "symfony/polyfill-mbstring": "~1.0", 1197 | "symfony/routing": "~3.4|~4.0" 1198 | }, 1199 | "conflict": { 1200 | "phpdocumentor/reflection-docblock": "<3.0", 1201 | "phpdocumentor/type-resolver": "<0.2.1", 1202 | "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", 1203 | "symfony/asset": "<3.4", 1204 | "symfony/console": "<3.4", 1205 | "symfony/form": "<3.4", 1206 | "symfony/property-info": "<3.4", 1207 | "symfony/serializer": "<3.4", 1208 | "symfony/stopwatch": "<3.4", 1209 | "symfony/translation": "<3.4", 1210 | "symfony/validator": "<3.4", 1211 | "symfony/workflow": "<3.4" 1212 | }, 1213 | "require-dev": { 1214 | "doctrine/annotations": "~1.0", 1215 | "doctrine/cache": "~1.0", 1216 | "fig/link-util": "^1.0", 1217 | "phpdocumentor/reflection-docblock": "^3.0|^4.0", 1218 | "symfony/asset": "~3.4|~4.0", 1219 | "symfony/browser-kit": "~3.4|~4.0", 1220 | "symfony/console": "~3.4|~4.0", 1221 | "symfony/css-selector": "~3.4|~4.0", 1222 | "symfony/dom-crawler": "~3.4|~4.0", 1223 | "symfony/expression-language": "~3.4|~4.0", 1224 | "symfony/form": "~3.4|~4.0", 1225 | "symfony/lock": "~3.4|~4.0", 1226 | "symfony/polyfill-intl-icu": "~1.0", 1227 | "symfony/process": "~3.4|~4.0", 1228 | "symfony/property-info": "~3.4|~4.0", 1229 | "symfony/security": "~3.4|~4.0", 1230 | "symfony/security-core": "~3.4|~4.0", 1231 | "symfony/security-csrf": "~3.4|~4.0", 1232 | "symfony/serializer": "~3.4|~4.0", 1233 | "symfony/stopwatch": "~3.4|~4.0", 1234 | "symfony/templating": "~3.4|~4.0", 1235 | "symfony/translation": "~3.4|~4.0", 1236 | "symfony/validator": "~3.4|~4.0", 1237 | "symfony/var-dumper": "~3.4|~4.0", 1238 | "symfony/web-link": "~3.4|~4.0", 1239 | "symfony/workflow": "~3.4|~4.0", 1240 | "symfony/yaml": "~3.4|~4.0", 1241 | "twig/twig": "~1.34|~2.4" 1242 | }, 1243 | "suggest": { 1244 | "ext-apcu": "For best performance of the system caches", 1245 | "symfony/console": "For using the console commands", 1246 | "symfony/form": "For using forms", 1247 | "symfony/property-info": "For using the property_info service", 1248 | "symfony/serializer": "For using the serializer service", 1249 | "symfony/validator": "For using validation", 1250 | "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", 1251 | "symfony/yaml": "For using the debug:config and lint:yaml commands" 1252 | }, 1253 | "type": "symfony-bundle", 1254 | "extra": { 1255 | "branch-alias": { 1256 | "dev-master": "4.0-dev" 1257 | } 1258 | }, 1259 | "autoload": { 1260 | "psr-4": { 1261 | "Symfony\\Bundle\\FrameworkBundle\\": "" 1262 | }, 1263 | "exclude-from-classmap": [ 1264 | "/Tests/" 1265 | ] 1266 | }, 1267 | "notification-url": "https://packagist.org/downloads/", 1268 | "license": [ 1269 | "MIT" 1270 | ], 1271 | "authors": [ 1272 | { 1273 | "name": "Fabien Potencier", 1274 | "email": "fabien@symfony.com" 1275 | }, 1276 | { 1277 | "name": "Symfony Community", 1278 | "homepage": "https://symfony.com/contributors" 1279 | } 1280 | ], 1281 | "description": "Symfony FrameworkBundle", 1282 | "homepage": "https://symfony.com", 1283 | "time": "2017-12-15T01:44:28+00:00" 1284 | }, 1285 | { 1286 | "name": "symfony/http-foundation", 1287 | "version": "v4.0.2", 1288 | "source": { 1289 | "type": "git", 1290 | "url": "https://github.com/symfony/http-foundation.git", 1291 | "reference": "aba96bd07be7796c81ca0ceafa7d48a6fef036c8" 1292 | }, 1293 | "dist": { 1294 | "type": "zip", 1295 | "url": "https://api.github.com/repos/symfony/http-foundation/zipball/aba96bd07be7796c81ca0ceafa7d48a6fef036c8", 1296 | "reference": "aba96bd07be7796c81ca0ceafa7d48a6fef036c8", 1297 | "shasum": "" 1298 | }, 1299 | "require": { 1300 | "php": "^7.1.3", 1301 | "symfony/polyfill-mbstring": "~1.1" 1302 | }, 1303 | "require-dev": { 1304 | "symfony/expression-language": "~3.4|~4.0" 1305 | }, 1306 | "type": "library", 1307 | "extra": { 1308 | "branch-alias": { 1309 | "dev-master": "4.0-dev" 1310 | } 1311 | }, 1312 | "autoload": { 1313 | "psr-4": { 1314 | "Symfony\\Component\\HttpFoundation\\": "" 1315 | }, 1316 | "exclude-from-classmap": [ 1317 | "/Tests/" 1318 | ] 1319 | }, 1320 | "notification-url": "https://packagist.org/downloads/", 1321 | "license": [ 1322 | "MIT" 1323 | ], 1324 | "authors": [ 1325 | { 1326 | "name": "Fabien Potencier", 1327 | "email": "fabien@symfony.com" 1328 | }, 1329 | { 1330 | "name": "Symfony Community", 1331 | "homepage": "https://symfony.com/contributors" 1332 | } 1333 | ], 1334 | "description": "Symfony HttpFoundation Component", 1335 | "homepage": "https://symfony.com", 1336 | "time": "2017-12-14T19:48:22+00:00" 1337 | }, 1338 | { 1339 | "name": "symfony/http-kernel", 1340 | "version": "v4.0.2", 1341 | "source": { 1342 | "type": "git", 1343 | "url": "https://github.com/symfony/http-kernel.git", 1344 | "reference": "f2ea7461cdcad837b8bc6022b59d5eb8c9618aa5" 1345 | }, 1346 | "dist": { 1347 | "type": "zip", 1348 | "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f2ea7461cdcad837b8bc6022b59d5eb8c9618aa5", 1349 | "reference": "f2ea7461cdcad837b8bc6022b59d5eb8c9618aa5", 1350 | "shasum": "" 1351 | }, 1352 | "require": { 1353 | "php": "^7.1.3", 1354 | "psr/log": "~1.0", 1355 | "symfony/debug": "~3.4|~4.0", 1356 | "symfony/event-dispatcher": "~3.4|~4.0", 1357 | "symfony/http-foundation": "~3.4|~4.0" 1358 | }, 1359 | "conflict": { 1360 | "symfony/config": "<3.4", 1361 | "symfony/dependency-injection": "<3.4", 1362 | "symfony/var-dumper": "<3.4", 1363 | "twig/twig": "<1.34|<2.4,>=2" 1364 | }, 1365 | "provide": { 1366 | "psr/log-implementation": "1.0" 1367 | }, 1368 | "require-dev": { 1369 | "psr/cache": "~1.0", 1370 | "symfony/browser-kit": "~3.4|~4.0", 1371 | "symfony/config": "~3.4|~4.0", 1372 | "symfony/console": "~3.4|~4.0", 1373 | "symfony/css-selector": "~3.4|~4.0", 1374 | "symfony/dependency-injection": "~3.4|~4.0", 1375 | "symfony/dom-crawler": "~3.4|~4.0", 1376 | "symfony/expression-language": "~3.4|~4.0", 1377 | "symfony/finder": "~3.4|~4.0", 1378 | "symfony/process": "~3.4|~4.0", 1379 | "symfony/routing": "~3.4|~4.0", 1380 | "symfony/stopwatch": "~3.4|~4.0", 1381 | "symfony/templating": "~3.4|~4.0", 1382 | "symfony/translation": "~3.4|~4.0", 1383 | "symfony/var-dumper": "~3.4|~4.0" 1384 | }, 1385 | "suggest": { 1386 | "symfony/browser-kit": "", 1387 | "symfony/config": "", 1388 | "symfony/console": "", 1389 | "symfony/dependency-injection": "", 1390 | "symfony/var-dumper": "" 1391 | }, 1392 | "type": "library", 1393 | "extra": { 1394 | "branch-alias": { 1395 | "dev-master": "4.0-dev" 1396 | } 1397 | }, 1398 | "autoload": { 1399 | "psr-4": { 1400 | "Symfony\\Component\\HttpKernel\\": "" 1401 | }, 1402 | "exclude-from-classmap": [ 1403 | "/Tests/" 1404 | ] 1405 | }, 1406 | "notification-url": "https://packagist.org/downloads/", 1407 | "license": [ 1408 | "MIT" 1409 | ], 1410 | "authors": [ 1411 | { 1412 | "name": "Fabien Potencier", 1413 | "email": "fabien@symfony.com" 1414 | }, 1415 | { 1416 | "name": "Symfony Community", 1417 | "homepage": "https://symfony.com/contributors" 1418 | } 1419 | ], 1420 | "description": "Symfony HttpKernel Component", 1421 | "homepage": "https://symfony.com", 1422 | "time": "2017-12-15T03:06:17+00:00" 1423 | }, 1424 | { 1425 | "name": "symfony/polyfill-mbstring", 1426 | "version": "v1.6.0", 1427 | "source": { 1428 | "type": "git", 1429 | "url": "https://github.com/symfony/polyfill-mbstring.git", 1430 | "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296" 1431 | }, 1432 | "dist": { 1433 | "type": "zip", 1434 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", 1435 | "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", 1436 | "shasum": "" 1437 | }, 1438 | "require": { 1439 | "php": ">=5.3.3" 1440 | }, 1441 | "suggest": { 1442 | "ext-mbstring": "For best performance" 1443 | }, 1444 | "type": "library", 1445 | "extra": { 1446 | "branch-alias": { 1447 | "dev-master": "1.6-dev" 1448 | } 1449 | }, 1450 | "autoload": { 1451 | "psr-4": { 1452 | "Symfony\\Polyfill\\Mbstring\\": "" 1453 | }, 1454 | "files": [ 1455 | "bootstrap.php" 1456 | ] 1457 | }, 1458 | "notification-url": "https://packagist.org/downloads/", 1459 | "license": [ 1460 | "MIT" 1461 | ], 1462 | "authors": [ 1463 | { 1464 | "name": "Nicolas Grekas", 1465 | "email": "p@tchwork.com" 1466 | }, 1467 | { 1468 | "name": "Symfony Community", 1469 | "homepage": "https://symfony.com/contributors" 1470 | } 1471 | ], 1472 | "description": "Symfony polyfill for the Mbstring extension", 1473 | "homepage": "https://symfony.com", 1474 | "keywords": [ 1475 | "compatibility", 1476 | "mbstring", 1477 | "polyfill", 1478 | "portable", 1479 | "shim" 1480 | ], 1481 | "time": "2017-10-11T12:05:26+00:00" 1482 | }, 1483 | { 1484 | "name": "symfony/routing", 1485 | "version": "v4.0.2", 1486 | "source": { 1487 | "type": "git", 1488 | "url": "https://github.com/symfony/routing.git", 1489 | "reference": "972810def5cae044d19195045f7eb418141bf37b" 1490 | }, 1491 | "dist": { 1492 | "type": "zip", 1493 | "url": "https://api.github.com/repos/symfony/routing/zipball/972810def5cae044d19195045f7eb418141bf37b", 1494 | "reference": "972810def5cae044d19195045f7eb418141bf37b", 1495 | "shasum": "" 1496 | }, 1497 | "require": { 1498 | "php": "^7.1.3" 1499 | }, 1500 | "conflict": { 1501 | "symfony/config": "<3.4", 1502 | "symfony/dependency-injection": "<3.4", 1503 | "symfony/yaml": "<3.4" 1504 | }, 1505 | "require-dev": { 1506 | "doctrine/annotations": "~1.0", 1507 | "doctrine/common": "~2.2", 1508 | "psr/log": "~1.0", 1509 | "symfony/config": "~3.4|~4.0", 1510 | "symfony/dependency-injection": "~3.4|~4.0", 1511 | "symfony/expression-language": "~3.4|~4.0", 1512 | "symfony/http-foundation": "~3.4|~4.0", 1513 | "symfony/yaml": "~3.4|~4.0" 1514 | }, 1515 | "suggest": { 1516 | "doctrine/annotations": "For using the annotation loader", 1517 | "symfony/config": "For using the all-in-one router or any loader", 1518 | "symfony/dependency-injection": "For loading routes from a service", 1519 | "symfony/expression-language": "For using expression matching", 1520 | "symfony/http-foundation": "For using a Symfony Request object", 1521 | "symfony/yaml": "For using the YAML loader" 1522 | }, 1523 | "type": "library", 1524 | "extra": { 1525 | "branch-alias": { 1526 | "dev-master": "4.0-dev" 1527 | } 1528 | }, 1529 | "autoload": { 1530 | "psr-4": { 1531 | "Symfony\\Component\\Routing\\": "" 1532 | }, 1533 | "exclude-from-classmap": [ 1534 | "/Tests/" 1535 | ] 1536 | }, 1537 | "notification-url": "https://packagist.org/downloads/", 1538 | "license": [ 1539 | "MIT" 1540 | ], 1541 | "authors": [ 1542 | { 1543 | "name": "Fabien Potencier", 1544 | "email": "fabien@symfony.com" 1545 | }, 1546 | { 1547 | "name": "Symfony Community", 1548 | "homepage": "https://symfony.com/contributors" 1549 | } 1550 | ], 1551 | "description": "Symfony Routing Component", 1552 | "homepage": "https://symfony.com", 1553 | "keywords": [ 1554 | "router", 1555 | "routing", 1556 | "uri", 1557 | "url" 1558 | ], 1559 | "time": "2017-12-14T22:39:22+00:00" 1560 | } 1561 | ], 1562 | "packages-dev": [ 1563 | { 1564 | "name": "doctrine/cache", 1565 | "version": "v1.7.1", 1566 | "source": { 1567 | "type": "git", 1568 | "url": "https://github.com/doctrine/cache.git", 1569 | "reference": "b3217d58609e9c8e661cd41357a54d926c4a2a1a" 1570 | }, 1571 | "dist": { 1572 | "type": "zip", 1573 | "url": "https://api.github.com/repos/doctrine/cache/zipball/b3217d58609e9c8e661cd41357a54d926c4a2a1a", 1574 | "reference": "b3217d58609e9c8e661cd41357a54d926c4a2a1a", 1575 | "shasum": "" 1576 | }, 1577 | "require": { 1578 | "php": "~7.1" 1579 | }, 1580 | "conflict": { 1581 | "doctrine/common": ">2.2,<2.4" 1582 | }, 1583 | "require-dev": { 1584 | "alcaeus/mongo-php-adapter": "^1.1", 1585 | "mongodb/mongodb": "^1.1", 1586 | "phpunit/phpunit": "^5.7", 1587 | "predis/predis": "~1.0" 1588 | }, 1589 | "suggest": { 1590 | "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" 1591 | }, 1592 | "type": "library", 1593 | "extra": { 1594 | "branch-alias": { 1595 | "dev-master": "1.7.x-dev" 1596 | } 1597 | }, 1598 | "autoload": { 1599 | "psr-4": { 1600 | "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" 1601 | } 1602 | }, 1603 | "notification-url": "https://packagist.org/downloads/", 1604 | "license": [ 1605 | "MIT" 1606 | ], 1607 | "authors": [ 1608 | { 1609 | "name": "Roman Borschel", 1610 | "email": "roman@code-factory.org" 1611 | }, 1612 | { 1613 | "name": "Benjamin Eberlei", 1614 | "email": "kontakt@beberlei.de" 1615 | }, 1616 | { 1617 | "name": "Guilherme Blanco", 1618 | "email": "guilhermeblanco@gmail.com" 1619 | }, 1620 | { 1621 | "name": "Jonathan Wage", 1622 | "email": "jonwage@gmail.com" 1623 | }, 1624 | { 1625 | "name": "Johannes Schmitt", 1626 | "email": "schmittjoh@gmail.com" 1627 | } 1628 | ], 1629 | "description": "Caching library offering an object-oriented API for many cache backends", 1630 | "homepage": "http://www.doctrine-project.org", 1631 | "keywords": [ 1632 | "cache", 1633 | "caching" 1634 | ], 1635 | "time": "2017-08-25T07:02:50+00:00" 1636 | }, 1637 | { 1638 | "name": "doctrine/collections", 1639 | "version": "v1.5.0", 1640 | "source": { 1641 | "type": "git", 1642 | "url": "https://github.com/doctrine/collections.git", 1643 | "reference": "a01ee38fcd999f34d9bfbcee59dbda5105449cbf" 1644 | }, 1645 | "dist": { 1646 | "type": "zip", 1647 | "url": "https://api.github.com/repos/doctrine/collections/zipball/a01ee38fcd999f34d9bfbcee59dbda5105449cbf", 1648 | "reference": "a01ee38fcd999f34d9bfbcee59dbda5105449cbf", 1649 | "shasum": "" 1650 | }, 1651 | "require": { 1652 | "php": "^7.1" 1653 | }, 1654 | "require-dev": { 1655 | "doctrine/coding-standard": "~0.1@dev", 1656 | "phpunit/phpunit": "^5.7" 1657 | }, 1658 | "type": "library", 1659 | "extra": { 1660 | "branch-alias": { 1661 | "dev-master": "1.3.x-dev" 1662 | } 1663 | }, 1664 | "autoload": { 1665 | "psr-0": { 1666 | "Doctrine\\Common\\Collections\\": "lib/" 1667 | } 1668 | }, 1669 | "notification-url": "https://packagist.org/downloads/", 1670 | "license": [ 1671 | "MIT" 1672 | ], 1673 | "authors": [ 1674 | { 1675 | "name": "Roman Borschel", 1676 | "email": "roman@code-factory.org" 1677 | }, 1678 | { 1679 | "name": "Benjamin Eberlei", 1680 | "email": "kontakt@beberlei.de" 1681 | }, 1682 | { 1683 | "name": "Guilherme Blanco", 1684 | "email": "guilhermeblanco@gmail.com" 1685 | }, 1686 | { 1687 | "name": "Jonathan Wage", 1688 | "email": "jonwage@gmail.com" 1689 | }, 1690 | { 1691 | "name": "Johannes Schmitt", 1692 | "email": "schmittjoh@gmail.com" 1693 | } 1694 | ], 1695 | "description": "Collections Abstraction library", 1696 | "homepage": "http://www.doctrine-project.org", 1697 | "keywords": [ 1698 | "array", 1699 | "collections", 1700 | "iterator" 1701 | ], 1702 | "time": "2017-07-22T10:37:32+00:00" 1703 | }, 1704 | { 1705 | "name": "doctrine/common", 1706 | "version": "v2.8.1", 1707 | "source": { 1708 | "type": "git", 1709 | "url": "https://github.com/doctrine/common.git", 1710 | "reference": "f68c297ce6455e8fd794aa8ffaf9fa458f6ade66" 1711 | }, 1712 | "dist": { 1713 | "type": "zip", 1714 | "url": "https://api.github.com/repos/doctrine/common/zipball/f68c297ce6455e8fd794aa8ffaf9fa458f6ade66", 1715 | "reference": "f68c297ce6455e8fd794aa8ffaf9fa458f6ade66", 1716 | "shasum": "" 1717 | }, 1718 | "require": { 1719 | "doctrine/annotations": "1.*", 1720 | "doctrine/cache": "1.*", 1721 | "doctrine/collections": "1.*", 1722 | "doctrine/inflector": "1.*", 1723 | "doctrine/lexer": "1.*", 1724 | "php": "~7.1" 1725 | }, 1726 | "require-dev": { 1727 | "phpunit/phpunit": "^5.7" 1728 | }, 1729 | "type": "library", 1730 | "extra": { 1731 | "branch-alias": { 1732 | "dev-master": "2.8.x-dev" 1733 | } 1734 | }, 1735 | "autoload": { 1736 | "psr-4": { 1737 | "Doctrine\\Common\\": "lib/Doctrine/Common" 1738 | } 1739 | }, 1740 | "notification-url": "https://packagist.org/downloads/", 1741 | "license": [ 1742 | "MIT" 1743 | ], 1744 | "authors": [ 1745 | { 1746 | "name": "Roman Borschel", 1747 | "email": "roman@code-factory.org" 1748 | }, 1749 | { 1750 | "name": "Benjamin Eberlei", 1751 | "email": "kontakt@beberlei.de" 1752 | }, 1753 | { 1754 | "name": "Guilherme Blanco", 1755 | "email": "guilhermeblanco@gmail.com" 1756 | }, 1757 | { 1758 | "name": "Jonathan Wage", 1759 | "email": "jonwage@gmail.com" 1760 | }, 1761 | { 1762 | "name": "Johannes Schmitt", 1763 | "email": "schmittjoh@gmail.com" 1764 | } 1765 | ], 1766 | "description": "Common Library for Doctrine projects", 1767 | "homepage": "http://www.doctrine-project.org", 1768 | "keywords": [ 1769 | "annotations", 1770 | "collections", 1771 | "eventmanager", 1772 | "persistence", 1773 | "spl" 1774 | ], 1775 | "time": "2017-08-31T08:43:38+00:00" 1776 | }, 1777 | { 1778 | "name": "doctrine/dbal", 1779 | "version": "v2.6.3", 1780 | "source": { 1781 | "type": "git", 1782 | "url": "https://github.com/doctrine/dbal.git", 1783 | "reference": "e3eed9b1facbb0ced3a0995244843a189e7d1b13" 1784 | }, 1785 | "dist": { 1786 | "type": "zip", 1787 | "url": "https://api.github.com/repos/doctrine/dbal/zipball/e3eed9b1facbb0ced3a0995244843a189e7d1b13", 1788 | "reference": "e3eed9b1facbb0ced3a0995244843a189e7d1b13", 1789 | "shasum": "" 1790 | }, 1791 | "require": { 1792 | "doctrine/common": "^2.7.1", 1793 | "ext-pdo": "*", 1794 | "php": "^7.1" 1795 | }, 1796 | "require-dev": { 1797 | "phpunit/phpunit": "^5.4.6", 1798 | "phpunit/phpunit-mock-objects": "!=3.2.4,!=3.2.5", 1799 | "symfony/console": "2.*||^3.0" 1800 | }, 1801 | "suggest": { 1802 | "symfony/console": "For helpful console commands such as SQL execution and import of files." 1803 | }, 1804 | "bin": [ 1805 | "bin/doctrine-dbal" 1806 | ], 1807 | "type": "library", 1808 | "extra": { 1809 | "branch-alias": { 1810 | "dev-master": "2.6.x-dev" 1811 | } 1812 | }, 1813 | "autoload": { 1814 | "psr-0": { 1815 | "Doctrine\\DBAL\\": "lib/" 1816 | } 1817 | }, 1818 | "notification-url": "https://packagist.org/downloads/", 1819 | "license": [ 1820 | "MIT" 1821 | ], 1822 | "authors": [ 1823 | { 1824 | "name": "Roman Borschel", 1825 | "email": "roman@code-factory.org" 1826 | }, 1827 | { 1828 | "name": "Benjamin Eberlei", 1829 | "email": "kontakt@beberlei.de" 1830 | }, 1831 | { 1832 | "name": "Guilherme Blanco", 1833 | "email": "guilhermeblanco@gmail.com" 1834 | }, 1835 | { 1836 | "name": "Jonathan Wage", 1837 | "email": "jonwage@gmail.com" 1838 | } 1839 | ], 1840 | "description": "Database Abstraction Layer", 1841 | "homepage": "http://www.doctrine-project.org", 1842 | "keywords": [ 1843 | "database", 1844 | "dbal", 1845 | "persistence", 1846 | "queryobject" 1847 | ], 1848 | "time": "2017-11-19T13:38:54+00:00" 1849 | }, 1850 | { 1851 | "name": "doctrine/inflector", 1852 | "version": "v1.2.0", 1853 | "source": { 1854 | "type": "git", 1855 | "url": "https://github.com/doctrine/inflector.git", 1856 | "reference": "e11d84c6e018beedd929cff5220969a3c6d1d462" 1857 | }, 1858 | "dist": { 1859 | "type": "zip", 1860 | "url": "https://api.github.com/repos/doctrine/inflector/zipball/e11d84c6e018beedd929cff5220969a3c6d1d462", 1861 | "reference": "e11d84c6e018beedd929cff5220969a3c6d1d462", 1862 | "shasum": "" 1863 | }, 1864 | "require": { 1865 | "php": "^7.0" 1866 | }, 1867 | "require-dev": { 1868 | "phpunit/phpunit": "^6.2" 1869 | }, 1870 | "type": "library", 1871 | "extra": { 1872 | "branch-alias": { 1873 | "dev-master": "1.2.x-dev" 1874 | } 1875 | }, 1876 | "autoload": { 1877 | "psr-4": { 1878 | "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" 1879 | } 1880 | }, 1881 | "notification-url": "https://packagist.org/downloads/", 1882 | "license": [ 1883 | "MIT" 1884 | ], 1885 | "authors": [ 1886 | { 1887 | "name": "Roman Borschel", 1888 | "email": "roman@code-factory.org" 1889 | }, 1890 | { 1891 | "name": "Benjamin Eberlei", 1892 | "email": "kontakt@beberlei.de" 1893 | }, 1894 | { 1895 | "name": "Guilherme Blanco", 1896 | "email": "guilhermeblanco@gmail.com" 1897 | }, 1898 | { 1899 | "name": "Jonathan Wage", 1900 | "email": "jonwage@gmail.com" 1901 | }, 1902 | { 1903 | "name": "Johannes Schmitt", 1904 | "email": "schmittjoh@gmail.com" 1905 | } 1906 | ], 1907 | "description": "Common String Manipulations with regard to casing and singular/plural rules.", 1908 | "homepage": "http://www.doctrine-project.org", 1909 | "keywords": [ 1910 | "inflection", 1911 | "pluralize", 1912 | "singularize", 1913 | "string" 1914 | ], 1915 | "time": "2017-07-22T12:18:28+00:00" 1916 | }, 1917 | { 1918 | "name": "doctrine/instantiator", 1919 | "version": "1.1.0", 1920 | "source": { 1921 | "type": "git", 1922 | "url": "https://github.com/doctrine/instantiator.git", 1923 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" 1924 | }, 1925 | "dist": { 1926 | "type": "zip", 1927 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", 1928 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", 1929 | "shasum": "" 1930 | }, 1931 | "require": { 1932 | "php": "^7.1" 1933 | }, 1934 | "require-dev": { 1935 | "athletic/athletic": "~0.1.8", 1936 | "ext-pdo": "*", 1937 | "ext-phar": "*", 1938 | "phpunit/phpunit": "^6.2.3", 1939 | "squizlabs/php_codesniffer": "^3.0.2" 1940 | }, 1941 | "type": "library", 1942 | "extra": { 1943 | "branch-alias": { 1944 | "dev-master": "1.2.x-dev" 1945 | } 1946 | }, 1947 | "autoload": { 1948 | "psr-4": { 1949 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 1950 | } 1951 | }, 1952 | "notification-url": "https://packagist.org/downloads/", 1953 | "license": [ 1954 | "MIT" 1955 | ], 1956 | "authors": [ 1957 | { 1958 | "name": "Marco Pivetta", 1959 | "email": "ocramius@gmail.com", 1960 | "homepage": "http://ocramius.github.com/" 1961 | } 1962 | ], 1963 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 1964 | "homepage": "https://github.com/doctrine/instantiator", 1965 | "keywords": [ 1966 | "constructor", 1967 | "instantiate" 1968 | ], 1969 | "time": "2017-07-22T11:58:36+00:00" 1970 | }, 1971 | { 1972 | "name": "doctrine/orm", 1973 | "version": "v2.6.0", 1974 | "source": { 1975 | "type": "git", 1976 | "url": "https://github.com/doctrine/doctrine2.git", 1977 | "reference": "374e7ace49d864dad8cddbc55346447c8a6a2083" 1978 | }, 1979 | "dist": { 1980 | "type": "zip", 1981 | "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/374e7ace49d864dad8cddbc55346447c8a6a2083", 1982 | "reference": "374e7ace49d864dad8cddbc55346447c8a6a2083", 1983 | "shasum": "" 1984 | }, 1985 | "require": { 1986 | "doctrine/annotations": "~1.5", 1987 | "doctrine/cache": "~1.6", 1988 | "doctrine/collections": "^1.4", 1989 | "doctrine/common": "^2.7.1", 1990 | "doctrine/dbal": "^2.6", 1991 | "doctrine/instantiator": "~1.1", 1992 | "ext-pdo": "*", 1993 | "php": "^7.1", 1994 | "symfony/console": "~3.0|~4.0" 1995 | }, 1996 | "require-dev": { 1997 | "doctrine/coding-standard": "^1.0", 1998 | "phpunit/phpunit": "^6.5", 1999 | "squizlabs/php_codesniffer": "^3.2", 2000 | "symfony/yaml": "~3.4|~4.0" 2001 | }, 2002 | "suggest": { 2003 | "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" 2004 | }, 2005 | "bin": [ 2006 | "bin/doctrine" 2007 | ], 2008 | "type": "library", 2009 | "extra": { 2010 | "branch-alias": { 2011 | "dev-master": "2.6.x-dev" 2012 | } 2013 | }, 2014 | "autoload": { 2015 | "psr-4": { 2016 | "Doctrine\\ORM\\": "lib/Doctrine/ORM" 2017 | } 2018 | }, 2019 | "notification-url": "https://packagist.org/downloads/", 2020 | "license": [ 2021 | "MIT" 2022 | ], 2023 | "authors": [ 2024 | { 2025 | "name": "Roman Borschel", 2026 | "email": "roman@code-factory.org" 2027 | }, 2028 | { 2029 | "name": "Benjamin Eberlei", 2030 | "email": "kontakt@beberlei.de" 2031 | }, 2032 | { 2033 | "name": "Guilherme Blanco", 2034 | "email": "guilhermeblanco@gmail.com" 2035 | }, 2036 | { 2037 | "name": "Jonathan Wage", 2038 | "email": "jonwage@gmail.com" 2039 | }, 2040 | { 2041 | "name": "Marco Pivetta", 2042 | "email": "ocramius@gmail.com" 2043 | } 2044 | ], 2045 | "description": "Object-Relational-Mapper for PHP", 2046 | "homepage": "http://www.doctrine-project.org", 2047 | "keywords": [ 2048 | "database", 2049 | "orm" 2050 | ], 2051 | "time": "2017-12-20T00:38:15+00:00" 2052 | }, 2053 | { 2054 | "name": "matthiasnoback/symfony-config-test", 2055 | "version": "v2.2.0", 2056 | "source": { 2057 | "type": "git", 2058 | "url": "https://github.com/SymfonyTest/SymfonyConfigTest.git", 2059 | "reference": "8d48332ed83ac3bacc99ce487ade25df2613ab1e" 2060 | }, 2061 | "dist": { 2062 | "type": "zip", 2063 | "url": "https://api.github.com/repos/SymfonyTest/SymfonyConfigTest/zipball/8d48332ed83ac3bacc99ce487ade25df2613ab1e", 2064 | "reference": "8d48332ed83ac3bacc99ce487ade25df2613ab1e", 2065 | "shasum": "" 2066 | }, 2067 | "require": { 2068 | "php": "^5.3|^7.0", 2069 | "sebastian/exporter": "^1.0|^2.0", 2070 | "symfony/config": "^2.3|^3.0|^4.0" 2071 | }, 2072 | "require-dev": { 2073 | "phpunit/phpunit": "^4.0|^5.0" 2074 | }, 2075 | "type": "library", 2076 | "autoload": { 2077 | "psr-4": { 2078 | "Matthias\\SymfonyConfigTest\\": "" 2079 | } 2080 | }, 2081 | "notification-url": "https://packagist.org/downloads/", 2082 | "license": [ 2083 | "MIT" 2084 | ], 2085 | "authors": [ 2086 | { 2087 | "name": "Matthias Noback", 2088 | "email": "matthiasnoback@gmail.com", 2089 | "homepage": "http://php-and-symfony.matthiasnoback.nl" 2090 | } 2091 | ], 2092 | "description": "Library for testing user classes related to the Symfony Config Component", 2093 | "homepage": "https://github.com/matthiasnoback/SymfonyConfigTest", 2094 | "keywords": [ 2095 | "config", 2096 | "phpunit", 2097 | "symfony" 2098 | ], 2099 | "time": "2017-11-21T18:42:45+00:00" 2100 | }, 2101 | { 2102 | "name": "matthiasnoback/symfony-dependency-injection-test", 2103 | "version": "v1.2.0", 2104 | "source": { 2105 | "type": "git", 2106 | "url": "https://github.com/SymfonyTest/SymfonyDependencyInjectionTest.git", 2107 | "reference": "3c4c734eb6114a3495278ead5d0239652f73e505" 2108 | }, 2109 | "dist": { 2110 | "type": "zip", 2111 | "url": "https://api.github.com/repos/SymfonyTest/SymfonyDependencyInjectionTest/zipball/3c4c734eb6114a3495278ead5d0239652f73e505", 2112 | "reference": "3c4c734eb6114a3495278ead5d0239652f73e505", 2113 | "shasum": "" 2114 | }, 2115 | "require": { 2116 | "matthiasnoback/symfony-config-test": "^1.0 || ^2.0", 2117 | "sebastian/exporter": "^1.0 || ^2.0", 2118 | "symfony/config": "^2.7 || ^3.3 || ^4.0", 2119 | "symfony/dependency-injection": "^2.7 || ^3.3 || ^4.0", 2120 | "symfony/yaml": "^2.7 || ^3.3 || ^4.0" 2121 | }, 2122 | "require-dev": { 2123 | "phpunit/phpunit": "^4.0 || ^5.0" 2124 | }, 2125 | "type": "library", 2126 | "autoload": { 2127 | "psr-4": { 2128 | "Matthias\\SymfonyDependencyInjectionTest\\": "" 2129 | } 2130 | }, 2131 | "notification-url": "https://packagist.org/downloads/", 2132 | "license": [ 2133 | "MIT" 2134 | ], 2135 | "authors": [ 2136 | { 2137 | "name": "Matthias Noback", 2138 | "email": "matthiasnoback@gmail.com", 2139 | "homepage": "http://php-and-symfony.matthiasnoback.nl" 2140 | } 2141 | ], 2142 | "description": "Library for testing user classes related to the Symfony Dependency Injection Component", 2143 | "homepage": "http://github.com/matthiasnoback/SymfonyDependencyInjectionTest", 2144 | "keywords": [ 2145 | "Symfony2", 2146 | "dependency injection", 2147 | "phpunit" 2148 | ], 2149 | "time": "2017-11-30T17:05:05+00:00" 2150 | }, 2151 | { 2152 | "name": "myclabs/deep-copy", 2153 | "version": "1.7.0", 2154 | "source": { 2155 | "type": "git", 2156 | "url": "https://github.com/myclabs/DeepCopy.git", 2157 | "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e" 2158 | }, 2159 | "dist": { 2160 | "type": "zip", 2161 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", 2162 | "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", 2163 | "shasum": "" 2164 | }, 2165 | "require": { 2166 | "php": "^5.6 || ^7.0" 2167 | }, 2168 | "require-dev": { 2169 | "doctrine/collections": "^1.0", 2170 | "doctrine/common": "^2.6", 2171 | "phpunit/phpunit": "^4.1" 2172 | }, 2173 | "type": "library", 2174 | "autoload": { 2175 | "psr-4": { 2176 | "DeepCopy\\": "src/DeepCopy/" 2177 | }, 2178 | "files": [ 2179 | "src/DeepCopy/deep_copy.php" 2180 | ] 2181 | }, 2182 | "notification-url": "https://packagist.org/downloads/", 2183 | "license": [ 2184 | "MIT" 2185 | ], 2186 | "description": "Create deep copies (clones) of your objects", 2187 | "keywords": [ 2188 | "clone", 2189 | "copy", 2190 | "duplicate", 2191 | "object", 2192 | "object graph" 2193 | ], 2194 | "time": "2017-10-19T19:58:43+00:00" 2195 | }, 2196 | { 2197 | "name": "phpdocumentor/reflection-common", 2198 | "version": "1.0.1", 2199 | "source": { 2200 | "type": "git", 2201 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 2202 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" 2203 | }, 2204 | "dist": { 2205 | "type": "zip", 2206 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 2207 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 2208 | "shasum": "" 2209 | }, 2210 | "require": { 2211 | "php": ">=5.5" 2212 | }, 2213 | "require-dev": { 2214 | "phpunit/phpunit": "^4.6" 2215 | }, 2216 | "type": "library", 2217 | "extra": { 2218 | "branch-alias": { 2219 | "dev-master": "1.0.x-dev" 2220 | } 2221 | }, 2222 | "autoload": { 2223 | "psr-4": { 2224 | "phpDocumentor\\Reflection\\": [ 2225 | "src" 2226 | ] 2227 | } 2228 | }, 2229 | "notification-url": "https://packagist.org/downloads/", 2230 | "license": [ 2231 | "MIT" 2232 | ], 2233 | "authors": [ 2234 | { 2235 | "name": "Jaap van Otterdijk", 2236 | "email": "opensource@ijaap.nl" 2237 | } 2238 | ], 2239 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 2240 | "homepage": "http://www.phpdoc.org", 2241 | "keywords": [ 2242 | "FQSEN", 2243 | "phpDocumentor", 2244 | "phpdoc", 2245 | "reflection", 2246 | "static analysis" 2247 | ], 2248 | "time": "2017-09-11T18:02:19+00:00" 2249 | }, 2250 | { 2251 | "name": "phpdocumentor/reflection-docblock", 2252 | "version": "4.2.0", 2253 | "source": { 2254 | "type": "git", 2255 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 2256 | "reference": "66465776cfc249844bde6d117abff1d22e06c2da" 2257 | }, 2258 | "dist": { 2259 | "type": "zip", 2260 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/66465776cfc249844bde6d117abff1d22e06c2da", 2261 | "reference": "66465776cfc249844bde6d117abff1d22e06c2da", 2262 | "shasum": "" 2263 | }, 2264 | "require": { 2265 | "php": "^7.0", 2266 | "phpdocumentor/reflection-common": "^1.0.0", 2267 | "phpdocumentor/type-resolver": "^0.4.0", 2268 | "webmozart/assert": "^1.0" 2269 | }, 2270 | "require-dev": { 2271 | "doctrine/instantiator": "~1.0.5", 2272 | "mockery/mockery": "^1.0", 2273 | "phpunit/phpunit": "^6.4" 2274 | }, 2275 | "type": "library", 2276 | "extra": { 2277 | "branch-alias": { 2278 | "dev-master": "4.x-dev" 2279 | } 2280 | }, 2281 | "autoload": { 2282 | "psr-4": { 2283 | "phpDocumentor\\Reflection\\": [ 2284 | "src/" 2285 | ] 2286 | } 2287 | }, 2288 | "notification-url": "https://packagist.org/downloads/", 2289 | "license": [ 2290 | "MIT" 2291 | ], 2292 | "authors": [ 2293 | { 2294 | "name": "Mike van Riel", 2295 | "email": "me@mikevanriel.com" 2296 | } 2297 | ], 2298 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 2299 | "time": "2017-11-27T17:38:31+00:00" 2300 | }, 2301 | { 2302 | "name": "phpdocumentor/type-resolver", 2303 | "version": "0.4.0", 2304 | "source": { 2305 | "type": "git", 2306 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 2307 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" 2308 | }, 2309 | "dist": { 2310 | "type": "zip", 2311 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", 2312 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", 2313 | "shasum": "" 2314 | }, 2315 | "require": { 2316 | "php": "^5.5 || ^7.0", 2317 | "phpdocumentor/reflection-common": "^1.0" 2318 | }, 2319 | "require-dev": { 2320 | "mockery/mockery": "^0.9.4", 2321 | "phpunit/phpunit": "^5.2||^4.8.24" 2322 | }, 2323 | "type": "library", 2324 | "extra": { 2325 | "branch-alias": { 2326 | "dev-master": "1.0.x-dev" 2327 | } 2328 | }, 2329 | "autoload": { 2330 | "psr-4": { 2331 | "phpDocumentor\\Reflection\\": [ 2332 | "src/" 2333 | ] 2334 | } 2335 | }, 2336 | "notification-url": "https://packagist.org/downloads/", 2337 | "license": [ 2338 | "MIT" 2339 | ], 2340 | "authors": [ 2341 | { 2342 | "name": "Mike van Riel", 2343 | "email": "me@mikevanriel.com" 2344 | } 2345 | ], 2346 | "time": "2017-07-14T14:27:02+00:00" 2347 | }, 2348 | { 2349 | "name": "phpspec/prophecy", 2350 | "version": "1.7.3", 2351 | "source": { 2352 | "type": "git", 2353 | "url": "https://github.com/phpspec/prophecy.git", 2354 | "reference": "e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf" 2355 | }, 2356 | "dist": { 2357 | "type": "zip", 2358 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf", 2359 | "reference": "e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf", 2360 | "shasum": "" 2361 | }, 2362 | "require": { 2363 | "doctrine/instantiator": "^1.0.2", 2364 | "php": "^5.3|^7.0", 2365 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", 2366 | "sebastian/comparator": "^1.1|^2.0", 2367 | "sebastian/recursion-context": "^1.0|^2.0|^3.0" 2368 | }, 2369 | "require-dev": { 2370 | "phpspec/phpspec": "^2.5|^3.2", 2371 | "phpunit/phpunit": "^4.8.35 || ^5.7" 2372 | }, 2373 | "type": "library", 2374 | "extra": { 2375 | "branch-alias": { 2376 | "dev-master": "1.7.x-dev" 2377 | } 2378 | }, 2379 | "autoload": { 2380 | "psr-0": { 2381 | "Prophecy\\": "src/" 2382 | } 2383 | }, 2384 | "notification-url": "https://packagist.org/downloads/", 2385 | "license": [ 2386 | "MIT" 2387 | ], 2388 | "authors": [ 2389 | { 2390 | "name": "Konstantin Kudryashov", 2391 | "email": "ever.zet@gmail.com", 2392 | "homepage": "http://everzet.com" 2393 | }, 2394 | { 2395 | "name": "Marcello Duarte", 2396 | "email": "marcello.duarte@gmail.com" 2397 | } 2398 | ], 2399 | "description": "Highly opinionated mocking framework for PHP 5.3+", 2400 | "homepage": "https://github.com/phpspec/prophecy", 2401 | "keywords": [ 2402 | "Double", 2403 | "Dummy", 2404 | "fake", 2405 | "mock", 2406 | "spy", 2407 | "stub" 2408 | ], 2409 | "time": "2017-11-24T13:59:53+00:00" 2410 | }, 2411 | { 2412 | "name": "phpunit/php-code-coverage", 2413 | "version": "4.0.8", 2414 | "source": { 2415 | "type": "git", 2416 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 2417 | "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d" 2418 | }, 2419 | "dist": { 2420 | "type": "zip", 2421 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d", 2422 | "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d", 2423 | "shasum": "" 2424 | }, 2425 | "require": { 2426 | "ext-dom": "*", 2427 | "ext-xmlwriter": "*", 2428 | "php": "^5.6 || ^7.0", 2429 | "phpunit/php-file-iterator": "^1.3", 2430 | "phpunit/php-text-template": "^1.2", 2431 | "phpunit/php-token-stream": "^1.4.2 || ^2.0", 2432 | "sebastian/code-unit-reverse-lookup": "^1.0", 2433 | "sebastian/environment": "^1.3.2 || ^2.0", 2434 | "sebastian/version": "^1.0 || ^2.0" 2435 | }, 2436 | "require-dev": { 2437 | "ext-xdebug": "^2.1.4", 2438 | "phpunit/phpunit": "^5.7" 2439 | }, 2440 | "suggest": { 2441 | "ext-xdebug": "^2.5.1" 2442 | }, 2443 | "type": "library", 2444 | "extra": { 2445 | "branch-alias": { 2446 | "dev-master": "4.0.x-dev" 2447 | } 2448 | }, 2449 | "autoload": { 2450 | "classmap": [ 2451 | "src/" 2452 | ] 2453 | }, 2454 | "notification-url": "https://packagist.org/downloads/", 2455 | "license": [ 2456 | "BSD-3-Clause" 2457 | ], 2458 | "authors": [ 2459 | { 2460 | "name": "Sebastian Bergmann", 2461 | "email": "sb@sebastian-bergmann.de", 2462 | "role": "lead" 2463 | } 2464 | ], 2465 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 2466 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 2467 | "keywords": [ 2468 | "coverage", 2469 | "testing", 2470 | "xunit" 2471 | ], 2472 | "time": "2017-04-02T07:44:40+00:00" 2473 | }, 2474 | { 2475 | "name": "phpunit/php-file-iterator", 2476 | "version": "1.4.5", 2477 | "source": { 2478 | "type": "git", 2479 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 2480 | "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" 2481 | }, 2482 | "dist": { 2483 | "type": "zip", 2484 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", 2485 | "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", 2486 | "shasum": "" 2487 | }, 2488 | "require": { 2489 | "php": ">=5.3.3" 2490 | }, 2491 | "type": "library", 2492 | "extra": { 2493 | "branch-alias": { 2494 | "dev-master": "1.4.x-dev" 2495 | } 2496 | }, 2497 | "autoload": { 2498 | "classmap": [ 2499 | "src/" 2500 | ] 2501 | }, 2502 | "notification-url": "https://packagist.org/downloads/", 2503 | "license": [ 2504 | "BSD-3-Clause" 2505 | ], 2506 | "authors": [ 2507 | { 2508 | "name": "Sebastian Bergmann", 2509 | "email": "sb@sebastian-bergmann.de", 2510 | "role": "lead" 2511 | } 2512 | ], 2513 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 2514 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 2515 | "keywords": [ 2516 | "filesystem", 2517 | "iterator" 2518 | ], 2519 | "time": "2017-11-27T13:52:08+00:00" 2520 | }, 2521 | { 2522 | "name": "phpunit/php-text-template", 2523 | "version": "1.2.1", 2524 | "source": { 2525 | "type": "git", 2526 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 2527 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 2528 | }, 2529 | "dist": { 2530 | "type": "zip", 2531 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 2532 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 2533 | "shasum": "" 2534 | }, 2535 | "require": { 2536 | "php": ">=5.3.3" 2537 | }, 2538 | "type": "library", 2539 | "autoload": { 2540 | "classmap": [ 2541 | "src/" 2542 | ] 2543 | }, 2544 | "notification-url": "https://packagist.org/downloads/", 2545 | "license": [ 2546 | "BSD-3-Clause" 2547 | ], 2548 | "authors": [ 2549 | { 2550 | "name": "Sebastian Bergmann", 2551 | "email": "sebastian@phpunit.de", 2552 | "role": "lead" 2553 | } 2554 | ], 2555 | "description": "Simple template engine.", 2556 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 2557 | "keywords": [ 2558 | "template" 2559 | ], 2560 | "time": "2015-06-21T13:50:34+00:00" 2561 | }, 2562 | { 2563 | "name": "phpunit/php-timer", 2564 | "version": "1.0.9", 2565 | "source": { 2566 | "type": "git", 2567 | "url": "https://github.com/sebastianbergmann/php-timer.git", 2568 | "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" 2569 | }, 2570 | "dist": { 2571 | "type": "zip", 2572 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", 2573 | "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", 2574 | "shasum": "" 2575 | }, 2576 | "require": { 2577 | "php": "^5.3.3 || ^7.0" 2578 | }, 2579 | "require-dev": { 2580 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 2581 | }, 2582 | "type": "library", 2583 | "extra": { 2584 | "branch-alias": { 2585 | "dev-master": "1.0-dev" 2586 | } 2587 | }, 2588 | "autoload": { 2589 | "classmap": [ 2590 | "src/" 2591 | ] 2592 | }, 2593 | "notification-url": "https://packagist.org/downloads/", 2594 | "license": [ 2595 | "BSD-3-Clause" 2596 | ], 2597 | "authors": [ 2598 | { 2599 | "name": "Sebastian Bergmann", 2600 | "email": "sb@sebastian-bergmann.de", 2601 | "role": "lead" 2602 | } 2603 | ], 2604 | "description": "Utility class for timing", 2605 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 2606 | "keywords": [ 2607 | "timer" 2608 | ], 2609 | "time": "2017-02-26T11:10:40+00:00" 2610 | }, 2611 | { 2612 | "name": "phpunit/php-token-stream", 2613 | "version": "2.0.2", 2614 | "source": { 2615 | "type": "git", 2616 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 2617 | "reference": "791198a2c6254db10131eecfe8c06670700904db" 2618 | }, 2619 | "dist": { 2620 | "type": "zip", 2621 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db", 2622 | "reference": "791198a2c6254db10131eecfe8c06670700904db", 2623 | "shasum": "" 2624 | }, 2625 | "require": { 2626 | "ext-tokenizer": "*", 2627 | "php": "^7.0" 2628 | }, 2629 | "require-dev": { 2630 | "phpunit/phpunit": "^6.2.4" 2631 | }, 2632 | "type": "library", 2633 | "extra": { 2634 | "branch-alias": { 2635 | "dev-master": "2.0-dev" 2636 | } 2637 | }, 2638 | "autoload": { 2639 | "classmap": [ 2640 | "src/" 2641 | ] 2642 | }, 2643 | "notification-url": "https://packagist.org/downloads/", 2644 | "license": [ 2645 | "BSD-3-Clause" 2646 | ], 2647 | "authors": [ 2648 | { 2649 | "name": "Sebastian Bergmann", 2650 | "email": "sebastian@phpunit.de" 2651 | } 2652 | ], 2653 | "description": "Wrapper around PHP's tokenizer extension.", 2654 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 2655 | "keywords": [ 2656 | "tokenizer" 2657 | ], 2658 | "time": "2017-11-27T05:48:46+00:00" 2659 | }, 2660 | { 2661 | "name": "phpunit/phpunit", 2662 | "version": "5.7.26", 2663 | "source": { 2664 | "type": "git", 2665 | "url": "https://github.com/sebastianbergmann/phpunit.git", 2666 | "reference": "7fbc25c13309de0c4c9bb48b7361f1eca34c7fbd" 2667 | }, 2668 | "dist": { 2669 | "type": "zip", 2670 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7fbc25c13309de0c4c9bb48b7361f1eca34c7fbd", 2671 | "reference": "7fbc25c13309de0c4c9bb48b7361f1eca34c7fbd", 2672 | "shasum": "" 2673 | }, 2674 | "require": { 2675 | "ext-dom": "*", 2676 | "ext-json": "*", 2677 | "ext-libxml": "*", 2678 | "ext-mbstring": "*", 2679 | "ext-xml": "*", 2680 | "myclabs/deep-copy": "~1.3", 2681 | "php": "^5.6 || ^7.0", 2682 | "phpspec/prophecy": "^1.6.2", 2683 | "phpunit/php-code-coverage": "^4.0.4", 2684 | "phpunit/php-file-iterator": "~1.4", 2685 | "phpunit/php-text-template": "~1.2", 2686 | "phpunit/php-timer": "^1.0.6", 2687 | "phpunit/phpunit-mock-objects": "^3.2", 2688 | "sebastian/comparator": "^1.2.4", 2689 | "sebastian/diff": "^1.4.3", 2690 | "sebastian/environment": "^1.3.4 || ^2.0", 2691 | "sebastian/exporter": "~2.0", 2692 | "sebastian/global-state": "^1.1", 2693 | "sebastian/object-enumerator": "~2.0", 2694 | "sebastian/resource-operations": "~1.0", 2695 | "sebastian/version": "~1.0.3|~2.0", 2696 | "symfony/yaml": "~2.1|~3.0|~4.0" 2697 | }, 2698 | "conflict": { 2699 | "phpdocumentor/reflection-docblock": "3.0.2" 2700 | }, 2701 | "require-dev": { 2702 | "ext-pdo": "*" 2703 | }, 2704 | "suggest": { 2705 | "ext-xdebug": "*", 2706 | "phpunit/php-invoker": "~1.1" 2707 | }, 2708 | "bin": [ 2709 | "phpunit" 2710 | ], 2711 | "type": "library", 2712 | "extra": { 2713 | "branch-alias": { 2714 | "dev-master": "5.7.x-dev" 2715 | } 2716 | }, 2717 | "autoload": { 2718 | "classmap": [ 2719 | "src/" 2720 | ] 2721 | }, 2722 | "notification-url": "https://packagist.org/downloads/", 2723 | "license": [ 2724 | "BSD-3-Clause" 2725 | ], 2726 | "authors": [ 2727 | { 2728 | "name": "Sebastian Bergmann", 2729 | "email": "sebastian@phpunit.de", 2730 | "role": "lead" 2731 | } 2732 | ], 2733 | "description": "The PHP Unit Testing framework.", 2734 | "homepage": "https://phpunit.de/", 2735 | "keywords": [ 2736 | "phpunit", 2737 | "testing", 2738 | "xunit" 2739 | ], 2740 | "time": "2017-12-17T06:14:38+00:00" 2741 | }, 2742 | { 2743 | "name": "phpunit/phpunit-mock-objects", 2744 | "version": "3.4.4", 2745 | "source": { 2746 | "type": "git", 2747 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", 2748 | "reference": "a23b761686d50a560cc56233b9ecf49597cc9118" 2749 | }, 2750 | "dist": { 2751 | "type": "zip", 2752 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118", 2753 | "reference": "a23b761686d50a560cc56233b9ecf49597cc9118", 2754 | "shasum": "" 2755 | }, 2756 | "require": { 2757 | "doctrine/instantiator": "^1.0.2", 2758 | "php": "^5.6 || ^7.0", 2759 | "phpunit/php-text-template": "^1.2", 2760 | "sebastian/exporter": "^1.2 || ^2.0" 2761 | }, 2762 | "conflict": { 2763 | "phpunit/phpunit": "<5.4.0" 2764 | }, 2765 | "require-dev": { 2766 | "phpunit/phpunit": "^5.4" 2767 | }, 2768 | "suggest": { 2769 | "ext-soap": "*" 2770 | }, 2771 | "type": "library", 2772 | "extra": { 2773 | "branch-alias": { 2774 | "dev-master": "3.2.x-dev" 2775 | } 2776 | }, 2777 | "autoload": { 2778 | "classmap": [ 2779 | "src/" 2780 | ] 2781 | }, 2782 | "notification-url": "https://packagist.org/downloads/", 2783 | "license": [ 2784 | "BSD-3-Clause" 2785 | ], 2786 | "authors": [ 2787 | { 2788 | "name": "Sebastian Bergmann", 2789 | "email": "sb@sebastian-bergmann.de", 2790 | "role": "lead" 2791 | } 2792 | ], 2793 | "description": "Mock Object library for PHPUnit", 2794 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 2795 | "keywords": [ 2796 | "mock", 2797 | "xunit" 2798 | ], 2799 | "time": "2017-06-30T09:13:00+00:00" 2800 | }, 2801 | { 2802 | "name": "sebastian/code-unit-reverse-lookup", 2803 | "version": "1.0.1", 2804 | "source": { 2805 | "type": "git", 2806 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 2807 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" 2808 | }, 2809 | "dist": { 2810 | "type": "zip", 2811 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 2812 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 2813 | "shasum": "" 2814 | }, 2815 | "require": { 2816 | "php": "^5.6 || ^7.0" 2817 | }, 2818 | "require-dev": { 2819 | "phpunit/phpunit": "^5.7 || ^6.0" 2820 | }, 2821 | "type": "library", 2822 | "extra": { 2823 | "branch-alias": { 2824 | "dev-master": "1.0.x-dev" 2825 | } 2826 | }, 2827 | "autoload": { 2828 | "classmap": [ 2829 | "src/" 2830 | ] 2831 | }, 2832 | "notification-url": "https://packagist.org/downloads/", 2833 | "license": [ 2834 | "BSD-3-Clause" 2835 | ], 2836 | "authors": [ 2837 | { 2838 | "name": "Sebastian Bergmann", 2839 | "email": "sebastian@phpunit.de" 2840 | } 2841 | ], 2842 | "description": "Looks up which function or method a line of code belongs to", 2843 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 2844 | "time": "2017-03-04T06:30:41+00:00" 2845 | }, 2846 | { 2847 | "name": "sebastian/comparator", 2848 | "version": "1.2.4", 2849 | "source": { 2850 | "type": "git", 2851 | "url": "https://github.com/sebastianbergmann/comparator.git", 2852 | "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" 2853 | }, 2854 | "dist": { 2855 | "type": "zip", 2856 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", 2857 | "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", 2858 | "shasum": "" 2859 | }, 2860 | "require": { 2861 | "php": ">=5.3.3", 2862 | "sebastian/diff": "~1.2", 2863 | "sebastian/exporter": "~1.2 || ~2.0" 2864 | }, 2865 | "require-dev": { 2866 | "phpunit/phpunit": "~4.4" 2867 | }, 2868 | "type": "library", 2869 | "extra": { 2870 | "branch-alias": { 2871 | "dev-master": "1.2.x-dev" 2872 | } 2873 | }, 2874 | "autoload": { 2875 | "classmap": [ 2876 | "src/" 2877 | ] 2878 | }, 2879 | "notification-url": "https://packagist.org/downloads/", 2880 | "license": [ 2881 | "BSD-3-Clause" 2882 | ], 2883 | "authors": [ 2884 | { 2885 | "name": "Jeff Welch", 2886 | "email": "whatthejeff@gmail.com" 2887 | }, 2888 | { 2889 | "name": "Volker Dusch", 2890 | "email": "github@wallbash.com" 2891 | }, 2892 | { 2893 | "name": "Bernhard Schussek", 2894 | "email": "bschussek@2bepublished.at" 2895 | }, 2896 | { 2897 | "name": "Sebastian Bergmann", 2898 | "email": "sebastian@phpunit.de" 2899 | } 2900 | ], 2901 | "description": "Provides the functionality to compare PHP values for equality", 2902 | "homepage": "http://www.github.com/sebastianbergmann/comparator", 2903 | "keywords": [ 2904 | "comparator", 2905 | "compare", 2906 | "equality" 2907 | ], 2908 | "time": "2017-01-29T09:50:25+00:00" 2909 | }, 2910 | { 2911 | "name": "sebastian/diff", 2912 | "version": "1.4.3", 2913 | "source": { 2914 | "type": "git", 2915 | "url": "https://github.com/sebastianbergmann/diff.git", 2916 | "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4" 2917 | }, 2918 | "dist": { 2919 | "type": "zip", 2920 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4", 2921 | "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4", 2922 | "shasum": "" 2923 | }, 2924 | "require": { 2925 | "php": "^5.3.3 || ^7.0" 2926 | }, 2927 | "require-dev": { 2928 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 2929 | }, 2930 | "type": "library", 2931 | "extra": { 2932 | "branch-alias": { 2933 | "dev-master": "1.4-dev" 2934 | } 2935 | }, 2936 | "autoload": { 2937 | "classmap": [ 2938 | "src/" 2939 | ] 2940 | }, 2941 | "notification-url": "https://packagist.org/downloads/", 2942 | "license": [ 2943 | "BSD-3-Clause" 2944 | ], 2945 | "authors": [ 2946 | { 2947 | "name": "Kore Nordmann", 2948 | "email": "mail@kore-nordmann.de" 2949 | }, 2950 | { 2951 | "name": "Sebastian Bergmann", 2952 | "email": "sebastian@phpunit.de" 2953 | } 2954 | ], 2955 | "description": "Diff implementation", 2956 | "homepage": "https://github.com/sebastianbergmann/diff", 2957 | "keywords": [ 2958 | "diff" 2959 | ], 2960 | "time": "2017-05-22T07:24:03+00:00" 2961 | }, 2962 | { 2963 | "name": "sebastian/environment", 2964 | "version": "2.0.0", 2965 | "source": { 2966 | "type": "git", 2967 | "url": "https://github.com/sebastianbergmann/environment.git", 2968 | "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac" 2969 | }, 2970 | "dist": { 2971 | "type": "zip", 2972 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac", 2973 | "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac", 2974 | "shasum": "" 2975 | }, 2976 | "require": { 2977 | "php": "^5.6 || ^7.0" 2978 | }, 2979 | "require-dev": { 2980 | "phpunit/phpunit": "^5.0" 2981 | }, 2982 | "type": "library", 2983 | "extra": { 2984 | "branch-alias": { 2985 | "dev-master": "2.0.x-dev" 2986 | } 2987 | }, 2988 | "autoload": { 2989 | "classmap": [ 2990 | "src/" 2991 | ] 2992 | }, 2993 | "notification-url": "https://packagist.org/downloads/", 2994 | "license": [ 2995 | "BSD-3-Clause" 2996 | ], 2997 | "authors": [ 2998 | { 2999 | "name": "Sebastian Bergmann", 3000 | "email": "sebastian@phpunit.de" 3001 | } 3002 | ], 3003 | "description": "Provides functionality to handle HHVM/PHP environments", 3004 | "homepage": "http://www.github.com/sebastianbergmann/environment", 3005 | "keywords": [ 3006 | "Xdebug", 3007 | "environment", 3008 | "hhvm" 3009 | ], 3010 | "time": "2016-11-26T07:53:53+00:00" 3011 | }, 3012 | { 3013 | "name": "sebastian/exporter", 3014 | "version": "2.0.0", 3015 | "source": { 3016 | "type": "git", 3017 | "url": "https://github.com/sebastianbergmann/exporter.git", 3018 | "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4" 3019 | }, 3020 | "dist": { 3021 | "type": "zip", 3022 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", 3023 | "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", 3024 | "shasum": "" 3025 | }, 3026 | "require": { 3027 | "php": ">=5.3.3", 3028 | "sebastian/recursion-context": "~2.0" 3029 | }, 3030 | "require-dev": { 3031 | "ext-mbstring": "*", 3032 | "phpunit/phpunit": "~4.4" 3033 | }, 3034 | "type": "library", 3035 | "extra": { 3036 | "branch-alias": { 3037 | "dev-master": "2.0.x-dev" 3038 | } 3039 | }, 3040 | "autoload": { 3041 | "classmap": [ 3042 | "src/" 3043 | ] 3044 | }, 3045 | "notification-url": "https://packagist.org/downloads/", 3046 | "license": [ 3047 | "BSD-3-Clause" 3048 | ], 3049 | "authors": [ 3050 | { 3051 | "name": "Jeff Welch", 3052 | "email": "whatthejeff@gmail.com" 3053 | }, 3054 | { 3055 | "name": "Volker Dusch", 3056 | "email": "github@wallbash.com" 3057 | }, 3058 | { 3059 | "name": "Bernhard Schussek", 3060 | "email": "bschussek@2bepublished.at" 3061 | }, 3062 | { 3063 | "name": "Sebastian Bergmann", 3064 | "email": "sebastian@phpunit.de" 3065 | }, 3066 | { 3067 | "name": "Adam Harvey", 3068 | "email": "aharvey@php.net" 3069 | } 3070 | ], 3071 | "description": "Provides the functionality to export PHP variables for visualization", 3072 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 3073 | "keywords": [ 3074 | "export", 3075 | "exporter" 3076 | ], 3077 | "time": "2016-11-19T08:54:04+00:00" 3078 | }, 3079 | { 3080 | "name": "sebastian/global-state", 3081 | "version": "1.1.1", 3082 | "source": { 3083 | "type": "git", 3084 | "url": "https://github.com/sebastianbergmann/global-state.git", 3085 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" 3086 | }, 3087 | "dist": { 3088 | "type": "zip", 3089 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", 3090 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", 3091 | "shasum": "" 3092 | }, 3093 | "require": { 3094 | "php": ">=5.3.3" 3095 | }, 3096 | "require-dev": { 3097 | "phpunit/phpunit": "~4.2" 3098 | }, 3099 | "suggest": { 3100 | "ext-uopz": "*" 3101 | }, 3102 | "type": "library", 3103 | "extra": { 3104 | "branch-alias": { 3105 | "dev-master": "1.0-dev" 3106 | } 3107 | }, 3108 | "autoload": { 3109 | "classmap": [ 3110 | "src/" 3111 | ] 3112 | }, 3113 | "notification-url": "https://packagist.org/downloads/", 3114 | "license": [ 3115 | "BSD-3-Clause" 3116 | ], 3117 | "authors": [ 3118 | { 3119 | "name": "Sebastian Bergmann", 3120 | "email": "sebastian@phpunit.de" 3121 | } 3122 | ], 3123 | "description": "Snapshotting of global state", 3124 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 3125 | "keywords": [ 3126 | "global state" 3127 | ], 3128 | "time": "2015-10-12T03:26:01+00:00" 3129 | }, 3130 | { 3131 | "name": "sebastian/object-enumerator", 3132 | "version": "2.0.1", 3133 | "source": { 3134 | "type": "git", 3135 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 3136 | "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7" 3137 | }, 3138 | "dist": { 3139 | "type": "zip", 3140 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7", 3141 | "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7", 3142 | "shasum": "" 3143 | }, 3144 | "require": { 3145 | "php": ">=5.6", 3146 | "sebastian/recursion-context": "~2.0" 3147 | }, 3148 | "require-dev": { 3149 | "phpunit/phpunit": "~5" 3150 | }, 3151 | "type": "library", 3152 | "extra": { 3153 | "branch-alias": { 3154 | "dev-master": "2.0.x-dev" 3155 | } 3156 | }, 3157 | "autoload": { 3158 | "classmap": [ 3159 | "src/" 3160 | ] 3161 | }, 3162 | "notification-url": "https://packagist.org/downloads/", 3163 | "license": [ 3164 | "BSD-3-Clause" 3165 | ], 3166 | "authors": [ 3167 | { 3168 | "name": "Sebastian Bergmann", 3169 | "email": "sebastian@phpunit.de" 3170 | } 3171 | ], 3172 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 3173 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 3174 | "time": "2017-02-18T15:18:39+00:00" 3175 | }, 3176 | { 3177 | "name": "sebastian/recursion-context", 3178 | "version": "2.0.0", 3179 | "source": { 3180 | "type": "git", 3181 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 3182 | "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a" 3183 | }, 3184 | "dist": { 3185 | "type": "zip", 3186 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a", 3187 | "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a", 3188 | "shasum": "" 3189 | }, 3190 | "require": { 3191 | "php": ">=5.3.3" 3192 | }, 3193 | "require-dev": { 3194 | "phpunit/phpunit": "~4.4" 3195 | }, 3196 | "type": "library", 3197 | "extra": { 3198 | "branch-alias": { 3199 | "dev-master": "2.0.x-dev" 3200 | } 3201 | }, 3202 | "autoload": { 3203 | "classmap": [ 3204 | "src/" 3205 | ] 3206 | }, 3207 | "notification-url": "https://packagist.org/downloads/", 3208 | "license": [ 3209 | "BSD-3-Clause" 3210 | ], 3211 | "authors": [ 3212 | { 3213 | "name": "Jeff Welch", 3214 | "email": "whatthejeff@gmail.com" 3215 | }, 3216 | { 3217 | "name": "Sebastian Bergmann", 3218 | "email": "sebastian@phpunit.de" 3219 | }, 3220 | { 3221 | "name": "Adam Harvey", 3222 | "email": "aharvey@php.net" 3223 | } 3224 | ], 3225 | "description": "Provides functionality to recursively process PHP variables", 3226 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 3227 | "time": "2016-11-19T07:33:16+00:00" 3228 | }, 3229 | { 3230 | "name": "sebastian/resource-operations", 3231 | "version": "1.0.0", 3232 | "source": { 3233 | "type": "git", 3234 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 3235 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" 3236 | }, 3237 | "dist": { 3238 | "type": "zip", 3239 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 3240 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 3241 | "shasum": "" 3242 | }, 3243 | "require": { 3244 | "php": ">=5.6.0" 3245 | }, 3246 | "type": "library", 3247 | "extra": { 3248 | "branch-alias": { 3249 | "dev-master": "1.0.x-dev" 3250 | } 3251 | }, 3252 | "autoload": { 3253 | "classmap": [ 3254 | "src/" 3255 | ] 3256 | }, 3257 | "notification-url": "https://packagist.org/downloads/", 3258 | "license": [ 3259 | "BSD-3-Clause" 3260 | ], 3261 | "authors": [ 3262 | { 3263 | "name": "Sebastian Bergmann", 3264 | "email": "sebastian@phpunit.de" 3265 | } 3266 | ], 3267 | "description": "Provides a list of PHP built-in functions that operate on resources", 3268 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 3269 | "time": "2015-07-28T20:34:47+00:00" 3270 | }, 3271 | { 3272 | "name": "sebastian/version", 3273 | "version": "2.0.1", 3274 | "source": { 3275 | "type": "git", 3276 | "url": "https://github.com/sebastianbergmann/version.git", 3277 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 3278 | }, 3279 | "dist": { 3280 | "type": "zip", 3281 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 3282 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 3283 | "shasum": "" 3284 | }, 3285 | "require": { 3286 | "php": ">=5.6" 3287 | }, 3288 | "type": "library", 3289 | "extra": { 3290 | "branch-alias": { 3291 | "dev-master": "2.0.x-dev" 3292 | } 3293 | }, 3294 | "autoload": { 3295 | "classmap": [ 3296 | "src/" 3297 | ] 3298 | }, 3299 | "notification-url": "https://packagist.org/downloads/", 3300 | "license": [ 3301 | "BSD-3-Clause" 3302 | ], 3303 | "authors": [ 3304 | { 3305 | "name": "Sebastian Bergmann", 3306 | "email": "sebastian@phpunit.de", 3307 | "role": "lead" 3308 | } 3309 | ], 3310 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 3311 | "homepage": "https://github.com/sebastianbergmann/version", 3312 | "time": "2016-10-03T07:35:21+00:00" 3313 | }, 3314 | { 3315 | "name": "symfony/expression-language", 3316 | "version": "v3.4.2", 3317 | "source": { 3318 | "type": "git", 3319 | "url": "https://github.com/symfony/expression-language.git", 3320 | "reference": "c4b195436a74d9672d8463e4d427ca42449238e5" 3321 | }, 3322 | "dist": { 3323 | "type": "zip", 3324 | "url": "https://api.github.com/repos/symfony/expression-language/zipball/c4b195436a74d9672d8463e4d427ca42449238e5", 3325 | "reference": "c4b195436a74d9672d8463e4d427ca42449238e5", 3326 | "shasum": "" 3327 | }, 3328 | "require": { 3329 | "php": "^5.5.9|>=7.0.8", 3330 | "symfony/cache": "~3.1|~4.0" 3331 | }, 3332 | "type": "library", 3333 | "extra": { 3334 | "branch-alias": { 3335 | "dev-master": "3.4-dev" 3336 | } 3337 | }, 3338 | "autoload": { 3339 | "psr-4": { 3340 | "Symfony\\Component\\ExpressionLanguage\\": "" 3341 | }, 3342 | "exclude-from-classmap": [ 3343 | "/Tests/" 3344 | ] 3345 | }, 3346 | "notification-url": "https://packagist.org/downloads/", 3347 | "license": [ 3348 | "MIT" 3349 | ], 3350 | "authors": [ 3351 | { 3352 | "name": "Fabien Potencier", 3353 | "email": "fabien@symfony.com" 3354 | }, 3355 | { 3356 | "name": "Symfony Community", 3357 | "homepage": "https://symfony.com/contributors" 3358 | } 3359 | ], 3360 | "description": "Symfony ExpressionLanguage Component", 3361 | "homepage": "https://symfony.com", 3362 | "time": "2017-12-08T15:24:53+00:00" 3363 | }, 3364 | { 3365 | "name": "symfony/phpunit-bridge", 3366 | "version": "v4.0.2", 3367 | "source": { 3368 | "type": "git", 3369 | "url": "https://github.com/symfony/phpunit-bridge.git", 3370 | "reference": "61c84ebdce0d4c289413a222ee545f0114e60120" 3371 | }, 3372 | "dist": { 3373 | "type": "zip", 3374 | "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/61c84ebdce0d4c289413a222ee545f0114e60120", 3375 | "reference": "61c84ebdce0d4c289413a222ee545f0114e60120", 3376 | "shasum": "" 3377 | }, 3378 | "require": { 3379 | "php": ">=5.3.3" 3380 | }, 3381 | "conflict": { 3382 | "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" 3383 | }, 3384 | "suggest": { 3385 | "ext-zip": "Zip support is required when using bin/simple-phpunit", 3386 | "symfony/debug": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" 3387 | }, 3388 | "bin": [ 3389 | "bin/simple-phpunit" 3390 | ], 3391 | "type": "symfony-bridge", 3392 | "extra": { 3393 | "branch-alias": { 3394 | "dev-master": "4.0-dev" 3395 | } 3396 | }, 3397 | "autoload": { 3398 | "files": [ 3399 | "bootstrap.php" 3400 | ], 3401 | "psr-4": { 3402 | "Symfony\\Bridge\\PhpUnit\\": "" 3403 | }, 3404 | "exclude-from-classmap": [ 3405 | "/Tests/" 3406 | ] 3407 | }, 3408 | "notification-url": "https://packagist.org/downloads/", 3409 | "license": [ 3410 | "MIT" 3411 | ], 3412 | "authors": [ 3413 | { 3414 | "name": "Nicolas Grekas", 3415 | "email": "p@tchwork.com" 3416 | }, 3417 | { 3418 | "name": "Symfony Community", 3419 | "homepage": "https://symfony.com/contributors" 3420 | } 3421 | ], 3422 | "description": "Symfony PHPUnit Bridge", 3423 | "homepage": "https://symfony.com", 3424 | "time": "2017-12-14T19:48:22+00:00" 3425 | }, 3426 | { 3427 | "name": "symfony/process", 3428 | "version": "v3.4.2", 3429 | "source": { 3430 | "type": "git", 3431 | "url": "https://github.com/symfony/process.git", 3432 | "reference": "bb3ef65d493a6d57297cad6c560ee04e2a8f5098" 3433 | }, 3434 | "dist": { 3435 | "type": "zip", 3436 | "url": "https://api.github.com/repos/symfony/process/zipball/bb3ef65d493a6d57297cad6c560ee04e2a8f5098", 3437 | "reference": "bb3ef65d493a6d57297cad6c560ee04e2a8f5098", 3438 | "shasum": "" 3439 | }, 3440 | "require": { 3441 | "php": "^5.5.9|>=7.0.8" 3442 | }, 3443 | "type": "library", 3444 | "extra": { 3445 | "branch-alias": { 3446 | "dev-master": "3.4-dev" 3447 | } 3448 | }, 3449 | "autoload": { 3450 | "psr-4": { 3451 | "Symfony\\Component\\Process\\": "" 3452 | }, 3453 | "exclude-from-classmap": [ 3454 | "/Tests/" 3455 | ] 3456 | }, 3457 | "notification-url": "https://packagist.org/downloads/", 3458 | "license": [ 3459 | "MIT" 3460 | ], 3461 | "authors": [ 3462 | { 3463 | "name": "Fabien Potencier", 3464 | "email": "fabien@symfony.com" 3465 | }, 3466 | { 3467 | "name": "Symfony Community", 3468 | "homepage": "https://symfony.com/contributors" 3469 | } 3470 | ], 3471 | "description": "Symfony Process Component", 3472 | "homepage": "https://symfony.com", 3473 | "time": "2017-12-14T19:40:10+00:00" 3474 | }, 3475 | { 3476 | "name": "symfony/yaml", 3477 | "version": "v4.0.2", 3478 | "source": { 3479 | "type": "git", 3480 | "url": "https://github.com/symfony/yaml.git", 3481 | "reference": "a5ee52d155f06ad23b19eb63c31228ff56ad1116" 3482 | }, 3483 | "dist": { 3484 | "type": "zip", 3485 | "url": "https://api.github.com/repos/symfony/yaml/zipball/a5ee52d155f06ad23b19eb63c31228ff56ad1116", 3486 | "reference": "a5ee52d155f06ad23b19eb63c31228ff56ad1116", 3487 | "shasum": "" 3488 | }, 3489 | "require": { 3490 | "php": "^7.1.3" 3491 | }, 3492 | "conflict": { 3493 | "symfony/console": "<3.4" 3494 | }, 3495 | "require-dev": { 3496 | "symfony/console": "~3.4|~4.0" 3497 | }, 3498 | "suggest": { 3499 | "symfony/console": "For validating YAML files using the lint command" 3500 | }, 3501 | "type": "library", 3502 | "extra": { 3503 | "branch-alias": { 3504 | "dev-master": "4.0-dev" 3505 | } 3506 | }, 3507 | "autoload": { 3508 | "psr-4": { 3509 | "Symfony\\Component\\Yaml\\": "" 3510 | }, 3511 | "exclude-from-classmap": [ 3512 | "/Tests/" 3513 | ] 3514 | }, 3515 | "notification-url": "https://packagist.org/downloads/", 3516 | "license": [ 3517 | "MIT" 3518 | ], 3519 | "authors": [ 3520 | { 3521 | "name": "Fabien Potencier", 3522 | "email": "fabien@symfony.com" 3523 | }, 3524 | { 3525 | "name": "Symfony Community", 3526 | "homepage": "https://symfony.com/contributors" 3527 | } 3528 | ], 3529 | "description": "Symfony Yaml Component", 3530 | "homepage": "https://symfony.com", 3531 | "time": "2017-12-12T08:41:51+00:00" 3532 | }, 3533 | { 3534 | "name": "webmozart/assert", 3535 | "version": "1.2.0", 3536 | "source": { 3537 | "type": "git", 3538 | "url": "https://github.com/webmozart/assert.git", 3539 | "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" 3540 | }, 3541 | "dist": { 3542 | "type": "zip", 3543 | "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", 3544 | "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", 3545 | "shasum": "" 3546 | }, 3547 | "require": { 3548 | "php": "^5.3.3 || ^7.0" 3549 | }, 3550 | "require-dev": { 3551 | "phpunit/phpunit": "^4.6", 3552 | "sebastian/version": "^1.0.1" 3553 | }, 3554 | "type": "library", 3555 | "extra": { 3556 | "branch-alias": { 3557 | "dev-master": "1.3-dev" 3558 | } 3559 | }, 3560 | "autoload": { 3561 | "psr-4": { 3562 | "Webmozart\\Assert\\": "src/" 3563 | } 3564 | }, 3565 | "notification-url": "https://packagist.org/downloads/", 3566 | "license": [ 3567 | "MIT" 3568 | ], 3569 | "authors": [ 3570 | { 3571 | "name": "Bernhard Schussek", 3572 | "email": "bschussek@gmail.com" 3573 | } 3574 | ], 3575 | "description": "Assertions to validate method input/output with nice error messages.", 3576 | "keywords": [ 3577 | "assert", 3578 | "check", 3579 | "validate" 3580 | ], 3581 | "time": "2016-11-23T20:04:58+00:00" 3582 | } 3583 | ], 3584 | "aliases": [], 3585 | "minimum-stability": "stable", 3586 | "stability-flags": { 3587 | "roave/security-advisories": 20 3588 | }, 3589 | "prefer-stable": false, 3590 | "prefer-lowest": false, 3591 | "platform": [], 3592 | "platform-dev": [] 3593 | } 3594 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | ./Tests/ 14 | 15 | 16 | 17 | 18 | 19 | 20 | ./ 21 | 22 | ./Resources 23 | ./Tests 24 | ./vendor 25 | ./build 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | --------------------------------------------------------------------------------