From bcd661488de087afab096c18aa55eda42e8c5226 Mon Sep 17 00:00:00 2001
From: Jacek Kowalski <Jacek@jacekk.info>
Date: Sun, 30 Jun 2019 21:59:01 +0000
Subject: [PATCH] Move functions into classes to make them autoloader-compatibile
---
regenerate.php | 4
lib/Fetch.php | 70 ++++++++++
/dev/null | 116 ----------------
parse.php | 11 -
config.php | 7
lib/VehicleTypes.php | 26 +++
lib/BusTypes.php | 53 +++++++
lib/TramTypes.php | 54 +++++++
lib/Output.php | 64 +++++++++
9 files changed, 276 insertions(+), 129 deletions(-)
diff --git a/config.php b/config.php
index d419565..7dd7aff 100644
--- a/config.php
+++ b/config.php
@@ -1,4 +1,5 @@
<?php
+$tramTypes = new TramTypes();
$sources = [
'bus' => [
'gtfsrt' => 'ftp://ztp.krakow.pl/VehiclePositions_A.pb',
@@ -8,7 +9,7 @@
'database' => 'mapping_A.sqlite3',
'result' => 'mapping_A.json',
'result_vehicles' => 'vehicles_A.html',
- 'mapper' => 'numToTypeB',
+ 'mapper' => new BusTypes(),
'prefix' => 'b',
],
'tram' => [
@@ -19,7 +20,7 @@
'database' => 'mapping_T.sqlite3',
'result' => 'mapping_T.json',
'result_vehicles' => 'vehicles_T.html',
- 'mapper' => 'numToTypeT',
+ 'mapper' => $tramTypes,
'prefix' => 't',
],
'tram2' => [
@@ -30,7 +31,7 @@
'database' => 'mapping_T.sqlite3',
'result' => 'mapping_T.json',
'result_vehicles' => 'vehicles_T.html',
- 'mapper' => 'numToTypeT',
+ 'mapper' => $tramTypes,
'prefix' => 't',
],
];
diff --git a/lib/BusTypes.php b/lib/BusTypes.php
new file mode 100644
index 0000000..0151dc6
--- /dev/null
+++ b/lib/BusTypes.php
@@ -0,0 +1,53 @@
+<?php
+class BusTypes extends VehicleTypes {
+ public function __construct() {
+ $data = <<<'END'
+2 4 DN Solaris Urbino 18 IV Electric
+71 83 BH Solaris Urbino 18 III Hybrid
+84 96 BH Volvo 7900A Hybrid
+103 105 PA Mercedes-Benz 516
+106 112 DA Autosan M09LE
+113 121 BA Autosan M09LE
+122 128 DA Autosan M09LE
+129 139 BA Autosan M09LE
+141 146 PM MAN NL283 Lion's City
+200 200 DO Mercedes Conecto
+206 210 PO Mercedes O530 C2 Hybrid
+211 218 DO Mercedes O530
+219 243 PO Mercedes O530 C2 Hybrid
+244 269 DO Mercedes O530 C2
+270 299 BO Mercedes O530 C2
+301 338 DU Solaris Urbino 12 IV
+339 340 BU Solaris Urbino 12 IV
+341 345 DU Solaris Urbino 12 III
+400 403 BH Solaris Urbino 12,9 III Hybrid
+404 408 DH Solaris Urbino 12,9 III Hybrid
+501 510 BR Solaris Urbino 18 IV
+511 568 DR Solaris Urbino 18 IV
+569 579 BR Solaris Urbino 18 IV
+580 595 DR Solaris Urbino 18 IV
+601 601 DE Solaris Urbino 12 III Electric
+602 605 DE Solaris Urbino 8,9LE Electric
+606 606 DE Solaris Urbino 12 III Electric
+607 623 DE Solaris Urbino 12 IV Electric
+700 700 DC Mercedes Conecto G
+701 731 DC Mercedes O530G
+732 732 DC Mercedes Conecto G
+737 741 BR Solaris Urbino 18 III
+742 745 DR Solaris Urbino 18 III
+746 764 PR Solaris Urbino 18 III
+765 768 DR Solaris Urbino 18 III
+769 776 PR Solaris Urbino 18 MetroStyle
+777 777 DR Solaris Urbino 18 III
+778 797 PR Solaris Urbino 18 IV
+851 903 BU Solaris Urbino 12 III
+904 905 DU Solaris Urbino 12 III
+906 926 BU Solaris Urbino 12 III
+927 976 PU Solaris Urbino 12 III
+977 977 DU Solaris Urbino 12 III
+978 991 PU Solaris Urbino 12 IV
+992 997 BU Solaris Urbino 12 IV
+END;
+ parent::__construct($data, 2);
+ }
+}
diff --git a/lib/Fetch.php b/lib/Fetch.php
new file mode 100644
index 0000000..78e5bfe
--- /dev/null
+++ b/lib/Fetch.php
@@ -0,0 +1,70 @@
+<?php
+class Fetch {
+ static function ftp($url, $file = NULL) {
+ $url = parse_url($url);
+ if(!isset($url['scheme']) || $url['scheme'] != 'ftp') {
+ throw new Exception('Only FTP URLs are supported');
+ }
+ if(!isset($url['host'])) {
+ throw new Exception('Hostname not present in the URL');
+ }
+ if(!isset($url['path'])) {
+ throw new Exception('Path component not present in the URL');
+ }
+ if(!isset($url['port'])) {
+ $url['port'] = 21;
+ }
+ if(!isset($url['user'])) {
+ $url['user'] = 'anonymous';
+ }
+ if(!isset($url['pass'])) {
+ $url['pass'] = 'anonymous@mpk.jacekk.net';
+ }
+ if($file == NULL) {
+ $file = basename($url['path']);
+ }
+
+ $localTime = -1;
+ $localSize = -1;
+ if(is_file($file)) {
+ $localTime = filemtime($file);
+ $localSize = filesize($file);
+ }
+
+ $ftp = FtpConnection::create($url['host'], $url['port'], $url['user'], $url['pass']);
+ $remoteSize = $ftp->size($url['path']);
+ $remoteTime = $ftp->mdtm($url['path']);
+
+ $updated = FALSE;
+
+ if($localTime < $remoteTime || ($localTime == $remoteTime && $localSize != $remoteSize)) {
+ if(file_exists($file.'.tmp')) {
+ unlink($file.'.tmp');
+ }
+ $ftp->get($file.'.tmp', $url['path'], FTP_BINARY);
+ touch($file.'.tmp', $remoteTime);
+ if(!rename($file.'.tmp', $file)) {
+ throw new Exception('Temporary file rename failed');
+ }
+ $updated = TRUE;
+ }
+
+ return $updated;
+ }
+
+ static function generic($url, $file = NULL) {
+ if($file == NULL) {
+ $file = basename($url['url']);
+ }
+ $data = file_get_contents($url);
+ if($data === FALSE) {
+ throw new Exception('URL fetch failed');
+ }
+ if(file_put_contents($file.'.tmp', $data) === FALSE) {
+ throw new Exception('Temporary file creation failed');
+ }
+ if(!rename($file.'.tmp', $file)) {
+ throw new Exception('Temporary file rename failed');
+ }
+ }
+}
diff --git a/lib/Output.php b/lib/Output.php
new file mode 100644
index 0000000..2944625
--- /dev/null
+++ b/lib/Output.php
@@ -0,0 +1,64 @@
+<?php
+class Output {
+ static function createMapping($db, VehicleTypes $vehicleTypes, $saveConfig = FALSE) {
+ $mapping = [];
+ foreach($db->getAll() as $vehicle) {
+ $mapping[$vehicle['id']] = $vehicleTypes->getByNumber($vehicle['num']);
+ }
+
+ if($saveConfig) {
+ $json = json_encode($mapping);
+ if(!file_put_contents($saveConfig['result_temp'], $json)) {
+ throw new Exception('Result save failed');
+ }
+ rename($saveConfig['result_temp'], $saveConfig['result']);
+ }
+
+ return $mapping;
+ }
+
+ function createVehiclesList($trips, $mapping, $saveConfig = FALSE) {
+ $lines = [];
+ $vehicles = [];
+ foreach($trips as $trip) {
+ $vehicle = $mapping[$trip['id']] ?? [];
+ $vehicle += ['trip' => $trip['id']];
+ $lines[$trip['line']][] = [
+ 'trip' => $trip,
+ 'vehicle' => $vehicle,
+ ];
+ $vehicles[$vehicle['type'] ?? '?'][] = $vehicle;
+ }
+ foreach($lines as &$line) {
+ usort($line, function($a, $b) {
+ return (substr($a['vehicle']['num'] ?? '', 2) <=> substr($b['vehicle']['num'] ?? '', 2));
+ });
+ }
+ unset($line);
+ ksort($lines);
+ foreach($vehicles as &$vehicle) {
+ usort($vehicle, function($a, $b) {
+ return (substr($a['num'] ?? '', 2) <=> substr($b['num'] ?? '', 2));
+ });
+ }
+ unset($vehicle);
+ ksort($vehicles);
+
+ if($saveConfig) {
+ $twigLoader = new \Twig\Loader\FilesystemLoader(__DIR__.'/../templates');
+ $twig = new \Twig\Environment($twigLoader);
+
+ $vehiclesHtml = $twig->render('vehicles.html', [
+ 'lines' => $lines,
+ 'vehicles' => $vehicles,
+ 'prefix' => $saveConfig['prefix'],
+ ]);
+ if(!file_put_contents($saveConfig['result_vehicles_temp'], $vehiclesHtml)) {
+ throw new Exception('Vehicles save failed');
+ }
+ rename($saveConfig['result_vehicles_temp'], $saveConfig['result_vehicles']);
+ }
+
+ return $lines;
+ }
+}
diff --git a/lib/TramTypes.php b/lib/TramTypes.php
new file mode 100644
index 0000000..dd99d55
--- /dev/null
+++ b/lib/TramTypes.php
@@ -0,0 +1,54 @@
+<?php
+class TramTypes extends VehicleTypes {
+ public function __construct() {
+ $data = <<<'END'
+101 107 HW E1 0
+108 113 RW E1 0
+114 126 HW E1 0
+127 127 RW E1 0
+128 130 HW E1 0
+131 132 RW E1 0
+133 133 HW E1 0
+134 134 RW E1 0
+135 136 HW E1 0
+137 139 RW E1 0
+140 147 HW E1 0
+148 150 RW E1 0
+151 152 HW E1 0
+153 153 RW E1 0
+154 154 HW E1 0
+155 155 RW E1 0
+156 158 HW E1 0
+159 159 RW E1 0
+160 174 HW E1 0
+201 245 RZ 105N 0
+246 299 HZ 105N 0
+301 310 RF GT8S 0
+311 311 RF GT8N 1
+312 312 RF GT8S 0
+313 313 RF GT8C 1
+314 317 RF GT8S 0
+318 329 RF GT8N 1
+401 440 HL EU8N 1
+451 456 HK N8C-NF 1
+457 461 HK N8S-NF 1
+462 462 HK N8C-NF 1
+601 614 RP NGT6 (1) 2
+615 626 RP NGT6 (2) 2
+627 650 RP NGT6 (3) 2
+801 824 RY NGT8 2
+899 899 RY 126N 2
+901 914 RG 2014N 2
+915 936 HG 2014N 2
+999 999 HG 405N 1
+END;
+ parent::__construct($data);
+ }
+
+ public function getByNumber($id) {
+ if((int)$id == 250) {
+ $id = 410;
+ }
+ return parent::getByNumber($id);
+ }
+}
diff --git a/lib/VehicleTypes.php b/lib/VehicleTypes.php
new file mode 100644
index 0000000..5d96326
--- /dev/null
+++ b/lib/VehicleTypes.php
@@ -0,0 +1,26 @@
+<?php
+abstract class VehicleTypes {
+ protected $typesByNumber = [];
+
+ protected function __construct($data, $defaultLow=NULL) {
+ $data = explode("\n", trim($data));
+ foreach($data as $line) {
+ $line = explode("\t", trim($line));
+ for($i = (int)$line[0]; $i <= (int)$line[1]; $i++) {
+ $this->typesByNumber[$i] = [
+ 'num' => $line[2] . str_pad($i, 3, '0', STR_PAD_LEFT),
+ 'type' => $line[3],
+ 'low' => (int)(isset($line[4]) ? $line[4] : $defaultLow),
+ ];
+ }
+ }
+ }
+
+ public function getByNumber($id) {
+ return $this->typesByNumber[$id] ?? [
+ 'num' => '??'.$id,
+ 'type' => '?',
+ 'low' => NULL,
+ ];
+ }
+}
diff --git a/lib/fetch.php b/lib/fetch.php
deleted file mode 100644
index 3c3ca75..0000000
--- a/lib/fetch.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-function ftp_fetch_if_newer($url, $file = NULL) {
- $url = parse_url($url);
- if(!isset($url['scheme']) || $url['scheme'] != 'ftp') {
- throw new Exception('Only FTP URLs are supported');
- }
- if(!isset($url['host'])) {
- throw new Exception('Hostname not present in the URL');
- }
- if(!isset($url['path'])) {
- throw new Exception('Path component not present in the URL');
- }
- if(!isset($url['port'])) {
- $url['port'] = 21;
- }
- if(!isset($url['user'])) {
- $url['user'] = 'anonymous';
- }
- if(!isset($url['pass'])) {
- $url['pass'] = 'anonymous@mpk.jacekk.net';
- }
- if($file == NULL) {
- $file = basename($url['path']);
- }
-
- $localTime = -1;
- $localSize = -1;
- if(is_file($file)) {
- $localTime = filemtime($file);
- $localSize = filesize($file);
- }
-
- $ftp = FtpConnection::create($url['host'], $url['port'], $url['user'], $url['pass']);
- $remoteSize = $ftp->size($url['path']);
- $remoteTime = $ftp->mdtm($url['path']);
-
- $updated = FALSE;
-
- if($localTime < $remoteTime || ($localTime == $remoteTime && $localSize != $remoteSize)) {
- if(file_exists($file.'.tmp')) {
- unlink($file.'.tmp');
- }
- $ftp->get($file.'.tmp', $url['path'], FTP_BINARY);
- touch($file.'.tmp', $remoteTime);
- if(!rename($file.'.tmp', $file)) {
- throw new Exception('Temporary file rename failed');
- }
- $updated = TRUE;
- }
-
- return $updated;
-}
-
-function fetch($url, $file = NULL) {
- if($file == NULL) {
- $file = basename($url['url']);
- }
- $data = file_get_contents($url);
- if($data === FALSE) {
- throw new Exception('URL fetch failed');
- }
- if(file_put_contents($file.'.tmp', $data) === FALSE) {
- throw new Exception('Temporary file creation failed');
- }
- if(!rename($file.'.tmp', $file)) {
- throw new Exception('Temporary file rename failed');
- }
-}
diff --git a/lib/output.php b/lib/output.php
deleted file mode 100644
index fe7b73e..0000000
--- a/lib/output.php
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-function createMapping($db, $mapFunction, $saveConfig = FALSE) {
- $mapping = [];
- foreach($db->getAll() as $vehicle) {
- $mapping[$vehicle['id']] = $mapFunction($vehicle['num']);
- }
-
- if($saveConfig) {
- $json = json_encode($mapping);
- if(!file_put_contents($saveConfig['result_temp'], $json)) {
- throw new Exception('Result save failed');
- }
- rename($saveConfig['result_temp'], $saveConfig['result']);
- }
-
- return $mapping;
-}
-
-function createVehiclesList($trips, $mapping, $saveConfig = FALSE) {
- $lines = [];
- $vehicles = [];
- foreach($trips as $trip) {
- $vehicle = $mapping[$trip['id']] ?? [];
- $vehicle += ['trip' => $trip['id']];
- $lines[$trip['line']][] = [
- 'trip' => $trip,
- 'vehicle' => $vehicle,
- ];
- $vehicles[$vehicle['type'] ?? '?'][] = $vehicle;
- }
- foreach($lines as &$line) {
- usort($line, function($a, $b) {
- return (substr($a['vehicle']['num'] ?? '', 2) <=> substr($b['vehicle']['num'] ?? '', 2));
- });
- }
- unset($line);
- ksort($lines);
- foreach($vehicles as &$vehicle) {
- usort($vehicle, function($a, $b) {
- return (substr($a['num'] ?? '', 2) <=> substr($b['num'] ?? '', 2));
- });
- }
- unset($vehicle);
- ksort($vehicles);
-
- if($saveConfig) {
- $twigLoader = new \Twig\Loader\FilesystemLoader(__DIR__.'/../templates');
- $twig = new \Twig\Environment($twigLoader);
-
- $vehiclesHtml = $twig->render('vehicles.html', [
- 'lines' => $lines,
- 'vehicles' => $vehicles,
- 'prefix' => $saveConfig['prefix'],
- ]);
- if(!file_put_contents($saveConfig['result_vehicles_temp'], $vehiclesHtml)) {
- throw new Exception('Vehicles save failed');
- }
- rename($saveConfig['result_vehicles_temp'], $saveConfig['result_vehicles']);
- }
-
- return $lines;
-}
diff --git a/lib/vehicle_types.php b/lib/vehicle_types.php
deleted file mode 100644
index 63b42c8..0000000
--- a/lib/vehicle_types.php
+++ /dev/null
@@ -1,116 +0,0 @@
-<?php
-function numToType($id, $data, $defaultLow=NULL) {
- $data = explode("\n", trim($data));
- foreach($data as $line) {
- $line = explode("\t", trim($line));
- if((int)$line[0] <= (int)$id && (int)$id <= (int)$line[1]) {
- return [
- 'num' => $line[2] . str_pad($id, 3, '0', STR_PAD_LEFT),
- 'type' => $line[3],
- 'low' => (int)(isset($line[4]) ? $line[4] : $defaultLow),
- ];
- }
- }
- return [
- 'num' => '??'.$id,
- 'type' => '?',
- 'low' => NULL,
- ];
-}
-function numToTypeT($id) {
- if((int)$id == 250) {
- $id = 410;
- }
-$data = <<<'END'
-101 107 HW E1 0
-108 113 RW E1 0
-114 126 HW E1 0
-127 127 RW E1 0
-128 130 HW E1 0
-131 132 RW E1 0
-133 133 HW E1 0
-134 134 RW E1 0
-135 136 HW E1 0
-137 139 RW E1 0
-140 147 HW E1 0
-148 150 RW E1 0
-151 152 HW E1 0
-153 153 RW E1 0
-154 154 HW E1 0
-155 155 RW E1 0
-156 158 HW E1 0
-159 159 RW E1 0
-160 174 HW E1 0
-201 245 RZ 105N 0
-246 299 HZ 105N 0
-301 310 RF GT8S 0
-311 311 RF GT8N 1
-312 312 RF GT8S 0
-313 313 RF GT8C 1
-314 317 RF GT8S 0
-318 329 RF GT8N 1
-401 440 HL EU8N 1
-451 456 HK N8C-NF 1
-457 461 HK N8S-NF 1
-462 462 HK N8C-NF 1
-601 614 RP NGT6 (1) 2
-615 626 RP NGT6 (2) 2
-627 650 RP NGT6 (3) 2
-801 824 RY NGT8 2
-899 899 RY 126N 2
-901 914 RG 2014N 2
-915 936 HG 2014N 2
-999 999 HG 405N 1
-END;
- return numToType($id, $data);
-}
-function numToTypeB($id) {
-$data = <<<'END'
-2 4 DN Solaris Urbino 18 IV Electric
-71 83 BH Solaris Urbino 18 III Hybrid
-84 96 BH Volvo 7900A Hybrid
-103 105 PA Mercedes-Benz 516
-106 112 DA Autosan M09LE
-113 121 BA Autosan M09LE
-122 128 DA Autosan M09LE
-129 139 BA Autosan M09LE
-141 146 PM MAN NL283 Lion's City
-200 200 DO Mercedes Conecto
-206 210 PO Mercedes O530 C2 Hybrid
-211 218 DO Mercedes O530
-219 243 PO Mercedes O530 C2 Hybrid
-244 269 DO Mercedes O530 C2
-270 299 BO Mercedes O530 C2
-301 338 DU Solaris Urbino 12 IV
-339 340 BU Solaris Urbino 12 IV
-341 345 DU Solaris Urbino 12 III
-400 403 BH Solaris Urbino 12,9 III Hybrid
-404 408 DH Solaris Urbino 12,9 III Hybrid
-501 510 BR Solaris Urbino 18 IV
-511 568 DR Solaris Urbino 18 IV
-569 579 BR Solaris Urbino 18 IV
-580 595 DR Solaris Urbino 18 IV
-601 601 DE Solaris Urbino 12 III Electric
-602 605 DE Solaris Urbino 8,9LE Electric
-606 606 DE Solaris Urbino 12 III Electric
-607 623 DE Solaris Urbino 12 IV Electric
-700 700 DC Mercedes Conecto G
-701 731 DC Mercedes O530G
-732 732 DC Mercedes Conecto G
-737 741 BR Solaris Urbino 18 III
-742 745 DR Solaris Urbino 18 III
-746 764 PR Solaris Urbino 18 III
-765 768 DR Solaris Urbino 18 III
-769 776 PR Solaris Urbino 18 MetroStyle
-777 777 DR Solaris Urbino 18 III
-778 797 PR Solaris Urbino 18 IV
-851 903 BU Solaris Urbino 12 III
-904 905 DU Solaris Urbino 12 III
-906 926 BU Solaris Urbino 12 III
-927 976 PU Solaris Urbino 12 III
-977 977 DU Solaris Urbino 12 III
-978 991 PU Solaris Urbino 12 IV
-992 997 BU Solaris Urbino 12 IV
-END;
- return numToType($id, $data, 2);
-}
diff --git a/parse.php b/parse.php
index 3a81aa1..b26114c 100644
--- a/parse.php
+++ b/parse.php
@@ -1,22 +1,19 @@
<?php
require_once(__DIR__.'/vendor/autoload.php');
-require_once(__DIR__.'/lib/fetch.php');
-require_once(__DIR__.'/lib/output.php');
-require_once(__DIR__.'/lib/vehicle_types.php');
require_once(__DIR__.'/config.php');
foreach($sources as $name => $source) {
$logger = new Monolog\Logger('fetch_'.$name);
try {
$logger->info('Fetching '.$name.' position data from FTP...');
- $updated = ftp_fetch_if_newer($source['gtfsrt'], $source['gtfsrt_file']);
+ $updated = Fetch::ftp($source['gtfsrt'], $source['gtfsrt_file']);
if(!$updated) {
$logger->info('Nothing to do, remote file not newer than local one');
continue;
}
$logger->info('Fetching '.$name.' position data from TTSS...');
- fetch($source['ttss'], $source['ttss_file']);
+ Fetch::generic($source['ttss'], $source['ttss_file']);
$logger->info('Loading data...');
$mapper = new Mapper();
@@ -80,12 +77,12 @@
$db->addMapping($mapping);
- $finalMapping = createMapping($db, $source['mapper'], $source);
+ $finalMapping = Output::createMapping($db, $source['mapper'], $source);
$logger->info('Creating vehicle list...');
- createVehiclesList($mapper->getTTSSTrips(), $finalMapping, $source);
+ Output::createVehiclesList($mapper->getTTSSTrips(), $finalMapping, $source);
$logger->info('Finished');
} catch(Throwable $e) {
diff --git a/regenerate.php b/regenerate.php
index c157c82..aaa821f 100644
--- a/regenerate.php
+++ b/regenerate.php
@@ -1,7 +1,5 @@
<?php
require_once(__DIR__.'/vendor/autoload.php');
-require_once(__DIR__.'/lib/output.php');
-require_once(__DIR__.'/lib/vehicle_types.php');
require_once(__DIR__.'/config.php');
foreach($sources as $name => $source) {
@@ -9,7 +7,7 @@
try {
$logger->info('Regenerating '.$name.'...');
$db = new Database($source['database']);
- createMapping($db, $source['mapper'], $source);
+ Output::createMapping($db, $source['mapper'], $source);
$logger->info('Finished');
} catch(Throwable $e) {
$logger->error($e->getMessage(), ['exception' => $e, 'exception_string' => (string)$e]);
--
Gitblit v1.9.1