spud 0.1.3 → 0.1.5

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
- SHA1:
3
- metadata.gz: e92e76786c206e34c509f3a8829ecdb81b3773af
4
- data.tar.gz: 1220524f9bcc66630f76b1829a1e07d4c0fbb136
2
+ SHA256:
3
+ metadata.gz: 9e652aed39adb3e3628284a91a99a667a28bef656910b92a95d8b70dc65243e7
4
+ data.tar.gz: df1335045f4539dd82290561d183ff296995027c2d609c232b7d0d92a60cb535
5
5
  SHA512:
6
- metadata.gz: c9865feae31740c55283771181008caa50f5b9e9530c016d09df7f29b3103add24838396e4003d12691438f4cc34d0bca9931c2aedbf11aa6da48587ccce4cfd
7
- data.tar.gz: e95e09f69e0218b6b19ab18502ace805686e78f1503da48f735781c6a7884e210c17f8d13ab6ee5320c0a19b020f4af5d3dbffce9abb8bc5ed003f4f79793fad
6
+ metadata.gz: 2dbca45c10d578522152d312cb1b7918488361699242e5295a81109fd089ff9d854920a3d1278b9c957fb03014ca1cc7a21b45e2be4a7df1c08ffadb8800a508
7
+ data.tar.gz: 9503fb318c69e8608d0577160a8b639d61cefd5f0921562b4acea5f39ba4dab639a3266eac073c7d13ffa87208eecfe87d61b52f6e116e358d4a41f240f49acb
@@ -9,9 +9,10 @@ module Spud
9
9
 
10
10
  def default_options
11
11
  {
12
+ help: false,
13
+ version: false,
14
+ watches: [],
12
15
  debug: false,
13
- list: false,
14
- version: false
15
16
  }
16
17
  end
17
18
 
@@ -19,8 +20,9 @@ module Spud
19
20
  arg = args[index]
20
21
 
21
22
  case arg
23
+ when '-h', '--help' then [options.merge(help: true), index + 1]
22
24
  when '-v', '--version' then [options.merge(version: true), index + 1]
23
- when '-l', '--list' then [options.merge(list: true), index + 1]
25
+ when '-w', '--watch' then [options.merge(watches: options[:watches] + [args[index + 1]]), index + 2]
24
26
  when '--debug' then [options.merge(debug: true), index + 1]
25
27
  else raise Error, "invalid option '#{arg}'"
26
28
  end
@@ -4,6 +4,10 @@ module Spud
4
4
  def invoke(*args, **kwargs)
5
5
  raise NotImplementedError
6
6
  end
7
+
8
+ def filename
9
+ raise NotImplementedError
10
+ end
7
11
  end
8
12
  end
9
13
  end
@@ -25,5 +25,9 @@ module Spud::BuildTools
25
25
  def invoke(*args, **kwargs)
26
26
  system('make', @name, *args)
27
27
  end
28
+
29
+ def filename
30
+ 'Makefile'
31
+ end
28
32
  end
29
33
  end
@@ -5,21 +5,30 @@ module Spud::BuildTools
5
5
  class FileContext
6
6
  attr_reader :rules
7
7
 
8
- def initialize(spud)
8
+ def initialize(spud, filename)
9
9
  @spud = spud
10
+ @filename = filename
10
11
  @rules = {}
11
12
  end
12
13
 
13
14
  def rule(name, *args, &block)
14
- name = name.to_s
15
15
  files = args.select { |arg| arg.is_a?(String) }
16
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)
17
+
18
+ name = prefix_rule(name)
19
+ @rules[name] = Rule.new(@spud, self, @filename, name, files, deps, block)
20
+ end
21
+
22
+ def method_missing(name, *args, &block)
23
+ rule(name, *args, &block)
24
+ end
25
+
26
+ def prefix_rule(name)
27
+ "#{prefix}#{name}"
18
28
  end
19
29
 
20
- def method_missing(method_name, *args, &block)
21
- method_name = method_name.to_s
22
- rule(method_name, *args, &block)
30
+ def prefix
31
+ @prefix ||= @filename == 'Spudfile' ? '' : "#{File.basename(@filename, '.rb')}."
23
32
  end
24
33
  end
25
34
  end
@@ -6,9 +6,12 @@ require_relative '../../error'
6
6
  module Spud::BuildTools
7
7
  module SpudBuild
8
8
  class Rule < BuildRule
9
- def initialize(spud, file_context, name, files, deps, block)
9
+ attr_reader :filename
10
+
11
+ def initialize(spud, file_context, filename, name, files, deps, block)
10
12
  @spud = spud
11
13
  @file_context = file_context
14
+ @filename = filename
12
15
  @name = name
13
16
  @files = files
14
17
  @deps = deps
@@ -43,7 +46,6 @@ module Spud::BuildTools
43
46
  def up_to_date?
44
47
  return files_up_to_date? unless files_up_to_date?.nil?
45
48
  deps_up_to_date?
