doit 0.3.0 → 1.0.2
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 +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
|