Skip to content

Commit

Permalink
Merge pull request #13 from matyx/client-factory-refactor
Browse files Browse the repository at this point in the history
GuzzletteExtension: use ClientFactory for production (stay consistent…
  • Loading branch information
matyx authored Apr 4, 2018
2 parents a638be6 + bb0356f commit 930533c
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 22 deletions.
8 changes: 7 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,13 @@ composer require matyx/guzzlette
Add following to your `config.neon`:
```
extensions:
guzzlette: Matyx\Guzzlette\Bridges\Nette\DI\GuzzletteExtension(%debugMode%)
guzzlette: Matyx\Guzzlette\Bridges\Nette\DI\GuzzletteExtension
guzzlette:
timeout: 30 #
debugger: true # enable debugger - default autodetect
someGuzzleConfigParameter: false # all guzzle config directives are supported
```


Expand Down
23 changes: 11 additions & 12 deletions src/Matyx/Guzzlette/Bridges/Nette/DI/GuzzletteExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@ class GuzzletteExtension extends CompilerExtension
'timeout' => 30,
];

private $debugMode = false;
private $debugMode;


/**
* @param bool $debugMode
* @deprecated please configure using debugger extension parameter
*/
public function __construct($debugMode = false)
public function __construct($debugMode = null)
{
$this->debugMode = $debugMode;
}
Expand All @@ -34,27 +34,26 @@ public function loadConfiguration()
/** @var \Nette\DI\ContainerBuilder $builder */
$builder = $this->getContainerBuilder();

$config = Config\Helpers::merge($this->config, $this->getContainerBuilder()->expand($this->defaults));
$debugMode = $this->debugMode || $config['debugger'];
unset($config['debugMode']);
$config = Config\Helpers::merge($this->config, $builder->expand($this->defaults));

if ($debugMode === false) { // production mode, registers client directly without factory
$builder->addDefinition($this->prefix('client'))
->setClass(Client::class, ['config' => $config]);

return;
// Backwards compatibility, $config['debugger'] overrides constructor parameter
if ($this->debugMode !== null && !isset($config['debugger'])) {
$config['debugger'] = $this->debugMode;
}

$enableDebugger = (isset($config['debugger']) ? $config['debugger'] : false);
unset($config['debugger']);

$builder->addDefinition($this->prefix('requestStack'))
->setClass(RequestStack::class)
->setAutowired(false);

$builder->addDefinition($this->prefix('clientFactory'))
->setClass(ClientFactory::class, [$builder->getDefinition($this->prefix('requestStack'))]);
->setClass(ClientFactory::class, [$builder->getDefinition($this->prefix('requestStack')), $enableDebugger]);


$builder->addDefinition($this->prefix('client'))
->setClass(Client::class)
->setFactory('@' . $this->prefix('clientFactory') . '::createClient', ['guzzleConfig' => $config]);
->setFactory('@' . $this->prefix('clientFactory') . '::createClient', ['config' => $config]);
}
}
16 changes: 11 additions & 5 deletions src/Matyx/Guzzlette/ClientFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,14 @@ class ClientFactory
/** @var \Matyx\Guzzlette\RequestStack */
private $requestStack;

/** @var bool */
private $enableDebugger;

public function __construct(RequestStack $requestStack)

public function __construct(RequestStack $requestStack, $enableDebugger = false)
{
$this->requestStack = $requestStack;
$this->enableDebugger = $enableDebugger;
$this->registerTracyPanel();
}

Expand All @@ -25,12 +29,14 @@ public function __construct(RequestStack $requestStack)
* @param array $guzzleConfig
* @return \GuzzleHttp\Client
*/
public function createClient($guzzleConfig = [])
public function createClient($config = [])
{
$handler = $this->createHandlerStack((isset($guzzleConfig['handler']) ? $guzzleConfig['handler'] : null));
$guzzleConfig['handler'] = $handler;
if ($this->enableDebugger) {
$handler = $this->createHandlerStack((isset($config['handler']) ? $config['handler'] : null));
$config['handler'] = $handler;
}

return new GuzzleHttp\Client($guzzleConfig);
return new GuzzleHttp\Client($config);
}


Expand Down
2 changes: 1 addition & 1 deletion tests/Matyx/Guzzlette/GuzzletteExtensionTest.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ class GuzzletteExtensionTest extends TestCase
$container = new $class;

Assert::count(1, $container->findByType(Client::class));
Assert::count(0, $container->findByType(ClientFactory::class));
Assert::count(1, $container->findByType(ClientFactory::class));
}
}

Expand Down
27 changes: 25 additions & 2 deletions tests/Matyx/Guzzlette/GuzzletteHandlerTest.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ require_once __DIR__ . '/../../bootstrap.php';
*/
class GuzzletteHandlerTest extends TestCase
{
public function testHandler()
public function testHandlerDebug()
{
$requestStack = new RequestStack();
$guzzlette = new ClientFactory($requestStack);
$guzzlette = new ClientFactory($requestStack, true);

$mock = new MockHandler([
new Response(200, ['X-Foo' => 'Bar']),
Expand All @@ -39,6 +39,29 @@ class GuzzletteHandlerTest extends TestCase
Assert::same(2, count($requestStack->getRequests()));
Assert::notSame(0.0, $requestStack->getTotalTime());
}


public function testHandlerProduction()
{
$requestStack = new RequestStack();
$guzzlette = new ClientFactory($requestStack);

$mock = new MockHandler([
new Response(200, ['X-Foo' => 'Bar']),
new Response(202, ['Content-Length' => 0]),
new RequestException('Error Communicating with Server', new \GuzzleHttp\Psr7\Request('GET', 'test')),
]);

$handler = HandlerStack::create($mock);

$client = $guzzlette->createClient(['handler' => $handler]);

Assert::same(200, $client->request('GET', '/')->getStatusCode());
Assert::same(202, $client->request('GET', '/')->getStatusCode());

Assert::same(0, count($requestStack->getRequests()));
Assert::same(0, $requestStack->getTotalTime());
}
}


Expand Down
2 changes: 1 addition & 1 deletion tests/Matyx/Guzzlette/TracyPanelTest.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class TracyPanelTest extends TestCase
public function testTracyPanel()
{
$requestStack = new RequestStack();
$guzzlette = new \Matyx\Guzzlette\ClientFactory($requestStack);
$guzzlette = new \Matyx\Guzzlette\ClientFactory($requestStack, true);

$mock = new MockHandler([
new Response(200, ['X-Foo' => 'Bar', 'Content-Type' => 'application/json'], '{"status": "ok"}'),
Expand Down

0 comments on commit 930533c

Please sign in to comment.