Skip to content

Commit ff4c775

Browse files
Merge pull request #59 from php-http/flexible-discovery, closes #55
Flexible discovery
2 parents fac1240 + 1c37482 commit ff4c775

25 files changed

+636
-233
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Change Log
22

3+
## 0.9.0 - 2016-06-25
4+
5+
### Changed
6+
7+
- Support of multiple strategies to find classes. This will make Puli optional
8+
- Updated exceptions
39

410
## 0.8.0 - 2016-02-11
511

phpspec.yml.ci

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ extensions:
77
code_coverage:
88
format: clover
99
output: build/coverage.xml
10+
bootstrap: spec/autoload.php

phpspec.yml.dist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ suites:
33
namespace: Http\Discovery
44
psr4_prefix: Http\Discovery
55
formatter.name: pretty
6+
bootstrap: spec/autoload.php

spec/ClassDiscoverySpec.php

Lines changed: 24 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -3,83 +3,58 @@
33
namespace spec\Http\Discovery;
44

55
use Http\Discovery\ClassDiscovery;
6+
use Http\Discovery\Exception\DiscoveryFailedException;
7+
use Http\Discovery\Exception\NotFoundException;
8+
use Http\Discovery\Strategy\DiscoveryStrategy;
69
use Puli\Discovery\Binding\ClassBinding;
710
use Puli\GeneratedPuliFactory;
811
use Puli\Discovery\Api\Discovery;
912
use Puli\Repository\Api\ResourceRepository;
1013
use PhpSpec\ObjectBehavior;
14+
use spec\Http\Discovery\Helper\DiscoveryHelper;
1115

