Skip to content

Commit 6777054

Browse files
committed
Refactor Result Renderering process
1 parent 5c6e57e commit 6777054

17 files changed

+180
-248
lines changed

app/config.php

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
use PhpSchool\PhpWorkshop\ExerciseDispatcher;
2323
use PhpSchool\PhpWorkshop\Factory\EventDispatcherFactory;
2424
use PhpSchool\PhpWorkshop\Factory\MenuFactory;
25+
use PhpSchool\PhpWorkshop\Factory\ResultRendererFactory;
2526
use PhpSchool\PhpWorkshop\Factory\RunnerFactory;
2627
use PhpSchool\PhpWorkshop\Listener\CodePatchListener;
2728
use PhpSchool\PhpWorkshop\Listener\PrepareSolutionListener;
@@ -242,28 +243,16 @@
242243
$c->get(OutputInterface::class)
243244
);
244245
}),
246+
ResultRendererFactory::class => object(),
245247
ResultsRenderer::class => factory(function (ContainerInterface $c) {
246-
$renderer = new ResultsRenderer(
248+
return new ResultsRenderer(
247249
$c->get('appName'),
248250
$c->get(Color::class),
249251
$c->get(TerminalInterface::class),
250252
$c->get(ExerciseRepository::class),
251-
$c->get(SyntaxHighlighter::class)
253+
$c->get(SyntaxHighlighter::class),
254+
$c->get(ResultRendererFactory::class)
252255
);
253-
254-
foreach ($c->get('renderers') as $resultRenderer) {
255-
$renderer->registerRenderer(...$resultRenderer);
256-
}
257-
return $renderer;
258-
}),
259-
'renderers' => factory(function (ContainerInterface $c) {
260-
return [
261-
[StdOutFailure::class, new OutputFailureRenderer],
262-
[CgiOutResult::class, new CgiOutResultRenderer],
263-
[FunctionRequirementsFailure::class, new FunctionRequirementsFailureRenderer],
264-
[Success::class, new SuccessRenderer],
265-
[Failure::class, new FailureRenderer],
266-
];
267256
}),
268257
'coreContributors' => [
269258
'@AydinHassan' => 'Aydin Hassan',

src/Application.php

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,6 @@ final class Application
3333
*/
3434
private $exercises = [];
3535

36-
/**
37-
* @var array
38-
*/
39-
private $renderers = [];
40-
4136
/**
4237
* @var string
4338
*/
@@ -86,16 +81,6 @@ public function addExercise($exercise)
8681
$this->exercises[] = $exercise;
8782
}
8883

89-
/**
90-
* @param ResultRendererInterface $renderer
91-
* @param string $resultClass
92-
*/
93-
public function addRenderer(ResultRendererInterface $renderer, $resultClass)
94-
{
95-
//TODO Use reflection to check that $resultClass exists and implements ResultInterface
96-
$this->renderers[] = [$renderer, $resultClass];
97-
}
98-
9984
/**
10085
* @param string $logo
10186
*/
@@ -154,9 +139,6 @@ public function run()
154139
);
155140
}
156141
}
157-
158-
$renderers = $container->get('renderers');
159-
$container->set('renderers', array_merge($renderers, $this->renderers));
160142

