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
@@ -0,0 +1,25 @@
|
|
1
|
+
# typed: strict
|
2
|
+
require 'sorbet-runtime'
|
3
|
+
require 'spud/task_runners/task'
|
4
|
+
require 'spud/task_runners/spud_task_runner/task'
|
5
|
+
require 'spud/task_runners/make/task'
|
6
|
+
require 'spud/task_runners/package.json/task'
|
7
|
+
|
8
|
+
module Spud
|
9
|
+
module TaskRunners
|
10
|
+
extend T::Sig
|
11
|
+
|
12
|
+
sig {returns(T::Array[T.class_of(Task)])}
|
13
|
+
def self.get
|
14
|
+
# Ordered by priority
|
15
|
+
T.let(
|
16
|
+
[
|
17
|
+
T.let(SpudTaskRunner::Task, T.class_of(Task)),
|
18
|
+
T.let(Make::Task, T.class_of(Task)),
|
19
|
+
T.let(PackageJSON::Task, T.class_of(Task)),
|
20
|
+
],
|
21
|
+
T::Array[T.class_of(Task)]
|
22
|
+
)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/spud/version.rb
CHANGED
data/lib/spud/watch.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
# typed: true
|
2
|
+
require 'sorbet-runtime'
|
3
|
+
require 'spud/driver'
|
4
|
+
|
5
|
+
module Spud
|
6
|
+
class Watch
|
7
|
+
extend T::Sig
|
8
|
+
|
9
|
+
sig do
|
10
|
+
params(
|
11
|
+
driver: Driver,
|
12
|
+
task: String,
|
13
|
+
ordered: T::Array[String],
|
14
|
+
named: T::Hash[String, String],
|
15
|
+
watches: T::Array[String],
|
16
|
+
).void
|
17
|
+
end
|
18
|
+
def self.run!(driver:, task:, ordered:, named:, watches:)
|
19
|
+
new(driver: driver, task: task, ordered: ordered, named: named, watches: watches).run!
|
20
|
+
end
|
21
|
+
|
22
|
+
sig do
|
23
|
+
params(
|
24
|
+
driver: Driver,
|
25
|
+
task: String,
|
26
|
+
ordered: T::Array[String],
|
27
|
+
named: T::Hash[String, String],
|
28
|
+
watches: T::Array[String],
|
29
|
+
).void
|
30
|
+
end
|
31
|
+
def initialize(driver:, task:, ordered:, named:, watches:)
|
32
|
+
@driver = driver
|
33
|
+
@task = task
|
34
|
+
@ordered = ordered
|
35
|
+
@named = named
|
36
|
+
@watches = watches
|
37
|
+
|
38
|
+
@last_changed = Time.at(0)
|
39
|
+
end
|
40
|
+
|
41
|
+
sig {void}
|
42
|
+
def run!
|
43
|
+
thread = T.let(nil, T.nilable(Thread))
|
44
|
+
|
45
|
+
loop do
|
46
|
+
if watches_changed?
|
47
|
+
thread&.kill
|
48
|
+
Process.kill('SIGKILL', T.must(@driver.subprocess_pid)) if @driver.subprocess_pid
|
49
|
+
|
50
|
+
@last_changed = latest_watch_change
|
51
|
+
thread = Thread.new { @driver.invoke(@task, @ordered, @named) }
|
52
|
+
end
|
53
|
+
|
54
|
+
sleep(0.1)
|
55
|
+
end
|
56
|
+
rescue Interrupt => error
|
57
|
+
puts "handled interrupt #{error}" if @driver.debug?
|
58
|
+
end
|
59
|
+
|
60
|
+
sig {returns(T::Boolean)}
|
61
|
+
def watches_changed?
|
62
|
+
@last_changed < latest_watch_change
|
63
|
+
end
|
64
|
+
|
65
|
+
sig {returns(Time)}
|
66
|
+
def latest_watch_change
|
67
|
+
T.unsafe(Dir)[*@watches]
|
68
|
+
.map(&File.method(:stat))
|
69
|
+
.map(&:mtime)
|
70
|
+
.max
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spud
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Booth
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-11-
|
11
|
+
date: 2020-11-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sorbet-runtime
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.5.6100
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.5.6100
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: rspec
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,7 +66,21 @@ dependencies:
|
|
52
66
|
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '11.0'
|
55
|
-
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: sorbet
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.5.6100
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.5.6100
|
83
|
+
description:
|
56
84
|
email: andrew@andrewbooth.xyz
|
57
85
|
executables:
|
58
86
|
- spud
|
@@ -61,31 +89,33 @@ extra_rdoc_files: []
|
|
61
89
|
files:
|
62
90
|
- bin/spud
|
63
91
|
- lib/spud.rb
|
64
|
-
- lib/spud/
|
65
|
-
- lib/spud/
|
66
|
-
- lib/spud/build_tools/package.json/task.rb
|
67
|
-
- lib/spud/build_tools/spud/block_param_info.rb
|
68
|
-
- lib/spud/build_tools/spud/dsl/file.rb
|
69
|
-
- lib/spud/build_tools/spud/dsl/task.rb
|
70
|
-
- lib/spud/build_tools/spud/shell/command.rb
|
71
|
-
- lib/spud/build_tools/spud/shell/result.rb
|
72
|
-
- lib/spud/build_tools/spud/task.rb
|
73
|
-
- lib/spud/build_tools/task.rb
|
92
|
+
- lib/spud/block_param_info.rb
|
93
|
+
- lib/spud/cli/options.rb
|
74
94
|
- lib/spud/cli/parser.rb
|
75
95
|
- lib/spud/cli/results.rb
|
96
|
+
- lib/spud/driver.rb
|
76
97
|
- lib/spud/error.rb
|
77
98
|
- lib/spud/help.rb
|
78
99
|
- lib/spud/lister.rb
|
79
|
-
- lib/spud/
|
80
|
-
- lib/spud/
|
100
|
+
- lib/spud/shell/command.rb
|
101
|
+
- lib/spud/shell/result.rb
|
81
102
|
- lib/spud/task_arg.rb
|
82
103
|
- lib/spud/task_args.rb
|
104
|
+
- lib/spud/task_runners/make/task.rb
|
105
|
+
- lib/spud/task_runners/package.json/task.rb
|
106
|
+
- lib/spud/task_runners/spud_task_runner/dependency.rb
|
107
|
+
- lib/spud/task_runners/spud_task_runner/file_dsl.rb
|
108
|
+
- lib/spud/task_runners/spud_task_runner/task.rb
|
109
|
+
- lib/spud/task_runners/spud_task_runner/task_dsl.rb
|
110
|
+
- lib/spud/task_runners/task.rb
|
111
|
+
- lib/spud/task_runners/task_runners.rb
|
83
112
|
- lib/spud/version.rb
|
113
|
+
- lib/spud/watch.rb
|
84
114
|
homepage: https://github.com/broothie/spud#readme
|
85
115
|
licenses:
|
86
116
|
- MIT
|
87
117
|
metadata: {}
|
88
|
-
post_install_message:
|
118
|
+
post_install_message:
|
89
119
|
rdoc_options: []
|
90
120
|
require_paths:
|
91
121
|
- lib
|
@@ -93,15 +123,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
93
123
|
requirements:
|
94
124
|
- - ">="
|
95
125
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
126
|
+
version: 2.3.0
|
97
127
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
128
|
requirements:
|
99
129
|
- - ">="
|
100
130
|
- !ruby/object:Gem::Version
|
101
131
|
version: '0'
|
102
132
|
requirements: []
|
103
|
-
|
104
|
-
|
133
|
+
rubyforge_project:
|
134
|
+
rubygems_version: 2.5.1
|
135
|
+
signing_key:
|
105
136
|
specification_version: 4
|
106
137
|
summary: Spud is a task runner, in the form of a ruby DSL.
|
107
138
|
test_files: []
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'spud/build_tools/task'
|
2
|
-
|
3
|
-
module Spud
|
4
|
-
module BuildTools
|
5
|
-
module Make
|
6
|
-
class Task < BuildTools::Task
|
7
|
-
def self.mount!
|
8
|
-
return unless File.exist?('Makefile')
|
9
|
-
|
10
|
-
if `command -v make`.empty?
|
11
|
-
puts 'Makefile detected, but no installation of `make` exists. Skipping make...'
|
12
|
-
return
|
13
|
-
end
|
14
|
-
|
15
|
-
source = File.read('Makefile')
|
16
|
-
source.scan(/^(\S+):.*/).map(&:first).each do |name|
|
17
|
-
new(name: name, filename: 'Makefile')
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def invoke(*)
|
22
|
-
system('make', name)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
require 'spud/build_tools/task'
|
3
|
-
|
4
|
-
module Spud
|
5
|
-
module BuildTools
|
6
|
-
module PackageJSON
|
7
|
-
class Task < BuildTools::Task
|
8
|
-
def self.mount!
|
9
|
-
return unless File.exist?('package.json')
|
10
|
-
|
11
|
-
opening_commands = %w[npm run]
|
12
|
-
if File.exist?('package.lock')
|
13
|
-
if `command -v npm`.empty?
|
14
|
-
puts 'package.json detected, but no installation of `npm` exists. Skipping npm...'
|
15
|
-
return
|
16
|
-
end
|
17
|
-
elsif File.exist?('yarn.lock')
|
18
|
-
if `command -v yarn`.empty?
|
19
|
-
puts 'package.json detected, but no installation of `yarn` exists. Skipping yarn...'
|
20
|
-
return
|
21
|
-
else
|
22
|
-
opening_commands = %w[yarn run]
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
source = File.read('package.json')
|
27
|
-
json = JSON.parse(source)
|
28
|
-
scripts = json['scripts']
|
29
|
-
return unless scripts
|
30
|
-
|
31
|
-
scripts.keys.each do |name|
|
32
|
-
new(name: name, filename: 'package.json', opening_commands: opening_commands)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def initialize(name:, filename:, opening_commands:)
|
37
|
-
super(name: name, filename: filename)
|
38
|
-
@opening_commands = opening_commands
|
39
|
-
end
|
40
|
-
|
41
|
-
def invoke(*)
|
42
|
-
system(*(@opening_commands + [name]))
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,77 +0,0 @@
|
|
1
|
-
require 'spud/task_arg'
|
2
|
-
|
3
|
-
module Spud
|
4
|
-
module BuildTools
|
5
|
-
module Spud
|
6
|
-
class BlockParamInfo
|
7
|
-
# @param filename [String]
|
8
|
-
# @param block [Proc]
|
9
|
-
def initialize(filename, &block)
|
10
|
-
@filename = filename
|
11
|
-
@block = block
|
12
|
-
end
|
13
|
-
|
14
|
-
# @return [Array<Spud::TaskArg>]
|
15
|
-
def task_args
|
16
|
-
parameters.map do |type, name|
|
17
|
-
case type
|
18
|
-
when :req
|
19
|
-
TaskArg.new(name, 'positional')
|
20
|
-
when :opt
|
21
|
-
TaskArg.new(name, 'positional', default: arg_values[name])
|
22
|
-
when :keyreq
|
23
|
-
TaskArg.new(name, 'named')
|
24
|
-
when :key
|
25
|
-
TaskArg.new(name, 'named', default: arg_values[name])
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# @return [Array]
|
31
|
-
def dummy_args
|
32
|
-
[dummy_positional_args, dummy_named_args]
|
33
|
-
end
|
34
|
-
|
35
|
-
# @return [Array<NilClass>]
|
36
|
-
def dummy_positional_args
|
37
|
-
Array.new(parameters.count { |p| p.first == :req })
|
38
|
-
end
|
39
|
-
|
40
|
-
# @return [Hash{Symbol->NilClass}]
|
41
|
-
def dummy_named_args
|
42
|
-
parameters.select { |p| p.first == :keyreq }.map(&:last).each_with_object({}) { |n, h| h[n] = nil }
|
43
|
-
end
|
44
|
-
|
45
|
-
# @return [String]
|
46
|
-
def arg_hash_string
|
47
|
-
"{ #{parameters.map(&:last).map { |n| "#{n}: #{n}" }.join(', ')} }"
|
48
|
-
end
|
49
|
-
|
50
|
-
# @return [Hash]
|
51
|
-
def arg_values
|
52
|
-
@arg_values ||= begin
|
53
|
-
positional, named = dummy_args
|
54
|
-
lambda(arg_hash_string).call(*positional, **named)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
# @return [Array<Array<Symbol>>]
|
59
|
-
def parameters
|
60
|
-
@parameters ||= lambda.parameters
|
61
|
-
end
|
62
|
-
|
63
|
-
# @return [Proc]
|
64
|
-
def lambda(body = nil)
|
65
|
-
line = File.read(@filename).split("\n")[@block.source_location.last - 1]
|
66
|
-
|
67
|
-
match = /(do|{)\s*\|(?<params>[^|]+)\|/.match(line)
|
68
|
-
return -> {} unless match
|
69
|
-
|
70
|
-
param_source = match[:params]
|
71
|
-
param_source += ', _: nil, __: nil, ___: nil' if body
|
72
|
-
eval "-> (#{param_source}) { #{body} }"
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'spud/build_tools/spud/task'
|
2
|
-
|
3
|
-
module Spud
|
4
|
-
module BuildTools
|
5
|
-
module Spud
|
6
|
-
module DSL
|
7
|
-
class File
|
8
|
-
def require_relative(name)
|
9
|
-
require("./#{name}")
|
10
|
-
end
|
11
|
-
|
12
|
-
def task(name, *, &block)
|
13
|
-
BuildTools::Spud::Task.add_task(name, &block)
|
14
|
-
end
|
15
|
-
|
16
|
-
def method_missing(name, *args, &block)
|
17
|
-
task(name, *args, &block)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
require 'spud/error'
|
2
|
-
require 'spud/build_tools/spud/task'
|
3
|
-
require 'spud/build_tools/spud/shell/command'
|
4
|
-
|
5
|
-
module Spud
|
6
|
-
module BuildTools
|
7
|
-
module Spud
|
8
|
-
module DSL
|
9
|
-
class Task
|
10
|
-
def initialize(filename)
|
11
|
-
@filename = filename
|
12
|
-
end
|
13
|
-
|
14
|
-
def sh(command)
|
15
|
-
puts command
|
16
|
-
Shell::Command.(command)
|
17
|
-
end
|
18
|
-
|
19
|
-
def shh(command)
|
20
|
-
Shell::Command.(command)
|
21
|
-
end
|
22
|
-
|
23
|
-
def shhh(command)
|
24
|
-
Shell::Command.(command, silent: true)
|
25
|
-
end
|
26
|
-
|
27
|
-
def sh!(command)
|
28
|
-
puts command
|
29
|
-
result = Shell::Command.(command)
|
30
|
-
raise Error, "sh failed for '#{command}'" unless result.success?
|
31
|
-
result
|
32
|
-
end
|
33
|
-
|
34
|
-
def shh!(command)
|
35
|
-
result = Shell::Command.(command)
|
36
|
-
raise Error, "sh failed for '#{command}'" unless result.success?
|
37
|
-
result
|
38
|
-
end
|
39
|
-
|
40
|
-
def shhh!(command)
|
41
|
-
result = Shell::Command.(command, silent: true)
|
42
|
-
raise Error, "sh failed for '#{command}'" unless result.success?
|
43
|
-
result
|
44
|
-
end
|
45
|
-
|
46
|
-
def invoke(task, *positional, **named)
|
47
|
-
Spud::Task.invoke(@filename, task, positional, named)
|
48
|
-
rescue Error => error
|
49
|
-
puts "invoke failed for '#{task}': #{error}"
|
50
|
-
end
|
51
|
-
|
52
|
-
def invoke!(task, *positional, **named)
|
53
|
-
Spud::Task.invoke(@filename, task, positional, named)
|
54
|
-
end
|
55
|
-
|
56
|
-
def method_missing(symbol, *positional, **named)
|
57
|
-
Spud::Task.task_for(@filename, symbol) ? Spud::Task.invoke(@filename, symbol, positional, named) : super
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|