bosh_common 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +6 -7
- data/lib/common/common.rb +47 -0
- data/lib/common/exec/error.rb +19 -0
- data/lib/common/exec/result.rb +35 -0
- data/lib/common/exec.rb +87 -0
- data/lib/common/version.rb +1 -1
- data/spec/assets/foo1 +0 -0
- data/spec/assets/foo2 +0 -0
- data/spec/spec_helper.rb +10 -4
- data/spec/unit/common_spec.rb +59 -0
- data/spec/unit/exec_spec.rb +111 -0
- metadata +23 -25
- data/spec/Rakefile +0 -87
- data/spec/lib/cloud/spec.rb +0 -8
data/Rakefile
CHANGED
@@ -19,14 +19,14 @@ require "ci_task"
|
|
19
19
|
|
20
20
|
gem_helper = Bundler::GemHelper.new(Dir.pwd)
|
21
21
|
|
22
|
-
desc "Build
|
22
|
+
desc "Build BOSH Common gem into the pkg directory"
|
23
23
|
task "build" do
|
24
24
|
gem_helper.build_gem
|
25
25
|
end
|
26
26
|
|
27
|
-
desc "Build and install
|
27
|
+
desc "Build and install BOSH Common into system gems"
|
28
28
|
task "install" do
|
29
|
-
|
29
|
+
Rake::Task["bundler:install"].invoke
|
30
30
|
gem_helper.install_gem
|
31
31
|
end
|
32
32
|
|
@@ -36,7 +36,6 @@ if defined?(RSpec)
|
|
36
36
|
namespace :spec do
|
37
37
|
desc "Run Unit Tests"
|
38
38
|
rspec_task = RSpec::Core::RakeTask.new(:unit) do |t|
|
39
|
-
t.gemfile = "Gemfile"
|
40
39
|
t.pattern = "spec/unit/**/*_spec.rb"
|
41
40
|
t.rspec_opts = %w(--format progress --colour)
|
42
41
|
end
|
@@ -46,6 +45,6 @@ if defined?(RSpec)
|
|
46
45
|
end
|
47
46
|
end
|
48
47
|
|
49
|
-
desc "
|
50
|
-
task :spec => %w(
|
51
|
-
end
|
48
|
+
desc "Run tests"
|
49
|
+
task :spec => %w(spec:unit)
|
50
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# Copyright (c) 2012 VMware, Inc.
|
2
|
+
|
3
|
+
module Bosh
|
4
|
+
|
5
|
+
# Module for common methods used throughout the BOSH code.
|
6
|
+
module Common
|
7
|
+
|
8
|
+
# Converts all keys of a [Hash] to symbols. Performs deep conversion.
|
9
|
+
#
|
10
|
+
# @param [Hash] hash to convert
|
11
|
+
# @return [Hash] a copy of the original hash
|
12
|
+
def symbolize_keys(hash)
|
13
|
+
hash.inject({}) do |h, (key, value)|
|
14
|
+
h[key.to_sym] = value.is_a?(Hash) ? symbolize_keys(value) : value
|
15
|
+
h
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module_function :symbolize_keys
|
20
|
+
|
21
|
+
# @overload which(program, path)
|
22
|
+
# Looks for program in the executables search path (PATH).
|
23
|
+
# The file must be executable to be found.
|
24
|
+
# @param [String] program
|
25
|
+
# @param [String] path search path
|
26
|
+
# @return [String] full path of the executable,
|
27
|
+
# or nil if not found
|
28
|
+
# @overload which(programs, path)
|
29
|
+
# Looks for one of the programs in the executables search path (PATH).
|
30
|
+
# The file must be executable to be found.
|
31
|
+
# @param [Array] programs
|
32
|
+
# @param [String] path search path
|
33
|
+
# @return [String] full path of the executable,
|
34
|
+
# or nil if not found
|
35
|
+
def which(programs, path=ENV["PATH"])
|
36
|
+
path.split(File::PATH_SEPARATOR).each do |dir|
|
37
|
+
Array(programs).each do |bin|
|
38
|
+
exe = File.join(dir, bin)
|
39
|
+
return exe if File.executable?(exe)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
nil
|
43
|
+
end
|
44
|
+
|
45
|
+
module_function :which
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Copyright (c) 2012 VMware, Inc.
|
2
|
+
|
3
|
+
module Bosh::Exec
|
4
|
+
# Raised when there was an error executing the command
|
5
|
+
class Error < StandardError
|
6
|
+
def initialize(status, command)
|
7
|
+
@status = status
|
8
|
+
@command = command
|
9
|
+
end
|
10
|
+
|
11
|
+
def message
|
12
|
+
if @status
|
13
|
+
"command '#{@command}' failed with exit code #{@status}"
|
14
|
+
else
|
15
|
+
"command not found: #{@command}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# Copyright (c) 2012 VMware, Inc.
|
2
|
+
|
3
|
+
module Bosh::Exec
|
4
|
+
class Result
|
5
|
+
# command that generated the result
|
6
|
+
# @return [String]
|
7
|
+
attr_reader :command
|
8
|
+
# output from the executed command
|
9
|
+
# @return [String]
|
10
|
+
attr_reader :output
|
11
|
+
# exit status of the command
|
12
|
+
# @return [Integer]
|
13
|
+
attr_reader :exit_status
|
14
|
+
|
15
|
+
def initialize(command, output, exit_status, not_found=false)
|
16
|
+
@command = command
|
17
|
+
@output = output
|
18
|
+
@exit_status = exit_status
|
19
|
+
@not_found = not_found
|
20
|
+
end
|
21
|
+
|
22
|
+
def success?
|
23
|
+
@exit_status == 0
|
24
|
+
end
|
25
|
+
|
26
|
+
def failed?
|
27
|
+
@exit_status != 0 || @not_found
|
28
|
+
end
|
29
|
+
|
30
|
+
# true if the command was not found
|
31
|
+
def not_found?
|
32
|
+
@not_found
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/common/exec.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
# Copyright (c) 2012 VMware, Inc.
|
2
|
+
|
3
|
+
require "common/exec/result"
|
4
|
+
require "common/exec/error"
|
5
|
+
|
6
|
+
module Bosh
|
7
|
+
|
8
|
+
# Module to execute shell commands using different ways to invoke processes.
|
9
|
+
module Exec
|
10
|
+
|
11
|
+
# Execute commands in a way that forces you to deal with failures and
|
12
|
+
# helps you to simplify testing. The module can be included which will
|
13
|
+
# add sh both as an instance and a class method.
|
14
|
+
#
|
15
|
+
# A sample way to mock the execution of "ls /":
|
16
|
+
# it "should be possible to mock the result of a command execution" do
|
17
|
+
# cmd = "ls /"
|
18
|
+
# result = Bosh::Exec::Result.new(cmd, "bin etc var", "", 0)
|
19
|
+
# Bosh::Exec.should_receive(:sh).with(cmd).and_return(result)
|
20
|
+
# result = Bosh::Exec.sh(cmd)
|
21
|
+
# result.success?.should be_true
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
# @note As commands are executed using %x{...} you need to append 2>&1 to
|
25
|
+
# redirect stderr or it will be output to the stderr of the process
|
26
|
+
# invoking the sh method
|
27
|
+
# @param [String] command shell command to execute
|
28
|
+
# @param [Hash] options
|
29
|
+
# @option options [Symbol] :on_error if set to :return failing commands
|
30
|
+
# return [Bosh::Exec::Result] instead of raising [Bosh::Exec::Error]
|
31
|
+
# @option options [Symbol] :yield if set to :on_false it will execute
|
32
|
+
# the block when the command fails, else it will execute the block
|
33
|
+
# only when the command succeeds. Implies :on_error = :return
|
34
|
+
# @yield [Bosh::Exec::Result] command result
|
35
|
+
# @return [Bosh::Exec::Result] command result
|
36
|
+
# @raise [Bosh::Exec::Error] raised when the command isn't found or
|
37
|
+
# the command exits with a non zero status
|
38
|
+
# @example by default execute block only when command succeeds and raise
|
39
|
+
# error on failure
|
40
|
+
# sh("command") do |result|
|
41
|
+
# ...
|
42
|
+
# end
|
43
|
+
# @example don't raise error if the command fails
|
44
|
+
# result = sh("command", :on_error => :return)
|
45
|
+
# @example execute block only when command fails (which implies
|
46
|
+
# :on_error => :return)
|
47
|
+
# sh("command", :yield => :on_false) do |result|
|
48
|
+
# ...
|
49
|
+
# end
|
50
|
+
def sh(command, options={})
|
51
|
+
opts = options.dup
|
52
|
+
# can only yield if we don't raise errors
|
53
|
+
opts[:on_error] = :return if opts[:yield] == :on_false
|
54
|
+
|
55
|
+
output = %x{#{command}}
|
56
|
+
result = Result.new(command, output, $?.exitstatus)
|
57
|
+
|
58
|
+
if result.failed?
|
59
|
+
unless opts[:on_error] == :return
|
60
|
+
raise Error.new(result.exit_status, command)
|
61
|
+
end
|
62
|
+
yield result if block_given? && opts[:yield] == :on_false
|
63
|
+
|
64
|
+
else
|
65
|
+
yield result if block_given?
|
66
|
+
end
|
67
|
+
|
68
|
+
result
|
69
|
+
rescue Errno::ENOENT => e
|
70
|
+
msg = "command not found: #{command}"
|
71
|
+
|
72
|
+
raise Error.new(nil, command) unless opts[:on_error] == :return
|
73
|
+
|
74
|
+
result = Result.new(command, msg, -1, true)
|
75
|
+
|
76
|
+
yield result if block_given? && opts[:yield] == :on_false
|
77
|
+
result
|
78
|
+
end
|
79
|
+
|
80
|
+
# Helper method to add sh as a class method when it is included
|
81
|
+
def self.included(base)
|
82
|
+
base.extend(Bosh::Exec)
|
83
|
+
end
|
84
|
+
|
85
|
+
module_function :sh
|
86
|
+
end
|
87
|
+
end
|
data/lib/common/version.rb
CHANGED
data/spec/assets/foo1
ADDED
File without changes
|
data/spec/assets/foo2
ADDED
File without changes
|
data/spec/spec_helper.rb
CHANGED
@@ -1,7 +1,13 @@
|
|
1
|
-
|
1
|
+
# Copyright (c) 2009-2012 VMware, Inc.
|
2
2
|
|
3
|
-
|
3
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", __FILE__)
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
require "rubygems"
|
6
|
+
require "bundler"
|
7
|
+
Bundler.setup(:default, :test)
|
8
|
+
|
9
|
+
require "rspec"
|
10
|
+
|
11
|
+
def asset(file)
|
12
|
+
File.expand_path(File.join(File.dirname(__FILE__), "assets", file))
|
7
13
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# Copyright (c) 2012 VMware, Inc.
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
require "common/common"
|
6
|
+
|
7
|
+
describe Bosh::Common do
|
8
|
+
|
9
|
+
describe "#symbolize_keys" do
|
10
|
+
ORIGINAL = {
|
11
|
+
"foo1" => "bar",
|
12
|
+
:foo2 => "bar",
|
13
|
+
"foo3" => {
|
14
|
+
"foo4" => "bar"
|
15
|
+
}
|
16
|
+
}.freeze
|
17
|
+
|
18
|
+
EXPECTED = {
|
19
|
+
:foo1 => "bar",
|
20
|
+
:foo2 => "bar",
|
21
|
+
:foo3 => {
|
22
|
+
:foo4 => "bar"
|
23
|
+
}
|
24
|
+
}.freeze
|
25
|
+
|
26
|
+
it "should not modify the original hash" do
|
27
|
+
duplicate = ORIGINAL.dup
|
28
|
+
Bosh::Common.symbolize_keys(ORIGINAL)
|
29
|
+
ORIGINAL.should == duplicate
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should return a new hash with all keys as symbols" do
|
33
|
+
Bosh::Common.symbolize_keys(ORIGINAL).should == EXPECTED
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#which" do
|
38
|
+
let(:path) {
|
39
|
+
path = ENV["PATH"]
|
40
|
+
path += ":#{File.expand_path('../../assets', __FILE__)}"
|
41
|
+
}
|
42
|
+
|
43
|
+
it "should return the path when it finds the executable" do
|
44
|
+
Bosh::Common.which("foo1", path).should_not be_nil
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should return the path when it finds an executable" do
|
48
|
+
Bosh::Common.which(%w[foo2 foo1], path).should match(%r{/foo1$})
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should return nil when it isn't executable" do
|
52
|
+
Bosh::Common.which("foo2", path).should be_nil
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should return nil when it doesn't find an executable" do
|
56
|
+
Bosh::Common.which("foo1").should be_nil
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# Copyright (c) 2012 VMware, Inc.
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
require "common/exec"
|
5
|
+
|
6
|
+
describe Bosh::Exec do
|
7
|
+
let(:opts) { {} }
|
8
|
+
|
9
|
+
describe "existing command" do
|
10
|
+
|
11
|
+
describe "executes successfully" do
|
12
|
+
it "should not fail" do
|
13
|
+
Bosh::Exec.sh("ls /", opts).failed?.should be_false
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should execute block" do
|
17
|
+
block = false
|
18
|
+
Bosh::Exec.sh("ls /", opts) do
|
19
|
+
block = true
|
20
|
+
end
|
21
|
+
block.should be_true
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "fails to execute" do
|
26
|
+
it "should raise error by default" do
|
27
|
+
lambda {
|
28
|
+
Bosh::Exec.sh("ls /asdasd 2>&1", opts)
|
29
|
+
}.should raise_error Bosh::Exec::Error
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should yield block on false" do
|
33
|
+
opts[:yield] = :on_false
|
34
|
+
block = false
|
35
|
+
Bosh::Exec.sh("ls /asdasd 2>&1", opts) do
|
36
|
+
block = true
|
37
|
+
end
|
38
|
+
block.should be_true
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should return result" do
|
42
|
+
opts[:on_error] = :return
|
43
|
+
Bosh::Exec.sh("ls /asdasd 2>&1", opts).failed?.should be_true
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "missing command" do
|
50
|
+
it "should raise error by default" do
|
51
|
+
lambda {
|
52
|
+
Bosh::Exec.sh("/asdasd 2>&1", opts)
|
53
|
+
}.should raise_error Bosh::Exec::Error
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should not raise error when requested" do
|
57
|
+
opts[:on_error] = :return
|
58
|
+
lambda {
|
59
|
+
Bosh::Exec.sh("/asdasd 2>&1", opts)
|
60
|
+
}.should_not raise_error Bosh::Exec::Error
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should execute block when requested" do
|
64
|
+
opts[:yield] = :on_false
|
65
|
+
lambda {
|
66
|
+
Bosh::Exec.sh("/asdasd 2>&1", opts) do
|
67
|
+
raise "foo"
|
68
|
+
end
|
69
|
+
}.should raise_error "foo"
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "mock" do
|
75
|
+
it "should be possible fake result" do
|
76
|
+
cmd = "ls /"
|
77
|
+
result = Bosh::Exec::Result.new(cmd, "output", 0)
|
78
|
+
Bosh::Exec.should_receive(:sh).with(cmd).and_return(result)
|
79
|
+
result = Bosh::Exec.sh(cmd)
|
80
|
+
result.success?.should be_true
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "module" do
|
85
|
+
it "should be possible to invoke as a module" do
|
86
|
+
Bosh::Exec.sh("ls /").success?.should be_true
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe "include" do
|
91
|
+
class IncludeTest
|
92
|
+
include Bosh::Exec
|
93
|
+
def run
|
94
|
+
sh("ls /")
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.run
|
98
|
+
sh("ls /")
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should add instance method" do
|
103
|
+
inc = IncludeTest.new
|
104
|
+
inc.run.success?.should be_true
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should add class method" do
|
108
|
+
IncludeTest.run.success?.should be_true
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bosh_common
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,33 +9,28 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
13
|
-
dependencies:
|
14
|
-
|
15
|
-
name: rspec
|
16
|
-
requirement: &2156296060 !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ! '>='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '0'
|
22
|
-
type: :development
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: *2156296060
|
25
|
-
description: Bosh common
|
12
|
+
date: 2012-07-27 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: BOSH common
|
26
15
|
email: support@vmware.com
|
27
16
|
executables: []
|
28
17
|
extensions: []
|
29
18
|
extra_rdoc_files: []
|
30
19
|
files:
|
31
|
-
-
|
32
|
-
-
|
20
|
+
- lib/common/common.rb
|
21
|
+
- lib/common/exec.rb
|
22
|
+
- lib/common/exec/error.rb
|
23
|
+
- lib/common/exec/result.rb
|
33
24
|
- lib/common/thread_formatter.rb
|
34
25
|
- lib/common/thread_pool.rb
|
35
26
|
- lib/common/version.rb
|
36
|
-
-
|
37
|
-
-
|
27
|
+
- README
|
28
|
+
- Rakefile
|
29
|
+
- spec/assets/foo1
|
30
|
+
- spec/assets/foo2
|
38
31
|
- spec/spec_helper.rb
|
32
|
+
- spec/unit/common_spec.rb
|
33
|
+
- spec/unit/exec_spec.rb
|
39
34
|
- spec/unit/thread_pool_spec.rb
|
40
35
|
homepage: http://www.vmware.com
|
41
36
|
licenses: []
|
@@ -51,7 +46,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
51
46
|
version: '0'
|
52
47
|
segments:
|
53
48
|
- 0
|
54
|
-
hash:
|
49
|
+
hash: 852108980354805257
|
55
50
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
51
|
none: false
|
57
52
|
requirements:
|
@@ -60,15 +55,18 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
60
55
|
version: '0'
|
61
56
|
segments:
|
62
57
|
- 0
|
63
|
-
hash:
|
58
|
+
hash: 852108980354805257
|
64
59
|
requirements: []
|
65
60
|
rubyforge_project:
|
66
|
-
rubygems_version: 1.8.
|
61
|
+
rubygems_version: 1.8.24
|
67
62
|
signing_key:
|
68
63
|
specification_version: 3
|
69
|
-
summary:
|
64
|
+
summary: BOSH common
|
70
65
|
test_files:
|
71
|
-
- spec/
|
72
|
-
- spec/
|
66
|
+
- spec/assets/foo1
|
67
|
+
- spec/assets/foo2
|
73
68
|
- spec/spec_helper.rb
|
69
|
+
- spec/unit/common_spec.rb
|
70
|
+
- spec/unit/exec_spec.rb
|
74
71
|
- spec/unit/thread_pool_spec.rb
|
72
|
+
has_rdoc:
|
data/spec/Rakefile
DELETED
@@ -1,87 +0,0 @@
|
|
1
|
-
require "tempfile"
|
2
|
-
require "rake"
|
3
|
-
|
4
|
-
APP_DIR = File.expand_path(File.join("..", ".."), __FILE__)
|
5
|
-
ENV["BUNDLE_GEMFILE"] ||= File.join(APP_DIR, "Gemfile")
|
6
|
-
require "rubygems"
|
7
|
-
require "bundler"
|
8
|
-
Bundler.setup(:default, :test)
|
9
|
-
|
10
|
-
require "rspec/core/rake_task"
|
11
|
-
require "ci/reporter/rake/rspec"
|
12
|
-
|
13
|
-
desc "Run all examples"
|
14
|
-
RSpec::Core::RakeTask.new(:spec) do |t|
|
15
|
-
t.pattern = "**/*_spec.rb"
|
16
|
-
t.rspec_opts = %w[--color]
|
17
|
-
end
|
18
|
-
|
19
|
-
task :default => [:spec]
|
20
|
-
|
21
|
-
coverage_dir = File.expand_path(File.join(File.dirname(__FILE__), "..", "spec_coverage"))
|
22
|
-
reports_dir = File.expand_path(File.join(File.dirname(__FILE__), "..", "spec_reports"))
|
23
|
-
dump_file = File.join(Dir.tmpdir, "bosh-common.rcov")
|
24
|
-
|
25
|
-
ENV["CI_REPORTS"] = reports_dir
|
26
|
-
|
27
|
-
namespace "spec" do
|
28
|
-
gemfile = "../Gemfile"
|
29
|
-
spec_opts = ["--format", "documentation", "--colour"]
|
30
|
-
|
31
|
-
if RUBY_VERSION < "1.9"
|
32
|
-
desc "Run specs for ci"
|
33
|
-
task "ci" => [ "ci:setup:rspec", "spec:rcov", "convert_rcov_to_clover" ]
|
34
|
-
|
35
|
-
desc "Run spec with coverage"
|
36
|
-
RSpec::Core::RakeTask.new("rcov") do |t|
|
37
|
-
FileUtils.rm_rf(dump_file)
|
38
|
-
t.gemfile = gemfile
|
39
|
-
t.pattern = "**/*_spec.rb"
|
40
|
-
t.rspec_opts = ["--format", "progress", "--colour"]
|
41
|
-
t.rcov = true
|
42
|
-
t.rcov_opts = %W{--aggregate #{dump_file} --exclude osx\/objc,gems\/,spec\/,unit\/,features\/ -o "#{coverage_dir}"}
|
43
|
-
end
|
44
|
-
|
45
|
-
task "convert_rcov_to_clover" do |t|
|
46
|
-
ignore_pattern = "spec,[.]bundle,[/]gems[/]"
|
47
|
-
clover_output = File.join(coverage_dir, "clover.xml")
|
48
|
-
|
49
|
-
sh("bundle exec rcov_analyzer #{dump_file} #{ignore_pattern} > #{clover_output}")
|
50
|
-
FileUtils.rm_rf(dump_file)
|
51
|
-
end
|
52
|
-
|
53
|
-
else
|
54
|
-
desc "Run specs for ci"
|
55
|
-
task "ci" => [ "ci:setup:rspec", "spec:rcov" ]
|
56
|
-
|
57
|
-
desc "Run spec with coverage"
|
58
|
-
task :rcov => :cleanup_coverage do
|
59
|
-
require "simplecov"
|
60
|
-
require "simplecov-rcov"
|
61
|
-
require "simplecov-clover"
|
62
|
-
|
63
|
-
class SimpleCov::Formatter::CombinedFormatter
|
64
|
-
def format(result)
|
65
|
-
SimpleCov::Formatter::CloverFormatter.new.format(result)
|
66
|
-
SimpleCov::Formatter::RcovFormatter.new.format(result)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
SimpleCov.formatter = SimpleCov::Formatter::CombinedFormatter
|
71
|
-
SimpleCov.root('..')
|
72
|
-
SimpleCov.coverage_dir('cov')
|
73
|
-
SimpleCov.start do
|
74
|
-
require "rspec/core"
|
75
|
-
add_filter "/spec/"
|
76
|
-
spec_dir = File.expand_path("..", __FILE__)
|
77
|
-
RSpec::Core::Runner.disable_autorun!
|
78
|
-
RSpec::Core::Runner.run([spec_dir], STDERR, STDOUT)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
task "cleanup_coverage" do
|
84
|
-
rm_rf "cov"
|
85
|
-
end
|
86
|
-
|
87
|
-
end
|