Changelog
=========

## 2.4.1

### Fixed

- Corrected `uuid` assertion to prevent braces and prefixes being _inside_ the value.

## 2.4.0

### Changed

- Updated docblocks for many methods, improving psalm support and type hints.

## 2.3.0

### Changed

- Clarified documentation and testing of `uniqueValues`.

### Added

- All assertions now support `string|callable` for the message.

## 2.2.0

### Added

- Added `isNotInstanceOfAny` assertion.

## 2.1.6

### Fixed

- Corrected docblocks for `list*` methods.

## 2.1.5

### Fixed

- Fixed regression of `instanceOf` messages

## 2.1.4

### Fixed

- Use custom message for more internal calls.

## 2.1.3

### Fixed

- Corrected `isList` type documentation.
- Corrected `isAOf`, `isInstanceOf`, etc type documentation.

## 2.1.2

### Fixed

- Changed `all*` assertion values back to `mixed`.

## 2.1.1

### Fixed

- Optimized `stringNotEmpty` by internally using `notSame`.

## 2.1.0

### Fixed

- Corrected `@param` declaration for `isMap`.
- Pass custom message to internal assertion calls.

## 2.0.0

### Changed

- **BREAKING** Minimum PHP version is now 8.2 (was 7.2).
- **BREAKING** Remove deprecated `isTraversable`, use `isIterable` or `isInstanceOf` instead.
- **BREAKING** Added `declare(strict_types=1)` to all classes.
- Updated CI/CD test matrix to test PHP 8.2, 8.3, 8.4, and 8.5.
- Updated development tools (PHPUnit, Psalm, PHP-CS-Fixer) to supported versions.
- Added explicit return types and parameter types to all methods in both source code and tests.

### Added

- All assertion methods now return the checked value.
- Added `notInArray` and `notOneOf`.
- Added `isInitialized`, to check if a class property is initialized.
- Added `negativeInteger` and `notNegativeInteger`
- Added `isStatic` and `notStatic`

### Fixed

- Corrected validation of emails with unicode characters.

## 1.12.1

### Fixed

- Exclude tools from export.

## 1.12.0

### Fixed

- Corrected messages and typos in various assertions.
- Document `void` return type.
- Prevent UUIDs with trailing newlines from validating.
- Assert values are strings before ctype checks.

## 1.11.0

### Added

* Added explicit (non-magic) `allNullOr*` methods, with `@psalm-assert` annotations, for better Psalm support.

### Changed

* Trait methods will now check the assertion themselves, instead of using `__callStatic`
* `isList` will now deal correctly with (modified) lists that contain `NaN`
* `reportInvalidArgument` now has a return type of `never`.

### Removed

* Removed `symfony/polyfill-ctype` as a dependency, and require `ext-ctype` instead.
  * You can still require the `symfony/polyfill-ctype` in your project if you need it, as it provides `ext-ctype`

## 1.10.0

### Added

* On invalid assertion, we throw a `Webmozart\Assert\InvalidArgumentException`
* Added `Assert::positiveInteger()`

### Changed

* Using a trait with real implementations of `all*()` and `nullOr*()` methods to improve psalm compatibility.

### Removed

* Support for PHP <7.2

## 1.9.1

## Fixed

* provisional support for PHP 8.0

## 1.9.0

* added better Psalm support for `all*` & `nullOr*` methods
* These methods are now understood by Psalm through a mixin. You may need a newer version of Psalm in order to use this
* added `@psalm-pure` annotation to `Assert::notFalse()`
* added more `@psalm-assert` annotations where appropriate

## Changed

* the `all*` & `nullOr*` methods are now declared on an interface, instead of `@method` annotations.
This interface is linked to the `Assert` class with a `@mixin` annotation. Most IDEs have supported this
for a long time, and you should not lose any autocompletion capabilities. PHPStan has supported this since
version `0.12.20`. This package is marked incompatible (with a composer conflict) with phpstan version prior to that.
If you do not use PHPStan than this does not matter.

## 1.8.0

### Added

* added `Assert::notStartsWith()`
* added `Assert::notEndsWith()`
* added `Assert::inArray()`
* added `@psalm-pure` annotations to pure assertions

### Fixed

* Exception messages of comparisons between `DateTime(Immutable)` objects now display their date & time.
* Custom Exception messages for `Assert::count()` now use the values to render the exception message.

