Skip to content

Commit

Permalink
Update with released stable Nette version
Browse files Browse the repository at this point in the history
  • Loading branch information
PavelJurasek committed Apr 8, 2019
1 parent 7743191 commit 0c09f5a
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 30 deletions.
6 changes: 3 additions & 3 deletions composer.json
Expand Up @@ -24,17 +24,17 @@
},
"require": {
"php": "^7.1",
"nette/di": "^3.0-RC",
"nette/di": "^3.0",
"nette/utils": "^3.0",
"nette/reflection": "^2.4"
},
"require-dev": {
"kdyby/coding-standard": "^1.0@dev",
"nette/application": "^3.0-RC3",
"nette/application": "^3.0",
"nette/bootstrap": "^3.0",
"nette/caching": "^3.0",
"nette/security": "^3.0",
"nette/http": "^3.0-RC",
"nette/http": "^3.0",
"tracy/tracy": "^2.5",
"symfony/event-dispatcher": "^3.0 || ^4.0",
"nette/tester": "^2.2",
Expand Down
65 changes: 41 additions & 24 deletions src/Events/DI/EventsExtension.php
Expand Up @@ -19,9 +19,7 @@
use Kdyby\Events\SymfonyDispatcher;
use Nette\Configurator;
use Nette\DI\Compiler;
use Nette\DI\Config\Helpers as DIConfigHelpers;
use Nette\DI\Config\Helpers;
use Nette\DI\Config\Processor;
use Nette\DI\Container as DIContainer;
use Nette\DI\ContainerBuilder as DIContainerBuilder;
use Nette\DI\Definitions\AccessorDefinition;
Expand All @@ -31,7 +29,7 @@
use Nette\DI\Definitions\Reference;
use Nette\DI\Definitions\ServiceDefinition;
use Nette\DI\Definitions\Statement;
use Nette\DI\Resolver;
use Nette\DI\Helpers as DIHelpers;
use Nette\PhpGenerator\ClassType as ClassTypeGenerator;
use Nette\PhpGenerator\Helpers as GeneratorHelpers;
use Nette\PhpGenerator\PhpLiteral;
Expand Down Expand Up @@ -88,8 +86,10 @@ public function loadConfiguration()
$this->allowedManagerSetup = [];

$builder = $this->getContainerBuilder();
/** @var array $config */
$config = Helpers::merge($this->getConfig(), $this->defaults);

/** @var array $userConfig */
$userConfig = $this->getConfig();
if (!array_key_exists('debugger', $userConfig)) {
if (in_array(php_sapi_name(), ['cli', 'phpdbg'], TRUE)) {
Expand All @@ -101,11 +101,11 @@ public function loadConfiguration()
}

$evm = $builder->addDefinition($this->prefix('manager'))
->setClass(EventManager::class);
->setType(EventManager::class);
if ($config['debugger']) {
$defaults = ['dispatchTree' => FALSE, 'dispatchLog' => TRUE, 'events' => TRUE, 'listeners' => FALSE];
if (is_array($config['debugger'])) {
$config['debugger'] = DIConfigHelpers::merge($config['debugger'], $defaults);
$config['debugger'] = Helpers::merge($config['debugger'], $defaults);
} else {
$config['debugger'] = $config['debugger'] !== self::PANEL_COUNT_MODE;
}
Expand All @@ -121,18 +121,18 @@ public function loadConfiguration()
foreach ($config['subscribers'] as $i => $subscriber) {
$def = $builder->addDefinition($this->prefix('subscriber.' . $i));

$def->setFactory(Processor::processArguments([
$def->setFactory(DIHelpers::filterArguments([
is_string($subscriber) ? new Statement($subscriber) : $subscriber,
])[0]);

// [$subscriberClass] = (array) $builder->normalizeEntity($def->getEntity());
/** @var string $subscriberClass */
$subscriberClass = $def->getEntity();
if (class_exists($subscriberClass)) {
$def->setClass($subscriberClass);
$def->setType($subscriberClass);
}

$def->setAutowired(FALSE);
$def->addTag(self::SUBSCRIBER_TAG);
$def->addTag(self::TAG_SUBSCRIBER);
}

if (class_exists(SymfonyEvent::class)) {
Expand All @@ -149,8 +149,9 @@ public function beforeCompile()
$builder = $this->getContainerBuilder();
$config = $this->loadedConfig;

/** @var \Nette\DI\Definitions\ServiceDefinition $manager */
$manager = $builder->getDefinition($this->prefix('manager'));
foreach (array_keys($builder->findByTag(self::SUBSCRIBER_TAG)) as $serviceName) {
foreach (array_keys($builder->findByTag(self::TAG_SUBSCRIBER)) as $serviceName) {
$manager->addSetup('addEventSubscriber', ['@' . $serviceName]);
}

Expand Down Expand Up @@ -219,7 +220,7 @@ public function afterCompile(ClassTypeGenerator $class)
* @param \Nette\DI\ServiceDefinition $manager
* @throws \Nette\Utils\AssertionException
*/
private function validateSubscribers(DIContainerBuilder $builder, ServiceDefinition $manager)
private function validateSubscribers(DIContainerBuilder $builder, Definition $manager)
{
foreach ($manager->getSetup() as $stt) {
if ($stt->getEntity() !== 'addEventSubscriber') {
Expand All @@ -233,7 +234,17 @@ private function validateSubscribers(DIContainerBuilder $builder, ServiceDefinit
$serviceName = $argument->getValue();
$def = $builder->getDefinition($serviceName);
} elseif ($argument instanceof Statement) {
$serviceName = (string) $argument->getEntity();
$entity = $argument->getEntity();

if ($entity instanceof Definition) {
$serviceName = $entity->getName();
} elseif ($entity instanceof Reference) {
$serviceName = $entity->getValue();
} elseif (is_array($entity)) {
$serviceName = $entity[0];
} else {
$serviceName = (string) $entity;
}
$def = $builder->getDefinition($serviceName);
} else {
$serviceName = ltrim($argument, '@');
Expand Down Expand Up @@ -322,13 +333,13 @@ private function validateSubscribers(DIContainerBuilder $builder, ServiceDefinit
private function isAlias(Definition $definition)
{
if ($definition instanceof ServiceDefinition) {
return $definition->getFactory() && (
$definition->getEntity() instanceof Reference
return $definition->getFactory()->getEntity() !== NULL && (
$definition->getFactory()->getEntity() instanceof Reference
|| (is_string($definition->getEntity()) && substr($definition->getEntity(), 0, 1) === '@')
);
}

return $definition instanceof Reference;
return FALSE;
}

/**
Expand All @@ -340,33 +351,37 @@ private function autowireEvents(DIContainerBuilder $builder)
if ($def instanceof ImportedDefinition) {
continue;
}

/** @var \Nette\DI\Definitions\ServiceDefinition $def */
if ($this->isAlias($def)) {
continue; // alias
}

$class = $def->getType();
if (!class_exists($class)) {
if ($class === NULL || !class_exists($class)) {
if ($def instanceof AccessorDefinition) {
continue;
}

if ($def instanceof FactoryDefinition && !$def->getResultDefinition()->getFactory()) {
if ($def instanceof FactoryDefinition && $def->getResultDefinition()->getFactory()->getEntity() === NULL) {
continue;
}

if ($def instanceof FactoryDefinition) {
$class = $def->getResultDefinition()->getEntity();
} else {
$entity = $def->getResultDefinition()->getEntity();
$class = $entity instanceof Definition ? $entity->getType() : $entity;
} elseif ($def instanceof ServiceDefinition) {
/** @var string $class */
$class = $def->getEntity();
} else {
continue;
}

if (is_array($class)) {
continue;
}

if (!class_exists($class)) {
if ($class === NULL || !class_exists($class)) {
continue;
}
}
Expand All @@ -380,6 +395,7 @@ private function autowireEvents(DIContainerBuilder $builder)

protected function bindEventProperties(Definition $def, ClassTypeReflection $class)
{
/** @var \Nette\DI\Definitions\ServiceDefinition $def */
$def = $def instanceof FactoryDefinition ? $def->getResultDefinition() : $def;

foreach ($class->getProperties(ReflectionProperty::IS_PUBLIC) as $property) {
Expand Down Expand Up @@ -438,8 +454,9 @@ private function optimizeListeners(DIContainerBuilder $builder)
$listeners[$id] = array_unique($subscribers);
}

$builder->getDefinition($this->prefix('manager'))
->setFactory(LazyEventManager::class, [$listeners])
/** @var \Nette\DI\Definitions\ServiceDefinition $manager */
$manager = $builder->getDefinition($this->prefix('manager'));
$manager->setFactory(LazyEventManager::class, [$listeners])
->setSetup($this->allowedManagerSetup);
}

Expand All @@ -449,7 +466,7 @@ private function optimizeListeners(DIContainerBuilder $builder)
*/
private function filterArgs($statement)
{
return Processor::processArguments([is_string($statement) ? new Statement($statement) : $statement]);
return DIHelpers::filterArguments([is_string($statement) ? new Statement($statement) : $statement]);
}

/**
Expand Down
6 changes: 3 additions & 3 deletions src/Events/Diagnostics/Panel.php
Expand Up @@ -412,12 +412,12 @@ private function getClassMap()
return $this->registeredClasses;
}

$refl = new ReflectionProperty(DIContainer::class, 'meta');
$refl = new ReflectionProperty(DIContainer::class, 'types');
$refl->setAccessible(TRUE);
$meta = $refl->getValue($this->sl);
$types = $refl->getValue($this->sl);

$this->registeredClasses = [];
foreach ($meta[DIContainer::TYPES] as $type => $serviceIds) {
foreach ($types as $type => $serviceIds) {
if (isset($this->registeredClasses[$type])) {
$this->registeredClasses[$type] = FALSE;
continue;
Expand Down
50 changes: 50 additions & 0 deletions tests/KdybyTests/Events/PanelTest.phpt
@@ -0,0 +1,50 @@
<?php

/**
* Test: Kdyby\Events\Event.
*
* @testCase
*/

namespace KdybyTests\Events;

use Kdyby\Events\DI\EventsExtension;
use Kdyby\Events\Diagnostics\Panel;
use Nette\Configurator;
use Tester\Assert;

require_once __DIR__ . '/../bootstrap.php';

class PanelTest extends \Tester\TestCase
{

/**
* @param string $configFile
* @return \Nette\DI\Container
*/
public function createContainer($configFile)
{
$config = new Configurator();
$config->setTempDirectory(TEMP_DIR);
$config->addParameters(['container' => ['class' => 'SystemContainer_' . md5($configFile)]]);
EventsExtension::register($config);
$config->addConfig(__DIR__ . '/../nette-reset.neon');
$config->addConfig(__DIR__ . '/config/' . $configFile . '.neon');
return $config->createContainer();
}

public function testRender()
{
$container = $this->createContainer('panel');

$panel = new Panel($container);

Assert::noError(function () use ($panel) {
$panel->getTab();
$panel->getPanel();
});
}

}

(new PanelTest())->run();
3 changes: 3 additions & 0 deletions tests/KdybyTests/Events/config/panel.neon
@@ -0,0 +1,3 @@
events:

services:

0 comments on commit 0c09f5a

Please sign in to comment.