spud 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|