rake_command_filter 0.1.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.
Files changed (149) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +26 -0
  3. data/.gitignore +13 -0
  4. data/.rspec +2 -0
  5. data/.rubocop.yml +10 -0
  6. data/.travis.yml +21 -0
  7. data/CODE_OF_CONDUCT.md +49 -0
  8. data/Gemfile +4 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +95 -0
  11. data/Rakefile +18 -0
  12. data/bin/console +14 -0
  13. data/bin/setup +8 -0
  14. data/lib/command_definition.rb +148 -0
  15. data/lib/command_failed_error.rb +4 -0
  16. data/lib/line_filter.rb +24 -0
  17. data/lib/line_filter_result.rb +70 -0
  18. data/lib/rake_command_definition.rb +21 -0
  19. data/lib/rake_command_filter/version.rb +4 -0
  20. data/lib/rake_command_filter.rb +111 -0
  21. data/lib/rspec_command_definition.rb +49 -0
  22. data/lib/rubocop_command_definition.rb +29 -0
  23. data/lib/yard_command_definition.rb +32 -0
  24. data/rake_command_filter.gemspec +31 -0
  25. data/test_cases/rspec/fail/coverage/.last_run.json +5 -0
  26. data/test_cases/rspec/fail/coverage/.resultset.json +7 -0
  27. data/test_cases/rspec/fail/coverage/.resultset.json.lock +0 -0
  28. data/test_cases/rspec/fail/coverage/assets/0.10.0/application.css +799 -0
  29. data/test_cases/rspec/fail/coverage/assets/0.10.0/application.js +1707 -0
  30. data/test_cases/rspec/fail/coverage/assets/0.10.0/colorbox/border.png +0 -0
  31. data/test_cases/rspec/fail/coverage/assets/0.10.0/colorbox/controls.png +0 -0
  32. data/test_cases/rspec/fail/coverage/assets/0.10.0/colorbox/loading.gif +0 -0
  33. data/test_cases/rspec/fail/coverage/assets/0.10.0/colorbox/loading_background.png +0 -0
  34. data/test_cases/rspec/fail/coverage/assets/0.10.0/favicon_green.png +0 -0
  35. data/test_cases/rspec/fail/coverage/assets/0.10.0/favicon_red.png +0 -0
  36. data/test_cases/rspec/fail/coverage/assets/0.10.0/favicon_yellow.png +0 -0
  37. data/test_cases/rspec/fail/coverage/assets/0.10.0/loading.gif +0 -0
  38. data/test_cases/rspec/fail/coverage/assets/0.10.0/magnify.png +0 -0
  39. data/test_cases/rspec/fail/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  40. data/test_cases/rspec/fail/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  41. data/test_cases/rspec/fail/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  42. data/test_cases/rspec/fail/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  43. data/test_cases/rspec/fail/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  44. data/test_cases/rspec/fail/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  45. data/test_cases/rspec/fail/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  46. data/test_cases/rspec/fail/coverage/assets/0.10.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  47. data/test_cases/rspec/fail/coverage/assets/0.10.0/smoothness/images/ui-icons_222222_256x240.png +0 -0
  48. data/test_cases/rspec/fail/coverage/assets/0.10.0/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  49. data/test_cases/rspec/fail/coverage/assets/0.10.0/smoothness/images/ui-icons_454545_256x240.png +0 -0
  50. data/test_cases/rspec/fail/coverage/assets/0.10.0/smoothness/images/ui-icons_888888_256x240.png +0 -0
  51. data/test_cases/rspec/fail/coverage/assets/0.10.0/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  52. data/test_cases/rspec/fail/coverage/index.html +72 -0
  53. data/test_cases/rspec/fail/fail_spec.rb +7 -0
  54. data/test_cases/rspec/ok/coverage/.last_run.json +5 -0
  55. data/test_cases/rspec/ok/coverage/.resultset.json +15 -0
  56. data/test_cases/rspec/ok/coverage/.resultset.json.lock +0 -0
  57. data/test_cases/rspec/ok/coverage/assets/0.10.0/application.css +799 -0
  58. data/test_cases/rspec/ok/coverage/assets/0.10.0/application.js +1707 -0
  59. data/test_cases/rspec/ok/coverage/assets/0.10.0/colorbox/border.png +0 -0
  60. data/test_cases/rspec/ok/coverage/assets/0.10.0/colorbox/controls.png +0 -0
  61. data/test_cases/rspec/ok/coverage/assets/0.10.0/colorbox/loading.gif +0 -0
  62. data/test_cases/rspec/ok/coverage/assets/0.10.0/colorbox/loading_background.png +0 -0
  63. data/test_cases/rspec/ok/coverage/assets/0.10.0/favicon_green.png +0 -0
  64. data/test_cases/rspec/ok/coverage/assets/0.10.0/favicon_red.png +0 -0
  65. data/test_cases/rspec/ok/coverage/assets/0.10.0/favicon_yellow.png +0 -0
  66. data/test_cases/rspec/ok/coverage/assets/0.10.0/loading.gif +0 -0
  67. data/test_cases/rspec/ok/coverage/assets/0.10.0/magnify.png +0 -0
  68. data/test_cases/rspec/ok/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  69. data/test_cases/rspec/ok/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  70. data/test_cases/rspec/ok/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  71. data/test_cases/rspec/ok/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  72. data/test_cases/rspec/ok/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  73. data/test_cases/rspec/ok/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  74. data/test_cases/rspec/ok/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  75. data/test_cases/rspec/ok/coverage/assets/0.10.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  76. data/test_cases/rspec/ok/coverage/assets/0.10.0/smoothness/images/ui-icons_222222_256x240.png +0 -0
  77. data/test_cases/rspec/ok/coverage/assets/0.10.0/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  78. data/test_cases/rspec/ok/coverage/assets/0.10.0/smoothness/images/ui-icons_454545_256x240.png +0 -0
  79. data/test_cases/rspec/ok/coverage/assets/0.10.0/smoothness/images/ui-icons_888888_256x240.png +0 -0
  80. data/test_cases/rspec/ok/coverage/assets/0.10.0/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  81. data/test_cases/rspec/ok/coverage/index.html +136 -0
  82. data/test_cases/rspec/ok/ok_spec.rb +11 -0
  83. data/test_cases/rspec/ok/test_coverage.rb +6 -0
  84. data/test_cases/rubocop/fail/rubocop_fail.rb +3 -0
  85. data/test_cases/rubocop/ok/rubocop_ok.rb +2 -0
  86. data/test_cases/rubocop/rubocop.yml +4 -0
  87. data/test_cases/yard/.yardoc/checksums +0 -0
  88. data/test_cases/yard/.yardoc/object_types +0 -0
  89. data/test_cases/yard/.yardoc/objects/root.dat +0 -0
  90. data/test_cases/yard/.yardoc/proxy_types +0 -0
  91. data/test_cases/yard/fail/.yardoc/checksums +1 -0
  92. data/test_cases/yard/fail/.yardoc/object_types +0 -0
  93. data/test_cases/yard/fail/.yardoc/objects/root.dat +0 -0
  94. data/test_cases/yard/fail/.yardoc/proxy_types +0 -0
  95. data/test_cases/yard/fail/doc/YardUndocumented.html +306 -0
  96. data/test_cases/yard/fail/doc/_index.html +101 -0
  97. data/test_cases/yard/fail/doc/class_list.html +58 -0
  98. data/test_cases/yard/fail/doc/css/common.css +1 -0
  99. data/test_cases/yard/fail/doc/css/full_list.css +57 -0
  100. data/test_cases/yard/fail/doc/css/style.css +339 -0
  101. data/test_cases/yard/fail/doc/file_list.html +57 -0
  102. data/test_cases/yard/fail/doc/frames.html +26 -0
  103. data/test_cases/yard/fail/doc/index.html +101 -0
  104. data/test_cases/yard/fail/doc/js/app.js +219 -0
  105. data/test_cases/yard/fail/doc/js/full_list.js +181 -0
  106. data/test_cases/yard/fail/doc/js/jquery.js +4 -0
  107. data/test_cases/yard/fail/doc/method_list.html +75 -0
  108. data/test_cases/yard/fail/doc/top-level-namespace.html +112 -0
  109. data/test_cases/yard/fail/yard_fail.rb +12 -0
  110. data/test_cases/yard/ok/.yardoc/checksums +1 -0
  111. data/test_cases/yard/ok/.yardoc/object_types +0 -0
  112. data/test_cases/yard/ok/.yardoc/objects/root.dat +0 -0
  113. data/test_cases/yard/ok/.yardoc/proxy_types +0 -0
  114. data/test_cases/yard/ok/doc/YardDocumented.html +343 -0
  115. data/test_cases/yard/ok/doc/YardUndocumented.html +343 -0
  116. data/test_cases/yard/ok/doc/_index.html +101 -0
  117. data/test_cases/yard/ok/doc/class_list.html +58 -0
  118. data/test_cases/yard/ok/doc/css/common.css +1 -0
  119. data/test_cases/yard/ok/doc/css/full_list.css +57 -0
  120. data/test_cases/yard/ok/doc/css/style.css +339 -0
  121. data/test_cases/yard/ok/doc/file_list.html +57 -0
  122. data/test_cases/yard/ok/doc/frames.html +26 -0
  123. data/test_cases/yard/ok/doc/index.html +101 -0
  124. data/test_cases/yard/ok/doc/js/app.js +219 -0
  125. data/test_cases/yard/ok/doc/js/full_list.js +181 -0
  126. data/test_cases/yard/ok/doc/js/jquery.js +4 -0
  127. data/test_cases/yard/ok/doc/method_list.html +75 -0
  128. data/test_cases/yard/ok/doc/top-level-namespace.html +112 -0
  129. data/test_cases/yard/ok/yard_ok.rb +16 -0
  130. data/test_cases/yard/warn/.yardoc/checksums +1 -0
  131. data/test_cases/yard/warn/.yardoc/object_types +0 -0
  132. data/test_cases/yard/warn/.yardoc/objects/root.dat +0 -0
  133. data/test_cases/yard/warn/.yardoc/proxy_types +0 -0
  134. data/test_cases/yard/warn/doc/YardDocumented.html +343 -0
  135. data/test_cases/yard/warn/doc/_index.html +101 -0
  136. data/test_cases/yard/warn/doc/class_list.html +58 -0
  137. data/test_cases/yard/warn/doc/css/common.css +1 -0
  138. data/test_cases/yard/warn/doc/css/full_list.css +57 -0
  139. data/test_cases/yard/warn/doc/css/style.css +339 -0
  140. data/test_cases/yard/warn/doc/file_list.html +57 -0
  141. data/test_cases/yard/warn/doc/frames.html +26 -0
  142. data/test_cases/yard/warn/doc/index.html +101 -0
  143. data/test_cases/yard/warn/doc/js/app.js +219 -0
  144. data/test_cases/yard/warn/doc/js/full_list.js +181 -0
  145. data/test_cases/yard/warn/doc/js/jquery.js +4 -0
  146. data/test_cases/yard/warn/doc/method_list.html +75 -0
  147. data/test_cases/yard/warn/doc/top-level-namespace.html +112 -0
  148. data/test_cases/yard/warn/yard_warn.rb +16 -0
  149. metadata +306 -0
