spud 0.2.1 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +5 -5
  2. data/lib/spud.rb +3 -2
  3. data/lib/spud/block_param_info.rb +80 -0
  4. data/lib/spud/cli/options.rb +35 -0
  5. data/lib/spud/cli/parser.rb +23 -19
  6. data/lib/spud/cli/results.rb +18 -11
  7. data/lib/spud/driver.rb +136 -0
  8. data/lib/spud/error.rb +6 -1
  9. data/lib/spud/help.rb +17 -14
  10. data/lib/spud/lister.rb +27 -22
  11. data/lib/spud/shell/command.rb +75 -0
  12. data/lib/spud/shell/result.rb +33 -0
  13. data/lib/spud/task_arg.rb +24 -12
  14. data/lib/spud/task_args.rb +20 -18
  15. data/lib/spud/task_runners/make/task.rb +67 -0
  16. data/lib/spud/task_runners/package.json/task.rb +71 -0
  17. data/lib/spud/task_runners/spud_task_runner/dependency.rb +50 -0
  18. data/lib/spud/task_runners/spud_task_runner/file_dsl.rb +57 -0
  19. data/lib/spud/task_runners/spud_task_runner/task.rb +149 -0
  20. data/lib/spud/task_runners/spud_task_runner/task_dsl.rb +95 -0
  21. data/lib/spud/task_runners/task.rb +40 -0
  22. data/lib/spud/task_runners/task_runners.rb +25 -0
  23. data/lib/spud/version.rb +2 -1
  24. data/lib/spud/watch.rb +73 -0
  25. metadata +51 -20
  26. data/lib/spud/build_tools/build_tools.rb +0 -13
  27. data/lib/spud/build_tools/make/task.rb +0 -27
  28. data/lib/spud/build_tools/package.json/task.rb +0 -47
  29. data/lib/spud/build_tools/spud/block_param_info.rb +0 -77
  30. data/lib/spud/build_tools/spud/dsl/file.rb +0 -23
  31. data/lib/spud/build_tools/spud/dsl/task.rb +0 -63
  32. data/lib/spud/build_tools/spud/shell/command.rb +0 -52
  33. data/lib/spud/build_tools/spud/shell/result.rb +0 -26
  34. data/lib/spud/build_tools/spud/task.rb +0 -125
  35. data/lib/spud/build_tools/task.rb +0 -33
  36. data/lib/spud/options.rb +0 -14
  37. 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
@@ -1,3 +1,4 @@
1
+ # typed: strict
1
2
  module Spud
2
- VERSION = '0.2.1'
3
+ VERSION = '0.2.6'
3
4
  end
@@ -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.1
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-18 00:00:00.000000000 Z
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
- description:
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/build_tools/build_tools.rb
65
- - lib/spud/build_tools/make/task.rb
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/options.rb
80
- - lib/spud/runtime.rb
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: '0'
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
- rubygems_version: 3.1.3
104
- signing_key:
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,13 +0,0 @@
1
- require 'spud/build_tools/spud/task'
2
- require 'spud/build_tools/make/task'
3
- require 'spud/build_tools/package.json/task'
4
-
5
- module Spud
6
- module BuildTools
7
- BUILD_TOOLS = [
8
- Spud::Task,
9
- Make::Task,
10
- PackageJSON::Task,
11
- ]
12
- end
13
- end
@@ -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