46
- #files_up_to_date? && deps_up_to_date?
47
49
  end
48
50
 
49
51
  def files_up_to_date?
@@ -108,10 +110,6 @@ module Spud::BuildTools
108
110
  param_source = match[:params]
109
111
  eval("-> (#{param_source}) {}")
110
112
  end
111
-
112
- def filename
113
- 'Spudfile'
114
- end
115
113
  end
116
114
  end
117
115
  end
@@ -4,10 +4,6 @@ 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
-
11
7
  class RuleContext
12
8
  def initialize(spud, file_context)
13
9
  @spud = spud
@@ -17,68 +13,49 @@ module Spud::BuildTools
17
13
  end
18
14
  end
19
15
 
20
- def sh(*args)
21
- out = sh?(*args)
16
+ def sh(cmd)
17
+ out = sh?(cmd)
22
18
  raise ShellError unless out.status.exitstatus.zero?
23
19
 
24
20
  out
25
21
  end
26
22
 
27
- def sh?(*args)
28
- cmd = SpudBuild.join_args(*args)
23
+ def sh?(cmd)
29
24
  puts cmd
30
25
 
31
26
  out = Spud::Shell.cmd(cmd)
32
- puts out
27
+ puts out unless out.empty?
33
28
 
34
29
  out
35
30
  end
36
31
 
37
- def shh(*args)
38
- out = shh?(*args)
32
+ def shh(cmd)
33
+ out = shh?(cmd)
39
34
  raise ShellError unless out.status.exitstatus.zero?
40
35
 
41
36
  out
42
37
  end
43
38
 
44
- def shh?(*args)
45
- out = Spud::Shell.cmd(SpudBuild.join_args(*args))
46
- puts out
39
+ def shh?(cmd)
40
+ out = Spud::Shell.cmd(cmd)
41
+ puts out unless out.empty?
47
42
 
48
43
  out
49
44
  end
50
45
 
51
- def shhh(*args)
52
- out = shhh?(*args)
46
+ def shhh(cmd)
47
+ out = shhh?(cmd)
53
48
  raise ShellError, out unless out.status.exitstatus.zero?
54
49
 
55
50
  out
56
51
  end
57
52
 
58
- def shhh?(*args)
59
- Spud::Shell.cmd(SpudBuild.join_args(*args))
53
+ def shhh?(cmd)
54
+ Spud::Shell.cmd(cmd)
60
55
  end
61
56
 
62
- def invoke(rule_name, *args, **kwargs)
63
- @spud.invoke_rule(rule_name.to_s, *args, **kwargs)
64
- end
65
-
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
57
+ def invoke(name, *args, **kwargs)
58
+ @spud.invoke(name, *args, **kwargs)
82
59
  end
83
60
  end
84
61
  end
@@ -4,14 +4,20 @@ require_relative 'file_context'
4
4
  module Spud::BuildTools
5
5
  module SpudBuild
6
6
  class Build < BuildTool
7
+ attr_reader :rules
8
+
7
9
  def mount!
8
- source = File.read('Spudfile')
9
- @ctx = FileContext.new(@spud)
10
- @ctx.instance_eval(source)
11
- end
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
+ @ctx.instance_eval(source)
12
18
 
13
- def rules
14
- @ctx.rules
19
+ @rules.merge!(@ctx.rules)
20
+ end
15
21
  end
16
22
  end
17
23
  end
@@ -1,3 +1,5 @@
1
+ require 'stringio'
2
+
1
3
  require_relative 'args'
2
4
  require_relative 'version'
3
5
  require_relative 'build_tools/build_tools'
@@ -10,17 +12,27 @@ module Spud
10
12
 
11
13
  class Spud
12
14
  def run!
15
+ if options[:help]
16
+ print_help!
17
+ return
18
+ end
19
+
13
20
  if options[:version]
14
21
  puts VERSION
15
22
  return
16
23
  end
17
24
 
18
- if !rule_name || options[:list]
19
- rules.keys.each(&method(:puts))
25
+ unless rule_name
26
+ print_rules!
27
+ return
28
+ end
29
+
30
+ unless options[:watches].empty?
31
+ watch(options[:watches], rule_name, *args[:positional], **args[:keyword])
20
32
  return
21
33
  end
22
34
 
23
- invoke_rule(rule_name, *args[:positional], **args[:keyword])
35
+ invoke(rule_name, *args[:positional], **args[:keyword])
24
36
  rescue BuildTools::SpudBuild::ShellError => e
25
37
  raise e if options[:debug]
26
38
 
@@ -34,12 +46,41 @@ module Spud
34
46
  puts e.message
35
47
  end
36
48
 
37
- def invoke_rule(name, *args, **kwargs)
38
- rule = rules[name]
39
- raise Error, "no rule found for #{name}" unless rule
49
+ def invoke(name, *args, **kwargs)
50
+ rule = rules[name.to_s]
51
+ raise Error, "no rule found for '#{name}'" unless rule
40
52
  rule.invoke(*args, **kwargs)
