Skip to content

Instantly share code, notes, and snippets.

@tkyowa
Created February 8, 2012 12:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tkyowa/1768837 to your computer and use it in GitHub Desktop.
Save tkyowa/1768837 to your computer and use it in GitHub Desktop.
Rake task hierarchical parser
#
# Rake task hierarchical parser
#
# Install:
# put this file on ${HOME}/.rake directory
#
# Usage:
# rake -g dependency
# rake -g 'dependency[task_name]'
#
# Example:
# $ rake -g 'dependency[spec]'
# spec
# db:test:prepare
# db:abort_if_pending_migrations
# environment
#
import File.join(Dir.pwd, 'Rakefile')
class RakeTaskHierarchicalParser
def self.parse(tasks, target_task_name = nil)
new(tasks, target_task_name).run
end
def run
if @target_task_name && !@target_task_name.empty?
if @tree[@target_task_name]
put_dependency_task(@target_task_name)
else
puts "#{@target_task_name} is undefined!"
end
else
@tree.sort.each do |task_name, preqs|
put_dependency_task(task_name)
end
end
end
private
def initialize(tasks, target_task_name)
@tree = tasks.each_with_object({}) do |t, result|
next unless t.instance_of?(Rake::Task)
result[t.name] = t.prerequisites
end
@target_task_name = target_task_name
end
def put_dependency_task(targets, indent_level = 0)
targets = [ targets ] unless targets.is_a?(Array)
targets.each do |target|
puts format(target, indent_level)
if @tree[target] && !@tree[target].empty?
put_dependency_task(@tree[target], indent_level + 1)
end
end
end
def format(task_name, indent_level)
"#{ " " * ( indent_level * 2 ) }#{task_name}"
end
end
task :dependency, "target_task_name"
desc "Output tasks and hierarchical dependencies"
task :dependency do |x, args|
if ( t = args.target_task_name )
RakeTaskHierarchicalParser.parse(Rake::Task.tasks, t)
else
RakeTaskHierarchicalParser.parse(Rake::Task.tasks)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment