From 9917d175ae5cda5bc2d0cdc8577bc3ece5ab8c56 Mon Sep 17 00:00:00 2001 From: BoShurik Date: Fri, 20 Apr 2018 11:48:36 +0300 Subject: [PATCH 1/2] MapDifferInterface --- src/Differ/MapDiffer.php | 14 ++++++++++++-- src/Differ/MapDifferInterface.php | 16 ++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 src/Differ/MapDifferInterface.php diff --git a/src/Differ/MapDiffer.php b/src/Differ/MapDiffer.php index c3a0b94..074cddd 100644 --- a/src/Differ/MapDiffer.php +++ b/src/Differ/MapDiffer.php @@ -23,7 +23,7 @@ * @license GPL-2.0+ * @author Jeroen De Dauw < jeroendedauw@gmail.com > */ -class MapDiffer implements Differ { +class MapDiffer implements Differ, MapDifferInterface { /** * @var bool @@ -40,6 +40,16 @@ class MapDiffer implements Differ { */ private $valueComparer; + /** + * Create differ for recursive diffs + */ + public static function createRecursive( ValueComparer $comparer = null, Differ $listDiffer = null ) { + $differ = new self( true, null, $comparer ); + $differ->listDiffer = $listDiffer ?? $differ; + + return $differ; + } + /** * The third argument ($comparer) was added in 3.0 */ @@ -134,7 +144,7 @@ private function getDiffForArrays( array $old, array $new ): Diff { return new Diff( $this->doDiff( $old, $new ), true ); } - return new Diff( $this->listDiffer->doDiff( $old, $new ), false ); + return new Diff( $this->listDiffer->doDiff( $old, $new ), $this->listDiffer instanceof MapDifferInterface ); } /** diff --git a/src/Differ/MapDifferInterface.php b/src/Differ/MapDifferInterface.php new file mode 100644 index 0000000..9e745bf --- /dev/null +++ b/src/Differ/MapDifferInterface.php @@ -0,0 +1,16 @@ + + */ +interface MapDifferInterface { + +} From 6357386d0a773711a366e3ecc58bdecab62bd30e Mon Sep 17 00:00:00 2001 From: Jeroen De Dauw Date: Tue, 24 Apr 2018 08:47:42 +0200 Subject: [PATCH 2/2] Allow constructing recursive MapDiffer that uses itself --- RELEASE-NOTES.md | 2 ++ src/Differ/Differ.php | 2 ++ src/Differ/MapDiffer.php | 33 +++++++++++++++++++------------ src/Differ/MapDifferInterface.php | 5 +++-- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index d0ff9c4..6697207 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -6,6 +6,8 @@ Latest release: ## Version 3.2 (dev) +* Added ability to construct a recursive `MapDiffer` that uses itself to diff elements (via `MapDiffer::newRecursiveDiffer`) +* You can now pass non-list-differs as the second constructor argument in `MapDiffer` * Deprecated constant `Diff_VERSION` ## Version 3.1 (2018-04-17) diff --git a/src/Differ/Differ.php b/src/Differ/Differ.php index de57a85..1624e60 100644 --- a/src/Differ/Differ.php +++ b/src/Differ/Differ.php @@ -10,6 +10,8 @@ /** * Interface for objects that can diff two arrays to an array of DiffOp. * + * If the diff is done associatively, the differ should implement MapDifferInterface. + * * @since 0.4 * * @license GPL-2.0+ diff --git a/src/Differ/MapDiffer.php b/src/Differ/MapDiffer.php index 074cddd..56e0cfe 100644 --- a/src/Differ/MapDiffer.php +++ b/src/Differ/MapDiffer.php @@ -23,7 +23,7 @@ * @license GPL-2.0+ * @author Jeroen De Dauw < jeroendedauw@gmail.com > */ -class MapDiffer implements Differ, MapDifferInterface { +class MapDiffer implements MapDifferInterface { /** * @var bool @@ -33,7 +33,7 @@ class MapDiffer implements Differ, MapDifferInterface { /** * @var Differ */ - private $listDiffer; + private $elementDiffer; /** * @var ValueComparer @@ -41,22 +41,26 @@ class MapDiffer implements Differ, MapDifferInterface { private $valueComparer; /** - * Create differ for recursive diffs + * The third argument ($comparer) was added in 3.0 */ - public static function createRecursive( ValueComparer $comparer = null, Differ $listDiffer = null ) { - $differ = new self( true, null, $comparer ); - $differ->listDiffer = $listDiffer ?? $differ; + public function __construct( bool $recursively = false, Differ $elementDiffer = null, + ValueComparer $comparer = null ) { - return $differ; + $this->recursively = $recursively; + $this->elementDiffer = $elementDiffer ?? new ListDiffer(); + $this->valueComparer = $comparer ?? new StrictComparer(); } /** - * The third argument ($comparer) was added in 3.0 + * Creates a recursive MapDiffer that by default uses itself to diff elements recursively + * + * @since 3.2 */ - public function __construct( bool $recursively = false, Differ $listDiffer = null, ValueComparer $comparer = null ) { - $this->recursively = $recursively; - $this->listDiffer = $listDiffer ?? new ListDiffer(); - $this->valueComparer = $comparer ?? new StrictComparer(); + public static function newRecursiveDiffer( ValueComparer $comparer = null, Differ $elementDiffer = null ) { + $differ = new self( true, null, $comparer ); + $differ->elementDiffer = $elementDiffer ?? $differ; + + return $differ; } /** @@ -144,7 +148,10 @@ private function getDiffForArrays( array $old, array $new ): Diff { return new Diff( $this->doDiff( $old, $new ), true ); } - return new Diff( $this->listDiffer->doDiff( $old, $new ), $this->listDiffer instanceof MapDifferInterface ); + return new Diff( + $this->elementDiffer->doDiff( $old, $new ), + $this->elementDiffer instanceof MapDifferInterface + ); } /** diff --git a/src/Differ/MapDifferInterface.php b/src/Differ/MapDifferInterface.php index 9e745bf..ea29ebf 100644 --- a/src/Differ/MapDifferInterface.php +++ b/src/Differ/MapDifferInterface.php @@ -4,13 +4,14 @@ namespace Diff\Differ; /** - * Interface for differ that can diff two maps. + * Differ that diffs associatively (holding the array keys into account). + * These differs can produce associative diff operations (changes and diffs). * * @since 3.2 * * @license GPL-2.0+ * @author Alexander Borisov < boshurik@gmail.com > */ -interface MapDifferInterface { +interface MapDifferInterface extends Differ { }