41
53
  end
42
54
 
55
+ def watch(globs, name, *args, **kwargs)
56
+ rule = rules[name.to_s]
57
+ raise Error, "no rule found for '#{name}'" unless rule
58
+
59
+ timestamps = {}
60
+ loop do
61
+ begin
62
+ Dir.glob(*globs).each do |filename|
63
+ new_timestamp = File.mtime(filename)
64
+ old_timestamp = timestamps[filename]
65
+ unless old_timestamp
66
+ timestamps[filename] = new_timestamp
67
+ next
68
+ end
69
+
70
+ if new_timestamp > old_timestamp
71
+ timestamps[filename] = new_timestamp
72
+ invoke(name, *args, **kwargs)
73
+ break
74
+ end
75
+ end
76
+
77
+ sleep 0.1
78
+ rescue Interrupt
79
+ break
80
+ end
81
+ end
82
+ end
83
+
43
84
  private
44
85
 
45
86
  # Rules
@@ -54,6 +95,39 @@ module Spud
54
95
  .each(&:mount!)
55
96
  end
56
97
 
98
+ def print_rules!
99
+ table = rules.map { |name, rule| [name, rule.filename] }
100
+ table.unshift(%w[RULE FILENAME])
101
+
102
+ longest_rule = 'RULE'.length
103
+ longest_filename = 'FILENAME'.length
104
+ table.each do |(rule, filename)|
105
+ longest_rule = rule.length if rule.length > longest_rule
106
+ longest_filename = filename.length if filename.length > longest_filename
107
+ end
108
+
109
+ table.each do |(rule, filename)|
110
+ puts "#{rule.ljust(longest_rule)} #{filename.ljust(longest_filename)}"
111
+ end
112
+ end
113
+
114
+ # Help
115
+ def print_help!
116
+ help = StringIO.new
117
+
118
+ help.puts "spud #{VERSION}"
119
+ help.puts
120
+ help.puts 'usage:'
121
+ help.puts ' spud [options] <rule> [args]'
122
+ help.puts
123
+ help.puts 'options:'
124
+ help.puts ' -h, --help show this help dialog dialog'
125
+ help.puts ' -v, --version show spud version'
126
+ help.puts ' --debug run in debug mode'
127
+
128
+ puts help.string
129
+ end
130
+
57
131
  # Args
58
132
  def options
59
133
  @options ||= args[:options]
@@ -1,3 +1,3 @@
1
- module Spud
2
- VERSION = '0.1.3'
3
- end
1
+ module Spud
2
+ VERSION = '0.1.5'
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.3
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Booth
@@ -14,28 +14,28 @@ dependencies:
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.17'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.17'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '3.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '3.0'
41
41
  description: Spud is a build tool, written as a ruby DSL
@@ -45,23 +45,22 @@ executables:
45
45
  extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
- - lib/spud.rb
48
+ - bin/spud
49
49
  - lib/args.rb
50
- - lib/build_tools/build_tool.rb
51
50
  - lib/build_tools/build_rule.rb
51
+ - lib/build_tools/build_tool.rb
52
52
  - lib/build_tools/build_tools.rb
53
53
  - lib/build_tools/make/make.rb
54
- - lib/build_tools/spud/rule_context.rb
55
- - lib/build_tools/spud/spud.rb
56
- - lib/build_tools/spud/rule.rb
57
- - lib/build_tools/spud/spudfile.rb
54
+ - lib/build_tools/node/node.rb
58
55
  - lib/build_tools/spud/file_context.rb
56
+ - lib/build_tools/spud/rule.rb
57
+ - lib/build_tools/spud/rule_context.rb
59
58
  - lib/build_tools/spud/shell_error.rb
60
- - lib/build_tools/node/node.rb
59
+ - lib/build_tools/spud/spud.rb
60
+ - lib/error.rb
61
61
  - lib/shell.rb
62
+ - lib/spud.rb
62
63
  - lib/version.rb
63
- - lib/error.rb
64
- - bin/spud
65
64
  homepage: https://github.com/broothie/spud#readme
66
65
  licenses:
67
66
  - MIT
@@ -72,17 +71,16 @@ require_paths:
72
71
  - lib
73
72
  required_ruby_version: !ruby/object:Gem::Requirement
74
73
  requirements:
75
- - - '>='
74
+ - - ">="
76
75
  - !ruby/object:Gem::Version
77
76
  version: '0'
78
77
  required_rubygems_version: !ruby/object:Gem::Requirement
79
78
  requirements:
80
- - - '>='
79
+ - - ">="
81
80
  - !ruby/object:Gem::Version
82
81
  version: '0'
83
82
  requirements: []
84
- rubyforge_project:
85
- rubygems_version: 2.0.14.1
83
+ rubygems_version: 3.1.3
86
84
  signing_key:
87
85
  specification_version: 4
88
86
  summary: A build tool
@@ -1,12 +0,0 @@
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