-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTableScrapingService.php
More file actions
62 lines (52 loc) · 2.04 KB
/
TableScrapingService.php
File metadata and controls
62 lines (52 loc) · 2.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?php
declare( strict_types = 1 );
namespace TheWebSolver\Codegarage\Scraper\Service;
use Iterator;
use ArrayObject;
use TheWebSolver\Codegarage\Scraper\Enums\Table;
use TheWebSolver\Codegarage\Scraper\Event\TableTraced;
use TheWebSolver\Codegarage\Scraper\Interfaces\Indexable;
use TheWebSolver\Codegarage\Scraper\Interfaces\Traceable;
use TheWebSolver\Codegarage\Scraper\Attributes\ScrapeFrom;
use TheWebSolver\Codegarage\Scraper\Interfaces\TableTracer;
use TheWebSolver\Codegarage\Scraper\Interfaces\Validatable;
use TheWebSolver\Codegarage\Scraper\Service\ScrapingService;
use TheWebSolver\Codegarage\Scraper\Proxy\ItemValidatorProxy;
use TheWebSolver\Codegarage\Scraper\Marshaller\MarshallTableRow;
use TheWebSolver\Codegarage\Scraper\Interfaces\AccentedIndexableItem;
/**
* @template TableColumnValue
* @template TTracer of TableTracer<TableColumnValue>
* @template-extends ScrapingService<Iterator<array-key,ArrayObject<array-key,TableColumnValue>>,TTracer>
*/
abstract class TableScrapingService extends ScrapingService {
public function parse(): Iterator {
$this->getTracer()->withAllTables( false )
->addEventListener( $this->hydrateWithDefaultTransformers( ... ), structure: Table::Row )
->inferFrom( $this->fromCache(), normalize: true );
yield from $this->getTracer()->getData();
}
public function flush(): void {
parent::flush();
$this->getTracer()->resetTraced();
$this->getTracer()->resetHooks();
}
protected function hydrateWithDefaultTransformers( TableTraced $event ): void {
$tracer = $event->tracer;
if (
! $tracer->hasTransformer( Table::Column )
&& $tracer instanceof AccentedIndexableItem
&& $tracer instanceof Validatable
) {
$tracer->addTransformer( new ItemValidatorProxy(), Table::Column );
}
if ( $tracer->hasTransformer( Table::Row ) ) {
return;
}
$rowTransformer = new MarshallTableRow(
invalidCountMsg: $this->getScraperSource()->name . ' ' . Indexable::INVALID_COUNT,
indexKey: $tracer->getIndicesSource()?->indexKey
);
$tracer->addTransformer( $rowTransformer, Table::Row );
}
}