# Attributes
BASE = %w(
erratum_id:integer
pdf_page:integer
bug_type:string
description:text
)
MORE = %w(
created_by:string
fixed_on:datetime
paper_page:integer
product_id:integer
sorting_key:integer
title_release_fixed_in:integer
title_release_reported_in:integer
)
EDIT = %w(
fix_category:string
fix_comment:string
)
# optionally remove old cruft
if ARGV.first == 'clean'
require 'fileutils'
FileUtils.rm_rf 'errata'
ARGV.shift
end
# establish project
if File.exist? 'errata'
Dir.chdir 'errata'
else
system 'rails errata'
Dir.chdir 'errata'
system "ruby script/generate scaffold erratum #{BASE.join(' ')}"
system "ruby script/generate migration AddMoreToErratum #{MORE.join(' ')}"
system "ruby script/generate migration AddEditToErratum #{EDIT.join(' ')}"
system 'rake db:migrate'
# helper for editing files
def edit(filepath)
data = File.open(filepath) {|file| file.read} rescue ''
yield data
File.open(filepath,'w') {|file| file.write data}
end
# add a virtual "beta_page" attribute to the model
edit('app/models/erratum.rb') do |data|
data[/^()end/,1] = <<-'EOF'.gsub(/^ /,'')
def beta_page
beta = { 896 => 0, 904 => 1, 910 => 2 }
beta.default = '?'
"#{beta[title_release_reported_in]}:#{pdf_page}"
end
EOF
end
# primary index
edit('app/views/errata/index.html.erb') do |data|
# rename Pdf page to beta page
data.gsub! 'Pdf', 'Beta'
data.gsub! 'pdf', 'beta'
# highlight new rows
data[/
\s+/,1] = '<%= check_age(erratum) %>'
# delete extra links
data.gsub! /.* link_to '.*\n/, ''
# make erratum_id hypertext
data[/=(h erratum.erratum_id)/,1] =
' link_to erratum.erratum_id, edit_erratum_path(erratum)'
end
# erratum helper
edit('app/helpers/errata_helper.rb') do |data|
data[/^()end/,1] = <<-'EOF'.gsub(/^ /,'')
def check_age(erratum)
if Time.now - erratum.updated_at < 86400
' class="new"'
end
end
EOF
end
# create a stylesheet
edit('public/stylesheets/errata.css') do |data|
data << <<-EOF.gsub(/^ /,'')
/* row colors */
.new {background-color: #9F9}
/* make the header an eye catcher */
h1 {
line-height: 2em;
text-align: center;
text-transform: capitalize
}
/* center the table */
table {
margin-left: auto;
margin-right: auto
}
/* table borders */
table, td, th {
border-color: #600;
border-style: solid;
border-width: 1px;
}
table {
border-spacing: 0;
border-collapse: collapse;
}
td, th {
margin: 0;
padding: 4px;
}
tr {
background-color: #FFC;
}
tr.new {
background-color: yellow
}
EOF
end
# link the stylesheet
edit('app/views/layouts/errata.html.erb') do |data|
data[/stylesheet_link_tag.*() %>/,1] = ", 'errata'"
end
# edit erratum
edit('app/views/errata/edit.html.erb') do |data|
# make BASE fields readonly
data.gsub! /f.text_field (\S+)/, 'f.text_field \1, :readonly => true'
data.gsub! /<%= f.text_area :(\w+) %>/, '<%=h @erratum.\1 %> '
# add EDIT fields
data[/\n()\s+\s+<%= f.submit/,1] = <<-EOF.gsub(/^ /,'')
Fix category
<%= f.select :fix_category, %w(FIXED DEFERRED RESOLVED) %>
Fix comment
<%= f.text_field :fix_comment %>
EOF
end
# filter, order index
# change update from redirecting to 'show' to redirect to 'next'
edit('app/controllers/errata_controller.rb') do |data|
data[/def index\s+@errata = Erratum.find\(:all()\)/,1] =
", :conditions => 'fix_category IS NULL',\n :order => 'pdf_page'"
data.gsub! 'redirect_to(@erratum)',
'redirect_to(:action => index)'
end
# disable session support
edit('app/controllers/application.rb') do |data|
data[/()^end/,1] = "\n self.allow_forgery_protection=false\n"
data[/()^end/,1] = "\n session :disabled => true\n"
end
end
require 'rubygems'
require 'config/environment.rb'
require 'rexml/document'
require 'open-uri'
doc = REXML::Document.new(open(ARGV.first))
doc.root.elements.each do |erratum|
attrs = Hash[*erratum.elements.map {|element|
name, value = element.name, element.text
name = 'erratum_id' if name == 'id'
name.gsub!('-','_')
value = value.to_i if element.attributes['type'] == 'integer'
[name, value]
}.flatten]
erratum = Erratum.find_by_erratum_id(attrs['erratum_id'])
erratum ||= Erratum.new
erratum.update_attributes! attrs
end
system 'ruby script/server'
|