spud 0.2.6 → 0.2.9

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
2
  SHA1:
3
- metadata.gz: ea40b0df03085beb5350590ed0336f4bbac760ff
4
- data.tar.gz: 93427f8d7a3d1906d8f5ac082b54ee7a343afbec
3
+ metadata.gz: c375bdd21d64dcddbdb86e7d3aef2c8e04abd0b5
4
+ data.tar.gz: 26d2be23293edfa1305ab3b28684e04a3d2d98ec
5
5
  SHA512:
6
- metadata.gz: 9e5125c223b8e4733a018cbfc31239f6f9dc9a7b6912785f3167cebf67f07886f64106f64940e1f5fe50e7516d76b5c0dddbbfe4ed53d7b2edc837a08b193068
7
- data.tar.gz: 052fb31ba933ffaf3520669830d37bf292f325c1d54072ce29642b20d3dac53d71f76ef9afb7eb5e6eb1ecd8d76da0a3dc7368c66b17b65cceaec387c1296a05
6
+ metadata.gz: 8689e8cbf001ad043337b556a7e6c981c67481eac17c10810da3d9d5f851fb0def39cb5a828d0d96022b722828447412cc3f3a730d599f756d59098df32a5a21
7
+ data.tar.gz: 033f5a3b43d2d1d99247cf75d1aa98c9d42e69f99cfaa50201f66253681388b8f55c80c1f008691cabb9e23aef4f6d5daed418d2958c6b3b4714e98121de279b
@@ -7,7 +7,6 @@ module Spud
7
7
  extend T::Sig
8
8
 
9
9
  attr_writer :help
10
- attr_writer :files
11
10
  attr_writer :inspect
12
11
 
13
12
  sig {returns(T::Array[String])}
@@ -21,11 +20,6 @@ module Spud
21
20
  !!@help
22
21
  end
23
22
 
24
- sig {returns(T::Boolean)}
25
- def files?
26
- !!@files
27
- end
28
-
29
23
  sig {returns(T::Boolean)}
30
24
  def inspect?
31
25
  !!@inspect
@@ -54,7 +54,6 @@ module Spud
54
54
  case flag
55
55
  when '-h', '--help' then options.help = true
56
56
  when '-w', '--watch' then options.watches << take!
57
- when '-f', '--files' then options.files = true
58
57
  when '-i', '--inspect' then options.inspect = true
59
58
  else raise Error, "invalid option: '#{flag}'"
60
59
  end
@@ -34,11 +34,6 @@ module Spud
34
34
  return
35
35
  end
36
36
 
37
- if options.files?
38
- lister.list_filenames!
39
- return
40
- end
41
-
42
37
  unless args.task
43
38
  lister.list_tasks!
44
39
  return
@@ -1,4 +1,4 @@
1
- # typed: true
1
+ # typed: strict
2
2
  require 'sorbet-runtime'
3
3
 
4
4
  module Spud
@@ -1,4 +1,4 @@
1
- # typed: true
1
+ # typed: strict
2
2
  require 'sorbet-runtime'
3
3
  require 'stringio'
4
4
  require 'spud/version'
@@ -18,7 +18,6 @@ module Spud
18
18
  options:
19
19
  -h, --help show this help dialog
20
20
  -w, --watch <glob> re-run task any time glob changes
21
- -f, --files list parsed files
22
21
  -i, --inspect show details about a task
23
22
  HELP
24
23
  end
@@ -7,6 +7,11 @@ module Spud
7
7
  class Lister
8
8
  extend T::Sig
9
9
 
10
+ TASKS_HEADER = T.let('TASK', String)
11
+ ORDERED_HEADER = T.let('ORDERED ARGS', String)
12
+ NAMED_HEADER = T.let('NAMED ARGS', String)
13
+ SOURCES_HEADER = T.let('SOURCE', String)
14
+
10
15
  sig {params(tasks: T::Array[TaskRunners::Task]).void}
11
16
  def initialize(tasks)
12
17
  @tasks = tasks
@@ -16,6 +21,27 @@ module Spud
16
21
  def list_tasks!
17
22
  builder = StringIO.new
18
23
 
