doit 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.doit/hello +2 -0
- data/.doit/hello.yml +13 -0
- data/.ruby-version +1 -0
- data/.travis.yml +5 -0
- data/.watchr +51 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +29 -0
- data/LICENSE +18 -0
- data/README.md +71 -0
- data/Rakefile +11 -0
- data/bin/doit +20 -0
- data/doit.gemspec +22 -0
- data/lib/doit.rb +69 -0
- data/lib/globals.rb +3 -0
- data/lib/import.rb +61 -0
- data/lib/my.rb +16 -0
- data/lib/run.rb +42 -0
- data/lib/what.rb +60 -0
- data/test/doit_test.rb +40 -0
- data/test/import_test.rb +38 -0
- data/test/my_test.rb +22 -0
- data/test/run_test.rb +58 -0
- data/test/test_helper.rb +19 -0
- data/test/what_test.rb +45 -0
- metadata +88 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 79a433db8959ba8237dbc94e440e09e81cf8cac6
|
4
|
+
data.tar.gz: ae14003d0bb47603b5b84cb65952ba89a68135f5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 418fe282ab06d1b9bdf7293702eb03251855937194114d68967616ff89402c58ff8d23272bfe02cdd5cd3b90f146b2e920d8597d4ecee883011cc6d0fb4a5e31
|
7
|
+
data.tar.gz: 80b566ffc7fbdb1af2752b366c05c958f414d26930c51e06b4198e493c7b71ae49f59c51ebc15ef9cc6862ec69c87eade97dee6d699055ee631c4be861519a65
|
data/.doit/hello
ADDED
data/.doit/hello.yml
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby-2.1.2
|
data/.travis.yml
ADDED
data/.watchr
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
HH = '#' * 22 unless defined?(HH)
|
2
|
+
H = '#' * 5 unless defined?(H)
|
3
|
+
|
4
|
+
def usage
|
5
|
+
puts <<-EOS
|
6
|
+
Ctrl-\\ or ctrl-4 Running all tests
|
7
|
+
Ctrl-C Exit
|
8
|
+
EOS
|
9
|
+
end
|
10
|
+
|
11
|
+
def run(cmd)
|
12
|
+
puts "#{HH} #{Time.now} #{HH}"
|
13
|
+
puts "#{H} #{cmd}"
|
14
|
+
system "/usr/bin/time --format '#{HH} Elapsed time %E' #{cmd}"
|
15
|
+
end
|
16
|
+
|
17
|
+
def run_it(type, file)
|
18
|
+
case type
|
19
|
+
when 'test'; run %Q{ruby -I"lib:test" -rubygems #{file}}
|
20
|
+
else; puts "#{H} unknown type: #{type}, file: #{file}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def run_all_tests
|
25
|
+
puts "\n#{HH} Running all tests #{HH}\n"
|
26
|
+
%w{test}.each { |dir| run "rake #{dir}" if File.exists?(dir) }
|
27
|
+
end
|
28
|
+
|
29
|
+
def run_matching_files(base)
|
30
|
+
base = base.split('_').first
|
31
|
+
%w{test spec}.each { |type|
|
32
|
+
files = Dir["#{type}/**/*.rb"].select { |file| file =~ /#{base}_.*\.rb/ }
|
33
|
+
run_it type, files.join(' ') unless files.empty?
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
%w{test spec}.each { |type|
|
38
|
+
watch("#{type}/#{type}_helper\.rb") { run_all_tests }
|
39
|
+
watch("#{type}/.*/*_#{type}\.rb") { |match| run_it type, match[0] }
|
40
|
+
}
|
41
|
+
%w{rb erb haml slim}.each { |type|
|
42
|
+
watch(".*/.*\.#{type}") { |m|
|
43
|
+
run_matching_files("#{m[0].split('/').last.split('.').first}")
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
# Ctrl-\ or ctrl-4
|
48
|
+
Signal.trap('QUIT') { run_all_tests }
|
49
|
+
# Ctrl-C
|
50
|
+
Signal.trap('INT') { abort("Interrupted\n") }
|
51
|
+
usage
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
doit (0.2.4)
|
5
|
+
micro-optparse
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
docile (1.1.5)
|
11
|
+
micro-optparse (1.2.0)
|
12
|
+
multi_json (1.10.1)
|
13
|
+
rake (10.3.2)
|
14
|
+
simplecov (0.9.1)
|
15
|
+
docile (~> 1.1.0)
|
16
|
+
multi_json (~> 1.0)
|
17
|
+
simplecov-html (~> 0.8.0)
|
18
|
+
simplecov-html (0.8.0)
|
19
|
+
watchr (0.7)
|
20
|
+
|
21
|
+
PLATFORMS
|
22
|
+
ruby
|
23
|
+
|
24
|
+
DEPENDENCIES
|
25
|
+
doit!
|
26
|
+
micro-optparse
|
27
|
+
rake
|
28
|
+
simplecov
|
29
|
+
watchr
|
data/LICENSE
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
Copyright (c) 2014 Dittmar Krall
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
4
|
+
this software and associated documentation files (the "Software"), to deal in
|
5
|
+
the Software without restriction, including without limitation the rights to
|
6
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
7
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
8
|
+
subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
11
|
+
copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
15
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
16
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
17
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
18
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
Doit
|
2
|
+
====
|
3
|
+
|
4
|
+
Executes good old shell/bash scripts locally as well as remotely.
|
5
|
+
The environment is set by a ".yml" configuration file.
|
6
|
+
An array environment variable triggers multiple calls of the script.
|
7
|
+
|
8
|
+
Installation
|
9
|
+
------------
|
10
|
+
gem install doit
|
11
|
+
|
12
|
+
Usage
|
13
|
+
-----
|
14
|
+
doit script... [options]
|
15
|
+
doit push
|
16
|
+
doit deploy tag
|
17
|
+
|
18
|
+
Options
|
19
|
+
-------
|
20
|
+
-l, --[no-]list Lists available scripts
|
21
|
+
-r, --remote ["host"] remote host or comma separated hosts
|
22
|
+
-s, --[no-]silent run silently; suppress output
|
23
|
+
-v, --[no-]verbose Enable verbose output
|
24
|
+
-n, --[no-]noop Suppress execution of commannds
|
25
|
+
-h, --help Show this message
|
26
|
+
-V, --version Print version
|
27
|
+
|
28
|
+
File Structure
|
29
|
+
--------------
|
30
|
+
~/.doit/deploy # chmod +x .doit/deploy
|
31
|
+
~/.doit/deploy.yml
|
32
|
+
$PROJ/.doit/deploy.yml # overwrites
|
33
|
+
$PROJ/.doit/push # chmod +x .doit/deploy
|
34
|
+
$PROJ/.doit/push.yml
|
35
|
+
|
36
|
+
$PROJ/.doit/push
|
37
|
+
----------------
|
38
|
+
if ! (git status | grep 'nothing to commit'); then
|
39
|
+
echo "push: commits are pending"
|
40
|
+
exit 1
|
41
|
+
fi
|
42
|
+
|
43
|
+
current_branch=`git rev-parse --abbrev-ref HEAD`
|
44
|
+
echo "**** branch is '$current_branch'"
|
45
|
+
|
46
|
+
case $current_branch in
|
47
|
+
development)
|
48
|
+
git checkout master && git merge --no-ff development &&
|
49
|
+
git push origin master
|
50
|
+
git checkout development
|
51
|
+
;;
|
52
|
+
master)
|
53
|
+
git push origin master
|
54
|
+
;;
|
55
|
+
esac
|
56
|
+
|
57
|
+
~/.doit/deploy
|
58
|
+
--------------
|
59
|
+
uname -a
|
60
|
+
git status
|
61
|
+
|
62
|
+
~/.doit/deploy.yml
|
63
|
+
------------------
|
64
|
+
env:
|
65
|
+
- DIR=tmp OPTION=run
|
66
|
+
- DIR=proj OPTION=list
|
67
|
+
where:
|
68
|
+
- bob@sample.com
|
69
|
+
- alice@customer.com
|
70
|
+
|
71
|
+
Copyright (c) 2014 [Dittmar Krall], released under the MIT license
|
data/Rakefile
ADDED
data/bin/doit
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
lib = File.expand_path('../../lib/', __FILE__)
|
4
|
+
$:.unshift lib unless $:.include?(lib)
|
5
|
+
|
6
|
+
require 'doit'
|
7
|
+
require 'micro-optparse'
|
8
|
+
require 'globals'
|
9
|
+
|
10
|
+
options = Parser.new do |p|
|
11
|
+
p.banner = "Usage: doit script... [options] # execute locally or remotely"
|
12
|
+
p.version = "doit #{Globals::VERSION}"
|
13
|
+
p.option :list, 'Lists available scripts'
|
14
|
+
p.option :remote, 'remote host or comma separated hosts', default: ['host'], optional: true
|
15
|
+
p.option :silent, 'run silently; suppress output'
|
16
|
+
p.option :verbose, 'Enable verbose output'
|
17
|
+
p.option :noop, 'Suppress execution of commannds'
|
18
|
+
end.process!
|
19
|
+
|
20
|
+
Doit.start(options)
|
data/doit.gemspec
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
$:.push File.expand_path("../lib", __FILE__)
|
2
|
+
require 'globals'
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.name = 'doit'
|
6
|
+
gem.version = Globals::VERSION
|
7
|
+
gem.summary = "Simple local & remote script executor"
|
8
|
+
gem.description = "Run good old shell/bash scripts locally or remotely(ssh)."
|
9
|
+
|
10
|
+
gem.authors = ['Dittmar Krall']
|
11
|
+
gem.email = 'dittmar.krall@matique.de'
|
12
|
+
gem.homepage = 'http://www.matique.de'
|
13
|
+
gem.license = 'MIT'
|
14
|
+
|
15
|
+
gem.add_dependency 'micro-optparse', '~> 0'
|
16
|
+
|
17
|
+
gem.files = `git ls-files`.split("\n")
|
18
|
+
gem.test_files = `git ls-files -- test`.split("\n")
|
19
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
gem.require_paths = ["lib"]
|
21
|
+
|
22
|
+
end
|
data/lib/doit.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'my'
|
2
|
+
require 'run'
|
3
|
+
require 'import'
|
4
|
+
require 'what'
|
5
|
+
|
6
|
+
class Doit
|
7
|
+
|
8
|
+
def self.start(options)
|
9
|
+
@options = options
|
10
|
+
list if options[:list]
|
11
|
+
|
12
|
+
script = ARGV.shift
|
13
|
+
str = ARGV.map { |x| "\"#{x}\"" }.join(' ')
|
14
|
+
@argv = str.empty? ? '' : "set #{str}\n"
|
15
|
+
execute(script) if script
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.options
|
19
|
+
@options || {}
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.list
|
23
|
+
hsh = Import.list
|
24
|
+
hsh.sort.each { |abb, long|
|
25
|
+
puts "#{abb}\t- #{long}"
|
26
|
+
lines = `grep -i 'usage\\|summary' #{long} | grep '^#'`.split("\n")
|
27
|
+
lines.each { |line|
|
28
|
+
next unless line
|
29
|
+
next if line.empty?
|
30
|
+
puts "\t #{line}"
|
31
|
+
}
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.execute(name)
|
36
|
+
Import.init(name)
|
37
|
+
unless Import.script
|
38
|
+
puts "doit: script '#{name}' not found"
|
39
|
+
return
|
40
|
+
end
|
41
|
+
What.init(Import.script, Import.config)
|
42
|
+
|
43
|
+
where_loop
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
def self.where_loop
|
48
|
+
What.where.each { |w|
|
49
|
+
matrix_loop(w)
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.matrix_loop(w)
|
54
|
+
What.matrix.each { |mm|
|
55
|
+
prefix = mm.empty? ? '' : "#{What.to_env(mm)}\n"
|
56
|
+
|
57
|
+
What.env.each { |en|
|
58
|
+
prefix2 = en.empty? ? '' : "#{en}\n"
|
59
|
+
|
60
|
+
cmds = Import.script
|
61
|
+
cmds = @argv + prefix + prefix2 + cmds
|
62
|
+
Run.init cmds, w
|
63
|
+
Run.info if options[:verbose]
|
64
|
+
Run.run
|
65
|
+
}
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
data/lib/globals.rb
ADDED
data/lib/import.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'erb'
|
3
|
+
|
4
|
+
class Import
|
5
|
+
|
6
|
+
def self.script; @script; end
|
7
|
+
def self.config; @config; end
|
8
|
+
|
9
|
+
def self.init(name)
|
10
|
+
@script = read(name)
|
11
|
+
@config = ERB.new(read("#{name}.yml") || '').result
|
12
|
+
info
|
13
|
+
end
|
14
|
+
|
15
|
+
# returns Hash { 'pull' => '/home/dk/.doit/pull', ... }
|
16
|
+
def self.list
|
17
|
+
@list ||= list2
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.info
|
21
|
+
return unless Doit.options[:verbose]
|
22
|
+
|
23
|
+
My.verbose "SCRIPT", @script
|
24
|
+
My.verbose "CONFIG(yml)", @config
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
private
|
29
|
+
def self.list2
|
30
|
+
res = {}
|
31
|
+
Pathname.pwd.descend { |dir|
|
32
|
+
doit_dir = dir + '.doit'
|
33
|
+
next unless File.directory?(doit_dir)
|
34
|
+
|
35
|
+
lst = []
|
36
|
+
Dir.entries(doit_dir).each { |name|
|
37
|
+
name = File.join(doit_dir, name)
|
38
|
+
|
39
|
+
next unless File.executable?(name)
|
40
|
+
next if File.directory?(name)
|
41
|
+
|
42
|
+
lst << name
|
43
|
+
}
|
44
|
+
lst.each { |itm| res[File.basename(itm)] = itm }
|
45
|
+
}
|
46
|
+
res
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.read(name)
|
50
|
+
try_ascend(".doit/#{name}")
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.try_ascend(filename)
|
54
|
+
Pathname.pwd.ascend { |dir|
|
55
|
+
str = dir + filename
|
56
|
+
return File.read(str) if File.exists?(str)
|
57
|
+
}
|
58
|
+
nil
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
data/lib/my.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
class My
|
2
|
+
|
3
|
+
def self.verbose(what, txt)
|
4
|
+
marker = '*'*4
|
5
|
+
arr = txt
|
6
|
+
arr = txt ? txt.split("\n") : '' unless Array === txt
|
7
|
+
if arr.length > 1
|
8
|
+
puts "#{marker} #{what} #{marker}"
|
9
|
+
puts txt
|
10
|
+
puts marker
|
11
|
+
else
|
12
|
+
puts "#{marker} #{what}: #{txt}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
data/lib/run.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
class Run
|
2
|
+
|
3
|
+
def self.ssh; @ssh; end
|
4
|
+
|
5
|
+
def self.init(cmds, where)
|
6
|
+
aster = '*'*24
|
7
|
+
puts "#{aster} #{where} #{aster}"
|
8
|
+
@ssh = nil
|
9
|
+
@cmds = cmds
|
10
|
+
|
11
|
+
if where.include?('@')
|
12
|
+
arr = where.split(':')
|
13
|
+
host = arr.first
|
14
|
+
dir = arr.length > 1 ? arr.last : nil
|
15
|
+
else
|
16
|
+
host = nil
|
17
|
+
dir = where
|
18
|
+
end
|
19
|
+
|
20
|
+
@cmds = "cd; cd #{dir}\n" + @cmds unless dir && dir.empty?
|
21
|
+
@ssh = "ssh #{host}" if host
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.info
|
25
|
+
My.verbose('SSH', @ssh)
|
26
|
+
My.verbose('cmds', @cmds)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.run
|
30
|
+
here = '___EOS___'
|
31
|
+
silent = Doit.options[:silent] ? '>/dev/null' : ''
|
32
|
+
cmd = "cat <<'#{here}\' | #{@ssh} bash -i -l #{silent} 2>&1"
|
33
|
+
cmds = "#{cmd}\n#{@cmds}#{here}\n"
|
34
|
+
|
35
|
+
unless Doit.options[:noop]
|
36
|
+
IO.popen(cmds) { |p| p.each { |f| puts f } }
|
37
|
+
else
|
38
|
+
My.verbose('noop', cmds)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
data/lib/what.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'doit'
|
3
|
+
|
4
|
+
class What
|
5
|
+
|
6
|
+
def self.matrix; @matrix; end
|
7
|
+
def self.where; @where; end
|
8
|
+
def self.env; @env; end
|
9
|
+
|
10
|
+
def self.init(script, config)
|
11
|
+
@matrix = nil
|
12
|
+
@yml = (config && YAML.load(config)) || {}
|
13
|
+
|
14
|
+
@where = @yml.delete('where')
|
15
|
+
@env = @yml.delete('env')
|
16
|
+
@env ||= ['']
|
17
|
+
@env = [@env].flatten.compact
|
18
|
+
|
19
|
+
remote = Doit.options[:remote]
|
20
|
+
@where = remote if remote
|
21
|
+
@where ||= Dir.pwd # default is current directory
|
22
|
+
@where = [@where].flatten.compact
|
23
|
+
|
24
|
+
build_matrix
|
25
|
+
@matrix ||= []
|
26
|
+
@matrix = [@matrix] unless Array === @matrix.first
|
27
|
+
@matrix.map! { |m| m.flatten.inject({}) { |hsh, h| hsh.merge(h) } }
|
28
|
+
info
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.to_env(hsh)
|
32
|
+
arr = hsh.collect { |key, value| "#{key.to_s.upcase}=#{value}" }
|
33
|
+
arr.join ' '
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.info
|
37
|
+
return unless Doit.options[:verbose]
|
38
|
+
|
39
|
+
My.verbose "where", @where
|
40
|
+
My.verbose "matrix", @matrix
|
41
|
+
My.verbose "env", @env
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
private
|
46
|
+
def self.build_matrix
|
47
|
+
unless @yml.empty?
|
48
|
+
key, value = @yml.first
|
49
|
+
@yml.delete(key)
|
50
|
+
add_to_matrix(key, value)
|
51
|
+
build_matrix
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.add_to_matrix(key, val)
|
56
|
+
arr = Array === val ? val.collect {|v| [{key => v}] } : [{key => val}]
|
57
|
+
@matrix = @matrix ? @matrix.product(arr) : arr
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
data/test/doit_test.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'doit'
|
3
|
+
|
4
|
+
describe Doit do
|
5
|
+
|
6
|
+
before do
|
7
|
+
Doit.start({})
|
8
|
+
end
|
9
|
+
|
10
|
+
it "start" do
|
11
|
+
out = noop { }
|
12
|
+
assert_equal '', out
|
13
|
+
end
|
14
|
+
|
15
|
+
it "options" do
|
16
|
+
assert_equal({}, Doit.options)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "list" do
|
20
|
+
out = noop {
|
21
|
+
Doit.list
|
22
|
+
}
|
23
|
+
assert_match /\/\.doit/, out
|
24
|
+
end
|
25
|
+
|
26
|
+
it "execute" do
|
27
|
+
out, err = capture_io do
|
28
|
+
Doit.execute('hello')
|
29
|
+
end
|
30
|
+
assert_match /\nHello\n/, out
|
31
|
+
end
|
32
|
+
|
33
|
+
it "execute with unknown script" do
|
34
|
+
out, err = capture_io do
|
35
|
+
Doit.execute('______unknown______')
|
36
|
+
end
|
37
|
+
assert_match /not found/, out
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
data/test/import_test.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'import'
|
3
|
+
require 'doit'
|
4
|
+
require 'my'
|
5
|
+
|
6
|
+
describe Import do
|
7
|
+
|
8
|
+
it "init fails with empty" do
|
9
|
+
assert_raises(Errno::EISDIR) { Import.init('') }
|
10
|
+
end
|
11
|
+
|
12
|
+
it "init" do
|
13
|
+
Import.init('hello')
|
14
|
+
end
|
15
|
+
|
16
|
+
it "list" do
|
17
|
+
Import.init('hello')
|
18
|
+
assert_match /\/\.doit\/hello$/, Import.list['hello']
|
19
|
+
end
|
20
|
+
|
21
|
+
it "info" do
|
22
|
+
out = noop({verbose: true}) {
|
23
|
+
Import.init('hello')
|
24
|
+
Import.info
|
25
|
+
}
|
26
|
+
assert_match /SCRIPT/, out
|
27
|
+
assert_match /CONFIG/, out
|
28
|
+
end
|
29
|
+
|
30
|
+
it "coverage: script" do
|
31
|
+
Import.script
|
32
|
+
end
|
33
|
+
|
34
|
+
it "coverage: config" do
|
35
|
+
Import.config
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
data/test/my_test.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'my'
|
3
|
+
|
4
|
+
describe My do
|
5
|
+
|
6
|
+
it "verbose" do
|
7
|
+
h = 'hello'
|
8
|
+
out, err = capture_io do
|
9
|
+
My.verbose('a', h)
|
10
|
+
end
|
11
|
+
assert_match /#{h}/, out
|
12
|
+
end
|
13
|
+
|
14
|
+
it "verbose text" do
|
15
|
+
h = 'hello'
|
16
|
+
out, err = capture_io do
|
17
|
+
My.verbose('a', "#{h}\nx\n")
|
18
|
+
end
|
19
|
+
assert_match /#{h}/, out
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
data/test/run_test.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'run'
|
3
|
+
require 'my'
|
4
|
+
require 'doit'
|
5
|
+
|
6
|
+
describe Run do
|
7
|
+
|
8
|
+
it "coverage #info" do
|
9
|
+
out, err = capture_io do
|
10
|
+
Run.init('', '')
|
11
|
+
Run.info
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it "where '' returns nil" do
|
16
|
+
out, err = capture_io do
|
17
|
+
Run.init('', '')
|
18
|
+
assert_equal nil, Run.ssh
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
it "where 'a' returns nil" do
|
23
|
+
out, err = capture_io do
|
24
|
+
Run.init('', 'a')
|
25
|
+
assert_equal nil, Run.ssh
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it "where 'a@b' returns 'ssh a@b'" do
|
30
|
+
out, err = capture_io do
|
31
|
+
Run.init('', 'a@b')
|
32
|
+
assert_equal 'ssh a@b', Run.ssh
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
it "where 'a@b:c' returns 'ssh a@b'" do
|
37
|
+
out, err = capture_io do
|
38
|
+
Run.init('', 'a@b:c')
|
39
|
+
assert_equal 'ssh a@b', Run.ssh
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
it "coverage #run" do
|
44
|
+
out, err = capture_io do
|
45
|
+
Run.init('', '')
|
46
|
+
Run.run
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
it "coverage #run noop" do
|
51
|
+
out = noop {
|
52
|
+
Run.init('', '')
|
53
|
+
Run.run
|
54
|
+
}
|
55
|
+
assert_match /EOS/, out
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start do
|
3
|
+
add_filter 'test'
|
4
|
+
command_name 'Minitest'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'minitest/autorun'
|
8
|
+
|
9
|
+
def noop(options = {noop: true}, &block)
|
10
|
+
return 'noop: missing block' unless block
|
11
|
+
|
12
|
+
out = '---'
|
13
|
+
Doit.stub :options, options do
|
14
|
+
out, err = capture_io do
|
15
|
+
block.call
|
16
|
+
end
|
17
|
+
end
|
18
|
+
out
|
19
|
+
end
|
data/test/what_test.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'what'
|
3
|
+
require 'my'
|
4
|
+
|
5
|
+
describe What do
|
6
|
+
|
7
|
+
it "is robust against empty params" do
|
8
|
+
What.init('', '')
|
9
|
+
assert_equal [Dir.pwd], What.where
|
10
|
+
assert_equal [{}], What.matrix
|
11
|
+
end
|
12
|
+
|
13
|
+
it "#to_env({}) must be ''" do
|
14
|
+
assert_equal '', What.to_env({})
|
15
|
+
end
|
16
|
+
|
17
|
+
it "to_env converts variable to uppercase" do
|
18
|
+
assert_equal 'A=1', What.to_env({a: 1})
|
19
|
+
end
|
20
|
+
|
21
|
+
it "coverage: #info" do
|
22
|
+
Doit.stub :options, {verbose: true} do
|
23
|
+
out, err = capture_io do
|
24
|
+
What.init('', '')
|
25
|
+
What.info
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it "builds simple matrix" do
|
31
|
+
What.init('', "a: 1\n")
|
32
|
+
assert_equal [{"a"=>1}], What.matrix
|
33
|
+
end
|
34
|
+
|
35
|
+
it "builds matrix" do
|
36
|
+
What.init('', "a:\n - 1\n - 2\n")
|
37
|
+
assert_equal [{"a"=>1}, {"a"=>2}], What.matrix
|
38
|
+
end
|
39
|
+
|
40
|
+
it "builds product matrix" do
|
41
|
+
What.init('', "a:\n - 1\nb:\n - 3\n - 4\n")
|
42
|
+
assert_equal [{"a"=>1, "b"=>3}, {"a"=>1, "b"=>4}], What.matrix
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
metadata
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: doit
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.4
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dittmar Krall
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-10-25 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: micro-optparse
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: Run good old shell/bash scripts locally or remotely(ssh).
|
28
|
+
email: dittmar.krall@matique.de
|
29
|
+
executables:
|
30
|
+
- doit
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- ".doit/hello"
|
35
|
+
- ".doit/hello.yml"
|
36
|
+
- ".ruby-version"
|
37
|
+
- ".travis.yml"
|
38
|
+
- ".watchr"
|
39
|
+
- Gemfile
|
40
|
+
- Gemfile.lock
|
41
|
+
- LICENSE
|
42
|
+
- README.md
|
43
|
+
- Rakefile
|
44
|
+
- bin/doit
|
45
|
+
- doit.gemspec
|
46
|
+
- lib/doit.rb
|
47
|
+
- lib/globals.rb
|
48
|
+
- lib/import.rb
|
49
|
+
- lib/my.rb
|
50
|
+
- lib/run.rb
|
51
|
+
- lib/what.rb
|
52
|
+
- test/doit_test.rb
|
53
|
+
- test/import_test.rb
|
54
|
+
- test/my_test.rb
|
55
|
+
- test/run_test.rb
|
56
|
+
- test/test_helper.rb
|
57
|
+
- test/what_test.rb
|
58
|
+
homepage: http://www.matique.de
|
59
|
+
licenses:
|
60
|
+
- MIT
|
61
|
+
metadata: {}
|
62
|
+
post_install_message:
|
63
|
+
rdoc_options: []
|
64
|
+
require_paths:
|
65
|
+
- lib
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
requirements: []
|
77
|
+
rubyforge_project:
|
78
|
+
rubygems_version: 2.4.2
|
79
|
+
signing_key:
|
80
|
+
specification_version: 4
|
81
|
+
summary: Simple local & remote script executor
|
82
|
+
test_files:
|
83
|
+
- test/doit_test.rb
|
84
|
+
- test/import_test.rb
|
85
|
+
- test/my_test.rb
|
86
|
+
- test/run_test.rb
|
87
|
+
- test/test_helper.rb
|
88
|
+
- test/what_test.rb
|