Skip to content

Commit 51b3827

Browse files
committed
Patch applyer refactoring.
1 parent 16b0224 commit 51b3827

File tree

2 files changed

+76
-32
lines changed

2 files changed

+76
-32
lines changed

src/Patch.php

Lines changed: 74 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,81 +8,125 @@
88
class Patch
99
{
1010

11-
private $reader;
11+
private $dataReader;
1212

13+
private $patchReader;
1314

14-
public function __construct(SelectableReaderInterface $reader)
15+
private $dataPointer;
16+
17+
private $patchPointer;
18+
19+
20+
public function __construct(SelectableReaderInterface $dataReader)
1521
{
16-
$this->reader = $reader;
22+
$this->dataReader = $dataReader;
1723
}
1824

1925

2026
public function apply(SelectableReaderInterface $patchReader)
2127
{
22-
$patchReader->selectRoot();
23-
if (!$patchReader->isArraySelected()) {
24-
throw new \Exception("Patch must be an array");
28+
$this
29+
->setPatchReader($patchReader)
30+
->getPatchReader()
31+
->selectRoot();
32+
if (!$this->getPatchReader()->isArraySelected()) {
33+
throw new \RuntimeException("Patch must be an array");
2534
}
26-
$operationCount = $patchReader->getElementCount();
35+
$operationCount = $this
36+
->getPatchReader()
37+
->getElementCount();
2738
for ($operationIndex = 0; $operationIndex < $operationCount; $operationIndex++) {
28-
$this->performOperation($operationIndex, $patchReader);
39+
$this->performOperation($operationIndex);
2940
}
3041
return $this;
3142
}
3243

3344

34-
protected function getReader(): SelectableReaderInterface
45+
protected function getDataReader(): SelectableReaderInterface
3546
{
36-
return $this->reader;
47+
return $this->dataReader;
3748
}
3849

3950

40-
protected function performOperation(int $index, SelectableReaderInterface $patchReader)
51+
protected function performOperation(int $index)
4152
{
42-
$patchPointer = new Pointer($patchReader);
43-
$op = $patchPointer->read("/{$index}/op")->getData();
44-
$path = $patchPointer->read("/{$index}/path")->getData();
45-
$dataPointer = new Pointer($this->getReader());
53+
$op = $this->getPatchPointer()->read("/{$index}/op")->getData();
54+
$path = $this->getPatchPointer()->read("/{$index}/path")->getData();
4655
switch ($op) {
4756
case 'add':
48-
$valueReader = $patchPointer->read("/{$index}/value");
49-
$dataPointer->add($path, $valueReader);
57+
$valueReader = $this->getPatchPointer()->read("/{$index}/value");
58+
$this->getDataPointer()->add($path, $valueReader);
5059
break;
5160

5261
case 'remove':
53-
$dataPointer->remove($path);
62+
$this->getDataPointer()->remove($path);
5463
break;
5564

5665
case 'replace':
57-
$valueReader = $patchPointer->read("/{$index}/value");
58-
$dataPointer->replace($path, $valueReader);
66+
$valueReader = $this->getPatchPointer()->read("/{$index}/value");
67+
$this->getDataPointer()->replace($path, $valueReader);
5968
break;
6069

6170
case 'test':
62-
$expectedValueReader = $patchPointer->read("/{$index}/value");
63-
$actualValueReader = $dataPointer->read($path);
71+
$expectedValueReader = $this->getPatchPointer()->read("/{$index}/value");
72+
$actualValueReader = $this->getDataPointer()->read($path);
6473
if ($expectedValueReader->getData() !== $actualValueReader->getData()) {
65-
throw new \Exception("Test operation failed");
74+
throw new \RuntimeException("Test operation failed");
6675
}
6776
break;
6877

6978
case 'copy':
70-
$from = $patchPointer->read("/{$index}/from")->getData();
71-
$valueReader = $dataPointer->read($from);
72-
$dataPointer->add($path, $valueReader);
79+
$from = $this->getPatchPointer()->read("/{$index}/from")->getData();
80+
$valueReader = $this->getDataPointer()->read($from);
81+
$this->getDataPointer()->add($path, $valueReader);
7382
break;
7483

7584
case 'move':
76-
$from = $patchPointer->read("/{$index}/from")->getData();
77-
$valueReader = $dataPointer->read($from);
78-
$dataPointer
85+
$from = $this->getPatchPointer()->read("/{$index}/from")->getData();
86+
$valueReader = $this->getDataPointer()->read($from);
87+
$this
88+
->getDataPointer()
7989
->remove($from)
8090
->add($path, $valueReader);
8191
break;
8292

8393
default:
84-
throw new \Exception("Unknown operation '{$op}'");
94+
throw new \RuntimeException("Unknown operation '{$op}'");
8595
}
8696
return $this;
8797
}
98+
99+
100+
protected function setPatchReader(SelectableReaderInterface $patchReader)
101+
{
102+
$this->patchReader = $patchReader;
103+
return $this;
104+
}
105+
106+
107+
protected function getPatchReader(): SelectableReaderInterface
108+
{
109+
if (null === $this->patchReader) {
110+
throw new \LogicException("Patch reader is not set");
111+
}
112+
return $this->patchReader;
113+
}
114+
115+
116+
protected function getPatchPointer(): Pointer
117+
{
118+
if (null === $this->patchPointer) {
119+
$this->patchPointer = new Pointer($this->getPatchReader());
120+
}
121+
return $this->patchPointer;
122+
}
123+
124+
125+
protected function getDataPointer(): Pointer
126+
{
127+
if (null === $this->dataPointer) {
128+
$this->dataPointer = new Pointer($this->getDataReader());
129+
}
130+
return $this->dataPointer;
131+
}
88132
}

tests/PatchTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public function providerValidSpecPatch_Result(): array
5151
* @param mixed $data
5252
* @param array $patchData
5353
* @dataProvider providerInvalidPatch
54-
* @expectedException \Exception
54+
* @expectedException \RuntimeException
5555
*/
5656
public function testApply_InvalidSpecPatch_ExceptionThrown($data, array $patchData)
5757
{
@@ -121,7 +121,7 @@ public function providerValidPatch_Result(): array
121121
* @param mixed $data
122122
* @param array $patchData
123123
* @dataProvider providerInvalidPatch
124-
* @expectedException \Exception
124+
* @expectedException \RuntimeException
125125
*/
126126
public function testApply_InvalidPatch_ExceptionThrown($data, array $patchData)
127127
{

0 commit comments

Comments
 (0)