summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2010-06-21 23:20:31 +0100
committerdakkar <dakkar@thenautilus.net>2010-06-21 23:20:31 +0100
commitd5d36bac73f37a92d4ee2d18a807b2acbccf16f3 (patch)
treec007ce45296d350f43a2bd3afbae7ecb41dff90f
downloadTFLMonitor-d5d36bac73f37a92d4ee2d18a807b2acbccf16f3.tar.gz
TFLMonitor-d5d36bac73f37a92d4ee2d18a807b2acbccf16f3.tar.bz2
TFLMonitor-d5d36bac73f37a92d4ee2d18a807b2acbccf16f3.zip
initial version
-rw-r--r--.gitignore8
-rw-r--r--Makefile.PL18
-rw-r--r--lib/TFLMonitor/Schema.pm16
-rw-r--r--lib/TFLMonitor/Schema/Line.pm35
-rw-r--r--lib/TFLMonitor/Schema/LineStatus.pm55
-rw-r--r--lib/TFLMonitor/Schema/Status.pm53
-rw-r--r--script/dump_schema.pl13
-rw-r--r--script/tfl_monitor75
-rw-r--r--sql/create-schema.sql19
9 files changed, 292 insertions, 0 deletions
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 <dakkar@thenautilus.net>';
+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
+);