spud 0.1.3 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
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