spud 0.1.15 → 0.2.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.
@@ -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,34 +0,0 @@
1
- require 'stringio'
2
- require 'open3'
3
-
4
- module Spud
5
- class Shell < String
6
- def initialize(cmd, silent: false, wait: false)
7
- output = StringIO.new
8
-
9
- stdin, out, @status = Open3.popen2e(cmd)
10
- @thread = Thread.new do
11
- while line = out.gets
12
- puts line unless silent
13
- output.puts line
14
- super(output.string)
15
- end
16
-
17
- out.close
18
- stdin.close
19
- end
20
-
21
- @thread.join if wait
22
- end
23
-
24
- def status
25
- @status.value
26
- end
27
-
28
- def kill!
29
- Process.kill('KILL', @status.pid)
30
- @thread.kill
31
- @thread.join
32
- end
33
- end
34
- end
@@ -1,3 +0,0 @@
1
- module Spud
2
- VERSION = '0.1.15'
3
- end