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.
@@ -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: []