rake-funnel 0.21.2 → 0.22.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +5 -0
- data/lib/rake/funnel/integration/progress_report.rb +1 -1
- data/lib/rake/funnel/integration/sync_output.rb +1 -1
- data/lib/rake/funnel/integration/teamcity/progress_report.rb +2 -6
- data/lib/rake/funnel/support/msbuild/build_tool.rb +36 -13
- data/lib/rake/funnel/tasks/msbuild.rb +1 -1
- data/lib/rake/funnel/version.rb +1 -1
- data/rake-funnel.gemspec +3 -2
- data/spec/rake/funnel/extensions/common_path_spec.rb +3 -2
- data/spec/rake/funnel/extensions/rexml_spec.rb +1 -3
- data/spec/rake/funnel/integration/sync_output_spec.rb +4 -4
- data/spec/rake/funnel/integration/teamcity/nunit_plugin_spec.rb +1 -3
- data/spec/rake/funnel/integration/teamcity/progress_report_spec.rb +9 -11
- data/spec/rake/funnel/integration/teamcity/service_messages_spec.rb +1 -3
- data/spec/rake/funnel/integration/teamcity/teamcity_spec.rb +1 -3
- data/spec/rake/funnel/support/argument_mapper/styles/msdeploy_spec.rb +1 -3
- data/spec/rake/funnel/support/argument_mapper/styles/nunit_spec.rb +1 -3
- data/spec/rake/funnel/support/assembly_version_writer_spec.rb +1 -5
- data/spec/rake/funnel/support/internal/finder_spec.rb +1 -3
- data/spec/rake/funnel/support/internal/instantiate_symbol_spec.rb +1 -3
- data/spec/rake/funnel/support/mapper_spec.rb +3 -3
- data/spec/rake/funnel/support/msbuild/build_tool_spec.rb +126 -37
- data/spec/rake/funnel/support/msdeploy/registry_patch_spec.rb +1 -3
- data/spec/rake/funnel/support/timing/report_spec.rb +6 -6
- data/spec/rake/funnel/tasks/msbuild_spec.rb +1 -3
- data/spec/rake/funnel/tasks/msdeploy_spec.rb +1 -3
- data/spec/rake/funnel/tasks/nunit_spec.rb +1 -3
- data/spec/rake/funnel/tasks/timing_spec.rb +5 -5
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ba6054ccf746282d7b18f44405a4a1f24e3f2dabc36dfc1ce5b8a5fd90bbc9b1
|
4
|
+
data.tar.gz: ad1ba7b758b76396150182661dcf4936b133f3b52007e2ceb582dd0339e9af7c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 51eaeeef60d39328f4a0b6ef35b66560b5d5f0b8d61291282aae964bffcd4043d22432dd261d5879a8324535058f2284fc680b7b852277d5dc761f0abb91213a
|
7
|
+
data.tar.gz: afe151343b40f3c2510a575140c4a42df399196d58e98f6ef4e88c199ea6b1e7138575cc43e2fa962299b4abfaf5994791737926a74f2d5f59cec9d74e6b066f
|
data/CHANGELOG.md
ADDED
@@ -46,7 +46,7 @@ module Rake
|
|
46
46
|
error = nil
|
47
47
|
begin
|
48
48
|
old_execute.bind(self).call(args)
|
49
|
-
rescue => e # rubocop:disable
|
49
|
+
rescue => e # rubocop:disable Style/RescueStandardError
|
50
50
|
error = e
|
51
51
|
ensure
|
52
52
|
context.finished.call(self, args, error) if context.finished
|
@@ -12,17 +12,13 @@ module Rake
|
|
12
12
|
task_starting do |task, _args|
|
13
13
|
next unless TeamCity.running?
|
14
14
|
|
15
|
-
unless TeamCity.rake_runner?
|
16
|
-
ServiceMessages.block_opened(name: task.name)
|
17
|
-
end
|
15
|
+
ServiceMessages.block_opened(name: task.name) unless TeamCity.rake_runner?
|
18
16
|
end
|
19
17
|
|
20
18
|
task_finished do |task, _args, error|
|
21
19
|
next unless TeamCity.running?
|
22
20
|
|
23
|
-
if error.respond_to?(:inner_exception)
|
24
|
-
error = error.inner_exception
|
25
|
-
end
|
21
|
+
error = error.inner_exception if error.respond_to?(:inner_exception)
|
26
22
|
|
27
23
|
ServiceMessages.build_problem(description: error.message[0..4000 - 1]) if error
|
28
24
|
|
@@ -7,41 +7,64 @@ module Rake
|
|
7
7
|
class BuildTool
|
8
8
|
class << self
|
9
9
|
def find
|
10
|
-
|
10
|
+
vswhere ||
|
11
|
+
from_registry ||
|
12
|
+
mono ||
|
13
|
+
raise('No compatible MSBuild build tool was found')
|
11
14
|
end
|
12
15
|
|
13
16
|
private
|
14
17
|
|
15
|
-
def
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
raise "Could not determine mono version: #{status}" unless status.success?
|
21
|
-
rescue Errno::ENOENT
|
22
|
-
raise 'mono is not installed'
|
18
|
+
def mono
|
19
|
+
out, status = Open3.capture2('mono', '--version')
|
20
|
+
unless status.success?
|
21
|
+
warn "Could not determine mono version: #{status}"
|
22
|
+
return nil
|
23
23
|
end
|
24
24
|
|
25
25
|
return 'msbuild'.freeze if out[/^Mono JIT compiler version ([\d\.]+)/, 1] >= '5.0'
|
26
26
|
|
27
27
|
'xbuild'.freeze
|
28
|
+
rescue Errno::ENOENT
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
|
32
|
+
def vswhere # rubocop:disable Metrics/MethodLength
|
33
|
+
# -products * is required.
|
34
|
+
# https://github.com/Microsoft/vswhere/issues/61#issuecomment-298691077
|
35
|
+
args = %w(vswhere.exe
|
36
|
+
-products *
|
37
|
+
-latest
|
38
|
+
-requires Microsoft.Component.MSBuild
|
39
|
+
-property installationPath)
|
40
|
+
|
41
|
+
path, status = Open3.capture2(*args)
|
42
|
+
unless status.success?
|
43
|
+
warn "vswhere failed: #{status}"
|
44
|
+
return nil
|
45
|
+
end
|
46
|
+
|
47
|
+
Dir[File.join(Rake::Win32.normalize(path.strip),
|
48
|
+
'MSBuild/*/Bin/MSBuild.exe')]
|
49
|
+
.find { |e| File.file?(e) }
|
50
|
+
rescue Errno::ENOENT
|
51
|
+
nil
|
28
52
|
end
|
29
53
|
|
30
54
|
KEY = 'SOFTWARE\Microsoft\MSBuild\ToolsVersions'.freeze
|
55
|
+
REGISTRY_VERSIONS = %w(14.0 12.0 4.0 3.5 2.0).freeze
|
31
56
|
|
32
57
|
def from_registry
|
33
58
|
return nil unless require_registry
|
34
59
|
|
35
|
-
|
60
|
+
candidates = REGISTRY_VERSIONS.map do |version|
|
36
61
|
version_key(version) do |reg|
|
37
62
|
candidate = File.join(reg['MSBuildToolsPath'] || '', 'msbuild.exe')
|
38
63
|
next candidate if File.exist?(candidate)
|
39
64
|
end
|
40
65
|
end
|
41
|
-
end
|
42
66
|
|
43
|
-
|
44
|
-
%w(14.0 12.0 4.0 3.5 2.0)
|
67
|
+
candidates.compact.first
|
45
68
|
end
|
46
69
|
|
47
70
|
def require_registry
|
data/lib/rake/funnel/version.rb
CHANGED
data/rake-funnel.gemspec
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
lib = File.expand_path('
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
2
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
3
|
require 'rake/funnel/version'
|
4
4
|
|
@@ -13,7 +13,8 @@ Gem::Specification.new do |s| # rubocop:disable Metrics/BlockLength
|
|
13
13
|
s.description = 'A standardized build pipeline'
|
14
14
|
s.summary = 'A build pipeline targeted at .NET projects. Supports environment configuration and makes invoking .NET-related tasks easier.' # rubocop:disable Metrics/LineLength
|
15
15
|
|
16
|
-
|
16
|
+
# We support Ruby 2.0 whereas rubocop does not.
|
17
|
+
s.required_ruby_version = '>= 2.0.0' # rubocop:disable Gemspec/RequiredRubyVersion
|
17
18
|
|
18
19
|
s.add_dependency 'configatron', '~> 4.5'
|
19
20
|
s.add_dependency 'rake', '>= 10.4', '< 13'
|
@@ -1,7 +1,7 @@
|
|
1
1
|
describe Rake::Funnel::Extensions::CommonPath do
|
2
2
|
describe 'Manual debugging test case' do
|
3
3
|
it 'should work' do
|
4
|
-
expect(%w(/common/one /com/two).common_path).to
|
4
|
+
expect(%w(/common/one /com/two).common_path).to be_truthy
|
5
5
|
|
6
6
|
skip('for manual testing only')
|
7
7
|
end
|
@@ -12,7 +12,8 @@ describe Rake::Funnel::Extensions::CommonPath do
|
|
12
12
|
input = FileList[File.join(File.dirname(__FILE__), '**/*')]
|
13
13
|
duped = input.dup
|
14
14
|
|
15
|
-
expect(input.common_path).to
|
15
|
+
expect(input.common_path).to be_truthy
|
16
|
+
|
16
17
|
expect(input).to match_array(duped)
|
17
18
|
end
|
18
19
|
end
|
@@ -3,10 +3,10 @@ describe Rake::Funnel::Integration::SyncOutput do
|
|
3
3
|
before do
|
4
4
|
allow($stdout).to receive(:sync=)
|
5
5
|
allow($stderr).to receive(:sync=)
|
6
|
-
|
7
|
-
expect(subject).to be # rubocop:disable RSpec/ExpectInHook
|
8
6
|
end
|
9
7
|
|
8
|
+
subject! { described_class.new }
|
9
|
+
|
10
10
|
it 'should immediately flush $stdout' do
|
11
11
|
expect($stdout).to have_received(:sync=).with(true)
|
12
12
|
end
|
@@ -22,10 +22,10 @@ describe Rake::Funnel::Integration::SyncOutput do
|
|
22
22
|
allow($stderr).to receive(:sync=).and_raise('$stderr.sync not supported')
|
23
23
|
|
24
24
|
allow(Rake).to receive(:rake_output_message)
|
25
|
-
|
26
|
-
expect(subject).to be # rubocop:disable RSpec/ExpectInHook
|
27
25
|
end
|
28
26
|
|
27
|
+
subject! { described_class.new }
|
28
|
+
|
29
29
|
it 'should log the error for $stdout' do
|
30
30
|
expect(Rake).to have_received(:rake_output_message).with(/Failed.*\$stdout/)
|
31
31
|
end
|
@@ -1,6 +1,4 @@
|
|
1
|
-
# rubocop:disable RSpec/FilePath
|
2
|
-
|
3
|
-
describe Rake::Funnel::Integration::TeamCity::NUnitPlugin do
|
1
|
+
describe Rake::Funnel::Integration::TeamCity::NUnitPlugin do # rubocop:disable RSpec/FilePath
|
4
2
|
before do
|
5
3
|
allow(ENV).to receive(:[]).with(described_class::ENV_VAR).and_return(env_var)
|
6
4
|
allow(Rake::Funnel::Support::Which).to receive(:which).and_return(which)
|
@@ -1,6 +1,4 @@
|
|
1
|
-
# rubocop:disable RSpec/FilePath
|
2
|
-
|
3
|
-
describe Rake::Funnel::Integration::TeamCity::ProgressReport do
|
1
|
+
describe Rake::Funnel::Integration::TeamCity::ProgressReport do # rubocop:disable RSpec/FilePath
|
4
2
|
include Rake::DSL
|
5
3
|
|
6
4
|
let(:teamcity_running?) { false }
|
@@ -26,7 +24,7 @@ describe Rake::Funnel::Integration::TeamCity::ProgressReport do
|
|
26
24
|
subject.disable!
|
27
25
|
end
|
28
26
|
|
29
|
-
shared_examples
|
27
|
+
shared_examples 'block report' do
|
30
28
|
it 'should write block start' do
|
31
29
|
expect(Rake::Funnel::Integration::TeamCity::ServiceMessages).to \
|
32
30
|
have_received(:block_opened).with(name: 'task')
|
@@ -38,7 +36,7 @@ describe Rake::Funnel::Integration::TeamCity::ProgressReport do
|
|
38
36
|
end
|
39
37
|
end
|
40
38
|
|
41
|
-
shared_examples
|
39
|
+
shared_examples 'no block report' do
|
42
40
|
it 'should not write block start' do
|
43
41
|
expect(Rake::Funnel::Integration::TeamCity::ServiceMessages).not_to \
|
44
42
|
have_received(:block_opened)
|
@@ -63,20 +61,20 @@ describe Rake::Funnel::Integration::TeamCity::ProgressReport do
|
|
63
61
|
end
|
64
62
|
|
65
63
|
context 'not on TeamCity' do
|
66
|
-
it_behaves_like
|
64
|
+
it_behaves_like 'no block report'
|
67
65
|
end
|
68
66
|
|
69
67
|
context 'on TeamCity' do
|
70
68
|
let(:teamcity_running?) { true }
|
71
69
|
|
72
70
|
context 'without rake runner' do
|
73
|
-
it_behaves_like
|
71
|
+
it_behaves_like 'block report'
|
74
72
|
end
|
75
73
|
|
76
74
|
context 'with rake runner' do
|
77
75
|
let(:teamcity_rake_runner?) { true }
|
78
76
|
|
79
|
-
it_behaves_like
|
77
|
+
it_behaves_like 'no block report'
|
80
78
|
end
|
81
79
|
end
|
82
80
|
end
|
@@ -111,7 +109,7 @@ describe Rake::Funnel::Integration::TeamCity::ProgressReport do
|
|
111
109
|
end
|
112
110
|
|
113
111
|
context 'not on TeamCity' do
|
114
|
-
it_behaves_like
|
112
|
+
it_behaves_like 'no block report'
|
115
113
|
|
116
114
|
it 'should not swallow the error' do
|
117
115
|
expect(@raised_error).to be_a_kind_of(SpecificError) # rubocop:disable RSpec/InstanceVariable
|
@@ -141,7 +139,7 @@ describe Rake::Funnel::Integration::TeamCity::ProgressReport do
|
|
141
139
|
end
|
142
140
|
|
143
141
|
context 'without rake runner' do
|
144
|
-
it_behaves_like
|
142
|
+
it_behaves_like 'block report'
|
145
143
|
|
146
144
|
it 'should report the error as a build problem' do
|
147
145
|
expect(Rake::Funnel::Integration::TeamCity::ServiceMessages).to \
|
@@ -160,7 +158,7 @@ describe Rake::Funnel::Integration::TeamCity::ProgressReport do
|
|
160
158
|
have_received(:build_problem).with(description: 'inner message')
|
161
159
|
end
|
162
160
|
|
163
|
-
it_behaves_like
|
161
|
+
it_behaves_like 'no block report'
|
164
162
|
end
|
165
163
|
end
|
166
164
|
end
|
@@ -1,6 +1,4 @@
|
|
1
|
-
# rubocop:disable RSpec/FilePath
|
2
|
-
|
3
|
-
describe Rake::Funnel::Integration::TeamCity::ServiceMessages do
|
1
|
+
describe Rake::Funnel::Integration::TeamCity::ServiceMessages do # rubocop:disable RSpec/FilePath
|
4
2
|
before do
|
5
3
|
allow(Rake::Funnel::Integration::TeamCity).to receive(:running?).and_return(teamcity_running?)
|
6
4
|
allow($stdout).to receive(:puts)
|
@@ -1,6 +1,4 @@
|
|
1
|
-
# rubocop:disable RSpec/FilePath
|
2
|
-
|
3
|
-
describe Rake::Funnel::Integration::TeamCity do
|
1
|
+
describe Rake::Funnel::Integration::TeamCity do # rubocop:disable RSpec/FilePath
|
4
2
|
describe 'runner detection' do
|
5
3
|
before do
|
6
4
|
allow(ENV).to receive(:include?).with(described_class::PROJECT_ENV_VAR).and_return(teamcity_running?)
|
@@ -1,6 +1,4 @@
|
|
1
|
-
# rubocop:disable RSpec/FilePath
|
2
|
-
|
3
|
-
describe Rake::Funnel::Support::Mapper::Styles::MSDeploy do
|
1
|
+
describe Rake::Funnel::Support::Mapper::Styles::MSDeploy do # rubocop:disable RSpec/FilePath
|
4
2
|
subject { Rake::Funnel::Support::Mapper.new(:MSDeploy) }
|
5
3
|
|
6
4
|
describe 'no arguments' do
|
@@ -1,8 +1,6 @@
|
|
1
|
-
# rubocop:disable RSpec/FilePath
|
2
|
-
|
3
1
|
require 'tmpdir'
|
4
2
|
|
5
|
-
describe Rake::Funnel::Support::Finder do
|
3
|
+
describe Rake::Funnel::Support::Finder do # rubocop:disable RSpec/FilePath
|
6
4
|
let(:pattern) { %W(#{temp_dir}/**/*.sln #{temp_dir}/**/*.??proj) }
|
7
5
|
let(:generate) { [] }
|
8
6
|
let(:temp_dir) { Dir.mktmpdir }
|
@@ -17,7 +17,7 @@ describe Rake::Funnel::Support::Mapper do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
class CustomMapper
|
20
|
-
def generate_from(
|
20
|
+
def generate_from(_ignored)
|
21
21
|
[
|
22
22
|
['-', 'switch'],
|
23
23
|
['-', :some_switch],
|
@@ -40,7 +40,7 @@ describe Rake::Funnel::Support::Mapper do
|
|
40
40
|
describe 'mapper style' do
|
41
41
|
context 'default mapper' do
|
42
42
|
it 'should use default mapper' do
|
43
|
-
expect(described_class.new).to
|
43
|
+
expect(described_class.new).to be_kind_of(described_class)
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
@@ -59,7 +59,7 @@ describe Rake::Funnel::Support::Mapper do
|
|
59
59
|
|
60
60
|
context 'custom mapper' do
|
61
61
|
it 'should take custom mapper instance' do
|
62
|
-
expect(described_class.new(CustomMapper.new)).to
|
62
|
+
expect(described_class.new(CustomMapper.new)).to be_kind_of(described_class)
|
63
63
|
end
|
64
64
|
end
|
65
65
|
end
|
@@ -1,75 +1,155 @@
|
|
1
|
-
# rubocop:disable RSpec/FilePath
|
2
|
-
|
3
1
|
require 'ostruct'
|
4
2
|
|
5
|
-
describe Rake::Funnel::Support::MSBuild::BuildTool do
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
describe Rake::Funnel::Support::MSBuild::BuildTool do # rubocop:disable RSpec/FilePath
|
4
|
+
context 'vswhere' do
|
5
|
+
let(:vswhere_args) do
|
6
|
+
%w(vswhere.exe -products * -latest -requires Microsoft.Component.MSBuild -property installationPath)
|
7
|
+
end
|
8
|
+
|
9
|
+
before do
|
10
|
+
allow(described_class).to receive(:require).with('win32/registry').and_raise(LoadError)
|
11
|
+
allow(Open3).to receive(:capture2).with('mono', any_args).and_raise(Errno::ENOENT)
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'not installed' do
|
15
|
+
before do
|
16
|
+
allow(Open3).to receive(:capture2).with(*vswhere_args).and_raise(Errno::ENOENT)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'finds nothing' do
|
20
|
+
expect { described_class.find }.to raise_error('No compatible MSBuild build tool was found')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'installed' do
|
25
|
+
before do
|
26
|
+
allow(Open3).to receive(:capture2).with(*vswhere_args).and_return(vswhere_path)
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'fails' do
|
30
|
+
let(:vswhere_path) do
|
31
|
+
[
|
32
|
+
'vswhere crashed',
|
33
|
+
OpenStruct.new(success?: false)
|
34
|
+
]
|
35
|
+
end
|
9
36
|
|
10
|
-
|
11
|
-
|
12
|
-
|
37
|
+
before do
|
38
|
+
allow(described_class).to receive(:warn)
|
39
|
+
end
|
13
40
|
|
41
|
+
it 'finds nothing' do
|
42
|
+
expect { described_class.find }.to raise_error('No compatible MSBuild build tool was found')
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'warns about the crash' do
|
46
|
+
described_class.find rescue nil # rubocop:disable Style/RescueModifier
|
47
|
+
expect(described_class).to have_received(:warn).with(/^vswhere failed:/)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe 'MSBuild executable' do
|
52
|
+
let(:vswhere_path) do
|
53
|
+
[
|
54
|
+
'c:\path',
|
55
|
+
OpenStruct.new(success?: true)
|
56
|
+
]
|
57
|
+
end
|
58
|
+
|
59
|
+
before do
|
60
|
+
allow(Dir).to receive(:[]).with('c:/path/MSBuild/*/Bin/MSBuild.exe')
|
61
|
+
.and_return(['c:/path/msbuild.exe'])
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'exists' do
|
65
|
+
before do
|
66
|
+
allow(File).to receive(:file?).with('c:/path/msbuild.exe').and_return(true)
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'finds msbuild.exe' do
|
70
|
+
expect(described_class.find).to eq('c:/path/msbuild.exe')
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'does not exist' do
|
75
|
+
before do
|
76
|
+
allow(File).to receive(:exist?).with('c:/path/msbuild.exe').and_return(false)
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'finds nothing' do
|
80
|
+
expect { described_class.find }.to raise_error('No compatible MSBuild build tool was found')
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'Registry',
|
88
|
+
skip: ('Windows Registry not available on this platform' unless defined?(::Win32::Registry)) do
|
14
89
|
before do
|
15
90
|
allow(::Win32::Registry::HKEY_LOCAL_MACHINE).to receive(:open).and_yield('MSBuildToolsPath' => 'path')
|
16
91
|
end
|
17
92
|
|
18
|
-
it '
|
19
|
-
described_class.find
|
93
|
+
it 'searches the registry for known MSBuild versions' do
|
94
|
+
described_class.find rescue nil # rubocop:disable Style/RescueModifier
|
20
95
|
expect(::Win32::Registry::HKEY_LOCAL_MACHINE).to have_received(:open).at_least(:once)
|
21
96
|
end
|
22
97
|
|
23
|
-
context 'key not found' do
|
98
|
+
context 'Registry key not found' do
|
24
99
|
before do
|
25
100
|
allow(::Win32::Registry::HKEY_LOCAL_MACHINE).to receive(:open).and_raise(::Win32::Registry::Error.new(3))
|
26
101
|
end
|
27
102
|
|
28
103
|
it 'finds nothing' do
|
29
|
-
expect
|
104
|
+
expect { described_class.find }.to raise_error('No compatible MSBuild build tool was found')
|
30
105
|
end
|
31
106
|
end
|
32
107
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
108
|
+
describe 'MSBuild executable' do
|
109
|
+
context 'exists' do
|
110
|
+
before do
|
111
|
+
allow(File).to receive(:exist?).with('path/msbuild.exe').and_return(true)
|
112
|
+
end
|
37
113
|
|
38
|
-
|
39
|
-
|
114
|
+
it 'finds msbuild.exe' do
|
115
|
+
expect(described_class.find).to eq('path/msbuild.exe')
|
116
|
+
end
|
40
117
|
end
|
41
|
-
end
|
42
118
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
119
|
+
context 'does not exist' do
|
120
|
+
before do
|
121
|
+
allow(File).to receive(:exist?).with('path/msbuild.exe').and_return(false)
|
122
|
+
end
|
47
123
|
|
48
|
-
|
49
|
-
|
124
|
+
it 'finds nothing' do
|
125
|
+
expect { described_class.find }.to raise_error('No compatible MSBuild build tool was found')
|
126
|
+
end
|
50
127
|
end
|
51
128
|
end
|
52
129
|
end
|
53
130
|
|
54
|
-
context '
|
55
|
-
|
131
|
+
context 'mono' do
|
132
|
+
before do
|
133
|
+
allow(described_class).to receive(:require).with('win32/registry').and_raise(LoadError)
|
134
|
+
allow(Open3).to receive(:capture2).with('vswhere.exe', any_args).and_raise(Errno::ENOENT)
|
135
|
+
end
|
56
136
|
|
57
|
-
context '
|
137
|
+
context 'not installed' do
|
58
138
|
before do
|
59
139
|
allow(Open3).to receive(:capture2).with('mono', '--version').and_raise(Errno::ENOENT)
|
60
140
|
end
|
61
141
|
|
62
|
-
it '
|
63
|
-
expect { described_class.find }.to raise_error('
|
142
|
+
it 'finds nothing' do
|
143
|
+
expect { described_class.find }.to raise_error('No compatible MSBuild build tool was found')
|
64
144
|
end
|
65
145
|
end
|
66
146
|
|
67
|
-
context '
|
147
|
+
context 'installed' do
|
68
148
|
before do
|
69
149
|
allow(Open3).to receive(:capture2).with('mono', '--version').and_return(mono_version)
|
70
150
|
end
|
71
151
|
|
72
|
-
context '
|
152
|
+
context 'fails' do
|
73
153
|
let(:mono_version) do
|
74
154
|
[
|
75
155
|
'mono crashed',
|
@@ -77,8 +157,17 @@ describe Rake::Funnel::Support::MSBuild::BuildTool do
|
|
77
157
|
]
|
78
158
|
end
|
79
159
|
|
80
|
-
|
81
|
-
|
160
|
+
before do
|
161
|
+
allow(described_class).to receive(:warn)
|
162
|
+
end
|
163
|
+
|
164
|
+
it 'finds nothing' do
|
165
|
+
expect { described_class.find }.to raise_error('No compatible MSBuild build tool was found')
|
166
|
+
end
|
167
|
+
|
168
|
+
it 'warns about the crash' do
|
169
|
+
described_class.find rescue nil # rubocop:disable Style/RescueModifier
|
170
|
+
expect(described_class).to have_received(:warn).with(/^Could not determine mono version:/)
|
82
171
|
end
|
83
172
|
end
|
84
173
|
|
@@ -90,7 +179,7 @@ describe Rake::Funnel::Support::MSBuild::BuildTool do
|
|
90
179
|
]
|
91
180
|
end
|
92
181
|
|
93
|
-
it '
|
182
|
+
it 'finds xbuild' do
|
94
183
|
expect(described_class.find).to eq('xbuild')
|
95
184
|
end
|
96
185
|
end
|
@@ -103,7 +192,7 @@ describe Rake::Funnel::Support::MSBuild::BuildTool do
|
|
103
192
|
]
|
104
193
|
end
|
105
194
|
|
106
|
-
it '
|
195
|
+
it 'finds msbuild' do
|
107
196
|
expect(described_class.find).to eq('msbuild')
|
108
197
|
end
|
109
198
|
end
|
@@ -1,6 +1,4 @@
|
|
1
|
-
# rubocop:disable RSpec/FilePath
|
2
|
-
|
3
|
-
describe Rake::Funnel::Support::MSDeploy::RegistryPatch do
|
1
|
+
describe Rake::Funnel::Support::MSDeploy::RegistryPatch do # rubocop:disable RSpec/FilePath
|
4
2
|
before do
|
5
3
|
# rubocop:disable RSpec/AnyInstance
|
6
4
|
allow_any_instance_of(described_class).to receive(:warn)
|
@@ -11,7 +11,7 @@ describe Rake::Funnel::Support::Timing::Report do
|
|
11
11
|
subject.render
|
12
12
|
end
|
13
13
|
|
14
|
-
shared_examples_for
|
14
|
+
shared_examples_for 'report' do
|
15
15
|
it 'should separator lines' do
|
16
16
|
expect($stdout).to have_received(:puts)
|
17
17
|
.with(Regexp.new('-' * described_class::HEADER_WIDTH)).exactly(4).times
|
@@ -49,7 +49,7 @@ describe Rake::Funnel::Support::Timing::Report do
|
|
49
49
|
describe 'empty report', include: Rake::Funnel::Support::Timing do
|
50
50
|
let(:stats) { Rake::Funnel::Support::Timing::Statistics.new }
|
51
51
|
|
52
|
-
it_behaves_like
|
52
|
+
it_behaves_like 'report'
|
53
53
|
end
|
54
54
|
|
55
55
|
describe 'report for 2 tasks' do
|
@@ -60,7 +60,7 @@ describe Rake::Funnel::Support::Timing::Report do
|
|
60
60
|
s
|
61
61
|
end
|
62
62
|
|
63
|
-
it_behaves_like
|
63
|
+
it_behaves_like 'report'
|
64
64
|
|
65
65
|
it 'should print each task' do
|
66
66
|
expect($stdout).to have_received(:puts).with(/^foo/)
|
@@ -95,7 +95,7 @@ describe Rake::Funnel::Support::Timing::Report do
|
|
95
95
|
diff + described_class::SPACE
|
96
96
|
end
|
97
97
|
|
98
|
-
shared_examples_for
|
98
|
+
shared_examples_for 'padding' do
|
99
99
|
it 'should pad headers' do
|
100
100
|
expect($stdout).to have_received(:puts)
|
101
101
|
.with(Regexp.new("^#{subject.columns[0].header}\\s{#{header_space}}#{subject.columns[1].header}"))
|
@@ -113,13 +113,13 @@ describe Rake::Funnel::Support::Timing::Report do
|
|
113
113
|
context 'task names are shorter than headers' do
|
114
114
|
let(:task_name) { :a }
|
115
115
|
|
116
|
-
it_behaves_like
|
116
|
+
it_behaves_like 'padding'
|
117
117
|
end
|
118
118
|
|
119
119
|
context 'task names are longer than headers' do
|
120
120
|
let(:task_name) { :aaaaaaaaaaaa }
|
121
121
|
|
122
|
-
it_behaves_like
|
122
|
+
it_behaves_like 'padding'
|
123
123
|
end
|
124
124
|
end
|
125
125
|
end
|
@@ -4,15 +4,15 @@ describe Rake::Funnel::Tasks::Timing do
|
|
4
4
|
before do
|
5
5
|
Rake.application = nil
|
6
6
|
Rake::Task.clear
|
7
|
-
|
8
|
-
# rubocop:disable RSpec/ExpectInHook
|
9
|
-
expect(define_tasks).to be
|
10
|
-
expect(subject).to be
|
11
|
-
# rubocop:enable RSpec/ExpectInHook
|
12
7
|
end
|
13
8
|
|
14
9
|
let(:define_tasks) { task :task }
|
15
10
|
|
11
|
+
subject! do
|
12
|
+
define_tasks
|
13
|
+
described_class.new
|
14
|
+
end
|
15
|
+
|
16
16
|
after do
|
17
17
|
subject.reset!
|
18
18
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rake-funnel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.22.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Groß
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-05-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: configatron
|
@@ -81,6 +81,7 @@ extra_rdoc_files: []
|
|
81
81
|
files:
|
82
82
|
- ".rspec"
|
83
83
|
- ".simplecov"
|
84
|
+
- CHANGELOG.md
|
84
85
|
- Gemfile
|
85
86
|
- README.md
|
86
87
|
- lib/rake/funnel.rb
|
@@ -233,7 +234,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
233
234
|
version: '0'
|
234
235
|
requirements: []
|
235
236
|
rubyforge_project:
|
236
|
-
rubygems_version: 2.
|
237
|
+
rubygems_version: 2.7.3
|
237
238
|
signing_key:
|
238
239
|
specification_version: 4
|
239
240
|
summary: A build pipeline targeted at .NET projects. Supports environment configuration
|