hirohig_palindrome 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 (283) hide show
  1. checksums.yaml +7 -0
  2. data/.DS_Store +0 -0
  3. data/.gitignore +8 -0
  4. data/.travis.yml +6 -0
  5. data/Gemfile +8 -0
  6. data/Gemfile.lock +30 -0
  7. data/README.md +36 -0
  8. data/Rakefile +10 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +8 -0
  11. data/hirohig_palindrome.gemspec +33 -0
  12. data/lib/hirohig_palindrome/version.rb +3 -0
  13. data/lib/hirohig_palindrome.rb +17 -0
  14. data/vendor/.DS_Store +0 -0
  15. data/vendor/bundle/.DS_Store +0 -0
  16. data/vendor/bundle/ruby/.DS_Store +0 -0
  17. data/vendor/bundle/ruby/2.6.0/.DS_Store +0 -0
  18. data/vendor/bundle/ruby/2.6.0/bin/rake +27 -0
  19. data/vendor/bundle/ruby/2.6.0/cache/ansi-1.5.0.gem +0 -0
  20. data/vendor/bundle/ruby/2.6.0/cache/builder-3.2.4.gem +0 -0
  21. data/vendor/bundle/ruby/2.6.0/cache/minitest-5.14.0.gem +0 -0
  22. data/vendor/bundle/ruby/2.6.0/cache/minitest-reporters-1.2.0.gem +0 -0
  23. data/vendor/bundle/ruby/2.6.0/cache/rake-12.3.3.gem +0 -0
  24. data/vendor/bundle/ruby/2.6.0/cache/ruby-progressbar-1.10.1.gem +0 -0
  25. data/vendor/bundle/ruby/2.6.0/gems/.DS_Store +0 -0
  26. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/.index +77 -0
  27. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/.yardopts +8 -0
  28. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/DEMO.md +451 -0
  29. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/HISTORY.md +217 -0
  30. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/LICENSE.txt +23 -0
  31. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/NOTICE.md +170 -0
  32. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/README.md +91 -0
  33. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/01_ansicode.md +65 -0
  34. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/02_core.md +11 -0
  35. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/03_logger.md +30 -0
  36. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/04_progressbar.md +62 -0
  37. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/05_mixin.md +37 -0
  38. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/06_string.md +56 -0
  39. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/07_columns.md +89 -0
  40. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/08_table.md +28 -0
  41. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/09_diff.md +47 -0
  42. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/10_bbcode.md +24 -0
  43. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/11_terminal.md +8 -0
  44. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/applique/ae.rb +1 -0
  45. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/applique/output.rb +5 -0
  46. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/bbcode.rb +334 -0
  47. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/chain.rb +50 -0
  48. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/chart.rb +100 -0
  49. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/code.rb +349 -0
  50. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/columns.rb +197 -0
  51. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/constants.rb +25 -0
  52. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/core.rb +30 -0
  53. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/diff.rb +215 -0
  54. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/hexdump.rb +122 -0
  55. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/logger.rb +211 -0
  56. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/mixin.rb +121 -0
  57. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/progressbar.rb +292 -0
  58. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/string.rb +254 -0
  59. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/table.rb +179 -0
  60. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/terminal/curses.rb +26 -0
  61. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/terminal/stty.rb +62 -0
  62. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/terminal/termios.rb +68 -0
  63. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/terminal/win32.rb +107 -0
  64. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/terminal.rb +44 -0
  65. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/version.rb +15 -0
  66. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi.rb +22 -0
  67. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi.yml +77 -0
  68. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/test/case_ansicode.rb +43 -0
  69. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/test/case_bbcode.rb +35 -0
  70. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/test/case_mixin.rb +35 -0
  71. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/test/case_progressbar.rb +21 -0
  72. data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/test/test_helper.rb +3 -0
  73. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/CHANGES +119 -0
  74. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/MIT-LICENSE +20 -0
  75. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/README.md +258 -0
  76. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/Rakefile +194 -0
  77. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/builder.blurb +27 -0
  78. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/builder.gemspec +45 -0
  79. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/doc/jamis.rb +592 -0
  80. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/doc/releases/builder-1.2.4.rdoc +31 -0
  81. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/doc/releases/builder-2.0.0.rdoc +46 -0
  82. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/doc/releases/builder-2.1.1.rdoc +58 -0
  83. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/lib/blankslate.rb +138 -0
  84. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/lib/builder/blankslate.rb +24 -0
  85. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/lib/builder/version.rb +9 -0
  86. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/lib/builder/xchar.rb +198 -0
  87. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/lib/builder/xmlbase.rb +200 -0
  88. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/lib/builder/xmlevents.rb +64 -0
  89. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/lib/builder/xmlmarkup.rb +345 -0
  90. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/lib/builder.rb +14 -0
  91. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/rakelib/publish.rake +21 -0
  92. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/rakelib/tags.rake +63 -0
  93. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/rakelib/testing.rake +8 -0
  94. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/test/helper.rb +13 -0
  95. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/test/performance.rb +42 -0
  96. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/test/preload.rb +40 -0
  97. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/test/test_blankslate.rb +208 -0
  98. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/test/test_eventbuilder.rb +151 -0
  99. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/test/test_markupbuilder.rb +617 -0
  100. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/test/test_method_caching.rb +63 -0
  101. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/test/test_namecollision.rb +40 -0
  102. data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/test/test_xchar.rb +85 -0
  103. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/.autotest +34 -0
  104. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/History.rdoc +1380 -0
  105. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/Manifest.txt +27 -0
  106. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/README.rdoc +764 -0
  107. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/Rakefile +72 -0
  108. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/design_rationale.rb +52 -0
  109. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/hoe/minitest.rb +32 -0
  110. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/assertions.rb +807 -0
  111. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/autorun.rb +13 -0
  112. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/benchmark.rb +455 -0
  113. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/expectations.rb +303 -0
  114. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/hell.rb +11 -0
  115. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/mock.rb +240 -0
  116. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/parallel.rb +70 -0
  117. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/pride.rb +4 -0
  118. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/pride_plugin.rb +142 -0
  119. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/spec.rb +342 -0
  120. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/test.rb +220 -0
  121. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/unit.rb +45 -0
  122. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest.rb +1053 -0
  123. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/test/minitest/metametameta.rb +117 -0
  124. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/test/minitest/test_minitest_assertions.rb +1567 -0
  125. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/test/minitest/test_minitest_benchmark.rb +137 -0
  126. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/test/minitest/test_minitest_mock.rb +872 -0
  127. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/test/minitest/test_minitest_reporter.rb +299 -0
  128. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/test/minitest/test_minitest_spec.rb +1041 -0
  129. data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/test/minitest/test_minitest_test.rb +1080 -0
  130. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/.gitignore +27 -0
  131. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/.ruby-gemset +1 -0
  132. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/.travis.yml +10 -0
  133. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/.yardopts +6 -0
  134. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/CHANGELOG.md +40 -0
  135. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/Gemfile +2 -0
  136. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/LICENSE +20 -0
  137. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/README.md +115 -0
  138. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/Rakefile +60 -0
  139. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/assets/default-reporter.png +0 -0
  140. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/assets/mean_time_reporter.png +0 -0
  141. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/assets/progress-reporter.png +0 -0
  142. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/assets/spec-reporter.png +0 -0
  143. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/extensible_backtrace_filter.rb +67 -0
  144. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/minitest_reporter_plugin.rb +75 -0
  145. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/old_activesupport_fix.rb +24 -0
  146. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/relative_position.rb +26 -0
  147. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/ansi.rb +31 -0
  148. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/base_reporter.rb +117 -0
  149. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/default_reporter.rb +228 -0
  150. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/html_reporter.rb +221 -0
  151. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/junit_reporter.rb +157 -0
  152. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/mean_time_reporter.rb +392 -0
  153. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/progress_reporter.rb +96 -0
  154. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/ruby_mate_reporter.rb +54 -0
  155. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/rubymine_reporter.rb +117 -0
  156. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/spec_reporter.rb +61 -0
  157. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/version.rb +5 -0
  158. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters.rb +89 -0
  159. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/templates/index.html.erb +83 -0
  160. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/minitest-reporters.gemspec +31 -0
  161. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/fixtures/junit_filename_bug_example_test.rb +21 -0
  162. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/fixtures/mean_time_test.rb +8 -0
  163. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/fixtures/progress_detailed_skip_test.rb +8 -0
  164. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/fixtures/progress_test.rb +8 -0
  165. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/fixtures/sample_test.rb +15 -0
  166. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/fixtures/spec_test.rb +13 -0
  167. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/gallery/bad_test.rb +25 -0
  168. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/gallery/good_test.rb +14 -0
  169. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/integration/reporters/junit_reporter_test.rb +12 -0
  170. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/integration/reporters/mean_time_reporter_test.rb +7 -0
  171. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/integration/reporters/progress_reporter_test.rb +34 -0
  172. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/test_helper.rb +22 -0
  173. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/unit/minitest/extensible_backtrace_filter_test.rb +42 -0
  174. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/unit/minitest/mean_time_reporter_unit_test.rb +152 -0
  175. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/unit/minitest/minitest_reporter_plugin_test.rb +14 -0
  176. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/unit/minitest/reporters_test.rb +52 -0
  177. data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/unit/minitest/spec_reporter_test.rb +41 -0
  178. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/CONTRIBUTING.rdoc +43 -0
  179. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/Gemfile +3 -0
  180. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/History.rdoc +2344 -0
  181. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/MIT-LICENSE +21 -0
  182. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/README.rdoc +156 -0
  183. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/Rakefile +41 -0
  184. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/azure-pipelines.yml +11 -0
  185. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/bin/bundle +105 -0
  186. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/bin/console +7 -0
  187. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/bin/rake +29 -0
  188. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/bin/rdoc +29 -0
  189. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/bin/rubocop +29 -0
  190. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/bin/setup +6 -0
  191. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/command_line_usage.rdoc +158 -0
  192. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/example/Rakefile1 +38 -0
  193. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/example/Rakefile2 +35 -0
  194. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/example/a.c +6 -0
  195. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/example/b.c +6 -0
  196. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/example/main.c +11 -0
  197. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/glossary.rdoc +42 -0
  198. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/jamis.rb +592 -0
  199. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/proto_rake.rdoc +127 -0
  200. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/rake.1 +156 -0
  201. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/rakefile.rdoc +622 -0
  202. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/rational.rdoc +151 -0
  203. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/exe/rake +27 -0
  204. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/application.rb +824 -0
  205. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/backtrace.rb +24 -0
  206. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/clean.rb +78 -0
  207. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/cloneable.rb +17 -0
  208. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/cpu_counter.rb +107 -0
  209. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/default_loader.rb +15 -0
  210. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/dsl_definition.rb +195 -0
  211. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/early_time.rb +22 -0
  212. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/ext/core.rb +26 -0
  213. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/ext/string.rb +176 -0
  214. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/file_creation_task.rb +25 -0
  215. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/file_list.rb +435 -0
  216. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/file_task.rb +54 -0
  217. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/file_utils.rb +137 -0
  218. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/file_utils_ext.rb +145 -0
  219. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/invocation_chain.rb +57 -0
  220. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/invocation_exception_mixin.rb +17 -0
  221. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/late_time.rb +18 -0
  222. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/linked_list.rb +112 -0
  223. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/loaders/makefile.rb +54 -0
  224. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/multi_task.rb +14 -0
  225. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/name_space.rb +38 -0
  226. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/packagetask.rb +207 -0
  227. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/phony.rb +16 -0
  228. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/private_reader.rb +21 -0
  229. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/promise.rb +100 -0
  230. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/pseudo_status.rb +30 -0
  231. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/rake_module.rb +67 -0
  232. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/rake_test_loader.rb +27 -0
  233. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/rule_recursion_overflow_error.rb +20 -0
  234. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/scope.rb +43 -0
  235. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/task.rb +413 -0
  236. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/task_argument_error.rb +8 -0
  237. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/task_arguments.rb +109 -0
  238. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/task_manager.rb +324 -0
  239. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/tasklib.rb +12 -0
  240. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/testtask.rb +224 -0
  241. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/thread_history_display.rb +49 -0
  242. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/thread_pool.rb +163 -0
  243. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/trace_output.rb +23 -0
  244. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/version.rb +10 -0
  245. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/win32.rb +51 -0
  246. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake.rb +71 -0
  247. data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/rake.gemspec +42 -0
  248. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/LICENSE.txt +19 -0
  249. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/README.md +38 -0
  250. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/Rakefile +2 -0
  251. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/base.rb +183 -0
  252. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/calculators/length.rb +100 -0
  253. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/calculators/running_average.rb +9 -0
  254. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/components/bar.rb +102 -0
  255. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/components/percentage.rb +29 -0
  256. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/components/rate.rb +43 -0
  257. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/components/time.rb +107 -0
  258. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/components/title.rb +13 -0
  259. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/components.rb +5 -0
  260. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/errors/invalid_progress_error.rb +4 -0
  261. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/format/formatter.rb +27 -0
  262. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/format/molecule.rb +60 -0
  263. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/format/string.rb +36 -0
  264. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/format.rb +3 -0
  265. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/output.rb +68 -0
  266. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/outputs/non_tty.rb +47 -0
  267. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/outputs/null.rb +33 -0
  268. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/outputs/tty.rb +32 -0
  269. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/progress.rb +118 -0
  270. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/refinements/enumerator.rb +23 -0
  271. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/refinements.rb +1 -0
  272. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/throttle.rb +25 -0
  273. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/time.rb +32 -0
  274. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/timer.rb +72 -0
  275. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/version.rb +3 -0
  276. data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar.rb +22 -0
  277. data/vendor/bundle/ruby/2.6.0/specifications/ansi-1.5.0.gemspec +49 -0
  278. data/vendor/bundle/ruby/2.6.0/specifications/builder-3.2.4.gemspec +23 -0
  279. data/vendor/bundle/ruby/2.6.0/specifications/minitest-5.14.0.gemspec +41 -0
  280. data/vendor/bundle/ruby/2.6.0/specifications/minitest-reporters-1.2.0.gemspec +48 -0
  281. data/vendor/bundle/ruby/2.6.0/specifications/rake-12.3.3.gemspec +49 -0
  282. data/vendor/bundle/ruby/2.6.0/specifications/ruby-progressbar-1.10.1.gemspec +46 -0
  283. metadata +326 -0
