Skip to content

Commit ffd9756

Browse files
committed
Merge pull request #18 from mekras/stream_factories
Add StreamFactory and Discovery
2 parents 81784c2 + bfb1381 commit ffd9756

File tree

6 files changed

+265
-0
lines changed

6 files changed

+265
-0
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
namespace spec\Http\Discovery\StreamFactory;
4+
5+
use PhpSpec\Exception\Example\SkippingException;
6+
use PhpSpec\ObjectBehavior;
7+
use Zend\Diactoros\Stream;
8+
9+
class DiactorosStreamFactorySpec extends ObjectBehavior
10+
{
11+
function let()
12+
{
13+
if (!class_exists('Zend\Diactoros\Stream')) {
14+
throw new SkippingException('Diactoros is not available');
15+
}
16+
}
17+
18+
function it_is_initializable()
19+
{
20+
$this->shouldHaveType('Http\Discovery\StreamFactory\DiactorosStreamFactory');
21+
}
22+
23+
function it_is_a_stream_factory()
24+
{
25+
$this->shouldImplement('Http\Message\StreamFactory');
26+
}
27+
28+
function it_creates_a_stream_from_string()
29+
{
30+
$this->createStream('foo')->shouldHaveType('Psr\Http\Message\StreamInterface');
31+
}
32+
33+
function it_creates_a_stream_from_resource()
34+
{
35+
$this->createStream(fopen('php://memory', 'rw'))
36+
->shouldHaveType('Psr\Http\Message\StreamInterface');
37+
}
38+
39+
function it_creates_a_stream_from_stream()
40+
{
41+
$this->createStream(new Stream('php://memory'))
42+
->shouldHaveType('Psr\Http\Message\StreamInterface');
43+
}
44+
45+
function it_creates_a_stream_from_null()
46+
{
47+
$this->createStream(null)->shouldHaveType('Psr\Http\Message\StreamInterface');
48+
}
49+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
namespace spec\Http\Discovery\StreamFactory;
4+
5+
use GuzzleHttp\Psr7\Stream;
6+
use PhpSpec\Exception\Example\SkippingException;
7+
use PhpSpec\ObjectBehavior;
8+
9+
class GuzzleStreamFactorySpec extends ObjectBehavior
10+
{
11+
public function let()
12+
{
13+
if (!class_exists('GuzzleHttp\Psr7\Stream')) {
14+
throw new SkippingException('GuzzleHttp is not available');
15+
}
16+
}
17+
18+
public function it_is_initializable()
19+
{
20+
$this->shouldHaveType('Http\Discovery\StreamFactory\GuzzleStreamFactory');
21+
}
22+
23+
public function it_is_a_stream_factory()
24+
{
25+
$this->shouldImplement('Http\Message\StreamFactory');
26+
}
27+
28+
public function it_creates_a_stream_from_string()
29+
{
30+
$this->createStream('foo')->shouldHaveType('Psr\Http\Message\StreamInterface');
31+
}
32+
33+
public function it_creates_a_stream_from_resource()
34+
{
35+
$this->createStream(fopen('php://memory', 'rw'))
36+
->shouldHaveType('Psr\Http\Message\StreamInterface');
37+
}
38+
39+
public function it_creates_a_stream_from_stream()
40+
{
41+
$this->createStream(new Stream(fopen('php://memory', 'rw')))
42+
->shouldHaveType('Psr\Http\Message\StreamInterface');
43+
}
44+
45+
public function it_creates_a_stream_from_null()
46+
{
47+
$this->createStream(null)->shouldHaveType('Psr\Http\Message\StreamInterface');
48+
}
49+
}

spec/StreamFactoryDiscoverySpec.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace spec\Http\Discovery;
4+
5+
use PhpSpec\ObjectBehavior;
6+
7+
class StreamFactoryDiscoverySpec extends ObjectBehavior
8+
{
9+
function it_is_initializable()
10+
{
11+
$this->shouldHaveType('Http\Discovery\StreamFactoryDiscovery');
12+
}
13+
14+
function it_is_a_class_discovery()
15+
{
16+
$this->shouldHaveType('Http\Discovery\ClassDiscovery');
17+
}
18+
19+
function it_finds_an_http_stream_factory()
20+
{
21+
$this->find()->shouldHaveType('Http\Message\StreamFactory');
22+
}
23+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Http Discovery package.
5+
*
6+
* (c) PHP HTTP Team <[email protected]>
7+
*
8+
* For the full copyright and license information, please read the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Http\Discovery\StreamFactory;
13+
14+
use Http\Message\StreamFactory;
15+
use Psr\Http\Message\StreamInterface;
16+
use Zend\Diactoros\Request;
17+
use Zend\Diactoros\Response;
18+
use Zend\Diactoros\Stream;
19+
20+
/**
21+
* @author Михаил Красильников <[email protected]>
22+
*/
23+
class DiactorosStreamFactory implements StreamFactory
24+
{
25+
/**
26+
* Creates a stream
27+
*
28+
* @param string|resource|StreamInterface|null $body
29+
*
30+
* @return StreamInterface
31+
*
32+
* @throws \InvalidArgumentException If the stream body is invalid
33+
* @throws \RuntimeException If cannot write into stream
34+
*/
35+
public function createStream($body = null)
36+
{
37+
if (!$body instanceof StreamInterface) {
38+
if (is_resource($body)) {
39+
$body = new Stream($body);
40+
} else {
41+
$stream = new Stream('php://memory', 'rw');
42+
43+
if (null !== $body) {
44+
$stream->write((string) $body);
45+
}
46+
47+
$body = $stream;
48+
}
49+
}
50+
51+
$body->rewind();
52+
53+
return $body;
54+
}
55+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Http Discovery package.
5+
*
6+
* (c) PHP HTTP Team <[email protected]>
7+
*
8+
* For the full copyright and license information, please read the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Http\Discovery\StreamFactory;
13+
14+
use Http\Message\StreamFactory;
15+
use Psr\Http\Message\StreamInterface;
16+
17+
/**
18+
* @author Михаил Красильников <[email protected]>
19+
*/
20+
class GuzzleStreamFactory implements StreamFactory
21+
{
22+
/**
23+
* Creates a stream
24+
*
25+
* @param string|resource|StreamInterface|null $body
26+
*
27+
* @return StreamInterface
28+
*
29+
* @throws \InvalidArgumentException if the $body arg is not valid.
30+
*/
31+
public function createStream($body = null)
32+
{
33+
return \GuzzleHttp\Psr7\stream_for($body);
34+
}
35+
}

src/StreamFactoryDiscovery.php

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Http Discovery package.
5+
*
6+
* (c) PHP HTTP Team <[email protected]>
7+
*
8+
* For the full copyright and license information, please read the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Http\Discovery;
13+
14+
use Http\Message\StreamFactory;
15+
16+
/**
17+
* Finds a Stream Factory
18+
*
19+
* @author Михаил Красильников <[email protected]>
20+
*/
21+
class StreamFactoryDiscovery extends ClassDiscovery
22+
{
23+
/**
24+
* @var StreamFactory
25+
*/
26+
protected static $cache;
27+
28+
/**
29+
* @var array
30+
*/
31+
protected static $classes = [
32+
'guzzle' => [
33+
'class' => 'Http\Discovery\StreamFactory\GuzzleStreamFactory',
34+
'condition' => 'GuzzleHttp\Psr7\Stream',
35+
],
36+
'diactoros' => [
37+
'class' => 'Http\Discovery\StreamFactory\DiactorosStreamFactory',
38+
'condition' => 'Zend\Diactoros\Stream',
39+
],
40+
];
41+
42+
/**
43+
* Finds a Stream Factory
44+
*
45+
* @return StreamFactory
46+
*
47+
* @throws NotFoundException
48+
*/
49+
public static function find()
50+
{
51+
// Override only used for return type declaration
52+
return parent::find();
53+
}
54+
}

0 commit comments

Comments
 (0)