win32-api 1.5.3-universal-mingw32 → 1.6.0-universal-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (358) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +174 -169
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +24 -0
  5. data/README +129 -131
  6. data/Rakefile +185 -182
  7. data/appveyor.yml +42 -0
  8. data/ext/win32/api.c +1092 -1092
  9. data/lib/win32/api.rb +14 -8
  10. data/lib/win32/ruby21_32/win32/api.so +0 -0
  11. data/lib/win32/ruby21_64/win32/api.so +0 -0
  12. data/lib/win32/ruby22_32/win32/api.so +0 -0
  13. data/lib/win32/ruby22_64/win32/api.so +0 -0
  14. data/lib/win32/ruby23_32/win32/api.so +0 -0
  15. data/lib/win32/ruby23_64/win32/api.so +0 -0
  16. data/lib/win32/ruby2_32/win32/api.so +0 -0
  17. data/lib/win32/ruby2_64/win32/api.so +0 -0
  18. data/test/test_win32_api.rb +145 -145
  19. data/vendor/bundle/ruby/2.2.0/bin/devkit +23 -0
  20. data/vendor/bundle/ruby/2.2.0/bin/devkit.bat +6 -0
  21. data/vendor/bundle/ruby/2.2.0/bin/rake +23 -0
  22. data/vendor/bundle/ruby/2.2.0/bin/rake.bat +6 -0
  23. data/vendor/bundle/ruby/2.2.0/gems/colorize-0.7.7/CHANGELOG +55 -0
  24. data/vendor/bundle/ruby/2.2.0/gems/colorize-0.7.7/LICENSE +339 -0
  25. data/vendor/bundle/ruby/2.2.0/gems/colorize-0.7.7/README.md +73 -0
  26. data/vendor/bundle/ruby/2.2.0/gems/colorize-0.7.7/Rakefile +8 -0
  27. data/vendor/bundle/ruby/2.2.0/gems/colorize-0.7.7/colorize.gemspec +35 -0
  28. data/vendor/bundle/ruby/2.2.0/gems/colorize-0.7.7/lib/colorize.rb +12 -0
  29. data/vendor/bundle/ruby/2.2.0/gems/colorize-0.7.7/lib/colorize/class_methods.rb +116 -0
  30. data/vendor/bundle/ruby/2.2.0/gems/colorize-0.7.7/lib/colorize/instance_methods.rb +135 -0
  31. data/vendor/bundle/ruby/2.2.0/gems/colorize-0.7.7/test/test_colorize.rb +161 -0
  32. data/vendor/bundle/ruby/2.2.0/gems/devkit-0.1.0/Gemfile +4 -0
  33. data/vendor/bundle/ruby/2.2.0/gems/devkit-0.1.0/LICENSE.txt +22 -0
  34. data/vendor/bundle/ruby/2.2.0/gems/devkit-0.1.0/README.md +34 -0
  35. data/vendor/bundle/ruby/2.2.0/gems/devkit-0.1.0/Rakefile +1 -0
  36. data/vendor/bundle/ruby/2.2.0/gems/devkit-0.1.0/Rspec-example-matchers.txt +184 -0
  37. data/vendor/bundle/ruby/2.2.0/gems/devkit-0.1.0/bin/devkit +87 -0
  38. data/vendor/bundle/ruby/2.2.0/gems/devkit-0.1.0/devkit.gemspec +27 -0
  39. data/vendor/bundle/ruby/2.2.0/gems/devkit-0.1.0/lib/devkit.rb +18 -0
  40. data/vendor/bundle/ruby/2.2.0/gems/devkit-0.1.0/lib/devkit/core.rb +53 -0
  41. data/vendor/bundle/ruby/2.2.0/gems/devkit-0.1.0/lib/devkit/identity.rb +78 -0
  42. data/vendor/bundle/ruby/2.2.0/gems/devkit-0.1.0/lib/devkit/ssh_identity.rb +53 -0
  43. data/vendor/bundle/ruby/2.2.0/gems/devkit-0.1.0/lib/devkit/version.rb +3 -0
  44. data/vendor/bundle/ruby/2.2.0/gems/devkit-0.1.0/spec/devkit/core_spec.rb +46 -0
  45. data/vendor/bundle/ruby/2.2.0/gems/devkit-0.1.0/spec/devkit/identity_spec.rb +1 -0
  46. data/vendor/bundle/ruby/2.2.0/gems/devkit-0.1.0/spec/devkit/ssh_identity_spec.rb +1 -0
  47. data/vendor/bundle/ruby/2.2.0/gems/devkit-0.1.0/spec/devkit_spec.rb +5 -0
  48. data/vendor/bundle/ruby/2.2.0/gems/devkit-0.1.0/spec/spec_helper.rb +8 -0
  49. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/AUTHORS +3 -0
  50. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/COPYING +339 -0
  51. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/Changelog.md +415 -0
  52. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/Gemfile +9 -0
  53. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/INSTALL +59 -0
  54. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/LICENSE +7 -0
  55. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/README.rdoc +74 -0
  56. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/Rakefile +30 -0
  57. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/TODO +6 -0
  58. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/examples/ansi_colors.rb +38 -0
  59. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/examples/asking_for_arrays.rb +18 -0
  60. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/examples/basic_usage.rb +75 -0
  61. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/examples/color_scheme.rb +32 -0
  62. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/examples/get_character.rb +12 -0
  63. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/examples/limit.rb +12 -0
  64. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/examples/menus.rb +65 -0
  65. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/examples/overwrite.rb +19 -0
  66. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/examples/page_and_wrap.rb +322 -0
  67. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/examples/password.rb +7 -0
  68. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/examples/repeat_entry.rb +21 -0
  69. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/examples/trapping_eof.rb +22 -0
  70. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/examples/using_readline.rb +17 -0
  71. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/highline.gemspec +37 -0
  72. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/lib/highline.rb +1048 -0
  73. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/lib/highline/color_scheme.rb +134 -0
  74. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/lib/highline/compatibility.rb +16 -0
  75. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/lib/highline/import.rb +41 -0
  76. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/lib/highline/menu.rb +381 -0
  77. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/lib/highline/question.rb +480 -0
  78. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/lib/highline/simulate.rb +48 -0
  79. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/lib/highline/style.rb +192 -0
  80. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/lib/highline/version.rb +4 -0
  81. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/setup.rb +1360 -0
  82. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/site/highline.css +65 -0
  83. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/site/images/logo.png +0 -0
  84. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/site/index.html +58 -0
  85. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/test/string_methods.rb +32 -0
  86. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/test/tc_color_scheme.rb +96 -0
  87. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/test/tc_highline.rb +1402 -0
  88. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/test/tc_import.rb +52 -0
  89. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/test/tc_menu.rb +439 -0
  90. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/test/tc_simulator.rb +23 -0
  91. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/test/tc_string_highline.rb +38 -0
  92. data/vendor/bundle/ruby/2.2.0/gems/highline-1.7.8/test/tc_style.rb +578 -0
  93. data/vendor/bundle/ruby/2.2.0/gems/power_assert-0.3.0/BSDL +22 -0
  94. data/vendor/bundle/ruby/2.2.0/gems/power_assert-0.3.0/COPYING +57 -0
  95. data/vendor/bundle/ruby/2.2.0/gems/power_assert-0.3.0/Gemfile +9 -0
  96. data/vendor/bundle/ruby/2.2.0/gems/power_assert-0.3.0/LEGAL +4 -0
  97. data/vendor/bundle/ruby/2.2.0/gems/power_assert-0.3.0/README.rdoc +19 -0
  98. data/vendor/bundle/ruby/2.2.0/gems/power_assert-0.3.0/Rakefile +16 -0
  99. data/vendor/bundle/ruby/2.2.0/gems/power_assert-0.3.0/benchmarks/bm_yhpg.rb +59 -0
  100. data/vendor/bundle/ruby/2.2.0/gems/power_assert-0.3.0/benchmarks/helper.rb +8 -0
  101. data/vendor/bundle/ruby/2.2.0/gems/power_assert-0.3.0/lib/power_assert.rb +338 -0
  102. data/vendor/bundle/ruby/2.2.0/gems/power_assert-0.3.0/lib/power_assert/enable_tracepoint_events.rb +82 -0
  103. data/vendor/bundle/ruby/2.2.0/gems/power_assert-0.3.0/lib/power_assert/version.rb +3 -0
  104. data/vendor/bundle/ruby/2.2.0/gems/power_assert-0.3.0/power_assert.gemspec +23 -0
  105. data/vendor/bundle/ruby/2.2.0/gems/power_assert-0.3.0/test/helper.rb +10 -0
  106. data/vendor/bundle/ruby/2.2.0/gems/power_assert-0.3.0/test/test_power_assert.rb +512 -0
  107. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/CONTRIBUTING.rdoc +38 -0
  108. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/History.rdoc +719 -0
  109. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/MIT-LICENSE +21 -0
  110. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/Manifest.txt +154 -0
  111. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/README.rdoc +157 -0
  112. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/Rakefile +82 -0
  113. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/bin/rake +33 -0
  114. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/command_line_usage.rdoc +158 -0
  115. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/example/Rakefile1 +38 -0
  116. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/example/Rakefile2 +35 -0
  117. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/example/a.c +6 -0
  118. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/example/b.c +6 -0
  119. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/example/main.c +11 -0
  120. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/glossary.rdoc +42 -0
  121. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/jamis.rb +591 -0
  122. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/proto_rake.rdoc +127 -0
  123. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/rake.1 +141 -0
  124. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/rakefile.rdoc +624 -0
  125. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/rational.rdoc +151 -0
  126. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.4.14.rdoc +23 -0
  127. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.4.15.rdoc +35 -0
  128. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.5.0.rdoc +53 -0
  129. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.5.3.rdoc +78 -0
  130. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.5.4.rdoc +46 -0
  131. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.6.0.rdoc +141 -0
  132. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.7.0.rdoc +119 -0
  133. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.7.1.rdoc +59 -0
  134. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.7.2.rdoc +121 -0
  135. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.7.3.rdoc +47 -0
  136. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.8.0.rdoc +114 -0
  137. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.8.2.rdoc +165 -0
  138. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.8.3.rdoc +112 -0
  139. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.8.4.rdoc +147 -0
  140. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.8.5.rdoc +53 -0
  141. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.8.6.rdoc +37 -0
  142. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.8.7.rdoc +55 -0
  143. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.9.0.rdoc +112 -0
  144. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.9.1.rdoc +52 -0
  145. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.9.2.2.rdoc +55 -0
  146. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.9.2.rdoc +49 -0
  147. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.9.3.rdoc +102 -0
  148. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.9.4.rdoc +60 -0
  149. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.9.5.rdoc +55 -0
  150. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-0.9.6.rdoc +64 -0
  151. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-10.0.0.rdoc +178 -0
  152. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-10.0.1.rdoc +58 -0
  153. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-10.0.2.rdoc +53 -0
  154. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-10.0.3.rdoc +191 -0
  155. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/doc/release_notes/rake-10.1.0.rdoc +61 -0
  156. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake.rb +73 -0
  157. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/application.rb +787 -0
  158. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/backtrace.rb +23 -0
  159. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/clean.rb +76 -0
  160. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/cloneable.rb +16 -0
  161. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/contrib/compositepublisher.rb +21 -0
  162. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/contrib/ftptools.rb +137 -0
  163. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/contrib/sshpublisher.rb +60 -0
  164. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/cpu_counter.rb +120 -0
  165. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/default_loader.rb +14 -0
  166. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/dsl_definition.rb +194 -0
  167. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/early_time.rb +21 -0
  168. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/file_creation_task.rb +24 -0
  169. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/file_list.rb +436 -0
  170. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/file_task.rb +46 -0
  171. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/file_utils.rb +123 -0
  172. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/invocation_chain.rb +56 -0
  173. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/invocation_exception_mixin.rb +16 -0
  174. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/late_time.rb +17 -0
  175. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/linked_list.rb +111 -0
  176. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/loaders/makefile.rb +53 -0
  177. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/multi_task.rb +13 -0
  178. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/name_space.rb +38 -0
  179. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/packagetask.rb +199 -0
  180. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/phony.rb +15 -0
  181. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/private_reader.rb +20 -0
  182. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/promise.rb +99 -0
  183. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/pseudo_status.rb +29 -0
  184. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/rake_module.rb +38 -0
  185. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/rake_test_loader.rb +22 -0
  186. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/rule_recursion_overflow_error.rb +20 -0
  187. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/scope.rb +42 -0
  188. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/task.rb +391 -0
  189. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/task_argument_error.rb +7 -0
  190. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/task_arguments.rb +102 -0
  191. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/task_manager.rb +316 -0
  192. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/tasklib.rb +11 -0
  193. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/testtask.rb +204 -0
  194. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/thread_history_display.rb +48 -0
  195. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/thread_pool.rb +163 -0
  196. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/trace_output.rb +22 -0
  197. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/version.rb +7 -0
  198. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/lib/rake/win32.rb +50 -0
  199. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/rakelib/test_times.rake +25 -0
  200. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/file_creation.rb +34 -0
  201. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/helper.rb +134 -0
  202. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/support/rakefile_definitions.rb +476 -0
  203. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/support/ruby_runner.rb +34 -0
  204. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_private_reader.rb +42 -0
  205. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake.rb +40 -0
  206. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_application.rb +659 -0
  207. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_application_options.rb +468 -0
  208. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_backtrace.rb +119 -0
  209. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_clean.rb +61 -0
  210. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_cpu_counter.rb +68 -0
  211. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_definitions.rb +84 -0
  212. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_directory_task.rb +76 -0
  213. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_dsl.rb +40 -0
  214. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_early_time.rb +31 -0
  215. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_file_creation_task.rb +56 -0
  216. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_file_list.rb +687 -0
  217. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_file_list_path_map.rb +15 -0
  218. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_file_task.rb +197 -0
  219. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_file_utils.rb +318 -0
  220. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_ftp_file.rb +74 -0
  221. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_functional.rb +484 -0
  222. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_invocation_chain.rb +64 -0
  223. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_late_time.rb +18 -0
  224. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_linked_list.rb +84 -0
  225. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_makefile_loader.rb +46 -0
  226. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_multi_task.rb +64 -0
  227. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_name_space.rb +57 -0
  228. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_package_task.rb +79 -0
  229. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_path_map.rb +168 -0
  230. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_path_map_explode.rb +34 -0
  231. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_path_map_partial.rb +18 -0
  232. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_pseudo_status.rb +21 -0
  233. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_rake_test_loader.rb +20 -0
  234. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_reduce_compat.rb +26 -0
  235. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_require.rb +40 -0
  236. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_rules.rb +388 -0
  237. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_scope.rb +44 -0
  238. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_task.rb +430 -0
  239. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_task_argument_parsing.rb +119 -0
  240. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_task_arguments.rb +134 -0
  241. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_task_manager.rb +178 -0
  242. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_task_manager_argument_resolution.rb +19 -0
  243. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_task_with_arguments.rb +172 -0
  244. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_test_task.rb +130 -0
  245. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_thread_pool.rb +145 -0
  246. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_top_level_functions.rb +71 -0
  247. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_rake_win32.rb +72 -0
  248. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_thread_history_display.rb +101 -0
  249. data/vendor/bundle/ruby/2.2.0/gems/rake-11.1.2/test/test_trace_output.rb +52 -0
  250. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/COPYING +64 -0
  251. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/GPL +339 -0
  252. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/LGPL +502 -0
  253. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/PSFL +271 -0
  254. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/README.md +101 -0
  255. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/Rakefile +71 -0
  256. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test-unit.rb +34 -0
  257. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit.rb +505 -0
  258. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/assertion-failed-error.rb +25 -0
  259. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/assertions.rb +2218 -0
  260. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/attribute-matcher.rb +26 -0
  261. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/attribute.rb +158 -0
  262. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/auto-runner-loader.rb +17 -0
  263. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/autorunner.rb +536 -0
  264. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/code-snippet-fetcher.rb +58 -0
  265. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/collector.rb +73 -0
  266. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/collector/descendant.rb +19 -0
  267. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/collector/dir.rb +108 -0
  268. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/collector/load.rb +202 -0
  269. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/collector/objectspace.rb +34 -0
  270. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/collector/xml.rb +249 -0
  271. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/color-scheme.rb +198 -0
  272. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/color.rb +134 -0
  273. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/data.rb +262 -0
  274. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/diff.rb +746 -0
  275. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/error.rb +158 -0
  276. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/exception-handler.rb +82 -0
  277. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/failure.rb +169 -0
  278. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/fault-location-detector.rb +100 -0
  279. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/fixture.rb +295 -0
  280. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/notification.rb +136 -0
  281. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/omission.rb +195 -0
  282. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/pending.rb +154 -0
  283. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/priority.rb +192 -0
  284. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/runner/console.rb +59 -0
  285. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/runner/emacs.rb +8 -0
  286. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/runner/xml.rb +15 -0
  287. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/test-suite-creator.rb +89 -0
  288. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/testcase.rb +811 -0
  289. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/testresult.rb +132 -0
  290. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/testsuite.rb +175 -0
  291. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/ui/console/outputlevel.rb +15 -0
  292. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/ui/console/testrunner.rb +693 -0
  293. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/ui/emacs/testrunner.rb +49 -0
  294. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/ui/testrunner.rb +53 -0
  295. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/ui/testrunnermediator.rb +114 -0
  296. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/ui/testrunnerutilities.rb +41 -0
  297. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/ui/xml/testrunner.rb +224 -0
  298. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/util/backtracefilter.rb +59 -0
  299. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/util/method-owner-finder.rb +28 -0
  300. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/util/observable.rb +90 -0
  301. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/util/output.rb +31 -0
  302. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/util/procwrapper.rb +48 -0
  303. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/lib/test/unit/version.rb +5 -0
  304. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/sample/adder.rb +13 -0
  305. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/sample/subtracter.rb +12 -0
  306. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/sample/test_adder.rb +20 -0
  307. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/sample/test_subtracter.rb +20 -0
  308. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/sample/test_user.rb +23 -0
  309. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/collector/test-descendant.rb +178 -0
  310. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/collector/test-load.rb +442 -0
  311. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/collector/test_dir.rb +406 -0
  312. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/collector/test_objectspace.rb +100 -0
  313. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/fixtures/header-label.csv +3 -0
  314. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/fixtures/header-label.tsv +3 -0
  315. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/fixtures/header.csv +3 -0
  316. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/fixtures/header.tsv +3 -0
  317. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/fixtures/no-header.csv +2 -0
  318. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/fixtures/no-header.tsv +2 -0
  319. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/fixtures/plus.csv +3 -0
  320. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/run-test.rb +22 -0
  321. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/test-assertions.rb +2160 -0
  322. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/test-attribute-matcher.rb +38 -0
  323. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/test-attribute.rb +123 -0
  324. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/test-code-snippet.rb +37 -0
  325. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/test-color-scheme.rb +82 -0
  326. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/test-color.rb +47 -0
  327. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/test-data.rb +303 -0
  328. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/test-diff.rb +518 -0
  329. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/test-emacs-runner.rb +60 -0
  330. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/test-error.rb +26 -0
  331. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/test-failure.rb +33 -0
  332. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/test-fault-location-detector.rb +163 -0
  333. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/test-fixture.rb +713 -0
  334. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/test-notification.rb +33 -0
  335. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/test-omission.rb +81 -0
  336. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/test-pending.rb +70 -0
  337. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/test-priority.rb +173 -0
  338. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/test-test-case.rb +1171 -0
  339. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/test-test-result.rb +113 -0
  340. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/test-test-suite-creator.rb +97 -0
  341. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/test-test-suite.rb +150 -0
  342. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/testunit-test-util.rb +31 -0
  343. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/ui/test_testrunmediator.rb +20 -0
  344. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/util/test-method-owner-finder.rb +38 -0
  345. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/util/test-output.rb +11 -0
  346. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/util/test_backtracefilter.rb +52 -0
  347. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/util/test_observable.rb +102 -0
  348. data/vendor/bundle/ruby/2.2.0/gems/test-unit-3.1.9/test/util/test_procwrapper.rb +36 -0
  349. data/vendor/bundle/ruby/2.2.0/specifications/colorize-0.7.7.gemspec +38 -0
  350. data/vendor/bundle/ruby/2.2.0/specifications/devkit-0.1.0.gemspec +46 -0
  351. data/vendor/bundle/ruby/2.2.0/specifications/highline-1.7.8.gemspec +37 -0
  352. data/vendor/bundle/ruby/2.2.0/specifications/power_assert-0.3.0.gemspec +41 -0
  353. data/vendor/bundle/ruby/2.2.0/specifications/rake-11.1.2.gemspec +43 -0
  354. data/vendor/bundle/ruby/2.2.0/specifications/test-unit-3.1.9.gemspec +47 -0
  355. data/win32-api.gemspec +27 -27
  356. metadata +345 -5
  357. data/lib/win32/ruby18/win32/api.so +0 -0
  358. data/lib/win32/ruby19/win32/api.so +0 -0
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "rubygems"
4
+ require "highline/import"
5
+
6
+ pass = ask("Enter your password: ") { |q| q.echo = false }
7
+ puts "Your password is #{pass}!"
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "rubygems"
4
+ require "highline/import"
5
+
6
+ tounge_twister = ask("... try saying that three times fast") do |q|
7
+ q.gather = 3
8
+ q.verify_match = true
9
+ q.responses[:mismatch] = "Nope, those don't match. Try again."
10
+ end
11
+
12
+ puts "Ok, you did it."
13
+
14
+ pass = ask("<%= @key %>: ") do |q|
15
+ q.echo = '*'
16
+ q.verify_match = true
17
+ q.gather = {"Enter a password" => '',
18
+ "Please type it again for verification" => ''}
19
+ end
20
+
21
+ puts "Your password is now #{pass}!"
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # trapping_eof.rb
4
+ #
5
+ # Created by James Edward Gray II on 2006-02-20.
6
+ # Copyright 2006 Gray Productions. All rights reserved.
7
+
8
+ require "rubygems"
9
+ require "highline/import"
10
+
11
+ loop do
12
+ begin
13
+ name = ask("What's your name?")
14
+ break if name == "exit"
15
+ puts "Hello, #{name}!"
16
+ rescue EOFError # HighLine throws this if @input.eof?
17
+ break
18
+ end
19
+ end
20
+
21
+ puts "Goodbye, dear friend."
22
+ exit
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # using_readline.rb
4
+ #
5
+ # Created by James Edward Gray II on 2005-07-06.
6
+ # Copyright 2005 Gray Productions. All rights reserved.
7
+
8
+ require "rubygems"
9
+ require "highline/import"
10
+
11
+ loop do
12
+ cmd = ask("Enter command: ", %w{save sample load reset quit}) do |q|
13
+ q.readline = true
14
+ end
15
+ say("Executing \"#{cmd}\"...")
16
+ break if cmd == "quit"
17
+ end
@@ -0,0 +1,37 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'highline/version'
5
+
6
+ GEM_VERSION = HighLine::VERSION
7
+
8
+ SPEC = Gem::Specification.new do |spec|
9
+ spec.name = "highline"
10
+ spec.version = GEM_VERSION
11
+ spec.platform = Gem::Platform::RUBY
12
+ spec.summary = "HighLine is a high-level command-line IO library."
13
+ spec.files = `git ls-files`.split("\n")
14
+
15
+ spec.test_files = `git ls-files -- test/*.rb`.split("\n")
16
+ spec.has_rdoc = true
17
+ spec.extra_rdoc_files = %w[README.rdoc INSTALL TODO Changelog.md LICENSE]
18
+ spec.rdoc_options << '--title' << 'HighLine Documentation' <<
19
+ '--main' << 'README'
20
+
21
+ spec.require_path = 'lib'
22
+
23
+ spec.author = "James Edward Gray II"
24
+ spec.email = "james@graysoftinc.com"
25
+ spec.rubyforge_project = "highline"
26
+ spec.homepage = "https://github.com/JEG2/highline"
27
+ spec.license = "Ruby"
28
+ spec.description = <<END_DESC
29
+ A high-level IO library that provides validation, type conversion, and more for
30
+ command-line interfaces. HighLine also includes a complete menu system that can
31
+ crank out anything from simple list selection to complete shells with just
32
+ minutes of work.
33
+ END_DESC
34
+
35
+ spec.add_development_dependency "code_statistics"
36
+ spec.required_ruby_version = '>= 1.9.3'
37
+ end
@@ -0,0 +1,1048 @@
1
+ # coding: utf-8
2
+ # highline.rb
3
+ #
4
+ # Created by James Edward Gray II on 2005-04-26.
5
+ # Copyright 2005 Gray Productions. All rights reserved.
6
+ #
7
+ # See HighLine for documentation.
8
+ #
9
+ # This is Free Software. See LICENSE and COPYING for details.
10
+
11
+ require "erb"
12
+ require "optparse"
13
+ require "stringio"
14
+ require "abbrev"
15
+ require "highline/system_extensions"
16
+ require "highline/question"
17
+ require "highline/menu"
18
+ require "highline/color_scheme"
19
+ require "highline/style"
20
+ require "highline/version"
21
+
22
+ #
23
+ # A HighLine object is a "high-level line oriented" shell over an input and an
24
+ # output stream. HighLine simplifies common console interaction, effectively
25
+ # replacing puts() and gets(). User code can simply specify the question to ask
26
+ # and any details about user interaction, then leave the rest of the work to
27
+ # HighLine. When HighLine.ask() returns, you'll have the answer you requested,
28
+ # even if HighLine had to ask many times, validate results, perform range
29
+ # checking, convert types, etc.
30
+ #
31
+ class HighLine
32
+ # An internal HighLine error. User code does not need to trap this.
33
+ class QuestionError < StandardError
34
+ # do nothing, just creating a unique error type
35
+ end
36
+
37
+ # The setting used to disable color output.
38
+ @@use_color = true
39
+
40
+ # Pass +false+ to _setting_ to turn off HighLine's color escapes.
41
+ def self.use_color=( setting )
42
+ @@use_color = setting
43
+ end
44
+
45
+ # Returns true if HighLine is currently using color escapes.
46
+ def self.use_color?
47
+ @@use_color
48
+ end
49
+
50
+ # For checking if the current version of HighLine supports RGB colors
51
+ # Usage: HighLine.supports_rgb_color? rescue false # rescue for compatibility with older versions
52
+ # Note: color usage also depends on HighLine.use_color being set
53
+ def self.supports_rgb_color?
54
+ true
55
+ end
56
+
57
+ # The setting used to disable EOF tracking.
58
+ @@track_eof = true
59
+
60
+ # Pass +false+ to _setting_ to turn off HighLine's EOF tracking.
61
+ def self.track_eof=( setting )
62
+ @@track_eof = setting
63
+ end
64
+
65
+ # Returns true if HighLine is currently tracking EOF for input.
66
+ def self.track_eof?
67
+ @@track_eof
68
+ end
69
+
70
+ # The setting used to control color schemes.
71
+ @@color_scheme = nil
72
+
73
+ # Pass ColorScheme to _setting_ to set a HighLine color scheme.
74
+ def self.color_scheme=( setting )
75
+ @@color_scheme = setting
76
+ end
77
+
78
+ # Returns the current color scheme.
79
+ def self.color_scheme
80
+ @@color_scheme
81
+ end
82
+
83
+ # Returns +true+ if HighLine is currently using a color scheme.
84
+ def self.using_color_scheme?
85
+ not @@color_scheme.nil?
86
+ end
87
+
88
+ #
89
+ # Embed in a String to clear all previous ANSI sequences. This *MUST* be
90
+ # done before the program exits!
91
+ #
92
+
93
+ ERASE_LINE_STYLE = Style.new(:name=>:erase_line, :builtin=>true, :code=>"\e[K") # Erase the current line of terminal output
94
+ ERASE_CHAR_STYLE = Style.new(:name=>:erase_char, :builtin=>true, :code=>"\e[P") # Erase the character under the cursor.
95
+ CLEAR_STYLE = Style.new(:name=>:clear, :builtin=>true, :code=>"\e[0m") # Clear color settings
96
+ RESET_STYLE = Style.new(:name=>:reset, :builtin=>true, :code=>"\e[0m") # Alias for CLEAR.
97
+ BOLD_STYLE = Style.new(:name=>:bold, :builtin=>true, :code=>"\e[1m") # Bold; Note: bold + a color works as you'd expect,
98
+ # for example bold black. Bold without a color displays
99
+ # the system-defined bold color (e.g. red on Mac iTerm)
100
+ DARK_STYLE = Style.new(:name=>:dark, :builtin=>true, :code=>"\e[2m") # Dark; support uncommon
101
+ UNDERLINE_STYLE = Style.new(:name=>:underline, :builtin=>true, :code=>"\e[4m") # Underline
102
+ UNDERSCORE_STYLE = Style.new(:name=>:underscore, :builtin=>true, :code=>"\e[4m") # Alias for UNDERLINE
103
+ BLINK_STYLE = Style.new(:name=>:blink, :builtin=>true, :code=>"\e[5m") # Blink; support uncommon
104
+ REVERSE_STYLE = Style.new(:name=>:reverse, :builtin=>true, :code=>"\e[7m") # Reverse foreground and background
105
+ CONCEALED_STYLE = Style.new(:name=>:concealed, :builtin=>true, :code=>"\e[8m") # Concealed; support uncommon
106
+
107
+ STYLES = %w{CLEAR RESET BOLD DARK UNDERLINE UNDERSCORE BLINK REVERSE CONCEALED}
108
+
109
+ # These RGB colors are approximate; see http://en.wikipedia.org/wiki/ANSI_escape_code
110
+ BLACK_STYLE = Style.new(:name=>:black, :builtin=>true, :code=>"\e[30m", :rgb=>[ 0, 0, 0])
111
+ RED_STYLE = Style.new(:name=>:red, :builtin=>true, :code=>"\e[31m", :rgb=>[128, 0, 0])
112
+ GREEN_STYLE = Style.new(:name=>:green, :builtin=>true, :code=>"\e[32m", :rgb=>[ 0,128, 0])
113
+ BLUE_STYLE = Style.new(:name=>:blue, :builtin=>true, :code=>"\e[34m", :rgb=>[ 0, 0,128])
114
+ YELLOW_STYLE = Style.new(:name=>:yellow, :builtin=>true, :code=>"\e[33m", :rgb=>[128,128, 0])
115
+ MAGENTA_STYLE = Style.new(:name=>:magenta, :builtin=>true, :code=>"\e[35m", :rgb=>[128, 0,128])
116
+ CYAN_STYLE = Style.new(:name=>:cyan, :builtin=>true, :code=>"\e[36m", :rgb=>[ 0,128,128])
117
+ # On Mac OSX Terminal, white is actually gray
118
+ WHITE_STYLE = Style.new(:name=>:white, :builtin=>true, :code=>"\e[37m", :rgb=>[192,192,192])
119
+ # Alias for WHITE, since WHITE is actually a light gray on Macs
120
+ GRAY_STYLE = Style.new(:name=>:gray, :builtin=>true, :code=>"\e[37m", :rgb=>[192,192,192])
121
+ GREY_STYLE = Style.new(:name=>:grey, :builtin=>true, :code=>"\e[37m", :rgb=>[192,192,192])
122
+ # On Mac OSX Terminal, this is black foreground, or bright white background.
123
+ # Also used as base for RGB colors, if available
124
+ NONE_STYLE = Style.new(:name=>:none, :builtin=>true, :code=>"\e[38m", :rgb=>[ 0, 0, 0])
125
+
126
+ BASIC_COLORS = %w{BLACK RED GREEN YELLOW BLUE MAGENTA CYAN WHITE GRAY GREY NONE}
127
+
128
+ colors = BASIC_COLORS.dup
129
+ BASIC_COLORS.each do |color|
130
+ bright_color = "BRIGHT_#{color}"
131
+ colors << bright_color
132
+ const_set bright_color+'_STYLE', const_get(color + '_STYLE').bright
133
+
134
+ light_color = "LIGHT_#{color}"
135
+ colors << light_color
136
+ const_set light_color+'_STYLE', const_get(color + '_STYLE').light
137
+ end
138
+ COLORS = colors
139
+
140
+ colors.each do |color|
141
+ const_set color, const_get("#{color}_STYLE").code
142
+ const_set "ON_#{color}_STYLE", const_get("#{color}_STYLE").on
143
+ const_set "ON_#{color}", const_get("ON_#{color}_STYLE").code
144
+ end
145
+ ON_NONE_STYLE.rgb = [255,255,255] # Override; white background
146
+
147
+ STYLES.each do |style|
148
+ const_set style, const_get("#{style}_STYLE").code
149
+ end
150
+
151
+ # For RGB colors:
152
+ def self.const_missing(name)
153
+ if name.to_s =~ /^(ON_)?(RGB_)([A-F0-9]{6})(_STYLE)?$/ # RGB color
154
+ on = $1
155
+ suffix = $4
156
+ if suffix
157
+ code_name = $1.to_s + $2 + $3
158
+ else
159
+ code_name = name.to_s
160
+ end
161
+ style_name = code_name + '_STYLE'
162
+ style = Style.rgb($3)
163
+ style = style.on if on
164
+ const_set(style_name, style)
165
+ const_set(code_name, style.code)
166
+ if suffix
167
+ style
168
+ else
169
+ style.code
170
+ end
171
+ else
172
+ raise NameError, "Bad color or uninitialized constant #{name}"
173
+ end
174
+ end
175
+
176
+ #
177
+ # Create an instance of HighLine, connected to the streams _input_
178
+ # and _output_.
179
+ #
180
+ def initialize( input = $stdin, output = $stdout,
181
+ wrap_at = nil, page_at = nil, indent_size=3, indent_level=0 )
182
+ @input = input
183
+ @output = output
184
+
185
+ @multi_indent = true
186
+ @indent_size = indent_size
187
+ @indent_level = indent_level
188
+
189
+ self.wrap_at = wrap_at
190
+ self.page_at = page_at
191
+
192
+ @question = nil
193
+ @answer = nil
194
+ @menu = nil
195
+ @header = nil
196
+ @prompt = nil
197
+ @gather = nil
198
+ @answers = nil
199
+ @key = nil
200
+
201
+ initialize_system_extensions if respond_to?(:initialize_system_extensions)
202
+ end
203
+
204
+ include HighLine::SystemExtensions
205
+
206
+ # The current column setting for wrapping output.
207
+ attr_reader :wrap_at
208
+ # The current row setting for paging output.
209
+ attr_reader :page_at
210
+ # Indentation over multiple lines
211
+ attr_accessor :multi_indent
212
+ # The indentation size
213
+ attr_accessor :indent_size
214
+ # The indentation level
215
+ attr_accessor :indent_level
216
+
217
+ #
218
+ # A shortcut to HighLine.ask() a question that only accepts "yes" or "no"
219
+ # answers ("y" and "n" are allowed) and returns +true+ or +false+
220
+ # (+true+ for "yes"). If provided a +true+ value, _character_ will cause
221
+ # HighLine to fetch a single character response. A block can be provided
222
+ # to further configure the question as in HighLine.ask()
223
+ #
224
+ # Raises EOFError if input is exhausted.
225
+ #
226
+ def agree( yes_or_no_question, character = nil )
227
+ ask(yes_or_no_question, lambda { |yn| yn.downcase[0] == ?y}) do |q|
228
+ q.validate = /\Ay(?:es)?|no?\Z/i
229
+ q.responses[:not_valid] = 'Please enter "yes" or "no".'
230
+ q.responses[:ask_on_error] = :question
231
+ q.character = character
232
+
233
+ yield q if block_given?
234
+ end
235
+ end
236
+
237
+ #
238
+ # This method is the primary interface for user input. Just provide a
239
+ # _question_ to ask the user, the _answer_type_ you want returned, and
240
+ # optionally a code block setting up details of how you want the question
241
+ # handled. See HighLine.say() for details on the format of _question_, and
242
+ # HighLine::Question for more information about _answer_type_ and what's
243
+ # valid in the code block.
244
+ #
245
+ # If <tt>@question</tt> is set before ask() is called, parameters are
246
+ # ignored and that object (must be a HighLine::Question) is used to drive
247
+ # the process instead.
248
+ #
249
+ # Raises EOFError if input is exhausted.
250
+ #
251
+ def ask( question, answer_type = nil, &details ) # :yields: question
252
+ @question ||= Question.new(question, answer_type, &details)
253
+
254
+ return gather if @question.gather
255
+
256
+ # readline() needs to handle its own output, but readline only supports
257
+ # full line reading. Therefore if @question.echo is anything but true,
258
+ # the prompt will not be issued. And we have to account for that now.
259
+ # Also, JRuby-1.7's ConsoleReader.readLine() needs to be passed the prompt
260
+ # to handle line editing properly.
261
+ say(@question) unless ((JRUBY or @question.readline) and (@question.echo == true and @question.limit.nil?))
262
+
263
+ begin
264
+ @answer = @question.answer_or_default(get_response)
265
+ unless @question.valid_answer?(@answer)
266
+ explain_error(:not_valid)
267
+ raise QuestionError
268
+ end
269
+
270
+ @answer = @question.convert(@answer)
271
+
272
+ if @question.in_range?(@answer)
273
+ if @question.confirm
274
+ # need to add a layer of scope to ask a question inside a
275
+ # question, without destroying instance data
276
+ context_change = self.class.new(@input, @output, @wrap_at, @page_at, @indent_size, @indent_level)
277
+ if @question.confirm == true
278
+ confirm_question = "Are you sure? "
279
+ else
280
+ # evaluate ERb under initial scope, so it will have
281
+ # access to @question and @answer
282
+ template = ERB.new(@question.confirm, nil, "%")
283
+ confirm_question = template.result(binding)
284
+ end
285
+ unless context_change.agree(confirm_question)
286
+ explain_error(nil)
287
+ raise QuestionError
288
+ end
289
+ end
290
+
291
+ @answer
292
+ else
293
+ explain_error(:not_in_range)
294
+ raise QuestionError
295
+ end
296
+ rescue QuestionError
297
+ retry
298
+ rescue ArgumentError, NameError => error
299
+ raise if error.is_a?(NoMethodError)
300
+ if error.message =~ /ambiguous/
301
+ # the assumption here is that OptionParser::Completion#complete
302
+ # (used for ambiguity resolution) throws exceptions containing
303
+ # the word 'ambiguous' whenever resolution fails
304
+ explain_error(:ambiguous_completion)
305
+ else
306
+ explain_error(:invalid_type)
307
+ end
308
+ retry
309
+ rescue Question::NoAutoCompleteMatch
310
+ explain_error(:no_completion)
311
+ retry
312
+ ensure
313
+ @question = nil # Reset Question object.
314
+ end
315
+ end
316
+
317
+ #
318
+ # This method is HighLine's menu handler. For simple usage, you can just
319
+ # pass all the menu items you wish to display. At that point, choose() will
320
+ # build and display a menu, walk the user through selection, and return
321
+ # their choice among the provided items. You might use this in a case
322
+ # statement for quick and dirty menus.
323
+ #
324
+ # However, choose() is capable of much more. If provided, a block will be
325
+ # passed a HighLine::Menu object to configure. Using this method, you can
326
+ # customize all the details of menu handling from index display, to building
327
+ # a complete shell-like menuing system. See HighLine::Menu for all the
328
+ # methods it responds to.
329
+ #
330
+ # Raises EOFError if input is exhausted.
331
+ #
332
+ def choose( *items, &details )
333
+ @menu = @question = Menu.new(&details)
334
+ @menu.choices(*items) unless items.empty?
335
+
336
+ # Set auto-completion
337
+ @menu.completion = @menu.options
338
+ # Set _answer_type_ so we can double as the Question for ask().
339
+ @menu.answer_type = if @menu.shell
340
+ lambda do |command| # shell-style selection
341
+ first_word = command.to_s.split.first || ""
342
+
343
+ options = @menu.options
344
+ options.extend(OptionParser::Completion)
345
+ answer = options.complete(first_word)
346
+
347
+ if answer.nil?
348
+ raise Question::NoAutoCompleteMatch
349
+ end
350
+
351
+ [answer.last, command.sub(/^\s*#{first_word}\s*/, "")]
352
+ end
353
+ else
354
+ @menu.options # normal menu selection, by index or name
355
+ end
356
+
357
+ # Provide hooks for ERb layouts.
358
+ @header = @menu.header
359
+ @prompt = @menu.prompt
360
+
361
+ if @menu.shell
362
+ selected = ask("Ignored", @menu.answer_type)
363
+ @menu.select(self, *selected)
364
+ else
365
+ selected = ask("Ignored", @menu.answer_type)
366
+ @menu.select(self, selected)
367
+ end
368
+ end
369
+
370
+ #
371
+ # This method provides easy access to ANSI color sequences, without the user
372
+ # needing to remember to CLEAR at the end of each sequence. Just pass the
373
+ # _string_ to color, followed by a list of _colors_ you would like it to be
374
+ # affected by. The _colors_ can be HighLine class constants, or symbols
375
+ # (:blue for BLUE, for example). A CLEAR will automatically be embedded to
376
+ # the end of the returned String.
377
+ #
378
+ # This method returns the original _string_ unchanged if HighLine::use_color?
379
+ # is +false+.
380
+ #
381
+ def self.color( string, *colors )
382
+ return string unless self.use_color?
383
+ Style(*colors).color(string)
384
+ end
385
+
386
+ # In case you just want the color code, without the embedding and the CLEAR
387
+ def self.color_code(*colors)
388
+ Style(*colors).code
389
+ end
390
+
391
+ # Works as an instance method, same as the class method
392
+ def color_code(*colors)
393
+ self.class.color_code(*colors)
394
+ end
395
+
396
+ # Works as an instance method, same as the class method
397
+ def color(*args)
398
+ self.class.color(*args)
399
+ end
400
+
401
+ # Remove color codes from a string
402
+ def self.uncolor(string)
403
+ Style.uncolor(string)
404
+ end
405
+
406
+ # Works as an instance method, same as the class method
407
+ def uncolor(string)
408
+ self.class.uncolor(string)
409
+ end
410
+
411
+ #
412
+ # This method is a utility for quickly and easily laying out lists. It can
413
+ # be accessed within ERb replacements of any text that will be sent to the
414
+ # user.
415
+ #
416
+ # The only required parameter is _items_, which should be the Array of items
417
+ # to list. A specified _mode_ controls how that list is formed and _option_
418
+ # has different effects, depending on the _mode_. Recognized modes are:
419
+ #
420
+ # <tt>:columns_across</tt>:: _items_ will be placed in columns,
421
+ # flowing from left to right. If given,
422
+ # _option_ is the number of columns to be
423
+ # used. When absent, columns will be
424
+ # determined based on _wrap_at_ or a
425
+ # default of 80 characters.
426
+ # <tt>:columns_down</tt>:: Identical to <tt>:columns_across</tt>,
427
+ # save flow goes down.
428
+ # <tt>:uneven_columns_across</tt>:: Like <tt>:columns_across</tt> but each
429
+ # column is sized independently.
430
+ # <tt>:uneven_columns_down</tt>:: Like <tt>:columns_down</tt> but each
431
+ # column is sized independently.
432
+ # <tt>:inline</tt>:: All _items_ are placed on a single line.
433
+ # The last two _items_ are separated by
434
+ # _option_ or a default of " or ". All
435
+ # other _items_ are separated by ", ".
436
+ # <tt>:rows</tt>:: The default mode. Each of the _items_ is
437
+ # placed on its own line. The _option_
438
+ # parameter is ignored in this mode.
439
+ #
440
+ # Each member of the _items_ Array is passed through ERb and thus can contain
441
+ # their own expansions. Color escape expansions do not contribute to the
442
+ # final field width.
443
+ #
444
+ def list( items, mode = :rows, option = nil )
445
+ items = items.to_ary.map do |item|
446
+ if item.nil?
447
+ ""
448
+ else
449
+ ERB.new(item, nil, "%").result(binding)
450
+ end
451
+ end
452
+
453
+ if items.empty?
454
+ ""
455
+ else
456
+ case mode
457
+ when :inline
458
+ option = " or " if option.nil?
459
+
460
+ if items.size == 1
461
+ items.first
462
+ else
463
+ items[0..-2].join(", ") + "#{option}#{items.last}"
464
+ end
465
+ when :columns_across, :columns_down
466
+ max_length = actual_length(
467
+ items.max { |a, b| actual_length(a) <=> actual_length(b) }
468
+ )
469
+
470
+ if option.nil?
471
+ limit = @wrap_at || 80
472
+ option = (limit + 2) / (max_length + 2)
473
+ end
474
+
475
+ items = items.map do |item|
476
+ pad = max_length + (item.to_s.length - actual_length(item))
477
+ "%-#{pad}s" % item
478
+ end
479
+ row_count = (items.size / option.to_f).ceil
480
+
481
+ if mode == :columns_across
482
+ rows = Array.new(row_count) { Array.new }
483
+ items.each_with_index do |item, index|
484
+ rows[index / option] << item
485
+ end
486
+
487
+ rows.map { |row| row.join(" ") + "\n" }.join
488
+ else
489
+ columns = Array.new(option) { Array.new }
490
+ items.each_with_index do |item, index|
491
+ columns[index / row_count] << item
492
+ end
493
+
494
+ list = ""
495
+ columns.first.size.times do |index|
496
+ list << columns.map { |column| column[index] }.
497
+ compact.join(" ") + "\n"
498
+ end
499
+ list
500
+ end
501
+ when :uneven_columns_across
502
+ if option.nil?
503
+ limit = @wrap_at || 80
504
+ items.size.downto(1) do |column_count|
505
+ row_count = (items.size / column_count.to_f).ceil
506
+ rows = Array.new(row_count) { Array.new }
507
+ items.each_with_index do |item, index|
508
+ rows[index / column_count] << item
509
+ end
510
+
511
+ widths = Array.new(column_count, 0)
512
+ rows.each do |row|
513
+ row.each_with_index do |field, column|
514
+ size = actual_length(field)
515
+ widths[column] = size if size > widths[column]
516
+ end
517
+ end
518
+
519
+ if column_count == 1 or
520
+ widths.inject(0) { |sum, n| sum + n + 2 } <= limit + 2
521
+ return rows.map { |row|
522
+ row.zip(widths).map { |field, i|
523
+ "%-#{i + (field.to_s.length - actual_length(field))}s" % field
524
+ }.join(" ") + "\n"
525
+ }.join
526
+ end
527
+ end
528
+ else
529
+ row_count = (items.size / option.to_f).ceil
530
+ rows = Array.new(row_count) { Array.new }
531
+ items.each_with_index do |item, index|
532
+ rows[index / option] << item
533
+ end
534
+
535
+ widths = Array.new(option, 0)
536
+ rows.each do |row|
537
+ row.each_with_index do |field, column|
538
+ size = actual_length(field)
539
+ widths[column] = size if size > widths[column]
540
+ end
541
+ end
542
+
543
+ return rows.map { |row|
544
+ row.zip(widths).map { |field, i|
545
+ "%-#{i + (field.to_s.length - actual_length(field))}s" % field
546
+ }.join(" ") + "\n"
547
+ }.join
548
+ end
549
+ when :uneven_columns_down
550
+ if option.nil?
551
+ limit = @wrap_at || 80
552
+ items.size.downto(1) do |column_count|
553
+ row_count = (items.size / column_count.to_f).ceil
554
+ columns = Array.new(column_count) { Array.new }
555
+ items.each_with_index do |item, index|
556
+ columns[index / row_count] << item
557
+ end
558
+
559
+ widths = Array.new(column_count, 0)
560
+ columns.each_with_index do |column, i|
561
+ column.each do |field|
562
+ size = actual_length(field)
563
+ widths[i] = size if size > widths[i]
564
+ end
565
+ end
566
+
567
+ if column_count == 1 or
568
+ widths.inject(0) { |sum, n| sum + n + 2 } <= limit + 2
569
+ list = ""
570
+ columns.first.size.times do |index|
571
+ list << columns.zip(widths).map { |column, width|
572
+ field = column[index]
573
+ "%-#{width + (field.to_s.length - actual_length(field))}s" %
574
+ field
575
+ }.compact.join(" ").strip + "\n"
576
+ end
577
+ return list
578
+ end
579
+ end
580
+ else
581
+ row_count = (items.size / option.to_f).ceil
582
+ columns = Array.new(option) { Array.new }
583
+ items.each_with_index do |item, index|
584
+ columns[index / row_count] << item
585
+ end
586
+
587
+ widths = Array.new(option, 0)
588
+ columns.each_with_index do |column, i|
589
+ column.each do |field|
590
+ size = actual_length(field)
591
+ widths[i] = size if size > widths[i]
592
+ end
593
+ end
594
+
595
+ list = ""
596
+ columns.first.size.times do |index|
597
+ list << columns.zip(widths).map { |column, width|
598
+ field = column[index]
599
+ "%-#{width + (field.to_s.length - actual_length(field))}s" % field
600
+ }.compact.join(" ").strip + "\n"
601
+ end
602
+ return list
603
+ end
604
+ else
605
+ items.map { |i| "#{i}\n" }.join
606
+ end
607
+ end
608
+ end
609
+
610
+ #
611
+ # The basic output method for HighLine objects. If the provided _statement_
612
+ # ends with a space or tab character, a newline will not be appended (output
613
+ # will be flush()ed). All other cases are passed straight to Kernel.puts().
614
+ #
615
+ # The _statement_ parameter is processed as an ERb template, supporting
616
+ # embedded Ruby code. The template is evaluated with a binding inside
617
+ # the HighLine instance, providing easy access to the ANSI color constants
618
+ # and the HighLine.color() method.
619
+ #
620
+ def say( statement )
621
+ statement = format_statement(statement)
622
+ return unless statement.length > 0
623
+
624
+ out = (indentation+statement).encode(Encoding.default_external, { :undef => :replace } )
625
+
626
+ # Don't add a newline if statement ends with whitespace, OR
627
+ # if statement ends with whitespace before a color escape code.
628
+ if /[ \t](\e\[\d+(;\d+)*m)?\Z/ =~ statement
629
+ @output.print(out)
630
+ @output.flush
631
+ else
632
+ @output.puts(out)
633
+ end
634
+ end
635
+
636
+ #
637
+ # Set to an integer value to cause HighLine to wrap output lines at the
638
+ # indicated character limit. When +nil+, the default, no wrapping occurs. If
639
+ # set to <tt>:auto</tt>, HighLine will attempt to determine the columns
640
+ # available for the <tt>@output</tt> or use a sensible default.
641
+ #
642
+ def wrap_at=( setting )
643
+ @wrap_at = setting == :auto ? output_cols : setting
644
+ end
645
+
646
+ #
647
+ # Set to an integer value to cause HighLine to page output lines over the
648
+ # indicated line limit. When +nil+, the default, no paging occurs. If
649
+ # set to <tt>:auto</tt>, HighLine will attempt to determine the rows available
650
+ # for the <tt>@output</tt> or use a sensible default.
651
+ #
652
+ def page_at=( setting )
653
+ @page_at = setting == :auto ? output_rows - 2 : setting
654
+ end
655
+
656
+ #
657
+ # Outputs indentation with current settings
658
+ #
659
+ def indentation
660
+ return ' '*@indent_size*@indent_level
661
+ end
662
+
663
+ #
664
+ # Executes block or outputs statement with indentation
665
+ #
666
+ def indent(increase=1, statement=nil, multiline=nil)
667
+ @indent_level += increase
668
+ multi = @multi_indent
669
+ @multi_indent = multiline unless multiline.nil?
670
+ begin
671
+ if block_given?
672
+ yield self
673
+ else
674
+ say(statement)
675
+ end
676
+ rescue
677
+ @multi_indent = multi
678
+ @indent_level -= increase
679
+ raise
680
+ end
681
+ @multi_indent = multi
682
+ @indent_level -= increase
683
+ end
684
+
685
+ #
686
+ # Outputs newline
687
+ #
688
+ def newline
689
+ @output.puts
690
+ end
691
+
692
+ #
693
+ # Returns the number of columns for the console, or a default it they cannot
694
+ # be determined.
695
+ #
696
+ def output_cols
697
+ return 80 unless @output.tty?
698
+ terminal_size.first
699
+ rescue
700
+ return 80
701
+ end
702
+
703
+ #
704
+ # Returns the number of rows for the console, or a default if they cannot be
705
+ # determined.
706
+ #
707
+ def output_rows
708
+ return 24 unless @output.tty?
709
+ terminal_size.last
710
+ rescue
711
+ return 24
712
+ end
713
+
714
+ private
715
+
716
+ def format_statement statement
717
+ statement = String(statement || "").dup
718
+ return statement unless statement.length > 0
719
+
720
+ template = ERB.new(statement, nil, "%")
721
+ statement = template.result(binding)
722
+
723
+ statement = wrap(statement) unless @wrap_at.nil?
724
+ statement = page_print(statement) unless @page_at.nil?
725
+
726
+ # 'statement' is encoded in US-ASCII when using ruby 1.9.3(-p551)
727
+ # 'indentation' is correctly encoded (same as default_external encoding)
728
+ statement = statement.force_encoding(Encoding.default_external)
729
+
730
+ statement = statement.gsub(/\n(?!$)/,"\n#{indentation}") if @multi_indent
731
+
732
+ statement
733
+ end
734
+
735
+ #
736
+ # A helper method for sending the output stream and error and repeat
737
+ # of the question.
738
+ #
739
+ def explain_error( error )
740
+ say(@question.responses[error]) unless error.nil?
741
+ if @question.responses[:ask_on_error] == :question
742
+ say(@question)
743
+ elsif @question.responses[:ask_on_error]
744
+ say(@question.responses[:ask_on_error])
745
+ end
746
+ end
747
+
748
+ #
749
+ # Collects an Array/Hash full of answers as described in
750
+ # HighLine::Question.gather().
751
+ #
752
+ # Raises EOFError if input is exhausted.
753
+ #
754
+ def gather( )
755
+ original_question = @question
756
+ original_question_string = @question.question
757
+ original_gather = @question.gather
758
+
759
+ verify_match = @question.verify_match
760
+ @question.gather = false
761
+
762
+ begin # when verify_match is set this loop will repeat until unique_answers == 1
763
+ @answers = [ ]
764
+ @gather = original_gather
765
+ original_question.question = original_question_string
766
+
767
+ case @gather
768
+ when Integer
769
+ @answers << ask(@question)
770
+ @gather -= 1
771
+
772
+ original_question.question = ""
773
+ until @gather.zero?
774
+ @question = original_question
775
+ @answers << ask(@question)
776
+ @gather -= 1
777
+ end
778
+ when ::String, Regexp
779
+ @answers << ask(@question)
780
+
781
+ original_question.question = ""
782
+ until (@gather.is_a?(::String) and @answers.last.to_s == @gather) or
783
+ (@gather.is_a?(Regexp) and @answers.last.to_s =~ @gather)
784
+ @question = original_question
785
+ @answers << ask(@question)
786
+ end
787
+
788
+ @answers.pop
789
+ when Hash
790
+ @answers = { }
791
+ @gather.keys.sort.each do |key|
792
+ @question = original_question
793
+ @key = key
794
+ @answers[key] = ask(@question)
795
+ end
796
+ end
797
+
798
+ if verify_match && (unique_answers(@answers).size > 1)
799
+ @question = original_question
800
+ explain_error(:mismatch)
801
+ else
802
+ verify_match = false
803
+ end
804
+
805
+ end while verify_match
806
+
807
+ original_question.verify_match ? @answer : @answers
808
+ end
809
+
810
+ #
811
+ # A helper method used by HighLine::Question.verify_match
812
+ # for finding whether a list of answers match or differ
813
+ # from each other.
814
+ #
815
+ def unique_answers(list = @answers)
816
+ (list.respond_to?(:values) ? list.values : list).uniq
817
+ end
818
+
819
+ #
820
+ # Read a line of input from the input stream and process whitespace as
821
+ # requested by the Question object.
822
+ #
823
+ # If Question's _readline_ property is set, that library will be used to
824
+ # fetch input. *WARNING*: This ignores the currently set input stream.
825
+ #
826
+ # Raises EOFError if input is exhausted.
827
+ #
828
+ def get_line( )
829
+ if @question.readline
830
+ require "readline" # load only if needed
831
+
832
+ # capture say()'s work in a String to feed to readline()
833
+ old_output = @output
834
+ @output = StringIO.new
835
+ say(@question)
836
+ question = @output.string
837
+ @output = old_output
838
+
839
+ # prep auto-completion
840
+ Readline.completion_proc = lambda do |string|
841
+ @question.selection.grep(/\A#{Regexp.escape(string)}/)
842
+ end
843
+
844
+ # work-around ugly readline() warnings
845
+ old_verbose = $VERBOSE
846
+ $VERBOSE = nil
847
+ raw_answer = Readline.readline(question, true)
848
+ if raw_answer.nil?
849
+ if @@track_eof
850
+ raise EOFError, "The input stream is exhausted."
851
+ else
852
+ raw_answer = String.new # Never return nil
853
+ end
854
+ end
855
+ answer = @question.change_case(
856
+ @question.remove_whitespace(raw_answer))
857
+ $VERBOSE = old_verbose
858
+
859
+ answer
860
+ else
861
+ if JRUBY
862
+ statement = format_statement(@question)
863
+ raw_answer = @java_console.readLine(statement, nil)
864
+
865
+ raise EOFError, "The input stream is exhausted." if raw_answer.nil? and
866
+ @@track_eof
867
+ else
868
+ raise EOFError, "The input stream is exhausted." if @@track_eof and
869
+ @input.eof?
870
+ raw_answer = @input.gets
871
+ end
872
+
873
+ @question.change_case(@question.remove_whitespace(raw_answer))
874
+ end
875
+ end
876
+
877
+ #
878
+ # Return a line or character of input, as requested for this question.
879
+ # Character input will be returned as a single character String,
880
+ # not an Integer.
881
+ #
882
+ # This question's _first_answer_ will be returned instead of input, if set.
883
+ #
884
+ # Raises EOFError if input is exhausted.
885
+ #
886
+ def get_response( )
887
+ return @question.first_answer if @question.first_answer?
888
+
889
+ if @question.character.nil?
890
+ if @question.echo == true and @question.limit.nil?
891
+ get_line
892
+ else
893
+ raw_no_echo_mode
894
+
895
+ line = "".encode(Encoding::BINARY)
896
+ backspace_limit = 0
897
+ begin
898
+
899
+ while character = get_character(@input)
900
+ # honor backspace and delete
901
+ if character == 127 or character == 8
902
+ line = line.force_encoding(Encoding.default_external)
903
+ line.slice!(-1, 1)
904
+ backspace_limit -= 1
905
+ line = line.force_encoding(Encoding::BINARY)
906
+ else
907
+ line << character.chr
908
+ backspace_limit = line.dup.force_encoding(Encoding.default_external).size
909
+ end
910
+ # looking for carriage return (decimal 13) or
911
+ # newline (decimal 10) in raw input
912
+ break if character == 13 or character == 10
913
+ if @question.echo != false
914
+ if character == 127 or character == 8
915
+ # only backspace if we have characters on the line to
916
+ # eliminate, otherwise we'll tromp over the prompt
917
+ if backspace_limit >= 0 then
918
+ @output.print("\b#{HighLine.Style(:erase_char).code}")
919
+ else
920
+ # do nothing
921
+ end
922
+ else
923
+ line_with_next_char_encoded = line.dup.force_encoding(Encoding.default_external)
924
+ # For multi-byte character, does this
925
+ # last character completes the character?
926
+ # Then print it.
927
+ if line_with_next_char_encoded.valid_encoding?
928
+ if @question.echo == true
929
+ @output.print(line_with_next_char_encoded[-1])
930
+ else
931
+ @output.print(@question.echo)
932
+ end
933
+ end
934
+ end
935
+ @output.flush
936
+ end
937
+ break if @question.limit and line.size == @question.limit
938
+ end
939
+ ensure
940
+ restore_mode
941
+ end
942
+ if @question.overwrite
943
+ @output.print("\r#{HighLine.Style(:erase_line).code}")
944
+ @output.flush
945
+ else
946
+ say("\n")
947
+ end
948
+
949
+ @question.change_case(@question.remove_whitespace(line.force_encoding(Encoding.default_external)))
950
+ end
951
+ else
952
+ if JRUBY #prompt has not been shown
953
+ say @question
954
+ end
955
+
956
+ raw_no_echo_mode
957
+ begin
958
+ if @question.character == :getc
959
+ response = @input.getbyte.chr
960
+ else
961
+ response = get_character(@input).chr
962
+ if @question.overwrite
963
+ @output.print("\r#{HighLine.Style(:erase_line).code}")
964
+ @output.flush
965
+ else
966
+ echo = if @question.echo == true
967
+ response
968
+ elsif @question.echo != false
969
+ @question.echo
970
+ else
971
+ ""
972
+ end
973
+ say("#{echo}\n")
974
+ end
975
+ end
976
+ ensure
977
+ restore_mode
978
+ end
979
+ @question.change_case(response)
980
+ end
981
+ end
982
+
983
+ #
984
+ # Page print a series of at most _page_at_ lines for _output_. After each
985
+ # page is printed, HighLine will pause until the user presses enter/return
986
+ # then display the next page of data.
987
+ #
988
+ # Note that the final page of _output_ is *not* printed, but returned
989
+ # instead. This is to support any special handling for the final sequence.
990
+ #
991
+ def page_print( output )
992
+ lines = output.lines.to_a
993
+ while lines.size > @page_at
994
+ @output.puts lines.slice!(0...@page_at).join
995
+ @output.puts
996
+ # Return last line if user wants to abort paging
997
+ return "...\n#{lines.last}" unless continue_paging?
998
+ end
999
+ return lines.join
1000
+ end
1001
+
1002
+ #
1003
+ # Ask user if they wish to continue paging output. Allows them to type "q" to
1004
+ # cancel the paging process.
1005
+ #
1006
+ def continue_paging?
1007
+ command = HighLine.new(@input, @output).ask(
1008
+ "-- press enter/return to continue or q to stop -- "
1009
+ ) { |q| q.character = true }
1010
+ command !~ /\A[qQ]\Z/ # Only continue paging if Q was not hit.
1011
+ end
1012
+
1013
+ #
1014
+ # Wrap a sequence of _lines_ at _wrap_at_ characters per line. Existing
1015
+ # newlines will not be affected by this process, but additional newlines
1016
+ # may be added.
1017
+ #
1018
+ def wrap( text )
1019
+ wrapped = [ ]
1020
+ text.each_line do |line|
1021
+ # take into account color escape sequences when wrapping
1022
+ wrap_at = @wrap_at + (line.length - actual_length(line))
1023
+ while line =~ /([^\n]{#{wrap_at + 1},})/
1024
+ search = $1.dup
1025
+ replace = $1.dup
1026
+ if index = replace.rindex(" ", wrap_at)
1027
+ replace[index, 1] = "\n"
1028
+ replace.sub!(/\n[ \t]+/, "\n")
1029
+ line.sub!(search, replace)
1030
+ else
1031
+ line[$~.begin(1) + wrap_at, 0] = "\n"
1032
+ end
1033
+ end
1034
+ wrapped << line
1035
+ end
1036
+ return wrapped.join
1037
+ end
1038
+
1039
+ #
1040
+ # Returns the length of the passed +string_with_escapes+, minus and color
1041
+ # sequence escapes.
1042
+ #
1043
+ def actual_length( string_with_escapes )
1044
+ string_with_escapes.to_s.gsub(/\e\[\d{1,2}m/, "").length
1045
+ end
1046
+ end
1047
+
1048
+ require "highline/string_extensions"