spud 0.1.16 → 0.2.1

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,124 +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
- unless key_params?
32
- RuleContext.new(@spud, @file_context).instance_exec(*args, &@block)
33
- return
34
- end
35
-
36
- begin
37
- RuleContext.new(@spud, @file_context).instance_exec(*args, **kwargs, &@block)
38
- rescue ArgumentError => e
39
- raise Spud::Error, "invocation of '#{@name}' with #{e.message}"
40
- end
41
- end
42
-
43
- # Params
44
- def positional_params
45
- @positional_params ||= params.select { |p| p.first == :req }.map(&:last)
46
- end
47
-
48
- def keyword_params
49
- @keyword_params ||= params.select { |p| p.first == :key }.map(&:last)
50
- end
51
-
52
- private
53
-
54
- # Up to date checking
55
- def up_to_date?
56
- return files_up_to_date? unless files_up_to_date?.nil?
57
- deps_up_to_date?
58
- end
59
-
60
- def files_up_to_date?
61
- return nil if all_files.empty?
62
- all_files_exist?
63
- end
64
-
65
- def all_files_exist?
66
- all_files.all?(&File.method(:exist?))
67
- end
68
-
69
- def all_files
70
- @files.map(&Dir.method(:glob)).flatten
71
- end
72
-
73
- def deps_up_to_date?
74
- return nil if @deps.empty?
75
-
76
- @deps.all? do |deps, targets|
77
- targets = [targets].flatten
78
- deps = [deps].flatten
79
-
80
- latest_target = targets
81
- .map(&Dir.method(:glob))
82
- .flatten
83
- .map(&File.method(:mtime))
84
- .sort
85
- .last
86
-
87
- latest_dep = deps
88
- .map(&Dir.method(:glob))
89
- .flatten
90
- .map(&File.method(:mtime))
91
- .sort
92
- .last
93
-
94
- return false unless latest_target && latest_dep
95
- latest_target > latest_dep
96
- end
97
- end
98
-
99
- # Lambda
100
- def key_params?
101
- @key_params ||= !keyword_params.empty?
102
- end
103
-
104
- def params
105
- @params ||= lam.parameters
106
- end
107
-
108
- def lam
109
- @lam ||= build_lam
110
- end
111
-
112
- def build_lam
113
- line = @block.source_location.last - 1
114
- line = File.read(filename).split("\n")[line]
115
-
116
- match = /(do|{)\s*\|(?<params>[^|]+)\|/.match(line)
117
- return -> {} unless match
118
-
119
- param_source = match[:params]
120
- eval("-> (#{param_source}) {}")
121
- end
122
- end
123
- end
124
- end
@@ -1,59 +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
- 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 __shell(cmd, silent: false)
17
- @__spud.watch_process = Spud::Shell.(cmd, silent: silent, wait: @__spud.wait?)
18
- end
19
-
20
- def sh(cmd)
21
- out = sh?(cmd)
22
- raise ShellError, cmd unless out.status.exitstatus.zero?
23
-
24
- out
25
- end
26
-
27
- def sh?(cmd)
28
- puts cmd
29
- __shell(cmd)
30
- end
31
-
32
- def shh(cmd)
33
- out = shh?(cmd)
34
- raise ShellError, cmd unless out.status.exitstatus.zero?
35
-
36
- out
37
- end
38
-
39
- def shh?(cmd)
40
- __shell(cmd)
41
- end
42
-
43
- def shhh(cmd)
44
- out = shhh?(cmd)
45
- raise ShellError, cmd unless out.status.exitstatus.zero?
46
-
47
- out
48
- end
49
-
50
- def shhh?(cmd)
51
- __shell(cmd, silent: true)
52
- end
53
-
54
- def invoke(name, *args, **kwargs)
55
- @__spud.invoke(name, *args, **kwargs)
56
- end
57
- end
58
- end
59
- 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,38 +0,0 @@
1
- require 'stringio'
2
- require 'open3'
3
-
4
- module Spud
5
- class Shell < String
6
- def self.call(cmd, silent: false, wait: false)
7
- new(cmd, silent, wait)
8
- end
9
-
10
- def initialize(cmd, silent = false, wait = false)
11
- output = StringIO.new
12
-
13
- stdin, out, @status = Open3.popen2e(cmd)
14
- @thread = Thread.new do
15
- while line = out.gets
16
- puts line unless silent
17
- output.puts line
18
- super(output.string)
19
- end
20
-
21
- out.close
22
- stdin.close
23
- end
24
-
25
- @thread.join if wait
26
- end
27
-
28
- def status
29
- @status.value
30
- end
31
-
32
- def kill!
33
- Process.kill('KILL', @status.pid)
34
- @thread.kill
35
- @thread.join
36
- end
37
- end
38
- end
@@ -1,3 +0,0 @@
1
- module Spud
2
- VERSION = '0.1.16'
3
- end