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.
- checksums.yaml +7 -0
- data/.DS_Store +0 -0
- data/.gitignore +8 -0
- data/.travis.yml +6 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +30 -0
- data/README.md +36 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/hirohig_palindrome.gemspec +33 -0
- data/lib/hirohig_palindrome/version.rb +3 -0
- data/lib/hirohig_palindrome.rb +17 -0
- data/vendor/.DS_Store +0 -0
- data/vendor/bundle/.DS_Store +0 -0
- data/vendor/bundle/ruby/.DS_Store +0 -0
- data/vendor/bundle/ruby/2.6.0/.DS_Store +0 -0
- data/vendor/bundle/ruby/2.6.0/bin/rake +27 -0
- data/vendor/bundle/ruby/2.6.0/cache/ansi-1.5.0.gem +0 -0
- data/vendor/bundle/ruby/2.6.0/cache/builder-3.2.4.gem +0 -0
- data/vendor/bundle/ruby/2.6.0/cache/minitest-5.14.0.gem +0 -0
- data/vendor/bundle/ruby/2.6.0/cache/minitest-reporters-1.2.0.gem +0 -0
- data/vendor/bundle/ruby/2.6.0/cache/rake-12.3.3.gem +0 -0
- data/vendor/bundle/ruby/2.6.0/cache/ruby-progressbar-1.10.1.gem +0 -0
- data/vendor/bundle/ruby/2.6.0/gems/.DS_Store +0 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/.index +77 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/.yardopts +8 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/DEMO.md +451 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/HISTORY.md +217 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/LICENSE.txt +23 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/NOTICE.md +170 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/README.md +91 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/01_ansicode.md +65 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/02_core.md +11 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/03_logger.md +30 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/04_progressbar.md +62 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/05_mixin.md +37 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/06_string.md +56 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/07_columns.md +89 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/08_table.md +28 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/09_diff.md +47 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/10_bbcode.md +24 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/11_terminal.md +8 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/applique/ae.rb +1 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/demo/applique/output.rb +5 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/bbcode.rb +334 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/chain.rb +50 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/chart.rb +100 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/code.rb +349 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/columns.rb +197 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/constants.rb +25 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/core.rb +30 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/diff.rb +215 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/hexdump.rb +122 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/logger.rb +211 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/mixin.rb +121 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/progressbar.rb +292 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/string.rb +254 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/table.rb +179 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/terminal/curses.rb +26 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/terminal/stty.rb +62 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/terminal/termios.rb +68 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/terminal/win32.rb +107 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/terminal.rb +44 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi/version.rb +15 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi.rb +22 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/lib/ansi.yml +77 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/test/case_ansicode.rb +43 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/test/case_bbcode.rb +35 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/test/case_mixin.rb +35 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/test/case_progressbar.rb +21 -0
- data/vendor/bundle/ruby/2.6.0/gems/ansi-1.5.0/test/test_helper.rb +3 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/CHANGES +119 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/MIT-LICENSE +20 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/README.md +258 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/Rakefile +194 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/builder.blurb +27 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/builder.gemspec +45 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/doc/jamis.rb +592 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/doc/releases/builder-1.2.4.rdoc +31 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/doc/releases/builder-2.0.0.rdoc +46 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/doc/releases/builder-2.1.1.rdoc +58 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/lib/blankslate.rb +138 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/lib/builder/blankslate.rb +24 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/lib/builder/version.rb +9 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/lib/builder/xchar.rb +198 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/lib/builder/xmlbase.rb +200 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/lib/builder/xmlevents.rb +64 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/lib/builder/xmlmarkup.rb +345 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/lib/builder.rb +14 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/rakelib/publish.rake +21 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/rakelib/tags.rake +63 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/rakelib/testing.rake +8 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/test/helper.rb +13 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/test/performance.rb +42 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/test/preload.rb +40 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/test/test_blankslate.rb +208 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/test/test_eventbuilder.rb +151 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/test/test_markupbuilder.rb +617 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/test/test_method_caching.rb +63 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/test/test_namecollision.rb +40 -0
- data/vendor/bundle/ruby/2.6.0/gems/builder-3.2.4/test/test_xchar.rb +85 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/.autotest +34 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/History.rdoc +1380 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/Manifest.txt +27 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/README.rdoc +764 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/Rakefile +72 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/design_rationale.rb +52 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/hoe/minitest.rb +32 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/assertions.rb +807 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/autorun.rb +13 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/benchmark.rb +455 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/expectations.rb +303 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/hell.rb +11 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/mock.rb +240 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/parallel.rb +70 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/pride.rb +4 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/pride_plugin.rb +142 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/spec.rb +342 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/test.rb +220 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest/unit.rb +45 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/lib/minitest.rb +1053 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/test/minitest/metametameta.rb +117 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/test/minitest/test_minitest_assertions.rb +1567 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/test/minitest/test_minitest_benchmark.rb +137 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/test/minitest/test_minitest_mock.rb +872 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/test/minitest/test_minitest_reporter.rb +299 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/test/minitest/test_minitest_spec.rb +1041 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-5.14.0/test/minitest/test_minitest_test.rb +1080 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/.gitignore +27 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/.ruby-gemset +1 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/.travis.yml +10 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/.yardopts +6 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/CHANGELOG.md +40 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/Gemfile +2 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/LICENSE +20 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/README.md +115 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/Rakefile +60 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/assets/default-reporter.png +0 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/assets/mean_time_reporter.png +0 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/assets/progress-reporter.png +0 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/assets/spec-reporter.png +0 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/extensible_backtrace_filter.rb +67 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/minitest_reporter_plugin.rb +75 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/old_activesupport_fix.rb +24 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/relative_position.rb +26 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/ansi.rb +31 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/base_reporter.rb +117 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/default_reporter.rb +228 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/html_reporter.rb +221 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/junit_reporter.rb +157 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/mean_time_reporter.rb +392 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/progress_reporter.rb +96 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/ruby_mate_reporter.rb +54 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/rubymine_reporter.rb +117 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/spec_reporter.rb +61 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters/version.rb +5 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/reporters.rb +89 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/lib/minitest/templates/index.html.erb +83 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/minitest-reporters.gemspec +31 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/fixtures/junit_filename_bug_example_test.rb +21 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/fixtures/mean_time_test.rb +8 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/fixtures/progress_detailed_skip_test.rb +8 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/fixtures/progress_test.rb +8 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/fixtures/sample_test.rb +15 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/fixtures/spec_test.rb +13 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/gallery/bad_test.rb +25 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/gallery/good_test.rb +14 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/integration/reporters/junit_reporter_test.rb +12 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/integration/reporters/mean_time_reporter_test.rb +7 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/integration/reporters/progress_reporter_test.rb +34 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/test_helper.rb +22 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/unit/minitest/extensible_backtrace_filter_test.rb +42 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/unit/minitest/mean_time_reporter_unit_test.rb +152 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/unit/minitest/minitest_reporter_plugin_test.rb +14 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/unit/minitest/reporters_test.rb +52 -0
- data/vendor/bundle/ruby/2.6.0/gems/minitest-reporters-1.2.0/test/unit/minitest/spec_reporter_test.rb +41 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/CONTRIBUTING.rdoc +43 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/Gemfile +3 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/History.rdoc +2344 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/MIT-LICENSE +21 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/README.rdoc +156 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/Rakefile +41 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/azure-pipelines.yml +11 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/bin/bundle +105 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/bin/console +7 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/bin/rake +29 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/bin/rdoc +29 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/bin/rubocop +29 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/bin/setup +6 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/command_line_usage.rdoc +158 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/example/Rakefile1 +38 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/example/Rakefile2 +35 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/example/a.c +6 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/example/b.c +6 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/example/main.c +11 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/glossary.rdoc +42 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/jamis.rb +592 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/proto_rake.rdoc +127 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/rake.1 +156 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/rakefile.rdoc +622 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/doc/rational.rdoc +151 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/exe/rake +27 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/application.rb +824 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/backtrace.rb +24 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/clean.rb +78 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/cloneable.rb +17 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/cpu_counter.rb +107 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/default_loader.rb +15 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/dsl_definition.rb +195 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/early_time.rb +22 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/ext/core.rb +26 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/ext/string.rb +176 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/file_creation_task.rb +25 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/file_list.rb +435 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/file_task.rb +54 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/file_utils.rb +137 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/file_utils_ext.rb +145 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/invocation_chain.rb +57 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/invocation_exception_mixin.rb +17 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/late_time.rb +18 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/linked_list.rb +112 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/loaders/makefile.rb +54 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/multi_task.rb +14 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/name_space.rb +38 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/packagetask.rb +207 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/phony.rb +16 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/private_reader.rb +21 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/promise.rb +100 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/pseudo_status.rb +30 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/rake_module.rb +67 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/rake_test_loader.rb +27 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/rule_recursion_overflow_error.rb +20 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/scope.rb +43 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/task.rb +413 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/task_argument_error.rb +8 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/task_arguments.rb +109 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/task_manager.rb +324 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/tasklib.rb +12 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/testtask.rb +224 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/thread_history_display.rb +49 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/thread_pool.rb +163 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/trace_output.rb +23 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/version.rb +10 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake/win32.rb +51 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/lib/rake.rb +71 -0
- data/vendor/bundle/ruby/2.6.0/gems/rake-12.3.3/rake.gemspec +42 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/LICENSE.txt +19 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/README.md +38 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/Rakefile +2 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/base.rb +183 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/calculators/length.rb +100 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/calculators/running_average.rb +9 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/components/bar.rb +102 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/components/percentage.rb +29 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/components/rate.rb +43 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/components/time.rb +107 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/components/title.rb +13 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/components.rb +5 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/errors/invalid_progress_error.rb +4 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/format/formatter.rb +27 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/format/molecule.rb +60 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/format/string.rb +36 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/format.rb +3 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/output.rb +68 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/outputs/non_tty.rb +47 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/outputs/null.rb +33 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/outputs/tty.rb +32 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/progress.rb +118 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/refinements/enumerator.rb +23 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/refinements.rb +1 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/throttle.rb +25 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/time.rb +32 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/timer.rb +72 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar/version.rb +3 -0
- data/vendor/bundle/ruby/2.6.0/gems/ruby-progressbar-1.10.1/lib/ruby-progressbar.rb +22 -0
- data/vendor/bundle/ruby/2.6.0/specifications/ansi-1.5.0.gemspec +49 -0
- data/vendor/bundle/ruby/2.6.0/specifications/builder-3.2.4.gemspec +23 -0
- data/vendor/bundle/ruby/2.6.0/specifications/minitest-5.14.0.gemspec +41 -0
- data/vendor/bundle/ruby/2.6.0/specifications/minitest-reporters-1.2.0.gemspec +48 -0
- data/vendor/bundle/ruby/2.6.0/specifications/rake-12.3.3.gemspec +49 -0
- data/vendor/bundle/ruby/2.6.0/specifications/ruby-progressbar-1.10.1.gemspec +46 -0
- metadata +326 -0
@@ -0,0 +1,392 @@
|
|
1
|
+
require 'minitest/reporters'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Minitest
|
5
|
+
module Reporters
|
6
|
+
|
7
|
+
# This reporter creates a report providing the average (mean), minimum and
|
8
|
+
# maximum times for a test to run. Running this for all your tests will
|
9
|
+
# allow you to:
|
10
|
+
#
|
11
|
+
# 1) Identify the slowest running tests over time as potential candidates
|
12
|
+
# for improvements or refactoring.
|
13
|
+
# 2) Identify (and fix) regressions in test run speed caused by changes to
|
14
|
+
# your tests or algorithms in your code.
|
15
|
+
# 3) Provide an abundance of statistics to enjoy.
|
16
|
+
#
|
17
|
+
# This is achieved by creating a (configurable) 'previous runs' statistics
|
18
|
+
# file which is parsed at the end of each run to provide a new
|
19
|
+
# (configurable) report. These statistics can be reset at any time by using
|
20
|
+
# a simple rake task:
|
21
|
+
#
|
22
|
+
# rake reset_statistics
|
23
|
+
#
|
24
|
+
class MeanTimeReporter < Minitest::Reporters::DefaultReporter
|
25
|
+
|
26
|
+
class InvalidOrder < StandardError; end
|
27
|
+
class InvalidSortColumn < StandardError; end
|
28
|
+
|
29
|
+
# Reset the statistics file for this reporter. Called via a rake task:
|
30
|
+
#
|
31
|
+
# rake reset_statistics
|
32
|
+
#
|
33
|
+
# @return [Boolean]
|
34
|
+
def self.reset_statistics!
|
35
|
+
new.reset_statistics!
|
36
|
+
end
|
37
|
+
|
38
|
+
# @param options [Hash]
|
39
|
+
# @option previous_runs_filename [String] Contains the times for each test
|
40
|
+
# by description. Defaults to '/tmp/minitest_reporters_previous_run'.
|
41
|
+
# @option report_filename [String] Contains the parsed results for the
|
42
|
+
# last test run. Defaults to '/tmp/minitest_reporters_report'.
|
43
|
+
# @option show_count [Fixnum] The number of tests to show in the report
|
44
|
+
# summary at the end of the test run. Default is 15.
|
45
|
+
# @option show_progress [Boolean] If true it prints pass/skip/fail marks.
|
46
|
+
# Default is true.
|
47
|
+
# @option show_all_runs [Boolean] If true it shows all recorded suit results.
|
48
|
+
# Default is true.
|
49
|
+
# @option sort_column [Symbol] One of :avg (default), :min, :max, :last.
|
50
|
+
# Determines the column by which the report summary is sorted.
|
51
|
+
# @option order [Symbol] One of :desc (default), or :asc. By default the
|
52
|
+
# report summary is listed slowest to fastest (:desc). :asc will order
|
53
|
+
# the report summary as fastest to slowest.
|
54
|
+
# @return [Minitest::Reporters::MeanTimeReporter]
|
55
|
+
def initialize(options = {})
|
56
|
+
super
|
57
|
+
|
58
|
+
@all_suite_times = []
|
59
|
+
end
|
60
|
+
|
61
|
+
# Copies the suite times from the
|
62
|
+
# {Minitest::Reporters::DefaultReporter#after_suite} method, making them
|
63
|
+
# available to this class.
|
64
|
+
#
|
65
|
+
# @return [Hash<String => Float>]
|
66
|
+
def after_suite(suite)
|
67
|
+
super
|
68
|
+
|
69
|
+
@all_suite_times = @suite_times
|
70
|
+
end
|
71
|
+
|
72
|
+
# Runs the {Minitest::Reporters::DefaultReporter#report} method and then
|
73
|
+
# enhances it by storing the results to the 'previous_runs_filename' and
|
74
|
+
# outputs the parsed results to both the 'report_filename' and the
|
75
|
+
# terminal.
|
76
|
+
#
|
77
|
+
def report
|
78
|
+
super
|
79
|
+
|
80
|
+
create_or_update_previous_runs!
|
81
|
+
|
82
|
+
create_new_report!
|
83
|
+
|
84
|
+
write_to_screen!
|
85
|
+
end
|
86
|
+
|
87
|
+
def on_start
|
88
|
+
super if options[:show_progress]
|
89
|
+
end
|
90
|
+
|
91
|
+
def on_record(test)
|
92
|
+
super if options[:show_progress]
|
93
|
+
end
|
94
|
+
|
95
|
+
def on_report
|
96
|
+
super if options[:show_progress]
|
97
|
+
end
|
98
|
+
|
99
|
+
# Resets the 'previous runs' file, essentially removing all previous
|
100
|
+
# statistics gathered.
|
101
|
+
#
|
102
|
+
# @return [void]
|
103
|
+
def reset_statistics!
|
104
|
+
File.open(previous_runs_filename, 'w+') { |f| f.write('') }
|
105
|
+
end
|
106
|
+
|
107
|
+
protected
|
108
|
+
|
109
|
+
attr_accessor :all_suite_times
|
110
|
+
|
111
|
+
private
|
112
|
+
|
113
|
+
# @return [Hash<String => Float>]
|
114
|
+
def current_run
|
115
|
+
Hash[all_suite_times]
|
116
|
+
end
|
117
|
+
|
118
|
+
# @return [Hash] Sets default values for the filenames used by this class,
|
119
|
+
# and the number of tests to output to output to the screen after each
|
120
|
+
# run.
|
121
|
+
def defaults
|
122
|
+
{
|
123
|
+
order: :desc,
|
124
|
+
show_count: 15,
|
125
|
+
show_progress: true,
|
126
|
+
show_all_runs: true,
|
127
|
+
sort_column: :avg,
|
128
|
+
previous_runs_filename: '/tmp/minitest_reporters_previous_run',
|
129
|
+
report_filename: '/tmp/minitest_reporters_report',
|
130
|
+
}
|
131
|
+
end
|
132
|
+
|
133
|
+
# Added to the top of the report file and to the screen output.
|
134
|
+
#
|
135
|
+
# @return [String]
|
136
|
+
def report_title
|
137
|
+
"\n\e[4mMinitest Reporters: Mean Time Report\e[24m " \
|
138
|
+
"(Samples: #{samples}, Order: #{sort_column.inspect} " \
|
139
|
+
"#{order.inspect})\n"
|
140
|
+
end
|
141
|
+
|
142
|
+
# The report itself. Displays statistics about all runs, ideal for use
|
143
|
+
# with the Unix 'head' command. Listed in slowest average descending
|
144
|
+
# order.
|
145
|
+
#
|
146
|
+
# @return [String]
|
147
|
+
def report_body
|
148
|
+
order_sorted_body.each_with_object([]) do |result, obj|
|
149
|
+
rating = rate(result[:last], result[:min], result[:max])
|
150
|
+
|
151
|
+
obj << "#{avg_label} #{result[:avg].to_s.ljust(12)} " \
|
152
|
+
"#{min_label} #{result[:min].to_s.ljust(12)} " \
|
153
|
+
"#{max_label} #{result[:max].to_s.ljust(12)} " \
|
154
|
+
"#{run_label(rating)} #{result[:last].to_s.ljust(12)} " \
|
155
|
+
"#{des_label} #{result[:desc]}\n"
|
156
|
+
end.join
|
157
|
+
end
|
158
|
+
|
159
|
+
# @return [String] All of the column-sorted results sorted by the :order
|
160
|
+
# option. (Defaults to :desc).
|
161
|
+
def order_sorted_body
|
162
|
+
if desc?
|
163
|
+
column_sorted_body.reverse
|
164
|
+
|
165
|
+
elsif asc?
|
166
|
+
column_sorted_body
|
167
|
+
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
# @return [Array<Hash<Symbol => String>>] All of the results sorted by
|
172
|
+
# the :sort_column option. (Defaults to :avg).
|
173
|
+
def column_sorted_body
|
174
|
+
runs = options[:show_all_runs] ? previous_run : current_run
|
175
|
+
runs.keys.each_with_object([]) do |description, obj|
|
176
|
+
timings = previous_run[description]
|
177
|
+
size = Array(timings).size
|
178
|
+
sum = Array(timings).inject { |total, x| total + x }
|
179
|
+
obj << {
|
180
|
+
avg: (sum / size).round(9),
|
181
|
+
min: Array(timings).min.round(9),
|
182
|
+
max: Array(timings).max.round(9),
|
183
|
+
last: Array(timings).last.round(9),
|
184
|
+
desc: description,
|
185
|
+
}
|
186
|
+
end.sort_by { |k| k[sort_column] }
|
187
|
+
end
|
188
|
+
|
189
|
+
# @return [Hash]
|
190
|
+
def options
|
191
|
+
defaults.merge!(@options)
|
192
|
+
end
|
193
|
+
|
194
|
+
# @return [Fixnum] The number of tests to output to output to the screen
|
195
|
+
# after each run.
|
196
|
+
def show_count
|
197
|
+
options[:show_count]
|
198
|
+
end
|
199
|
+
|
200
|
+
# @return [Hash<String => Array<Float>]
|
201
|
+
def previous_run
|
202
|
+
@previous_run ||= YAML.load_file(previous_runs_filename)
|
203
|
+
end
|
204
|
+
|
205
|
+
# @return [String] The path to the file which contains all the durations
|
206
|
+
# for each test run. The previous runs file is in YAML format, using the
|
207
|
+
# test name for the key and an array containing the time taken to run
|
208
|
+
# this test for values.
|
209
|
+
def previous_runs_filename
|
210
|
+
options[:previous_runs_filename]
|
211
|
+
end
|
212
|
+
|
213
|
+
# Returns a boolean indicating whether a previous runs file exists.
|
214
|
+
#
|
215
|
+
# @return [Boolean]
|
216
|
+
def previously_ran?
|
217
|
+
File.exist?(previous_runs_filename)
|
218
|
+
end
|
219
|
+
|
220
|
+
# @return [String] The path to the file which contains the parsed test
|
221
|
+
# results. The results file contains a line for each test with the
|
222
|
+
# average time of the test, the minimum time the test took to run,
|
223
|
+
# the maximum time the test took to run and a description of the test
|
224
|
+
# (which is the test name as emitted by Minitest).
|
225
|
+
def report_filename
|
226
|
+
options[:report_filename]
|
227
|
+
end
|
228
|
+
|
229
|
+
# A barbaric way to find out how many runs are in the previous runs file;
|
230
|
+
# this method takes the first test listed, and counts its samples
|
231
|
+
# trusting (naively) all runs to be the same number of samples. This will
|
232
|
+
# produce incorrect averages when new tests are added, so it is advised
|
233
|
+
# to restart the statistics by removing the 'previous runs' file. A rake
|
234
|
+
# task is provided to make this more convenient.
|
235
|
+
#
|
236
|
+
# rake reset_statistics
|
237
|
+
#
|
238
|
+
# @return [Fixnum]
|
239
|
+
def samples
|
240
|
+
return 1 unless previous_run.first[1].is_a?(Array)
|
241
|
+
|
242
|
+
previous_run.first[1].size
|
243
|
+
end
|
244
|
+
|
245
|
+
# Creates a new 'previous runs' file, or updates the existing one with
|
246
|
+
# the latest timings.
|
247
|
+
#
|
248
|
+
# @return [void]
|
249
|
+
def create_or_update_previous_runs!
|
250
|
+
if previously_ran?
|
251
|
+
current_run.each do |description, elapsed|
|
252
|
+
new_times = if previous_run["#{description}"]
|
253
|
+
Array(previous_run["#{description}"]) << elapsed
|
254
|
+
|
255
|
+
else
|
256
|
+
Array(elapsed)
|
257
|
+
|
258
|
+
end
|
259
|
+
|
260
|
+
previous_run.store("#{description}", new_times)
|
261
|
+
end
|
262
|
+
|
263
|
+
File.write(previous_runs_filename, previous_run.to_yaml)
|
264
|
+
|
265
|
+
else
|
266
|
+
|
267
|
+
File.write(previous_runs_filename, current_run.to_yaml)
|
268
|
+
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
# Creates a new report file in the 'report_filename'. This file contains
|
273
|
+
# a line for each test of the following example format: (this is a single
|
274
|
+
# line despite explicit wrapping)
|
275
|
+
#
|
276
|
+
# Avg: 0.0555555 Min: 0.0498765 Max: 0.0612345 Last: 0.0499421
|
277
|
+
# Description: The test name
|
278
|
+
#
|
279
|
+
# Note however the timings are to 9 decimal places, and padded to 12
|
280
|
+
# characters and each label is coloured, Avg (yellow), Min (green),
|
281
|
+
# Max (red), Last (multi), and Description (blue). It looks pretty!
|
282
|
+
#
|
283
|
+
# The 'Last' label is special in that it will be colour coded depending
|
284
|
+
# on whether the last run was faster (bright green) or slower (bright red)
|
285
|
+
# or inconclusive (purple). This helps to identify changes on a per run
|
286
|
+
# basis.
|
287
|
+
#
|
288
|
+
# @return [void]
|
289
|
+
def create_new_report!
|
290
|
+
File.write(report_filename, report_title + report_body)
|
291
|
+
end
|
292
|
+
|
293
|
+
# Writes a number of tests (configured via the 'show_count' option) to the
|
294
|
+
# screen after creating the report. See '#create_new_report!' for example
|
295
|
+
# output information.
|
296
|
+
#
|
297
|
+
# @return [void]
|
298
|
+
def write_to_screen!
|
299
|
+
puts report_title
|
300
|
+
puts report_body.lines.take(show_count)
|
301
|
+
end
|
302
|
+
|
303
|
+
# @return [String] A yellow 'Avg:' label.
|
304
|
+
def avg_label
|
305
|
+
ANSI::Code.yellow('Avg:')
|
306
|
+
end
|
307
|
+
|
308
|
+
# @return [String] A blue 'Description:' label.
|
309
|
+
def des_label
|
310
|
+
ANSI::Code.blue('Description:')
|
311
|
+
end
|
312
|
+
|
313
|
+
# @return [String] A red 'Max:' label.
|
314
|
+
def max_label
|
315
|
+
ANSI::Code.red('Max:')
|
316
|
+
end
|
317
|
+
|
318
|
+
# @return [String] A green 'Min:' label.
|
319
|
+
def min_label
|
320
|
+
ANSI::Code.green('Min:')
|
321
|
+
end
|
322
|
+
|
323
|
+
# @param rating [Symbol] One of :faster, :slower or :inconclusive.
|
324
|
+
# @return [String] A purple 'Last:' label.
|
325
|
+
def run_label(rating)
|
326
|
+
case rating
|
327
|
+
when :faster then ANSI::Code.green('Last:')
|
328
|
+
when :slower then ANSI::Code.red('Last:')
|
329
|
+
else
|
330
|
+
ANSI::Code.magenta('Last:')
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
334
|
+
# @param run [Float] The last run time.
|
335
|
+
# @param min [Float] The minimum run time.
|
336
|
+
# @param max [Float] The maximum run time.
|
337
|
+
# @return [Symbol] One of :faster, :slower or :inconclusive.
|
338
|
+
def rate(run, min, max)
|
339
|
+
if run == min
|
340
|
+
:faster
|
341
|
+
elsif run == max
|
342
|
+
:slower
|
343
|
+
else
|
344
|
+
:inconclusive
|
345
|
+
end
|
346
|
+
end
|
347
|
+
|
348
|
+
# @return [Boolean] Whether the given :order option is :asc.
|
349
|
+
def asc?
|
350
|
+
order == :asc
|
351
|
+
end
|
352
|
+
|
353
|
+
# @return [Boolean] Whether the given :order option is :desc (default).
|
354
|
+
def desc?
|
355
|
+
order == :desc
|
356
|
+
end
|
357
|
+
|
358
|
+
# @raise [Minitest::Reporters::MeanTimeReporter::InvalidOrder]
|
359
|
+
# When the given :order option is invalid.
|
360
|
+
# @return [Symbol] The :order option, or by default; :desc.
|
361
|
+
def order
|
362
|
+
orders = [:desc, :asc]
|
363
|
+
|
364
|
+
if orders.include?(options[:order])
|
365
|
+
options[:order]
|
366
|
+
|
367
|
+
else
|
368
|
+
fail Minitest::Reporters::MeanTimeReporter::InvalidOrder,
|
369
|
+
"`:order` option must be one of #{orders.inspect}."
|
370
|
+
|
371
|
+
end
|
372
|
+
end
|
373
|
+
|
374
|
+
# @raise [Minitest::Reporters::MeanTimeReporter::InvalidSortColumn]
|
375
|
+
# When the given :sort_column option is invalid.
|
376
|
+
# @return [Symbol] The :sort_column option, or by default; :avg.
|
377
|
+
def sort_column
|
378
|
+
sort_columns = [:avg, :min, :max, :last]
|
379
|
+
|
380
|
+
if sort_columns.include?(options[:sort_column])
|
381
|
+
options[:sort_column]
|
382
|
+
|
383
|
+
else
|
384
|
+
fail Minitest::Reporters::MeanTimeReporter::InvalidSortColumn,
|
385
|
+
"`:sort_column` option must be one of #{sort_columns.inspect}."
|
386
|
+
|
387
|
+
end
|
388
|
+
end
|
389
|
+
|
390
|
+
end
|
391
|
+
end
|
392
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'ruby-progressbar'
|
2
|
+
|
3
|
+
module Minitest
|
4
|
+
module Reporters
|
5
|
+
# Fuubar-like reporter with a progress bar.
|
6
|
+
#
|
7
|
+
# Based upon Jeff Kreefmeijer's Fuubar (MIT License) and paydro's
|
8
|
+
# monkey-patch.
|
9
|
+
#
|
10
|
+
# @see https://github.com/jeffkreeftmeijer/fuubar Fuubar
|
11
|
+
# @see https://gist.github.com/356945 paydro's monkey-patch
|
12
|
+
class ProgressReporter < BaseReporter
|
13
|
+
include RelativePosition
|
14
|
+
include ANSI::Code
|
15
|
+
|
16
|
+
PROGRESS_MARK = '='
|
17
|
+
|
18
|
+
def initialize(options = {})
|
19
|
+
super
|
20
|
+
@detailed_skip = options.fetch(:detailed_skip, true)
|
21
|
+
|
22
|
+
@progress = ProgressBar.create({
|
23
|
+
total: total_count,
|
24
|
+
starting_at: count,
|
25
|
+
progress_mark: green(PROGRESS_MARK),
|
26
|
+
remainder_mark: ' ',
|
27
|
+
format: options.fetch(:format, ' %C/%c: [%B] %p%% %a, %e'),
|
28
|
+
autostart: false
|
29
|
+
})
|
30
|
+
end
|
31
|
+
|
32
|
+
def start
|
33
|
+
super
|
34
|
+
puts('Started with run options %s' % options[:args])
|
35
|
+
puts
|
36
|
+
@progress.start
|
37
|
+
@progress.total = total_count
|
38
|
+
show
|
39
|
+
end
|
40
|
+
|
41
|
+
def record(test)
|
42
|
+
super
|
43
|
+
return if test.skipped? && !@detailed_skip
|
44
|
+
if test.failure
|
45
|
+
print "\e[0m\e[1000D\e[K"
|
46
|
+
print_colored_status(test)
|
47
|
+
print_test_with_time(test)
|
48
|
+
puts
|
49
|
+
print_info(test.failure, test.error?)
|
50
|
+
puts
|
51
|
+
end
|
52
|
+
|
53
|
+
if test.skipped? && color != "red"
|
54
|
+
self.color = "yellow"
|
55
|
+
elsif test.failure
|
56
|
+
self.color = "red"
|
57
|
+
end
|
58
|
+
|
59
|
+
show
|
60
|
+
end
|
61
|
+
|
62
|
+
def report
|
63
|
+
super
|
64
|
+
@progress.finish
|
65
|
+
|
66
|
+
puts
|
67
|
+
puts('Finished in %.5fs' % total_time)
|
68
|
+
print('%d tests, %d assertions, ' % [count, assertions])
|
69
|
+
color = failures.zero? && errors.zero? ? :green : :red
|
70
|
+
print(send(color) { '%d failures, %d errors, ' } % [failures, errors])
|
71
|
+
print(yellow { '%d skips' } % skips)
|
72
|
+
puts
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def show
|
78
|
+
@progress.increment unless count == 0
|
79
|
+
end
|
80
|
+
|
81
|
+
def print_test_with_time(test)
|
82
|
+
puts [test.name, test_class(test), total_time].inspect
|
83
|
+
print(" %s#%s (%.2fs)" % [test.name, test_class(test), total_time])
|
84
|
+
end
|
85
|
+
|
86
|
+
def color
|
87
|
+
@color ||= "green"
|
88
|
+
end
|
89
|
+
|
90
|
+
def color=(color)
|
91
|
+
@color = color
|
92
|
+
@progress.progress_mark = send(color, PROGRESS_MARK)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Minitest
|
2
|
+
module Reporters
|
3
|
+
# Simple reporter designed for RubyMate.
|
4
|
+
class RubyMateReporter < BaseReporter
|
5
|
+
include RelativePosition
|
6
|
+
|
7
|
+
INFO_PADDING = 2
|
8
|
+
|
9
|
+
def start
|
10
|
+
super
|
11
|
+
puts('Started with run options %s' % options[:args])
|
12
|
+
puts
|
13
|
+
end
|
14
|
+
|
15
|
+
def record(test)
|
16
|
+
super
|
17
|
+
if test.skipped?
|
18
|
+
print 'SKIP'
|
19
|
+
print_test_with_time(test)
|
20
|
+
puts
|
21
|
+
puts
|
22
|
+
elsif test.error?
|
23
|
+
print 'ERROR'
|
24
|
+
print_test_with_time(test)
|
25
|
+
puts
|
26
|
+
print_info(test.failure)
|
27
|
+
puts
|
28
|
+
elsif test.failure
|
29
|
+
print 'FAIL'
|
30
|
+
print_test_with_time(test)
|
31
|
+
puts
|
32
|
+
print_info(test.failure, false)
|
33
|
+
puts
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def report
|
38
|
+
super
|
39
|
+
puts
|
40
|
+
puts('Finished in %.5fs' % total_time)
|
41
|
+
print('%d tests, %d assertions, ' % [count, assertions])
|
42
|
+
print('%d failures, %d errors, ' % [failures, errors])
|
43
|
+
print('%d skips' % skips)
|
44
|
+
puts
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def print_test_with_time(test)
|
50
|
+
print(" #{test.class}##{test.name} (%.2fs)" % test.time)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# Test results reporter for RubyMine IDE (http://www.jetbrains.com/ruby/) and
|
2
|
+
# TeamCity(http://www.jetbrains.com/teamcity/) Continuous Integration Server
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'teamcity/runner_common'
|
6
|
+
require 'teamcity/utils/service_message_factory'
|
7
|
+
require 'teamcity/utils/runner_utils'
|
8
|
+
require 'teamcity/utils/url_formatter'
|
9
|
+
rescue LoadError
|
10
|
+
require "minitest/reporters/default_reporter"
|
11
|
+
|
12
|
+
# delegate to default reporter
|
13
|
+
module Minitest
|
14
|
+
module Reporters
|
15
|
+
class RubyMineReporter < DefaultReporter
|
16
|
+
def initialize(options = {})
|
17
|
+
super
|
18
|
+
puts("====================================================================================================\n")
|
19
|
+
puts("RubyMine reporter works only if it test was launched using RubyMine IDE or TeamCity CI server !!!\n")
|
20
|
+
puts("====================================================================================================\n")
|
21
|
+
puts("Using default results reporter...\n")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
else
|
27
|
+
module Minitest
|
28
|
+
module Reporters
|
29
|
+
class RubyMineReporter < BaseReporter
|
30
|
+
include ANSI::Code
|
31
|
+
|
32
|
+
include ::Rake::TeamCity::RunnerCommon
|
33
|
+
include ::Rake::TeamCity::RunnerUtils
|
34
|
+
include ::Rake::TeamCity::Utils::UrlFormatter
|
35
|
+
|
36
|
+
def start
|
37
|
+
super
|
38
|
+
puts('Started with run options %s' % options[:args])
|
39
|
+
puts
|
40
|
+
|
41
|
+
# Setup test runner's MessageFactory
|
42
|
+
set_message_factory(Rake::TeamCity::MessageFactory)
|
43
|
+
log_test_reporter_attached
|
44
|
+
|
45
|
+
# Report tests count:
|
46
|
+
if ::Rake::TeamCity.is_in_idea_mode
|
47
|
+
log(@message_factory.create_tests_count(total_count))
|
48
|
+
elsif ::Rake::TeamCity.is_in_buildserver_mode
|
49
|
+
log(@message_factory.create_progress_message("Starting.. (#{total_count} tests)"))
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
def report
|
55
|
+
super
|
56
|
+
|
57
|
+
puts('Finished in %.5fs' % total_time)
|
58
|
+
print('%d tests, %d assertions, ' % [count, assertions])
|
59
|
+
print(red '%d failures, %d errors, ' % [failures, errors])
|
60
|
+
print(yellow '%d skips' % skips)
|
61
|
+
puts
|
62
|
+
end
|
63
|
+
|
64
|
+
def record(test)
|
65
|
+
super
|
66
|
+
unless test.passed?
|
67
|
+
with_result(test) do |exception_msg, backtrace|
|
68
|
+
if test.skipped?
|
69
|
+
log(@message_factory.create_test_ignored(test.name, exception_msg, backtrace))
|
70
|
+
elsif test.error?
|
71
|
+
log(@message_factory.create_test_error(test.name, exception_msg, backtrace))
|
72
|
+
else
|
73
|
+
log(@message_factory.create_test_failed(test.name, exception_msg, backtrace))
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
log(@message_factory.create_test_finished(test.name, get_time_in_ms(test.time)))
|
78
|
+
end
|
79
|
+
|
80
|
+
alias_method :output, :io
|
81
|
+
|
82
|
+
def before_suite(suite)
|
83
|
+
fqn = suite.name
|
84
|
+
log(@message_factory.create_suite_started(suite.name, location_from_ruby_qualified_name(fqn)))
|
85
|
+
end
|
86
|
+
|
87
|
+
def after_suite(suite)
|
88
|
+
log(@message_factory.create_suite_finished(suite.name))
|
89
|
+
end
|
90
|
+
|
91
|
+
def before_test(test)
|
92
|
+
super
|
93
|
+
location = test.class.instance_method(test.name).source_location
|
94
|
+
log(@message_factory.create_test_started(test.name, "file://#{location[0]}:#{location[1]}"))
|
95
|
+
end
|
96
|
+
|
97
|
+
#########
|
98
|
+
def log(msg)
|
99
|
+
output.flush
|
100
|
+
output.puts("\n#{msg}")
|
101
|
+
output.flush
|
102
|
+
|
103
|
+
# returns:
|
104
|
+
msg
|
105
|
+
end
|
106
|
+
|
107
|
+
def with_result(test)
|
108
|
+
exception = test.failure
|
109
|
+
msg = exception.nil? ? "" : "#{exception.class.name}: #{exception.message}"
|
110
|
+
backtrace = exception.nil? ? "" : filter_backtrace(exception.backtrace).join("\n")
|
111
|
+
|
112
|
+
yield(msg, backtrace)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|