spud 0.1.1 → 0.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2bdf078402c01167bdfbb089bc310d340deea9ba
4
- data.tar.gz: ba7a5d0943d295d04b6f5de0cbe6a1cad477f697
3
+ metadata.gz: e92e76786c206e34c509f3a8829ecdb81b3773af
4
+ data.tar.gz: 1220524f9bcc66630f76b1829a1e07d4c0fbb136
5
5
  SHA512:
6
- metadata.gz: 950a5a0a493c2fbe2b231a0ec472abd40d550887131ce02e741cd765ebffa9577735d06a266eafbb5918f257a58a6fa50b3a65cf62cb91dfc81db9de49014a0d
7
- data.tar.gz: c4c79b47c14e4892345e98cca7c3e6c8d9e08202ab62155aed53ade30eaabc64268f065bdba3db3a08e8c64922292879c15aad0a75eeefa4a719bc2af4dc08ac
6
+ metadata.gz: c9865feae31740c55283771181008caa50f5b9e9530c016d09df7f29b3103add24838396e4003d12691438f4cc34d0bca9931c2aedbf11aa6da48587ccce4cfd
7
+ data.tar.gz: e95e09f69e0218b6b19ab18502ace805686e78f1503da48f735781c6a7884e210c17f8d13ab6ee5320c0a19b020f4af5d3dbffce9abb8bc5ed003f4f79793fad
@@ -23,7 +23,7 @@ module Spud::BuildTools
23
23
  end
24
24
 
25
25
  def invoke(*args, **kwargs)
26
- system('make', name, *args)
26
+ system('make', @name, *args)
27
27
  end
28
28
  end
29
29
  end
@@ -10,12 +10,15 @@ module Spud::BuildTools
10
10
  @rules = {}
11
11
  end
12
12
 
13
- def rule(name, deps = {}, &block)
13
+ def rule(name, *args, &block)
14
14
  name = name.to_s
15
- @rules[name] = Rule.new(@spud, self, name, deps, &block)
15
+ files = args.select { |arg| arg.is_a?(String) }
16
+ deps = args.select { |arg| arg.is_a?(Hash) }.reduce({}) { |hash, dep| hash.merge(dep) }
17
+ @rules[name] = Rule.new(@spud, self, name, files, deps, block)
16
18
  end
17
19
 
18
20
  def method_missing(method_name, *args, &block)
21
+ method_name = method_name.to_s
19
22
  rule(method_name, *args, &block)
20
23
  end
21
24
  end
@@ -1,20 +1,116 @@
1
1
  require_relative 'file_context'
2
2
  require_relative 'rule_context'
3
3
  require_relative '../build_rule'
4
+ require_relative '../../error'
4
5
 
5
6
  module Spud::BuildTools
6
7
  module SpudBuild
7
8
  class Rule < BuildRule
8
- def initialize(spud, file_context, name, deps = {}, &block)
9
+ def initialize(spud, file_context, name, files, deps, block)
9
10
  @spud = spud
10
11
  @file_context = file_context
11
12
  @name = name
13
+ @files = files
12
14
  @deps = deps
13
15
  @block = block
14
16
  end
15
17
 
16
18
  def invoke(*args, **kwargs)
