Skip to content

Commit

Permalink
[Serializer] added support for is.* methods in GetSetMethodNormalizer
Browse files Browse the repository at this point in the history
  • Loading branch information
Marcin Chwedziak authored and fabpot committed Mar 3, 2014
1 parent 4a0f2ce commit edf13b5
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 19 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
@@ -1,6 +1,11 @@
CHANGELOG
=========

2.5.0
-----

* added support for `is.*` getters in `GetSetMethodNormalizer`

2.4.0
-----

Expand Down
12 changes: 7 additions & 5 deletions Normalizer/GetSetMethodNormalizer.php
Expand Up @@ -88,7 +88,7 @@ public function normalize($object, $format = null, array $context = array())
$attributes = array();
foreach ($reflectionMethods as $method) {
if ($this->isGetMethod($method)) {
$attributeName = lcfirst(substr($method->name, 3));
$attributeName = lcfirst(substr($method->name, 0 === strpos($method->name, 'is') ? 2 : 3));

if (in_array($attributeName, $this->ignoredAttributes)) {
continue;
Expand Down Expand Up @@ -211,17 +211,19 @@ private function supports($class)
}

/**
* Checks if a method's name is get.* and can be called without parameters.
* Checks if a method's name is get.* or is.*, and can be called without parameters.
*
* @param \ReflectionMethod $method the method to check
*
* @return Boolean whether the method is a getter.
* @return Boolean whether the method is a getter or boolean getter.
*/
private function isGetMethod(\ReflectionMethod $method)
{
$methodLength = strlen($method->name);

return (
0 === strpos($method->name, 'get') &&
3 < strlen($method->name) &&
((0 === strpos($method->name, 'get') && 3 < $methodLength) ||
(0 === strpos($method->name, 'is') && 2 < $methodLength)) &&
0 === $method->getNumberOfRequiredParameters()
);
}
Expand Down
50 changes: 36 additions & 14 deletions Tests/Normalizer/GetSetMethodNormalizerTest.php
Expand Up @@ -26,22 +26,24 @@ public function testNormalize()
$obj = new GetSetDummy();
$obj->setFoo('foo');
$obj->setBar('bar');
$obj->setBaz(true);
$obj->setCamelCase('camelcase');
$this->assertEquals(
array('foo' => 'foo', 'bar' => 'bar', 'fooBar' => 'foobar', 'camelCase' => 'camelcase'),
array('foo' => 'foo', 'bar' => 'bar', 'baz' => true, 'fooBar' => 'foobar', 'camelCase' => 'camelcase'),
$this->normalizer->normalize($obj, 'any')
);
}

public function testDenormalize()
{
$obj = $this->normalizer->denormalize(
array('foo' => 'foo', 'bar' => 'bar', 'fooBar' => 'foobar'),
array('foo' => 'foo', 'bar' => 'bar', 'baz' => true, 'fooBar' => 'foobar'),
__NAMESPACE__.'\GetSetDummy',
'any'
);
$this->assertEquals('foo', $obj->getFoo());
$this->assertEquals('bar', $obj->getBar());
$this->assertTrue($obj->isBaz());
}

public function testDenormalizeOnCamelCaseFormat()
Expand Down Expand Up @@ -80,10 +82,11 @@ public function attributeProvider()
public function testConstructorDenormalize()
{
$obj = $this->normalizer->denormalize(
array('foo' => 'foo', 'bar' => 'bar', 'fooBar' => 'foobar'),
array('foo' => 'foo', 'bar' => 'bar', 'baz' => true, 'fooBar' => 'foobar'),
__NAMESPACE__.'\GetConstructorDummy', 'any');
$this->assertEquals('foo', $obj->getFoo());
$this->assertEquals('bar', $obj->getBar());
$this->assertTrue($obj->isBaz());
}

/**
Expand All @@ -93,7 +96,7 @@ public function testCallbacks($callbacks, $value, $result, $message)
{
$this->normalizer->setCallbacks($callbacks);

$obj = new GetConstructorDummy('', $value);
$obj = new GetConstructorDummy('', $value, true);

$this->assertEquals(
$result,
Expand All @@ -109,18 +112,19 @@ public function testUncallableCallbacks()
{
$this->normalizer->setCallbacks(array('bar' => null));

$obj = new GetConstructorDummy('baz', 'quux');
$obj = new GetConstructorDummy('baz', 'quux', true);

$this->normalizer->normalize($obj, 'any');
}

public function testIgnoredAttributes()
{
$this->normalizer->setIgnoredAttributes(array('foo', 'bar', 'camelCase'));
$this->normalizer->setIgnoredAttributes(array('foo', 'bar', 'baz', 'camelCase'));

$obj = new GetSetDummy();
$obj->setFoo('foo');
$obj->setBar('bar');
$obj->setBaz(true);

$this->assertEquals(
array('fooBar' => 'foobar'),
Expand All @@ -138,7 +142,7 @@ public function provideCallbacks()
},
),
'baz',
array('foo' => '', 'bar' => 'baz'),
array('foo' => '', 'bar' => 'baz', 'baz' => true),
'Change a string',
),
array(
Expand All @@ -148,7 +152,7 @@ public function provideCallbacks()
},
),
'baz',
array('foo' => '', 'bar' => null),
array('foo' => '', 'bar' => null, 'baz' => true),
'Null an item'
),
array(
Expand All @@ -158,7 +162,7 @@ public function provideCallbacks()
},
),
new \DateTime('2011-09-10 06:30:00'),
array('foo' => '', 'bar' => '10-09-2011 06:30:00'),
array('foo' => '', 'bar' => '10-09-2011 06:30:00', 'baz' => true),
'Format a date',
),
array(
Expand All @@ -172,8 +176,8 @@ public function provideCallbacks()
return $foos;
},
),
array(new GetConstructorDummy('baz', ''), new GetConstructorDummy('quux', '')),
array('foo' => '', 'bar' => 'bazquux'),
array(new GetConstructorDummy('baz', '', false), new GetConstructorDummy('quux', '', false)),
array('foo' => '', 'bar' => 'bazquux', 'baz' => true),
'Collect a property',
),
array(
Expand All @@ -182,8 +186,8 @@ public function provideCallbacks()
return count($bars);
},
),
array(new GetConstructorDummy('baz', ''), new GetConstructorDummy('quux', '')),
array('foo' => '', 'bar' => 2),
array(new GetConstructorDummy('baz', '', false), new GetConstructorDummy('quux', '', false)),
array('foo' => '', 'bar' => 2, 'baz' => true),
'Count a property',
),
);
Expand All @@ -194,6 +198,7 @@ class GetSetDummy
{
protected $foo;
private $bar;
private $baz;
protected $camelCase;

public function getFoo()
Expand All @@ -216,6 +221,16 @@ public function setBar($bar)
$this->bar = $bar;
}

public function isBaz()
{
return $this->baz;
}

public function setBaz($baz)
{
$this->baz = $baz;
}

public function getFooBar()
{
return $this->foo.$this->bar;
Expand All @@ -241,11 +256,13 @@ class GetConstructorDummy
{
protected $foo;
private $bar;
private $baz;

public function __construct($foo, $bar)
public function __construct($foo, $bar, $baz)
{
$this->foo = $foo;
$this->bar = $bar;
$this->baz = $baz;
}

public function getFoo()
Expand All @@ -258,6 +275,11 @@ public function getBar()
return $this->bar;
}

public function isBaz()
{
return $this->baz;
}

public function otherMethod()
{
throw new \RuntimeException("Dummy::otherMethod() should not be called");
Expand Down

0 comments on commit edf13b5

Please sign in to comment.