alpacabuildtool 1.0.0
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 +7 -0
- data/.gitignore +48 -0
- data/.rubocop.yml +12 -0
- data/.semver +6 -0
- data/.travis.yml +10 -0
- data/CHANGELOG +18 -0
- data/Gemfile +7 -0
- data/LICENSE +22 -0
- data/README.md +235 -0
- data/README.rdoc +39 -0
- data/Rakefile +74 -0
- data/alpacabuildtool.gemspec +34 -0
- data/alpacabuildtool.rdoc +5 -0
- data/alpacabuildtool.todo +9 -0
- data/bin/alpaca +142 -0
- data/features/alpaca.feature +8 -0
- data/features/step_definitions/alpaca_steps.rb +13 -0
- data/features/step_definitions/visual_studio_solutions_steps.rb +47 -0
- data/features/support/env.rb +10 -0
- data/features/visual_studio_solutions.feature +43 -0
- data/lib/alpacabuildtool.rb +4 -0
- data/lib/alpacabuildtool/application.rb +195 -0
- data/lib/alpacabuildtool/configuration.rb +209 -0
- data/lib/alpacabuildtool/data/.alpaca.conf +148 -0
- data/lib/alpacabuildtool/data/doom.flf +826 -0
- data/lib/alpacabuildtool/data/logo.jpg +0 -0
- data/lib/alpacabuildtool/entities/nuspec.rb +107 -0
- data/lib/alpacabuildtool/entities/project.rb +54 -0
- data/lib/alpacabuildtool/entities/solution.rb +104 -0
- data/lib/alpacabuildtool/entities/xml.rb +41 -0
- data/lib/alpacabuildtool/entities/xml_node.rb +75 -0
- data/lib/alpacabuildtool/log/font.rb +92 -0
- data/lib/alpacabuildtool/log/log.rb +15 -0
- data/lib/alpacabuildtool/log/rainbowify_formatter.rb +70 -0
- data/lib/alpacabuildtool/log/rainbowify_logger.rb +47 -0
- data/lib/alpacabuildtool/managers/build_manager.rb +32 -0
- data/lib/alpacabuildtool/managers/package_manager.rb +136 -0
- data/lib/alpacabuildtool/managers/report_manager.rb +33 -0
- data/lib/alpacabuildtool/managers/test_manager.rb +35 -0
- data/lib/alpacabuildtool/os.rb +29 -0
- data/lib/alpacabuildtool/package_types/project_package.rb +44 -0
- data/lib/alpacabuildtool/package_types/tool_package.rb +53 -0
- data/lib/alpacabuildtool/tools/git.rb +22 -0
- data/lib/alpacabuildtool/tools/msbuild.rb +29 -0
- data/lib/alpacabuildtool/tools/nuget.rb +49 -0
- data/lib/alpacabuildtool/tools/nunit.rb +28 -0
- data/lib/alpacabuildtool/tools/nunit_orange.rb +18 -0
- data/lib/alpacabuildtool/tools/open_cover.rb +29 -0
- data/lib/alpacabuildtool/tools/report_generator.rb +25 -0
- data/lib/alpacabuildtool/tools/tool.rb +84 -0
- data/lib/alpacabuildtool/tools/wrapper.rb +66 -0
- data/lib/alpacabuildtool/versioning/version.rb +163 -0
- data/lib/alpacabuildtool/versioning/versioning.rb +84 -0
- data/spec/lib/alpacabuildtool/configuration_spec.rb +201 -0
- data/spec/lib/alpacabuildtool/entities/xml_spec.rb +39 -0
- data/spec/lib/alpacabuildtool/versioning/version_spec.rb +86 -0
- data/spec/lib/alpacabuildtool/versioning/versioning_spec.rb +194 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/support/coverage.rb +26 -0
- data/test_data/sln1/.alpaca.conf +11 -0
- data/test_data/sln1/.semver +6 -0
- data/test_data/sln1/TestSolution.sln +22 -0
- data/test_data/sln1/TestSolution/App.config +6 -0
- data/test_data/sln1/TestSolution/Program.cs +16 -0
- data/test_data/sln1/TestSolution/Properties/AssemblyInfo.cs +36 -0
- data/test_data/sln1/TestSolution/TestSolution.csproj +59 -0
- data/test_data/sln2/.alpaca.conf +8 -0
- data/test_data/sln2/.semver +6 -0
- data/test_data/sln2/ProjectName/ProjectName.csproj +54 -0
- data/test_data/sln2/ProjectName/Properties/AssemblyInfo.cs +36 -0
- data/test_data/sln2/ProjectName/SomeFolderInProject/SomeClass.cs +16 -0
- data/test_data/sln2/ProjectName2/ProjectName2.csproj +58 -0
- data/test_data/sln2/ProjectName2/Properties/AssemblyInfo.cs +37 -0
- data/test_data/sln2/SolutionName.sln +34 -0
- data/test_data/sln2/Unit.Tests/Properties/AssemblyInfo.cs +36 -0
- data/test_data/sln2/Unit.Tests/SomeClassTests.cs +21 -0
- data/test_data/sln2/Unit.Tests/Unit.Tests.csproj +65 -0
- data/test_data/sln2/Unit.Tests/packages.config +4 -0
- data/test_data/sln3/TestSolution.nobuild.sln +22 -0
- data/test_data/sln3/TestSolution/App.config +6 -0
- data/test_data/sln3/TestSolution/Program.cs +16 -0
- data/test_data/sln3/TestSolution/Properties/AssemblyInfo.cs +36 -0
- data/test_data/sln3/TestSolution/TestSolution.nobuild.csproj +59 -0
- metadata +309 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
3
|
+
require 'alpacabuildtool/versioning/versioning'
|
|
4
|
+
version = ((AlpacaBuildTool::Versioning.find).to_s '%M.%m.%p%s').gsub('-', '.')
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |s|
|
|
7
|
+
s.name = 'alpacabuildtool'
|
|
8
|
+
s.version = version
|
|
9
|
+
s.author = 'Vasyl Purchel'
|
|
10
|
+
s.email = 'vasyl.purchel@gmail.com'
|
|
11
|
+
s.homepage = 'https://github.com/vasyl-purchel/alpaca'
|
|
12
|
+
s.license = 'MIT'
|
|
13
|
+
s.platform = Gem::Platform::RUBY
|
|
14
|
+
s.summary = 'yet another build tool for Visual Studio solutions'
|
|
15
|
+
s.files = `git ls-files -z`.split("\x0")
|
|
16
|
+
s.test_files = s.files.grep(/^(test|spec|features|test_data)/)
|
|
17
|
+
s.require_paths << 'lib'
|
|
18
|
+
s.has_rdoc = true
|
|
19
|
+
s.extra_rdoc_files = ['README.rdoc', 'alpacabuildtool.rdoc']
|
|
20
|
+
s.rdoc_options << '--title' << 'AlpacaBuildTool'
|
|
21
|
+
s.rdoc_options << '--main' << 'README.rdoc' << '-ri'
|
|
22
|
+
s.bindir = 'bin'
|
|
23
|
+
s.executables << 'alpaca'
|
|
24
|
+
s.add_development_dependency('rake')
|
|
25
|
+
s.add_development_dependency('rdoc')
|
|
26
|
+
s.add_development_dependency('cucumber', '~> 2.0.0')
|
|
27
|
+
s.add_development_dependency('rspec', '~> 3.2.0')
|
|
28
|
+
s.add_development_dependency('fakefs')
|
|
29
|
+
s.add_development_dependency('rubocop', '~> 0.30.1')
|
|
30
|
+
s.add_development_dependency('bundler', '~> 1.6')
|
|
31
|
+
s.add_development_dependency('simplecov', '~> 0.7')
|
|
32
|
+
s.add_runtime_dependency('gli', '2.13.0')
|
|
33
|
+
s.add_runtime_dependency('rainbow')
|
|
34
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
tasks:
|
|
2
|
+
☐ decouple from tools (configure test_tool with formatter type, parameters
|
|
3
|
+
and so on from configs instead of NUnit class)
|
|
4
|
+
☐ add nunit tests categories (not types like unit, service, ...
|
|
5
|
+
but MetaTestsAttribute, CoreTestsAttribute...)
|
|
6
|
+
☐ add service tests running:
|
|
7
|
+
☐ eval 'service_tests_script' to update service configuration
|
|
8
|
+
☐ run 'exe' in child process
|
|
9
|
+
☐ run 'service' type project tests
|
data/bin/alpaca
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
require 'gli'
|
|
3
|
+
require 'alpacabuildtool'
|
|
4
|
+
|
|
5
|
+
module AlpacaBuildTool
|
|
6
|
+
##
|
|
7
|
+
# The *GliWrapper* module provides command line interface by using GLI::App
|
|
8
|
+
module GliWrapper
|
|
9
|
+
include GLI::App
|
|
10
|
+
extend self
|
|
11
|
+
|
|
12
|
+
program_desc 'is a build tool for Visual Studio solutions'
|
|
13
|
+
subcommand_option_handling :normal
|
|
14
|
+
arguments :strict
|
|
15
|
+
gem_path = File.join(File.expand_path(File.dirname(__FILE__)), '..')
|
|
16
|
+
version Versioning.parse(File.join(gem_path, '.semver')).to_s
|
|
17
|
+
|
|
18
|
+
on_error do |exception|
|
|
19
|
+
puts exception.backtrace if ENV['DEV'] == 'true'
|
|
20
|
+
true
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
desc 'Solutions search pattern'
|
|
24
|
+
default_value '**/*.sln'
|
|
25
|
+
flag [:p, :pattern]
|
|
26
|
+
|
|
27
|
+
desc 'Compile solution[s]'
|
|
28
|
+
long_desc 'Compiling each solution founded from pattern in global options'
|
|
29
|
+
command :compile do |command|
|
|
30
|
+
command.desc 'Build solution in Debug mode'
|
|
31
|
+
command.switch :d, :debug
|
|
32
|
+
|
|
33
|
+
command.desc 'Update project versions'
|
|
34
|
+
command.switch :u, :update
|
|
35
|
+
|
|
36
|
+
command.action do |global, options, _|
|
|
37
|
+
Application.new.compile(global[:p],
|
|
38
|
+
debug: options[:d] || false,
|
|
39
|
+
update_version: options[:u] || false)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
desc 'Test solution[s]'
|
|
44
|
+
long_desc 'Testing each solution founded from pattern in global options'
|
|
45
|
+
command :test do |command|
|
|
46
|
+
command.desc 'Test solution in Debug mode'
|
|
47
|
+
command.switch :d, :debug, negatable: false
|
|
48
|
+
|
|
49
|
+
command.desc 'Run tests with coverage'
|
|
50
|
+
command.switch [:c, :coverage]
|
|
51
|
+
|
|
52
|
+
command.desc 'Test type'
|
|
53
|
+
command.default_value 'all'
|
|
54
|
+
command.flag :t, :type
|
|
55
|
+
|
|
56
|
+
command.action do |global, options, _|
|
|
57
|
+
Application.new.test(global[:p],
|
|
58
|
+
debug: options[:d] || false,
|
|
59
|
+
coverage: options[:c] || false,
|
|
60
|
+
type: options[:t])
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
desc 'Generate reports for solution[s]'
|
|
65
|
+
long_desc 'Generate reports for all founded results for solutions'
|
|
66
|
+
command :report do |command|
|
|
67
|
+
command.desc 'Report category'
|
|
68
|
+
command.default_value 'all'
|
|
69
|
+
command.flag :t, :type
|
|
70
|
+
|
|
71
|
+
command.action do |global, options, _|
|
|
72
|
+
Application.new.report(global[:p], type: options[:t])
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
desc 'Create packages for solution[s]'
|
|
77
|
+
long_desc 'Create new packages for solutions'
|
|
78
|
+
command :pack do |command|
|
|
79
|
+
command.desc 'Pack package in Debug mode'
|
|
80
|
+
command.switch :d, :debug, negatable: false, default_value: false
|
|
81
|
+
|
|
82
|
+
command.desc 'Push package after it created if it contains changes'
|
|
83
|
+
command.switch :p, :push, default_value: false
|
|
84
|
+
|
|
85
|
+
command.desc 'Force push package after it created'
|
|
86
|
+
command.switch :f, :force, default_value: false
|
|
87
|
+
|
|
88
|
+
command.action do |global, options, _|
|
|
89
|
+
Application.new.package(global[:p], options)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
desc 'Release packages for solution[s]'
|
|
94
|
+
long_desc 'Update package to release version and push it'
|
|
95
|
+
command :release do |command|
|
|
96
|
+
command.desc 'Push to the source after released'
|
|
97
|
+
command.switch :p, :push, default_value: true
|
|
98
|
+
|
|
99
|
+
command.desc 'Force push package after it created'
|
|
100
|
+
command.switch :f, :force, default_value: false
|
|
101
|
+
|
|
102
|
+
command.action do |global, options, _|
|
|
103
|
+
Application.new.release(global[:p], options)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
desc 'Update solution[s] versions'
|
|
108
|
+
long_desc 'Update version for each solution'
|
|
109
|
+
command :update do |command|
|
|
110
|
+
command.desc 'Version dimension to be updated(patch, minor..)'
|
|
111
|
+
command.default_value 'patch'
|
|
112
|
+
command.flag :d, :dimension
|
|
113
|
+
|
|
114
|
+
command.action do |global, options, _|
|
|
115
|
+
Application.new.update(global[:p], options)
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
desc 'Configure alpaca to your needs'
|
|
120
|
+
long_desc 'Save configuration into local/global conf files
|
|
121
|
+
for further usage'
|
|
122
|
+
command :configure do |command|
|
|
123
|
+
command.desc 'configure solution[s] from global pattern'
|
|
124
|
+
command.arg_name 'node1.node2.property=value', :multiple
|
|
125
|
+
command.command :local do |subcommand|
|
|
126
|
+
subcommand.action do |global, _, arguments|
|
|
127
|
+
Application.new.configure_local(global[:p], arguments)
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
command.desc 'configure alpaca in user wide sence'
|
|
132
|
+
command.arg_name 'node1.node2.property=value', :multiple
|
|
133
|
+
command.command :global do |subcommand|
|
|
134
|
+
subcommand.action do |_, _, arguments|
|
|
135
|
+
Application.new.configure_global(arguments)
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
exit AlpacaBuildTool::GliWrapper.run(ARGV)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
When(/^I run "(.*?)"$/) do |command_line|
|
|
2
|
+
call = "#{prefix}#{command_line}"
|
|
3
|
+
@call_result = `#{call}`
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
When(/I get help for "(.*)"/) do |app_name|
|
|
7
|
+
@app_name = app_name
|
|
8
|
+
step %(I run "#{@app_name} help")
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
Then(/the exit status should be (.*)/) do |status|
|
|
12
|
+
expect($CHILD_STATUS.to_i).to eq status.to_i
|
|
13
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
Then(/^alpaca build file (.*?)$/) do |project_file|
|
|
2
|
+
proj = File.basename(project_file, '.*')
|
|
3
|
+
build_project = /#{proj} -> (.*?)\\#{project_file}/
|
|
4
|
+
expect(@call_result.match(build_project)).to_not be nil
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
Then(/^alpaca do not build file (.*?)$/) do |project_file|
|
|
8
|
+
proj = File.basename(project_file, '.*')
|
|
9
|
+
build_project = /#{proj} -> (.*?)\\#{project_file}/
|
|
10
|
+
expect(@call_result.match(build_project)).to be nil
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
Then(/^alpaca restore nuget packages for (.*?)$/) do |solution_file|
|
|
14
|
+
solution_dir = File.dirname(File.expand_path(solution_file))
|
|
15
|
+
nuget_call = /Nuget.exe restore #{File.expand_path(solution_file)}/
|
|
16
|
+
expect(@call_result.match(nuget_call)).to_not be nil
|
|
17
|
+
expect(Dir.glob(solution_dir + '/packages/*').count).to be > 0
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
Then(/^solution has failing unit test$/) do
|
|
21
|
+
# nothing to do here as there is failing unit test in solution 2
|
|
22
|
+
# step is used only as a marker in reports
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
Then(/^alpaca generate unit test results (.*?)$/) do |results_file|
|
|
26
|
+
expect(File.exist?(results_file)).to be true
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
Then(/^alpaca generate test coverage summary (.*?)$/) do |summary_file|
|
|
30
|
+
expect(File.exist?(summary_file)).to be true
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
Then(/^alpaca generate unit tests report (.*?)$/) do |report_file|
|
|
34
|
+
expect(File.exist?(report_file)).to be true
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
Then(/^alpaca generate coverage report (.*?)$/) do |index_file|
|
|
38
|
+
expect(File.exist?(index_file)).to be true
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
Then(/^alpaca creates (.*?)$/) do |package_file|
|
|
42
|
+
expect(File.exist?(package_file)).to be true
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
AfterStep('@teardown_changes') do
|
|
46
|
+
`git stash save --keep-index --include-untracked`
|
|
47
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
@windows
|
|
2
|
+
Feature: Alpaca can work with Visual Studio solutions
|
|
3
|
+
In order to work with visual studio solutions I need to be sure
|
|
4
|
+
that alpaca can be used as a build tool for them
|
|
5
|
+
|
|
6
|
+
Scenario: Alpaca compile solution
|
|
7
|
+
When I run "alpaca compile"
|
|
8
|
+
And alpaca build file TestSolution.exe
|
|
9
|
+
And alpaca do not build file TestSolution.nobuild.exe
|
|
10
|
+
And alpaca restore nuget packages for test_data/sln2/SolutionName.sln
|
|
11
|
+
And alpaca build file ProjectName.dll
|
|
12
|
+
And alpaca build file ProjectName2.dll
|
|
13
|
+
And the exit status should be 0
|
|
14
|
+
|
|
15
|
+
Scenario: Alpaca test solution
|
|
16
|
+
When I run "alpaca test"
|
|
17
|
+
And solution has failing unit test
|
|
18
|
+
Then the exit status should be 256
|
|
19
|
+
|
|
20
|
+
Scenario: Alpaca test with coverage solution
|
|
21
|
+
When I run "alpaca test -c"
|
|
22
|
+
Then alpaca generate unit test results test_data/sln2/.tests/UnitTestsResult.xml
|
|
23
|
+
And alpaca generate test coverage summary test_data/sln2/.tests/coverage.xml
|
|
24
|
+
And the exit status should be 0
|
|
25
|
+
|
|
26
|
+
Scenario: Alpaca report tests results
|
|
27
|
+
When I run "alpaca report"
|
|
28
|
+
Then alpaca generate unit tests report test_data/sln2/.tests/UnitTestsResult.html
|
|
29
|
+
Then alpaca generate coverage report test_data/sln2/.tests/index.htm
|
|
30
|
+
|
|
31
|
+
Scenario: Alpaca pack solution
|
|
32
|
+
When I run "alpaca pack"
|
|
33
|
+
Then alpaca creates test_data/sln1/.output/TestData.FirstSolution.0.0.1-alpha.nupkg
|
|
34
|
+
Then alpaca creates test_data/sln1/.output/TestData.FirstSolution.0.0.1-alpha.symbols.nupkg
|
|
35
|
+
And alpaca creates test_data/sln2/.output/TestData.SecondSolution.2.0.11.nupkg
|
|
36
|
+
And alpaca creates test_data/sln2/.output/TestData.SecondSolution.2.0.11.symbols.nupkg
|
|
37
|
+
And the exit status should be 0
|
|
38
|
+
|
|
39
|
+
@teardown_changes
|
|
40
|
+
Scenario: Alpaca release package
|
|
41
|
+
When I run "alpaca -p '**/TestSolution.sln' release --no-push"
|
|
42
|
+
Then alpaca creates test_data/sln1/.output/TestData.FirstSolution.0.0.1.nupkg
|
|
43
|
+
And the exit status should be 0
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
require 'alpacabuildtool/log/log'
|
|
2
|
+
require 'alpacabuildtool/entities/solution'
|
|
3
|
+
require 'alpacabuildtool/managers/build_manager'
|
|
4
|
+
require 'alpacabuildtool/managers/package_manager'
|
|
5
|
+
require 'alpacabuildtool/managers/test_manager'
|
|
6
|
+
require 'alpacabuildtool/managers/report_manager'
|
|
7
|
+
|
|
8
|
+
module AlpacaBuildTool
|
|
9
|
+
##
|
|
10
|
+
# Application is a main entry point for CLI
|
|
11
|
+
class Application
|
|
12
|
+
include Log
|
|
13
|
+
|
|
14
|
+
##
|
|
15
|
+
# Compiles solution [s]
|
|
16
|
+
#
|
|
17
|
+
# +pattern+:: pattern for solutions search
|
|
18
|
+
# +options+:: hash with compilation options
|
|
19
|
+
# <tt>options[:debug] = true</tt> is to compile solution in debug mode<br>
|
|
20
|
+
# <tt>options[:update_version] = true</tt> is to update project versions
|
|
21
|
+
# before compiling
|
|
22
|
+
#
|
|
23
|
+
# app.compile('**/*.sln', debug: true, update_version: true)
|
|
24
|
+
# # => building found solutions in debug mode
|
|
25
|
+
# # with updating project versions
|
|
26
|
+
def compile(pattern, options)
|
|
27
|
+
log.header 'Compile'
|
|
28
|
+
each_solution(pattern) do |solution|
|
|
29
|
+
build_manager = BuildManager.new(solution)
|
|
30
|
+
build_manager.build(options[:debug], options[:update_version])
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
##
|
|
35
|
+
# Run tests for solution [s]
|
|
36
|
+
#
|
|
37
|
+
# +pattern+:: pattern for solutions search
|
|
38
|
+
# +options+:: hash with testing options
|
|
39
|
+
# <tt>options[:debug] = true</tt> is to run tests in debug mode<br>
|
|
40
|
+
# <tt>options[:coverage] = true</tt> is to run coverage<br>
|
|
41
|
+
# <tt>options[:type] = 'all'</tt> is to run 'all' test types
|
|
42
|
+
# ('all', 'unit', 'service')
|
|
43
|
+
#
|
|
44
|
+
# app.test('**/*.sln', coverage: true, type: 'unit')
|
|
45
|
+
# # => running unit tests with coverage
|
|
46
|
+
def test(pattern, options)
|
|
47
|
+
log.header 'Test'
|
|
48
|
+
each_solution(pattern) do |solution|
|
|
49
|
+
test_projects = solution.specific_projects(options[:type])
|
|
50
|
+
next log.info 'no tests discovered' if test_projects.empty?
|
|
51
|
+
test_manager = TestManager.new(solution)
|
|
52
|
+
test_manager.test(test_projects, options[:coverage], options[:debug])
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
##
|
|
57
|
+
# Convert test results into reports for solution [s]
|
|
58
|
+
#
|
|
59
|
+
# +pattern+:: pattern for solutions search
|
|
60
|
+
# +options+:: hash with reporting options
|
|
61
|
+
# <tt>options[:type] = 'all'</tt> is to convert 'all' results into reports
|
|
62
|
+
# ('all', 'tests', 'coverage')
|
|
63
|
+
#
|
|
64
|
+
# app.report('**/*.sln', type: 'coverage')
|
|
65
|
+
# # => converting coverage results into html reports
|
|
66
|
+
def report(pattern, options)
|
|
67
|
+
log.header 'Report'
|
|
68
|
+
each_solution(pattern) do |solution|
|
|
69
|
+
report_manager = ReportManager.new(solution)
|
|
70
|
+
report_manager.convert(options[:type])
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
##
|
|
75
|
+
# Create packages for solution [s]
|
|
76
|
+
#
|
|
77
|
+
# +pattern+:: pattern for solutions search
|
|
78
|
+
# +options+:: hash with packaging options
|
|
79
|
+
# <tt>options[:debug] = true</tt> is to create packages from debug mode<br\>
|
|
80
|
+
# <tt>options[:push] = true</tt> is to push packages after they are created
|
|
81
|
+
# <br\>
|
|
82
|
+
# <tt>options[:force] = true</tt> is to create/push packages even if it has
|
|
83
|
+
# no changes
|
|
84
|
+
#
|
|
85
|
+
# app.package('**/*.sln')
|
|
86
|
+
# # => creating only packages with changes in release mode without
|
|
87
|
+
# # pushing them
|
|
88
|
+
def package(pattern, options)
|
|
89
|
+
log.header 'Package'
|
|
90
|
+
each_solution(pattern) do |solution|
|
|
91
|
+
version = solution.package_version
|
|
92
|
+
package_manager = PackageManager.new(solution)
|
|
93
|
+
(solution.configuration['packages'] || []).each do |package|
|
|
94
|
+
package_manager.create_package(package, version, options)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
##
|
|
100
|
+
# Release packages for solution [s]
|
|
101
|
+
#
|
|
102
|
+
# Updates .semver file to get release version if it is not release yet
|
|
103
|
+
# Rebuilds solution and create release package
|
|
104
|
+
# Changes are checked from last release package
|
|
105
|
+
#
|
|
106
|
+
# +pattern+:: pattern for solutions search
|
|
107
|
+
# +options+:: hash with releasing options
|
|
108
|
+
# <tt>options[:push] = true</tt> is to push packages after they are created
|
|
109
|
+
# <br>
|
|
110
|
+
# <tt>options[:force] = true</tt> is to create/push packages even if it has
|
|
111
|
+
# no changes
|
|
112
|
+
#
|
|
113
|
+
# app.release('**/*.sln')
|
|
114
|
+
# # => creating only packages with changes without pushing them
|
|
115
|
+
def release(pattern, options)
|
|
116
|
+
log.header 'Release'
|
|
117
|
+
each_solution(pattern) do |solution|
|
|
118
|
+
semver = Versioning.find(solution.dir)
|
|
119
|
+
semver.release if semver.prerelease?
|
|
120
|
+
Versioning.save semver
|
|
121
|
+
end
|
|
122
|
+
compile(pattern, debug: false, update_version: true)
|
|
123
|
+
test(pattern, {})
|
|
124
|
+
options[:debug] = false
|
|
125
|
+
package(pattern, options)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
##
|
|
129
|
+
# Update .semver files for solution [s]
|
|
130
|
+
#
|
|
131
|
+
# +pattern+:: pattern for solutions search
|
|
132
|
+
# +options+:: hash with releasing options
|
|
133
|
+
# <tt>options['dimension'] = :patch</tt> is to update version patch
|
|
134
|
+
# (major, minor, patch, prerelease)
|
|
135
|
+
#
|
|
136
|
+
# app.update('**/*.sln', 'dimension' => :minor)
|
|
137
|
+
# # => increase minor version in .semver by 1
|
|
138
|
+
def update(pattern, options)
|
|
139
|
+
log.header 'Update'
|
|
140
|
+
each_solution(pattern) do |solution|
|
|
141
|
+
semver = Versioning.find(solution.dir)
|
|
142
|
+
semver.increase(options['dimension'].to_sym)
|
|
143
|
+
Versioning.save semver
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
##
|
|
148
|
+
# Update/create *~/.alpaca.conf*
|
|
149
|
+
#
|
|
150
|
+
# +properties+:: array of properties to store in global configuration
|
|
151
|
+
# in format node1.node2.property=value
|
|
152
|
+
#
|
|
153
|
+
# app.configure_global(['hello.world=yay'])
|
|
154
|
+
# # => produce yaml text in ~/.alpaca.conf:
|
|
155
|
+
# # hello:
|
|
156
|
+
# # world: yay
|
|
157
|
+
def configure_global(properties)
|
|
158
|
+
log.header 'Configure'
|
|
159
|
+
Configuration.set(properties)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
##
|
|
163
|
+
# Update/create *local configuration*
|
|
164
|
+
#
|
|
165
|
+
# +pattern+:: pattern for solutions search
|
|
166
|
+
# +properties+:: array of properties to store in global configuration
|
|
167
|
+
# in format node1.node2.property=value
|
|
168
|
+
#
|
|
169
|
+
# app.configure_local('**/*.sln', ['hello.world=yay'])
|
|
170
|
+
# # => produce yaml text in .alpaca.conf for each solution:
|
|
171
|
+
# # hello:
|
|
172
|
+
# # world: yay
|
|
173
|
+
def configure_local(pattern, properties)
|
|
174
|
+
log.header 'Configure'
|
|
175
|
+
Solutions.each(pattern) do |solution|
|
|
176
|
+
log.puts "saving configuration for #{solution.name}"
|
|
177
|
+
Configuration.new(solution).set(properties)
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
private
|
|
182
|
+
|
|
183
|
+
def each_solution(pattern)
|
|
184
|
+
Dir.glob(pattern).each do |file|
|
|
185
|
+
next unless File.file?(file) && file.end_with?('.sln')
|
|
186
|
+
solution = Solution.new(file)
|
|
187
|
+
log.puts solution
|
|
188
|
+
next log.info 'no build solution' if solution.no_build?
|
|
189
|
+
Dir.chdir(solution.dir) do
|
|
190
|
+
yield solution
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
end
|