spud 0.2.0 → 0.2.5

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 +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