@@ -0,0 +1,228 @@
1
+ module Minitest
2
+ module Reporters
3
+ # A reporter identical to the standard Minitest reporter except with more
4
+ # colors.
5
+ #
6
+ # Based upon Ryan Davis of Seattle.rb's Minitest (MIT License).
7
+ #
8
+ # @see https://github.com/seattlerb/minitest Minitest
9
+
10
+ class DefaultReporter < BaseReporter
11
+ include ANSI::Code
12
+ include RelativePosition
13
+
14
+ def initialize(options = {})
15
+ super
16
+ @detailed_skip = options.fetch(:detailed_skip, true)
17
+ @slow_count = options.fetch(:slow_count, 0)
18
+ @slow_suite_count = options.fetch(:slow_suite_count, 0)
19
+ @suite_times = []
20
+ @suite_start_times = {}
21
+ @fast_fail = options.fetch(:fast_fail, false)
22
+ @options = options
23
+ end
24
+
25
+ def start
26
+ super
27
+ on_start
28
+ end
29
+
30
+ def on_start
31
+ puts
32
+ puts("# Running tests with run options %s:" % options[:args])
33
+ puts
34
+ end
35
+
36
+ def before_test(test)
37
+ super
38
+ print "\n#{test.class}##{test.name} " if options[:verbose]
39
+ end
40
+
41
+ def before_suite(suite)
42
+ @suite_start_times[suite] = Minitest::Reporters.clock_time
43
+ super
44
+ end
45
+
46
+ def after_suite(suite)
47
+ super
48
+ duration = suite_duration(suite)
49
+ @suite_times << [suite.name, duration]
50
+ end
51
+
52
+ def record(test)
53
+ super
54
+
55
+ on_record(test)
56
+ end
57
+
58
+ def on_record(test)
59
+ print "#{"%.2f" % test.time} = " if options[:verbose]
60
+
61
+ # Print the pass/skip/fail mark
62
+ print(if test.passed?
63
+ record_pass(test)
64
+ elsif test.skipped?
65
+ record_skip(test)
66
+ elsif test.failure
67
+ record_failure(test)
68
+ end)
69
+
70
+ # Print fast_fail information
71
+ if @fast_fail && (test.skipped? || test.failure)
72
+ print_failure(test)
73
+ end
74
+ end
75
+
76
+ def record_pass(record)
77
+ green(record.result_code)
78
+ end
79
+
80
+ def record_skip(record)
81
+ yellow(record.result_code)
82
+ end
83
+
84
+ def record_failure(record)
85
+ red(record.result_code)
86
+ end
87
+
88
+ def report
89
+ super
90
+ on_report
91
+ end
92
+
93
+ def on_report
94
+ status_line = "Finished tests in %.6fs, %.4f tests/s, %.4f assertions/s." %
95
+ [total_time, count / total_time, assertions / total_time]
96
+
97
+ puts
98
+ puts
99
+ puts colored_for(suite_result, status_line)
100
+ puts
101
+
102
+ unless @fast_fail
103
+ tests.reject(&:passed?).each do |test|
104
+ print_failure(test)
105
+ end
106
+ end
107
+
108
+ if @slow_count > 0
109
+ slow_tests = tests.sort_by(&:time).reverse.take(@slow_count)
110
+
111
+ puts
112
+ puts "Slowest tests:"
113
+ puts
114
+
115
+ slow_tests.each do |test|
116
+ puts "%.6fs %s" % [test.time, "#{test.name}##{test_class(test)}"]
117
+ end
118
+ end
119
+
120
+ if @slow_suite_count > 0
121
+ slow_suites = @suite_times.sort_by { |x| x[1] }.reverse.take(@slow_suite_count)
122
+
123
+ puts
124
+ puts "Slowest test classes:"
125
+ puts
126
+
127
+ slow_suites.each do |slow_suite|
128
+ puts "%.6fs %s" % [slow_suite[1], test_class(slow_suite[0])]
129
+ end
130
+ end
131
+
132
+ puts
133
+ print colored_for(suite_result, result_line)
134
+ puts
135
+ end
136
+
137
+ alias to_s report
138
+
139
+ def print_failure(test)
140
+ message = message_for(test)
141
+ unless message.nil? || message.strip == ''
142
+ puts
143
+ puts colored_for(result(test), message)
144
+ end
145
+ end
146
+
147
+ private
148
+
149
+ def color?
150
+ return @color if defined?(@color)
151
+ @color = @options.fetch(:color) do
152
+ io.tty? && (
153
+ ENV["TERM"] =~ /^screen|color/ ||
154
+ ENV["EMACS"] == "t"
155
+ )
156
+ end
157
+ end
158
+
159
+ def green(string)
160
+ color? ? ANSI::Code.green(string) : string
161
+ end
162
+
163
+ def yellow(string)
164
+ color? ? ANSI::Code.yellow(string) : string
165
+ end
166
+
167
+ def red(string)
168
+ color? ? ANSI::Code.red(string) : string
169
+ end
170
+
171
+ def colored_for(result, string)
172
+ case result
173
+ when :fail, :error; red(string)
174
+ when :skip; yellow(string)
175
+ else green(string)
176
+ end
177
+ end
178
+
179
+ def suite_result
180
+ case
181
+ when failures > 0; :fail
182
+ when errors > 0; :error
183
+ when skips > 0; :skip
184
+ else :pass
185
+ end
186
+ end
187
+
188
+ def location(exception)
189
+ last_before_assertion = ''
190
+
191
+ exception.backtrace.reverse_each do |s|
192
+ break if s =~ /in .(assert|refute|flunk|pass|fail|raise|must|wont)/
193
+ last_before_assertion = s
194
+ end
195
+
196
+ last_before_assertion.sub(/:in .*$/, '')
197
+ end
198
+
199
+ def message_for(test)
200
+ e = test.failure
201
+
202
+ if test.skipped?
203
+ if @detailed_skip
204
+ "Skipped:\n#{test_class(test)}##{test.name} [#{location(e)}]:\n#{e.message}"
205
+ end
206
+ elsif test.error?
207
+ "Error:\n#{test_class(test)}##{test.name}:\n#{e.message}"
208
+ else
209
+ "Failure:\n#{test_class(test)}##{test.name} [#{test.failure.location}]\n#{e.class}: #{e.message}"
210
+ end
211
+ end
212
+
213
+ def result_line
214
+ '%d tests, %d assertions, %d failures, %d errors, %d skips' %
215
+ [count, assertions, failures, errors, skips]
216
+ end
217
+
218
+ def suite_duration(suite)
219
+ start_time = @suite_start_times.delete(suite)
220
+ if start_time.nil?
221
+ 0
222
+ else
223
+ Minitest::Reporters.clock_time - start_time
224
+ end
225
+ end
226
+ end
227
+ end
228
+ end
@@ -0,0 +1,221 @@
1
+ require 'builder'
2
+ require 'fileutils'
3
+ require 'erb'
4
+
5
+ module Minitest
6
+ module Reporters
7
+ # A reporter for generating HTML test reports
8
+ # This is recommended to be used with a CI server, where the report is kept as an artifact and is accessible via a shared link
9
+ #
10
+ # The reporter sorts the results alphabetically and then by results so that failing and skipped tests are at the top.
11
+ #
12
+ # When using Minitest Specs, the number prefix is dropped from the name of the test so that it reads well
13
+ #
14
+ # On each test run all files in the reports directory are deleted, this prevents a build up of old reports
15
+ #
16
+ # The report is generated using ERB. A custom ERB template can be provided but it is not required
17
+ # The default ERB template uses JQuery and Bootstrap, both of these are included by referencing the CDN sites
18
+ class HtmlReporter < BaseReporter
19
+
20
+ # The title of the report
21
+ attr_reader :title
22
+
23
+ # The number of tests that passed
24
+ def passes
25
+ count - failures - errors - skips
26
+ end
27
+
28
+ # The percentage of tests that passed, calculated in a way that avoids rounding errors
29
+ def percent_passes
30
+ 100 - percent_skipps - percent_errors_failures
31
+ end
32
+
33
+ # The percentage of tests that were skipped
34
+ def percent_skipps
35
+ (skips/count.to_f * 100).to_i
36
+ end
37
+
38
+ # The percentage of tests that failed
39
+ def percent_errors_failures
40
+ ((errors+failures)/count.to_f * 100).to_i
41
+ end
42
+
43
+ # Trims off the number prefix on test names when using Minitest Specs
44
+ def friendly_name(test)
45
+ groups = test.name.scan(/(test_\d+_)(.*)/i)
46
+ return test.name if groups.empty?
47
+ "it #{groups[0][1]}"
48
+ end
49
+
50
+ # The constructor takes a hash, and uses the following keys:
51
+ # :title - the title that will be used in the report, defaults to 'Test Results'
52
+ # :reports_dir - the directory the reports should be written to, defaults to 'test/html_reports'
53
+ # :erb_template - the path to a custom ERB template, defaults to the supplied ERB template
54
+ # :mode - Useful for debugging, :terse suppresses errors and is the default, :verbose lets errors bubble up
55
+ # :output_filename - the report's filename, defaults to 'index.html'
56
+ def initialize(args = {})
57
+ super({})
58
+
59
+ defaults = {
60
+ :title => 'Test Results',
61
+ :erb_template => "#{File.dirname(__FILE__)}/../templates/index.html.erb",
62
+ :reports_dir => 'test/html_reports',
63
+ :mode => :safe,
64
+ :output_filename => 'index.html'
65
+ }
66
+
67
+ settings = defaults.merge(args)
68
+
69
+ @mode = settings[:mode]
70
+ @title = settings[:title]
71
+ @erb_template = settings[:erb_template]
72
+ @output_filename = settings[:output_filename]
73
+ reports_dir = settings[:reports_dir]
74
+
75
+ @reports_path = File.absolute_path(reports_dir)
76
+ end
77
+
78
+ def start
79
+ super
80
+
81
+ puts "Emptying #{@reports_path}"
82
+ FileUtils.mkdir_p(@reports_path)
83
+ File.delete(html_file) if File.exist?(html_file)
84
+ end
85
+
86
+ # Called by the framework to generate the report
87
+ def report
88
+ super
89
+
90
+ begin
91
+ puts "Writing HTML reports to #{@reports_path}"
92
+ erb_str = File.read(@erb_template)
93
+ renderer = ERB.new(erb_str)
94
+
95
+ tests_by_suites = tests.group_by { |test| test_class(test) } # taken from the JUnit reporter
96
+
97
+ suites = tests_by_suites.map do |suite, tests|
98
+ suite_summary = summarize_suite(suite, tests)
99
+ suite_summary[:tests] = tests.sort { |a, b| compare_tests(a, b) }
100
+ suite_summary
101
+ end
102
+
103
+ suites.sort! { |a, b| compare_suites(a, b) }
104
+
105
+ result = renderer.result(binding)
106
+ File.open(html_file, 'w') do |f|
107
+ f.write(result)
108
+ end
109
+
110
+ rescue Exception => e
111
+ puts 'There was an error writing the HTML report'
112
+ puts 'This may have been caused by cancelling the test run'
113
+ puts 'Use mode => :verbose in the HTML reporters constructor to see more detail' if @mode == :terse
114
+ puts 'Use mode => :terse in the HTML reporters constructor to see less detail' if @mode != :terse
115
+ raise e if @mode != :terse
116
+ end
117
+
118
+ end
119
+
120
+ private
121
+ def html_file
122
+ "#{@reports_path}/#{@output_filename}"
123
+ end
124
+
125
+ def compare_suites_by_name(suite_a, suite_b)
126
+ suite_a[:name] <=> suite_b[:name]
127
+ end
128
+
129
+ def compare_tests_by_name(test_a, test_b)
130
+ friendly_name(test_a) <=> friendly_name(test_b)
131
+ end
132
+
133
+ # Test suites are first ordered by evaluating the results of the tests, then by test suite name
134
+ # Test suites which have failing tests are given highest order
135
+ # Tests suites which have skipped tests are given second highest priority
136
+ def compare_suites(suite_a, suite_b)
137
+ return compare_suites_by_name(suite_a, suite_b) if suite_a[:has_errors_or_failures] && suite_b[:has_errors_or_failures]
138
+ return -1 if suite_a[:has_errors_or_failures] && !suite_b[:has_errors_or_failures]
139
+ return 1 if !suite_a[:has_errors_or_failures] && suite_b[:has_errors_or_failures]
140
+
141
+ return compare_suites_by_name(suite_a, suite_b) if suite_a[:has_skipps] && suite_b[:has_skipps]
142
+ return -1 if suite_a[:has_skipps] && !suite_b[:has_skipps]
143
+ return 1 if !suite_a[:has_skipps] && suite_b[:has_skipps]
144
+
145
+ compare_suites_by_name(suite_a, suite_b)
146
+ end
147
+
148
+ # Tests are first ordered by evaluating the results of the tests, then by tests names
149
+ # Tess which fail are given highest order
150
+ # Tests which are skipped are given second highest priority
151
+ def compare_tests(test_a, test_b)
152
+ return compare_tests_by_name(test_a, test_b) if test_fail_or_error?(test_a) && test_fail_or_error?(test_b)
153
+
154
+ return -1 if test_fail_or_error?(test_a) && !test_fail_or_error?(test_b)
155
+ return 1 if !test_fail_or_error?(test_a) && test_fail_or_error?(test_b)
156
+
157
+ return compare_tests_by_name(test_a, test_b) if test_a.skipped? && test_b.skipped?
158
+ return -1 if test_a.skipped? && !test_b.skipped?
159
+ return 1 if !test_a.skipped? && test_b.skipped?
160
+
161
+ compare_tests_by_name(test_a, test_b)
162
+ end
163
+
164
+ def test_fail_or_error?(test)
165
+ test.error? || test.failure
166
+ end
167
+
168
+ # based on analyze_suite from the JUnit reporter
169
+ def summarize_suite(suite, tests)
170
+ summary = Hash.new(0)
171
+ summary[:name] = suite.to_s
172
+ tests.each do |test|
173
+ summary[:"#{result(test)}_count"] += 1
174
+ summary[:assertion_count] += test.assertions
175
+ summary[:test_count] += 1
176
+ summary[:time] += test.time
177
+ end
178
+ summary[:has_errors_or_failures] = (summary[:fail_count] + summary[:error_count]) > 0
179
+ summary[:has_skipps] = summary[:skip_count] > 0
180
+ summary
181
+ end
182
+
183
+ # based on message_for(test) from the JUnit reporter
184
+ def message_for(test)
185
+ suite = test.class
186
+ name = test.name
187
+ e = test.failure
188
+
189
+ if test.passed?
190
+ nil
191
+ elsif test.skipped?
192
+ "Skipped:\n#{name}(#{suite}) [#{location(e)}]:\n#{e.message}\n"
193
+ elsif test.failure
194
+ "Failure:\n#{name}(#{suite}) [#{location(e)}]:\n#{e.message}\n"
195
+ elsif test.error?
196
+ "Error:\n#{name}(#{suite}):\n#{e.message}"
197
+ end
198
+ end
199
+
200
+ # taken from the JUnit reporter
201
+ def location(exception)
202
+ last_before_assertion = ''
203
+ exception.backtrace.reverse_each do |s|
204
+ break if s =~ /in .(assert|refute|flunk|pass|fail|raise|must|wont)/
205
+ last_before_assertion = s
206
+ end
207
+ last_before_assertion.sub(/:in .*$/, '')
208
+ end
209
+
210
+ def total_time_to_hms
211
+ return ('%.2fs' % total_time) if total_time < 1
212
+
213
+ hours = (total_time / (60 * 60)).round
214
+ minutes = ((total_time / 60) % 60).round.to_s.rjust(2,'0')
215
+ seconds = (total_time % 60).round.to_s.rjust(2,'0')
216
+
217
+ "#{ hours }h#{ minutes }m#{ seconds }s"
218
+ end
219
+ end
220
+ end
221
+ end
@@ -0,0 +1,157 @@
1
+ require 'builder'
2
+ require 'fileutils'
3
+ module Minitest
4
+ module Reporters
5
+ # A reporter for writing JUnit test reports
6
+ # Intended for easy integration with CI servers - tested on JetBrains TeamCity
7
+ #
8
+ # Inspired by ci_reporter (see https://github.com/nicksieger/ci_reporter)
9
+ # Also inspired by Marc Seeger's attempt at producing a JUnitReporter (see https://github.com/rb2k/minitest-reporters/commit/e13d95b5f884453a9c77f62bc5cba3fa1df30ef5)
10
+ # Also inspired by minitest-ci (see https://github.com/bhenderson/minitest-ci)
11
+ class JUnitReporter < BaseReporter
12
+ def initialize(reports_dir = "test/reports", empty = true, options = {})
13
+ super({})
14
+ @reports_path = File.absolute_path(reports_dir)
15
+ @single_file = options[:single_file]
16
+ @base_path = options[:base_path] || Dir.pwd
17
+
18
+ if empty
19
+ puts "Emptying #{@reports_path}"
20
+ FileUtils.mkdir_p(@reports_path)
21
+ File.delete(*Dir.glob("#{@reports_path}/TEST-*.xml"))
22
+ end
23
+ end
24
+
25
+ def report
26
+ super
27
+
28
+ puts "Writing XML reports to #{@reports_path}"
29
+ suites = tests.group_by { |test|
30
+ test_class(test)
31
+ }
32
+
33
+ if @single_file
34
+ xml = Builder::XmlMarkup.new(:indent => 2)
35
+ xml.instruct!
36
+ xml.test_suites do
37
+ suites.each do |suite, tests|
38
+ parse_xml_for(xml, suite, tests)
39
+ end
40
+ end
41
+ File.open(filename_for('minitest'), "w") { |file| file << xml.target! }
42
+ else
43
+ suites.each do |suite, tests|
44
+ xml = Builder::XmlMarkup.new(:indent => 2)
45
+ xml.instruct!
46
+ xml.test_suites do
47
+ parse_xml_for(xml, suite, tests)
48
+ end
49
+ File.open(filename_for(suite), "w") { |file| file << xml.target! }
50
+ end
51
+ end
52
+ end
53
+
54
+ private
55
+
56
+ def get_source_location(result)
57
+ if result.respond_to? :klass
58
+ result.source_location
59
+ else
60
+ result.method(result.name).source_location
61
+ end
62
+ end
63
+
64
+ def parse_xml_for(xml, suite, tests)
65
+ suite_result = analyze_suite(tests)
66
+ file_path = Pathname.new(get_source_location(tests.first).first)
67
+ base_path = Pathname.new(@base_path)
68
+ relative_path = file_path.relative_path_from(base_path)
69
+
70
+ xml.testsuite(:name => suite, :filepath => relative_path,
71
+ :skipped => suite_result[:skip_count], :failures => suite_result[:fail_count],
72
+ :errors => suite_result[:error_count], :tests => suite_result[:test_count],
73
+ :assertions => suite_result[:assertion_count], :time => suite_result[:time]) do
74
+ tests.each do |test|
75
+ lineno = get_source_location(test).last
76
+ xml.testcase(:name => test.name, :lineno => lineno, :classname => suite, :assertions => test.assertions,
77
+ :time => test.time) do
78
+ xml << xml_message_for(test) unless test.passed?
79
+ end
80
+ end
81
+ end
82
+ end
83
+
84
+ def xml_message_for(test)
85
+ # This is a trick lifted from ci_reporter
86
+ xml = Builder::XmlMarkup.new(:indent => 2, :margin => 2)
87
+
88
+ def xml.trunc!(txt)
89
+ txt.sub(/\n.*/m, '...')
90
+ end
91
+
92
+ e = test.failure
93
+
94
+ if test.skipped?
95
+ xml.skipped(:type => test.name)
96
+ elsif test.error?
97
+ xml.error(:type => test.name, :message => xml.trunc!(e.message)) do
98
+ xml.text!(message_for(test))
99
+ end
100
+ elsif test.failure
101
+ xml.failure(:type => test.name, :message => xml.trunc!(e.message)) do
102
+ xml.text!(message_for(test))
103
+ end
104
+ end
105
+ end
106
+
107
+ def message_for(test)
108
+ suite = test.class
109
+ name = test.name
110
+ e = test.failure
111
+
112
+ if test.passed?
113
+ nil
114
+ elsif test.skipped?
115
+ "Skipped:\n#{name}(#{suite}) [#{location(e)}]:\n#{e.message}\n"
116
+ elsif test.failure
117
+ "Failure:\n#{name}(#{suite}) [#{location(e)}]:\n#{e.message}\n"
118
+ elsif test.error?
119
+ "Error:\n#{name}(#{suite}):\n#{e.message}"
120
+ end
121
+ end
122
+
123
+ def location(exception)
124
+ last_before_assertion = ''
125
+ exception.backtrace.reverse_each do |s|
126
+ break if s =~ /in .(assert|refute|flunk|pass|fail|raise|must|wont)/
127
+ last_before_assertion = s
128
+ end
129
+ last_before_assertion.sub(/:in .*$/, '')
130
+ end
131
+
132
+ def analyze_suite(tests)
133
+ result = Hash.new(0)
134
+ result[:time] = 0
135
+ tests.each do |test|
136
+ result[:"#{result(test)}_count"] += 1
137
+ result[:assertion_count] += test.assertions
138
+ result[:test_count] += 1
139
+ result[:time] += test.time
140
+ end
141
+ result
142
+ end
143
+
144
+ def filename_for(suite)
145
+ file_counter = 0
146
+ suite_name = suite.to_s[0..240].gsub(/[^a-zA-Z0-9]+/, '-') # restrict max filename length, to be kind to filesystems
147
+ filename = "TEST-#{suite_name}.xml"
148
+ while File.exist?(File.join(@reports_path, filename)) # restrict number of tries, to avoid infinite loops
149
+ file_counter += 1
150
+ filename = "TEST-#{suite_name}-#{file_counter}.xml"
151
+ puts "Too many duplicate files, overwriting earlier report #{filename}" and break if file_counter >= 99
152
+ end
153
+ File.join(@reports_path, filename)
154
+ end
155
+ end
156
+ end
157
+ end