rake-funnel 0.3.2.pre → 0.4.0.pre

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.
Files changed (122) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +2 -2
  3. data/Gemfile +4 -0
  4. data/README.md +2 -2
  5. data/lib/rake/funnel/ambiguous_file_error.rb +31 -29
  6. data/lib/rake/funnel/execution_error.rb +28 -26
  7. data/lib/rake/funnel/extensions/case/camel_case.rb +24 -19
  8. data/lib/rake/funnel/extensions/case/pascal_case.rb +24 -19
  9. data/lib/rake/funnel/extensions/case.rb +3 -3
  10. data/lib/rake/funnel/extensions/common_path.rb +60 -52
  11. data/lib/rake/funnel/extensions/disable_colors.rb +33 -27
  12. data/lib/rake/funnel/extensions/rexml.rb +27 -23
  13. data/lib/rake/funnel/extensions/shell.rb +92 -56
  14. data/lib/rake/funnel/extensions/windows_path.rb +15 -11
  15. data/lib/rake/funnel/framework.rb +11 -16
  16. data/lib/rake/funnel/integration/progress_report.rb +72 -70
  17. data/lib/rake/funnel/integration/sync_output.rb +12 -8
  18. data/lib/rake/funnel/integration/teamcity/nunit_plugin.rb +61 -55
  19. data/lib/rake/funnel/integration/teamcity/progress_report.rb +39 -33
  20. data/lib/rake/funnel/integration/teamcity/service_messages.rb +46 -40
  21. data/lib/rake/funnel/integration/teamcity/teamcity.rb +19 -15
  22. data/lib/rake/funnel/integration/teamcity.rb +3 -5
  23. data/lib/rake/funnel/support/argument_mapper/key_value_pair.rb +16 -10
  24. data/lib/rake/funnel/support/argument_mapper/styles/default.rb +39 -31
  25. data/lib/rake/funnel/support/argument_mapper/styles/msbuild.rb +41 -33
  26. data/lib/rake/funnel/support/argument_mapper/styles/msdeploy.rb +55 -47
  27. data/lib/rake/funnel/support/argument_mapper/styles/nunit.rb +41 -33
  28. data/lib/rake/funnel/support/argument_mapper/styles.rb +3 -5
  29. data/lib/rake/funnel/support/argument_mapper/switch.rb +16 -10
  30. data/lib/rake/funnel/support/argument_mapper/value.rb +16 -10
  31. data/lib/rake/funnel/support/assembly_version/from_version_files.rb +39 -35
  32. data/lib/rake/funnel/support/assembly_version/languages/cs +5 -5
  33. data/lib/rake/funnel/support/assembly_version/languages/fs +12 -12
  34. data/lib/rake/funnel/support/assembly_version/languages/vb +5 -5
  35. data/lib/rake/funnel/support/assembly_version_writer.rb +56 -52
  36. data/lib/rake/funnel/support/binary_version_reader.rb +37 -32
  37. data/lib/rake/funnel/support/copier.rb +31 -27
  38. data/lib/rake/funnel/support/environments/loader.rb +46 -40
  39. data/lib/rake/funnel/support/environments.rb +3 -3
  40. data/lib/rake/funnel/support/internal/finder.rb +55 -51
  41. data/lib/rake/funnel/support/internal/instantiate_symbol.rb +38 -34
  42. data/lib/rake/funnel/support/mapper.rb +57 -53
  43. data/lib/rake/funnel/support/mono.rb +21 -17
  44. data/lib/rake/funnel/support/msbuild/build_tool.rb +30 -24
  45. data/lib/rake/funnel/support/msbuild.rb +3 -3
  46. data/lib/rake/funnel/support/msdeploy/registry_patch.rb +90 -84
  47. data/lib/rake/funnel/support/msdeploy.rb +3 -3
  48. data/lib/rake/funnel/support/patch.rb +41 -37
  49. data/lib/rake/funnel/support/specs_remover.rb +66 -62
  50. data/lib/rake/funnel/support/template_engine.rb +30 -26
  51. data/lib/rake/funnel/support/timing/report.rb +95 -89
  52. data/lib/rake/funnel/support/timing/statistics.rb +32 -26
  53. data/lib/rake/funnel/support/timing.rb +3 -3
  54. data/lib/rake/funnel/support/version_info.rb +103 -72
  55. data/lib/rake/funnel/support/which.rb +19 -15
  56. data/lib/rake/funnel/support/zipper.rb +53 -49
  57. data/lib/rake/funnel/tasks/assembly_version.rb +44 -40
  58. data/lib/rake/funnel/tasks/bin_path.rb +45 -41
  59. data/lib/rake/funnel/tasks/copy.rb +43 -39
  60. data/lib/rake/funnel/tasks/environments.rb +89 -89
  61. data/lib/rake/funnel/tasks/msbuild.rb +55 -51
  62. data/lib/rake/funnel/tasks/msdeploy.rb +54 -50
  63. data/lib/rake/funnel/tasks/nunit.rb +52 -48
  64. data/lib/rake/funnel/tasks/paket.rb +51 -47
  65. data/lib/rake/funnel/tasks/quick_template.rb +53 -49
  66. data/lib/rake/funnel/tasks/side_by_side_specs.rb +41 -37
  67. data/lib/rake/funnel/tasks/timing.rb +108 -104
  68. data/lib/rake/funnel/tasks/zip.rb +46 -42
  69. data/lib/rake/funnel/version.rb +1 -1
  70. data/lib/rake/funnel.rb +7 -7
  71. data/rake-funnel.gemspec +12 -3
  72. data/spec/rake/funnel/execution_error_spec.rb +67 -67
  73. data/spec/rake/funnel/extensions/case/camel_case_spec.rb +17 -17
  74. data/spec/rake/funnel/extensions/case/pascal_case_spec.rb +17 -17
  75. data/spec/rake/funnel/extensions/common_path_spec.rb +56 -56
  76. data/spec/rake/funnel/extensions/disable_colors_spec.rb +33 -33
  77. data/spec/rake/funnel/extensions/rexml_spec.rb +20 -20
  78. data/spec/rake/funnel/extensions/shell_spec.rb +237 -237
  79. data/spec/rake/funnel/extensions/windows_path_spec.rb +5 -5
  80. data/spec/rake/funnel/integration/progress_report_spec.rb +149 -149
  81. data/spec/rake/funnel/integration/sync_output_spec.rb +16 -16
  82. data/spec/rake/funnel/integration/teamcity/nunit_plugin_spec.rb +110 -110
  83. data/spec/rake/funnel/integration/teamcity/progress_report_spec.rb +174 -174
  84. data/spec/rake/funnel/integration/teamcity/service_messages_spec.rb +136 -136
  85. data/spec/rake/funnel/integration/teamcity/teamcity_spec.rb +34 -34
  86. data/spec/rake/funnel/support/argument_mapper/styles/msdeploy_spec.rb +222 -222
  87. data/spec/rake/funnel/support/argument_mapper/styles/nunit_spec.rb +25 -25
  88. data/spec/rake/funnel/support/argument_mapper/styles/styles_spec.rb +214 -214
  89. data/spec/rake/funnel/support/assembly_version/from_version_files_spec.rb +66 -61
  90. data/spec/rake/funnel/support/assembly_version_writer_spec.rb +140 -140
  91. data/spec/rake/funnel/support/binary_version_reader_spec.rb +29 -29
  92. data/spec/rake/funnel/support/copier_spec.rb +58 -58
  93. data/spec/rake/funnel/support/environments/loader_spec.rb +143 -143
  94. data/spec/rake/funnel/support/internal/finder_spec.rb +229 -229
  95. data/spec/rake/funnel/support/internal/instantiate_symbol_spec.rb +182 -183
  96. data/spec/rake/funnel/support/mapper_spec.rb +87 -87
  97. data/spec/rake/funnel/support/mono_spec.rb +57 -57
  98. data/spec/rake/funnel/support/msbuild/build_tool_spec.rb +21 -21
  99. data/spec/rake/funnel/support/msdeploy/registry_patch_spec.rb +139 -139
  100. data/spec/rake/funnel/support/patch_spec.rb +108 -108
  101. data/spec/rake/funnel/support/specs_remover/Sample.csproj +28 -28
  102. data/spec/rake/funnel/support/specs_remover_spec.rb +116 -116
  103. data/spec/rake/funnel/support/template_engine_spec.rb +65 -65
  104. data/spec/rake/funnel/support/timing/report_spec.rb +129 -129
  105. data/spec/rake/funnel/support/version_info_spec.rb +333 -228
  106. data/spec/rake/funnel/support/which_spec.rb +65 -65
  107. data/spec/rake/funnel/support/zipper_spec.rb +77 -77
  108. data/spec/rake/funnel/tasks/assembly_version_spec.rb +45 -45
  109. data/spec/rake/funnel/tasks/bin_path_spec.rb +52 -52
  110. data/spec/rake/funnel/tasks/copy_spec.rb +44 -44
  111. data/spec/rake/funnel/tasks/environments_spec.rb +249 -247
  112. data/spec/rake/funnel/tasks/msbuild_spec.rb +91 -91
  113. data/spec/rake/funnel/tasks/msdeploy_spec.rb +220 -220
  114. data/spec/rake/funnel/tasks/nunit_spec.rb +74 -74
  115. data/spec/rake/funnel/tasks/paket_spec.rb +140 -142
  116. data/spec/rake/funnel/tasks/quick_template_spec.rb +62 -62
  117. data/spec/rake/funnel/tasks/side_by_side_specs_spec.rb +58 -58
  118. data/spec/rake/funnel/tasks/timing_spec.rb +133 -133
  119. data/spec/rake/funnel/tasks/zip_spec.rb +50 -50
  120. data/spec/spec_helper.rb +43 -33
  121. metadata +2 -3
  122. data/lib/rake/funnel/support/side_by_side_specs.rb +0 -3
