module Syckle::Plugins
# = Developmer's Notes Plugin
#
# This plugin goes through you source files and compiles
# an lit of any labeled comments. Labels are single word
# prefixes to a comment ending in a colon. For example,
# you might note somewhere in your code:
#
# By default this label supports the TODO, FIXME, OPTIMIZE
# and DEPRECATE.
#
# Output is a set of files in HTML, XML and RDoc's simple
# markup format. This plugin can run automatically if there
# is a +notes/+ directory in the project's log directory.
#
#--
# TODO: Should this service be part of the +site+ cycle?
#++
class DNote < Service
cycle :main, :document
cycle :main, :reset
cycle :main, :clean
# not that this is necessary, but ...
available do |project|
begin
require 'dnote'
require 'dnote/format'
true
rescue LoadError
false
end
end
## autorun if log/notes exists
#autorun do |project|
# (project.log + 'dnote').exist?
#end
# Default note labels to looked for in source code.
DEFAULT_LABELS = ['TODO', 'FIXME', 'OPTIMIZE', 'DEPRECATE']
# File paths to search.
attr_accessor :files
# Labels to document. Defaults are: TODO, FIXME, OPTIMIZE and DEPRECATE.
attr_accessor :labels
# Exclude paths.
attr_accessor :exclude
# Ignore paths based on any part of pathname.
attr_accessor :ignore
# Output directory to save notes file. Defaults to dnote/ under
# the project log directory (eg. log/dnote/).
attr_accessor :output
# Formats (xml, html, rdoc).
attr_accessor :formats
# Title to use if temaplte can use it.
attr_accessor :title
#
def output=(path)
@output = Pathname.new(path)
end
#
#def dnote
# @dnote ||= ::DNote::Site.new(files, :labels=>labels, :formats=>formats, :output=>output)
#end
# Generate notes documents.
#--
# TODO: Is #trial? correct?
#++
def document
session = ::DNote::Session.new do |s|
s.paths = files
s.exclude = exclude
s.ignore = ignore
s.labels = labels #|| DEFAULT_LABELS
s.title = title
s.output = output
s.dryrun = trial?
end
formats.each do |format|
if format == 'index'
session.format = 'html'
session.output = File.join(self.output, 'index.html')
else
session.format = format
end
session.run
report "Updated #{output.to_s.sub(Dir.pwd+'/','')}" unless trial?
end
#files = files.map{ |f| Dir[f] }.flatten
#notes = ::DNote::Notes.new(files, :labels=>labels)
#[formats].flatten.each do |format|
# if format == 'index'
# format = 'html'
# output = File.join(self.output, 'index.html')
# end
# format = ::DNote::Format.new(notes, :format=>format, :output=>output.to_s, :title=>title, :dryrun=>trial?)
# format.render
# report "Updated #{output.to_s.sub(Dir.pwd+'/','')}" unless trial?
#end
end
# Reset output directory, marking it as out-of-date.
def reset
if File.directory?(output)
File.utime(0,0,output) unless $NOOP
puts "Marked #{output}"
end
end
# Remove output files.
def clean
if File.directory?(output)
formats.each do |format|
ext = ::DNote::Format::EXTENSIONS[format] || format
file = (output + "notes.#{ext}").to_s
rm(file)
report "Removed #{output}"
end
end
end
private
#
def initialize_defaults
@files = "**/*.rb"
@output = project.log + 'dnote'
@formats = ['index']
@labels = nil #DEFAULT_LABELS
end
end
end