From 2942148487caeeb742c002a5e3e2e437327dae9d Mon Sep 17 00:00:00 2001 From: Alex Whitman Date: Wed, 17 Jul 2013 16:49:10 +0100 Subject: [PATCH 1/3] Make attributes and return values presentable where applicable --- src/Robbo/Presenter/Presenter.php | 36 ++++++++++++++++++++++-- src/Robbo/Presenter/View/Environment.php | 32 +++------------------ src/Robbo/Presenter/View/View.php | 3 +- tests/ViewEnvironmentTest.php | 4 +-- 4 files changed, 42 insertions(+), 33 deletions(-) diff --git a/src/Robbo/Presenter/Presenter.php b/src/Robbo/Presenter/Presenter.php index 39e22b9..ead9cd3 100755 --- a/src/Robbo/Presenter/Presenter.php +++ b/src/Robbo/Presenter/Presenter.php @@ -1,5 +1,8 @@ $method(); } - return is_array($this->object) ? $this->object[$var] : $this->object->$var; + $value = is_array($this->object) ? $this->object[$var] : $this->object->$var; + + return static::makePresentable($value); } /** @@ -120,9 +125,36 @@ public function __call($method, $arguments) { if (is_object($this->object)) { - return call_user_func_array(array($this->object, $method), $arguments); + $value = call_user_func_array(array($this->object, $method), $arguments); + + return static::makePresentable($value); } throw new \BadMethodCallException("Method {$method} does not exist."); } + + /** + * If this variable implements Robbo\Presenter\PresentableInterface then turn it into a presenter. + * + * @param mixed $value + * @return mixed $value + */ + public static function makePresentable($value) + { + if ($value instanceof PresentableInterface) + { + return $value->getPresenter(); + } + + if (is_array($value) or ($value instanceof IteratorAggregate and $value instanceof ArrayAccess)) + { + foreach ($value as $k => $v) + { + $value[$k] = static::makePresentable($v); + } + } + + return $value; + } + } diff --git a/src/Robbo/Presenter/View/Environment.php b/src/Robbo/Presenter/View/Environment.php index 530f080..5f0de2c 100755 --- a/src/Robbo/Presenter/View/Environment.php +++ b/src/Robbo/Presenter/View/Environment.php @@ -1,7 +1,6 @@ parseData($data)); - return new View($this, $this->getEngineFromPath($path), $view, $path, $this->makePresentable($data)); + return new View($this, $this->getEngineFromPath($path), $view, $path, Presenter::makePresentable($data)); } /** @@ -35,33 +34,10 @@ public function share($key, $value = null) { if ( ! is_array($key)) { - return parent::share($key, $this->makePresentable($value)); + return parent::share($key, Presenter::makePresentable($value)); } - return parent::share($this->makePresentable($key)); + return parent::share(Presenter::makePresentable($key)); } - /** - * If this variable implements Robbo\Presenter\PresentableInterface then turn it into a presenter. - * - * @param mixed $value - * @return mixed $value - */ - public function makePresentable($value) - { - if ($value instanceof PresentableInterface) - { - return $value->getPresenter(); - } - - if (is_array($value) or ($value instanceof IteratorAggregate and $value instanceof ArrayAccess)) - { - foreach ($value as $k => $v) - { - $value[$k] = $this->makePresentable($v); - } - } - - return $value; - } } diff --git a/src/Robbo/Presenter/View/View.php b/src/Robbo/Presenter/View/View.php index 9fb9dea..b2a4bd8 100755 --- a/src/Robbo/Presenter/View/View.php +++ b/src/Robbo/Presenter/View/View.php @@ -1,5 +1,6 @@ environment->makePresentable($value)); + return parent::with($key, Presenter::makePresentable($value)); } } \ No newline at end of file diff --git a/tests/ViewEnvironmentTest.php b/tests/ViewEnvironmentTest.php index ff3af2c..65d3090 100755 --- a/tests/ViewEnvironmentTest.php +++ b/tests/ViewEnvironmentTest.php @@ -16,7 +16,7 @@ public function tearDown() public function testPresentableToPresenter() { - $presenter = $this->getEnvironment()->makePresentable(new PresentableStub); + $presenter = Presenter::makePresentable(new PresentableStub); $this->assertTrue($presenter instanceof Presenter); } @@ -33,7 +33,7 @@ public function testPresentablesToPresenters() )) ); - $to = $this->getEnvironment()->makePresentable($from); + $to = Presenter::makePresentable($from); $this->assertSame($from['string'], $to['string']); $this->assertSame($from['array'], $to['array']); From b2ee8bdbd88640eb40fc183d447e43231f394d47 Mon Sep 17 00:00:00 2001 From: Alex Whitman Date: Thu, 18 Jul 2013 10:38:11 +0100 Subject: [PATCH 2/3] Use assertInstanceOf where applicable in tests Provides better error messages on test failure. --- tests/ViewEnvironmentTest.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/ViewEnvironmentTest.php b/tests/ViewEnvironmentTest.php index 65d3090..473d298 100755 --- a/tests/ViewEnvironmentTest.php +++ b/tests/ViewEnvironmentTest.php @@ -18,7 +18,7 @@ public function testPresentableToPresenter() { $presenter = Presenter::makePresentable(new PresentableStub); - $this->assertTrue($presenter instanceof Presenter); + $this->assertInstanceOf('Robbo\Presenter\Presenter', $presenter); } public function testPresentablesToPresenters() @@ -37,9 +37,9 @@ public function testPresentablesToPresenters() $this->assertSame($from['string'], $to['string']); $this->assertSame($from['array'], $to['array']); - $this->assertTrue($to['presentable'] instanceof Presenter); - $this->assertTrue($to['recurseMe'][0]['presentable'] instanceof Presenter); - $this->assertTrue($to['collection']['presentable'] instanceof Presenter); + $this->assertInstanceOf('Robbo\Presenter\Presenter', $to['presentable']); + $this->assertInstanceOf('Robbo\Presenter\Presenter', $to['recurseMe'][0]['presentable']); + $this->assertInstanceOf('Robbo\Presenter\Presenter', $to['collection']['presentable']); } public function testMakeView() @@ -57,10 +57,10 @@ public function testMakeView() $view = $env->make('test', $data); - $this->assertTrue($view instanceof View); + $this->assertInstanceOf('Robbo\Presenter\View\View', $view); $this->assertSame($view['meh'], $data['meh']); - $this->assertTrue($view['presentable'] instanceof Presenter); - $this->assertTrue($view['collection']['presentable'] instanceof Presenter); + $this->assertInstanceOf('Robbo\Presenter\Presenter', $view['presentable']); + $this->assertInstanceOf('Robbo\Presenter\Presenter', $view['collection']['presentable']); } protected function getEnvironment() From 9a89187ab0581ef5291c170cf759444ecde109f8 Mon Sep 17 00:00:00 2001 From: Alex Whitman Date: Thu, 18 Jul 2013 11:29:10 +0100 Subject: [PATCH 3/3] Add tests for nested presenters --- tests/ViewEnvironmentTest.php | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/ViewEnvironmentTest.php b/tests/ViewEnvironmentTest.php index 473d298..4fdbf27 100755 --- a/tests/ViewEnvironmentTest.php +++ b/tests/ViewEnvironmentTest.php @@ -38,6 +38,8 @@ public function testPresentablesToPresenters() $this->assertSame($from['string'], $to['string']); $this->assertSame($from['array'], $to['array']); $this->assertInstanceOf('Robbo\Presenter\Presenter', $to['presentable']); + $this->assertInstanceOf('Robbo\Presenter\Presenter', $to['presentable']->presentableObject); + $this->assertInstanceOf('Robbo\Presenter\Presenter', $to['presentable']->getPresentableObject()); $this->assertInstanceOf('Robbo\Presenter\Presenter', $to['recurseMe'][0]['presentable']); $this->assertInstanceOf('Robbo\Presenter\Presenter', $to['collection']['presentable']); } @@ -60,6 +62,8 @@ public function testMakeView() $this->assertInstanceOf('Robbo\Presenter\View\View', $view); $this->assertSame($view['meh'], $data['meh']); $this->assertInstanceOf('Robbo\Presenter\Presenter', $view['presentable']); + $this->assertInstanceOf('Robbo\Presenter\Presenter', $view['presentable']->presentableObject); + $this->assertInstanceOf('Robbo\Presenter\Presenter', $view['presentable']->getPresentableObject()); $this->assertInstanceOf('Robbo\Presenter\Presenter', $view['collection']['presentable']); } @@ -85,6 +89,26 @@ protected function getEngineFromPath($path) class PresentableStub implements PresentableInterface { + public $presentableObject; + + public function __construct() + { + $this->presentableObject = new SecondPresentableStub; + } + + public function getPresentableObject() + { + return $this->presentableObject; + } + + public function getPresenter() + { + return new EnvPresenterStub($this); + } +} + +class SecondPresentableStub implements PresentableInterface { + public function getPresenter() { return new EnvPresenterStub($this);