17
- RuleContext.new(@spud, @file_context).instance_exec(*args, **kwargs, &@block)
19
+ raise Spud::Error, "'#{@name}' is up to date" if up_to_date?
20
+
21
+ missing = required_params.length - args.length
22
+ if missing > 0
23
+ names = required_params.map { |name| "'#{name}'" }.join(', ')
24
+ arguments = missing > 1 ? 'arguments' : 'argument'
25
+ raise Spud::Error, "invocation of '#{@name}' missing required #{arguments} #{names}"
26
+ end
27
+
28
+ unless key_params?
29
+ RuleContext.new(@spud, @file_context).instance_exec(*args, &@block)
30
+ return
31
+ end
32
+
33
+ begin
34
+ RuleContext.new(@spud, @file_context).instance_exec(*args, **kwargs, &@block)
35
+ rescue ArgumentError => e
36
+ raise Spud::Error, "invocation of '#{@name}' with #{e.message}"
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ # Up to date checking
43
+ def up_to_date?
44
+ return files_up_to_date? unless files_up_to_date?.nil?
45
+ deps_up_to_date?
46
+ #files_up_to_date? && deps_up_to_date?
47
+ end
48
+
49
+ def files_up_to_date?
50
+ return nil if all_files.empty?
51
+ all_files_exist?
52
+ end
53
+
54
+ def all_files_exist?
55
+ all_files.all?(&File.method(:exist?))
56
+ end
57
+
58
+ def all_files
59
+ @files.map(&Dir.method(:glob)).flatten
60
+ end
61
+
62
+ def deps_up_to_date?
63
+ return nil if @deps.empty?
64
+
65
+ @deps.all? do |deps, targets|
66
+ targets = [targets].flatten
67
+ deps = [deps].flatten
68
+
69
+ latest_target = targets
70
+ .map(&Dir.method(:glob))
71
+ .flatten
72
+ .map(&File.method(:mtime))
73
+ .sort
74
+ .last
75
+
76
+ latest_dep = deps
77
+ .map(&Dir.method(:glob))
78
+ .flatten
79
+ .map(&File.method(:mtime))
80
+ .sort
81
+ .last
82
+
83
+ return false unless latest_target && latest_dep
84
+ latest_target > latest_dep
85
+ end
86
+ end
87
+
88
+ # Lambda
89
+ def key_params?
90
+ lam.parameters.map(&:first).include?(:key)
91
+ end
92
+
93
+ def required_params
94
+ lam.parameters.select { |p| p.first == :req }.map(&:last)
95
+ end
96
+
97
+ def lam
98
+ @lam ||= build_lam
99
+ end
100
+
101
+ def build_lam
102
+ line = @block.source_location.last - 1
103
+ line = File.read(filename).split("\n")[line]
104
+
105
+ match = /(do|{)\s*\|(?<params>[^|]+)\|/.match(line)
106
+ return -> {} unless match
107
+
108
+ param_source = match[:params]
109
+ eval("-> (#{param_source}) {}")
110
+ end
111
+
112
+ def filename
113
+ 'Spudfile'
18
114
  end
19
115
  end
20
116
  end
@@ -4,6 +4,10 @@ require_relative '../../error'
4
4
 
5
5
  module Spud::BuildTools
6
6
  module SpudBuild
7
+ def self.join_args(*args)
8
+ args.join(' ')
9
+ end
10
+
7
11
  class RuleContext
8
12
  def initialize(spud, file_context)
9
13
  @spud = spud
@@ -16,10 +20,12 @@ module Spud::BuildTools
16
20
  def sh(*args)
17
21
  out = sh?(*args)
18
22
  raise ShellError unless out.status.exitstatus.zero?
23
+
24
+ out
19
25
  end
20
26
 
21
27
  def sh?(*args)
22
- cmd = args.join(' ')
28
+ cmd = SpudBuild.join_args(*args)
23
29
  puts cmd
24
30
 
25
31
  out = Spud::Shell.cmd(cmd)
@@ -31,10 +37,12 @@ module Spud::BuildTools
31
37
  def shh(*args)
32
38
  out = shh?(*args)
33
39
  raise ShellError unless out.status.exitstatus.zero?
40
+
41
+ out
34
42
  end
35
43
 
36
44
  def shh?(*args)
37
- out = Spud::Shell.cmd(args.join(' '))
45
+ out = Spud::Shell.cmd(SpudBuild.join_args(*args))
38
46
  puts out
39
47
 
40
48
  out
@@ -43,19 +51,34 @@ module Spud::BuildTools
43
51
  def shhh(*args)
44
52
  out = shhh?(*args)
45
53
  raise ShellError, out unless out.status.exitstatus.zero?
54
+
55
+ out
46
56
  end
47
57
 
48
58
  def shhh?(*args)
49
- Spud::Shell.cmd(args.join(' '))
59
+ Spud::Shell.cmd(SpudBuild.join_args(*args))
50
60
  end
51
61
 
52
62
  def invoke(rule_name, *args, **kwargs)
53
63
  @spud.invoke_rule(rule_name.to_s, *args, **kwargs)
54
64
  end
55
65
 
56
- def die(message = nil, code: 1)
57
- puts message if message
58
- raise Spud::Error, code
66
+ def q(s)
67
+ %('#{s}')
68
+ end
69
+
70
+ def qq(s)
71
+ %("#{s}")
72
+ end
73
+
74
+ def method_missing(method_name, *args)
75
+ method_name = method_name.to_s
76
+
77
+ if method_name.end_with?('?')
78
+ sh?(method_name.chomp('?'), *args)
79
+ else
80
+ sh(method_name, *args)
81
+ end
59
82
  end
60
83
  end
61
84
  end
@@ -0,0 +1,12 @@
1
+
2
+ module Spud::BuildTools
3
+ module SpudBuild
4
+ class Spudfile
5
+ def initialize(spud, source)
6
+ @spud = spud
7
+ @file_context = FileContext.new(@spud)
8
+
9
+ end
10
+ end
11
+ end
12
+ end
@@ -1,10 +1,9 @@
1
1
  module Spud
2
2
  class Shell < String
3
- attr_reader :cmd
4
- attr_reader :status
3
+ attr_accessor :status
5
4
 
6
5
  def self.cmd(cmd)
7
- new( `#{cmd}`, $?)
6
+ new(`#{cmd}`, $?)
8
7
  end
9
8
 
10
9
  def initialize(output, status)
@@ -25,6 +25,7 @@ module Spud
25
25
  raise e if options[:debug]
26
26
 
27
27
  rescue Error => e
28
+ raise e if options[:debug]
28
29
  puts e.message
29
30
  exit(1)
30
31
 
@@ -47,7 +48,10 @@ module Spud
47
48
  end
48
49
 
49
50
  def build_tools
50
- @build_tools ||= BuildTools::BUILD_TOOLS.map { |tool| tool.new(self) }.each(&:mount!)
51
+ @build_tools ||= BuildTools::BUILD_TOOLS
52
+ .reverse
53
+ .map { |tool| tool.new(self) }
54
+ .each(&:mount!)
51
55
  end
52
56
 
53
57
  # Args
@@ -1,3 +1,3 @@
1
- module Spud
2
- VERSION = '0.1.1'
3
- end
1
+ module Spud
2
+ VERSION = '0.1.3'
3
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spud
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Booth
@@ -24,20 +24,6 @@ dependencies:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
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
27
  - !ruby/object:Gem::Dependency
42
28
  name: rspec
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -68,6 +54,7 @@ files:
68
54
  - lib/build_tools/spud/rule_context.rb
69
55
  - lib/build_tools/spud/spud.rb
70
56
  - lib/build_tools/spud/rule.rb
57
+ - lib/build_tools/spud/spudfile.rb
71
58
  - lib/build_tools/spud/file_context.rb
72
59
  - lib/build_tools/spud/shell_error.rb
73
60
  - lib/build_tools/node/node.rb