From 36483117c54fa201137e911385b74a0797872d2c Mon Sep 17 00:00:00 2001 From: Scott Pringle Date: Sun, 10 May 2015 01:33:35 +0100 Subject: [PATCH 1/5] Minor update to the Mutator so that it doesn't try to update false values --- lib/PHPExif/Hydrator/Mutator.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/PHPExif/Hydrator/Mutator.php b/lib/PHPExif/Hydrator/Mutator.php index 164d57c..746d66c 100644 --- a/lib/PHPExif/Hydrator/Mutator.php +++ b/lib/PHPExif/Hydrator/Mutator.php @@ -33,6 +33,10 @@ class Mutator implements HydratorInterface public function hydrate($object, array $data) { foreach ($data as $property => $value) { + if ($value === false) { + continue; + } + $mutator = $this->determineMutator($property); if (method_exists($object, $mutator)) { From e3edd22d1ca26494aced00230be31696f13d71ec Mon Sep 17 00:00:00 2001 From: Scott Pringle Date: Sun, 10 May 2015 11:27:07 +0100 Subject: [PATCH 2/5] Updated Unit Tests to check for more date strings/invalid date strings when mapping the data, also updated the mapRawData method to ignore false values --- lib/PHPExif/Hydrator/Mutator.php | 3 -- lib/PHPExif/Mapper/Exiftool.php | 11 +++++-- tests/PHPExif/Mapper/ExiftoolMapperTest.php | 35 +++++++++++++++++++++ 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/lib/PHPExif/Hydrator/Mutator.php b/lib/PHPExif/Hydrator/Mutator.php index 746d66c..9c8a0d6 100644 --- a/lib/PHPExif/Hydrator/Mutator.php +++ b/lib/PHPExif/Hydrator/Mutator.php @@ -33,9 +33,6 @@ class Mutator implements HydratorInterface public function hydrate($object, array $data) { foreach ($data as $property => $value) { - if ($value === false) { - continue; - } $mutator = $this->determineMutator($property); diff --git a/lib/PHPExif/Mapper/Exiftool.php b/lib/PHPExif/Mapper/Exiftool.php index e77f504..583510b 100644 --- a/lib/PHPExif/Mapper/Exiftool.php +++ b/lib/PHPExif/Mapper/Exiftool.php @@ -136,7 +136,11 @@ public function mapRawData(array $data) $value = sprintf('%1$sm', $value); break; case self::CREATEDATE: - $value = DateTime::createFromFormat('Y:m:d H:i:s', $value); + try { + $value = new DateTime($value); + } catch (\Exception $exception) { + $value = false; + } break; case self::EXPOSURETIME: $value = '1/' . round(1 / $value); @@ -154,7 +158,10 @@ public function mapRawData(array $data) } // set end result - $mappedData[$key] = $value; + if ($value !== false) { + // Only map data when it does not equal a false value + $mappedData[$key] = $value; + } } // add GPS coordinates, if available diff --git a/tests/PHPExif/Mapper/ExiftoolMapperTest.php b/tests/PHPExif/Mapper/ExiftoolMapperTest.php index 485cda8..502e7a6 100644 --- a/tests/PHPExif/Mapper/ExiftoolMapperTest.php +++ b/tests/PHPExif/Mapper/ExiftoolMapperTest.php @@ -236,4 +236,39 @@ public function testSetNumericInProperty() $this->assertEquals($expected, $reflProperty->getValue($this->mapper)); } + + public function testMapRawDataCorrectlyFormatsDifferentDateTimeString() + { + $rawData = [ + \PHPExif\Mapper\Exiftool::CREATEDATE => '2014-12-15 00:12:00' + ]; + + $mapped = $this->mapper->mapRawData( + $rawData + ); + + $result = reset($mapped); + $this->assertInstanceOf('\DateTime', $result); + $this->assertEquals( + reset($rawData), + $result->format("Y-m-d H:i:s") + ); + } + + public function testMapRawDataCorrectlyIgnoresInvalidCreateDate() + { + $rawData = [ + \PHPExif\Mapper\Exiftool::CREATEDATE => 'Invalid Date String' + ]; + + $result = $this->mapper->mapRawData( + $rawData + ); + + $this->assertCount(0, $result); + $this->assertNotEquals( + reset($rawData), + $result + ); + } } From 823e994461657390932b8e6712183ae3f305186d Mon Sep 17 00:00:00 2001 From: Scott Pringle Date: Sun, 10 May 2015 11:35:10 +0100 Subject: [PATCH 3/5] Updated to use PHP5.3 array syntax --- tests/PHPExif/Mapper/ExiftoolMapperTest.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/PHPExif/Mapper/ExiftoolMapperTest.php b/tests/PHPExif/Mapper/ExiftoolMapperTest.php index 502e7a6..5de1db1 100644 --- a/tests/PHPExif/Mapper/ExiftoolMapperTest.php +++ b/tests/PHPExif/Mapper/ExiftoolMapperTest.php @@ -239,9 +239,9 @@ public function testSetNumericInProperty() public function testMapRawDataCorrectlyFormatsDifferentDateTimeString() { - $rawData = [ + $rawData = array( \PHPExif\Mapper\Exiftool::CREATEDATE => '2014-12-15 00:12:00' - ]; + ); $mapped = $this->mapper->mapRawData( $rawData @@ -257,9 +257,9 @@ public function testMapRawDataCorrectlyFormatsDifferentDateTimeString() public function testMapRawDataCorrectlyIgnoresInvalidCreateDate() { - $rawData = [ + $rawData = array( \PHPExif\Mapper\Exiftool::CREATEDATE => 'Invalid Date String' - ]; + ); $result = $this->mapper->mapRawData( $rawData From 7638eaa56bcd7fe84e1570b160befc9c0ab2672e Mon Sep 17 00:00:00 2001 From: Scott Pringle Date: Thu, 14 May 2015 13:43:55 +0100 Subject: [PATCH 4/5] Updated test to continue rather than update the value --- lib/PHPExif/Mapper/Exiftool.php | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/lib/PHPExif/Mapper/Exiftool.php b/lib/PHPExif/Mapper/Exiftool.php index 583510b..85de8ea 100644 --- a/lib/PHPExif/Mapper/Exiftool.php +++ b/lib/PHPExif/Mapper/Exiftool.php @@ -139,7 +139,7 @@ public function mapRawData(array $data) try { $value = new DateTime($value); } catch (\Exception $exception) { - $value = false; + continue 2; } break; case self::EXPOSURETIME: @@ -158,10 +158,7 @@ public function mapRawData(array $data) } // set end result - if ($value !== false) { - // Only map data when it does not equal a false value - $mappedData[$key] = $value; - } + $mappedData[$key] = $value; } // add GPS coordinates, if available From c61c855e83b2f516a33790b8d30775ca4a903ccb Mon Sep 17 00:00:00 2001 From: Scott Pringle Date: Thu, 14 May 2015 13:52:04 +0100 Subject: [PATCH 5/5] Added tests to the Native mapper --- lib/PHPExif/Mapper/Native.php | 7 ++++- tests/PHPExif/Mapper/NativeMapperTest.php | 35 +++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/lib/PHPExif/Mapper/Native.php b/lib/PHPExif/Mapper/Native.php index be1c328..fdc483b 100644 --- a/lib/PHPExif/Mapper/Native.php +++ b/lib/PHPExif/Mapper/Native.php @@ -13,6 +13,7 @@ use PHPExif\Exif; use DateTime; +use Exception; /** * PHP Exif Native Mapper @@ -142,7 +143,11 @@ public function mapRawData(array $data) // manipulate the value if necessary switch ($field) { case self::DATETIMEORIGINAL: - $value = DateTime::createFromFormat('Y:m:d H:i:s', $value); + try { + $value = new DateTime($value); + } catch (Exception $exception) { + continue 2; + } break; case self::EXPOSURETIME: // normalize ExposureTime diff --git a/tests/PHPExif/Mapper/NativeMapperTest.php b/tests/PHPExif/Mapper/NativeMapperTest.php index d6e78fc..5f2e11c 100644 --- a/tests/PHPExif/Mapper/NativeMapperTest.php +++ b/tests/PHPExif/Mapper/NativeMapperTest.php @@ -187,4 +187,39 @@ public function testMapRawDataCorrectlyFormatsGPSData() $expected = '40.333452380952,-20.167314814815'; $this->assertEquals($expected, reset($result)); } + + public function testMapRawDataCorrectlyFormatsDifferentDateTimeString() + { + $rawData = array( + \PHPExif\Mapper\Native::DATETIMEORIGINAL => '2014-12-15 00:12:00' + ); + + $mapped = $this->mapper->mapRawData( + $rawData + ); + + $result = reset($mapped); + $this->assertInstanceOf('\DateTime', $result); + $this->assertEquals( + reset($rawData), + $result->format("Y-m-d H:i:s") + ); + } + + public function testMapRawDataCorrectlyIgnoresInvalidCreateDate() + { + $rawData = array( + \PHPExif\Mapper\Native::DATETIMEORIGINAL => 'Invalid Date String' + ); + + $result = $this->mapper->mapRawData( + $rawData + ); + + $this->assertCount(0, $result); + $this->assertNotEquals( + reset($rawData), + $result + ); + } }