24
+ if show_headers?
25
+ builder.write TASKS_HEADER.ljust(max_task_length)
26
+
27
+ if show_ordered_args?
28
+ builder.write ' '
29
+ builder.write ORDERED_HEADER.ljust(max_ordered_string_length)
30
+ end
31
+
32
+ if show_named_args?
33
+ builder.write ' '
34
+ builder.write NAMED_HEADER.ljust(max_named_string_length)
35
+ end
36
+
37
+ if show_sources?
38
+ builder.write ' '
39
+ builder.write SOURCES_HEADER
40
+ end
41
+
42
+ builder.write "\n"
43
+ end
44
+
19
45
  @tasks.each do |task|
20
46
  builder.write task.name.ljust(max_task_length)
21
47
 
@@ -29,9 +55,9 @@ module Spud
29
55
  builder.write task.args.named.join(' ').ljust(max_named_string_length)
30
56
  end
31
57
 
32
- if show_filenames?
58
+ if show_sources?
33
59
  builder.write ' '
34
- builder.write task.filename
60
+ builder.write task.source
35
61
  end
36
62
 
37
63
  builder.write "\n"
@@ -40,21 +66,19 @@ module Spud
40
66
  puts builder.string
41
67
  end
42
68
 
43
- sig {void}
44
- def list_filenames!
45
- puts filenames.join("\n")
46
- end
69
+ private
47
70
 
48
- sig {returns(T::Array[String])}
49
- def filenames
50
- @filenames ||= @tasks.map(&:filename).uniq
71
+ sig {returns(T::Boolean)}
72
+ def show_headers?
73
+ @show_headers ||= show_ordered_args? || show_named_args? || show_sources?
51
74
  end
52
75
 
53
- private
54
-
55
76
  sig {returns(Integer)}
56
77
  def max_task_length
57
- @max_task_length ||= @tasks.map { |task| task.name.length }.max
78
+ @max_task_length ||= @tasks
79
+ .map { |task| task.name.length }
80
+ .tap { |lengths| lengths.push(TASKS_HEADER.length) if show_headers? }
81
+ .max
58
82
  end
59
83
 
60
84
  sig {returns(Integer)}
@@ -62,6 +86,7 @@ module Spud
62
86
  @max_ordered_string_length ||= @tasks
63
87
  .map { |task| task.args.ordered.join(' ') }
64
88
  .map(&:length)
89
+ .tap { |lengths| lengths.push(ORDERED_HEADER.length) if show_headers? }
65
90
  .max
66
91
  end
67
92
 
@@ -75,6 +100,7 @@ module Spud
75
100
  @max_named_string_length ||= @tasks
76
101
  .map { |task| task.args.named.join(' ') }
77
102
  .map(&:length)
103
+ .tap { |lengths| lengths.push(NAMED_HEADER.length) if show_headers? }
78
104
  .max
79
105
  end
80
106
 
@@ -84,8 +110,13 @@ module Spud
84
110
  end
85
111
 
86
112
  sig {returns(T::Boolean)}
87
- def show_filenames?
88
- filenames.length > 1
113
+ def show_sources?
114
+ sources.length > 1
115
+ end
116
+
117
+ sig {returns(T::Array[String])}
118
+ def sources
119
+ @filenames ||= @tasks.map(&:source).uniq
89
120
  end
90
121
  end
91
122
  end
@@ -0,0 +1,56 @@
1
+ # typed: true
2
+ require 'sorbet-runtime'
3
+ require 'yaml'
4
+ require 'spud/driver'
5
+ require 'spud/shell/command'
6
+ require 'spud/task_runners/task'
7
+
8
+ module Spud
9
+ module TaskRunners
10
+ module DockerCompose
11
+ class Task < TaskRunners::Task
12
+ extend T::Sig
13
+
14
+ sig {override.returns(String)}
15
+ attr_reader :name
16
+
17
+ sig {override.params(driver: Driver).returns(T::Array[TaskRunners::Task])}
18
+ def self.tasks(driver)
19
+ return [] unless File.exist?('docker-compose.yml')
20
+
21
+ if `command -v docker-compose`.empty?
22
+ puts 'docker-compose.yml detected, but no installation of `docker-compose` exists. Skipping docker-compose...'
23
+ return []
24
+ end
25
+
26
+ source = File.read('docker-compose.yml')
27
+ contents = YAML.load(source)
28
+ services = contents['services']
29
+ services.map { |name, service| new(driver, name, service) }
30
+ end
31
+
32
+ sig {params(driver: Driver, name: String, service: T::Hash[String, T.untyped]).void}
33
+ def initialize(driver, name, service)
34
+ @driver = driver
35
+ @name = name
36
+ @service = service
37
+ end
38
+
39
+ sig {override.params(ordered: T::Array[String], named: T::Hash[String, String]).returns(T.untyped)}
40
+ def invoke(ordered, named)
41
+ system("docker-compose up #{@name} #{ordered.join(' ')}")
42
+ end
43
+
44
+ sig {override.returns(String)}
45
+ def source
46
+ 'docker-compose.yml'
47
+ end
48
+
49
+ sig {override.returns(String)}
50
+ def details
51
+ YAML.dump(@name => @service)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -25,30 +25,30 @@ module Spud
25
25
 
