desc "add copyright to all .rb files in the distribution"
task 'add-copyright' do
puts "adding copyright to files that don't have it currently"
puts COPYRIGHT
puts
Dir['{lib,test}/**/*{.rb}'].each do |file|
next if file =~ /_darcs/
lines = File.readlines(file).map{|l| l.chomp}
unless lines.first(COPYRIGHT.size) == COPYRIGHT
puts "#{file} seems to need attention, first 4 lines:"
puts lines[0..3]
puts
end
end
end
desc "doc/README to html"
Rake::RDocTask.new('readme2html-build') do |rd|
rd.options = %w[
--quiet
--opname readme.html
]
rd.rdoc_dir = 'readme'
rd.rdoc_files = ['doc/README']
rd.main = 'doc/README'
rd.title = "Ramaze documentation"
end
desc "doc/README to doc/README.html"
task 'readme2html' => ['readme-build', 'readme2html-build'] do
cp('readme/files/doc/README.html', 'doc/README.html')
rm_rf('readme')
end
desc "generate doc/TODO from the TODO tags in the source"
task 'todolist' do
list = `rake todo`
tasks = {}
current = nil
list.split("\n")[2..-1].each do |line|
if line =~ /TODO/ or line.empty?
elsif line =~ /^vim/
current = line.split[1]
tasks[current] = []
else
tasks[current] << line
end
end
lines = tasks.map{ |name, items| [name, items, ''] }.flatten
lines.pop
File.open(File.join('doc', 'TODO'), 'w+') do |f|
f.puts "This list is programmaticly generated by `rake todolist`"
f.puts "If you want to add/remove items from the list, change them at the"
f.puts "position specified in the list."
f.puts
f.puts(lines)
end
end
desc "remove those annoying spaces at the end of lines"
task 'fix-end-spaces' do
Dir['{lib,spec}/**/*.rb'].each do |file|
next if file =~ /_darcs/
lines = File.readlines(file)
new = lines.dup
lines.each_with_index do |line, i|
if line =~ /\s+\n/
puts "fixing #{file}:#{i + 1}"
p line
new[i] = line.rstrip
end
end
unless new == lines
File.open(file, 'w+') do |f|
new.each do |line|
f.puts(line)
end
end
end
end
end
desc "Compile the doc/README from the parts of doc/readme"
task 'readme-build' do
require 'enumerator'
chapters = [
'About Ramaze', 'introduction',
'Features Overview', 'features',
'Basic Principles', 'principles',
'Installation', 'installing',
'Getting Started', 'getting_started',
'A couple of Examples', 'examples',
'How to find Help', 'getting_help',
'Appendix', 'appendix',
'And thanks to...', 'thanks',
]
File.open('doc/README', 'w+') do |readme|
readme.puts COPYRIGHT.map{|l| l[1..-1]}, ''
chapters.each_slice(2) do |title, file|
file = File.join('doc', 'readme_chunks', "#{file}.txt")
chapter = File.read(file)
readme.puts "= #{title}", '', chapter
readme.puts '', '' unless title == chapters[-2]
end
end
end
task 'tutorial2html' do
require 'bluecloth'
basefile = File.join('doc', 'tutorial', 'todolist')
content = File.read(basefile + '.mkd')
html = BlueCloth.new(content).to_html
wrap = %{
Ramaze Tutorial: Todolist
#{html}
}.strip
File.open(basefile + '.html', 'w+'){|f| f.puts(wrap) }
end
task 'tutorial' => ['tutorial2html'] do
require 'hpricot'
system 'rake tutorial2html'
filename = 'doc/tutorial/todolist.html'
file = File.read(filename)
doc = Hpricot(file)
to_links = []
(doc/:h2).each do |h2|
text = h2.inner_html
link_id = text.gsub(' ', '_')
to_links << %{#{text}}
to_link = %{#{text}
}
file.gsub!(h2.to_html, to_link)
end
links = to_links.join("\n ")
h1 = "To-do List Tutorial
"
menu =
%{
#{h1}
}
file.gsub!(h1, menu)
File.open(filename, 'w+') do |f|
f.puts file
end
end
task 'authors' do
changes = `darcs changes`
authors = []
mapping = {}
author_map = {
'm.fellinger@gmail.com' => 'Michael Fellinger',
'manveru@weez-int.com' => 'Michael Fellinger',
'clive@crous.co.za' => 'Clive Crous',
'blueonyx@dev-area.net' => 'Martin Hilbig',
'rff.rff@gmail.com' => 'Gabriele Renzi',
'comp.lang.zenix+ramaze@gmail.com' => 'zenix',
}
changes.split("\n").grep(/^\w/).each do |line|
splat = line.split
author = splat[6..-1]
email = author.pop
email.gsub!(/<(.*?)>/, '\1')
name = author.join(' ')
name = author_map[email] if name.empty?
mapping[name] = email
end
pp mapping
max = mapping.map{|k,v| k.size}.max
File.open('doc/AUTHORS', 'w+') do |fp|
fp.puts("Following persons (in alphabetical order) have contributed to Ramaze:")
fp.puts
mapping.sort_by{|k,v| k}.each do |name, email|
fp.puts("#{name.ljust(max)} - #{email}")
end
end
end
task 'release' => ['distribute'] do
sh 'rubyforge login'
#sh "rubyforge add_release ramaze ramaze #{VERS} pkg/ramaze-#{VERS}.gem"
require 'open-uri'
require 'hpricot'
url = "http://rubyforge.org/frs/?group_id=3034"
doc = Hpricot(open(url))
a = (doc/:a).find{|a| a[:href] =~ /release_id/}
version = a.inner_html
release_id = Hash[*a[:href].split('?').last.split('=').flatten]['release_id']
sh "rubyforge add_file ramaze ramaze #{release_id} pkg/ramaze-#{VERS}.tar.gz"
sh "rubyforge add_file ramaze ramaze #{release_id} pkg/ramaze-#{VERS}.tar.bz2"
end
desc "list all undocumented methods"
task 'undocumented-module' do
require 'strscan'
require 'term/ansicolor'
class String
include Term::ANSIColor
end
class SimpleDoc
def initialize(string)
@s = StringScanner.new(string)
end
def scan
comment = false
total, missing = [], []
until @s.eos?
unless @s.scan(/^\s*#.*/)
comment = true if @s.scan(/^=begin[^$]*$/)
comment = false if comment and @s.scan(/^=end$/)
unless comment
if @s.scan(/(?:class ).*/)
#p @s.matched
elsif @s.scan(/(?:module ).*/)
#p @s.matched
elsif @s.scan(/(?:def )[\w?!*+\/-]+(?=[\(\s])/)
total << @s.matched.split.last
prev = @s.pre_match.split("\n")
prev.delete_if{|s| s.strip.empty?}
unless prev.last =~ /^\s*#.*/
missing << @s.matched.split.last
end
else
@s.scan(/./m)
end
end
end
end
return total, missing
end
end
all = {}
files = Dir['lib/**/*.rb']
files.each do |file|
t, m = SimpleDoc.new(File.read(file)).scan
all[file] = [t, m]
end
failed = all.reject{|k,(t,m)| m.size == 0}
max = failed.keys.sort_by{|f| f.size}.last.size
colors = {
(0..25 ) => :blue,
(25..50 ) => :green,
(50..75 ) => :yellow,
(75..100) => :red,
}
puts "\nAll undocumented methods\n\n"
failed.sort.each do |file, (t, m)|
ts, ms = t.size, m.size
tss, mss = ts.to_s, ms.to_s
ratio = ((ms.to_f/ts)*100).to_i
color = colors.find{|k,v| k.include?(ratio)}.last
complete = ms.to_f/ts.to_f
mthc = "method"
if ratio != 100
puts "#{file.ljust(max)}\t[#{[mss, tss].join('/').center(8)}]".send(color)
mthc = "methods" if ts > 1
if $VERBOSE
puts "Of #{tss} #{mthc}, #{mss} still needs documenting (#{100 - ratio}% documented, #{ratio}% undocumented)".send(color)
mthc = "method"
mthc = "methods" if ms > 1
print "#{mthc.capitalize}: "
end
puts m.join(', ')
puts
end
end
puts "The colors mean percentages of documentation left (ratio of undocumented methods to total):"
colors.sort_by{|k,v| k.begin}.each do |r, color|
print "[#{r.inspect}] ".send(color)
end
puts
end
task 'undocumented' do
$VERBOSE = false
Rake::Task['undocumented-module'].execute
end
task 'undocumented-verbose' do
$VERBOSE = true
Rake::Task['undocumented-module'].execute
end