spud 0.1.18 → 0.1.19

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.
@@ -0,0 +1,14 @@
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
@@ -0,0 +1,104 @@
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
@@ -0,0 +1,51 @@
1
+ module Spud
2
+ class TaskArg
3
+ # @param name [String]
4
+ # @param type [String]
5
+ # @param default [String]
6
+ def initialize(name, type, default: nil)
7
+ raise 'must be of type "positional" or "named"' unless %w[positional named].include?(type)
8
+
9
+ @name = name
10
+ @type = type
11
+ @default = default
12
+ end
13
+
14
+ # @return [Boolean]
15
+ def required?
16
+ !has_default?
17
+ end
18
+
19
+ # @return [Boolean]
20
+ def has_default?
21
+ !!@default
22
+ end
23
+
24
+ # @return [Boolean]
25
+ def positional?
26
+ @type == 'positional'
27
+ end
28
+
29
+ # @return [Boolean]
30
+ def named?
31
+ @type == 'named'
32
+ end
33
+
34
+ # @return [String]
35
+ def to_s
36
+ if positional?
37
+ if has_default?
38
+ "<#{@name}=#{@default}>"
39
+ else
40
+ "<#{@name}>"
41
+ end
42
+ else
43
+ if has_default?
44
+ "--#{@name}=#{@default}"
45
+ else
46
+ "--#{@name}"
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,49 @@
1
+ require 'spud/task_arg'
2
+ require 'spud/build_tools/spud/block_param_info'
3
+
4
+ module Spud
5
+ class TaskArgs < Array
6
+ # @param filename [String]
7
+ # @param block [Proc]
8
+ # @return [Spud::TaskArgs]
9
+ def self.from_block(filename, &block)
10
+ info = BuildTools::Spud::BlockParamInfo.new(filename, &block)
11
+ new(info.task_args)
12
+ end
13
+
14
+ # @param task_args [Array<Spud::TaskArg>]
15
+ def initialize(task_args)
16
+ super(task_args)
17
+ end
18
+
19
+ # @return [Array<Spud::TaskArg>]
20
+ def positional
21
+ @positional ||= select(&:positional?)
22
+ end
23
+
24
+ # @return [Array<Spud::TaskArg>]
25
+ def required_positional
26
+ @required_positional ||= positional.select(&:required?)
27
+ end
28
+
29
+ # @return [Boolean]
30
+ def any_positional?
31
+ !positional.empty?
32
+ end
33
+
34
+ # @return [Array<Spud::TaskArg>]
35
+ def named
36
+ @named ||= select(&:named?)
37
+ end
38
+
39
+ # @return [Array<Spud::TaskArg>]
40
+ def required_named
41
+ @required_named ||= named.select(&:required?)
42
+ end
43
+
44
+ # @return [Boolean]
45
+ def any_named?
46
+ !named.empty?
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,3 @@
1
+ module Spud
2
+ VERSION = '0.1.19'
3
+ end
metadata CHANGED
@@ -1,71 +1,91 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spud
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.18
4
+ version: 0.1.19
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: 2010-04-05 00:00:00.000000000 Z
11
+ date: 2020-11-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bundler
14
+ name: rspec
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.17'
19
+ version: '3.0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.17'
26
+ version: '3.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rspec
28
+ name: pry
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '3.0'
33
+ version: 0.13.1
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '3.0'
41
- description: Spud is a build tool, written as a ruby DSL
42
- email: adbooth8@gmail.com
40
+ version: 0.13.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: byebug
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '11.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '11.0'
55
+ description:
56
+ email: andrew@andrewbooth.xyz
43
57
  executables:
44
58
  - spud
45
59
  extensions: []
46
60
  extra_rdoc_files: []
47
61
  files:
48
62
  - bin/spud
49
- - lib/args.rb
50
- - lib/build_tools/build_rule.rb
51
- - lib/build_tools/build_tool.rb
52
- - lib/build_tools/build_tools.rb
53
- - lib/build_tools/make/make.rb
54
- - lib/build_tools/package.json/package.json.rb
55
- - lib/build_tools/spud/file_context.rb
56
- - lib/build_tools/spud/rule.rb
57
- - lib/build_tools/spud/rule_context.rb
58
- - lib/build_tools/spud/shell_error.rb
59
- - lib/build_tools/spud/spud.rb
60
- - lib/error.rb
61
- - lib/shell.rb
62
63
  - lib/spud.rb
63
- - lib/version.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
74
+ - lib/spud/cli/parser.rb
75
+ - lib/spud/cli/results.rb
76
+ - lib/spud/error.rb
77
+ - lib/spud/help.rb
78
+ - lib/spud/lister.rb
79
+ - lib/spud/options.rb
80
+ - lib/spud/runtime.rb
81
+ - lib/spud/task_arg.rb
82
+ - lib/spud/task_args.rb
83
+ - lib/spud/version.rb
64
84
  homepage: https://github.com/broothie/spud#readme
65
85
  licenses:
66
86
  - MIT
67
87
  metadata: {}
68
- post_install_message:
88
+ post_install_message:
69
89
  rdoc_options: []
70
90
  require_paths:
71
91
  - lib
@@ -81,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
81
101
  version: '0'
82
102
  requirements: []
83
103
  rubygems_version: 3.1.3
84
- signing_key:
104
+ signing_key:
85
105
  specification_version: 4
86
- summary: A build tool
106
+ summary: Spud is a task runner, in the form of a ruby DSL.
87
107
  test_files: []
@@ -1,73 +0,0 @@
1
- require_relative 'spud'
2
-
3
- module Spud
4
- module Args
5
- class << self
6
- def parse_args!
7
- parse_args(ARGV)
8
- end
9
-
10
- def default_options
11
- {
12
- help: false,
13
- version: false,
14
- watches: [],
15
- debug: false,
16
- }
17
- end
18
-
19
- def parse_option(options, index, args)
20
- arg = args[index]
21
-
22
- case arg
23
- when '-h', '--help' then [options.merge(help: true), index + 1]
24
- when '-v', '--version' then [options.merge(version: true), index + 1]
25
- when '-w', '--watch' then [options.merge(watches: options[:watches] + [args[index + 1]]), index + 2]
26
- when '--debug' then [options.merge(debug: true), index + 1]
27
- else raise Error, "invalid option '#{arg}'"
28
- end
29
- end
30
-
31
- def parse_args(args)
32
- options = default_options.dup
33
- rule_name = nil
34
- index = 0
35
- while index < args.length
36
- arg = args[index]
37
-
38
- if arg[0] != '-'
39
- rule_name = arg
40
- index += 1
41
- break
42
- end
43
-
44
- options, index = parse_option(options, index, args)
45
- end
46
-
47
- positional = []
48
- keyword = {}
49
- while index < args.length
50
- arg = args[index]
51
-
52
- if arg[0] == '-'
53
- value = args[index + 1]
54
- raise Error, "missing value for arg #{arg}" unless value
55
-
56
- keyword[arg.sub(/^-+/, '').to_sym] = value
57
- index += 2
58
- else
59
- positional << arg
60
- index += 1
61
- end
62
- end
63
-
64
- {
65
- options: options,
66
- rule: rule_name,
67
- positional: positional,
68
- keyword: keyword
69
- }
70
- end
71
- end
72
- end
73
- end
@@ -1,21 +0,0 @@
1
- module Spud
2
- module BuildTools
3
- class BuildRule
4
- def invoke(*args, **kwargs)
5
- raise NotImplementedError
6
- end
7
-
8
- def filename
9
- raise NotImplementedError
10
- end
11
-
12
- def positional_params
13
- []
14
- end
15
-
16
- def keyword_params
17
- []
18
- end
19
- end
20
- end
21
- end