@@ -0,0 +1,111 @@
1
+ require 'open3'
2
+ require 'rake'
3
+ require 'rake/tasklib'
4
+ require 'rake_command_filter/version'
5
+ require_relative './line_filter_result'
6
+ require_relative './line_filter'
7
+ require_relative './command_definition'
8
+ require_relative './rake_command_definition'
9
+ require_relative './rubocop_command_definition'
10
+ require_relative './rspec_command_definition'
11
+ require_relative './yard_command_definition'
12
+ require_relative './command_failed_error'
13
+
14
+ # A rake task that filters the output of other rake tasks so you can see
15
+ # what you care about.
16
+ module RakeCommandFilter
17
+ # Always hide the line, no matter what
18
+ LINE_HANDLING_HIDE_ALWAYS = :hide_always
19
+
20
+ # Show the line only after an error pattern line has been matched
21
+ LINE_HANDLING_HIDE_UNTIL_ERROR = :hide_until_error
22
+
23
+ # Show the line
24
+ LINE_HANDLING_SHOW_ALWAYS = :show_always
25
+
26
+ @@testing = false # rubocop:disable Style/ClassVars
27
+
28
+ # set to true if we are in at test context
29
+ def self.testing=(_val)
30
+ @@testing = true # rubocop:disable Style/ClassVars
31
+ end
32
+
33
+ # @return true if we are in a test context.
34
+ def self.testing?
35
+ return @@testing
36
+ end
37
+
38
+ # Provides a custom rake task.
39
+ #
40
+ # require 'rake_command_filter'
41
+ # RakeCommandFilter::RakeTask.new
42
+ class RakeTask < Rake::TaskLib
43
+ attr_accessor :name
44
+ attr_accessor :verbose
45
+ attr_accessor :fail_on_error
46
+ attr_accessor :patterns
47
+ attr_accessor :formatters
48
+ attr_accessor :requires
49
+ attr_accessor :options
50
+
51
+ # default rake task initializer
52
+ def initialize(*args, &task_block)
53
+ @name = args.shift || :filter_tasks
54
+ @verbose = true
55
+ @commands = []
56
+
57
+ desc 'TODO: FILL THIS IN THE BLOCK WHERE YOU CREATE THE TASK'
58
+
59
+ instance_eval(&task_block)
60
+ run_task(name, *args)
61
+ end
62
+
63
+ # call this to run a {CommandDefinition} subclass
64
+ # @param defin an instance of a command definition subclass
65
+ # @yield in the block, you can modify the internal state of the command,
66
+ # using desc, add_filter, etc.
67
+ def run_definition(defin, &block)
68
+ command = defin
69
+ defin.instance_eval(&block) if block
70
+ add_command(command)
71
+ end
72
+
73
+ # run all the tasks that have been added via {#run_definition}.
74
+ def run_main_task(verbose)
75
+ run_tasks(verbose)
76
+ end
77
+
78
+ private
79
+
80
+ def run_task(name, *args)
81
+ task(name, *args) do |_, _task_args|
82
+ RakeFileUtils.send(:verbose, verbose) do
83
+ begin
84
+ run_main_task(verbose)
85
+ rescue
86
+ exit 1
87
+ end
88
+ end
89
+ end
90
+ end
91
+
92
+ def add_command(command)
93
+ @commands << command
94
+ end
95
+
96
+ def run_tasks(_verbose)
97
+ failure = nil
98
+ @commands.each do |command|
99
+ results = command.execute
100
+ worst = CommandDefinition.find_worst_result(results)
101
+ if !worst.empty? && worst[0].severity > 0
102
+ failure = worst[0]
103
+ break
104
+ end
105
+ end
106
+
107
+ # raise an error so that the rake task will return 1 to the shell
108
+ raise CommandFailedError, failure.message if failure
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,49 @@
1
+ module RakeCommandFilter
2
+ # default way to run rubocop and parse its output
3
+ class RSpecCommandDefinition < RakeCommandDefinition
4
+ # for testing
5
+ def self.failure_msg(failures)
6
+ "#{failures} failed"
7
+ end
8
+
9
+ # for testing
10
+ def self.success_msg(success)
11
+ "#{success} passed"
12
+ end
13
+
14
+ # for testing
15
+ def self.coverage_msg(percent)
16
+ "#{percent} test coverage"
17
+ end
18
+
19
+ # Default parser for rspec output.
20
+ # @param id override this if you want to do something other than 'rake spec'
21
+ def initialize(coverage_threshold = 95, id = :spec)
22
+ super(id, 'rspec')
23
+ # just use sensible defaults here.
24
+ add_rspec
25
+ add_simplecov(coverage_threshold)
26
+ end
27
+
28
+ private
29
+
30
+ def add_rspec
31
+ add_filter(:rspec_filter, /(\d+)\s+example[s]?,\s+(\d+)\s+failure/) do |matches|
32
+ failures = matches[1].to_i
33
+ if failures > 0
34
+ result_failure(RSpecCommandDefinition.failure_msg(failures))
35
+ else
36
+ result_success(RSpecCommandDefinition.success_msg(matches[0]))
37
+ end
38
+ end
39
+ end
40
+
41
+ def add_simplecov(coverage_threshold)
42
+ add_filter(:simplecov_filter, /Coverage.+LOC\s+\((\d+[\.]?\d+)%/) do |matches|
43
+ percent = matches[0].to_f
44
+ msg = RSpecCommandDefinition.coverage_msg(percent)
45
+ (percent >= coverage_threshold) ? result_success(msg) : result_failure(msg)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,29 @@
1
+ module RakeCommandFilter
2
+ # default way to run rubocop and parse its output
3
+ class RubocopCommandDefinition < RakeCommandDefinition
4
+ # used for testing
5
+ def self.failure_msg(offenses, files)
6
+ "#{offenses} offenses in #{files} files"
7
+ end
8
+
9
+ # used for testing
10
+ def self.success_msg(files)
11
+ "#{files} files"
12
+ end
13
+
14
+ # Default parser for rubocop output.
15
+ # @param id override this if you want to do something other than 'rake rubocop'
16
+ def initialize(id = :rubocop)
17
+ super(id, 'rubocop')
18
+
19
+ # just use sensible defaults here.
20
+ add_filter(:offenses_filter, /(\d+)\s+file.*,\s+(\d+)\s+offense/) do |matches|
21
+ result_failure(RubocopCommandDefinition.failure_msg(matches[1], matches[0]))
22
+ end
23
+
24
+ add_filter(:no_offenses_filter, /(\d+)\s+file.*,\s+no\s+offenses/) do |matches|
25
+ result_success(RubocopCommandDefinition.success_msg(matches[0]))
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,32 @@
1
+ module RakeCommandFilter
2
+ # default way to run rubocop and parse its output
3
+ class YardCommandDefinition < RakeCommandDefinition
4
+ attr_accessor :threshold
5
+
6
+ # for testing
7
+ def self.percent_msg(percent)
8
+ "#{percent} documented"
9
+ end
10
+
11
+ # for testing
12
+ def self.warning_msg
13
+ 'One or more yard warnings, see above'
14
+ end
15
+
16
+ # Default parser for yard output.
17
+ # @param threshold override this if you want to require less than 95% documentation
18
+ # @param id override this if you want to do something other than 'rake spec'
19
+ def initialize(threshold = 95, id = :yard)
20
+ super(id, 'yard')
21
+ # just use sensible defaults here.
22
+ add_filter(:yard_percentage, /(\d+.?\d+)%\s+document/) do |matches|
23
+ percent = matches[0].to_f
24
+ msg = YardCommandDefinition.percent_msg(percent)
25
+ (percent >= threshold) ? result_success(msg) : result_failure(msg)
26
+ end
27
+ add_filter(:yard_warning, /\[warn\]:(.*)/) do |_matches|
28
+ result_warning(YardCommandDefinition.warning_msg)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rake_command_filter/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'rake_command_filter'
8
+ spec.version = RakeCommandFilter::VERSION
9
+ spec.authors = ['Chris Jones']
10
+ spec.email = ['chris@tripletriangle.com']
11
+
12
+ spec.summary = 'Runs several rake tasks or system commands, and filters their output for easy review'
13
+ spec.description = 'Runs several rake tasks or system commands, and filters their output for easy review'
14
+ spec.homepage = 'https://github.com/chrisjones-tripletri/rake_command_filter'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = 'exe'
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.add_runtime_dependency 'colorize'
23
+
24
+ spec.add_development_dependency 'bundler', '~> 1.11'
25
+ spec.add_development_dependency 'rake', '~> 10.0'
26
+ spec.add_development_dependency 'rspec', '~> 3.0'
27
+ spec.add_development_dependency 'rubocop', '~> 0.37.0'
28
+ spec.add_development_dependency 'simplecov', '~> 0.11'
29
+ spec.add_development_dependency 'yard', '~> 0.8'
30
+ spec.add_development_dependency 'codeclimate-test-reporter'
31
+ end
@@ -0,0 +1,5 @@
1
+ {
2
+ "result": {
3
+ "covered_percent": 100.0
4
+ }
5
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "RSpec": {
3
+ "coverage": {
4
+ },
5
+ "timestamp": 1455141533
6
+ }
7
+ }