@@ -0,0 +1,4 @@ | |||
*.sqlite | |||
*.zip | |||
.ruby-* | |||
_site |
@@ -0,0 +1,6 @@ | |||
source 'https://rubygems.org' | |||
ruby '2.3.1' | |||
gem 'scraperwiki', :git => 'https://github.com/openaustralia/scraperwiki-ruby/', :branch => 'morph_defaults' | |||
gem 'haml' |
@@ -0,0 +1,34 @@ | |||
GIT | |||
remote: https://github.com/openaustralia/scraperwiki-ruby/ | |||
revision: fc50176812505e463077d5c673d504a6a234aa78 | |||
branch: morph_defaults | |||
specs: | |||
scraperwiki (3.0.1) | |||
httpclient | |||
sqlite_magic | |||
GEM | |||
remote: https://rubygems.org/ | |||
specs: | |||
haml (5.0.4) | |||
temple (>= 0.8.0) | |||
tilt | |||
httpclient (2.8.3) | |||
sqlite3 (1.3.13) | |||
sqlite_magic (0.0.6) | |||
sqlite3 | |||
temple (0.8.0) | |||
tilt (2.0.8) | |||
PLATFORMS | |||
ruby | |||
DEPENDENCIES | |||
haml | |||
scraperwiki! | |||
RUBY VERSION | |||
ruby 2.3.1p112 | |||
BUNDLED WITH | |||
1.16.5 |
@@ -0,0 +1,69 @@ | |||
#!/usr/bin/env ruby | |||
require 'scraperwiki' | |||
require 'haml' | |||
require 'pp' | |||
require 'logger' | |||
require_relative '../lib/helpers' | |||
OUTPUT_DIR = '_site' | |||
VIEWS_DIR = File.join('views') | |||
LAYOUT_FN = File.join(VIEWS_DIR, 'layout.haml') | |||
def write_page(path_items, template, locals = {}) | |||
dir = File.join(OUTPUT_DIR, path_items) | |||
FileUtils.mkdir_p(dir) | |||
@log.debug dir | |||
fn = File.join(dir, 'index.html') | |||
# https://stackoverflow.com/questions/6125265/using-layouts-in-haml-files-independently-of-rails | |||
html = Haml::Engine.new(File.read(LAYOUT_FN)).render do | |||
Haml::Engine.new(File.read(File.join(VIEWS_DIR, "#{template}.haml"))).render(Object.new, locals) | |||
end | |||
File.write(fn, html) | |||
@log.info fn | |||
@pages += 1 | |||
# TODO - add page to sitemap.xml or sitemap.txt | |||
# https://support.google.com/webmasters/answer/183668?hl=en&ref_topic=4581190 | |||
end | |||
def create_output_dir | |||
# Recursively delete working directory to ensure no redundant files are left behind from previous builds. | |||
# FileUtils.rm_rf(@working_dir) | |||
Dir.mkdir(@working_dir) unless File.directory?(@working_dir) | |||
# Dir.chdir(@working_dir) | |||
# Copy `public` dir to output dir | |||
FileUtils.copy_entry('public', @working_dir) | |||
end | |||
def gen_homepage | |||
decisions = ScraperWiki.select("* from `applications` order by date_decision desc limit 20") | |||
write_page('.', 'index', { decisions: decisions }) | |||
end | |||
def gen_authorities | |||
auths = ScraperWiki.select("distinct(authority_name) as authority_name from applications order by authority_name") | |||
write_page('authorities', 'authorities', { auths: auths }) | |||
auths.each do |auth| | |||
summary = ScraperWiki.select(" | |||
status, decision, appeal_status, appeal_decision, count(*) as qty | |||
from applications | |||
where authority_name = '#{auth['authority_name']}' | |||
group by status, decision, appeal_status, appeal_decision | |||
") | |||
apps = ScraperWiki.select("* from applications where authority_name='#{auth['authority_name']}' order by date_received") | |||
write_page(['authorities', slug(auth['authority_name'])], 'authority', { apps: apps, auth: auth, summary: summary }) | |||
end | |||
end | |||
@working_dir = File.join(Dir.pwd, OUTPUT_DIR) | |||
puts @working_dir | |||
# exit | |||
@log = Logger.new($stdout) | |||
@pages = 0 | |||
create_output_dir | |||
gen_homepage | |||
gen_authorities |
@@ -0,0 +1,17 @@ | |||
def short_date(s) | |||
return if s.nil? | |||
Date.parse(s).strftime("%e %b %Y").gsub(' ', ' ') | |||
end | |||
def cleanup(s) | |||
return if s.nil? | |||
s.sub!('Unknown', '') | |||
s.sub!('Not Available', '') | |||
# s = "<span class=grant>#{s}</span>" if s.match(/approve/i) | |||
# s = "<span class=refuse>#{s}</span>" if s.match(/refuse/i) | |||
s | |||
end | |||
def slug(s) | |||
s.downcase.gsub(' ', '-') | |||
end |
@@ -0,0 +1,192 @@ | |||
body | |||
{ | |||
background-color: #fff; | |||
color: #555; | |||
font-family: Helvetica, Arial, sans-serif; | |||
font-size: 100%; | |||
width: 100%; | |||
line-height: 1.5em; | |||
margin: 0; | |||
padding: 0; | |||
} | |||
.warning { | |||
padding: 10px 15px; | |||
background-color: #fcfcfc; | |||
margin: 25px 0; | |||
} | |||
p | |||
{ | |||
font-size: 110%; | |||
} | |||
#main | |||
{ | |||
width: 920px; | |||
margin: 50px auto; | |||
} | |||
tr.footer { | |||
border-top: 1px solid #eee; | |||
border-bottom: 0px solid black; | |||
} | |||
tr.header { | |||
border-bottom: 1px solid #eee; | |||
} | |||
#header | |||
{ | |||
font-size: 100%; | |||
/* background-color: #e8f3f4; */ | |||
color: #999; | |||
text-align: left; | |||
margin: 0 0 0px 0; | |||
height: 100%; | |||
} | |||
#header_inner { | |||
margin: 0 auto; | |||
padding: 10px 0; | |||
width: 930px; | |||
} | |||
#header h1 { | |||
font-size: 180%; | |||
color: #555; | |||
} | |||
.grant { | |||
color: green; | |||
} | |||
.refuse { | |||
color: red; | |||
} | |||
a | |||
{ | |||
padding: 1px 4px; | |||
color: #999; | |||
text-decoration: none; | |||
} | |||
a:visited | |||
{ | |||
padding: 1px 4px; | |||
color: #111; | |||
text-decoration: none; | |||
} | |||
a:hover | |||
{ | |||
background-color: #4f4f4f; | |||
color: #fff; | |||
} | |||
h1 | |||
{ | |||
margin: 40px 0; | |||
line-height: 1.4em; | |||
font-weight: bold; | |||
color: #555; | |||
} | |||
h2 | |||
{ | |||
margin: 20px 0 0 0; | |||
line-height: 1.5em; | |||
font-weight: bold; | |||
color: #555; | |||
} | |||
h3 | |||
{ | |||
margin: 30px 0 0 0; | |||
line-height: 1.5em; | |||
font-weight: bold; | |||
color: #555; | |||
} | |||
.highlight | |||
{ | |||
background-color: #e8f3f4; | |||
} | |||
strong | |||
{ | |||
color: #000; | |||
} | |||
table | |||
{ | |||
border-collapse: collapse; | |||
margin: 20px 0 60px 0; | |||
} | |||
td, th | |||
{ | |||
padding: 6px; | |||
} | |||
th { | |||
font-weight: bold; | |||
text-align: left; | |||
} | |||
tr | |||
{ | |||
border-bottom: 1px solid #eee; | |||
} | |||
nav | |||
{ | |||
font-size: 85%; | |||
margin: 0 0 0 0; | |||
} | |||
.right | |||
{ | |||
text-align: right; | |||
} | |||
.noborder | |||
{ | |||
border: 0; | |||
} | |||
#notice { | |||
background-color: green; | |||
color: white; | |||
padding: 10px 20px; | |||
} | |||
.menu { | |||
margin: 0; | |||
padding: 0; | |||
} | |||
.menu li { | |||
list-style-type: none; | |||
display: inline; | |||
margin: 20px 0; | |||
padding: 0 10px 0 0; | |||
} | |||
@media print { | |||
.noprint, #footer, .nav, nav | |||
{ | |||
display: none; | |||
} | |||
body | |||
{ | |||
margin: 0 auto; | |||
color: black; | |||
} | |||
a, a:visited { | |||
background-color: #fff; | |||
} | |||
} |
@@ -0,0 +1,8 @@ | |||
%h1 Authorities | |||
%table | |||
- auths.each do |auth| | |||
%tr | |||
%td | |||
%a{ :href => slug(auth['authority_name']) } | |||
= auth['authority_name'] |
@@ -0,0 +1,42 @@ | |||
%h1= auth['authority_name'] | |||
%h2 Summary | |||
%table | |||
%thead | |||
%tr | |||
%th Status | |||
%th Decision | |||
%th Appeal status | |||
%th Appeal decision | |||
%th Quantity | |||
%tbody | |||
- summary.each do |row| | |||
%tr | |||
%td= cleanup(row['status']) | |||
%td= cleanup(row['decision']) | |||
%td= cleanup(row['appeal_status']) | |||
%td= cleanup(row['appeal_decision']) | |||
%td= row['qty'] | |||
%h2 Applications | |||
%table | |||
%thead | |||
%tr | |||
%th Received | |||
%th Reference | |||
%th Address | |||
-# %th Proposal | |||
%th Status | |||
%th Decision | |||
- apps.each do |app| | |||
%tr | |||
%td= short_date(app['date_received']) | |||
%td | |||
%a{ href: app['info_url']} | |||
= app['council_reference'] | |||
%td= app['address'] | |||
-# %td= app['description'] | |||
%td= cleanup(app['status']) | |||
%td= cleanup(app['decision']) |
@@ -0,0 +1,22 @@ | |||
%h2 Latest decisions | |||
%table | |||
%thead | |||
%tr | |||
%th Authority | |||
%th Reference | |||
%th Date | |||
%th Address | |||
%th Decision | |||
%tbody | |||
- decisions.each do |app| | |||
%tr | |||
%td | |||
%a{ :href => "/authorities/#{ slug(app['authority_name'])}" } | |||
= app['authority_name'] | |||
%td | |||
%a{ href: app['info_url']} | |||
= app['council_reference'] | |||
%td= short_date(app['date_decision']) | |||
%td= app['address'] | |||
%td= app['decision'] | |||
@@ -0,0 +1,22 @@ | |||
!!!5 | |||
%html | |||
%head | |||
%title InLink kiosks planning applications | |||
%link{ :href => '/style.css', :rel => 'stylesheet'} | |||
%body | |||
#main | |||
#header | |||
%h1 InLink kiosks planning applications | |||
%ul.menu | |||
%li | |||
%a{ :href => '/' } | |||
Home | |||
%li | |||
%a{ :href => '/authorities' } | |||
Authorities | |||
= yield | |||
#footer | |||
%a{ :href => 'https://twitter.com/adrianshort'} | |||
@adrianshort made this. |