26
26
  source = File.read('Makefile')
27
27
  T.unsafe(source.scan(/^(\S+):.*/)).map(&:first).map do |name|
28
- new(driver, name)
28
+ new(driver, name, source)
29
29
  end
30
30
  end
31
31
 
32
- sig {params(driver: Driver, name: String).void}
33
- def initialize(driver, name)
32
+ sig {params(driver: Driver, name: String, make_source: String).void}
33
+ def initialize(driver, name, make_source)
34
34
  @driver = driver
35
35
  @name = name
36
+ @make_source = make_source
36
37
  end
37
38
 
38
39
  sig {override.params(ordered: T::Array[String], named: T::Hash[String, String]).returns(T.untyped)}
39
40
  def invoke(ordered, named)
40
- Shell::Command.("make #{name}", driver: @driver)
41
+ system("make #{name}")
41
42
  end
42
43
 
43
44
  sig {override.returns(String)}
44
- def filename
45
+ def source
45
46
  'Makefile'
46
47
  end
47
48
 
48
49
  sig {override.returns(String)}
49
50
  def details
50
- source = File.read('Makefile')
51
- lines = source.split("\n")
51
+ lines = @make_source.split("\n")
52
52
  cursor = 0
53
53
 
54
54
  cursor += 1 until lines[cursor]&.start_with?(name)
@@ -36,8 +36,8 @@ module Spud
36
36
  end
37
37
 
38
38
  source = File.read('package.json')
39
- json = JSON.parse(source)
40
- scripts = json['scripts']
39
+ contents = JSON.parse(source)
40
+ scripts = contents['scripts']
41
41
  return [] unless scripts
42
42
 
43
43
  scripts.keys.map { |name| new(driver, name, command, scripts) }
@@ -53,11 +53,11 @@ module Spud
53
53
 
54
54
  sig {override.params(ordered: T::Array[String], named: T::Hash[String, String]).returns(T.untyped)}
55
55
  def invoke(ordered, named)
56
- Shell::Command.("#{@command} run #{name}", driver: @driver)
56
+ system("#{@command} run #{name}")
57
57
  end
58
58
 
59
59
  sig {override.returns(String)}
60
- def filename
60
+ def source
61
61
  'package.json'
62
62
  end
63
63
 
@@ -0,0 +1,59 @@
1
+ # typed: true
2
+ require 'sorbet-runtime'
3
+ require 'rake'
4
+ require 'spud/driver'
5
+ require 'spud/task_arg'
6
+ require 'spud/task_args'
7
+ require 'spud/task_runners/task'
8
+
9
+ module Spud
10
+ module TaskRunners
11
+ module RakeTaskRunner
12
+ class Task < TaskRunners::Task
13
+ extend T::Sig
14
+
15
+ sig {override.params(driver: Driver).returns(T::Array[TaskRunners::Task])}
16
+ def self.tasks(driver)
17
+ app = Rake.application
18
+ rakefile = app.find_rakefile_location&.first
19
+ return [] if rakefile.nil?
20
+
21
+ app.init('rake', [])
22
+ app.load_rakefile
23
+
24
+ app.tasks.map(&method(:new))
25
+ end
26
+
27
+ sig {params(task: Rake::Task).void}
28
+ def initialize(task)
29
+ @rake_task = task
30
+ end
31
+
32
+ sig {override.params(ordered: T::Array[String], named: T::Hash[String, String]).returns(T.untyped)}
33
+ def invoke(ordered, named)
34
+ T.unsafe(@rake_task).invoke(*ordered)
35
+ end
36
+
37
+ sig {override.returns(String)}
38
+ def name
39
+ @rake_task.name
40
+ end
41
+
42
+ sig {override.returns(String)}
43
+ def source
44
+ 'rake'
45
+ end
46
+
47
+ sig {override.returns(TaskArgs)}
48
+ def args
49
+ TaskArgs.new(@rake_task.arg_names.map { |arg_name| TaskArg.new(arg_name.to_s, 'ordered') })
50
+ end
51
+
52
+ sig {override.returns(String)}
53
+ def details
54
+ "#{@rake_task.name_with_args}"
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -16,8 +16,9 @@ module Spud
16
16
  class Task < TaskRunners::Task
