spud 0.2.0 → 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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  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 +135 -0
  8. data/lib/spud/error.rb +1 -0
  9. data/lib/spud/help.rb +13 -13
  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 +49 -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 +148 -0
  20. data/lib/spud/task_runners/spud_task_runner/task_dsl.rb +90 -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 +46 -16
  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
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.0
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-18 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
@@ -52,6 +52,34 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '11.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: sorbet
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.5.6100
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.5.6100
69
+ - !ruby/object:Gem::Dependency
70
+ name: sorbet-runtime
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
55
83
  description:
56
84
  email: andrew@andrewbooth.xyz
57
85
  executables:
@@ -61,26 +89,28 @@ 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
@@ -91,9 +121,9 @@ require_paths:
91
121
  - lib
92
122
  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
  - - ">="
@@ -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
@@ -1,52 +0,0 @@
1
- require 'stringio'
2
- require 'open3'
3
- require 'spud/build_tools/spud/shell/result'
4
-
5
- module Spud
6
- module BuildTools
7
- module Spud
8
- module Shell
9
- class Command
10
- attr_reader :result
11
-
12
- # @param command [String]
13
- # @param silent [Boolean]
14
- # @param handle [IO]
15
- def self.call(command, silent: false, handle: STDOUT)
16
- cmd = new(command, silent: silent, handle: handle)
17
- cmd.issue!
18
- cmd.result
19
- end
20
-
21
- # @param command [String]
22
- # @param silent [Boolean]
23
- # @param handle [IO]
24
- def initialize(command, silent: false, handle: STDOUT)
25
- @command = command
26
- @silent = silent
27
- @handle = handle
28
-
29
- @result = nil
30
- end
31
-
32
- # @return [void]
33
- def issue!
34
- capturer = StringIO.new
35
-
36
- Open3.popen2e(@command) do |_stdin, stdout, thread|
37
- loop do
38
- line = stdout.gets
39
- break unless line
40
-
41
- @handle.write line unless @silent
42
- capturer.puts line
43
- end
44
-
45
- @result = Result.new(capturer.string, thread.value)
46
- end
47
- end
48
- end
49
- end
50
- end
51
- end
52
- end
@@ -1,26 +0,0 @@
1
- module Spud
2
- module BuildTools
3
- module Spud
4
- module Shell
5
- class Result < String
6
- attr_reader :status
7
-
8
- # @param output [String]
9
- # @param status [Process::Status]
10
- def initialize(output, status)
11
- super(output)
12
- @status = status
13
- end
14
-
15
- def method_missing(symbol, *args)
16
- status.respond_to?(symbol) ? status.send(symbol, *args) : super
17
- end
18
-
19
- def respond_to_missing?(symbol, *)
20
- status.respond_to?(symbol) || super
21
- end
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,125 +0,0 @@
1
- require 'spud/error'
2
- require 'spud/task_args'
3
- require 'spud/build_tools/task'
4
- require 'spud/build_tools/spud/task'
5
- require 'spud/build_tools/spud/dsl/file'
6
- require 'spud/build_tools/spud/dsl/task'
7
-
8
- module Spud
9
- module BuildTools
10
- module Spud
11
- class Task < BuildTools::Task
12
- # @return [void]
13
- def self.mount!
14
- Dir['**/Spudfile', '**/*.spud'].each do |filename|
15
- @filename = filename
16
- file_dsl.instance_eval(File.read(filename), filename)
17
- end
18
-
19
- @filename = nil
20
- end
21
-
22
- # @return [Spud::DSL::File]
23
- def self.file_dsl
24
- @file_dsl ||= DSL::File.new
25
- end
26
-
27
- # @param task [String]
28
- # @param block [Proc]
29
- # @return [void]
30
- def self.add_task(task, &block)
31
- raise "task '#{task}' somehow created without filename" unless @filename
32
-
33
- qualified_name = [qualified_prefix(@filename), task.to_s].join('.').gsub(/^\./, '')
34
- new(name: qualified_name, filename: @filename, &block)
35
- end
36
-
37
- # @param filename [String]
38
- # @param task [String]
39
- # @param positional [Array]
40
- # @param named [Hash]
41
- def self.invoke(filename, task, positional, named)
42
- task = task.to_s
43
- task_obj = task_for(filename, task)
44
- if task_obj
45
- Runtime.invoke(task_obj.name, positional, named)
46
- else
47
- Runtime.invoke(task, positional, named)
48
- end
49
- end
50
-
51
- # @param filename [String]
52
- # @param task [String]
53
- def self.task_for(filename, task)
54
- task = task.to_s
55
- if task.include?('.')
56
- Runtime.tasks[task]
57
- else
58
- Runtime.tasks[[qualified_prefix(filename), task.to_s].join('.').gsub(/^\./, '')]
59
- end
60
- end
61
-
62
- # @param filename [String]
63
- # @return [String]
64
- def self.qualified_prefix(filename)
65
- dirname = File.dirname(filename)
66
- dirname = '' if dirname == '.'
67
-
68
- basename = File.basename(filename, '.spud')
69
- basename_array = basename == 'Spudfile' ? [] : [basename]
70
-
71
- (dirname.split('/') + basename_array).join('.')
72
- end
73
-
74
- def initialize(name:, filename:, &block)
75
- super
76
- @block = block
77
- end
78
-
79
- # @param positional [Array]
80
- # @param named [Hash]
81
- # @return [Object]
82
- def invoke(positional, named)
83
- check_required!(positional)
84
-
85
- return task_dsl.instance_exec(*positional, &@block) unless args.any_named?
86
-
87
- task_dsl.instance_exec(*positional, **symbolize_keys(named), &@block)
88
- rescue ArgumentError => error
89
- raise Error, "invocation of '#{name}' with #{error.message}"
90
- end
91
-
92
- # @return [Spud::TaskArgs]
93
- def args
94
- @args ||= ::Spud::TaskArgs.from_block(filename, &@block)
95
- end
96
-
97
- private
98
-
99
- # @param positional [Array<String>]
100
- # @return [void]
101
- def check_required!(positional)
102
- required_positional = args.required_positional
103
- missing_positional = required_positional.length - positional.length
104
- if missing_positional > 0
105
- arguments = required_positional.length - missing_positional > 1 ? 'arguments' : 'argument'
106
- raise Error, "invocation of '#{name}' missing required #{arguments} #{required_positional.join(', ')}"
107
- end
108
- end
109
-
110
- # @return [Spud::DSL::Task]
111
- def task_dsl
112
- @task_dsl ||= DSL::Task.new(filename)
113
- end
114
-
115
- # @param hash [Hash]
116
- # @return [Hash]
117
- def symbolize_keys(hash)
118
- hash.each_with_object({}) do |(key, value), new_hash|
119
- new_hash[key.is_a?(String) ? key.to_sym : key] = value
120
- end
121
- end
122
- end
123
- end
124
- end
125
- end