Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 17 additions & 47 deletions src/ProgramScraper.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,73 +8,43 @@
use Carbon\CarbonInterface;

/**
* @psalm-import-type ScrapedStadiumRaces from ScraperInterface
*
* @author shimomo
*/
final class ProgramScraper
{
/**
* @param \BOA\Programs\ScraperInterface $scraper
* @psalm-param \BOA\Programs\ScraperInterface $scraper
*
* @param \BOA\Programs\ScraperInterface $scraper
*/
public function __construct(private readonly ScraperInterface $scraper)
{
//
}

/**
* @phpstan-type ScrapedRace array<non-empty-string, array<int, string|float|int>|string|int>
* @phpstan-type ScrapedRaces array<int, ScrapedRace>
* @phpstan-type NormalizedBoat array{
* racer_boat_number: int,
* racer_name: string,
* racer_number: int,
* racer_class_number: int,
* racer_branch_number: int,
* racer_birthplace_number: int,
* racer_age: int,
* racer_weight: float|int,
* racer_flying_count: int,
* racer_late_count: int,
* racer_average_start_timing: float|int,
* racer_national_top_1_percent: float|int,
* racer_national_top_2_percent: float|int,
* racer_national_top_3_percent: float|int,
* racer_local_top_1_percent: float|int,
* racer_local_top_2_percent: float|int,
* racer_local_top_3_percent: float|int,
* racer_assigned_motor_number: int,
* racer_assigned_motor_top_2_percent: float|int,
* racer_assigned_motor_top_3_percent: float|int,
* racer_assigned_boat_number: int,
* racer_assigned_boat_top_2_percent: float|int,
* racer_assigned_boat_top_3_percent: float|int
* }
* @phpstan-type NormalizedRace array{
* race_date: string,
* race_stadium_number: int,
* race_number: int,
* race_closed_at: string,
* race_grade_number: int,
* race_title: string,
* race_subtitle: string,
* race_distance: int,
* boats: array<int, NormalizedBoat>
* }
* @phpstan-type NormalizedRaces array<int, NormalizedRace>
* @psalm-param \Carbon\CarbonInterface|string $date
* @psalm-return ScrapedStadiumRaces
*
* @param \Carbon\CarbonInterface|string $date
* @return array<int, NormalizedRaces>
* @param \Carbon\CarbonInterface|string $date
* @return array
*/
public function scrape(CarbonInterface|string $date = 'today'): array
{
$date = Carbon::parse($date, 'Asia/Tokyo');
/** @var array<int, ScrapedRaces> $programs */
/** @psalm-var ScrapedStadiumRaces $programs */
$programs = $this->scraper->scrapePrograms($date);
return $this->normalize($programs);
}

/**
* @param array<int, ScrapedRaces> $programs
* @return array<int, NormalizedRaces>
* @psalm-param ScrapedStadiumRaces $programs
* @psalm-return ScrapedStadiumRaces
*
* @param array $programs
* @return array
*/
private function normalize(array $programs): array
{
Expand All @@ -83,13 +53,13 @@ private function normalize(array $programs): array
foreach (array_values($programs) as $data) {
foreach (array_values($data) as $program) {
$program['boats'] = isset($program['boats'])
? array_values((array) $program['boats'])
? array_values($program['boats'])
: [];
$newPrograms[] = $program;
}
}

/** @var array<int, NormalizedRaces> */
/** @psalm-var ScrapedStadiumRaces */
return $newPrograms;
}
}
46 changes: 7 additions & 39 deletions src/ProgramStorage.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,51 +5,19 @@
namespace BOA\Programs;

