From d5d36bac73f37a92d4ee2d18a807b2acbccf16f3 Mon Sep 17 00:00:00 2001 From: dakkar Date: Mon, 21 Jun 2010 23:20:31 +0100 Subject: initial version --- .gitignore | 8 ++++ Makefile.PL | 18 +++++++++ lib/TFLMonitor/Schema.pm | 16 ++++++++ lib/TFLMonitor/Schema/Line.pm | 35 +++++++++++++++++ lib/TFLMonitor/Schema/LineStatus.pm | 55 +++++++++++++++++++++++++++ lib/TFLMonitor/Schema/Status.pm | 53 ++++++++++++++++++++++++++ script/dump_schema.pl | 13 +++++++ script/tfl_monitor | 75 +++++++++++++++++++++++++++++++++++++ sql/create-schema.sql | 19 ++++++++++ 9 files changed, 292 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile.PL create mode 100644 lib/TFLMonitor/Schema.pm create mode 100644 lib/TFLMonitor/Schema/Line.pm create mode 100644 lib/TFLMonitor/Schema/LineStatus.pm create mode 100644 lib/TFLMonitor/Schema/Status.pm create mode 100644 script/dump_schema.pl create mode 100644 script/tfl_monitor create mode 100644 sql/create-schema.sql diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bfdf20e --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +*~ +.#* +/monitor.db +/Makefile +/inc/ +/META.yml +/blib/ +/pm_to_blib diff --git a/Makefile.PL b/Makefile.PL new file mode 100644 index 0000000..14ddfb7 --- /dev/null +++ b/Makefile.PL @@ -0,0 +1,18 @@ +use inc::Module::Install; + +name 'TFLMonitor'; +abstract 'keep tabs on the tube'; +author 'Gianni Ceccarelli '; +version '0.01'; +license 'gpl'; +perl_version '5.008'; + +requires 'DBIx::Class' => '0'; +requires 'DBD::SQLite' => '0'; +requires 'XML::LibXML' => '0'; +requires 'XML::LibXML::XPathContext' => '0'; +requires 'Path::Class' => '0'; + +install_script 'tfl_monitor'; + +WriteAll; diff --git a/lib/TFLMonitor/Schema.pm b/lib/TFLMonitor/Schema.pm new file mode 100644 index 0000000..a8f09c6 --- /dev/null +++ b/lib/TFLMonitor/Schema.pm @@ -0,0 +1,16 @@ +package TFLMonitor::Schema; + +use strict; +use warnings; + +use base 'DBIx::Class::Schema'; + +__PACKAGE__->load_classes; + + +# Created by DBIx::Class::Schema::Loader v0.04006 @ 2010-06-21 23:15:30 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:Du/rUVC8IdRUPtkgGVjM/A + + +# You can replace this text with custom content, and it will be preserved on regeneration +1; diff --git a/lib/TFLMonitor/Schema/Line.pm b/lib/TFLMonitor/Schema/Line.pm new file mode 100644 index 0000000..acbf60d --- /dev/null +++ b/lib/TFLMonitor/Schema/Line.pm @@ -0,0 +1,35 @@ +package TFLMonitor::Schema::Line; + +use strict; +use warnings; + +use base 'DBIx::Class'; + +__PACKAGE__->load_components("Core"); +__PACKAGE__->table("line"); +__PACKAGE__->add_columns( + "id", + { data_type => "INT", default_value => undef, is_nullable => 1, size => undef }, + "name", + { + data_type => "VARCHAR", + default_value => undef, + is_nullable => 0, + size => 255, + }, +); +__PACKAGE__->set_primary_key("id"); +__PACKAGE__->add_unique_constraint("name_unique", ["name"]); +__PACKAGE__->has_many( + "line_statuses", + "TFLMonitor::Schema::LineStatus", + { "foreign.line_id" => "self.id" }, +); + + +# Created by DBIx::Class::Schema::Loader v0.04006 @ 2010-06-21 23:15:30 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ZwKNYS6AzGFRfM7vnAMqTQ + + +# You can replace this text with custom content, and it will be preserved on regeneration +1; diff --git a/lib/TFLMonitor/Schema/LineStatus.pm b/lib/TFLMonitor/Schema/LineStatus.pm new file mode 100644 index 0000000..ced0012 --- /dev/null +++ b/lib/TFLMonitor/Schema/LineStatus.pm @@ -0,0 +1,55 @@ +package TFLMonitor::Schema::LineStatus; + +use strict; +use warnings; + +use base 'DBIx::Class'; + +__PACKAGE__->load_components("Core"); +__PACKAGE__->table("line_status"); +__PACKAGE__->add_columns( + "time", + { + data_type => "DATETIME", + default_value => undef, + is_nullable => 0, + size => undef, + }, + "line_id", + { data_type => "INT", default_value => undef, is_nullable => 0, size => undef }, + "status_code", + { + data_type => "VARCHAR", + default_value => undef, + is_nullable => 0, + size => 255, + }, + "is_active", + { + data_type => "BOOLEAN", + default_value => undef, + is_nullable => 0, + size => undef, + }, + "details", + { + data_type => "TEXT", + default_value => undef, + is_nullable => 1, + size => undef, + }, +); +__PACKAGE__->belongs_to("line_id", "TFLMonitor::Schema::Line", { id => "line_id" }); +__PACKAGE__->belongs_to( + "status_code", + "TFLMonitor::Schema::Status", + { code => "status_code" }, +); + + +# Created by DBIx::Class::Schema::Loader v0.04006 @ 2010-06-21 23:15:30 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:1b6y2NC79YSXgyECT4uEzQ + + +# You can replace this text with custom content, and it will be preserved on regeneration +1; diff --git a/lib/TFLMonitor/Schema/Status.pm b/lib/TFLMonitor/Schema/Status.pm new file mode 100644 index 0000000..c2e43fd --- /dev/null +++ b/lib/TFLMonitor/Schema/Status.pm @@ -0,0 +1,53 @@ +package TFLMonitor::Schema::Status; + +use strict; +use warnings; + +use base 'DBIx::Class'; + +__PACKAGE__->load_components("Core"); +__PACKAGE__->table("status"); +__PACKAGE__->add_columns( + "code", + { + data_type => "VARCHAR", + default_value => undef, + is_nullable => 1, + size => 255, + }, + "class", + { + data_type => "VARCHAR", + default_value => undef, + is_nullable => 0, + size => 255, + }, + "description", + { + data_type => "VARCHAR", + default_value => undef, + is_nullable => 0, + size => 255, + }, + "is_active", + { + data_type => "BOOLEAN", + default_value => undef, + is_nullable => 0, + size => undef, + }, +); +__PACKAGE__->set_primary_key("code"); +__PACKAGE__->has_many( + "line_statuses", + "TFLMonitor::Schema::LineStatus", + { "foreign.status_code" => "self.code" }, +); + + +# Created by DBIx::Class::Schema::Loader v0.04006 @ 2010-06-21 23:15:30 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:HllgP4wdCoe4KqxmyI0m8Q + + +# You can replace this text with custom content, and it will be preserved on regeneration +1; diff --git a/script/dump_schema.pl b/script/dump_schema.pl new file mode 100644 index 0000000..ec1e1bc --- /dev/null +++ b/script/dump_schema.pl @@ -0,0 +1,13 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use DBIx::Class::Schema::Loader qw/ make_schema_at /; + +make_schema_at( + 'TFLMonitor::Schema', + { + debug => 1, + dump_directory => './lib', + }, + [ 'dbi:SQLite:dbname=monitor.db', ], +); diff --git a/script/tfl_monitor b/script/tfl_monitor new file mode 100644 index 0000000..704f3fc --- /dev/null +++ b/script/tfl_monitor @@ -0,0 +1,75 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use TFLMonitor::Schema; +use XML::LibXML; +use XML::LibXML::XPathContext; +use Path::Class; + +my $libdir=file(__FILE__)->parent; +my $dbfile=$libdir->parent->file('monitor.db'); + +my $doc=XML::LibXML->load_xml(location=> 'http://apibeta.london.gov.uk/TrackernetWebServicev3/timetableservice.aspx?Feed=7&linesWithIncidents=false'); + +die "Couldn't fetch status\n" unless $doc; + +my $schema=TFLMonitor::Schema->connect( + "dbi:SQLite:dbname=$dbfile", + '','', + { + AutoCommit => 1, + }); + +my $xpath=XML::LibXML::XPathContext->new($doc); +$xpath->registerNs('ws','http://webservices.lul.co.uk/'); + +my (%lines,%status,@ls); + +for my $ls ($xpath->findnodes(q{/ws:ArrayOfLineStatus/ws:LineStatus},$doc)) { + my ($line)=$xpath->findnodes(q{ws:Line},$ls); + my $line_id=$line->findvalue(q{@ID}); + $lines{$line_id} ||= { + id => $line_id, + name => $line->findvalue(q{@Name}), + }; + + my ($status)=$xpath->findnodes(q{ws:Status},$ls); + my $status_code=$status->findvalue(q{@ID}); + my $is_active=$status->findvalue(q{@IsActive}); + $status{$status_code} ||= { + code => $status_code, + class => $status->findvalue(q{@CssClass}), + description => $status->findvalue(q{@Description}), + is_active => $is_active, + }; + + push @ls,{ + 'time' => time(), + line_id => $line_id, + status_code => $status_code, + is_active => $is_active, + details => $ls->findvalue(q{@StatusDetails}), + }; +} + +$schema->txn_do( + sub{ + for my $l (values %lines) { + $schema->resultset('TFLMonitor::Schema::Line') + ->find_or_create( + $l, + { key => 'primary' }, + ); + } + for my $s (values %status) { + $schema->resultset('TFLMonitor::Schema::Status') + ->find_or_create( + $s, + { key => 'primary' }, + ); + } + for my $ls (@ls) { + $schema->resultset('TFLMonitor::Schema::LineStatus')->create($ls); + } + } +); diff --git a/sql/create-schema.sql b/sql/create-schema.sql new file mode 100644 index 0000000..04e94fd --- /dev/null +++ b/sql/create-schema.sql @@ -0,0 +1,19 @@ +CREATE TABLE status ( + code VARCHAR(255) PRIMARY KEY, + class VARCHAR(255) NOT NULL, + description VARCHAR(255) NOT NULL, + is_active BOOLEAN NOT NULL +); + +CREATE TABLE line ( + id INT PRIMARY KEY, + name VARCHAR(255) NOT NULL UNIQUE +); + +CREATE TABLE line_status ( + time DATETIME NOT NULL, + line_id INT NOT NULL REFERENCES line(id), + status_code VARCHAR(255) NOT NULL REFERENCES status(code), + is_active BOOLEAN NOT NULL, + details TEXT +); -- cgit v1.2.3