win32-api 1.10.0 → 1.10.1

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