spud 0.2.1 → 0.2.6
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 +5 -5
- data/lib/spud.rb +3 -2
- data/lib/spud/block_param_info.rb +80 -0
- data/lib/spud/cli/options.rb +35 -0
- data/lib/spud/cli/parser.rb +23 -19
- data/lib/spud/cli/results.rb +18 -11
- data/lib/spud/driver.rb +136 -0
- data/lib/spud/error.rb +6 -1
- data/lib/spud/help.rb +17 -14
- data/lib/spud/lister.rb +27 -22
- data/lib/spud/shell/command.rb +75 -0
- data/lib/spud/shell/result.rb +33 -0
- data/lib/spud/task_arg.rb +24 -12
- data/lib/spud/task_args.rb +20 -18
- data/lib/spud/task_runners/make/task.rb +67 -0
- data/lib/spud/task_runners/package.json/task.rb +71 -0
- data/lib/spud/task_runners/spud_task_runner/dependency.rb +50 -0
- data/lib/spud/task_runners/spud_task_runner/file_dsl.rb +57 -0
- data/lib/spud/task_runners/spud_task_runner/task.rb +149 -0
- data/lib/spud/task_runners/spud_task_runner/task_dsl.rb +95 -0
- data/lib/spud/task_runners/task.rb +40 -0
- data/lib/spud/task_runners/task_runners.rb +25 -0
- data/lib/spud/version.rb +2 -1
- data/lib/spud/watch.rb +73 -0
- metadata +51 -20
- data/lib/spud/build_tools/build_tools.rb +0 -13
- data/lib/spud/build_tools/make/task.rb +0 -27
- data/lib/spud/build_tools/package.json/task.rb +0 -47
- data/lib/spud/build_tools/spud/block_param_info.rb +0 -77
- data/lib/spud/build_tools/spud/dsl/file.rb +0 -23
- data/lib/spud/build_tools/spud/dsl/task.rb +0 -63
- data/lib/spud/build_tools/spud/shell/command.rb +0 -52
- data/lib/spud/build_tools/spud/shell/result.rb +0 -26
- data/lib/spud/build_tools/spud/task.rb +0 -125
- data/lib/spud/build_tools/task.rb +0 -33
- data/lib/spud/options.rb +0 -14
- data/lib/spud/runtime.rb +0 -104
@@ -1,52 +0,0 @@
|
|
1
|
-
require 'stringio'
|
2
|
-
require 'open3'
|
3
|
-
require 'spud/build_tools/spud/shell/result'
|
4
|
-
|
5
|
-
module Spud
|
6
|
-
module BuildTools
|
7
|
-
module Spud
|
8
|
-
module Shell
|
9
|
-
class Command
|
10
|
-
attr_reader :result
|
11
|
-
|
12
|
-
# @param command [String]
|
13
|
-
# @param silent [Boolean]
|
14
|
-
# @param handle [IO]
|
15
|
-
def self.call(command, silent: false, handle: STDOUT)
|
16
|
-
cmd = new(command, silent: silent, handle: handle)
|
17
|
-
cmd.issue!
|
18
|
-
cmd.result
|
19
|
-
end
|
20
|
-
|
21
|
-
# @param command [String]
|
22
|
-
# @param silent [Boolean]
|
23
|
-
# @param handle [IO]
|
24
|
-
def initialize(command, silent: false, handle: STDOUT)
|
25
|
-
@command = command
|
26
|
-
@silent = silent
|
27
|
-
@handle = handle
|
28
|
-
|
29
|
-
@result = nil
|
30
|
-
end
|
31
|
-
|
32
|
-
# @return [void]
|
33
|
-
def issue!
|
34
|
-
capturer = StringIO.new
|
35
|
-
|
36
|
-
Open3.popen2e(@command) do |_stdin, stdout, thread|
|
37
|
-
loop do
|
38
|
-
line = stdout.gets
|
39
|
-
break unless line
|
40
|
-
|
41
|
-
@handle.write line unless @silent
|
42
|
-
capturer.puts line
|
43
|
-
end
|
44
|
-
|
45
|
-
@result = Result.new(capturer.string, thread.value)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module Spud
|
2
|
-
module BuildTools
|
3
|
-
module Spud
|
4
|
-
module Shell
|
5
|
-
class Result < String
|
6
|
-
attr_reader :status
|
7
|
-
|
8
|
-
# @param output [String]
|
9
|
-
# @param status [Process::Status]
|
10
|
-
def initialize(output, status)
|
11
|
-
super(output)
|
12
|
-
@status = status
|
13
|
-
end
|
14
|
-
|
15
|
-
def method_missing(symbol, *args)
|
16
|
-
status.respond_to?(symbol) ? status.send(symbol, *args) : super
|
17
|
-
end
|
18
|
-
|
19
|
-
def respond_to_missing?(symbol, *)
|
20
|
-
status.respond_to?(symbol) || super
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,125 +0,0 @@
|
|
1
|
-
require 'spud/error'
|
2
|
-
require 'spud/task_args'
|
3
|
-
require 'spud/build_tools/task'
|
4
|
-
require 'spud/build_tools/spud/task'
|
5
|
-
require 'spud/build_tools/spud/dsl/file'
|
6
|
-
require 'spud/build_tools/spud/dsl/task'
|
7
|
-
|
8
|
-
module Spud
|
9
|
-
module BuildTools
|
10
|
-
module Spud
|
11
|
-
class Task < BuildTools::Task
|
12
|
-
# @return [void]
|
13
|
-
def self.mount!
|
14
|
-
Dir['**/Spudfile', '**/*.spud'].each do |filename|
|
15
|
-
@filename = filename
|
16
|
-
file_dsl.instance_eval(File.read(filename), filename)
|
17
|
-
end
|
18
|
-
|
19
|
-
@filename = nil
|
20
|
-
end
|
21
|
-
|
22
|
-
# @return [Spud::DSL::File]
|
23
|
-
def self.file_dsl
|
24
|
-
@file_dsl ||= DSL::File.new
|
25
|
-
end
|
26
|
-
|
27
|
-
# @param task [String]
|
28
|
-
# @param block [Proc]
|
29
|
-
# @return [void]
|
30
|
-
def self.add_task(task, &block)
|
31
|
-
raise "task '#{task}' somehow created without filename" unless @filename
|
32
|
-
|
33
|
-
new(name: qualified_name(@filename, task.to_s), filename: @filename, &block)
|
34
|
-
end
|
35
|
-
|
36
|
-
# @param filename [String]
|
37
|
-
# @param task [String]
|
38
|
-
# @param positional [Array]
|
39
|
-
# @param named [Hash]
|
40
|
-
def self.invoke(filename, task, positional, named)
|
41
|
-
task = task.to_s
|
42
|
-
task_obj = task_for(filename, task)
|
43
|
-
if task_obj
|
44
|
-
Runtime.invoke(task_obj.name, positional, named)
|
45
|
-
else
|
46
|
-
Runtime.invoke(task, positional, named)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
# @param filename [String]
|
51
|
-
# @param task [String]
|
52
|
-
def self.task_for(filename, task)
|
53
|
-
Runtime.tasks[qualified_name(filename, task.to_s)]
|
54
|
-
end
|
55
|
-
|
56
|
-
def self.qualified_name(filename, task)
|
57
|
-
raise "task '#{task}' somehow created without filename" unless filename
|
58
|
-
|
59
|
-
[qualified_prefix(filename), task.to_s].join('.').gsub(/^\./, '')
|
60
|
-
end
|
61
|
-
|
62
|
-
# @param filename [String]
|
63
|
-
# @return [String]
|
64
|
-
def self.qualified_prefix(filename)
|
65
|
-
dirname = File.dirname(filename)
|
66
|
-
dirname = '' if dirname == '.'
|
67
|
-
|
68
|
-
basename = File.basename(filename, '.spud')
|
69
|
-
basename_array = basename == 'Spudfile' ? [] : [basename]
|
70
|
-
|
71
|
-
(dirname.split('/') + basename_array).join('.')
|
72
|
-
end
|
73
|
-
|
74
|
-
def initialize(name:, filename:, &block)
|
75
|
-
super
|
76
|
-
@block = block
|
77
|
-
end
|
78
|
-
|
79
|
-
# @param positional [Array]
|
80
|
-
# @param named [Hash]
|
81
|
-
# @return [Object]
|
82
|
-
def invoke(positional, named)
|
83
|
-
check_required!(positional)
|
84
|
-
|
85
|
-
return task_dsl.instance_exec(*positional, &@block) unless args.any_named?
|
86
|
-
|
87
|
-
task_dsl.instance_exec(*positional, **symbolize_keys(named), &@block)
|
88
|
-
rescue ArgumentError => error
|
89
|
-
raise Error, "invocation of '#{name}' with #{error.message}"
|
90
|
-
end
|
91
|
-
|
92
|
-
# @return [Spud::TaskArgs]
|
93
|
-
def args
|
94
|
-
@args ||= ::Spud::TaskArgs.from_block(filename, &@block)
|
95
|
-
end
|
96
|
-
|
97
|
-
private
|
98
|
-
|
99
|
-
# @param positional [Array<String>]
|
100
|
-
# @return [void]
|
101
|
-
def check_required!(positional)
|
102
|
-
required_positional = args.required_positional
|
103
|
-
missing_positional = required_positional.length - positional.length
|
104
|
-
if missing_positional > 0
|
105
|
-
arguments = required_positional.length - missing_positional > 1 ? 'arguments' : 'argument'
|
106
|
-
raise Error, "invocation of '#{name}' missing required #{arguments} #{required_positional.join(', ')}"
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
# @return [Spud::DSL::Task]
|
111
|
-
def task_dsl
|
112
|
-
@task_dsl ||= DSL::Task.new(filename)
|
113
|
-
end
|
114
|
-
|
115
|
-
# @param hash [Hash]
|
116
|
-
# @return [Hash]
|
117
|
-
def symbolize_keys(hash)
|
118
|
-
hash.each_with_object({}) do |(key, value), new_hash|
|
119
|
-
new_hash[key.is_a?(String) ? key.to_sym : key] = value
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
module Spud
|
2
|
-
module BuildTools
|
3
|
-
class Task
|
4
|
-
# @return [String]
|
5
|
-
attr_reader :name
|
6
|
-
# @return [String]
|
7
|
-
attr_reader :filename
|
8
|
-
# @return [Spud::TaskArgs]
|
9
|
-
attr_reader :args
|
10
|
-
|
11
|
-
# @return [void]
|
12
|
-
def self.mount!
|
13
|
-
raise NotImplementedError
|
14
|
-
end
|
15
|
-
|
16
|
-
# @param name [String]
|
17
|
-
# @param filename [String]
|
18
|
-
def initialize(name:, filename:)
|
19
|
-
@name = name
|
20
|
-
@filename = filename
|
21
|
-
|
22
|
-
Runtime.tasks[name.to_s] = self
|
23
|
-
end
|
24
|
-
|
25
|
-
# @param positional [Array]
|
26
|
-
# @param named [Hash]
|
27
|
-
# @return [Object]
|
28
|
-
def invoke(positional = [], named = {})
|
29
|
-
raise NotImplementedError
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
data/lib/spud/options.rb
DELETED
data/lib/spud/runtime.rb
DELETED
@@ -1,104 +0,0 @@
|
|
1
|
-
require 'spud/error'
|
2
|
-
require 'spud/help'
|
3
|
-
require 'spud/lister'
|
4
|
-
require 'spud/cli/parser'
|
5
|
-
require 'spud/build_tools/task'
|
6
|
-
require 'spud/build_tools/build_tools'
|
7
|
-
|
8
|
-
module Spud
|
9
|
-
module Runtime
|
10
|
-
class << self
|
11
|
-
def run!
|
12
|
-
if options.debug?
|
13
|
-
puts "options: #{options.inspect}"
|
14
|
-
puts "task: #{args.task}"
|
15
|
-
puts "positional: #{args.positional}"
|
16
|
-
puts "named: #{args.named}"
|
17
|
-
end
|
18
|
-
|
19
|
-
if options.help?
|
20
|
-
Spud::Help.print!
|
21
|
-
return
|
22
|
-
end
|
23
|
-
|
24
|
-
mount!
|
25
|
-
if options.files?
|
26
|
-
lister.list_filenames!
|
27
|
-
return
|
28
|
-
end
|
29
|
-
|
30
|
-
unless args.task
|
31
|
-
print_tasks!
|
32
|
-
return
|
33
|
-
end
|
34
|
-
|
35
|
-
invoke(args.task, args.positional, args.named)
|
36
|
-
rescue Error => error
|
37
|
-
puts error.message
|
38
|
-
raise error if options.debug?
|
39
|
-
rescue => error
|
40
|
-
puts "fatal: #{error.message}"
|
41
|
-
raise error if options.debug?
|
42
|
-
end
|
43
|
-
|
44
|
-
# @param task_name [String]
|
45
|
-
# @param positional [Array]
|
46
|
-
# @param named [Hash]
|
47
|
-
def invoke(task_name, positional = [], named = {})
|
48
|
-
task = tasks[task_name.to_s]
|
49
|
-
raise Error, "no task found for '#{task_name}'" unless task
|
50
|
-
task.invoke(positional, named)
|
51
|
-
end
|
52
|
-
|
53
|
-
# @return [Hash{String->Spud::Task}]
|
54
|
-
def tasks
|
55
|
-
@tasks ||= {}
|
56
|
-
end
|
57
|
-
|
58
|
-
private
|
59
|
-
|
60
|
-
# @return [Array<String>]
|
61
|
-
def filenames
|
62
|
-
@filenames ||= tasks.values.map(&:filename).uniq
|
63
|
-
end
|
64
|
-
|
65
|
-
# @return [void]
|
66
|
-
def mount!
|
67
|
-
build_tools.each(&:mount!)
|
68
|
-
tasks.keys.each do |key|
|
69
|
-
tasks[key.to_s] = tasks.delete(key) if key.is_a?(Symbol)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
# @return [Array<Spud::BuildTools::Task>]
|
74
|
-
def build_tools
|
75
|
-
@build_tools ||= begin
|
76
|
-
BuildTools::BUILD_TOOLS.each do |tool|
|
77
|
-
raise "build tool does not inherit from BuildTools::Task" unless tool < BuildTools::Task
|
78
|
-
end
|
79
|
-
|
80
|
-
BuildTools::BUILD_TOOLS.reverse
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
# @return [Spud::Options]
|
85
|
-
def options
|
86
|
-
args.options
|
87
|
-
end
|
88
|
-
|
89
|
-
# @return [Spud::CLI::Results]
|
90
|
-
def args
|
91
|
-
@args ||= Spud::CLI::Parser.parse!
|
92
|
-
end
|
93
|
-
|
94
|
-
# @return [void]
|
95
|
-
def print_tasks!
|
96
|
-
lister.list!
|
97
|
-
end
|
98
|
-
|
99
|
-
def lister
|
100
|
-
@lister ||= Lister.new(tasks.values)
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|