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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f3508c944aca0510946f7705ce2f1fb057632619f11182a872affe5bced27a8e
4
- data.tar.gz: 3f6c06be53831bad47cfcee5314982e1d2cd165078607b98b2f48b25a75ca2f6
3
+ metadata.gz: 28a274884358f6717d4e649d7ad01ea399317c89a02d2595576a15d35465b8de
4
+ data.tar.gz: 1866b4fc335245a0a86fb21ad60c875596af2cc545399aa22db440d34e51bbf3
5
5
  SHA512:
6
- metadata.gz: b4f6ed2d24030f329187f61475ccfebddf169cec0fdc7c17a8679de302747da7fe1ce74d8a4d92b000af8e50e3e927f103f00d445861e0e6b8cc8f85d8ff62b7
7
- data.tar.gz: 7a68fd902c3a6494fd2659edf642b924d10a240b59fa7b0780b42392bf69b0dd5f254872ced0490911870b7f49a2eda8f4451b4547140dca89214473c41e02a3
6
+ metadata.gz: b44fd607406fe417224470905701c9f37fbb616ebc207df2ad041650f3368c5d6a15d5cf07778641d72d47f9c6af1b3fca7c774f09660bff679f44e50a946ea9
7
+ data.tar.gz: e4e08a44cce308f92d7ff769ddf4f2ad4f75dfe8f4ca54643b4d84e9266cce9fbed191fd6e85710839440b8d85126b57dfaeadc881e17f412850f77432b46b51
@@ -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 {params(name: String, ordered: T::Array[String], named: T::Hash[T.any(String, Symbol), String]).void}
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
@@ -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
- system('make', name)
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
- until lines[cursor]&.empty?
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
- system("#{@command} run #{name}")
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
- # @return [Boolean]
21
+ sig {returns(T::Boolean)}
12
22
  def need_to_update?
13
23
  !up_to_date?
14
24
  end
15
25
 
16
- # @return [Boolean]
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?
@@ -43,6 +43,7 @@ module Spud
43
43
  name: Task.qualified_name(@__filename, name.to_s),
44
44
  filename: @__filename,
45
45
  dependencies: dependencies,
46
+ file_dsl: self,
46
47
  &block
47
48
  )
48
49
  end
@@ -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(SpudTaskRunner::TaskDSL)}
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: false
1
+ # typed: true
2
2
  require 'sorbet-runtime'
3
3
  require 'spud/error'
4
4
  require 'spud/driver'
5
- require 'spud/task_runners/spud_task_runner/shell/command'
6
- require 'spud/task_runners/spud_task_runner/shell/result'
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
- Shell::Command.(@__driver, command)
30
+ @__commander.(command)
24
31
  end
25
32
 
26
33
  sig {params(command: String).returns(Shell::Result)}
27
34
  def shh(command)
28
- Shell::Command.(@__driver, command)
35
+ @__commander.(command)
29
36
  end
30
37
 
31
38
  sig {params(command: String).returns(Shell::Result)}
32
39
  def shhh(command)
33
- Shell::Command.(@__driver, command, silent: true)
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 = Shell::Command.(@__driver, command)
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 = Shell::Command.(@__driver, command)
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 = Shell::Command.(@__driver, command, silent: true)
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
- def method_missing(symbol, *ordered, **named)
75
- task = symbol.to_s
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
@@ -1,4 +1,4 @@
1
1
  # typed: strict
2
2
  module Spud
3
- VERSION = '0.2.4'
3
+ VERSION = '0.2.5'
4
4
  end
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
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-22 00:00:00.000000000 Z
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