Skip to content

Commit 7ddb637

Browse files
njoubert-cleveragexaviermarchegay
authored andcommitted
#155 Implement InputFileReaderTask, InputLineReaderTask and LineReaderTask
1 parent c23a4fc commit 7ddb637

File tree

3 files changed

+125
-0
lines changed

3 files changed

+125
-0
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CleverAge\ProcessBundle\Task\File;
6+
7+
use CleverAge\ProcessBundle\Model\AbstractConfigurableTask;
8+
use CleverAge\ProcessBundle\Model\ProcessState;
9+
use Symfony\Component\OptionsResolver\OptionsResolver;
10+
11+
/**
12+
* Reads the whole input file and outputs its content.
13+
*/
14+
class InputFileReaderTask extends FileReaderTask
15+
{
16+
protected function getOptions(ProcessState $state): array
17+
{
18+
$options = parent::getOptions($state);
19+
if (null !== $state->getInput()) {
20+
$options['filename'] = $state->getInput();
21+
}
22+
23+
return $options;
24+
}
25+
26+
protected function configureOptions(OptionsResolver $resolver): void
27+
{
28+
parent::configureOptions($resolver);
29+
$resolver->remove('filename');
30+
}
31+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CleverAge\ProcessBundle\Task\File;
6+
7+
use CleverAge\ProcessBundle\Model\AbstractConfigurableTask;
8+
use CleverAge\ProcessBundle\Model\IterableTaskInterface;
9+
use CleverAge\ProcessBundle\Model\ProcessState;
10+
use Symfony\Component\OptionsResolver\OptionsResolver;
11+
12+
/**
13+
* Reads an input file line by line and outputs each line.
14+
*/
15+
class InputLineReaderTask extends LineReaderTask
16+
{
17+
protected function getOptions(ProcessState $state): array
18+
{
19+
$options = parent::getOptions($state);
20+
if (null !== $state->getInput()) {
21+
$options['filename'] = $state->getInput();
22+
}
23+
24+
return $options;
25+
}
26+
27+
protected function configureOptions(OptionsResolver $resolver): void
28+
{
29+
parent::configureOptions($resolver);
30+
$resolver->remove('filename');
31+
}
32+
}

src/Task/File/LineReaderTask.php

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace CleverAge\ProcessBundle\Task\File;
6+
7+
use CleverAge\ProcessBundle\Filesystem\CsvFile;
8+
use CleverAge\ProcessBundle\Model\AbstractConfigurableTask;
9+
use CleverAge\ProcessBundle\Model\IterableTaskInterface;
10+
use CleverAge\ProcessBundle\Model\ProcessState;
11+
use Symfony\Component\OptionsResolver\OptionsResolver;
12+
13+
/**
14+
* Reads a file line by line and outputs each line.
15+
*/
16+
class LineReaderTask extends AbstractConfigurableTask implements IterableTaskInterface
17+
{
18+
protected ?\SplFileObject $file = null;
19+
20+
public function execute(ProcessState $state): void
21+
{
22+
$options = $this->getOptions($state);
23+
$filename = $options['filename'];
24+
25+
if ($this->file instanceof \SplFileObject
26+
&& $this->file->getPathname() !== $filename) {
27+
$this->file = null;
28+
}
29+
30+
if (!$this->file instanceof \SplFileObject) {
31+
if (!file_exists($filename)) {
32+
throw new \UnexpectedValueException("File does not exist: '{$filename}'");
33+
}
34+
35+
if (!is_readable($filename)) {
36+
throw new \UnexpectedValueException("File is not readable: '{$filename}'");
37+
}
38+
39+
$this->file = new \SplFileObject($filename);
40+
$this->file->setFlags(\SplFileObject::READ_AHEAD | \SplFileObject::SKIP_EMPTY);
41+
$this->file->rewind();
42+
}
43+
44+
$state->setOutput($this->file->current());
45+
$this->file->next();
46+
}
47+
48+
public function next(ProcessState $state): bool
49+
{
50+
if (!$this->file instanceof \SplFileObject) {
51+
throw new \LogicException('No File initialized');
52+
}
53+
54+
return !$this->file->eof();
55+
}
56+
57+
protected function configureOptions(OptionsResolver $resolver): void
58+
{
59+
$resolver->setRequired(['filename']);
60+
$resolver->setAllowedTypes('filename', ['string']);
61+
}
62+
}

0 commit comments

Comments
 (0)