tenderlove (owner)

Fork Of

gist: 6633 by jbarnette ...make that 28

Revisions

gist: 6659 Download_button fork
public
Public Clone URL: git://gist.github.com/6659.git
rake_in_30_lines.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
require "set"
 
module RakeTask
  CALLED = Set.new
  NAMESPACES = []
  TASKS = Hash.new { |h, k| h[k] = Struct.new(:blocks, :deps).new([], []) }
 
  class << self
    def call(name)
      return if CALLED.include?(name)
      raise "Unknown task: #{name.inspect}" unless TASKS.key?(name)
 
      CALLED << name
      (task = TASKS[name]).deps.each { |t| call(t) }
      task.blocks.each { |b| b[] }
    end
 
    def namespace(name, &block)
      NAMESPACES << name && yield ensure NAMESPACES.pop!
    end
    
    def task(spec, &block)
      name, deps = spec.entries[0] rescue name = spec
      name, deps = (NAMESPACES + [name.to_s]) * ":", Array(deps).map { |d| d.to_s }
    
      TASKS[name].blocks << block
      TASKS[name].deps |= deps
    end
  end
end
 
RakeTask.module_eval do
  task :super do
    puts "Super"
  end
  
  task :super do
    puts "Super2"
  end
  
  task "duper" do
    puts "Duper"
  end
  
  task :awesome => :super do
    puts "Awesome"
  end
  
  task :cool => [:awesome, :duper] do
    puts "Cool"
  end
  
  %w(awesome cool).each { |t| RakeTask.call(t) }
end