spud 0.2.4 → 0.2.5
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/driver.rb +3 -2
- data/lib/spud/shell/command.rb +75 -0
- data/lib/spud/shell/result.rb +33 -0
- data/lib/spud/task_arg.rb +9 -0
- data/lib/spud/task_runners/make/task.rb +3 -2
- data/lib/spud/task_runners/package.json/task.rb +2 -1
- data/lib/spud/task_runners/spud_task_runner/dependency.rb +12 -2
- data/lib/spud/task_runners/spud_task_runner/file_dsl.rb +1 -0
- data/lib/spud/task_runners/spud_task_runner/task.rb +8 -3
- data/lib/spud/task_runners/spud_task_runner/task_dsl.rb +21 -13
- data/lib/spud/task_runners/task.rb +1 -4
- data/lib/spud/version.rb +1 -1
- metadata +4 -4
- data/lib/spud/task_runners/spud_task_runner/shell/command.rb +0 -58
- data/lib/spud/task_runners/spud_task_runner/shell/result.rb +0 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 28a274884358f6717d4e649d7ad01ea399317c89a02d2595576a15d35465b8de
|
4
|
+
data.tar.gz: 1866b4fc335245a0a86fb21ad60c875596af2cc545399aa22db440d34e51bbf3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b44fd607406fe417224470905701c9f37fbb616ebc207df2ad041650f3368c5d6a15d5cf07778641d72d47f9c6af1b3fca7c774f09660bff679f44e50a946ea9
|
7
|
+
data.tar.gz: e4e08a44cce308f92d7ff769ddf4f2ad4f75dfe8f4ca54643b4d84e9266cce9fbed191fd6e85710839440b8d85126b57dfaeadc881e17f412850f77432b46b51
|
data/lib/spud/driver.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
# typed: true
|
2
|
-
require 'sorbet-runtime'
|
3
2
|
require 'spud/error'
|
4
3
|
require 'spud/help'
|
5
4
|
require 'spud/lister'
|
@@ -66,7 +65,9 @@ module Spud
|
|
66
65
|
raise error if debug?
|
67
66
|
end
|
68
67
|
|
69
|
-
sig
|
68
|
+
sig do
|
69
|
+
params(name: String, ordered: T::Array[String], named: T::Hash[T.any(String, Symbol), String]).returns(T.untyped)
|
70
|
+
end
|
70
71
|
def invoke(name, ordered, named)
|
71
72
|
get_task(name).invoke(ordered, stringify_keys(named))
|
72
73
|
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# typed: true
|
2
|
+
require 'sorbet-runtime'
|
3
|
+
require 'stringio'
|
4
|
+
require 'open3'
|
5
|
+
require 'spud/driver'
|
6
|
+
require 'spud/shell/result'
|
7
|
+
|
8
|
+
module Spud
|
9
|
+
module Shell
|
10
|
+
class Command
|
11
|
+
extend T::Sig
|
12
|
+
|
13
|
+
attr_reader :result
|
14
|
+
|
15
|
+
Handle = T.type_alias {T.any(IO, StringIO)}
|
16
|
+
|
17
|
+
sig {params(command: String, driver: T.nilable(Driver), silent: T::Boolean, handle: Handle).returns(Result)}
|
18
|
+
def self.call(command, driver: nil, silent: false, handle: STDOUT)
|
19
|
+
cmd = new(command, driver: driver, silent: silent, handle: handle)
|
20
|
+
cmd.issue!
|
21
|
+
cmd.result
|
22
|
+
end
|
23
|
+
|
24
|
+
sig {params(driver: Driver).returns(Commander)}
|
25
|
+
def self.commander(driver)
|
26
|
+
Commander.new(driver)
|
27
|
+
end
|
28
|
+
|
29
|
+
sig {params(command: String, driver: T.nilable(Driver), silent: T::Boolean, handle: Handle).void}
|
30
|
+
def initialize(command, driver: nil, silent: false, handle: STDOUT)
|
31
|
+
@command = command
|
32
|
+
@driver = driver
|
33
|
+
@silent = silent
|
34
|
+
@handle = handle
|
35
|
+
|
36
|
+
@result = T.let(nil, T.nilable(Result))
|
37
|
+
end
|
38
|
+
|
39
|
+
sig {void}
|
40
|
+
def issue!
|
41
|
+
capturer = StringIO.new
|
42
|
+
|
43
|
+
Open3.popen2e(@command) do |_, out, thread|
|
44
|
+
@driver&.register_subprocess(thread.pid)
|
45
|
+
|
46
|
+
loop do
|
47
|
+
line = out.gets
|
48
|
+
break unless line
|
49
|
+
|
50
|
+
@handle.write line unless @silent
|
51
|
+
capturer.puts line
|
52
|
+
end
|
53
|
+
|
54
|
+
@result = Result.new(capturer.string, T.cast(thread.value, Process::Status))
|
55
|
+
end
|
56
|
+
|
57
|
+
@driver&.register_subprocess(nil)
|
58
|
+
end
|
59
|
+
|
60
|
+
class Commander
|
61
|
+
extend T::Sig
|
62
|
+
|
63
|
+
sig {params(driver: Driver).void}
|
64
|
+
def initialize(driver)
|
65
|
+
@driver = driver
|
66
|
+
end
|
67
|
+
|
68
|
+
sig {params(command: String, silent: T::Boolean, handle: Handle).returns(Result)}
|
69
|
+
def call(command, silent: false, handle: STDOUT)
|
70
|
+
Command.(command, driver: @driver, silent: silent, handle: handle)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# typed: strict
|
2
|
+
require 'sorbet-runtime'
|
3
|
+
require 'forwardable'
|
4
|
+
|
5
|
+
module Spud
|
6
|
+
module Shell
|
7
|
+
class Result < String
|
8
|
+
extend T::Sig
|
9
|
+
extend Forwardable
|
10
|
+
|
11
|
+
sig {returns(Process::Status)}
|
12
|
+
attr_reader :status
|
13
|
+
|
14
|
+
def_delegators :status,
|
15
|
+
:coredump?,
|
16
|
+
:exited?,
|
17
|
+
:exitstatus,
|
18
|
+
:pid,
|
19
|
+
:signaled?,
|
20
|
+
:stopped?,
|
21
|
+
:stopsig,
|
22
|
+
:success?,
|
23
|
+
:termsig,
|
24
|
+
:to_i
|
25
|
+
|
26
|
+
sig {params(output: String, status: Process::Status).void}
|
27
|
+
def initialize(output, status)
|
28
|
+
super(output)
|
29
|
+
@status = status
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/spud/task_arg.rb
CHANGED
@@ -5,6 +5,15 @@ module Spud
|
|
5
5
|
class TaskArg
|
6
6
|
extend T::Sig
|
7
7
|
|
8
|
+
sig {returns(String)}
|
9
|
+
attr_reader :name
|
10
|
+
|
11
|
+
sig {returns(String)}
|
12
|
+
attr_reader :type
|
13
|
+
|
14
|
+
sig {returns(T.nilable(String))}
|
15
|
+
attr_reader :default
|
16
|
+
|
8
17
|
sig {params(name: String, type: String, default: T.nilable(String)).void}
|
9
18
|
def initialize(name, type, default: nil)
|
10
19
|
raise 'must be of type "ordered" or "named"' unless %w[ordered named].include?(type)
|
@@ -2,6 +2,7 @@
|
|
2
2
|
require 'sorbet-runtime'
|
3
3
|
require 'stringio'
|
4
4
|
require 'spud/driver'
|
5
|
+
require 'spud/shell/command'
|
5
6
|
require 'spud/task_runners/task'
|
6
7
|
|
7
8
|
module Spud
|
@@ -36,7 +37,7 @@ module Spud
|
|
36
37
|
|
37
38
|
sig {override.params(ordered: T::Array[String], named: T::Hash[String, String]).returns(T.untyped)}
|
38
39
|
def invoke(ordered, named)
|
39
|
-
|
40
|
+
Shell::Command.("make #{name}", driver: @driver)
|
40
41
|
end
|
41
42
|
|
42
43
|
sig {override.returns(String)}
|
@@ -53,7 +54,7 @@ module Spud
|
|
53
54
|
cursor += 1 until lines[cursor]&.start_with?(name)
|
54
55
|
|
55
56
|
builder = StringIO.new
|
56
|
-
|
57
|
+
while lines[cursor] && !lines[cursor]&.empty?
|
57
58
|
builder.puts lines[cursor]
|
58
59
|
cursor += 1
|
59
60
|
end
|
@@ -3,6 +3,7 @@ require 'sorbet-runtime'
|
|
3
3
|
require 'json'
|
4
4
|
require 'spud/driver'
|
5
5
|
require 'spud/task_args'
|
6
|
+
require 'spud/shell/command'
|
6
7
|
require 'spud/task_runners/task'
|
7
8
|
|
8
9
|
module Spud
|
@@ -52,7 +53,7 @@ module Spud
|
|
52
53
|
|
53
54
|
sig {override.params(ordered: T::Array[String], named: T::Hash[String, String]).returns(T.untyped)}
|
54
55
|
def invoke(ordered, named)
|
55
|
-
|
56
|
+
Shell::Command.("#{@command} run #{name}", driver: @driver)
|
56
57
|
end
|
57
58
|
|
58
59
|
sig {override.returns(String)}
|
@@ -1,19 +1,29 @@
|
|
1
1
|
# typed: true
|
2
|
+
|
2
3
|
module Spud
|
3
4
|
module TaskRunners
|
4
5
|
module SpudTaskRunner
|
5
6
|
class Dependency
|
7
|
+
extend T::Sig
|
8
|
+
|
9
|
+
sig {returns(T::Array[String])}
|
10
|
+
attr_reader :sources
|
11
|
+
|
12
|
+
sig {returns(T::Array[String])}
|
13
|
+
attr_reader :targets
|
14
|
+
|
15
|
+
sig {params(source: T.any(String, T::Array[String]), target: T.any(String, T::Array[String])).void}
|
6
16
|
def initialize(source, target)
|
7
17
|
@sources = [source].flatten
|
8
18
|
@targets = [target].flatten
|
9
19
|
end
|
10
20
|
|
11
|
-
|
21
|
+
sig {returns(T::Boolean)}
|
12
22
|
def need_to_update?
|
13
23
|
!up_to_date?
|
14
24
|
end
|
15
25
|
|
16
|
-
|
26
|
+
sig {returns(T::Boolean)}
|
17
27
|
def up_to_date?
|
18
28
|
source_filenames = Dir[*@sources]
|
19
29
|
return true if source_filenames.empty?
|
@@ -22,6 +22,9 @@ module Spud
|
|
22
22
|
sig {override.returns(String)}
|
23
23
|
attr_reader :name
|
24
24
|
|
25
|
+
sig {returns(T::Array[Dependency])}
|
26
|
+
attr_reader :dependencies
|
27
|
+
|
25
28
|
sig {override.params(driver: Driver).returns(T::Array[TaskRunners::Task])}
|
26
29
|
def self.tasks(driver)
|
27
30
|
Dir['**/Spudfile', '**/*.spud'].flat_map { |filename| FileDSL.run(driver, filename) }
|
@@ -46,15 +49,17 @@ module Spud
|
|
46
49
|
name: String,
|
47
50
|
filename: String,
|
48
51
|
dependencies: T::Hash[T.any(String, T::Array[String]), T.any(String, T::Array[String])],
|
52
|
+
file_dsl: FileDSL,
|
49
53
|
block: Proc,
|
50
54
|
)
|
51
55
|
.void
|
52
56
|
end
|
53
|
-
def initialize(driver:, name:, filename:, dependencies:, &block)
|
57
|
+
def initialize(driver:, name:, filename:, dependencies:, file_dsl:, &block)
|
54
58
|
@driver = driver
|
55
59
|
@name = name
|
56
60
|
@filename = filename
|
57
61
|
@dependencies = dependencies.map { |to, from| Dependency.new(to, from) }
|
62
|
+
@file_dsl = file_dsl
|
58
63
|
@block = block
|
59
64
|
end
|
60
65
|
|
@@ -128,9 +133,9 @@ module Spud
|
|
128
133
|
@dependencies.all?(&:up_to_date?)
|
129
134
|
end
|
130
135
|
|
131
|
-
sig {returns(
|
136
|
+
sig {returns(TaskDSL)}
|
132
137
|
def task_dsl
|
133
|
-
@task_dsl ||= TaskDSL.new(@driver, @filename)
|
138
|
+
@task_dsl ||= TaskDSL.new(@driver, @filename, @file_dsl)
|
134
139
|
end
|
135
140
|
|
136
141
|
sig {params(hash: T::Hash[T.any(String, Symbol), T.untyped]).returns(T::Hash[Symbol, T.untyped])}
|
@@ -1,9 +1,10 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: true
|
2
2
|
require 'sorbet-runtime'
|
3
3
|
require 'spud/error'
|
4
4
|
require 'spud/driver'
|
5
|
-
require 'spud/
|
6
|
-
require 'spud/
|
5
|
+
require 'spud/shell/command'
|
6
|
+
require 'spud/shell/result'
|
7
|
+
require 'spud/task_runners/spud_task_runner/file_dsl'
|
7
8
|
|
8
9
|
module Spud
|
9
10
|
module TaskRunners
|
@@ -11,46 +12,52 @@ module Spud
|
|
11
12
|
class TaskDSL
|
12
13
|
extend T::Sig
|
13
14
|
|
14
|
-
sig {params(driver: Driver, filename: String).void}
|
15
|
-
def initialize(driver, filename)
|
15
|
+
sig {params(driver: Driver, filename: String, file_dsl: FileDSL).void}
|
16
|
+
def initialize(driver, filename, file_dsl)
|
16
17
|
@__filename = filename
|
17
18
|
@__driver = driver
|
19
|
+
|
20
|
+
@__commander = Shell::Command.commander(driver)
|
21
|
+
|
22
|
+
file_dsl.singleton_methods.each do |method|
|
23
|
+
define_singleton_method(method, &file_dsl.singleton_method(method))
|
24
|
+
end
|
18
25
|
end
|
19
26
|
|
20
27
|
sig {params(command: String).returns(Shell::Result)}
|
21
28
|
def sh(command)
|
22
29
|
puts command
|
23
|
-
|
30
|
+
@__commander.(command)
|
24
31
|
end
|
25
32
|
|
26
33
|
sig {params(command: String).returns(Shell::Result)}
|
27
34
|
def shh(command)
|
28
|
-
|
35
|
+
@__commander.(command)
|
29
36
|
end
|
30
37
|
|
31
38
|
sig {params(command: String).returns(Shell::Result)}
|
32
39
|
def shhh(command)
|
33
|
-
|
40
|
+
@__commander.(command, silent: true)
|
34
41
|
end
|
35
42
|
|
36
43
|
sig {params(command: String).returns(Shell::Result)}
|
37
44
|
def sh!(command)
|
38
45
|
puts command
|
39
|
-
result =
|
46
|
+
result = @__commander.(command)
|
40
47
|
raise Error, "sh failed for '#{command}'" unless result.success?
|
41
48
|
result
|
42
49
|
end
|
43
50
|
|
44
51
|
sig {params(command: String).returns(Shell::Result)}
|
45
52
|
def shh!(command)
|
46
|
-
result =
|
53
|
+
result = @__commander.(command)
|
47
54
|
raise Error, "sh failed for '#{command}'" unless result.success?
|
48
55
|
result
|
49
56
|
end
|
50
57
|
|
51
58
|
sig {params(command: String).returns(Shell::Result)}
|
52
59
|
def shhh!(command)
|
53
|
-
result =
|
60
|
+
result = @__commander.(command, silent: true)
|
54
61
|
raise Error, "sh failed for '#{command}'" unless result.success?
|
55
62
|
result
|
56
63
|
end
|
@@ -71,8 +78,9 @@ module Spud
|
|
71
78
|
@__driver.invoke(task, ordered, named)
|
72
79
|
end
|
73
80
|
|
74
|
-
|
75
|
-
|
81
|
+
sig {params(task: Symbol, ordered: String, named: String).returns(T.untyped)}
|
82
|
+
def method_missing(task, *ordered, **named)
|
83
|
+
task = task.to_s
|
76
84
|
task = task.include?('.') ? task : Task.qualified_name(@__filename, task)
|
77
85
|
@__driver.invoke(task, ordered, named)
|
78
86
|
end
|
@@ -21,10 +21,7 @@ module Spud
|
|
21
21
|
|
22
22
|
sig do
|
23
23
|
abstract
|
24
|
-
.params(
|
25
|
-
ordered: T::Array[String],
|
26
|
-
named: T::Hash[String, String],
|
27
|
-
)
|
24
|
+
.params(ordered: T::Array[String], named: T::Hash[String, String])
|
28
25
|
.returns(T.untyped)
|
29
26
|
end
|
30
27
|
def invoke(ordered, named); end
|
data/lib/spud/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Booth
|
8
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
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -97,14 +97,14 @@ files:
|
|
97
97
|
- lib/spud/error.rb
|
98
98
|
- lib/spud/help.rb
|
99
99
|
- lib/spud/lister.rb
|
100
|
+
- lib/spud/shell/command.rb
|
101
|
+
- lib/spud/shell/result.rb
|
100
102
|
- lib/spud/task_arg.rb
|
101
103
|
- lib/spud/task_args.rb
|
102
104
|
- lib/spud/task_runners/make/task.rb
|
103
105
|
- lib/spud/task_runners/package.json/task.rb
|
104
106
|
- lib/spud/task_runners/spud_task_runner/dependency.rb
|
105
107
|
- lib/spud/task_runners/spud_task_runner/file_dsl.rb
|
106
|
-
- lib/spud/task_runners/spud_task_runner/shell/command.rb
|
107
|
-
- lib/spud/task_runners/spud_task_runner/shell/result.rb
|
108
108
|
- lib/spud/task_runners/spud_task_runner/task.rb
|
109
109
|
- lib/spud/task_runners/spud_task_runner/task_dsl.rb
|
110
110
|
- lib/spud/task_runners/task.rb
|
@@ -1,58 +0,0 @@
|
|
1
|
-
# typed: true
|
2
|
-
require 'sorbet-runtime'
|
3
|
-
require 'stringio'
|
4
|
-
require 'open3'
|
5
|
-
require 'spud/driver'
|
6
|
-
require 'spud/task_runners/spud_task_runner/shell/result'
|
7
|
-
|
8
|
-
module Spud
|
9
|
-
module TaskRunners
|
10
|
-
module SpudTaskRunner
|
11
|
-
module Shell
|
12
|
-
class Command
|
13
|
-
extend T::Sig
|
14
|
-
|
15
|
-
attr_reader :result
|
16
|
-
|
17
|
-
sig {params(driver: Driver, command: String, silent: T::Boolean, handle: T.any(IO, StringIO)).returns(Result)}
|
18
|
-
def self.call(driver, command, silent: false, handle: STDOUT)
|
19
|
-
cmd = new(driver, command, silent: silent, handle: handle)
|
20
|
-
cmd.issue!
|
21
|
-
cmd.result
|
22
|
-
end
|
23
|
-
|
24
|
-
sig {params(driver: Driver, command: String, silent: T::Boolean, handle: T.any(IO, StringIO)).void}
|
25
|
-
def initialize(driver, command, silent: false, handle: STDOUT)
|
26
|
-
@command = command
|
27
|
-
@driver = driver
|
28
|
-
@silent = silent
|
29
|
-
@handle = handle
|
30
|
-
|
31
|
-
@result = T.let(nil, T.nilable(Result))
|
32
|
-
end
|
33
|
-
|
34
|
-
sig {void}
|
35
|
-
def issue!
|
36
|
-
capturer = StringIO.new
|
37
|
-
|
38
|
-
Open3.popen2e(@command) do |_stdin, stdout, thread|
|
39
|
-
@driver.register_subprocess(thread.pid)
|
40
|
-
|
41
|
-
loop do
|
42
|
-
line = stdout.gets
|
43
|
-
break unless line
|
44
|
-
|
45
|
-
@handle.write line unless @silent
|
46
|
-
capturer.puts line
|
47
|
-
end
|
48
|
-
|
49
|
-
@result = Result.new(capturer.string, T.cast(thread.value, Process::Status))
|
50
|
-
end
|
51
|
-
|
52
|
-
@driver.register_subprocess(nil)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# typed: false
|
2
|
-
require 'sorbet-runtime'
|
3
|
-
|
4
|
-
module Spud
|
5
|
-
module TaskRunners
|
6
|
-
module SpudTaskRunner
|
7
|
-
module Shell
|
8
|
-
class Result < String
|
9
|
-
extend T::Sig
|
10
|
-
|
11
|
-
sig {returns(Process::Status)}
|
12
|
-
attr_reader :status
|
13
|
-
|
14
|
-
sig {params(output: String, status: Process::Status).void}
|
15
|
-
def initialize(output, status)
|
16
|
-
super(output)
|
17
|
-
@status = status
|
18
|
-
end
|
19
|
-
|
20
|
-
def method_missing(symbol, *args)
|
21
|
-
status.respond_to?(symbol) ? status.send(symbol, *args) : super
|
22
|
-
end
|
23
|
-
|
24
|
-
def respond_to_missing?(symbol, *)
|
25
|
-
status.respond_to?(symbol) || super
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|