spud 0.2.4 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
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