## 1.7.0 (2020-02-14)

### Added

* added `Assert::notFalse()`
* added `Assert::isAOf()`
* added `Assert::isAnyOf()`
* added `Assert::isNotA()`

## 1.6.0 (2019-11-24)

### Added

* added `Assert::validArrayKey()`
* added `Assert::isNonEmptyList()`
* added `Assert::isNonEmptyMap()`
* added `@throws InvalidArgumentException` annotations to all methods that throw.
* added `@psalm-assert` for the list type to the `isList` assertion.

### Fixed

* `ResourceBundle` & `SimpleXMLElement` now pass the `isCountable` assertions.
They are countable, without implementing the `Countable` interface.
* The doc block of `range` now has the proper variables.
* An empty array will now pass `isList` and `isMap`. As it is a valid form of both.
If a non-empty variant is needed, use `isNonEmptyList` or `isNonEmptyMap`.

### Changed

* Removed some `@psalm-assert` annotations, that were 'side effect' assertions See:
  * [#144](https://github.com/webmozart/assert/pull/144)
  * [#145](https://github.com/webmozart/assert/issues/145)
  * [#146](https://github.com/webmozart/assert/pull/146)
  * [#150](https://github.com/webmozart/assert/pull/150)
* If you use Psalm, the minimum version needed is `3.6.0`. Which is enforced through a composer conflict.
If you don't use Psalm, then this has no impact.

## 1.5.0 (2019-08-24)

### Added

* added `Assert::uniqueValues()`
* added `Assert::unicodeLetters()`
* added: `Assert::email()`
* added support for [Psalm](https://github.com/vimeo/psalm), by adding `@psalm-assert` annotations where appropriate.

### Fixed

* `Assert::endsWith()` would not give the correct result when dealing with a multibyte suffix.
* `Assert::length(), minLength, maxLength, lengthBetween` would not give the correct result when dealing with multibyte characters.

**NOTE**: These 2 changes may break your assertions if you relied on the fact that multibyte characters didn't behave correctly.

### Changed

* The names of some variables have been updated to better reflect what they are.
* All function calls are now in their FQN form, slightly increasing performance.
* Tests are now properly ran against HHVM-3.30 and PHP nightly.

### Deprecation

* deprecated `Assert::isTraversable()` in favor of `Assert::isIterable()`
  * This was already done in 1.3.0, but it was only done through a silenced `trigger_error`. It is now annotated as well.

## 1.4.0 (2018-12-25)

### Added

* added `Assert::ip()`
* added `Assert::ipv4()`
* added `Assert::ipv6()`
* added `Assert::notRegex()`
* added `Assert::interfaceExists()`
* added `Assert::isList()`
* added `Assert::isMap()`
* added polyfill for ctype

### Fixed

* Special case when comparing objects implementing `__toString()`

## 1.3.0 (2018-01-29)

### Added

* added `Assert::minCount()`
* added `Assert::maxCount()`
* added `Assert::countBetween()`
* added `Assert::isCountable()`
* added `Assert::notWhitespaceOnly()`
* added `Assert::natural()`
* added `Assert::notContains()`
* added `Assert::isArrayAccessible()`
* added `Assert::isInstanceOfAny()`
* added `Assert::isIterable()`

### Fixed

* `stringNotEmpty` will no longer report "0" is an empty string

### Deprecation

* deprecated `Assert::isTraversable()` in favor of `Assert::isIterable()`

## 1.2.0 (2016-11-23)

 * added `Assert::throws()`
 * added `Assert::count()`
 * added extension point `Assert::reportInvalidArgument()` for custom subclasses

## 1.1.0 (2016-08-09)

 * added `Assert::object()`
 * added `Assert::propertyExists()`
 * added `Assert::propertyNotExists()`
 * added `Assert::methodExists()`
 * added `Assert::methodNotExists()`
 * added `Assert::uuid()`

## 1.0.2 (2015-08-24)

 * integrated Style CI
 * add tests for minimum package dependencies on Travis CI

## 1.0.1 (2015-05-12)

 * added support for PHP 5.3.3

## 1.0.0 (2015-05-12)

 * first stable release

## 1.0.0-beta (2015-03-19)

 * first beta release
