rake_command_filter 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ }