spud 0.1.0
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.
- checksums.yaml +7 -0
- data/bin/spud +4 -0
- data/lib/args.rb +69 -0
- data/lib/build_tools/build_rule.rb +9 -0
- data/lib/build_tools/build_tool.rb +19 -0
- data/lib/build_tools/build_tools.rb +13 -0
- data/lib/build_tools/make/make.rb +29 -0
- data/lib/build_tools/node/node.rb +31 -0
- data/lib/build_tools/spud/file_context.rb +23 -0
- data/lib/build_tools/spud/rule.rb +21 -0
- data/lib/build_tools/spud/rule_context.rb +64 -0
- data/lib/build_tools/spud/shell_error.rb +7 -0
- data/lib/build_tools/spud/spud.rb +18 -0
- data/lib/error.rb +7 -0
- data/lib/shell.rb +15 -0
- data/lib/spud.rb +60 -0
- data/lib/version.rb +3 -0
- metadata +102 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 49b7be1637cc21060805cdd236177d9124638c40
|
4
|
+
data.tar.gz: 5894cfc0e6b4b93dc7674cb9d8d0fca078af97d1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 91fd669147b39bb9044b49eb85ba3849e49fa296b7248cb8b3997a34416c91899108e8c5537163167a477e602e9dd5fbaa4be87f7b0b51370202e6f095111cb7
|
7
|
+
data.tar.gz: d232642cbc37edd8926bd978ab58ea9f38c78b0f12c47bcae29ac12a9e32c3a263a42455a6491cab7700171c9c2eb87070081652c30ae3a939d18957460585b9
|
data/bin/spud
ADDED
data/lib/args.rb
ADDED
@@ -0,0 +1,69 @@
|
|
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
|
+
debug: false,
|
13
|
+
list: false
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
def parse_option(options, index, args)
|
18
|
+
arg = args[index]
|
19
|
+
|
20
|
+
case arg
|
21
|
+
when '--debug' then [options.merge(debug: true), index + 1]
|
22
|
+
when '-l', '--list' then [options.merge(list: true), index + 1]
|
23
|
+
else raise Error, "invalid option '#{arg}'"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def parse_args(args)
|
28
|
+
options = default_options.dup
|
29
|
+
rule_name = nil
|
30
|
+
index = 0
|
31
|
+
while index < args.length
|
32
|
+
arg = args[index]
|
33
|
+
|
34
|
+
if arg[0] != '-'
|
35
|
+
rule_name = arg
|
36
|
+
index += 1
|
37
|
+
break
|
38
|
+
end
|
39
|
+
|
40
|
+
options, index = parse_option(options, index, args)
|
41
|
+
end
|
42
|
+
|
43
|
+
positional = []
|
44
|
+
keyword = {}
|
45
|
+
while index < args.length
|
46
|
+
arg = args[index]
|
47
|
+
|
48
|
+
if arg[0] == '-'
|
49
|
+
value = args[index + 1]
|
50
|
+
raise Error, "missing value for arg #{arg}" unless value
|
51
|
+
|
52
|
+
keyword[arg.sub(/^-+/, '').to_sym] = value
|
53
|
+
index += 2
|
54
|
+
else
|
55
|
+
positional << arg
|
56
|
+
index += 1
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
{
|
61
|
+
options: options,
|
62
|
+
rule: rule_name,
|
63
|
+
positional: positional,
|
64
|
+
keyword: keyword
|
65
|
+
}
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative '../build_tool'
|
2
|
+
require_relative '../build_rule'
|
3
|
+
|
4
|
+
module Spud::BuildTools
|
5
|
+
class Make < BuildTool
|
6
|
+
attr_reader :rules
|
7
|
+
|
8
|
+
def mount!
|
9
|
+
@rules = {}
|
10
|
+
return unless File.exist?('Makefile')
|
11
|
+
|
12
|
+
source = File.read('Makefile')
|
13
|
+
source.scan(/^(\S+):.*/).each do |match|
|
14
|
+
name = match.first
|
15
|
+
@rules[name] = Rule.new(name)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class Rule < BuildRule
|
21
|
+
def initialize(name)
|
22
|
+
@name = name
|
23
|
+
end
|
24
|
+
|
25
|
+
def invoke(*args, **kwargs)
|
26
|
+
system('make', name, *args)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'json'
|
2
|
+
require_relative '../build_tool'
|
3
|
+
require_relative '../build_rule'
|
4
|
+
|
5
|
+
module Spud::BuildTools
|
6
|
+
class Node < BuildTool
|
7
|
+
NAME = 'node'
|
8
|
+
|
9
|
+
attr_reader :rules
|
10
|
+
|
11
|
+
def mount!
|
12
|
+
@rules = {}
|
13
|
+
return unless File.exist?('package.json')
|
14
|
+
|
15
|
+
scripts = JSON.parse(File.read('package.json'))['scripts']
|
16
|
+
return unless scripts
|
17
|
+
|
18
|
+
scripts.each { |name, source| @rules[name] = Rule.new(source) }
|
19
|
+
end
|
20
|
+
|
21
|
+
class Rule < BuildRule
|
22
|
+
def initialize(source)
|
23
|
+
@source = source
|
24
|
+
end
|
25
|
+
|
26
|
+
def invoke(*args, **kwargs)
|
27
|
+
system(@source)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require_relative 'rule'
|
2
|
+
|
3
|
+
module Spud::BuildTools
|
4
|
+
module SpudBuild
|
5
|
+
class FileContext
|
6
|
+
attr_reader :rules
|
7
|
+
|
8
|
+
def initialize(spud)
|
9
|
+
@spud = spud
|
10
|
+
@rules = {}
|
11
|
+
end
|
12
|
+
|
13
|
+
def rule(name, deps = {}, &block)
|
14
|
+
name = name.to_s
|
15
|
+
@rules[name] = Rule.new(@spud, self, name, deps, &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def method_missing(method_name, *args, &block)
|
19
|
+
rule(method_name, *args, &block)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'file_context'
|
2
|
+
require_relative 'rule_context'
|
3
|
+
require_relative '../build_rule'
|
4
|
+
|
5
|
+
module Spud::BuildTools
|
6
|
+
module SpudBuild
|
7
|
+
class Rule < BuildRule
|
8
|
+
def initialize(spud, file_context, name, deps = {}, &block)
|
9
|
+
@spud = spud
|
10
|
+
@file_context = file_context
|
11
|
+
@name = name
|
12
|
+
@deps = deps
|
13
|
+
@block = block
|
14
|
+
end
|
15
|
+
|
16
|
+
def invoke(*args, **kwargs)
|
17
|
+
RuleContext.new(@spud, @file_context).instance_exec(*args, **kwargs, &@block)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require_relative 'shell_error'
|
2
|
+
require_relative '../../shell'
|
3
|
+
require_relative '../../error'
|
4
|
+
|
5
|
+
module Spud::BuildTools
|
6
|
+
module SpudBuild
|
7
|
+
class RuleContext
|
8
|
+
def initialize(spud, file_context)
|
9
|
+
@spud = spud
|
10
|
+
|
11
|
+
file_context.singleton_methods.each do |method_name|
|
12
|
+
define_singleton_method(method_name, &file_context.method(method_name))
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def sh(*args)
|
17
|
+
out = sh?(*args)
|
18
|
+
raise ShellError unless out.status.exitstatus.zero?
|
19
|
+
end
|
20
|
+
|
21
|
+
def sh?(*args)
|
22
|
+
cmd = args.join(' ')
|
23
|
+
puts cmd
|
24
|
+
|
25
|
+
out = Spud::Shell.cmd(cmd)
|
26
|
+
puts out
|
27
|
+
|
28
|
+
out
|
29
|
+
end
|
30
|
+
|
31
|
+
def shh(*args)
|
32
|
+
out = shh?(*args)
|
33
|
+
raise ShellError unless out.status.exitstatus.zero?
|
34
|
+
end
|
35
|
+
|
36
|
+
def shh?(*args)
|
37
|
+
out = Spud::Shell.cmd(args.join(' '))
|
38
|
+
puts out
|
39
|
+
|
40
|
+
out
|
41
|
+
end
|
42
|
+
|
43
|
+
def shhh(*args)
|
44
|
+
out = shhh?(*args)
|
45
|
+
raise ShellError, out unless out.status.exitstatus.zero?
|
46
|
+
end
|
47
|
+
|
48
|
+
def shhh?(*args)
|
49
|
+
Spud::Shell.cmd(args.join(' '))
|
50
|
+
end
|
51
|
+
|
52
|
+
def invoke(rule_name, *args, **kwargs)
|
53
|
+
@spud.invoke_rule(rule_name.to_s, *args, **kwargs)
|
54
|
+
end
|
55
|
+
|
56
|
+
def die(message = nil, code: 1)
|
57
|
+
puts message if message
|
58
|
+
raise Error, code
|
59
|
+
end
|
60
|
+
|
61
|
+
class ShOut < Struct.new(:status, :output); end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative '../build_tool'
|
2
|
+
require_relative 'file_context'
|
3
|
+
|
4
|
+
module Spud::BuildTools
|
5
|
+
module SpudBuild
|
6
|
+
class Build < BuildTool
|
7
|
+
def mount!
|
8
|
+
source = File.read('Spudfile')
|
9
|
+
@ctx = FileContext.new(@spud)
|
10
|
+
@ctx.instance_eval(source)
|
11
|
+
end
|
12
|
+
|
13
|
+
def rules
|
14
|
+
@ctx.rules
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/error.rb
ADDED
data/lib/shell.rb
ADDED
data/lib/spud.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require_relative 'args'
|
2
|
+
require_relative 'build_tools/build_tools'
|
3
|
+
require_relative 'build_tools/spud/shell_error'
|
4
|
+
|
5
|
+
module Spud
|
6
|
+
def self.run!
|
7
|
+
Spud.new.run!
|
8
|
+
end
|
9
|
+
|
10
|
+
class Spud
|
11
|
+
def run!
|
12
|
+
if !rule_name || options[:list]
|
13
|
+
rules.keys.each(&method(:puts))
|
14
|
+
return
|
15
|
+
end
|
16
|
+
|
17
|
+
invoke_rule(rule_name, *args[:positional], **args[:keyword])
|
18
|
+
rescue BuildTools::SpudBuild::ShellError => e
|
19
|
+
raise e if options[:debug]
|
20
|
+
|
21
|
+
rescue Error => e
|
22
|
+
puts e.message
|
23
|
+
exit(1)
|
24
|
+
|
25
|
+
rescue => e
|
26
|
+
raise e if options[:debug]
|
27
|
+
puts e.message
|
28
|
+
end
|
29
|
+
|
30
|
+
def invoke_rule(name, *args, **kwargs)
|
31
|
+
rule = rules[name]
|
32
|
+
raise Error, "no rule found for #{name}" unless rule
|
33
|
+
rule.invoke(*args, **kwargs)
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
# Rules
|
39
|
+
def rules
|
40
|
+
@rules ||= build_tools.reduce({}) { |rules, tool| rules.merge(tool.rules) }
|
41
|
+
end
|
42
|
+
|
43
|
+
def build_tools
|
44
|
+
@build_tools ||= BuildTools::BUILD_TOOLS.map { |tool| tool.new(self) }.each(&:mount!)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Args
|
48
|
+
def options
|
49
|
+
@options ||= args[:options]
|
50
|
+
end
|
51
|
+
|
52
|
+
def rule_name
|
53
|
+
@rule_name ||= args[:rule]
|
54
|
+
end
|
55
|
+
|
56
|
+
def args
|
57
|
+
@args ||= Args.parse_args!
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/version.rb
ADDED
metadata
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: spud
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Andrew Booth
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2010-04-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.17'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.17'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
description: Spud is a build tool, written as a ruby DSL
|
56
|
+
email: adbooth8@gmail.com
|
57
|
+
executables:
|
58
|
+
- spud
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- lib/spud.rb
|
63
|
+
- lib/args.rb
|
64
|
+
- lib/build_tools/build_tool.rb
|
65
|
+
- lib/build_tools/build_rule.rb
|
66
|
+
- lib/build_tools/build_tools.rb
|
67
|
+
- lib/build_tools/make/make.rb
|
68
|
+
- lib/build_tools/spud/rule_context.rb
|
69
|
+
- lib/build_tools/spud/spud.rb
|
70
|
+
- lib/build_tools/spud/rule.rb
|
71
|
+
- lib/build_tools/spud/file_context.rb
|
72
|
+
- lib/build_tools/spud/shell_error.rb
|
73
|
+
- lib/build_tools/node/node.rb
|
74
|
+
- lib/shell.rb
|
75
|
+
- lib/version.rb
|
76
|
+
- lib/error.rb
|
77
|
+
- bin/spud
|
78
|
+
homepage: https://github.com/broothie/spud#readme
|
79
|
+
licenses:
|
80
|
+
- MIT
|
81
|
+
metadata: {}
|
82
|
+
post_install_message:
|
83
|
+
rdoc_options: []
|
84
|
+
require_paths:
|
85
|
+
- lib
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - '>='
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
requirements: []
|
97
|
+
rubyforge_project:
|
98
|
+
rubygems_version: 2.0.14.1
|
99
|
+
signing_key:
|
100
|
+
specification_version: 4
|
101
|
+
summary: A build tool
|
102
|
+
test_files: []
|