diff --git a/README.md b/README.md index 2d5caf8..bfc2a9e 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,6 @@ Utility written in PHP 8.0 that scrapes a Memory QVL from the ASRock webpage and makes it searchable. It performs some nifty tricks such as inferring the amount of RAM modules in a kit based on module size and module number. There's a -decorator enabled in [bin/app.php] which adds a hyperlink to the Tweakers.net pricewatch to the output. +decorator enabled in [bin/app.php](bin/app.php) which adds a hyperlink to the Tweakers.net pricewatch to the output. -There are two output modes available; csv and json. See [bin/app.php] for an example. +There are two output modes available; csv and json. See [bin/app.php](bin/app.php) for an example. diff --git a/bin/app.php b/bin/app.php index eb499ab..42061a6 100644 --- a/bin/app.php +++ b/bin/app.php @@ -2,7 +2,7 @@ use Domain\Model\ASRockMemoryQVL; use Domain\Model\MemoryConfiguration; -use Domain\Normalizer\Decorator\PricewatchDecorator; +use Domain\Normalizer\Decorator\TweakersPricewatchUrl; use Domain\Normalizer\MemoryConfigurationNormalizer; use Encoder\EncoderFactory; use IO\Downloader; @@ -10,22 +10,25 @@ use IO\Downloader; require_once __DIR__ . '/../vendor/autoload.php'; // setup -$list = new ASRockMemoryQVL('AMD', 'X570 Pro4', cpuFamily: 'MS'); +$qualifiedVendorList = new ASRockMemoryQVL('AMD', 'X570 Pro4', cpuFamily: 'MS'); $downloader = new Downloader(); $scraper = new MemoryQVLScraper(); // scrape and filter -$page = $downloader->download($list); +$page = $downloader->download($qualifiedVendorList); $configurations = $scraper->scrape($page); -$selection = $configurations->filter(fn(MemoryConfiguration $memory) => in_array($memory->numberOfModules, [2, 4]) +$selection = $configurations->filter(static function (MemoryConfiguration $memory) { + in_array($memory->numberOfModules, [2, 4]) && $memory->totalSize >= 16 && $memory->speed >= 3600 - && $memory->overclockingVerified -); + && $memory->overclockingVerified; +}); // data presentation $normalizer = new MemoryConfigurationNormalizer(); -$normalizer = PricewatchDecorator::decorate($normalizer); +$normalizer = TweakersPricewatchUrl::decorate($normalizer); $encoderFactory = new EncoderFactory($normalizer); -$encoder = $encoderFactory->getEncoder($argv[1] ?? 'csv'); + +$encoding = $argv[1] ?? 'csv'; +$encoder = $encoderFactory->getEncoder($encoding); print($encoder->encode($selection)); diff --git a/src/Domain/Model/MemoryConfiguration.php b/src/Domain/Model/MemoryConfiguration.php index bdb9d1f..5b41b30 100644 --- a/src/Domain/Model/MemoryConfiguration.php +++ b/src/Domain/Model/MemoryConfiguration.php @@ -4,6 +4,9 @@ namespace Domain\Model; class MemoryConfiguration { + private const MAX_MOTHERBOARD_SLOTS = 8; + private const OVERCLOCKING_VERIFIED = ['v', '2']; + public int $moduleSize; public int $totalSize; public string $totalSizeHr; @@ -26,7 +29,7 @@ class MemoryConfiguration ) { $this->moduleSize = filter_var($this->moduleSizeHr, FILTER_SANITIZE_NUMBER_INT); - $this->overclockingVerified = in_array($this->overclockingSupport, ['v', '2'], true); + $this->overclockingVerified = in_array($this->overclockingSupport, self::OVERCLOCKING_VERIFIED, true); $this->dualChannelOverclockingVerified = $this->overclockingSupport === '2'; $this->deriveAdditionalFields(); @@ -41,7 +44,7 @@ class MemoryConfiguration private function findTotalSize(): void { // Initially 8 times the module size - $this->totalSize = 8 * $this->moduleSize; + $this->totalSize = self::MAX_MOTHERBOARD_SLOTS * $this->moduleSize; // Work our way down to the module size... while (!str_contains($this->module, $this->totalSize) && $this->totalSize > $this->moduleSize) { diff --git a/src/Domain/Normalizer/Decorator/NormalizerDecorator.php b/src/Domain/Normalizer/Decorator/Decorator.php similarity index 84% rename from src/Domain/Normalizer/Decorator/NormalizerDecorator.php rename to src/Domain/Normalizer/Decorator/Decorator.php index 7cb7405..16d5a27 100644 --- a/src/Domain/Normalizer/Decorator/NormalizerDecorator.php +++ b/src/Domain/Normalizer/Decorator/Decorator.php @@ -4,8 +4,12 @@ namespace Domain\Normalizer\Decorator; use Domain\Normalizer\Normalizer; -abstract class NormalizerDecorator implements Normalizer +abstract class Decorator implements Normalizer { + abstract protected function getAdditionalHeaders(): array; + + abstract public function makePass(array $data): array; + private function __construct( private Normalizer $parent ) @@ -17,10 +21,6 @@ abstract class NormalizerDecorator implements Normalizer return new static($normalizer); } - abstract protected function getAdditionalHeaders(): array; - - abstract public function makePass(array $normalized): array; - final public function getHeaders(): array { return array_merge($this->parent->getHeaders(), $this->getAdditionalHeaders()); diff --git a/src/Domain/Normalizer/Decorator/PricewatchDecorator.php b/src/Domain/Normalizer/Decorator/TweakersPricewatchUrl.php similarity index 72% rename from src/Domain/Normalizer/Decorator/PricewatchDecorator.php rename to src/Domain/Normalizer/Decorator/TweakersPricewatchUrl.php index 6cfd8db..8681fa7 100644 --- a/src/Domain/Normalizer/Decorator/PricewatchDecorator.php +++ b/src/Domain/Normalizer/Decorator/TweakersPricewatchUrl.php @@ -2,19 +2,19 @@ namespace Domain\Normalizer\Decorator; -class PricewatchDecorator extends NormalizerDecorator +class TweakersPricewatchUrl extends Decorator { - public function makePass(array $normalized): array + public function makePass(array $data): array { - $module = $normalized['module'] ?? '-'; + $module = $data['module'] ?? '-'; $module = $this->selectSignificantTerms($module); - $normalized['pricewatch_url'] = sprintf( + $data['pricewatch_url'] = sprintf( 'https://tweakers.net/pricewatch/zoeken/?keyword=%s', rawurlencode($module) ); - return $normalized; + return $data; } protected function getAdditionalHeaders(): array diff --git a/src/Domain/Normalizer/Normalizer.php b/src/Domain/Normalizer/Normalizer.php index 64054ce..b282927 100644 --- a/src/Domain/Normalizer/Normalizer.php +++ b/src/Domain/Normalizer/Normalizer.php @@ -2,12 +2,9 @@ namespace Domain\Normalizer; -use Domain\Normalizer\Decorator\NormalizerDecorator; - interface Normalizer { public function getHeaders(): array; public function normalize(object $object): array; - } diff --git a/src/Encoder/CsvEncoder.php b/src/Encoder/CsvEncoder.php index c322078..d0a6ca7 100644 --- a/src/Encoder/CsvEncoder.php +++ b/src/Encoder/CsvEncoder.php @@ -17,15 +17,14 @@ class CsvEncoder implements StringEncoder public function encode(Collection $items): string { - $items = $items->values(); $buffer = implode($this->columnSeparator, $this->normalizer->getHeaders()); $buffer .= $this->rowSeparator; - $items->each(function (object $object) use (&$buffer) { + $items->values()->each(function (object $object) use (&$buffer) { $normalized = $this->normalizer->normalize($object); $buffer .= collect($normalized) - ->map([CsvEncoder::class, 'formatBoolean']) - ->map([CsvEncoder::class, 'formatEmpty']) + ->map([static::class, 'formatBoolean']) + ->map([static::class, 'formatEmpty']) ->implode($this->columnSeparator); $buffer .= $this->rowSeparator; }); diff --git a/src/Encoder/JsonEncoder.php b/src/Encoder/JsonEncoder.php index 30f72f7..762cffb 100644 --- a/src/Encoder/JsonEncoder.php +++ b/src/Encoder/JsonEncoder.php @@ -7,6 +7,8 @@ use Illuminate\Support\Collection; class JsonEncoder implements StringEncoder { + private const FLAGS = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_LINE_TERMINATORS | JSON_BIGINT_AS_STRING | JSON_THROW_ON_ERROR; + public function __construct( private Normalizer $normalizer ) @@ -15,16 +17,9 @@ class JsonEncoder implements StringEncoder public function encode(Collection $items): string { - return json_encode( - [ - 'count' => $items->count(), - 'items' => $items->map([$this->normalizer, 'normalize'])->values()->toArray(), - ], - JSON_UNESCAPED_SLASHES - | JSON_UNESCAPED_UNICODE - | JSON_UNESCAPED_LINE_TERMINATORS - | JSON_BIGINT_AS_STRING - | JSON_THROW_ON_ERROR - ); + return json_encode([ + 'count' => $items->count(), + 'items' => $items->map([$this->normalizer, 'normalize'])->values()->toArray(), + ], self::FLAGS); } }