win32-api 1.10.0 → 1.10.1

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 (209) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +3 -0
  3. data/Gemfile.lock +5 -5
  4. data/ext/mkmf.log +3 -27
  5. data/ext/win32/api.c +16 -15
  6. data/lib/win32/ruby2_32/win32/api.so +0 -0
  7. data/pkg/win32-api-1.10.1-universal-mingw32.gem +0 -0
  8. data/test/test_win32_api.rb +1 -1
  9. data/vendor/bundle/ruby/3.0.0/bin/rake +27 -0
  10. data/vendor/bundle/ruby/3.0.0/bin/rake.bat +2 -0
  11. data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/BSDL +22 -0
  12. data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/COPYING +57 -0
  13. data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/Gemfile +9 -0
  14. data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/LEGAL +4 -0
  15. data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/README.md +96 -0
  16. data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/Rakefile +59 -0
  17. data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/bin/console +12 -0
  18. data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/bin/setup +6 -0
  19. data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/lib/power_assert.rb +91 -0
  20. data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/lib/power_assert/colorize.rb +7 -0
  21. data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/lib/power_assert/configuration.rb +46 -0
  22. data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/lib/power_assert/context.rb +233 -0
  23. data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/lib/power_assert/enable_tracepoint_events.rb +58 -0
  24. data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/lib/power_assert/inspector.rb +62 -0
  25. data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/lib/power_assert/parser.rb +251 -0
  26. data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/lib/power_assert/version.rb +3 -0
  27. data/vendor/bundle/ruby/3.0.0/gems/power_assert-2.0.0/power_assert.gemspec +31 -0
  28. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/CONTRIBUTING.rdoc +43 -0
  29. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/Gemfile +10 -0
  30. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/History.rdoc +2386 -0
  31. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/MIT-LICENSE +21 -0
  32. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/README.rdoc +155 -0
  33. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/Rakefile +41 -0
  34. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/bin/bundle +105 -0
  35. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/bin/console +7 -0
  36. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/bin/rake +29 -0
  37. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/bin/rdoc +29 -0
  38. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/bin/rubocop +29 -0
  39. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/bin/setup +6 -0
  40. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/command_line_usage.rdoc +158 -0
  41. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/example/Rakefile1 +38 -0
  42. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/example/Rakefile2 +35 -0
  43. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/example/a.c +6 -0
  44. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/example/b.c +6 -0
  45. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/example/main.c +11 -0
  46. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/glossary.rdoc +42 -0
  47. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/jamis.rb +592 -0
  48. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/proto_rake.rdoc +127 -0
  49. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/rake.1 +156 -0
  50. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/rakefile.rdoc +622 -0
  51. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/doc/rational.rdoc +151 -0
  52. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/exe/rake +27 -0
  53. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake.rb +71 -0
  54. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/application.rb +824 -0
  55. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/backtrace.rb +24 -0
  56. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/clean.rb +78 -0
  57. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/cloneable.rb +17 -0
  58. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/cpu_counter.rb +107 -0
  59. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/default_loader.rb +15 -0
  60. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/dsl_definition.rb +195 -0
  61. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/early_time.rb +22 -0
  62. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/ext/core.rb +26 -0
  63. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/ext/string.rb +176 -0
  64. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/file_creation_task.rb +25 -0
  65. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/file_list.rb +435 -0
  66. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/file_task.rb +54 -0
  67. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/file_utils.rb +134 -0
  68. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/file_utils_ext.rb +134 -0
  69. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/invocation_chain.rb +57 -0
  70. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/invocation_exception_mixin.rb +17 -0
  71. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/late_time.rb +18 -0
  72. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/linked_list.rb +112 -0
  73. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/loaders/makefile.rb +54 -0
  74. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/multi_task.rb +14 -0
  75. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/name_space.rb +38 -0
  76. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/packagetask.rb +222 -0
  77. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/phony.rb +16 -0
  78. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/private_reader.rb +21 -0
  79. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/promise.rb +100 -0
  80. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/pseudo_status.rb +30 -0
  81. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/rake_module.rb +67 -0
  82. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/rake_test_loader.rb +27 -0
  83. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/rule_recursion_overflow_error.rb +20 -0
  84. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/scope.rb +43 -0
  85. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/task.rb +434 -0
  86. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/task_argument_error.rb +8 -0
  87. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/task_arguments.rb +109 -0
  88. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/task_manager.rb +331 -0
  89. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/tasklib.rb +12 -0
  90. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/testtask.rb +189 -0
  91. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/thread_history_display.rb +49 -0
  92. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/thread_pool.rb +163 -0
  93. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/trace_output.rb +23 -0
  94. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/version.rb +10 -0
  95. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/lib/rake/win32.rb +51 -0
  96. data/vendor/bundle/ruby/3.0.0/gems/rake-13.0.3/rake.gemspec +43 -0
  97. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/BSDL +24 -0
  98. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/COPYING +64 -0
  99. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/PSFL +271 -0
  100. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/README.md +97 -0
  101. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/Rakefile +66 -0
  102. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/doc/text/getting-started.md +246 -0
  103. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/doc/text/how-to.md +90 -0
  104. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/doc/text/news.md +1552 -0
  105. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test-unit.rb +19 -0
  106. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit.rb +521 -0
  107. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/assertion-failed-error.rb +25 -0
  108. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/assertions.rb +2256 -0
  109. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/attribute-matcher.rb +26 -0
  110. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/attribute.rb +227 -0
  111. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/auto-runner-loader.rb +17 -0
  112. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/autorunner.rb +569 -0
  113. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/code-snippet-fetcher.rb +58 -0
  114. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/collector.rb +73 -0
  115. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/collector/descendant.rb +19 -0
  116. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/collector/dir.rb +108 -0
  117. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/collector/load.rb +197 -0
  118. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/collector/objectspace.rb +34 -0
  119. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/collector/xml.rb +249 -0
  120. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/color-scheme.rb +216 -0
  121. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/color.rb +134 -0
  122. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/data-sets.rb +116 -0
  123. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/data.rb +371 -0
  124. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/diff.rb +745 -0
  125. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/error.rb +158 -0
  126. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/exception-handler.rb +82 -0
  127. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/failure.rb +169 -0
  128. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/fault-location-detector.rb +100 -0
  129. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/fixture.rb +304 -0
  130. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/notification.rb +138 -0
  131. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/omission.rb +198 -0
  132. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/pending.rb +155 -0
  133. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/priority.rb +196 -0
  134. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/runner/console.rb +67 -0
  135. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/runner/emacs.rb +8 -0
  136. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/runner/xml.rb +15 -0
  137. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/test-suite-creator.rb +103 -0
  138. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/testcase.rb +899 -0
  139. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/testresult.rb +132 -0
  140. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/testsuite.rb +175 -0
  141. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/ui/console/outputlevel.rb +15 -0
  142. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/ui/console/testrunner.rb +733 -0
  143. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/ui/emacs/testrunner.rb +49 -0
  144. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/ui/testrunner.rb +53 -0
  145. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/ui/testrunnermediator.rb +114 -0
  146. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/ui/testrunnerutilities.rb +41 -0
  147. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/ui/xml/testrunner.rb +224 -0
  148. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/util/backtracefilter.rb +59 -0
  149. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/util/method-owner-finder.rb +28 -0
  150. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/util/observable.rb +90 -0
  151. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/util/output.rb +32 -0
  152. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/util/procwrapper.rb +48 -0
  153. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/version.rb +5 -0
  154. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/lib/test/unit/warning.rb +3 -0
  155. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/sample/adder.rb +13 -0
  156. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/sample/subtracter.rb +12 -0
  157. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/sample/test_adder.rb +20 -0
  158. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/sample/test_subtracter.rb +20 -0
  159. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/sample/test_user.rb +23 -0
  160. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/collector/test-descendant.rb +182 -0
  161. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/collector/test-load.rb +475 -0
  162. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/collector/test_dir.rb +407 -0
  163. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/collector/test_objectspace.rb +102 -0
  164. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/fixtures/header-label.csv +3 -0
  165. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/fixtures/header-label.tsv +3 -0
  166. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/fixtures/header.csv +3 -0
  167. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/fixtures/header.tsv +3 -0
  168. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/fixtures/no-header.csv +2 -0
  169. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/fixtures/no-header.tsv +2 -0
  170. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/fixtures/plus.csv +3 -0
  171. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/run-test.rb +22 -0
  172. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-assertions.rb +2187 -0
  173. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-attribute-matcher.rb +38 -0
  174. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-attribute.rb +123 -0
  175. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-code-snippet.rb +79 -0
  176. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-color-scheme.rb +123 -0
  177. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-color.rb +47 -0
  178. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-data.rb +419 -0
  179. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-diff.rb +518 -0
  180. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-emacs-runner.rb +60 -0
  181. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-error.rb +26 -0
  182. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-failure.rb +33 -0
  183. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-fault-location-detector.rb +163 -0
  184. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-fixture.rb +713 -0
  185. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-notification.rb +33 -0
  186. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-omission.rb +81 -0
  187. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-pending.rb +70 -0
  188. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-priority.rb +184 -0
  189. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-test-case.rb +1284 -0
  190. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-test-result.rb +113 -0
  191. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-test-suite-creator.rb +97 -0
  192. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/test-test-suite.rb +151 -0
  193. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/testunit-test-util.rb +33 -0
  194. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/ui/test_testrunmediator.rb +20 -0
  195. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/util/test-method-owner-finder.rb +38 -0
  196. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/util/test-output.rb +11 -0
  197. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/util/test_backtracefilter.rb +52 -0
  198. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/util/test_observable.rb +102 -0
  199. data/vendor/bundle/ruby/3.0.0/gems/test-unit-3.4.1/test/util/test_procwrapper.rb +36 -0
  200. data/vendor/bundle/ruby/3.0.0/specifications/power_assert-2.0.0.gemspec +46 -0
  201. data/vendor/bundle/ruby/3.0.0/specifications/rake-13.0.3.gemspec +26 -0
  202. data/vendor/bundle/ruby/3.0.0/specifications/test-unit-3.4.1.gemspec +41 -0
  203. data/win32-api.gemspec +1 -1
  204. metadata +199 -8
  205. data/ext/Makefile +0 -269
  206. data/ext/api-x64-mingw32.def +0 -2
  207. data/ext/api.o +0 -0
  208. data/ext/api.so +0 -0
  209. data/ext/win32/api.so +0 -0
