spud 0.1.18 → 0.1.19

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,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,62 +0,0 @@
1
- require 'fileutils'
2
- require_relative 'shell_error'
3
- require_relative '../../shell'
4
- require_relative '../../error'
5
-
6
- module Spud::BuildTools
7
- module SpudBuild
8
- class RuleContext
9
- include FileUtils
10
-
11
- def initialize(spud, file_context)
12
- @__spud = spud
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 __shell(cmd, silent: false)
20
- @__spud.watch_process = Spud::Shell.(cmd, silent: silent, wait: @__spud.wait?)
21
- end
22
-
23
- def sh(cmd)
24
- out = sh?(cmd)
25
- raise ShellError, cmd unless out.status.exitstatus.zero?
26
-
27
- out
28
- end
29
-
30
- def sh?(cmd)
31
- puts cmd
32
- __shell(cmd)
33
- end
34
-
35
- def shh(cmd)
36
- out = shh?(cmd)
37
- raise ShellError, cmd unless out.status.exitstatus.zero?
38
-
39
- out
40
- end
41
-
42
- def shh?(cmd)
43
- __shell(cmd)
44
- end
45
-
46
- def shhh(cmd)
47
- out = shhh?(cmd)
48
- raise ShellError, cmd unless out.status.exitstatus.zero?
49
-
50
- out
51
- end
52
-
53
- def shhh?(cmd)
54
- __shell(cmd, silent: true)
55
- end
56
-
57
- def invoke(name, *args, **kwargs)
58
- @__spud.invoke(name, *args, **kwargs)
59
- end
60
- end
61
- end
62
- 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.18'
3
- end