spud 0.1.14 → 0.1.19

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,19 +0,0 @@
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
@@ -1,13 +0,0 @@
1
- require_relative 'spud/spud'
2
- require_relative 'make/make'
3
- require_relative 'package.json/package.json'
4
-
5
- module Spud
6
- module BuildTools
7
- BUILD_TOOLS = [
8
- SpudBuild::Build,
9
- Make,
10
- Node
11
- ]
12
- end
13
- end
@@ -1,33 +0,0 @@
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
-
29
- def filename
30
- 'Makefile'
31
- end
32
- end
33
- end
@@ -1,33 +0,0 @@
1
- require 'json'
2
- require_relative '../build_tool'
3
- require_relative '../build_rule'
4
-
5
- module Spud::BuildTools
6
- class Node < BuildTool
7
- attr_reader :rules
8
-
9
- def mount!
10
- @rules = {}
11
- return unless File.exist?('package.json')
12
-
13
- scripts = JSON.parse(File.read('package.json'))['scripts']
14
- return unless scripts
15
-
16
- scripts.each { |name, source| @rules[name] = Rule.new(source) }
17
- end
18
-
19
- class Rule < BuildRule
20
- def initialize(source)
21
- @source = source
22
- end
23
-
24
- def invoke(*args, **kwargs)
25
- system(@source, out: STDOUT)
26
- end
27
-
28
- def filename
29
- 'package.json'
30
- end
31
- end
32
- end
33
- end
@@ -1,33 +0,0 @@
1
- require_relative 'rule'
2
-
3
- module Spud::BuildTools
4
- module SpudBuild
5
- class FileContext
6
- attr_reader :__rules
7
-
8
- def initialize(spud, filename)
9
- @__spud = spud
10
- @__filename = filename
11
- @__rules = {}
12
- end
13
-
14
- def require_relative(name)
15
- require(name)
16
- end
17
-
18
- def rule(name, *args, &block)
19
- files = args.select { |arg| arg.is_a?(String) }
20
- deps = args.select { |arg| arg.is_a?(Hash) }.reduce({}) { |hash, dep| hash.merge(dep) }
21
-
22
- prefix = @__filename == 'Spudfile' ? '' : "#{File.basename(@__filename, '.rb')}."
23
- name = "#{prefix}#{name}"
24
-
25
- @__rules[name] = Rule.new(@__spud, self, @__filename, name, files, deps, block)
26
- end
27
-
28
- def method_missing(name, *args, &block)
29
- rule(name, *args, &block)
30
- end
31
- end
32
- end
33
- end
@@ -1,121 +0,0 @@
1
- require_relative 'file_context'
2
- require_relative 'rule_context'
3
- require_relative '../build_rule'
4
- require_relative '../../error'
5
-
6
- module Spud::BuildTools
7
- module SpudBuild
8
- class Rule < BuildRule
9
- attr_reader :filename
10
-
11
- def initialize(spud, file_context, filename, name, files, deps, block)
12
- @spud = spud
13
- @file_context = file_context
14
- @filename = filename
15
- @name = name
16
- @files = files
17
- @deps = deps
18
- @block = block
19
- end
20
-
21
- def invoke(*args, **kwargs)
22
- raise Spud::Error, "'#{@name}' is up to date" if up_to_date?
23
-
24
- missing = positional_params.length - args.length
25
- if missing > 0
26
- names = positional_params.map { |name| "'#{name}'" }.join(', ')
27
- arguments = missing > 1 ? 'arguments' : 'argument'
28
- raise Spud::Error, "invocation of '#{@name}' missing required #{arguments} #{names}"
29
- end
30
-
31
- return RuleContext.new(@spud, @file_context).instance_exec(*args, &@block) unless key_params?
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
- # Params
41
- def positional_params
42
- @positional_params ||= params.select { |p| p.first == :req }.map(&:last)
43
- end
44
-
45
- def keyword_params
46
- @keyword_params ||= params.select { |p| p.first == :key }.map(&:last)
47
- end
48
-
49
- private
50
-
51
- # Up to date checking
52
- def up_to_date?
53
- return files_up_to_date? unless files_up_to_date?.nil?
54
- deps_up_to_date?
55
- end
56
-
57
- def files_up_to_date?
58
- return nil if all_files.empty?
59
- all_files_exist?
60
- end
61
-
62
- def all_files_exist?
63
- all_files.all?(&File.method(:exist?))
64
- end
65
-
66
- def all_files
67
- @files.map(&Dir.method(:glob)).flatten
68
- end
69
-
70
- def deps_up_to_date?
71
- return nil if @deps.empty?
72
-
73
- @deps.all? do |deps, targets|
74
- targets = [targets].flatten
75
- deps = [deps].flatten
76
-
77
- latest_target = targets
78
- .map(&Dir.method(:glob))
79
- .flatten
80
- .map(&File.method(:mtime))
81
- .sort
82
- .last
83
-
84
- latest_dep = deps
85
- .map(&Dir.method(:glob))
86
- .flatten
87
- .map(&File.method(:mtime))
88
- .sort
89
- .last
90
-
91
- return false unless latest_target && latest_dep
92
- latest_target > latest_dep
93
- end
94
- end
95
-
96
- # Lambda
97
- def key_params?
98
- @key_params ||= !keyword_params.empty?
99
- end
100
-
101
- def params
102
- @params ||= lam.parameters
103
- end
104
-
105
- def lam
106
- @lam ||= build_lam
107
- end
108
-
109
- def build_lam
110
- line = @block.source_location.last - 1
111
- line = File.read(filename).split("\n")[line]
112
-
113
- match = /(do|{)\s*\|(?<params>[^|]+)\|/.match(line)
114
- return -> {} unless match
115
-
116
- param_source = match[:params]
117
- eval("-> (#{param_source}) {}")
118
- end
119
- end
120
- end
121
- end
@@ -1,58 +0,0 @@
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
- attr_reader :__process
9
-
10
- def initialize(spud, file_context)
11
- @__spud = spud
12
- @__process = nil
13
-
14
- file_context.singleton_methods.each do |method_name|
15
- define_singleton_method(method_name, &file_context.method(method_name))
16
- end
17
- end
18
-
19
- def sh(cmd)
20
- out = sh?(cmd)
21
- raise ShellError unless out.status.exitstatus.zero?
22
-
23
- out
24
- end
25
-
26
- def sh?(cmd)
27
- puts cmd
28
- Spud::Shell.new(cmd)
29
- end
30
-
31
- def shh(cmd)
32
- out = shh?(cmd)
33
- raise ShellError unless out.status.exitstatus.zero?
34
-
35
- out
36
- end
37
-
38
- def shh?(cmd)
39
- Spud::Shell.new(cmd)
40
- end
41
-
42
- def shhh(cmd)
43
- out = shhh?(cmd)
44
- raise ShellError, out unless out.status.exitstatus.zero?
45
-
46
- out
47
- end
48
-
49
- def shhh?(cmd)
50
- Spud::Shell.new(cmd, silent: true)
51
- end
52
-
53
- def invoke(name, *args, **kwargs)
54
- @__spud.invoke(name, *args, **kwargs)
55
- end
56
- end
57
- end
58
- end
@@ -1,7 +0,0 @@
1
- require_relative '../../error'
2
-
3
- module Spud::BuildTools
4
- module SpudBuild
5
- class ShellError < Spud::Error; end
6
- end
7
- end
@@ -1,27 +0,0 @@
1
- require_relative '../build_tool'
2
- require_relative 'file_context'
3
-
4
- module Spud::BuildTools
5
- module SpudBuild
6
- class Build < BuildTool
7
- attr_reader :rules
8
-
9
- def mount!
10
- filenames = Dir.glob('Spudfile')
11
- filenames += Dir.glob('spuds/*.rb')
12
-
13
- @rules = {}
14
- filenames.each do |filename|
15
- source = File.read(filename)
16
- @ctx = FileContext.new(@spud, filename)
17
-
18
- $LOAD_PATH << File.dirname(filename)
19
- @ctx.instance_eval(source)
20
- $LOAD_PATH.pop
21
-
22
- @rules.merge!(@ctx.__rules)
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,25 +0,0 @@
1
- require 'open3'
2
-
3
- module Spud
4
- class Shell < String
5
- attr_accessor :status
6
-
7
- def initialize(cmd, silent: false)
8
- output = StringIO.new
9
-
10
- _, out, @thread = Open3.popen2e(cmd)
11
- @status = @thread.value
12
- while line = out.gets
13
- puts line
14
- output.puts line
15
- end
16
-
17
- super(output.string)
18
- end
19
-
20
- def kill!
21
- thread.kill
22
- thread.join
23
- end
24
- end
25
- end
@@ -1,3 +0,0 @@
1
- module Spud
2
- VERSION = '0.1.14'
3
- end