doit 0.3.0 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/rake.yml +30 -0
- data/.gitignore +2 -0
- data/.rubocop.yml +11 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -1
- data/.travis.yml +17 -3
- data/.watchr +14 -8
- data/Gemfile +3 -9
- data/Gemfile.lock +40 -15
- data/LICENSE +1 -1
- data/README.md +4 -2
- data/bin/doit +14 -11
- data/doit.gemspec +21 -15
- data/lib/doit.rb +15 -13
- data/lib/globals.rb +12 -1
- data/lib/import.rb +14 -6
- data/lib/my.rb +5 -4
- data/lib/run.rb +8 -6
- data/lib/what.rb +19 -16
- data/test/doit_test.rb +18 -19
- data/test/import_test.rb +10 -10
- data/test/my_test.rb +6 -6
- data/test/run_test.rb +10 -10
- data/test/test_helper.rb +10 -7
- data/test/what_test.rb +18 -19
- metadata +63 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3eb0f0645c47b1d209a75de9fcc49d0b99752769764599b0fac889b3ad6423f0
|
4
|
+
data.tar.gz: 726b353579f963e6655bf56fdf49dfcd60004826ee838e3bd7f5a6c168e48bd7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6234c4eeb92cc4a76c59836f7292e1c806526909e0a74d7dfa5a7a21631c56af1f041d7a149878013def8a9d6ceebd74b2f848d27a4caaec69702742a7807a74
|
7
|
+
data.tar.gz: d825858a3dd19251ee4dfaaddaef4aef8e338dfc9d6219be66119a298fc149ff3a7db2fc400051ee699a7d30bc6e11b8152597b55b2fa9963b82f1456e500190
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# see also https://github.com/whitequark/parser/blob/master/.github/workflows/test.yml
|
2
|
+
name: Rake
|
3
|
+
|
4
|
+
#on: [push, pull_request]
|
5
|
+
on: [push]
|
6
|
+
|
7
|
+
jobs:
|
8
|
+
test:
|
9
|
+
strategy:
|
10
|
+
fail-fast: false
|
11
|
+
matrix:
|
12
|
+
# os: [ubuntu-latest, macos-latest]
|
13
|
+
os: [ubuntu-latest]
|
14
|
+
# Due to https://github.com/actions/runner/issues/849, we have to use quotes for '3.0'
|
15
|
+
# ruby: [2.5, 2.6, 2.7, '3.0', head, jruby, jruby-head, truffleruby, truffleruby-head]
|
16
|
+
ruby: ["2.7.2", "2.7.3", "3.0.1"]
|
17
|
+
test_command: ["bundle exec rake test"]
|
18
|
+
runs-on: ${{ matrix.os }}
|
19
|
+
|
20
|
+
steps:
|
21
|
+
- uses: actions/checkout@v2
|
22
|
+
- uses: ruby/setup-ruby@v1
|
23
|
+
with:
|
24
|
+
ruby-version: ${{ matrix.ruby }}
|
25
|
+
- name: Bundle install
|
26
|
+
run: |
|
27
|
+
bundle config path /home/runner/bundle
|
28
|
+
bundle install
|
29
|
+
bundle update
|
30
|
+
- run: ${{ matrix.test_command }}
|
data/.gitignore
ADDED
data/.rubocop.yml
ADDED
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rails-6.1
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby-2.2
|
1
|
+
ruby-2.7.2
|
data/.travis.yml
CHANGED
@@ -1,8 +1,22 @@
|
|
1
1
|
language: ruby
|
2
|
-
|
2
|
+
|
3
|
+
#bundler_args: --without production
|
4
|
+
bundle config set without production
|
5
|
+
script: "bundle exec rake test"
|
6
|
+
|
3
7
|
rvm:
|
4
|
-
|
5
|
-
- 2.
|
8
|
+
- 2.7.2 # 2020-10-26
|
9
|
+
# - 2.6.6 # 2020-07-17
|
10
|
+
# - 2.6.5 # 2019-10-29
|
11
|
+
# - 2.6.4 # 2019-10-15
|
12
|
+
# - 2.6.3 # 2019-06-21
|
13
|
+
# - 2.6.1
|
14
|
+
# - 2.5.1
|
15
|
+
# - 2.5.0
|
16
|
+
# - 2.4.1
|
17
|
+
# - 2.3.0 # tested; no longer in CI
|
18
|
+
# - 2.2.3 # tested; no longer in CI
|
19
|
+
# - 2.0.0 # tested; no longer in CI
|
6
20
|
|
7
21
|
notifications:
|
8
22
|
email: false
|
data/.watchr
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
TESTING = %w[test]
|
1
2
|
HH = '#' * 22 unless defined?(HH)
|
2
3
|
H = '#' * 5 unless defined?(H)
|
3
4
|
|
@@ -16,32 +17,37 @@ end
|
|
16
17
|
|
17
18
|
def run_it(type, file)
|
18
19
|
case type
|
19
|
-
when 'test'; run %
|
20
|
-
when 'spec'; run %Q{spring rspec -X #{file}}
|
20
|
+
when 'test'; run %(bundle exec ruby -I test #{file})
|
21
21
|
else; puts "#{H} unknown type: #{type}, file: #{file}"
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
def run_all_tests
|
26
26
|
puts "\n#{HH} Running all tests #{HH}\n"
|
27
|
-
|
27
|
+
TESTING.each { |dir| run "bundle exec rake #{dir}" if File.exist?(dir) }
|
28
28
|
end
|
29
29
|
|
30
30
|
def run_matching_files(base)
|
31
31
|
base = base.split('_').first
|
32
|
-
|
32
|
+
TESTING.each { |type|
|
33
33
|
files = Dir["#{type}/**/*.rb"].select { |file| file =~ /#{base}_.*\.rb/ }
|
34
34
|
run_it type, files.join(' ') unless files.empty?
|
35
35
|
}
|
36
36
|
end
|
37
37
|
|
38
|
-
|
38
|
+
TESTING.each { |type|
|
39
39
|
watch("#{type}/#{type}_helper\.rb") { run_all_tests }
|
40
|
+
watch('lib/.*\.rb') { run_all_tests }
|
40
41
|
watch("#{type}/.*/*_#{type}\.rb") { |match| run_it type, match[0] }
|
42
|
+
watch("#{type}/data/(.*)\.rb") { |match|
|
43
|
+
m1 = match[1]
|
44
|
+
run_matching_files("#{type}/#{m1}/#{m1}_#{type}.rb")
|
45
|
+
}
|
41
46
|
}
|
42
|
-
|
43
|
-
|
44
|
-
|
47
|
+
|
48
|
+
%w[rb erb haml slim].each { |type|
|
49
|
+
watch("app/.*/(.*)\.#{type}") { |match|
|
50
|
+
run_matching_files(match[1])
|
45
51
|
}
|
46
52
|
}
|
47
53
|
|
data/Gemfile
CHANGED
@@ -1,15 +1,9 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
|
3
|
+
gemspec
|
4
4
|
|
5
5
|
group :test do
|
6
|
-
gem 'simplecov', require: false
|
7
|
-
end
|
8
|
-
|
9
|
-
group :test, :development do
|
10
|
-
gem 'rake'
|
11
6
|
gem 'observr'
|
12
|
-
gem '
|
7
|
+
gem 'rubocop', require: false
|
8
|
+
gem 'simplecov', require: false
|
13
9
|
end
|
14
|
-
|
15
|
-
gemspec
|
data/Gemfile.lock
CHANGED
@@ -1,31 +1,56 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
doit (0.
|
4
|
+
doit (1.0.2)
|
5
5
|
micro-optparse (~> 1)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
|
11
|
-
|
12
|
-
micro-optparse (1.2.
|
13
|
-
minitest (5.
|
10
|
+
ast (2.4.2)
|
11
|
+
docile (1.4.0)
|
12
|
+
micro-optparse (1.2.1)
|
13
|
+
minitest (5.14.4)
|
14
14
|
observr (1.0.5)
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
15
|
+
parallel (1.20.1)
|
16
|
+
parser (3.0.1.1)
|
17
|
+
ast (~> 2.4.1)
|
18
|
+
rainbow (3.0.0)
|
19
|
+
rake (13.0.3)
|
20
|
+
regexp_parser (2.1.1)
|
21
|
+
rexml (3.2.5)
|
22
|
+
rubocop (1.17.0)
|
23
|
+
parallel (~> 1.10)
|
24
|
+
parser (>= 3.0.0.0)
|
25
|
+
rainbow (>= 2.2.2, < 4.0)
|
26
|
+
regexp_parser (>= 1.8, < 3.0)
|
27
|
+
rexml
|
28
|
+
rubocop-ast (>= 1.7.0, < 2.0)
|
29
|
+
ruby-progressbar (~> 1.7)
|
30
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
31
|
+
rubocop-ast (1.7.0)
|
32
|
+
parser (>= 3.0.1.1)
|
33
|
+
ruby-progressbar (1.11.0)
|
34
|
+
simplecov (0.21.2)
|
35
|
+
docile (~> 1.1)
|
36
|
+
simplecov-html (~> 0.11)
|
37
|
+
simplecov_json_formatter (~> 0.1)
|
38
|
+
simplecov-html (0.12.3)
|
39
|
+
simplecov_json_formatter (0.1.3)
|
40
|
+
unicode-display_width (2.0.0)
|
21
41
|
|
22
42
|
PLATFORMS
|
23
|
-
|
43
|
+
x86_64-linux
|
24
44
|
|
25
45
|
DEPENDENCIES
|
46
|
+
bundler (~> 2)
|
26
47
|
doit!
|
27
|
-
micro-optparse
|
28
|
-
minitest
|
48
|
+
micro-optparse (~> 1)
|
49
|
+
minitest (~> 5)
|
29
50
|
observr
|
30
|
-
rake
|
51
|
+
rake (~> 13)
|
52
|
+
rubocop
|
31
53
|
simplecov
|
54
|
+
|
55
|
+
BUNDLED WITH
|
56
|
+
2.2.17
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -23,18 +23,20 @@ Options
|
|
23
23
|
-------
|
24
24
|
-l, --[no-]list Lists available scripts
|
25
25
|
-r, --remote ["host"] remote host or comma separated hosts
|
26
|
+
-e, --[no-]each Lists each remote command (no execution)
|
26
27
|
-s, --[no-]silent run silently; suppress output
|
27
28
|
-v, --[no-]verbose Enable verbose output
|
28
29
|
-n, --[no-]noop Suppress execution of commannds
|
29
30
|
-h, --help Show this message
|
30
31
|
-V, --version Print version
|
31
32
|
|
33
|
+
|
32
34
|
File Structure
|
33
35
|
--------------
|
34
36
|
~/.doit/deploy # chmod +x .doit/deploy
|
35
37
|
~/.doit/deploy.yml
|
36
38
|
$PROJ/.doit/deploy.yml # overwrites $HOME(~/) script/configuration
|
37
|
-
$PROJ/.doit/push # chmod +x .doit/
|
39
|
+
$PROJ/.doit/push # chmod +x .doit/push
|
38
40
|
$PROJ/.doit/push.yml
|
39
41
|
|
40
42
|
$PROJ/.doit/push
|
@@ -73,4 +75,4 @@ $PROJ/.doit/push
|
|
73
75
|
- bob@sample.com
|
74
76
|
- alice@customer.com
|
75
77
|
|
76
|
-
Copyright (c) 2014-
|
78
|
+
Copyright (c) 2014-2019 [Dittmar Krall], released under the MIT license.
|
data/bin/doit
CHANGED
@@ -1,21 +1,24 @@
|
|
1
|
-
|
1
|
+
#! /usr/bin/env ruby
|
2
2
|
|
3
|
-
lib = File.expand_path('
|
4
|
-
$:.unshift lib unless $:.include?(lib)
|
3
|
+
lib = File.expand_path('../lib/', __dir__)
|
4
|
+
# $:.unshift lib unless $:.include?(lib)
|
5
|
+
$LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
|
5
6
|
|
6
7
|
require 'doit'
|
7
8
|
require 'micro-optparse'
|
8
9
|
require 'globals'
|
10
|
+
require 'what'
|
9
11
|
|
10
12
|
options = Parser.new do |p|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
13
|
+
p.banner = 'Usage: doit script... [options] # execute locally or remotely'
|
14
|
+
p.version = "doit #{Globals::VERSION}"
|
15
|
+
p.option :list, 'Lists available scripts'
|
16
|
+
p.option :each, 'Lists each remote command (no execution)'
|
17
|
+
p.option :remote, 'Remote host or comma separated hosts',
|
18
|
+
default: '...', optional: true
|
19
|
+
p.option :silent, 'Run silently; suppress output'
|
20
|
+
p.option :verbose, 'Enable verbose output'
|
21
|
+
p.option :noop, 'Suppress execution of commannds'
|
19
22
|
end.process!
|
20
23
|
|
21
24
|
Doit.start(options)
|
data/doit.gemspec
CHANGED
@@ -1,22 +1,28 @@
|
|
1
|
-
|
1
|
+
$LOAD_PATH.push File.expand_path('lib', __dir__)
|
2
2
|
require 'globals'
|
3
3
|
|
4
|
-
Gem::Specification.new do |
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = 'doit'
|
6
|
+
s.version = Globals::VERSION
|
7
|
+
s.summary = 'Simple local & remote script executor'
|
8
|
+
s.description = 'Run good old shell/bash scripts locally or remotely(ssh).'
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
s.authors = ['Dittmar Krall']
|
11
|
+
s.email = 'dittmar.krall@matique.de'
|
12
|
+
s.homepage = 'http://www.matique.de'
|
13
|
+
s.license = 'MIT'
|
14
14
|
|
15
|
-
|
15
|
+
s.add_dependency 'micro-optparse', '~> 1'
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- test`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`
|
20
|
+
.split("\n").map { |f| File.basename(f) }
|
21
|
+
s.require_paths = ['lib']
|
21
22
|
|
23
|
+
s.add_development_dependency 'bundler', '~> 2'
|
24
|
+
s.add_development_dependency 'rake', '~> 13'
|
25
|
+
|
26
|
+
s.add_development_dependency 'micro-optparse', '~> 1'
|
27
|
+
s.add_development_dependency 'minitest', '~> 5'
|
22
28
|
end
|
data/lib/doit.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
+
# rubocop: disable all
|
2
|
+
|
1
3
|
require 'my'
|
2
4
|
require 'run'
|
3
5
|
require 'import'
|
4
|
-
require 'what'
|
5
6
|
|
6
7
|
Doit = Object.new
|
7
8
|
class << Doit
|
@@ -17,7 +18,8 @@ class << Doit
|
|
17
18
|
end
|
18
19
|
|
19
20
|
def options
|
20
|
-
@options
|
21
|
+
@options ||= {}
|
22
|
+
@options
|
21
23
|
end
|
22
24
|
|
23
25
|
def list
|
@@ -25,10 +27,12 @@ class << Doit
|
|
25
27
|
hsh.sort.each { |abb, long|
|
26
28
|
puts "#{abb}\t- #{long}"
|
27
29
|
next unless options[:verbose]
|
30
|
+
|
28
31
|
lines = `grep -i 'usage\\|summary' #{long} | grep '^#'`.split("\n")
|
29
32
|
lines.each { |line|
|
30
33
|
next unless line
|
31
34
|
next if line.empty?
|
35
|
+
|
32
36
|
puts "\t #{line}"
|
33
37
|
}
|
34
38
|
}
|
@@ -40,11 +44,9 @@ class << Doit
|
|
40
44
|
puts "doit: script '#{name}' not found"
|
41
45
|
return
|
42
46
|
end
|
43
|
-
What.init(Import.
|
47
|
+
What.init(Import.config)
|
44
48
|
|
45
|
-
What.where.each { |w|
|
46
|
-
puts "doit #{name} -r #{w}"
|
47
|
-
} if options[:each]
|
49
|
+
What.where.each { |w| puts "doit #{name} -r #{w}" } if options[:each]
|
48
50
|
|
49
51
|
where_loop unless options[:each]
|
50
52
|
end
|
@@ -56,18 +58,18 @@ class << Doit
|
|
56
58
|
}
|
57
59
|
end
|
58
60
|
|
59
|
-
def matrix_loop(
|
61
|
+
def matrix_loop(where)
|
60
62
|
What.matrix.each { |mm|
|
61
63
|
prefix = mm.empty? ? '' : "#{What.to_env(mm)}\n"
|
62
64
|
|
63
65
|
What.env.each { |en|
|
64
|
-
|
66
|
+
prefix2 = en.empty? ? '' : "#{en}\n"
|
65
67
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
68
|
+
cmds = Import.script
|
69
|
+
cmds = @argv + prefix + prefix2 + cmds
|
70
|
+
Run.init cmds, where
|
71
|
+
Run.info if options[:verbose]
|
72
|
+
Run.run
|
71
73
|
}
|
72
74
|
}
|
73
75
|
end
|
data/lib/globals.rb
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
# rubocop: disable all
|
2
|
+
|
1
3
|
module Globals
|
2
|
-
VERSION = '0.
|
4
|
+
VERSION = '1.0.2' # 2021-06-26
|
5
|
+
# VERSION = '1.0.1' # 2021-04-21
|
6
|
+
# VERSION = '1.0.0' # 2020-10-26
|
7
|
+
# VERSION = '0.3.9' # 2020-07-17
|
8
|
+
# VERSION = '0.3.8' # 2020-02-26
|
9
|
+
# VERSION = '0.3.7' # 2019-10-15
|
10
|
+
# VERSION = '0.3.6' # 2019-03-06
|
11
|
+
# VERSION = '0.3.5' # 2018-09-11
|
12
|
+
# VERSION = '0.3.4' # 2018-08-19
|
13
|
+
# VERSION = '0.3.3'
|
3
14
|
end
|
data/lib/import.rb
CHANGED
@@ -1,11 +1,20 @@
|
|
1
|
+
# rubocop: disable all
|
2
|
+
|
1
3
|
require 'pathname'
|
2
4
|
require 'erb'
|
3
5
|
|
4
6
|
Import = Object.new
|
5
7
|
class << Import
|
6
8
|
|
7
|
-
def script
|
8
|
-
|
9
|
+
def script
|
10
|
+
@script ||= nil
|
11
|
+
@script
|
12
|
+
end
|
13
|
+
|
14
|
+
def config
|
15
|
+
@config ||= nil
|
16
|
+
@config
|
17
|
+
end
|
9
18
|
|
10
19
|
def init(name)
|
11
20
|
@script = read(name)
|
@@ -21,11 +30,10 @@ class << Import
|
|
21
30
|
def info
|
22
31
|
return unless Doit.options[:verbose]
|
23
32
|
|
24
|
-
My.verbose
|
25
|
-
My.verbose
|
33
|
+
My.verbose 'SCRIPT', @script
|
34
|
+
My.verbose 'CONFIG(yml)', @config
|
26
35
|
end
|
27
36
|
|
28
|
-
|
29
37
|
private
|
30
38
|
def list2
|
31
39
|
res = {}
|
@@ -54,7 +62,7 @@ class << Import
|
|
54
62
|
def try_ascend(filename)
|
55
63
|
Pathname.pwd.ascend { |dir|
|
56
64
|
str = dir + filename
|
57
|
-
return File.read(str) if File.
|
65
|
+
return File.read(str) if File.exist?(str)
|
58
66
|
}
|
59
67
|
nil
|
60
68
|
end
|
data/lib/my.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
My = Object.new
|
2
|
-
class << My
|
3
4
|
|
5
|
+
class << My
|
4
6
|
def verbose(what, txt)
|
5
|
-
marker = '*'*4
|
7
|
+
marker = '*' * 4
|
6
8
|
arr = txt
|
7
|
-
arr = txt ? txt.split("\n") : ''
|
9
|
+
arr = txt ? txt.split("\n") : '' unless txt.is_a?(Array)
|
8
10
|
if arr.length > 1
|
9
11
|
puts "#{marker} #{what} #{marker}"
|
10
12
|
puts txt
|
@@ -13,5 +15,4 @@ class << My
|
|
13
15
|
puts "#{marker} #{what}: #{txt}"
|
14
16
|
end
|
15
17
|
end
|
16
|
-
|
17
18
|
end
|
data/lib/run.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
+
# rubocop: disable all
|
2
|
+
|
1
3
|
Run = Object.new
|
2
4
|
class << Run
|
3
5
|
|
4
|
-
|
6
|
+
attr_reader :ssh
|
5
7
|
|
6
8
|
def init(cmds, where)
|
7
|
-
aster = '*'*24
|
9
|
+
aster = '*' * 24
|
8
10
|
puts "#{aster} #{where} #{aster}"
|
9
11
|
@ssh = nil
|
10
12
|
@cmds = cmds
|
@@ -18,7 +20,7 @@ class << Run
|
|
18
20
|
dir = where
|
19
21
|
end
|
20
22
|
|
21
|
-
@cmds = "cd; cd #{dir}\n" + @cmds unless dir
|
23
|
+
@cmds = "cd; cd #{dir}\n" + @cmds unless dir&.empty?
|
22
24
|
@ssh = "ssh #{host}" if host
|
23
25
|
end
|
24
26
|
|
@@ -33,10 +35,10 @@ class << Run
|
|
33
35
|
cmd = "cat <<'#{here}\' | #{@ssh} bash -i -l #{silent} 2>&1"
|
34
36
|
cmds = "#{cmd}\n#{@cmds}#{here}\n"
|
35
37
|
|
36
|
-
|
37
|
-
IO.popen(cmds) { |p| p.each { |f| puts f } }
|
38
|
-
else
|
38
|
+
if Doit.options[:noop]
|
39
39
|
My.verbose('noop', cmds)
|
40
|
+
else
|
41
|
+
IO.popen(cmds) { |p| p.each { |f| puts f } }
|
40
42
|
end
|
41
43
|
end
|
42
44
|
|
data/lib/what.rb
CHANGED
@@ -1,14 +1,16 @@
|
|
1
|
+
# rubocop: disable all
|
2
|
+
|
1
3
|
require 'yaml'
|
2
4
|
require 'doit'
|
3
5
|
|
4
6
|
What = Object.new
|
5
7
|
class << What
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
-
|
9
|
+
attr_reader :matrix
|
10
|
+
attr_reader :where
|
11
|
+
attr_reader :env
|
10
12
|
|
11
|
-
def init(
|
13
|
+
def init(config)
|
12
14
|
@matrix = nil
|
13
15
|
@yml = (config && YAML.load(config)) || {}
|
14
16
|
|
@@ -24,7 +26,7 @@ class << What
|
|
24
26
|
|
25
27
|
build_matrix
|
26
28
|
@matrix ||= []
|
27
|
-
@matrix = [@matrix] unless
|
29
|
+
@matrix = [@matrix] unless @matrix.first.is_a?(Array)
|
28
30
|
@matrix.map! { |m| m.flatten.inject({}) { |hsh, h| hsh.merge(h) } }
|
29
31
|
info
|
30
32
|
end
|
@@ -37,24 +39,25 @@ class << What
|
|
37
39
|
def info
|
38
40
|
return unless Doit.options[:verbose]
|
39
41
|
|
40
|
-
My.verbose
|
41
|
-
My.verbose
|
42
|
-
My.verbose
|
42
|
+
My.verbose 'where', @where
|
43
|
+
My.verbose 'matrix', @matrix
|
44
|
+
My.verbose 'env', @env
|
43
45
|
end
|
44
46
|
|
45
|
-
|
46
47
|
private
|
47
48
|
def build_matrix
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
49
|
+
return if @yml.empty?
|
50
|
+
|
51
|
+
key, value = @yml.first
|
52
|
+
@yml.delete(key)
|
53
|
+
add_to_matrix(key, value)
|
54
|
+
build_matrix
|
54
55
|
end
|
55
56
|
|
56
57
|
def add_to_matrix(key, val)
|
57
|
-
arr = Array
|
58
|
+
arr = val.is_a?(Array) ?
|
59
|
+
val.collect { |v| [{ key => v }] } :
|
60
|
+
[{ key => val }]
|
58
61
|
@matrix = @matrix ? @matrix.product(arr) : arr
|
59
62
|
end
|
60
63
|
|
data/test/doit_test.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'test_helper'
|
2
|
-
require 'doit'
|
3
2
|
|
4
3
|
describe Doit do
|
5
4
|
|
@@ -7,48 +6,48 @@ describe Doit do
|
|
7
6
|
Doit.start({})
|
8
7
|
end
|
9
8
|
|
10
|
-
it
|
11
|
-
out = noop {
|
9
|
+
it 'start' do
|
10
|
+
out = noop {}
|
12
11
|
assert_equal '', out
|
13
12
|
end
|
14
13
|
|
15
|
-
it
|
14
|
+
it 'options' do
|
16
15
|
assert_equal({}, Doit.options)
|
17
16
|
end
|
18
17
|
|
19
|
-
it
|
18
|
+
it 'list' do
|
20
19
|
out = noop {
|
21
20
|
Doit.list
|
22
21
|
}
|
23
|
-
assert_match
|
22
|
+
assert_match(/\/\.doit/, out)
|
24
23
|
end
|
25
24
|
|
26
|
-
it
|
27
|
-
out,
|
25
|
+
it 'execute' do
|
26
|
+
out, _err = capture_io do
|
28
27
|
Doit.execute('hello')
|
29
28
|
end
|
30
|
-
assert_match
|
29
|
+
assert_match(/\nHello\n/, out)
|
31
30
|
end
|
32
31
|
|
33
|
-
it
|
34
|
-
out,
|
32
|
+
it 'execute with unknown script' do
|
33
|
+
out, _err = capture_io do
|
35
34
|
Doit.execute('______unknown______')
|
36
35
|
end
|
37
|
-
assert_match
|
36
|
+
assert_match(/not found/, out)
|
38
37
|
end
|
39
38
|
|
40
|
-
it
|
41
|
-
out = noop(
|
39
|
+
it 'tests option --each' do
|
40
|
+
out = noop(each: true) {
|
42
41
|
Doit.execute('hello')
|
43
42
|
}
|
44
|
-
assert_match
|
43
|
+
assert_match(/doit hello -r/, out)
|
45
44
|
end
|
46
45
|
|
47
|
-
it
|
48
|
-
out = noop(
|
49
|
-
Doit.start(
|
46
|
+
it 'coverage: list; option -lv' do
|
47
|
+
out = noop(verbose: true, list: true) {
|
48
|
+
Doit.start(verbose: true, list: true)
|
50
49
|
}
|
51
|
-
assert_match
|
50
|
+
assert_match(/just a test\n/, out)
|
52
51
|
end
|
53
52
|
|
54
53
|
end
|
data/test/import_test.rb
CHANGED
@@ -5,33 +5,33 @@ require 'my'
|
|
5
5
|
|
6
6
|
describe Import do
|
7
7
|
|
8
|
-
it
|
8
|
+
it 'init fails with empty' do
|
9
9
|
assert_raises(Errno::EISDIR) { Import.init('') }
|
10
10
|
end
|
11
11
|
|
12
|
-
it
|
12
|
+
it 'init' do
|
13
13
|
Import.init('hello')
|
14
14
|
end
|
15
15
|
|
16
|
-
it
|
16
|
+
it 'list' do
|
17
17
|
Import.init('hello')
|
18
|
-
assert_match
|
18
|
+
assert_match(/\/\.doit\/hello$/, Import.list['hello'])
|
19
19
|
end
|
20
20
|
|
21
|
-
it
|
22
|
-
out = noop(
|
21
|
+
it 'info' do
|
22
|
+
out = noop(verbose: true) {
|
23
23
|
Import.init('hello')
|
24
24
|
Import.info
|
25
25
|
}
|
26
|
-
assert_match
|
27
|
-
assert_match
|
26
|
+
assert_match(/SCRIPT/, out)
|
27
|
+
assert_match(/CONFIG/, out)
|
28
28
|
end
|
29
29
|
|
30
|
-
it
|
30
|
+
it 'coverage: script' do
|
31
31
|
Import.script
|
32
32
|
end
|
33
33
|
|
34
|
-
it
|
34
|
+
it 'coverage: config' do
|
35
35
|
Import.config
|
36
36
|
end
|
37
37
|
|
data/test/my_test.rb
CHANGED
@@ -3,20 +3,20 @@ require 'my'
|
|
3
3
|
|
4
4
|
describe My do
|
5
5
|
|
6
|
-
it
|
6
|
+
it 'verbose' do
|
7
7
|
h = 'hello'
|
8
|
-
out,
|
8
|
+
out, _err = capture_io do
|
9
9
|
My.verbose('a', h)
|
10
10
|
end
|
11
|
-
assert_match
|
11
|
+
assert_match(/#{h}/, out)
|
12
12
|
end
|
13
13
|
|
14
|
-
it
|
14
|
+
it 'verbose text' do
|
15
15
|
h = 'hello'
|
16
|
-
out,
|
16
|
+
out, _err = capture_io do
|
17
17
|
My.verbose('a', "#{h}\nx\n")
|
18
18
|
end
|
19
|
-
assert_match
|
19
|
+
assert_match(/#{h}/, out)
|
20
20
|
end
|
21
21
|
|
22
22
|
end
|
data/test/run_test.rb
CHANGED
@@ -5,54 +5,54 @@ require 'doit'
|
|
5
5
|
|
6
6
|
describe Run do
|
7
7
|
|
8
|
-
it
|
9
|
-
|
8
|
+
it 'coverage #info' do
|
9
|
+
_out, _err = capture_io do
|
10
10
|
Run.init('', '')
|
11
11
|
Run.info
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
15
|
it "where '' returns nil" do
|
16
|
-
|
16
|
+
_out, _err = capture_io do
|
17
17
|
Run.init('', '')
|
18
18
|
assert_equal nil, Run.ssh
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
22
|
it "where 'a' returns nil" do
|
23
|
-
|
23
|
+
_out, _err = capture_io do
|
24
24
|
Run.init('', 'a')
|
25
25
|
assert_equal nil, Run.ssh
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
29
|
it "where 'a@b' returns 'ssh a@b'" do
|
30
|
-
|
30
|
+
_out, _err = capture_io do
|
31
31
|
Run.init('', 'a@b')
|
32
32
|
assert_equal 'ssh a@b', Run.ssh
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
36
|
it "where 'a@b:c' returns 'ssh a@b'" do
|
37
|
-
|
37
|
+
_out, _err = capture_io do
|
38
38
|
Run.init('', 'a@b:c')
|
39
39
|
assert_equal 'ssh a@b', Run.ssh
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
it
|
44
|
-
|
43
|
+
it 'coverage #run' do
|
44
|
+
_out, _err = capture_io do
|
45
45
|
Run.init('', '')
|
46
46
|
Run.run
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
it
|
50
|
+
it 'coverage #run noop' do
|
51
51
|
out = noop {
|
52
52
|
Run.init('', '')
|
53
53
|
Run.run
|
54
54
|
}
|
55
|
-
assert_match
|
55
|
+
assert_match(/EOS/, out)
|
56
56
|
end
|
57
57
|
|
58
58
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,18 +1,21 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
if ENV['COVERAGE']
|
2
|
+
require 'simplecov'
|
3
|
+
SimpleCov.start do
|
4
|
+
add_filter '/test/'
|
5
|
+
end
|
5
6
|
end
|
6
7
|
|
8
|
+
require 'what'
|
9
|
+
|
7
10
|
require 'minitest/autorun'
|
8
11
|
|
9
|
-
def noop(options = {noop: true}, &block)
|
12
|
+
def noop(options = { noop: true }, &block)
|
10
13
|
return 'noop: missing block' unless block
|
11
14
|
|
12
15
|
out = '---'
|
13
16
|
Doit.stub :options, options do
|
14
|
-
out,
|
15
|
-
|
17
|
+
out, _err = capture_io do
|
18
|
+
yield
|
16
19
|
end
|
17
20
|
end
|
18
21
|
out
|
data/test/what_test.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
require 'test_helper'
|
2
|
-
require 'what'
|
3
2
|
require 'my'
|
4
3
|
|
5
4
|
describe What do
|
6
5
|
|
7
|
-
it
|
8
|
-
What.init(''
|
6
|
+
it 'is robust against empty params' do
|
7
|
+
What.init('')
|
9
8
|
assert_equal [Dir.pwd], What.where
|
10
9
|
assert_equal [{}], What.matrix
|
11
10
|
end
|
@@ -14,32 +13,32 @@ describe What do
|
|
14
13
|
assert_equal '', What.to_env({})
|
15
14
|
end
|
16
15
|
|
17
|
-
it
|
18
|
-
assert_equal 'A=1', What.to_env(
|
16
|
+
it 'to_env converts variable to uppercase' do
|
17
|
+
assert_equal 'A=1', What.to_env(a: 1)
|
19
18
|
end
|
20
19
|
|
21
|
-
it
|
22
|
-
Doit.stub :options,
|
23
|
-
|
24
|
-
|
25
|
-
|
20
|
+
it 'coverage: #info' do
|
21
|
+
Doit.stub :options, verbose: true do
|
22
|
+
_out, _err = capture_io do
|
23
|
+
What.init('')
|
24
|
+
What.info
|
26
25
|
end
|
27
26
|
end
|
28
27
|
end
|
29
28
|
|
30
|
-
it
|
31
|
-
What.init(
|
32
|
-
assert_equal [{
|
29
|
+
it 'builds simple matrix' do
|
30
|
+
What.init("a: 1\n")
|
31
|
+
assert_equal [{ 'a' => 1 }], What.matrix
|
33
32
|
end
|
34
33
|
|
35
|
-
it
|
36
|
-
What.init(
|
37
|
-
assert_equal [{
|
34
|
+
it 'builds matrix' do
|
35
|
+
What.init("a:\n - 1\n - 2\n")
|
36
|
+
assert_equal [{ 'a' => 1 }, { 'a' => 2 }], What.matrix
|
38
37
|
end
|
39
38
|
|
40
|
-
it
|
41
|
-
What.init(
|
42
|
-
assert_equal [{
|
39
|
+
it 'builds product matrix' do
|
40
|
+
What.init("a:\n - 1\nb:\n - 3\n - 4\n")
|
41
|
+
assert_equal [{ 'a' => 1, 'b' => 3 }, { 'a' => 1, 'b' => 4 }], What.matrix
|
43
42
|
end
|
44
43
|
|
45
44
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: doit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dittmar Krall
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: micro-optparse
|
@@ -24,6 +24,62 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '13'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '13'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: micro-optparse
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '5'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '5'
|
27
83
|
description: Run good old shell/bash scripts locally or remotely(ssh).
|
28
84
|
email: dittmar.krall@matique.de
|
29
85
|
executables:
|
@@ -33,6 +89,10 @@ extra_rdoc_files: []
|
|
33
89
|
files:
|
34
90
|
- ".doit/hello"
|
35
91
|
- ".doit/hello.yml"
|
92
|
+
- ".github/workflows/rake.yml"
|
93
|
+
- ".gitignore"
|
94
|
+
- ".rubocop.yml"
|
95
|
+
- ".ruby-gemset"
|
36
96
|
- ".ruby-version"
|
37
97
|
- ".travis.yml"
|
38
98
|
- ".watchr"
|
@@ -74,8 +134,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
74
134
|
- !ruby/object:Gem::Version
|
75
135
|
version: '0'
|
76
136
|
requirements: []
|
77
|
-
|
78
|
-
rubygems_version: 2.4.5
|
137
|
+
rubygems_version: 3.2.6
|
79
138
|
signing_key:
|
80
139
|
specification_version: 4
|
81
140
|
summary: Simple local & remote script executor
|