17
17
  extend T::Sig
18
18
 
19
- sig {override.returns(String)}
19
+ sig {returns(String)}
20
20
  attr_reader :filename
21
+ alias source filename
21
22
 
22
23
  sig {override.returns(String)}
23
24
  attr_reader :name
@@ -27,7 +28,7 @@ module Spud
27
28
 
28
29
  sig {override.params(driver: Driver).returns(T::Array[TaskRunners::Task])}
29
30
  def self.tasks(driver)
30
- Dir['**/Spudfile', '**/*.spud'].flat_map { |filename| FileDSL.run(driver, filename) }
31
+ Dir['Spudfile', '*.spud'].flat_map { |filename| FileDSL.run(driver, filename) }
31
32
  end
32
33
 
33
34
  sig {params(filename: String, name: String).returns(String)}
@@ -17,13 +17,9 @@ module Spud
17
17
  def name; end
18
18
 
19
19
  sig {abstract.returns(String)}
20
- def filename; end
20
+ def source; end
21
21
 
22
- sig do
23
- abstract
24
- .params(ordered: T::Array[String], named: T::Hash[String, String])
25
- .returns(T.untyped)
26
- end
22
+ sig {abstract.params(ordered: T::Array[String], named: T::Hash[String, String]).returns(T.untyped)}
27
23
  def invoke(ordered, named); end
28
24
 
29
25
  sig {overridable.returns(TaskArgs)}
@@ -1,9 +1,11 @@
1
- # typed: strict
1
+ # typed: true
2
2
  require 'sorbet-runtime'
3
3
  require 'spud/task_runners/task'
4
4
  require 'spud/task_runners/spud_task_runner/task'
5
+ require 'spud/task_runners/rake_task_runner/task'
5
6
  require 'spud/task_runners/make/task'
6
7
  require 'spud/task_runners/package.json/task'
8
+ require 'spud/task_runners/docker-compose/task'
7
9
 
8
10
  module Spud
9
11
  module TaskRunners
@@ -12,14 +14,15 @@ module Spud
12
14
  sig {returns(T::Array[T.class_of(Task)])}
13
15
  def self.get
14
16
  # Ordered by priority
15
- T.let(
16
- [
17
- T.let(SpudTaskRunner::Task, T.class_of(Task)),
18
- T.let(Make::Task, T.class_of(Task)),
19
- T.let(PackageJSON::Task, T.class_of(Task)),
20
- ],
21
- T::Array[T.class_of(Task)]
22
- )
17
+ runners = [
18
+ SpudTaskRunner::Task,
19
+ RakeTaskRunner::Task,
20
+ Make::Task,
21
+ PackageJSON::Task,
22
+ DockerCompose::Task,
23
+ ]
24
+
25
+ T.let(runners, T::Array[T.class_of(Task)])
23
26
  end
24
27
  end
25
28
  end
@@ -1,4 +1,4 @@
1
1
  # typed: strict
2
2
  module Spud
3
- VERSION = '0.2.6'
3
+ VERSION = '0.2.9'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spud
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.2.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Booth
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-23 00:00:00.000000000 Z
11
+ date: 2020-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sorbet-runtime
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.5.6100
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '13.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '13.0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rspec
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -101,8 +115,10 @@ files:
101
115
  - lib/spud/shell/result.rb
102
116
  - lib/spud/task_arg.rb
103
117
  - lib/spud/task_args.rb
118
+ - lib/spud/task_runners/docker-compose/task.rb
104
119
  - lib/spud/task_runners/make/task.rb
105
120
  - lib/spud/task_runners/package.json/task.rb
121
+ - lib/spud/task_runners/rake_task_runner/task.rb
106
122
  - lib/spud/task_runners/spud_task_runner/dependency.rb
107
123
  - lib/spud/task_runners/spud_task_runner/file_dsl.rb
108
124
  - lib/spud/task_runners/spud_task_runner/task.rb