@@ -0,0 +1,745 @@
1
+ # port of Python's difflib.
2
+ #
3
+ # Copyright (c) 2001-2008 Python Software Foundation; All Rights Reserved
4
+ # Copyright (c) 2008-2011 Kouhei Sutou; All Rights Reserved
5
+ #
6
+ # It is free software, and is distributed under (the new Ruby license
7
+ # or BSDL) and the PSF license.
8
+
9
+ module Test
10
+ module Unit
11
+ module Diff
12
+ class SequenceMatcher
13
+ def initialize(from, to, &junk_predicate)
14
+ @from = from
15
+ @to = to
16
+ @junk_predicate = junk_predicate
17
+ update_to_indexes
18
+ end
19
+
20
+ def longest_match(from_start, from_end, to_start, to_end)
21
+ best_info = find_best_match_position(from_start, from_end,
22
+ to_start, to_end)
23
+ unless @junks.empty?
24
+ args = [from_start, from_end, to_start, to_end]
25
+ best_info = adjust_best_info_with_junk_predicate(false, best_info,
26
+ *args)
27
+ best_info = adjust_best_info_with_junk_predicate(true, best_info,
28
+ *args)
29
+ end
30
+
31
+ best_info
32
+ end
33
+
34
+ def blocks
35
+ @blocks ||= compute_blocks
36
+ end
37
+
38
+ def operations
39
+ @operations ||= compute_operations
40
+ end
41
+
42
+ def grouped_operations(context_size=nil)
43
+ context_size ||= 3
44
+ _operations = operations.dup
45
+ _operations = [[:equal, 0, 0, 0, 0]] if _operations.empty?
46
+ expand_edge_equal_operations!(_operations, context_size)
47
+
48
+ group_window = context_size * 2
49
+ groups = []
50
+ group = []
51
+ _operations.each do |tag, from_start, from_end, to_start, to_end|
52
+ if tag == :equal and from_end - from_start > group_window
53
+ group << [tag,
54
+ from_start,
55
+ [from_end, from_start + context_size].min,
56
+ to_start,
57
+ [to_end, to_start + context_size].min]
58
+ groups << group
59
+ group = []
60
+ from_start = [from_start, from_end - context_size].max
61
+ to_start = [to_start, to_end - context_size].max
62
+ end
63
+ group << [tag, from_start, from_end, to_start, to_end]
64
+ end
65
+ groups << group unless group.empty?
66
+ groups
67
+ end
68
+
69
+ def ratio
70
+ @ratio ||= compute_ratio
71
+ end
72
+
73
+ private
74
+ def update_to_indexes
75
+ @to_indexes = {}
76
+ @junks = {}
77
+ if @to.is_a?(String)
78
+ each = " "[0].is_a?(Integer) ? :each_byte : :each_char
79
+ else
80
+ each = :each
81
+ end
82
+ i = 0
83
+ @to.__send__(each) do |item|
84
+ @to_indexes[item] ||= []
85
+ @to_indexes[item] << i
86
+ i += 1
87
+ end
88
+
89
+ return if @junk_predicate.nil?
90
+ @to_indexes = @to_indexes.reject do |key, value|
91
+ junk = @junk_predicate.call(key)
92
+ @junks[key] = true if junk
93
+ junk
94
+ end
95
+ end
96
+
97
+ def find_best_match_position(from_start, from_end, to_start, to_end)
98
+ best_from, best_to, best_size = from_start, to_start, 0
99
+ sizes = {}
100
+ from_start.upto(from_end) do |from_index|
101
+ _sizes = {}
102
+ (@to_indexes[@from[from_index]] || []).each do |to_index|
103
+ next if to_index < to_start
104
+ break if to_index > to_end
105
+ size = _sizes[to_index] = (sizes[to_index - 1] || 0) + 1
106
+ if size > best_size
107
+ best_from = from_index - size + 1
108
+ best_to = to_index - size + 1
109
+ best_size = size
110
+ end
111
+ end
112
+ sizes = _sizes
113
+ end
114
+ [best_from, best_to, best_size]
115
+ end
116
+
117
+ def adjust_best_info_with_junk_predicate(should_junk, best_info,
118
+ from_start, from_end,
119
+ to_start, to_end)
120
+ best_from, best_to, best_size = best_info
121
+ while best_from > from_start and best_to > to_start and
122
+ (should_junk ?
123
+ @junks.has_key?(@to[best_to - 1]) :
124
+ !@junks.has_key?(@to[best_to - 1])) and
125
+ @from[best_from - 1] == @to[best_to - 1]
126
+ best_from -= 1
127
+ best_to -= 1
128
+ best_size += 1
129
+ end
130
+
131
+ while best_from + best_size < from_end and
132
+ best_to + best_size < to_end and
133
+ (should_junk ?
134
+ @junks.has_key?(@to[best_to + best_size]) :
135
+ !@junks.has_key?(@to[best_to + best_size])) and
136
+ @from[best_from + best_size] == @to[best_to + best_size]
137
+ best_size += 1
138
+ end
139
+
140
+ [best_from, best_to, best_size]
141
+ end
142
+
143
+ def matches
144
+ @matches ||= compute_matches
145
+ end
146
+
147
+ def compute_matches
148
+ matches = []
149
+ queue = [[0, @from.size, 0, @to.size]]
150
+ until queue.empty?
151
+ from_start, from_end, to_start, to_end = queue.pop
152
+ match = longest_match(from_start, from_end - 1, to_start, to_end - 1)
153
+ match_from_index, match_to_index, size = match
154
+ unless size.zero?
155
+ if from_start < match_from_index and
156
+ to_start < match_to_index
157
+ queue.push([from_start, match_from_index,
158
+ to_start, match_to_index])
159
+ end
160
+ matches << match
161
+ if match_from_index + size < from_end and
162
+ match_to_index + size < to_end
163
+ queue.push([match_from_index + size, from_end,
164
+ match_to_index + size, to_end])
165
+ end
166
+ end
167
+ end
168
+ matches.sort_by do |(from_index, _, _)|
169
+ from_index
170
+ end
171
+ end
172
+
173
+ def compute_blocks
174
+ blocks = []
175
+ current_from_index = current_to_index = current_size = 0
176
+ matches.each do |from_index, to_index, size|
177
+ if current_from_index + current_size == from_index and
178
+ current_to_index + current_size == to_index
179
+ current_size += size
180
+ else
181
+ unless current_size.zero?
182
+ blocks << [current_from_index, current_to_index, current_size]
183
+ end
184
+ current_from_index = from_index
185
+ current_to_index = to_index
186
+ current_size = size
187
+ end
188
+ end
189
+ unless current_size.zero?
190
+ blocks << [current_from_index, current_to_index, current_size]
191
+ end
192
+
193
+ blocks << [@from.size, @to.size, 0]
194
+ blocks
195
+ end
196
+
197
+ def compute_operations
198
+ from_index = to_index = 0
199
+ operations = []
200
+ blocks.each do |match_from_index, match_to_index, size|
201
+ tag = determine_tag(from_index, to_index,
202
+ match_from_index, match_to_index)
203
+ if tag != :equal
204
+ operations << [tag,
205
+ from_index, match_from_index,
206
+ to_index, match_to_index]
207
+ end
208
+
209
+ from_index, to_index = match_from_index + size, match_to_index + size
210
+ if size > 0
211
+ operations << [:equal,
212
+ match_from_index, from_index,
213
+ match_to_index, to_index]
214
+ end
215
+ end
216
+ operations
217
+ end
218
+
219
+ def compute_ratio
220
+ matches = blocks.inject(0) {|result, block| result + block[-1]}
221
+ length = @from.length + @to.length
222
+ if length.zero?
223
+ 1.0
224
+ else
225
+ 2.0 * matches / length
226
+ end
227
+ end
228
+
229
+ def determine_tag(from_index, to_index,
230
+ match_from_index, match_to_index)
231
+ if from_index < match_from_index and to_index < match_to_index
232
+ :replace
233
+ elsif from_index < match_from_index
234
+ :delete
235
+ elsif to_index < match_to_index
236
+ :insert
237
+ else
238
+ :equal
239
+ end
240
+ end
241
+
242
+ def expand_edge_equal_operations!(_operations, context_size)
243
+ tag, from_start, from_end, to_start, to_end = _operations[0]
244
+ if tag == :equal
245
+ _operations[0] = [tag,
246
+ [from_start, from_end - context_size].max,
247
+ from_end,
248
+ [to_start, to_end - context_size].max,
249
+ to_end]
250
+ end
251
+
252
+ tag, from_start, from_end, to_start, to_end = _operations[-1]
253
+ if tag == :equal
254
+ _operations[-1] = [tag,
255
+ from_start,
256
+ [from_end, from_start + context_size].min,
257
+ to_start,
258
+ [to_end, to_start + context_size].min]
259
+ end
260
+ end
261
+ end
262
+
263
+ class Differ
264
+ def initialize(from, to)
265
+ @from = from
266
+ @to = to
267
+ end
268
+
269
+ private
270
+ def tag(mark, contents)
271
+ contents.collect {|content| mark + content}
272
+ end
273
+ end
274
+
275
+ class UTF8Line
276
+ class << self
277
+ # from http://unicode.org/reports/tr11/
278
+ WIDE_CHARACTERS =
279
+ [0x1100..0x1159, 0x115F..0x115F, 0x2329..0x232A,
280
+ 0x2E80..0x2E99, 0x2E9B..0x2EF3, 0x2F00..0x2FD5,
281
+ 0x2FF0..0x2FFB, 0x3000..0x303E, 0x3041..0x3096,
282
+ 0x3099..0x30FF, 0x3105..0x312D, 0x3131..0x318E,
283
+ 0x3190..0x31B7, 0x31C0..0x31E3, 0x31F0..0x321E,
284
+ 0x3220..0x3243, 0x3250..0x32FE, 0x3300..0x4DB5,
285
+ 0x4E00..0x9FC3, 0xA000..0xA48C, 0xA490..0xA4C6,
286
+ 0xAC00..0xD7A3, 0xF900..0xFA2D, 0xFA30..0xFA6A,
287
+ 0xFA70..0xFAD9, 0xFE10..0xFE19, 0xFE30..0xFE52,
288
+ 0xFE54..0xFE66, 0xFE68..0xFE6B, 0xFF01..0xFF60,
289
+ 0xFFE0..0xFFE6, 0x20000..0x2FFFD, 0x30000..0x3FFFD,
290
+ ]
291
+
292
+ AMBIGUOUS =
293
+ [0x00A1..0x00A1, 0x00A4..0x00A4, 0x00A7..0x00A8,
294
+ 0x00AA..0x00AA, 0x00AD..0x00AE, 0x00B0..0x00B4,
295
+ 0x00B6..0x00BA, 0x00BC..0x00BF, 0x00C6..0x00C6,
296
+ 0x00D0..0x00D0, 0x00D7..0x00D8, 0x00DE..0x00E1,
297
+ 0x00E6..0x00E6, 0x00E8..0x00EA, 0x00EC..0x00ED,
298
+ 0x00F0..0x00F0, 0x00F2..0x00F3, 0x00F7..0x00FA,
299
+ 0x00FC..0x00FC, 0x00FE..0x00FE, 0x0101..0x0101,
300
+ 0x0111..0x0111, 0x0113..0x0113, 0x011B..0x011B,
301
+ 0x0126..0x0127, 0x012B..0x012B, 0x0131..0x0133,
302
+ 0x0138..0x0138, 0x013F..0x0142, 0x0144..0x0144,
303
+ 0x0148..0x014B, 0x014D..0x014D, 0x0152..0x0153,
304
+ 0x0166..0x0167, 0x016B..0x016B, 0x01CE..0x01CE,
305
+ 0x01D0..0x01D0, 0x01D2..0x01D2, 0x01D4..0x01D4,
306
+ 0x01D6..0x01D6, 0x01D8..0x01D8, 0x01DA..0x01DA,
307
+ 0x01DC..0x01DC, 0x0251..0x0251, 0x0261..0x0261,
308
+ 0x02C4..0x02C4, 0x02C7..0x02C7, 0x02C9..0x02CB,
309
+ 0x02CD..0x02CD, 0x02D0..0x02D0, 0x02D8..0x02DB,
310
+ 0x02DD..0x02DD, 0x02DF..0x02DF, 0x0300..0x036F,
311
+ 0x0391..0x03A1, 0x03A3..0x03A9, 0x03B1..0x03C1,
312
+ 0x03C3..0x03C9, 0x0401..0x0401, 0x0410..0x044F,
313
+ 0x0451..0x0451, 0x2010..0x2010, 0x2013..0x2016,
314
+ 0x2018..0x2019, 0x201C..0x201D, 0x2020..0x2022,
315
+ 0x2024..0x2027, 0x2030..0x2030, 0x2032..0x2033,
316
+ 0x2035..0x2035, 0x203B..0x203B, 0x203E..0x203E,
317
+ 0x2074..0x2074, 0x207F..0x207F, 0x2081..0x2084,
318
+ 0x20AC..0x20AC, 0x2103..0x2103, 0x2105..0x2105,
319
+ 0x2109..0x2109, 0x2113..0x2113, 0x2116..0x2116,
320
+ 0x2121..0x2122, 0x2126..0x2126, 0x212B..0x212B,
321
+ 0x2153..0x2154, 0x215B..0x215E, 0x2160..0x216B,
322
+ 0x2170..0x2179, 0x2190..0x2199, 0x21B8..0x21B9,
323
+ 0x21D2..0x21D2, 0x21D4..0x21D4, 0x21E7..0x21E7,
324
+ 0x2200..0x2200, 0x2202..0x2203, 0x2207..0x2208,
325
+ 0x220B..0x220B, 0x220F..0x220F, 0x2211..0x2211,
326
+ 0x2215..0x2215, 0x221A..0x221A, 0x221D..0x2220,
327
+ 0x2223..0x2223, 0x2225..0x2225, 0x2227..0x222C,
328
+ 0x222E..0x222E, 0x2234..0x2237, 0x223C..0x223D,
329
+ 0x2248..0x2248, 0x224C..0x224C, 0x2252..0x2252,
330
+ 0x2260..0x2261, 0x2264..0x2267, 0x226A..0x226B,
331
+ 0x226E..0x226F, 0x2282..0x2283, 0x2286..0x2287,
332
+ 0x2295..0x2295, 0x2299..0x2299, 0x22A5..0x22A5,
333
+ 0x22BF..0x22BF, 0x2312..0x2312, 0x2460..0x24E9,
334
+ 0x24EB..0x254B, 0x2550..0x2573, 0x2580..0x258F,
335
+ 0x2592..0x2595, 0x25A0..0x25A1, 0x25A3..0x25A9,
336
+ 0x25B2..0x25B3, 0x25B6..0x25B7, 0x25BC..0x25BD,
337
+ 0x25C0..0x25C1, 0x25C6..0x25C8, 0x25CB..0x25CB,
338
+ 0x25CE..0x25D1, 0x25E2..0x25E5, 0x25EF..0x25EF,
339
+ 0x2605..0x2606, 0x2609..0x2609, 0x260E..0x260F,
340
+ 0x2614..0x2615, 0x261C..0x261C, 0x261E..0x261E,
341
+ 0x2640..0x2640, 0x2642..0x2642, 0x2660..0x2661,
342
+ 0x2663..0x2665, 0x2667..0x266A, 0x266C..0x266D,
343
+ 0x266F..0x266F, 0x273D..0x273D, 0x2776..0x277F,
344
+ 0xE000..0xF8FF, 0xFE00..0xFE0F, 0xFFFD..0xFFFD,
345
+ 0xE0100..0xE01EF, 0xF0000..0xFFFFD, 0x100000..0x10FFFD,
346
+ ]
347
+
348
+ def wide_character?(character)
349
+ binary_search_ranges(character, WIDE_CHARACTERS) or
350
+ binary_search_ranges(character, AMBIGUOUS)
351
+ end
352
+
353
+ private
354
+ def binary_search_ranges(character, ranges)
355
+ if ranges.size.zero?
356
+ false
357
+ elsif ranges.size == 1
358
+ ranges[0].include?(character)
359
+ else
360
+ half = ranges.size / 2
361
+ range = ranges[half]
362
+ if range.include?(character)
363
+ true
364
+ elsif character < range.begin
365
+ binary_search_ranges(character, ranges[0...half])
366
+ else
367
+ binary_search_ranges(character, ranges[(half + 1)..-1])
368
+ end
369
+ end
370
+ end
371
+ end
372
+
373
+ def initialize(line)
374
+ @line = line
375
+ @characters = @line.unpack("U*")
376
+ end
377
+
378
+ def [](*args)
379
+ result = @characters[*args]
380
+ if result.respond_to?(:pack)
381
+ result.pack("U*")
382
+ else
383
+ result
384
+ end
385
+ end
386
+
387
+ def each(&block)
388
+ @characters.each(&block)
389
+ end
390
+
391
+ def size
392
+ @characters.size
393
+ end
394
+
395
+ def to_s
396
+ @line
397
+ end
398
+
399
+ def compute_width(start, _end)
400
+ width = 0
401
+ start.upto(_end - 1) do |i|
402
+ if self.class.wide_character?(@characters[i])
403
+ width += 2
404
+ else
405
+ width += 1
406
+ end
407
+ end
408
+ width
409
+ end
410
+ end
411
+
412
+ class ReadableDiffer < Differ
413
+ def diff(options={})
414
+ @result = []
415
+ operations.each do |tag, from_start, from_end, to_start, to_end|
416
+ case tag
417
+ when :replace
418
+ diff_lines(from_start, from_end, to_start, to_end)
419
+ when :delete
420
+ tag_deleted(@from[from_start...from_end])
421
+ when :insert
422
+ tag_inserted(@to[to_start...to_end])
423
+ when :equal
424
+ tag_equal(@from[from_start...from_end])
425
+ else
426
+ raise "unknown tag: #{tag}"
427
+ end
428
+ end
429
+ @result
430
+ end
431
+
432
+ private
433
+ def operations
434
+ @operations ||= nil
435
+ if @operations.nil?
436
+ matcher = SequenceMatcher.new(@from, @to)
437
+ @operations = matcher.operations
438
+ end
439
+ @operations
440
+ end
441
+
442
+ def default_ratio
443
+ 0.74
444
+ end
445
+
446
+ def cut_off_ratio
447
+ 0.75
448
+ end
449
+
450
+ def tag(mark, contents)
451
+ contents.each do |content|
452
+ @result << (mark + content)
453
+ end
454
+ end
455
+
456
+ def tag_deleted(contents)
457
+ tag("- ", contents)
458
+ end
459
+
460
+ def tag_inserted(contents)
461
+ tag("+ ", contents)
462
+ end
463
+
464
+ def tag_equal(contents)
465
+ tag(" ", contents)
466
+ end
467
+
468
+ def tag_difference(contents)
469
+ tag("? ", contents)
470
+ end
471
+
472
+ def find_diff_line_info(from_start, from_end, to_start, to_end)
473
+ best_ratio = default_ratio
474
+ from_equal_index = to_equal_index = nil
475
+ from_best_index = to_best_index = nil
476
+
477
+ to_start.upto(to_end - 1) do |to_index|
478
+ from_start.upto(from_end - 1) do |from_index|
479
+ if @from[from_index] == @to[to_index]
480
+ from_equal_index ||= from_index
481
+ to_equal_index ||= to_index
482
+ next
483
+ end
484
+
485
+ matcher = SequenceMatcher.new(@from[from_index], @to[to_index],
486
+ &method(:space_character?))
487
+ if matcher.ratio > best_ratio
488
+ best_ratio = matcher.ratio
489
+ from_best_index = from_index
490
+ to_best_index = to_index
491
+ end
492
+ end
493
+ end
494
+
495
+ [best_ratio,
496
+ from_equal_index, to_equal_index,
497
+ from_best_index, to_best_index]
498
+ end
499
+
500
+ def diff_lines(from_start, from_end, to_start, to_end)
501
+ info = find_diff_line_info(from_start, from_end, to_start, to_end)
502
+ best_ratio, from_equal_index, to_equal_index, *info = info
503
+ from_best_index, to_best_index = info
504
+ from_best_index ||= from_start
505
+ to_best_index ||= to_start
506
+
507
+ if best_ratio < cut_off_ratio
508
+ if from_equal_index.nil?
509
+ if to_end - to_start < from_end - from_start
510
+ tag_inserted(@to[to_start...to_end])
511
+ tag_deleted(@from[from_start...from_end])
512
+ else
513
+ tag_deleted(@from[from_start...from_end])
514
+ tag_inserted(@to[to_start...to_end])
515
+ end
516
+ return
517
+ end
518
+ from_best_index = from_equal_index
519
+ to_best_index = to_equal_index
520
+ best_ratio = 1.0
521
+ end
522
+
523
+ _diff_lines(from_start, from_best_index, to_start, to_best_index)
524
+ diff_line(@from[from_best_index], @to[to_best_index])
525
+ _diff_lines(from_best_index + 1, from_end, to_best_index + 1, to_end)
526
+ end
527
+
528
+ def _diff_lines(from_start, from_end, to_start, to_end)
529
+ if from_start < from_end
530
+ if to_start < to_end
531
+ diff_lines(from_start, from_end, to_start, to_end)
532
+ else
533
+ tag_deleted(@from[from_start...from_end])
534
+ end
535
+ else
536
+ tag_inserted(@to[to_start...to_end])
537
+ end
538
+ end
539
+
540
+ def line_operations(from_line, to_line)
541
+ if !from_line.respond_to?(:force_encoding) and $KCODE == "UTF8"
542
+ from_line = UTF8Line.new(from_line)
543
+ to_line = UTF8Line.new(to_line)
544
+ end
545
+ matcher = SequenceMatcher.new(from_line, to_line,
546
+ &method(:space_character?))
547
+ [from_line, to_line, matcher.operations]
548
+ end
549
+
550
+ def compute_width(line, start, _end)
551
+ if line.respond_to?(:encoding) and
552
+ Encoding.compatible?(Encoding::UTF_8, line.encoding)
553
+ utf8_line = line[start..._end].encode(Encoding::UTF_8)
554
+ width = 0
555
+ utf8_line.each_codepoint do |unicode_codepoint|
556
+ if UTF8Line.wide_character?(unicode_codepoint)
557
+ width += 2
558
+ else
559
+ width += 1
560
+ end
561
+ end
562
+ width
563
+ elsif line.is_a?(UTF8Line)
564
+ line.compute_width(start, _end)
565
+ else
566
+ _end - start
567
+ end
568
+ end
569
+
570
+ def diff_line(from_line, to_line)
571
+ from_tags = ""
572
+ to_tags = ""
573
+ from_line, to_line, _operations = line_operations(from_line, to_line)
574
+ _operations.each do |tag, from_start, from_end, to_start, to_end|
575
+ from_width = compute_width(from_line, from_start, from_end)
576
+ to_width = compute_width(to_line, to_start, to_end)
577
+ case tag
578
+ when :replace
579
+ from_tags += "^" * from_width
580
+ to_tags += "^" * to_width
581
+ when :delete
582
+ from_tags += "-" * from_width
583
+ when :insert
584
+ to_tags += "+" * to_width
585
+ when :equal
586
+ from_tags += " " * from_width
587
+ to_tags += " " * to_width
588
+ else
589
+ raise "unknown tag: #{tag}"
590
+ end
591
+ end
592
+ format_diff_point(from_line, to_line, from_tags, to_tags)
593
+ end
594
+
595
+ def format_diff_point(from_line, to_line, from_tags, to_tags)
596
+ common = [n_leading_characters(from_line, ?\t),
597
+ n_leading_characters(to_line, ?\t)].min
598
+ common = [common,
599
+ n_leading_characters(from_tags[0, common], " "[0])].min
600
+ from_tags = from_tags[common..-1].rstrip
601
+ to_tags = to_tags[common..-1].rstrip
602
+
603
+ tag_deleted([from_line])
604
+ unless from_tags.empty?
605
+ tag_difference(["#{"\t" * common}#{from_tags}"])
606
+ end
607
+ tag_inserted([to_line])
608
+ unless to_tags.empty?
609
+ tag_difference(["#{"\t" * common}#{to_tags}"])
610
+ end
611
+ end
612
+
613
+ def n_leading_characters(string, character)
614
+ n = 0
615
+ while string[n] == character
616
+ n += 1
617
+ end
618
+ n
619
+ end
620
+
621
+ def space_character?(character)
622
+ [" "[0], "\t"[0]].include?(character)
623
+ end
624
+ end
625
+
626
+ class UnifiedDiffer < Differ
627
+ def diff(options={})
628
+ groups = SequenceMatcher.new(@from, @to).grouped_operations
629
+ return [] if groups.empty?
630
+ return [] if same_content?(groups)
631
+
632
+ show_context = options[:show_context]
633
+ show_context = true if show_context.nil?
634
+ result = ["--- #{options[:from_label]}".rstrip,
635
+ "+++ #{options[:to_label]}".rstrip]
636
+ groups.each do |operations|
637
+ result << format_summary(operations, show_context)
638
+ operations.each do |args|
639
+ operation_tag, from_start, from_end, to_start, to_end = args
640
+ case operation_tag
641
+ when :replace
642
+ result.concat(tag("-", @from[from_start...from_end]))
643
+ result.concat(tag("+", @to[to_start...to_end]))
644
+ when :delete
645
+ result.concat(tag("-", @from[from_start...from_end]))
646
+ when :insert
647
+ result.concat(tag("+", @to[to_start...to_end]))
648
+ when :equal
649
+ result.concat(tag(" ", @from[from_start...from_end]))
650
+ end
651
+ end
652
+ end
653
+ result
654
+ end
655
+
656
+ private
657
+ def same_content?(groups)
658
+ return false if groups.size != 1
659
+ group = groups[0]
660
+ return false if group.size != 1
661
+ tag, from_start, from_end, to_start, to_end = group[0]
662
+
663
+ tag == :equal and [from_start, from_end] == [to_start, to_end]
664
+ end
665
+
666
+ def format_summary(operations, show_context)
667
+ _, first_from_start, _, first_to_start, _ = operations[0]
668
+ _, _, last_from_end, _, last_to_end = operations[-1]
669
+ summary = "@@ -%d,%d +%d,%d @@" % [first_from_start + 1,
670
+ last_from_end - first_from_start,
671
+ first_to_start + 1,
672
+ last_to_end - first_to_start,]
673
+ if show_context
674
+ interesting_line = find_interesting_line(first_from_start,
675
+ first_to_start,
676
+ :define_line?)
677
+ summary << " #{interesting_line}" if interesting_line
678
+ end
679
+ summary
680
+ end
681
+
682
+ def find_interesting_line(from_start, to_start, predicate)
683
+ from_index = from_start
684
+ to_index = to_start
685
+ while from_index >= 0 or to_index >= 0
686
+ [@from[from_index], @to[to_index]].each do |line|
687
+ return line if line and __send__(predicate, line)
688
+ end
689
+
690
+ from_index -= 1
691
+ to_index -= 1
692
+ end
693
+ nil
694
+ end
695
+
696
+ def define_line?(line)
697
+ /\A(?:[_a-zA-Z$]|\s*(?:class|module|def)\b)/ =~ line
698
+ end
699
+ end
700
+
701
+ module_function
702
+ def need_fold?(diff)
703
+ /^[-+].{79}/ =~ diff
704
+ end
705
+
706
+ def fold(string)
707
+ string.split(/\r?\n/).collect do |line|
708
+ line.gsub(/(.{78})/, "\\1\n")
709
+ end.join("\n")
710
+ end
711
+
712
+ def folded_readable(from, to, options={})
713
+ readable(fold(from), fold(to), options)
714
+ end
715
+
716
+ def readable(from, to, options={})
717
+ diff(ReadableDiffer, from, to, options)
718
+ end
719
+
720
+ def unified(from, to, options={})
721
+ diff(UnifiedDiffer, from, to, options)
722
+ end
723
+
724
+ def diff(differ_class, from, to, options={})
725
+ if from.respond_to?(:valid_encoding?) and not from.valid_encoding?
726
+ from = from.dup.force_encoding("ASCII-8BIT")
727
+ end
728
+ if to.respond_to?(:valid_encoding?) and not to.valid_encoding?
729
+ to = to.dup.force_encoding("ASCII-8BIT")
730
+ end
731
+ differ = differ_class.new(from.split(/\r?\n/), to.split(/\r?\n/))
732
+ lines = differ.diff(options)
733
+ if Object.const_defined?(:EncodingError)
734
+ begin
735
+ lines.join("\n")
736
+ rescue EncodingError
737
+ lines.collect {|line| line.force_encoding("ASCII-8BIT")}.join("\n")
738
+ end
739
+ else
740
+ lines.join("\n")
741
+ end
742
+ end
743
+ end
744
+ end
745
+ end