jbarnette (owner)

Forks

Revisions

gist: 6633 Download_button fork
public
Description:
...make that 28
Public Clone URL: git://gist.github.com/6633.git
Embed All Files: show embed
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
require "set"
 
module RakeTask
  CALLED = Set.new
  NAMESPACES = []
  TASKS = Hash.new { |h, k| h[k] = Struct.new(:blocks, :deps).new([], []) }
 
  def self.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 self.namespace(name, &block)
    NAMESPACES << name && yield ensure NAMESPACES.pop!
  end
  
  def self.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
 
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