=========
Changelog
=========

4.0.0 (2024-06-19)
------------------

* Changed the minimum PHP version to 7.4+
* Created .gitattributes to avoid installing test folder
  https://github.com/ezimuel/guzzlestreams/pull/2

3.0.0 (2014-10-12)
------------------

* Now supports creating streams from functions and iterators.
* Supports creating buffered streams and asynchronous streams.
* Removed ``functions.php``. Use the corresponding functions provided by
  ``GuzzleHttp\Streams\Utils`` instead.
* Moved ``GuzzleHttp\Stream\MetadataStreamInterface::getMetadata`` to
  ``GuzzleHttp\Stream\StreamInterface``. MetadataStreamInterface is no longer
  used and is marked as deprecated.
* Added ``attach()`` to ``GuzzleHttp\Stream\StreamInterface`` for PSR-7
  compatibility.
* Removed ``flush()`` from StreamInterface.
* Removed the ``$maxLength`` parameter from
  ``GuzzleHttp\Stream\StreamInterface::getContents()``. This function now
  returns the entire remainder of the stream. If you want to limit the maximum
  amount of data read from the stream, use the
  ``GuzzleHttp\Stream\Utils::copyToString()`` function.
* Streams that return an empty string, ``''``, are no longer considered a
  failure. You MUST return ``false`` to mark the read as a failure, and ensure
  that any decorators you create properly return ``true`` in response to the
  ``eof()`` method when the stream is consumed.
* ``GuzzleHttp\Stream\Stream::__construct``,
  ``GuzzleHttp\Stream\Stream::factory``, and
  ``GuzzleHttp\Stream\Utils::create`` no longer accept a size in the second
  argument. They now accept an associative array of options, including the
  "size" key and "metadata" key which can be used to provide custom metadata.
* Added ``GuzzleHttp\Stream\BufferStream`` to add support for buffering data,
  and when read, shifting data off of the buffer.
* Added ``GuzzleHttp\Stream\NullBuffer`` which can be used as a buffer that
  does not actually store any data.
* Added ``GuzzleHttp\Stream\AsyncStream`` to provide support for non-blocking
  streams that can be filled by a remote source (e.g., an event-loop). If a
  ``drain`` option is provided, the stream can also act as if it is a blocking
  stream.

2.1.0 (2014-08-17)
------------------

* Added an InflateStream to inflate gzipped or deflated content.
* Added ``flush`` to stream wrapper.
* Added the ability to easily register the GuzzleStreamWrapper if needed.

2.0.0 (2014-08-16)
------------------

* Deprecated functions.php and moved all of those methods to
  ``GuzzleHttp\Streams\Utils``. Use ``GuzzleHttp\Stream\Stream::factory()``
  instead of ``GuzzleHttp\Stream\create()`` to create new streams.
* Added ``flush()`` to ``StreamInterface``. This method is used to flush any
  underlying stream write buffers.
* Added ``FnStream`` to easily decorate stream behavior with callables.
* ``Utils::hash`` now throws an exception when the stream cannot seek to 0.

1.5.1 (2014-09-10)
------------------

* Stream metadata is grabbed from the underlying stream each time
  ``getMetadata`` is called rather than returning a value from a cache.
* Properly closing all underlying streams when AppendStream is closed.
* Seek functions no longer throw exceptions.
* LazyOpenStream now correctly returns the underlying stream resource when
  detached.

1.5.0 (2014-08-07)
------------------

* Added ``Stream\safe_open`` to open stream resources and throw exceptions
  instead of raising errors.

1.4.0 (2014-07-19)
------------------

* Added a LazyOpenStream

1.3.0 (2014-07-15)
------------------

* Added an AppendStream to stream over multiple stream one after the other.

1.2.0 (2014-07-15)
------------------

* Updated the ``detach()`` method to return the underlying stream resource or
  ``null`` if it does not wrap a resource.
* Multiple fixes for how streams behave when the underlying resource is
  detached
* Do not clear statcache when a stream does not have a 'uri'
* Added a fix to LimitStream
* Added a condition to ensure that functions.php can be required multiple times
