forked from benhoskings/babushka
/
dep_definer.rb
110 lines (87 loc) · 2.38 KB
/
dep_definer.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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
module Babushka
class DepDefiner
class UnmeetableDep < DepError
end
include RunHelpers
include AcceptsListFor
include AcceptsValueFor
include AcceptsBlockFor
attr_reader :payload, :dependency
delegate :name, :basename, :load_path, :to => :dependency
def initialize dep, &block
@dependency = dep
@payload = {}
@block = block
end
def define!
instance_eval &@block unless @block.nil?
end
delegate :var, :set, :merge, :define_var, :to => :vars
def helper name, &block
file, line = caller.first.split(':', 2)
line = line.to_i
metaclass.send :define_method, name do |*args|
log_error "#helper is deprecated. Design improvements mean that it's not required; you\n" +
"can just use a standard method instead, like so:\n" +
" (at #{file}:#{line})\n" +
" def #{name} #{('a'..'z').to_a[0...(block.arity)].join(', ')}\n" +
" ...\n" +
" end"
if block.arity == -1
instance_exec *args, &block
elsif block.arity != args.length
raise ArgumentError, "wrong number of args to #{name} (#{args.length} for #{block.arity})"
else
instance_exec *args[0...(block.arity)], &block
end
end
end
def result message, opts = {}
returning opts[:result] do
dependency.result_message = message
end
end
def met message
result message, :result => true
end
def unmet message
result message, :result => false
end
def fail_because message
raise UnmeetableDep, message
end
def file_and_line
get_file_and_line_for(@block)
end
def file_and_line_for block_name
get_file_and_line_for send(block_name) if has_block? block_name
end
def get_file_and_line_for block
block.inspect.scan(/\#\<Proc\:0x[0-9a-f]+\@([^:]+):(\d+)>/).flatten
end
private
def vars
Base.task.vars
end
def pkg_manager
BaseHelper
end
def on platform, &block
if platform.in? [*chooser]
@current_platform = platform
returning block.call do
@current_platform = nil
end
end
end
def chooser
Base.host.match_list
end
def chooser_choices
Base.host.all_tokens
end
def self.source_template
Dep.base_template
end
end
end