spud 0.1.18 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/spud.rb +2 -182
- data/lib/spud/build_tools/build_tools.rb +13 -0
- data/lib/spud/build_tools/make/task.rb +27 -0
- data/lib/spud/build_tools/package.json/task.rb +47 -0
- data/lib/spud/build_tools/spud/block_param_info.rb +77 -0
- data/lib/spud/build_tools/spud/dsl/file.rb +23 -0
- data/lib/spud/build_tools/spud/dsl/task.rb +63 -0
- data/lib/spud/build_tools/spud/shell/command.rb +52 -0
- data/lib/spud/build_tools/spud/shell/result.rb +26 -0
- data/lib/spud/build_tools/spud/task.rb +125 -0
- data/lib/spud/build_tools/task.rb +33 -0
- data/lib/spud/cli/parser.rb +101 -0
- data/lib/spud/cli/results.rb +25 -0
- data/lib/{error.rb → spud/error.rb} +1 -0
- data/lib/spud/help.rb +23 -0
- data/lib/spud/lister.rb +86 -0
- data/lib/spud/options.rb +14 -0
- data/lib/spud/runtime.rb +104 -0
- data/lib/spud/task_arg.rb +51 -0
- data/lib/spud/task_args.rb +49 -0
- data/lib/spud/version.rb +3 -0
- metadata +48 -28
- data/lib/args.rb +0 -73
- data/lib/build_tools/build_rule.rb +0 -21
- data/lib/build_tools/build_tool.rb +0 -19
- data/lib/build_tools/build_tools.rb +0 -13
- data/lib/build_tools/make/make.rb +0 -33
- data/lib/build_tools/package.json/package.json.rb +0 -33
- data/lib/build_tools/spud/file_context.rb +0 -33
- data/lib/build_tools/spud/rule.rb +0 -124
- data/lib/build_tools/spud/rule_context.rb +0 -62
- data/lib/build_tools/spud/shell_error.rb +0 -7
- data/lib/build_tools/spud/spud.rb +0 -27
- data/lib/shell.rb +0 -38
- data/lib/version.rb +0 -3
@@ -1,33 +0,0 @@
|
|
1
|
-
require_relative '../build_tool'
|
2
|
-
require_relative '../build_rule'
|
3
|
-
|
4
|
-
module Spud::BuildTools
|
5
|
-
class Make < BuildTool
|
6
|
-
attr_reader :rules
|
7
|
-
|
8
|
-
def mount!
|
9
|
-
@rules = {}
|
10
|
-
return unless File.exist?('Makefile')
|
11
|
-
|
12
|
-
source = File.read('Makefile')
|
13
|
-
source.scan(/^(\S+):.*/).each do |match|
|
14
|
-
name = match.first
|
15
|
-
@rules[name] = Rule.new(name)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
class Rule < BuildRule
|
21
|
-
def initialize(name)
|
22
|
-
@name = name
|
23
|
-
end
|
24
|
-
|
25
|
-
def invoke(*args, **kwargs)
|
26
|
-
system('make', @name, *args)
|
27
|
-
end
|
28
|
-
|
29
|
-
def filename
|
30
|
-
'Makefile'
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
require_relative '../build_tool'
|
3
|
-
require_relative '../build_rule'
|
4
|
-
|
5
|
-
module Spud::BuildTools
|
6
|
-
class Node < BuildTool
|
7
|
-
attr_reader :rules
|
8
|
-
|
9
|
-
def mount!
|
10
|
-
@rules = {}
|
11
|
-
return unless File.exist?('package.json')
|
12
|
-
|
13
|
-
scripts = JSON.parse(File.read('package.json'))['scripts']
|
14
|
-
return unless scripts
|
15
|
-
|
16
|
-
scripts.each { |name, source| @rules[name] = Rule.new(source) }
|
17
|
-
end
|
18
|
-
|
19
|
-
class Rule < BuildRule
|
20
|
-
def initialize(source)
|
21
|
-
@source = source
|
22
|
-
end
|
23
|
-
|
24
|
-
def invoke(*args, **kwargs)
|
25
|
-
system(@source, out: STDOUT)
|
26
|
-
end
|
27
|
-
|
28
|
-
def filename
|
29
|
-
'package.json'
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
require_relative 'rule'
|
2
|
-
|
3
|
-
module Spud::BuildTools
|
4
|
-
module SpudBuild
|
5
|
-
class FileContext
|
6
|
-
attr_reader :__rules
|
7
|
-
|
8
|
-
def initialize(spud, filename)
|
9
|
-
@__spud = spud
|
10
|
-
@__filename = filename
|
11
|
-
@__rules = {}
|
12
|
-
end
|
13
|
-
|
14
|
-
def require_relative(name)
|
15
|
-
require("./#{name}")
|
16
|
-
end
|
17
|
-
|
18
|
-
def rule(name, *args, &block)
|
19
|
-
files = args.select { |arg| arg.is_a?(String) }
|
20
|
-
deps = args.select { |arg| arg.is_a?(Hash) }.reduce({}) { |hash, dep| hash.merge(dep) }
|
21
|
-
|
22
|
-
prefix = @__filename == 'Spudfile' ? '' : "#{File.basename(@__filename, '.rb')}."
|
23
|
-
name = "#{prefix}#{name}"
|
24
|
-
|
25
|
-
@__rules[name] = Rule.new(@__spud, self, @__filename, name, files, deps, block)
|
26
|
-
end
|
27
|
-
|
28
|
-
def method_missing(name, *args, &block)
|
29
|
-
rule(name, *args, &block)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,124 +0,0 @@
|
|
1
|
-
require_relative 'file_context'
|
2
|
-
require_relative 'rule_context'
|
3
|
-
require_relative '../build_rule'
|
4
|
-
require_relative '../../error'
|
5
|
-
|
6
|
-
module Spud::BuildTools
|
7
|
-
module SpudBuild
|
8
|
-
class Rule < BuildRule
|
9
|
-
attr_reader :filename
|
10
|
-
|
11
|
-
def initialize(spud, file_context, filename, name, files, deps, block)
|
12
|
-
@spud = spud
|
13
|
-
@file_context = file_context
|
14
|
-
@filename = filename
|
15
|
-
@name = name
|
16
|
-
@files = files
|
17
|
-
@deps = deps
|
18
|
-
@block = block
|
19
|
-
end
|
20
|
-
|
21
|
-
def invoke(*args, **kwargs)
|
22
|
-
raise Spud::Error, "'#{@name}' is up to date" if up_to_date?
|
23
|
-
|
24
|
-
missing = positional_params.length - args.length
|
25
|
-
if missing > 0
|
26
|
-
names = positional_params.map { |name| "'#{name}'" }.join(', ')
|
27
|
-
arguments = missing > 1 ? 'arguments' : 'argument'
|
28
|
-
raise Spud::Error, "invocation of '#{@name}' missing required #{arguments} #{names}"
|
29
|
-
end
|
30
|
-
|
31
|
-
unless key_params?
|
32
|
-
RuleContext.new(@spud, @file_context).instance_exec(*args, &@block)
|
33
|
-
return
|
34
|
-
end
|
35
|
-
|
36
|
-
begin
|
37
|
-
RuleContext.new(@spud, @file_context).instance_exec(*args, **kwargs, &@block)
|
38
|
-
rescue ArgumentError => e
|
39
|
-
raise Spud::Error, "invocation of '#{@name}' with #{e.message}"
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
# Params
|
44
|
-
def positional_params
|
45
|
-
@positional_params ||= params.select { |p| p.first == :req }.map(&:last)
|
46
|
-
end
|
47
|
-
|
48
|
-
def keyword_params
|
49
|
-
@keyword_params ||= params.select { |p| p.first == :key }.map(&:last)
|
50
|
-
end
|
51
|
-
|
52
|
-
private
|
53
|
-
|
54
|
-
# Up to date checking
|
55
|
-
def up_to_date?
|
56
|
-
return files_up_to_date? unless files_up_to_date?.nil?
|
57
|
-
deps_up_to_date?
|
58
|
-
end
|
59
|
-
|
60
|
-
def files_up_to_date?
|
61
|
-
return nil if all_files.empty?
|
62
|
-
all_files_exist?
|
63
|
-
end
|
64
|
-
|
65
|
-
def all_files_exist?
|
66
|
-
all_files.all?(&File.method(:exist?))
|
67
|
-
end
|
68
|
-
|
69
|
-
def all_files
|
70
|
-
@files.map(&Dir.method(:glob)).flatten
|
71
|
-
end
|
72
|
-
|
73
|
-
def deps_up_to_date?
|
74
|
-
return nil if @deps.empty?
|
75
|
-
|
76
|
-
@deps.all? do |deps, targets|
|
77
|
-
targets = [targets].flatten
|
78
|
-
deps = [deps].flatten
|
79
|
-
|
80
|
-
latest_target = targets
|
81
|
-
.map(&Dir.method(:glob))
|
82
|
-
.flatten
|
83
|
-
.map(&File.method(:mtime))
|
84
|
-
.sort
|
85
|
-
.last
|
86
|
-
|
87
|
-
latest_dep = deps
|
88
|
-
.map(&Dir.method(:glob))
|
89
|
-
.flatten
|
90
|
-
.map(&File.method(:mtime))
|
91
|
-
.sort
|
92
|
-
.last
|
93
|
-
|
94
|
-
return false unless latest_target && latest_dep
|
95
|
-
latest_target > latest_dep
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
# Lambda
|
100
|
-
def key_params?
|
101
|
-
@key_params ||= !keyword_params.empty?
|
102
|
-
end
|
103
|
-
|
104
|
-
def params
|
105
|
-
@params ||= lam.parameters
|
106
|
-
end
|
107
|
-
|
108
|
-
def lam
|
109
|
-
@lam ||= build_lam
|
110
|
-
end
|
111
|
-
|
112
|
-
def build_lam
|
113
|
-
line = @block.source_location.last - 1
|
114
|
-
line = File.read(filename).split("\n")[line]
|
115
|
-
|
116
|
-
match = /(do|{)\s*\|(?<params>[^|]+)\|/.match(line)
|
117
|
-
return -> {} unless match
|
118
|
-
|
119
|
-
param_source = match[:params]
|
120
|
-
eval("-> (#{param_source}) {}")
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
@@ -1,62 +0,0 @@
|
|
1
|
-
require 'fileutils'
|
2
|
-
require_relative 'shell_error'
|
3
|
-
require_relative '../../shell'
|
4
|
-
require_relative '../../error'
|
5
|
-
|
6
|
-
module Spud::BuildTools
|
7
|
-
module SpudBuild
|
8
|
-
class RuleContext
|
9
|
-
include FileUtils
|
10
|
-
|
11
|
-
def initialize(spud, file_context)
|
12
|
-
@__spud = spud
|
13
|
-
|
14
|
-
file_context.singleton_methods.each do |method_name|
|
15
|
-
define_singleton_method(method_name, &file_context.method(method_name))
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def __shell(cmd, silent: false)
|
20
|
-
@__spud.watch_process = Spud::Shell.(cmd, silent: silent, wait: @__spud.wait?)
|
21
|
-
end
|
22
|
-
|
23
|
-
def sh(cmd)
|
24
|
-
out = sh?(cmd)
|
25
|
-
raise ShellError, cmd unless out.status.exitstatus.zero?
|
26
|
-
|
27
|
-
out
|
28
|
-
end
|
29
|
-
|
30
|
-
def sh?(cmd)
|
31
|
-
puts cmd
|
32
|
-
__shell(cmd)
|
33
|
-
end
|
34
|
-
|
35
|
-
def shh(cmd)
|
36
|
-
out = shh?(cmd)
|
37
|
-
raise ShellError, cmd unless out.status.exitstatus.zero?
|
38
|
-
|
39
|
-
out
|
40
|
-
end
|
41
|
-
|
42
|
-
def shh?(cmd)
|
43
|
-
__shell(cmd)
|
44
|
-
end
|
45
|
-
|
46
|
-
def shhh(cmd)
|
47
|
-
out = shhh?(cmd)
|
48
|
-
raise ShellError, cmd unless out.status.exitstatus.zero?
|
49
|
-
|
50
|
-
out
|
51
|
-
end
|
52
|
-
|
53
|
-
def shhh?(cmd)
|
54
|
-
__shell(cmd, silent: true)
|
55
|
-
end
|
56
|
-
|
57
|
-
def invoke(name, *args, **kwargs)
|
58
|
-
@__spud.invoke(name, *args, **kwargs)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require_relative '../build_tool'
|
2
|
-
require_relative 'file_context'
|
3
|
-
|
4
|
-
module Spud::BuildTools
|
5
|
-
module SpudBuild
|
6
|
-
class Build < BuildTool
|
7
|
-
attr_reader :rules
|
8
|
-
|
9
|
-
def mount!
|
10
|
-
filenames = Dir.glob('Spudfile')
|
11
|
-
filenames += Dir.glob('spuds/*.rb')
|
12
|
-
|
13
|
-
@rules = {}
|
14
|
-
filenames.each do |filename|
|
15
|
-
source = File.read(filename)
|
16
|
-
@ctx = FileContext.new(@spud, filename)
|
17
|
-
|
18
|
-
$LOAD_PATH << File.dirname(filename)
|
19
|
-
@ctx.instance_eval(source)
|
20
|
-
$LOAD_PATH.pop
|
21
|
-
|
22
|
-
@rules.merge!(@ctx.__rules)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
data/lib/shell.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
require 'stringio'
|
2
|
-
require 'open3'
|
3
|
-
|
4
|
-
module Spud
|
5
|
-
class Shell < String
|
6
|
-
def self.call(cmd, silent: false, wait: false)
|
7
|
-
new(cmd, silent, wait)
|
8
|
-
end
|
9
|
-
|
10
|
-
def initialize(cmd, silent = false, wait = false)
|
11
|
-
output = StringIO.new
|
12
|
-
|
13
|
-
stdin, out, @status = Open3.popen2e(cmd)
|
14
|
-
@thread = Thread.new do
|
15
|
-
while line = out.gets
|
16
|
-
puts line unless silent
|
17
|
-
output.puts line
|
18
|
-
super(output.string)
|
19
|
-
end
|
20
|
-
|
21
|
-
out.close
|
22
|
-
stdin.close
|
23
|
-
end
|
24
|
-
|
25
|
-
@thread.join if wait
|
26
|
-
end
|
27
|
-
|
28
|
-
def status
|
29
|
-
@status.value
|
30
|
-
end
|
31
|
-
|
32
|
-
def kill!
|
33
|
-
Process.kill('KILL', @status.pid)
|
34
|
-
@thread.kill
|
35
|
-
@thread.join
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
data/lib/version.rb
DELETED