== Version 2.0.0.0 ==

A new beginning...

* Upgraded to Java 7

* Build with Gradle

* Publish a single jar java-hamcrest-x.x.x.x.jar

* Removed deprecated methods from previous release

* Improve mismatch description of hasItem/hasItems

* General improvements to mismatch descriptions

* Several JavaDoc improvements and corrections

* Fix gh issue #69 - Iterable contains in order is null-safe

* Fix gh issue #59 - added equalToObject() (i.e. unchecked) method

* Fix gh issue #25 - arrayContaining(null, null) cause NullPointerException

* Fix gh issue #36 - string matching on regular expressions

* Fix gh issue #8 - isCloseTo() shows wrong delta in mismatch description

* Fix issue 131 - Implement IsEmptyMap, IsMapWithSize

* Fix issue 155 - Deprecated several matcher factory methods of the for "isXyz"

* Fix issue 187 - IsArray.describeMismatchSafely() should use Matcher.describeMismatch

* Fix issue 155 - Add Matcher implementation for files

* Fix issue 59 - add untyped version of equalTo, named equalToObject

* Fix issue 69 - fix NPE in IsIterableContainingInOrder

* Fix issue 75 - address doclint errors reported in JDK 1.8

== Version 1.3: Released July 09 2012 ==

* Introduce Condition class to ease the implementation of multi-step matches

* Upgrade qdox (included in the generator) to the latest stable version

* Correct inadvertent deprecation of the Is.isA factory method

* Fix issue 179 - AllOf does not output mismatch description

* Fix issue 177 - Introduced closeTo matcher for BigDecimals

* Fix issue 152 - Factory classes missing from matchers.xml

* Fix issue 144 - OrderingComparison doesn't describe mismatch of comparables that return values other than (-1,0,1)

* Fix issue 134 - DescribedAs does not delegate describeMismatch

* Fix issue 106 - deprecation warning when writing custom matchers

* Fix issue 101 - Added theInstance alias for sameInstance factory method

== Version 1.3 RC2: Released October 22 2010 ==

* Added FeatureMatcher

* distinguish between instanceOf() and any()

== Version 1.2: Released May 16 2009 ==

* Added mismatch reporting

* Added WithSamePropertyValuesAs matcher

* Moved any() from IsAnything to IsInstanceOf. It now checks the type of the matched object

* Moved MatcherAssert from integration to core

* Tightened up generics.  

* Added IsMapContainingKey and IsMapContainingValue matchers to resolve a 
  generics bug in hasKey and hasValue static factories previously declared
  in IsMapContaining (ngd)

* Added IsCollectionOnlyContaining and IsArrayOnlyContaining which matches 
  collections (and arrays) where all match a given matcher. E.g onlyContains(3,4,5) 
  or onlyContains(lessThan(9))

* text module moved to separate project, hamcrest-text-patterns

* added more colection matchers: xContainingInAnyOrder, xContainingInOrder, xWithSize

* new text Matcher: IsEmptyString

* hamcrest generator uses method return type 

== Version 1.1: Released Jun 30 2007 ==

* Hamcrest Generator now includes JavaDoc and parameter names in generated code
  by using QDox to parse the source code.

* Created hamcrest-core.jar (and removed hamcrest-api.jar).
  Moved core set of matchers (and, eq, not, etc)
  to this package to make it more practical for external libraries
  to embed Hamcrest.

* Created CoreMatchers (static import sugar) in hamcrest-core.jar.

* StringBuilder can use any Appendable (not just StringBuffer).

* Added sensible toString() method to BaseMatcher.

* Created StringDescription.asString() alias (because toString() caused issues
  with static imports).

* Relaxed isInstanceOf() matcher generic type so it can be used on any kind of
  object. e.g. assertThat(someUnknownObject, isInstanceOf(String.class));

* Added any(Class<T>), null(Class<T>) and notNull(Class<T>) matchers, which returns
  Matcher<T>. Helpful when the compiler struggles with type inference.

* Modified anyOf() and allOf() to accept mixed-types.

* TypeSafeMatcher.matchesSafely() is now public.

* Generator recognizes @Factory methods that return subclass of Matcher.
  (Fix by David Saff)

== Version 1.0: Released Dec 15 2006 ==

Initial release.
* Support for namespaces in HasXPath
* Bug fix for matching empty elements with HasXPath