@@ -1,84 +1,90 @@
1
- module Rake::Funnel::Support::MSDeploy
2
- class RegistryPatch
3
- KEYS = [
4
- 'SOFTWARE\Microsoft\IIS Extensions\MSDeploy\3',
5
- 'SOFTWARE\Wow6432Node\Microsoft\IIS Extensions\MSDeploy\3'
6
- ]
7
- VERSION_VALUE = 'Version'
8
- FAKE_VERSION = '99.0.0.0'
9
-
10
- def initialize(&block)
11
- begin
12
- patch.apply!
13
- yield block if block_given?
14
- ensure
15
- patch.revert!
16
- end
17
- end
18
-
19
- private
20
- def patch
21
- @patch ||= create_patch
22
- end
23
-
24
- def root
25
- Win32::Registry::HKEY_LOCAL_MACHINE
26
- end
27
-
28
- def delete_key(key)
29
- return nil unless key.created?
30
-
31
- keyname = key.keyname
32
- Proc.new {
33
- root.create(File.dirname(keyname)) do |r|
34
- r.delete_key(File.basename(keyname), true)
35
- end
36
- }
37
- end
38
-
39
- def delete_value(key, value)
40
- keyname = key.keyname
41
- Proc.new {
42
- root.create(keyname) do |r|
43
- r.delete_value(value)
44
- end
45
- }
46
- end
47
-
48
- def create_patch
49
- begin
50
- require 'win32/registry'
51
- rescue LoadError
52
- return Rake::Funnel::Support::Patch.new(self)
53
- end
54
-
55
- Rake::Funnel::Support::Patch.new(self) do |p|
56
- resets = []
57
-
58
- p.setup do
59
- resets = KEYS.map do |key|
60
- root.create(key) do |r|
61
- begin
62
- r[VERSION_VALUE]
63
-
64
- delete_version = Proc.new {}
65
- rescue Win32::Registry::Error
66
- r[VERSION_VALUE] = FAKE_VERSION
67
-
68
- delete_version = delete_value(r, VERSION_VALUE)
69
- end
70
-
71
- delete_key(r) || delete_version
72
- end
73
- end
74
- end
75
-
76
- p.reset do
77
- resets.compact.each do |reset|
78
- reset.call
79
- end
80
- end
81
- end
82
- end
83
- end
84
- end
1
+ module Rake
2
+ module Funnel
3
+ module Support
4
+ module MSDeploy
5
+ class RegistryPatch
6
+ KEYS = [
7
+ 'SOFTWARE\Microsoft\IIS Extensions\MSDeploy\3',
8
+ 'SOFTWARE\Wow6432Node\Microsoft\IIS Extensions\MSDeploy\3'
9
+ ]
10
+ VERSION_VALUE = 'Version'
11
+ FAKE_VERSION = '99.0.0.0'
12
+
13
+ def initialize(&block)
14
+ begin
15
+ patch.apply!
16
+ yield block if block_given?
17
+ ensure
18
+ patch.revert!
19
+ end
20
+ end
21
+
22
+ private
23
+ def patch
24
+ @patch ||= create_patch
25
+ end
26
+
27
+ def root
28
+ ::Win32::Registry::HKEY_LOCAL_MACHINE
29
+ end
30
+
31
+ def delete_key(key)
32
+ return nil unless key.created?
33
+
34
+ keyname = key.keyname
35
+ proc {
36
+ root.create(File.dirname(keyname)) do |r|
37
+ r.delete_key(File.basename(keyname), true)
38
+ end
39
+ }
40
+ end
41
+
42
+ def delete_value(key, value)
43
+ keyname = key.keyname
44
+ proc {
45
+ root.create(keyname) do |r|
46
+ r.delete_value(value)
47
+ end
48
+ }
49
+ end
50
+
51
+ def create_patch
52
+ begin
53
+ require 'win32/registry'
54
+ rescue LoadError
55
+ return Rake::Funnel::Support::Patch.new(self)
56
+ end
57
+
58
+ Rake::Funnel::Support::Patch.new(self) do |p|
59
+ resets = []
60
+
61
+ p.setup do
62
+ resets = KEYS.map do |key|
63
+ root.create(key) do |r|
64
+ begin
65
+ r[VERSION_VALUE]
66
+
67
+ delete_version = proc {}
68
+ rescue ::Win32::Registry::Error
69
+ r[VERSION_VALUE] = FAKE_VERSION
70
+
71
+ delete_version = delete_value(r, VERSION_VALUE)
72
+ end
73
+
74
+ delete_key(r) || delete_version
75
+ end
76
+ end
77
+ end
78
+
79
+ p.reset do
80
+ resets.compact.each do |reset|
81
+ reset.call
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -1,3 +1,3 @@
1
- Dir[File.join(File.dirname(__FILE__), File.basename(__FILE__, '.rb'), '*.rb')].each do |path|
2
- require path
3
- end
1
+ Dir[File.join(File.dirname(__FILE__), File.basename(__FILE__, '.rb'), '*.rb')].each do |path|
2
+ require path
3
+ end
@@ -1,37 +1,41 @@
1
- module Rake::Funnel::Support
2
- class Patch
3
- def initialize(context = nil)
4
- @context = context
5
-
6
- yield self if block_given?
7
- end
8
-
9
- def setup(&block)
10
- @setup = block
11
- end
12
-
13
- def reset(&block)
14
- @reset = block
15
- end
16
-
17
- def apply!
18
- return self if @memo
19
- @memo = (@setup || noop).call(@context)
20
-
21
- self
22
- end
23
-
24
- def revert!
25
- return self unless @memo
26
- (@reset || noop).call(@memo)
27
- @memo = nil
28
-
29
- self
30
- end
31
-
32
- private
33
- def noop
34
- Proc.new { }
35
- end
36
- end
37
- end
1
+ module Rake
2
+ module Funnel
3
+ module Support
4
+ class Patch
5
+ def initialize(context = nil)
6
+ @context = context
7
+
8
+ yield self if block_given?
9
+ end
10
+
11
+ def setup(&block)
12
+ @setup = block
13
+ end
14
+
15
+ def reset(&block)
16
+ @reset = block
17
+ end
18
+
19
+ def apply!
20
+ return self if @memo
21
+ @memo = (@setup || noop).call(@context)
22
+
23
+ self
24
+ end
25
+
26
+ def revert!
27
+ return self unless @memo
28
+ (@reset || noop).call(@memo)
29
+ @memo = nil
30
+
31
+ self
32
+ end
33
+
34
+ private
35
+ def noop
36
+ proc {}
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -1,62 +1,66 @@
1
- require 'rexml/document'
2
-
3
- module Rake::Funnel::Support
4
- class SpecsRemover
5
- class << self
6
- DEFAULTS = {
7
- projects: [],
8
- references: [],
9
- specs: []
10
- }
11
-
12
- def remove(args = {})
13
- args = DEFAULTS.merge(args)
14
-
15
- projects(args).each do |project|
16
- xml = REXML::Document.new(File.read(project), { attribute_quote: :quote })
17
-
18
- removed = remove_references(args, xml) + remove_specs(args, xml)
19
-
20
- write_xml(project, xml) if removed.flatten.any?
21
- end
22
-
23
- delete_specs(args)
24
- end
25
-
26
- private
27
- def write_xml(project, xml)
28
- File.open(project, 'w+') do |file|
29
- xml.write(output: file, ie_hack: true)
30
- end
31
- end
32
-
33
- def delete_specs(args)
34
- Dir[*args[:specs]].uniq.each do |spec|
35
- RakeFileUtils.rm(spec)
36
- end
37
- end
38
-
39
- def projects(args)
40
- Dir[*args[:projects]]
41
- end
42
-
43
- def list(args)
44
- ([] << args).flatten
45
- end
46
-
47
- def remove_references(args, xml)
48
- list(args[:references]).map do |ref|
49
- query = "/Project//Reference[starts-with(lower-case(@Include), '#{ref.downcase}')]"
50
- xml.elements.delete_all(query)
51
- end
52
- end
53
-
54
- def remove_specs(args, xml)
55
- list(args[:specs]).map do |glob|
56
- query = "/Project//Compile[matches(lower-case(@Include), '#{glob}')]"
57
- xml.elements.delete_all(query)
58
- end
59
- end
60
- end
61
- end
62
- end
1
+ require 'rexml/document'
2
+
3
+ module Rake
4
+ module Funnel
5
+ module Support
6
+ class SpecsRemover
7
+ class << self
8
+ DEFAULTS = {
9
+ projects: [],
10
+ references: [],
11
+ specs: []
12
+ }
13
+
14
+ def remove(args = {})
15
+ args = DEFAULTS.merge(args)
16
+
17
+ projects(args).each do |project|
18
+ xml = REXML::Document.new(File.read(project), { attribute_quote: :quote })
19
+
20
+ removed = remove_references(args, xml) + remove_specs(args, xml)
21
+
22
+ write_xml(project, xml) if removed.flatten.any?
23
+ end
24
+
25
+ delete_specs(args)
26
+ end
27
+
28
+ private
29
+ def write_xml(project, xml)
30
+ File.open(project, 'w+') do |file|
31
+ xml.write(output: file, ie_hack: true)
32
+ end
33
+ end
34
+
35
+ def delete_specs(args)
36
+ Dir[*args[:specs]].uniq.each do |spec|
37
+ RakeFileUtils.rm(spec)
38
+ end
39
+ end
40
+
41
+ def projects(args)
42
+ Dir[*args[:projects]]
43
+ end
44
+
45
+ def list(args)
46
+ ([] << args).flatten
47
+ end
48
+
49
+ def remove_references(args, xml)
50
+ list(args[:references]).map do |ref|
51
+ query = "/Project//Reference[starts-with(lower-case(@Include), '#{ref.downcase}')]"
52
+ xml.elements.delete_all(query)
53
+ end
54
+ end
55
+
56
+ def remove_specs(args, xml)
57
+ list(args[:specs]).map do |glob|
58
+ query = "/Project//Compile[matches(lower-case(@Include), '#{glob}')]"
59
+ xml.elements.delete_all(query)
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -1,26 +1,30 @@
1
- require 'erb'
2
-
3
- module Rake::Funnel::Support
4
- class TemplateEngine
5
- class << self
6
- def render(template, filename = nil, binding = nil)
7
- render = ERB.new(replace_at_markers(template), nil, '%<>')
8
- render.filename = filename
9
- render.result(binding || top_level_binding)
10
- end
11
-
12
- private
13
- def replace_at_markers(template)
14
- tags = /(@\w[\w\.]+\w@)/
15
-
16
- (template || '').gsub(tags) do |match|
17
- "<%= #{match[1...-1]} %>"
18
- end
19
- end
20
-
21
- def top_level_binding
22
- TOPLEVEL_BINDING.dup
23
- end
24
- end
25
- end
26
- end
1
+ require 'erb'
2
+
3
+ module Rake
4
+ module Funnel
5
+ module Support
6
+ class TemplateEngine
7
+ class << self
8
+ def render(template, filename = nil, binding = nil)
9
+ render = ERB.new(replace_at_markers(template), nil, '%<>')
10
+ render.filename = filename
11
+ render.result(binding || top_level_binding)
12
+ end
13
+
14
+ private
15
+ def replace_at_markers(template)
16
+ tags = /(@\w[\w\.]+\w@)/
17
+
18
+ (template || '').gsub(tags) do |match|
19
+ "<%= #{match[1...-1]} %>"
20
+ end
21
+ end
22
+
23
+ def top_level_binding
24
+ TOPLEVEL_BINDING.dup
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,89 +1,95 @@
1
- require 'smart_colored/extend'
2
-
3
- module Rake::Funnel::Support::Timing
4
- class Report
5
- class Column
6
- attr_reader :header
7
-
8
- def initialize(stats: [], header: '', accessor: -> (_) { '' })
9
- @stats = stats
10
- @header = header
11
- @accessor = accessor
12
- end
13
-
14
- def width
15
- longest_value = @stats.map { |s| @accessor.call(s) }.max_by { |m| m.length } || ''
16
- width = longest_value.length
17
- width = @header.length if width < @header.length
18
- width
19
- end
20
-
21
- def format_header
22
- @header.ljust(width)
23
- end
24
-
25
- def format_value(value)
26
- @accessor.call(value).ljust(width)
27
- end
28
- end
29
-
30
- SPACE = 3
31
- HEADER_WIDTH = 70
32
-
33
- def initialize(stats, opts = {})
34
- @stats = stats
35
- @opts = opts
36
- end
37
-
38
- def render
39
- header
40
- rows
41
- footer
42
- end
43
-
44
- def columns
45
- @columns ||= ([
46
- Column.new(stats: @stats, header: 'Target', accessor: -> (timing) { timing[:task].name }),
47
- Column.new(stats: @stats, header: 'Duration', accessor: -> (timing) { format(timing[:time]) })
48
- ])
49
- end
50
-
51
- private
52
- def header
53
- puts '-' * HEADER_WIDTH
54
- puts 'Build time report'
55
- puts '-' * HEADER_WIDTH
56
-
57
- puts columns.map { |c| c.format_header }.join(' ' * SPACE)
58
- puts columns.map { |c| c.format_header.gsub(/./, '-') }.join(' ' * SPACE)
59
- end
60
-
61
- def rows
62
- @stats.each do |timing|
63
- puts columns.map { |c| c.format_value(timing) }.join(' ' * SPACE)
64
- end
65
- end
66
-
67
- def footer
68
- puts '-' * HEADER_WIDTH
69
- puts 'Total'.ljust(columns[0].width) + ' ' * SPACE + format(Time.now - @stats.started_at)
70
- status_message
71
- puts '-' * HEADER_WIDTH
72
- end
73
-
74
- def format(seconds)
75
- Time.at(seconds).utc.strftime('%H:%M:%S')
76
- end
77
-
78
- def status_message
79
- status = @opts[:failed] ? 'Failed' : 'OK'
80
- status = 'Status'.ljust(columns[0].width) + ' ' * SPACE + status
81
-
82
- if @opts[:failed]
83
- $stderr.puts status.bold.red
84
- else
85
- $stdout.puts status.bold.green
86
- end
87
- end
88
- end
89
- end
1
+ require 'smart_colored/extend'
2
+
3
+ module Rake
4
+ module Funnel
5
+ module Support
6
+ module Timing
7
+ class Report
8
+ class Column
9
+ attr_reader :header
10
+
11
+ def initialize(stats: [], header: '', accessor: -> (_) { '' })
12
+ @stats = stats
13
+ @header = header
14
+ @accessor = accessor
15
+ end
16
+
17
+ def width
18
+ longest_value = @stats.map { |s| @accessor.call(s) }.max_by { |m| m.length } || ''
19
+ width = longest_value.length
20
+ width = @header.length if width < @header.length
21
+ width
22
+ end
23
+
24
+ def format_header
25
+ @header.ljust(width)
26
+ end
27
+
28
+ def format_value(value)
29
+ @accessor.call(value).ljust(width)
30
+ end
31
+ end
32
+
33
+ SPACE = 3
34
+ HEADER_WIDTH = 70
35
+
36
+ def initialize(stats, opts = {})
37
+ @stats = stats
38
+ @opts = opts
39
+ end
40
+
41
+ def render
42
+ header
43
+ rows
44
+ footer
45
+ end
46
+
47
+ def columns
48
+ @columns ||= ([
49
+ Column.new(stats: @stats, header: 'Target', accessor: -> (timing) { timing[:task].name }),
50
+ Column.new(stats: @stats, header: 'Duration', accessor: -> (timing) { format(timing[:time]) })
51
+ ])
52
+ end
53
+
54
+ private
55
+ def header
56
+ puts '-' * HEADER_WIDTH
57
+ puts 'Build time report'
58
+ puts '-' * HEADER_WIDTH
59
+
60
+ puts columns.map { |c| c.format_header }.join(' ' * SPACE)
61
+ puts columns.map { |c| c.format_header.gsub(/./, '-') }.join(' ' * SPACE)
62
+ end
63
+
64
+ def rows
65
+ @stats.each do |timing|
66
+ puts columns.map { |c| c.format_value(timing) }.join(' ' * SPACE)
67
+ end
68
+ end
69
+
70
+ def footer
71
+ puts '-' * HEADER_WIDTH
72
+ puts 'Total'.ljust(columns[0].width) + ' ' * SPACE + format(Time.now - @stats.started_at)
73
+ status_message
74
+ puts '-' * HEADER_WIDTH
75
+ end
76
+
77
+ def format(seconds)
78
+ Time.at(seconds).utc.strftime('%H:%M:%S')
79
+ end
80
+
81
+ def status_message
82
+ status = @opts[:failed] ? 'Failed' : 'OK'
83
+ status = 'Status'.ljust(columns[0].width) + ' ' * SPACE + status
84
+
85
+ if @opts[:failed]
86
+ $stderr.puts status.bold.red
87
+ else
88
+ $stdout.puts status.bold.green
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end