161143
$checkRepository = $container->get(CheckRepository::class);
162144
array_walk($this->checks, function (CheckInterface $check) use ($checkRepository) {

src/Factory/ResultRendererFactory.php

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?php
2+
3+
namespace PhpSchool\PhpWorkshop\Factory;
4+
5+
use PhpSchool\PhpWorkshop\Exception\InvalidArgumentException;
6+
use PhpSchool\PhpWorkshop\Result\CgiOutResult;
7+
use PhpSchool\PhpWorkshop\Result\Failure;
8+
use PhpSchool\PhpWorkshop\Result\FunctionRequirementsFailure;
9+
use PhpSchool\PhpWorkshop\Result\ResultInterface;
10+
use PhpSchool\PhpWorkshop\Result\StdOutFailure;
11+
use PhpSchool\PhpWorkshop\ResultRenderer\CgiOutResultRenderer;
12+
use PhpSchool\PhpWorkshop\ResultRenderer\FailureRenderer;
13+
use PhpSchool\PhpWorkshop\ResultRenderer\FunctionRequirementsFailureRenderer;
14+
use PhpSchool\PhpWorkshop\ResultRenderer\OutputFailureRenderer;
15+
use PhpSchool\PhpWorkshop\ResultRenderer\ResultRendererInterface;
16+
17+
/**
18+
* Class ResultRendererFactory
19+
* @package PhpSchool\PhpWorkshop\Factory
20+
* @author Aydin Hassan <[email protected]>
21+
*/
22+
class ResultRendererFactory
23+
{
24+
/**
25+
* @var array
26+
*/
27+
private $mappings = [
28+
StdOutFailure::class => OutputFailureRenderer::class,
29+
CgiOutResult::class => CgiOutResultRenderer::class,
30+
FunctionRequirementsFailure::class => FunctionRequirementsFailureRenderer::class,
31+
Failure::class => FailureRenderer::class,
32+
];
33+
34+
/**
35+
* @param string $resultClass
36+
* @param string $rendererClass
37+
*/
38+
public function registerRenderer($resultClass, $rendererClass)
39+
{
40+
if (!class_implements($resultClass, ResultInterface::class)) {
41+
throw new InvalidArgumentException;
42+
}
43+
44+
if (!class_implements($rendererClass, ResultRendererInterface::class)) {
45+
throw new InvalidArgumentException;
46+
}
47+
48+
$this->mappings[$resultClass] = $rendererClass;
49+
}
50+
51+
/**
52+
* @param ResultInterface $result
53+
* @return ResultRendererInterface
54+
*/
55+
public function create(ResultInterface $result)
56+
{
57+
$class = get_class($result);
58+
if (!isset($this->mappings[$class])) {
59+
throw new \RuntimeException(sprintf('No renderer found for "%s"', $class));
60+
}
61+
62+
return new $this->mappings[$class]($result);
63+
}
64+
}

src/ResultRenderer/CgiOutResultRenderer.php

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,25 @@ class CgiOutResultRenderer implements ResultRendererInterface
1616
{
1717

1818
/**
19-
* @param ResultInterface $result
19+
* @var CgiOutResult
20+
*/
21+
private $result;
22+
23+
/**
24+
* @param CgiOutResult $result
25+
*/
26+
public function __construct(CgiOutResult $result)
27+
{
28+
$this->result = $result;
29+
}
30+
31+
/**
2032
* @param ResultsRenderer $renderer
2133
* @return string
2234
*/
23-
public function render(ResultInterface $result, ResultsRenderer $renderer)
35+
public function render(ResultsRenderer $renderer)
2436
{
25-
if (!$result instanceof CgiOutResult) {
26-
throw new \InvalidArgumentException(sprintf('Incompatible result type: %s', get_class($result)));
27-
}
28-
29-
$results = array_filter($result->getIterator()->getArrayCopy(), function (ResultInterface $result) {
37+
$results = array_filter($this->result->getIterator()->getArrayCopy(), function (ResultInterface $result) {
3038
return $result instanceof FailureInterface;
3139
});
3240

src/ResultRenderer/FailureRenderer.php

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,25 @@
1111
*/
1212
class FailureRenderer implements ResultRendererInterface
1313
{
14+
/**
15+
* @var Failure
16+
*/
17+
private $result;
18+
19+
/**
20+
* @param Failure $result
21+
*/
22+
public function __construct(Failure $result)
23+
{
24+
$this->result = $result;
25+
}
1426

1527
/**
16-
* @param ResultInterface $result
1728
* @param ResultsRenderer $renderer
1829
* @return string
1930
*/
20-
public function render(ResultInterface $result, ResultsRenderer $renderer)
31+
public function render(ResultsRenderer $renderer)
2132
{
22-
if (!$result instanceof Failure) {
23-
throw new \InvalidArgumentException(sprintf('Incompatible result type: %s', get_class($result)));
24-
}
25-
26-
return ' ' . $result->getReason() . "\n";
33+
return ' ' . $this->result->getReason() . "\n";
2734
}
2835
}

src/ResultRenderer/FunctionRequirementsFailureRenderer.php

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
namespace PhpSchool\PhpWorkshop\ResultRenderer;
44

55
use PhpSchool\PhpWorkshop\Result\FunctionRequirementsFailure;
6-
use PhpSchool\PhpWorkshop\Result\ResultInterface;
76

87
/**
98
* Class FunctionRequirementsFailureRenderer
@@ -12,20 +11,27 @@
1211
*/
1312
class FunctionRequirementsFailureRenderer implements ResultRendererInterface
1413
{
14+
/**
15+
* @var FunctionRequirementsFailure
16+
*/
17+
private $result;
18+
19+
/**
20+
* @param FunctionRequirementsFailure $result
21+
*/
22+
public function __construct(FunctionRequirementsFailure $result)
23+
{
24+
$this->result = $result;
25+
}
1526

1627
/**
17-
* @param ResultInterface $result
1828
* @param ResultsRenderer $renderer
1929
* @return string
2030
*/
21-
public function render(ResultInterface $result, ResultsRenderer $renderer)
31+
public function render(ResultsRenderer $renderer)
2232
{
23-
if (!$result instanceof FunctionRequirementsFailure) {
24-
throw new \InvalidArgumentException(sprintf('Incompatible result type: %s', get_class($result)));
25-
}
26-
2733
$output = '';
28-
if (count($bannedFunctions = $result->getBannedFunctions())) {
34+
if (count($bannedFunctions = $this->result->getBannedFunctions())) {
2935
$output .= sprintf(
3036
" %s\n%s\n",
3137
$renderer->style(
@@ -38,7 +44,7 @@ public function render(ResultInterface $result, ResultsRenderer $renderer)
3844
);
3945
}
4046

41-
if (count($missingFunctions = $result->getMissingFunctions())) {
47+
if (count($missingFunctions = $this->result->getMissingFunctions())) {
4248
$output .= sprintf(
4349
" %s\n%s\n",
4450
$renderer->style(

src/ResultRenderer/OutputFailureRenderer.php

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
namespace PhpSchool\PhpWorkshop\ResultRenderer;
44

55
use PhpSchool\PhpWorkshop\Result\CgiOutBodyFailure;
6-
use PhpSchool\PhpWorkshop\Result\ResultInterface;
76
use PhpSchool\PhpWorkshop\Result\StdOutFailure;
87

98
/**
@@ -14,22 +13,30 @@ class OutputFailureRenderer implements ResultRendererInterface
1413
{
1514

1615
/**
17-
* @param ResultInterface $result
16+
* @var StdOutFailure
17+
*/
18+
private $result;
19+
20+
/**
21+
* @param StdOutFailure $result
22+
*/
23+
public function __construct(StdOutFailure $result)
24+
{
25+
$this->result = $result;
26+
}
27+
28+
/**
1829
* @param ResultsRenderer $renderer
1930
* @return string
2031
*/
21-
public function render(ResultInterface $result, ResultsRenderer $renderer)
32+
public function render(ResultsRenderer $renderer)
2233
{
23-
if (!$result instanceof StdOutFailure) {
24-
throw new \InvalidArgumentException(sprintf('Incompatible result type: %s', get_class($result)));
25-
}
26-
2734
return sprintf(
2835
" %s\n%s\n\n %s\n%s\n",
2936
$renderer->style("ACTUAL", ['bold', 'underline', 'yellow']),
30-
$this->indent($renderer->style(sprintf('"%s"', $result->getActualOutput()), 'red')),
37+
$this->indent($renderer->style(sprintf('"%s"', $this->result->getActualOutput()), 'red')),
3138
$renderer->style("EXPECTED", ['yellow', 'bold', 'underline']),
32-
$this->indent($renderer->style(sprintf('"%s"', $result->getExpectedOutput()), 'red'))
39+
$this->indent($renderer->style(sprintf('"%s"', $this->result->getExpectedOutput()), 'red'))
3340
);
3441
}
3542

src/ResultRenderer/ResultRendererInterface.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,8 @@ interface ResultRendererInterface
1212
{
1313

1414
/**
15-
* @param ResultInterface $result
1615
* @param ResultsRenderer $renderer
1716
* @return string
1817
*/
19-
public function render(ResultInterface $result, ResultsRenderer $renderer);
18+
public function render(ResultsRenderer $renderer);
2019
}

0 commit comments

Comments
 (0)