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
@@ -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
- new(name: qualified_name(@filename, task.to_s), filename: @filename, &block)
34
- end
35
-
36
- # @param filename [String]
37
- # @param task [String]
38
- # @param positional [Array]
39
- # @param named [Hash]
40
- def self.invoke(filename, task, positional, named)
41
- task = task.to_s
42
- task_obj = task_for(filename, task)
43
- if task_obj
44
- Runtime.invoke(task_obj.name, positional, named)
45
- else
46
- Runtime.invoke(task, positional, named)
47
- end
48
- end
49
-
50
- # @param filename [String]
51
- # @param task [String]
52
- def self.task_for(filename, task)
53
- Runtime.tasks[qualified_name(filename, task.to_s)]
54
- end
55
-
56
- def self.qualified_name(filename, task)
57
- raise "task '#{task}' somehow created without filename" unless filename
58
-
59
- [qualified_prefix(filename), task.to_s].join('.').gsub(/^\./, '')
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
@@ -1,33 +0,0 @@
1
- module Spud
2
- module BuildTools
3
- class Task
4
- # @return [String]
5
- attr_reader :name
6
- # @return [String]
7
- attr_reader :filename
8
- # @return [Spud::TaskArgs]
9
- attr_reader :args
10
-
11
- # @return [void]
12
- def self.mount!
13
- raise NotImplementedError
14
- end
15
-
16
- # @param name [String]
17
- # @param filename [String]
18
- def initialize(name:, filename:)
19
- @name = name
20
- @filename = filename
21
-
22
- Runtime.tasks[name.to_s] = self
23
- end
24
-
25
- # @param positional [Array]
26
- # @param named [Hash]
27
- # @return [Object]
28
- def invoke(positional = [], named = {})
29
- raise NotImplementedError
30
- end
31
- end
32
- end
33
- end
@@ -1,14 +0,0 @@
1
- module Spud
2
- class Options
3
- BOOLEANS = %i[help files debug]
4
-
5
- BOOLEANS.each do |name|
6
- attr_accessor name
7
- define_method("#{name}?") { !!send(name) }
8
- end
9
-
10
- def watches
11
- @watches ||= []
12
- end
13
- end
14
- end
@@ -1,104 +0,0 @@
1
- require 'spud/error'
2
- require 'spud/help'
3
- require 'spud/lister'
4
- require 'spud/cli/parser'
5
- require 'spud/build_tools/task'
6
- require 'spud/build_tools/build_tools'
7
-
8
- module Spud
9
- module Runtime
10
- class << self
11
- def run!
12
- if options.debug?
13
- puts "options: #{options.inspect}"
14
- puts "task: #{args.task}"
15
- puts "positional: #{args.positional}"
16
- puts "named: #{args.named}"
17
- end
18
-
19
- if options.help?
20
- Spud::Help.print!
21
- return
22
- end
23
-
24
- mount!
25
- if options.files?
26
- lister.list_filenames!
27
- return
28
- end
29
-
30
- unless args.task
31
- print_tasks!
32
- return
33
- end
34
-
35
- invoke(args.task, args.positional, args.named)
36
- rescue Error => error
37
- puts error.message
38
- raise error if options.debug?
39
- rescue => error
40
- puts "fatal: #{error.message}"
41
- raise error if options.debug?
42
- end
43
-
44
- # @param task_name [String]
45
- # @param positional [Array]
46
- # @param named [Hash]
47
- def invoke(task_name, positional = [], named = {})
48
- task = tasks[task_name.to_s]
49
- raise Error, "no task found for '#{task_name}'" unless task
50
- task.invoke(positional, named)
51
- end
52
-
53
- # @return [Hash{String->Spud::Task}]
54
- def tasks
55
- @tasks ||= {}
56
- end
57
-
58
- private
59
-
60
- # @return [Array<String>]
61
- def filenames
62
- @filenames ||= tasks.values.map(&:filename).uniq
63
- end
64
-
65
- # @return [void]
66
- def mount!
67
- build_tools.each(&:mount!)
68
- tasks.keys.each do |key|
69
- tasks[key.to_s] = tasks.delete(key) if key.is_a?(Symbol)
70
- end
71
- end
72
-
73
- # @return [Array<Spud::BuildTools::Task>]
74
- def build_tools
75
- @build_tools ||= begin
76
- BuildTools::BUILD_TOOLS.each do |tool|
77
- raise "build tool does not inherit from BuildTools::Task" unless tool < BuildTools::Task
78
- end
79
-
80
- BuildTools::BUILD_TOOLS.reverse
81
- end
82
- end
83
-
84
- # @return [Spud::Options]
85
- def options
86
- args.options
87
- end
88
-
89
- # @return [Spud::CLI::Results]
90
- def args
91
- @args ||= Spud::CLI::Parser.parse!
92
- end
93
-
94
- # @return [void]
95
- def print_tasks!
96
- lister.list!
97
- end
98
-
99
- def lister
100
- @lister ||= Lister.new(tasks.values)
101
- end
102
- end
103
- end
104
- end