1216
class ClassDiscoverySpec extends ObjectBehavior
1317
{
14-
function let(
15-
GeneratedPuliFactory $puliFactory,
16-
ResourceRepository $repository,
17-
Discovery $discovery
18-
) {
19-
$puliFactory->createRepository()->willReturn($repository);
20-
$puliFactory->createDiscovery($repository)->willReturn($discovery);
21-
18+
function let() {
19+
ClassDiscovery::setStrategies([DiscoveryHelper::class]);
20+
DiscoveryHelper::clearClasses();
2221
$this->beAnInstanceOf('spec\Http\Discovery\ClassDiscoveryStub');
23-
$this->setPuliFactory($puliFactory);
24-
}
25-
26-
function letgo()
27-
{
28-
$this->resetPuliFactory();
2922
}
3023

3124
function it_is_initializable()
3225
{
3326
$this->shouldHaveType('Http\Discovery\ClassDiscovery');
3427
}
3528

36-
function it_has_a_puli_factory(GeneratedPuliFactory $puliFactory)
29+
function it_throws_an_exception_when_no_candidate_found(DiscoveryStrategy $strategy)
3730
{
38-
$this->getPuliFactory()->shouldReturn($puliFactory);
39-
}
31+
$strategy->getCandidates('NoCandidate')->willReturn([]);
4032

41-
function it_has_a_puli_discovery(Discovery $discovery)
42-
{
43-
$this->getPuliDiscovery()->shouldReturn($discovery);
33+
$this->shouldThrow(DiscoveryFailedException::class)->duringFind('NoCandidate');
4434
}
4535

46-
function it_throws_an_exception_when_binding_not_found(Discovery $discovery)
36+
function it_returns_a_class(DiscoveryStrategy $strategy)
4737
{
48-
$discovery->findBindings('InvalidBinding')->willReturn([]);
38+
$candidate = ['class' => 'ClassName', 'condition' => true];
39+
DiscoveryHelper::setClasses('Foobar', [$candidate]);
4940

50-
$this->shouldThrow('Http\Discovery\NotFoundException')->duringFindOneByType('InvalidBinding');
41+
$this->find('Foobar')->shouldReturn('ClassName');
5142
}
5243

53-
function it_returns_a_class_binding(Discovery $discovery, ClassBinding $binding)
54-
{
55-
$binding->hasParameterValue('depends')->willReturn(false);
56-
$binding->getClassName()->willReturn('ClassName');
57-
58-
$discovery->findBindings('Binding')->willReturn([$binding]);
44+
function it_validates_conditions(DiscoveryStrategy $strategy) {
45+
$c0 = ['class' => 'ClassName0', 'condition' => false];
46+
$c1 = ['class' => 'ClassName1', 'condition' => true];
47+
$c2 = ['class' => 'ClassName2', 'condition' => false];
48+
DiscoveryHelper::setClasses('Foobar', [$c0, $c1, $c2]);
5949

60-
$this->findOneByType('Binding')->shouldReturn('ClassName');
61-
}
62-
63-
function it_returns_a_class_binding_with_dependency(
64-
Discovery $discovery,
65-
ClassBinding $binding1,
66-
ClassBinding $binding2
67-
) {
68-
$binding1->hasParameterValue('depends')->willReturn(true);
69-
$binding1->getParameterValue('depends')->willReturn(false);
70-
71-
$binding2->hasParameterValue('depends')->willReturn(false);
72-
$binding2->getClassName()->willReturn('ClassName');
73-
74-
$discovery->findBindings('Binding')->willReturn([
75-
$binding1,
76-
$binding2,
77-
]);
78-
79-
$this->findOneByType('Binding')->shouldReturn('ClassName');
50+
$this->find('Foobar')->shouldReturn('ClassName1');
8051
}
8152
}
8253

8354
class ClassDiscoveryStub extends ClassDiscovery
8455
{
56+
public static function find($type)
57+
{
58+
return self::findOneByType($type);
59+
}
8560
}

spec/Helper/DiscoveryHelper.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
namespace spec\Http\Discovery\Helper;
4+
5+
use Http\Discovery\Strategy\DiscoveryStrategy;
6+
7+
/**
8+
* This is a discovery helper used in tests
9+
*
10+
* @author Tobias Nyholm <[email protected]>
11+
*/
12+
class DiscoveryHelper implements DiscoveryStrategy
13+
{
14+
private static $classes = [];
15+
16+
/**
17+
* @param string $type
18+
* @param array $classes
19+
*
20+
* @return $this
21+
*/
22+
public static function setClasses($type, array $classes)
23+
{
24+
self::$classes[$type] = $classes;
25+
}
26+
27+
/**
28+
* Clear all classes.
29+
*/
30+
public static function clearClasses()
31+
{
32+
self::$classes = [];
33+
}
34+
35+
/**
36+
* {@inheritdoc}
37+
*/
38+
public static function getCandidates($type)
39+
{
40+
if (isset(static::$classes[$type])) {
41+
return static::$classes[$type];
42+
}
43+
44+
return [];
45+
}
46+
}

spec/HttpAsyncClientDiscoverySpec.php

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,24 @@
22

33
namespace spec\Http\Discovery;
44

5+
use Http\Client\HttpAsyncClient;
6+
use Http\Discovery\ClassDiscovery;
7+
use Http\Discovery\Exception\NotFoundException;
8+
use Http\Discovery\Strategy\DiscoveryStrategy;
9+
use Prophecy\Argument;
510
use Puli\GeneratedPuliFactory;
611
use Puli\Discovery\Api\Discovery;
712
use Puli\Discovery\Binding\ClassBinding;
813
use Puli\Repository\Api\ResourceRepository;
914
use PhpSpec\ObjectBehavior;
15+
use spec\Http\Discovery\Helper\DiscoveryHelper;
1016

1117
class HttpAsyncClientDiscoverySpec extends ObjectBehavior
1218
{
13-
function let(
14-
GeneratedPuliFactory $puliFactory,
15-
ResourceRepository $repository,
16-
Discovery $discovery
17-
) {
18-
$puliFactory->createRepository()->willReturn($repository);
19-
$puliFactory->createDiscovery($repository)->willReturn($discovery);
20-
21-
$this->setPuliFactory($puliFactory);
22-
}
23-
24-
function letgo()
19+
function let()
2520
{
26-
$this->resetPuliFactory();
21+
ClassDiscovery::setStrategies([DiscoveryHelper::class]);
22+
DiscoveryHelper::clearClasses();
2723
}
2824

2925
function it_is_initializable()
@@ -36,15 +32,15 @@ function it_is_a_class_discovery()
3632
$this->shouldHaveType('Http\Discovery\ClassDiscovery');
3733
}
3834

39-
function it_finds_an_async_http_client(
40-
Discovery $discovery,
41-
ClassBinding $binding
42-
) {
43-
$binding->hasParameterValue('depends')->willReturn(false);
44-
$binding->getClassName()->willReturn('spec\Http\Discovery\Stub\HttpAsyncClientStub');
35+
function it_finds_an_async_http_client(DiscoveryStrategy $strategy) {
4536

46-
$discovery->findBindings('Http\Client\HttpAsyncClient')->willReturn([$binding]);
37+
$candidate = ['class' => 'spec\Http\Discovery\Stub\HttpAsyncClientStub', 'condition' => true];
38+
DiscoveryHelper::setClasses(HttpAsyncClient::class, [$candidate]);
4739

4840
$this->find()->shouldImplement('Http\Client\HttpAsyncClient');
4941
}
42+
43+
function it_throw_exception(DiscoveryStrategy $strategy) {
44+
$this->shouldThrow(NotFoundException::class)->duringFind();
45+
}
5046
}

spec/HttpClientDiscoverySpec.php

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,23 @@
22

33
namespace spec\Http\Discovery;
44

5+
use Http\Client\HttpClient;
6+
use Http\Discovery\ClassDiscovery;
7+
use Http\Discovery\Exception\NotFoundException;
8+
use Http\Discovery\Strategy\DiscoveryStrategy;
59
use Puli\GeneratedPuliFactory;
610
use Puli\Discovery\Api\Discovery;
711
use Puli\Discovery\Binding\ClassBinding;
812
use Puli\Repository\Api\ResourceRepository;
913
use PhpSpec\ObjectBehavior;
14+
use spec\Http\Discovery\Helper\DiscoveryHelper;
1015

1116
class HttpClientDiscoverySpec extends ObjectBehavior
1217
{
13-
function let(
14-
GeneratedPuliFactory $puliFactory,
15-
ResourceRepository $repository,
16-
Discovery $discovery
17-
) {
18-
$puliFactory->createRepository()->willReturn($repository);
19-
$puliFactory->createDiscovery($repository)->willReturn($discovery);
20-
21-
$this->setPuliFactory($puliFactory);
22-
}
23-
24-
function letgo()
18+
function let()
2519
{
26-
$this->resetPuliFactory();
20+
ClassDiscovery::setStrategies([DiscoveryHelper::class]);
21+
DiscoveryHelper::clearClasses();
2722
}
2823

2924
function it_is_initializable()
@@ -36,15 +31,15 @@ function it_is_a_class_discovery()
3631
$this->shouldHaveType('Http\Discovery\ClassDiscovery');
3732
}
3833

39-
function it_finds_an_http_client(
40-
Discovery $discovery,
41-
ClassBinding $binding
42-
) {
43-
$binding->hasParameterValue('depends')->willReturn(false);
44-
$binding->getClassName()->willReturn('spec\Http\Discovery\Stub\HttpClientStub');
34+
function it_finds_a_http_client(DiscoveryStrategy $strategy) {
4535

46-
$discovery->findBindings('Http\Client\HttpClient')->willReturn([$binding]);
36+
$candidate = ['class' => 'spec\Http\Discovery\Stub\HttpClientStub', 'condition' => true];
37+
DiscoveryHelper::setClasses(HttpClient::class, [$candidate]);
4738

4839
$this->find()->shouldImplement('Http\Client\HttpClient');
4940
}
41+
42+
function it_throw_exception(DiscoveryStrategy $strategy) {
43+
$this->shouldThrow(NotFoundException::class)->duringFind();
44+
}
5045
}

spec/MessageFactoryDiscoverySpec.php

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,23 @@
22

33
namespace spec\Http\Discovery;
44

5+
use Http\Discovery\ClassDiscovery;
6+
use Http\Discovery\Exception\NotFoundException;
7+
use Http\Discovery\Strategy\DiscoveryStrategy;
8+
use Http\Message\MessageFactory;
59
use Puli\GeneratedPuliFactory;
610
use Puli\Discovery\Api\Discovery;
711
use Puli\Discovery\Binding\ClassBinding;
812
use Puli\Repository\Api\ResourceRepository;
913
use PhpSpec\ObjectBehavior;
14+
use spec\Http\Discovery\Helper\DiscoveryHelper;
1015

1116
class MessageFactoryDiscoverySpec extends ObjectBehavior
1217
{
13-
function let(
14-
GeneratedPuliFactory $puliFactory,
15-
ResourceRepository $repository,
16-
Discovery $discovery
17-
) {
18-
$puliFactory->createRepository()->willReturn($repository);
19-
$puliFactory->createDiscovery($repository)->willReturn($discovery);
20-
21-
$this->setPuliFactory($puliFactory);
22-
}
23-
24-
function letgo()
18+
function let()
2519
{
26-
$this->resetPuliFactory();
20+
ClassDiscovery::setStrategies([DiscoveryHelper::class]);
21+
DiscoveryHelper::clearClasses();
2722
}
2823

2924
function it_is_initializable()
@@ -36,15 +31,17 @@ function it_is_a_class_discovery()
3631
$this->shouldHaveType('Http\Discovery\ClassDiscovery');
3732
}
3833

39-
function it_finds_a_message_factory(
40-
Discovery $discovery,
41-
ClassBinding $binding
42-
) {
43-
$binding->hasParameterValue('depends')->willReturn(false);
44-
$binding->getClassName()->willReturn('spec\Http\Discovery\Stub\MessageFactoryStub');
34+
function it_finds_a_message_factory(DiscoveryStrategy $strategy) {
4535

46-
$discovery->findBindings('Http\Message\MessageFactory')->willReturn([$binding]);
36+
$candidate = ['class' => 'spec\Http\Discovery\Stub\MessageFactoryStub', 'condition' => true];
37+
DiscoveryHelper::setClasses(MessageFactory::class, [$candidate]);
4738

4839
$this->find()->shouldImplement('Http\Message\MessageFactory');
4940
}
41+
42+
function it_throw_exception(DiscoveryStrategy $strategy) {
43+
$strategy->getCandidates('Http\Message\MessageFactory')->willReturn([]);
44+
45+
$this->shouldThrow(NotFoundException::class)->duringFind();
46+
}
5047
}

0 commit comments

Comments
 (0)