spud 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -0,0 +1,4 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ require 'spud'
4
+ Spud.run!
@@ -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,9 @@
1
+ module Spud
2
+ module BuildTools
3
+ class BuildRule
4
+ def invoke(*args, **kwargs)
5
+ raise NotImplementedError
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ module Spud
2
+ module BuildTools
3
+ class BuildTool
4
+ NAME = nil
5
+
6
+ def initialize(spud)
7
+ @spud = spud
8
+ end
9
+
10
+ def mount!
11
+ raise NotImplementedError
12
+ end
13
+
14
+ def rules
15
+ raise NotImplementedError
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ require_relative 'spud/spud'
2
+ require_relative 'make/make'
3
+ require_relative 'node/node'
4
+
5
+ module Spud
6
+ module BuildTools
7
+ BUILD_TOOLS = [
8
+ SpudBuild::Build,
9
+ Make,
10
+ Node
11
+ ]
12
+ end
13
+ 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,7 @@
1
+ require_relative '../../error'
2
+
3
+ module Spud::BuildTools
4
+ module SpudBuild
5
+ class ShellError < Spud::Error; end
6
+ end
7
+ 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
@@ -0,0 +1,7 @@
1
+ module Spud
2
+ class Error < StandardError
3
+ def message
4
+ "spud: #{super}"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,15 @@
1
+ module Spud
2
+ class Shell < String
3
+ attr_reader :cmd
4
+ attr_reader :status
5
+
6
+ def self.cmd(cmd)
7
+ new( `#{cmd}`, $?)
8
+ end
9
+
10
+ def initialize(output, status)
11
+ super(output)
12
+ @status = status
13
+ end
14
+ end
15
+ end
@@ -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
@@ -0,0 +1,3 @@
1
+ module Spud
2
+ VERSION = '0.1.0'
3
+ end
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: []