/**
* @psalm-import-type ScrapedStadiumRaces from ScraperInterface
*
* @author shimomo
*/
final class ProgramStorage
{
/**
* @phpstan-type NormalizedBoat array{
* racer_boat_number: int,
* racer_name: string,
* racer_number: int,
* racer_class_number: int,
* racer_branch_number: int,
* racer_birthplace_number: int,
* racer_age: int,
* racer_weight: float|int,
* racer_flying_count: int,
* racer_late_count: int,
* racer_average_start_timing: float|int,
* racer_national_top_1_percent: float|int,
* racer_national_top_2_percent: float|int,
* racer_national_top_3_percent: float|int,
* racer_local_top_1_percent: float|int,
* racer_local_top_2_percent: float|int,
* racer_local_top_3_percent: float|int,
* racer_assigned_motor_number: int,
* racer_assigned_motor_top_2_percent: float|int,
* racer_assigned_motor_top_3_percent: float|int,
* racer_assigned_boat_number: int,
* racer_assigned_boat_top_2_percent: float|int,
* racer_assigned_boat_top_3_percent: float|int
* }
* @phpstan-type NormalizedRace array{
* race_date: string,
* race_stadium_number: int,
* race_number: int,
* race_closed_at: string,
* race_grade_number: int,
* race_title: string,
* race_subtitle: string,
* race_distance: int,
* boats: array<int, NormalizedBoat>
* }
* @phpstan-type NormalizedRaces array<int, NormalizedRace>
* @psalm-param ScrapedStadiumRaces $programs
* @psalm-param non-empty-string $path
* @psalm-return void
*
* @param array<int, NormalizedRaces> $programs
* @param non-empty-string $path
* @param array $programs
* @param string $path
* @return void
* @throws \RuntimeException
*/
Expand Down
50 changes: 9 additions & 41 deletions src/ScraperAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,60 +8,28 @@
use Carbon\CarbonInterface;

/**
* @psalm-import-type ScrapedStadiumRaces from ScraperInterface
*
* @author shimomo
*/
final class ScraperAdapter implements ScraperInterface
{
/**
* @param \BVP\Scraper\Scraper $scraper
* @psalm-param \BVP\Scraper\Scraper $scraper
*
* @param \BVP\Scraper\Scraper $scraper
*/
public function __construct(private readonly Scraper $scraper)
{
//
}

/**
* @psalm-type ScrapedBoat = array{
* racer_boat_number: int,
* racer_name: string,
* racer_number: int,
* racer_class_number: int,
* racer_branch_number: int,
* racer_birthplace_number: int,
* racer_age: int,
* racer_weight: float,
* racer_flying_count: int,
* racer_late_count: int,
* racer_average_start_timing: float,
* racer_national_top_1_percent: float,
* racer_national_top_2_percent: float,
* racer_national_top_3_percent: float,
* racer_local_top_1_percent: float,
* racer_local_top_2_percent: float,
* racer_local_top_3_percent: float,
* racer_assigned_motor_number: int,
* racer_assigned_motor_top_2_percent: float,
* racer_assigned_motor_top_3_percent: float,
* racer_assigned_boat_number: int,
* racer_assigned_boat_top_2_percent: float,
* racer_assigned_boat_top_3_percent: float
* }
* @psalm-type ScrapedRace = array{
* race_date: string,
* race_stadium_number: int,
* race_number: int,
* race_closed_at: string,
* race_grade_number: int,
* race_title: string,
* race_subtitle: string,
* race_distance: int,
* boats: array<int, ScrapedBoat>
* }
* @psalm-type ScrapedRaces = array<int, ScrapedRace>
* @psalm-type ScrapedStadiumRaces = array<int, ScrapedRaces>
* @psalm-param \Carbon\CarbonInterface $date
* @psalm-return ScrapedStadiumRaces
*
* @param \Carbon\CarbonInterface $date
* @return ScrapedStadiumRaces
* @param \Carbon\CarbonInterface $date
* @return array
*/
#[\Override]
public function scrapePrograms(CarbonInterface $date): array
Expand Down
83 changes: 43 additions & 40 deletions src/ScraperInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,52 +7,55 @@
use Carbon\CarbonInterface;

/**
* @psalm-type ScrapedBoat = array{
* racer_boat_number: int,
* racer_name: string,
* racer_number: int,
* racer_class_number: int,
* racer_branch_number: int,
* racer_birthplace_number: int,
* racer_age: int,
* racer_weight: float,
* racer_flying_count: int,
* racer_late_count: int,
* racer_average_start_timing: float,
* racer_national_top_1_percent: float,
* racer_national_top_2_percent: float,
* racer_national_top_3_percent: float,
* racer_local_top_1_percent: float,
* racer_local_top_2_percent: float,
* racer_local_top_3_percent: float,
* racer_assigned_motor_number: int,
* racer_assigned_motor_top_2_percent: float,
* racer_assigned_motor_top_3_percent: float,
* racer_assigned_boat_number: int,
* racer_assigned_boat_top_2_percent: float,
* racer_assigned_boat_top_3_percent: float
* }
* @psalm-type ScrapedRace = array{
* race_date: string,
* race_stadium_number: int,
* race_number: int,
* race_closed_at: string,
* race_grade_number: int,
* race_title: string,
* race_subtitle: string,
* race_distance: int,
* boats: array<int, ScrapedBoat>
* }
* @psalm-type ScrapedRaces = array<int, ScrapedRace>
* @psalm-type ScrapedStadiumRaces = array<int, ScrapedRaces>
*
* @author shimomo
*/
interface ScraperInterface
{
/**
* @psalm-type ScrapedBoat = array{
* racer_boat_number: int,
* racer_name: string,
* racer_number: int,
* racer_class_number: int,
* racer_branch_number: int,
* racer_birthplace_number: int,
* racer_age: int,
* racer_weight: float,
* racer_flying_count: int,
* racer_late_count: int,
* racer_average_start_timing: float,
* racer_national_top_1_percent: float,
* racer_national_top_2_percent: float,
* racer_national_top_3_percent: float,
* racer_local_top_1_percent: float,
* racer_local_top_2_percent: float,
* racer_local_top_3_percent: float,
* racer_assigned_motor_number: int,
* racer_assigned_motor_top_2_percent: float,
* racer_assigned_motor_top_3_percent: float,
* racer_assigned_boat_number: int,
* racer_assigned_boat_top_2_percent: float,
* racer_assigned_boat_top_3_percent: float
* }
* @psalm-type ScrapedRace = array{
* race_date: string,
* race_stadium_number: int,
* race_number: int,
* race_closed_at: string,
* race_grade_number: int,
* race_title: string,
* race_subtitle: string,
* race_distance: int,
* boats: array<int, ScrapedBoat>
* }
* @psalm-type ScrapedRaces = array<int, ScrapedRace>
* @psalm-type ScrapedStadiumRaces = array<int, ScrapedRaces>
* @psalm-param \Carbon\CarbonInterface $date
* @psalm-return ScrapedStadiumRaces
*
* @param \Carbon\CarbonInterface $date
* @return ScrapedStadiumRaces
* @param \Carbon\CarbonInterface $date
* @return array
*/
public function scrapePrograms(CarbonInterface $date): array;
}
50 changes: 8 additions & 42 deletions tests/ProgramScraperTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,15 @@
use PHPUnit\Framework\TestCase;

/**
* @psalm-import-type ScrapedStadiumRaces from ScraperInterface
*
* @author shimomo
*/
final class ProgramScraperTest extends Testcase
{
/**
* @param \Carbon\CarbonInterface|string $date
* @psalm-return void
*
* @return void
*/
public function testScrape(): void
Expand All @@ -32,48 +35,11 @@ public function testScrape(): void
}

/**
* @psalm-type NormalizedBoat array{
* racer_boat_number: int,
* racer_name: string,
* racer_number: int,
* racer_class_number: int,
* racer_branch_number: int,
* racer_birthplace_number: int,
* racer_age: int,
* racer_weight: int|float,
* racer_flying_count: int,
* racer_late_count: int,
* racer_average_start_timing: float,
* racer_national_top_1_percent: float,
* racer_national_top_2_percent: float,
* racer_national_top_3_percent: float,
* racer_local_top_1_percent: float,
* racer_local_top_2_percent: float,
* racer_local_top_3_percent: float,
* racer_assigned_motor_number: int,
* racer_assigned_motor_top_2_percent: float,
* racer_assigned_motor_top_3_percent: float,
* racer_assigned_boat_number: int,
* racer_assigned_boat_top_2_percent: float,
* racer_assigned_boat_top_3_percent: float
* }
*
* @psalm-type NormalizedRace array{
* race_date: string,
* race_stadium_number: int,
* race_number: int,
* race_closed_at: string,
* race_grade_number: int,
* race_title: string,
* race_subtitle: string,
* race_distance: int,
* boats: array<int, NormalizedBoat>
* }
*
* @psalm-type NormalizedRaces array<int, NormalizedRace>
* @psalm-param int $keyIndex
* @psalm-return ScrapedStadiumRaces
*
* @param int $keyIndex
* @return NormalizedRaces
* @param int $keyIndex
* @return array
*/
private function testScrapeData(int $keyIndex): array
{
Expand Down
Loading