saikouda 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/CODE_OF_CONDUCT.md +74 -0
  4. data/Gemfile +5 -0
  5. data/Gemfile.lock +22 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +43 -0
  8. data/Rakefile +2 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +8 -0
  11. data/exe/saikouda +5 -0
  12. data/lib/saikouda/cli.rb +106 -0
  13. data/lib/saikouda/version.rb +3 -0
  14. data/lib/saikouda.rb +7 -0
  15. data/saikouda.gemspec +34 -0
  16. data/vendor/bundle/bin/rake +27 -0
  17. data/vendor/bundle/bin/saikouda +27 -0
  18. data/vendor/bundle/bin/thor +27 -0
  19. data/vendor/bundle/cache/rake-10.5.0.gem +0 -0
  20. data/vendor/bundle/cache/thor-0.20.3.gem +0 -0
  21. data/vendor/bundle/gems/rake-10.5.0/.autotest +7 -0
  22. data/vendor/bundle/gems/rake-10.5.0/.rubocop.yml +27 -0
  23. data/vendor/bundle/gems/rake-10.5.0/.togglerc +7 -0
  24. data/vendor/bundle/gems/rake-10.5.0/CONTRIBUTING.rdoc +38 -0
  25. data/vendor/bundle/gems/rake-10.5.0/History.rdoc +659 -0
  26. data/vendor/bundle/gems/rake-10.5.0/MIT-LICENSE +21 -0
  27. data/vendor/bundle/gems/rake-10.5.0/Manifest.txt +166 -0
  28. data/vendor/bundle/gems/rake-10.5.0/README.rdoc +139 -0
  29. data/vendor/bundle/gems/rake-10.5.0/Rakefile +81 -0
  30. data/vendor/bundle/gems/rake-10.5.0/bin/rake +33 -0
  31. data/vendor/bundle/gems/rake-10.5.0/doc/command_line_usage.rdoc +158 -0
  32. data/vendor/bundle/gems/rake-10.5.0/doc/example/Rakefile1 +38 -0
  33. data/vendor/bundle/gems/rake-10.5.0/doc/example/Rakefile2 +35 -0
  34. data/vendor/bundle/gems/rake-10.5.0/doc/example/a.c +6 -0
  35. data/vendor/bundle/gems/rake-10.5.0/doc/example/b.c +6 -0
  36. data/vendor/bundle/gems/rake-10.5.0/doc/example/main.c +11 -0
  37. data/vendor/bundle/gems/rake-10.5.0/doc/glossary.rdoc +42 -0
  38. data/vendor/bundle/gems/rake-10.5.0/doc/jamis.rb +591 -0
  39. data/vendor/bundle/gems/rake-10.5.0/doc/proto_rake.rdoc +127 -0
  40. data/vendor/bundle/gems/rake-10.5.0/doc/rake.1 +141 -0
  41. data/vendor/bundle/gems/rake-10.5.0/doc/rakefile.rdoc +624 -0
  42. data/vendor/bundle/gems/rake-10.5.0/doc/rational.rdoc +151 -0
  43. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.4.14.rdoc +23 -0
  44. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.4.15.rdoc +35 -0
  45. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.5.0.rdoc +53 -0
  46. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.5.3.rdoc +78 -0
  47. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.5.4.rdoc +46 -0
  48. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.6.0.rdoc +141 -0
  49. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.7.0.rdoc +119 -0
  50. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.7.1.rdoc +59 -0
  51. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.7.2.rdoc +121 -0
  52. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.7.3.rdoc +47 -0
  53. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.8.0.rdoc +114 -0
  54. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.8.2.rdoc +165 -0
  55. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.8.3.rdoc +112 -0
  56. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.8.4.rdoc +147 -0
  57. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.8.5.rdoc +53 -0
  58. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.8.6.rdoc +37 -0
  59. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.8.7.rdoc +55 -0
  60. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.9.0.rdoc +112 -0
  61. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.9.1.rdoc +52 -0
  62. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.9.2.2.rdoc +55 -0
  63. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.9.2.rdoc +49 -0
  64. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.9.3.rdoc +102 -0
  65. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.9.4.rdoc +60 -0
  66. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.9.5.rdoc +55 -0
  67. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-0.9.6.rdoc +64 -0
  68. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-10.0.0.rdoc +178 -0
  69. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-10.0.1.rdoc +58 -0
  70. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-10.0.2.rdoc +53 -0
  71. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-10.0.3.rdoc +191 -0
  72. data/vendor/bundle/gems/rake-10.5.0/doc/release_notes/rake-10.1.0.rdoc +61 -0
  73. data/vendor/bundle/gems/rake-10.5.0/lib/rake/alt_system.rb +110 -0
  74. data/vendor/bundle/gems/rake-10.5.0/lib/rake/application.rb +790 -0
  75. data/vendor/bundle/gems/rake-10.5.0/lib/rake/backtrace.rb +23 -0
  76. data/vendor/bundle/gems/rake-10.5.0/lib/rake/clean.rb +76 -0
  77. data/vendor/bundle/gems/rake-10.5.0/lib/rake/cloneable.rb +16 -0
  78. data/vendor/bundle/gems/rake-10.5.0/lib/rake/contrib/.document +1 -0
  79. data/vendor/bundle/gems/rake-10.5.0/lib/rake/contrib/compositepublisher.rb +21 -0
  80. data/vendor/bundle/gems/rake-10.5.0/lib/rake/contrib/ftptools.rb +137 -0
  81. data/vendor/bundle/gems/rake-10.5.0/lib/rake/contrib/publisher.rb +81 -0
  82. data/vendor/bundle/gems/rake-10.5.0/lib/rake/contrib/rubyforgepublisher.rb +18 -0
  83. data/vendor/bundle/gems/rake-10.5.0/lib/rake/contrib/sshpublisher.rb +61 -0
  84. data/vendor/bundle/gems/rake-10.5.0/lib/rake/contrib/sys.rb +4 -0
  85. data/vendor/bundle/gems/rake-10.5.0/lib/rake/cpu_counter.rb +125 -0
  86. data/vendor/bundle/gems/rake-10.5.0/lib/rake/default_loader.rb +14 -0
  87. data/vendor/bundle/gems/rake-10.5.0/lib/rake/dsl_definition.rb +201 -0
  88. data/vendor/bundle/gems/rake-10.5.0/lib/rake/early_time.rb +21 -0
  89. data/vendor/bundle/gems/rake-10.5.0/lib/rake/ext/core.rb +25 -0
  90. data/vendor/bundle/gems/rake-10.5.0/lib/rake/ext/module.rb +2 -0
  91. data/vendor/bundle/gems/rake-10.5.0/lib/rake/ext/pathname.rb +25 -0
  92. data/vendor/bundle/gems/rake-10.5.0/lib/rake/ext/string.rb +175 -0
  93. data/vendor/bundle/gems/rake-10.5.0/lib/rake/ext/time.rb +18 -0
  94. data/vendor/bundle/gems/rake-10.5.0/lib/rake/file_creation_task.rb +24 -0
  95. data/vendor/bundle/gems/rake-10.5.0/lib/rake/file_list.rb +428 -0
  96. data/vendor/bundle/gems/rake-10.5.0/lib/rake/file_task.rb +46 -0
  97. data/vendor/bundle/gems/rake-10.5.0/lib/rake/file_utils.rb +128 -0
  98. data/vendor/bundle/gems/rake-10.5.0/lib/rake/file_utils_ext.rb +144 -0
  99. data/vendor/bundle/gems/rake-10.5.0/lib/rake/gempackagetask.rb +4 -0
  100. data/vendor/bundle/gems/rake-10.5.0/lib/rake/invocation_chain.rb +56 -0
  101. data/vendor/bundle/gems/rake-10.5.0/lib/rake/invocation_exception_mixin.rb +16 -0
  102. data/vendor/bundle/gems/rake-10.5.0/lib/rake/late_time.rb +17 -0
  103. data/vendor/bundle/gems/rake-10.5.0/lib/rake/linked_list.rb +103 -0
  104. data/vendor/bundle/gems/rake-10.5.0/lib/rake/loaders/makefile.rb +53 -0
  105. data/vendor/bundle/gems/rake-10.5.0/lib/rake/multi_task.rb +13 -0
  106. data/vendor/bundle/gems/rake-10.5.0/lib/rake/name_space.rb +38 -0
  107. data/vendor/bundle/gems/rake-10.5.0/lib/rake/packagetask.rb +199 -0
  108. data/vendor/bundle/gems/rake-10.5.0/lib/rake/pathmap.rb +3 -0
  109. data/vendor/bundle/gems/rake-10.5.0/lib/rake/phony.rb +15 -0
  110. data/vendor/bundle/gems/rake-10.5.0/lib/rake/private_reader.rb +20 -0
  111. data/vendor/bundle/gems/rake-10.5.0/lib/rake/promise.rb +99 -0
  112. data/vendor/bundle/gems/rake-10.5.0/lib/rake/pseudo_status.rb +29 -0
  113. data/vendor/bundle/gems/rake-10.5.0/lib/rake/rake_module.rb +38 -0
  114. data/vendor/bundle/gems/rake-10.5.0/lib/rake/rake_test_loader.rb +22 -0
  115. data/vendor/bundle/gems/rake-10.5.0/lib/rake/rdoctask.rb +4 -0
  116. data/vendor/bundle/gems/rake-10.5.0/lib/rake/ruby182_test_unit_fix.rb +29 -0
  117. data/vendor/bundle/gems/rake-10.5.0/lib/rake/rule_recursion_overflow_error.rb +20 -0
  118. data/vendor/bundle/gems/rake-10.5.0/lib/rake/runtest.rb +27 -0
  119. data/vendor/bundle/gems/rake-10.5.0/lib/rake/scope.rb +42 -0
  120. data/vendor/bundle/gems/rake-10.5.0/lib/rake/task.rb +383 -0
  121. data/vendor/bundle/gems/rake-10.5.0/lib/rake/task_argument_error.rb +7 -0
  122. data/vendor/bundle/gems/rake-10.5.0/lib/rake/task_arguments.rb +98 -0
  123. data/vendor/bundle/gems/rake-10.5.0/lib/rake/task_manager.rb +307 -0
  124. data/vendor/bundle/gems/rake-10.5.0/lib/rake/tasklib.rb +24 -0
  125. data/vendor/bundle/gems/rake-10.5.0/lib/rake/testtask.rb +213 -0
  126. data/vendor/bundle/gems/rake-10.5.0/lib/rake/thread_history_display.rb +48 -0
  127. data/vendor/bundle/gems/rake-10.5.0/lib/rake/thread_pool.rb +164 -0
  128. data/vendor/bundle/gems/rake-10.5.0/lib/rake/trace_output.rb +22 -0
  129. data/vendor/bundle/gems/rake-10.5.0/lib/rake/version.rb +7 -0
  130. data/vendor/bundle/gems/rake-10.5.0/lib/rake/win32.rb +56 -0
  131. data/vendor/bundle/gems/rake-10.5.0/lib/rake.rb +79 -0
  132. data/vendor/bundle/gems/rake-10.5.0/rakelib/publish.rake +20 -0
  133. data/vendor/bundle/gems/rake-10.5.0/rakelib/test_times.rake +25 -0
  134. data/vendor/bundle/gems/rake-10.5.0/test/file_creation.rb +34 -0
  135. data/vendor/bundle/gems/rake-10.5.0/test/helper.rb +129 -0
  136. data/vendor/bundle/gems/rake-10.5.0/test/support/rakefile_definitions.rb +478 -0
  137. data/vendor/bundle/gems/rake-10.5.0/test/support/ruby_runner.rb +34 -0
  138. data/vendor/bundle/gems/rake-10.5.0/test/test_private_reader.rb +42 -0
  139. data/vendor/bundle/gems/rake-10.5.0/test/test_rake.rb +40 -0
  140. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_application.rb +643 -0
  141. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_application_options.rb +468 -0
  142. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_backtrace.rb +119 -0
  143. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_clean.rb +61 -0
  144. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_cpu_counter.rb +68 -0
  145. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_definitions.rb +84 -0
  146. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_directory_task.rb +76 -0
  147. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_dsl.rb +40 -0
  148. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_early_time.rb +31 -0
  149. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_extension.rb +59 -0
  150. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_file_creation_task.rb +56 -0
  151. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_file_list.rb +670 -0
  152. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_file_list_path_map.rb +8 -0
  153. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_file_task.rb +197 -0
  154. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_file_utils.rb +314 -0
  155. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_ftp_file.rb +74 -0
  156. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_functional.rb +482 -0
  157. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_invocation_chain.rb +64 -0
  158. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_late_time.rb +18 -0
  159. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_linked_list.rb +84 -0
  160. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_makefile_loader.rb +46 -0
  161. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_multi_task.rb +64 -0
  162. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_name_space.rb +57 -0
  163. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_package_task.rb +79 -0
  164. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_path_map.rb +168 -0
  165. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_path_map_explode.rb +34 -0
  166. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_path_map_partial.rb +18 -0
  167. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_pathname_extensions.rb +15 -0
  168. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_pseudo_status.rb +21 -0
  169. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_rake_test_loader.rb +20 -0
  170. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_reduce_compat.rb +26 -0
  171. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_require.rb +40 -0
  172. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_rules.rb +388 -0
  173. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_scope.rb +44 -0
  174. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_task.rb +393 -0
  175. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_task_argument_parsing.rb +119 -0
  176. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_task_arguments.rb +127 -0
  177. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_task_lib.rb +9 -0
  178. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_task_manager.rb +178 -0
  179. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_task_manager_argument_resolution.rb +19 -0
  180. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_task_with_arguments.rb +172 -0
  181. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_test_task.rb +146 -0
  182. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_thread_pool.rb +145 -0
  183. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_top_level_functions.rb +71 -0
  184. data/vendor/bundle/gems/rake-10.5.0/test/test_rake_win32.rb +72 -0
  185. data/vendor/bundle/gems/rake-10.5.0/test/test_thread_history_display.rb +101 -0
  186. data/vendor/bundle/gems/rake-10.5.0/test/test_trace_output.rb +52 -0
  187. data/vendor/bundle/gems/thor-0.20.3/.document +5 -0
  188. data/vendor/bundle/gems/thor-0.20.3/CHANGELOG.md +204 -0
  189. data/vendor/bundle/gems/thor-0.20.3/CONTRIBUTING.md +15 -0
  190. data/vendor/bundle/gems/thor-0.20.3/LICENSE.md +20 -0
  191. data/vendor/bundle/gems/thor-0.20.3/README.md +51 -0
  192. data/vendor/bundle/gems/thor-0.20.3/bin/thor +6 -0
  193. data/vendor/bundle/gems/thor-0.20.3/lib/thor/actions/create_file.rb +104 -0
  194. data/vendor/bundle/gems/thor-0.20.3/lib/thor/actions/create_link.rb +60 -0
  195. data/vendor/bundle/gems/thor-0.20.3/lib/thor/actions/directory.rb +118 -0
  196. data/vendor/bundle/gems/thor-0.20.3/lib/thor/actions/empty_directory.rb +143 -0
  197. data/vendor/bundle/gems/thor-0.20.3/lib/thor/actions/file_manipulation.rb +373 -0
  198. data/vendor/bundle/gems/thor-0.20.3/lib/thor/actions/inject_into_file.rb +109 -0
  199. data/vendor/bundle/gems/thor-0.20.3/lib/thor/actions.rb +331 -0
  200. data/vendor/bundle/gems/thor-0.20.3/lib/thor/base.rb +678 -0
  201. data/vendor/bundle/gems/thor-0.20.3/lib/thor/command.rb +135 -0
  202. data/vendor/bundle/gems/thor-0.20.3/lib/thor/core_ext/hash_with_indifferent_access.rb +97 -0
  203. data/vendor/bundle/gems/thor-0.20.3/lib/thor/core_ext/io_binary_read.rb +12 -0
  204. data/vendor/bundle/gems/thor-0.20.3/lib/thor/core_ext/ordered_hash.rb +129 -0
  205. data/vendor/bundle/gems/thor-0.20.3/lib/thor/error.rb +114 -0
  206. data/vendor/bundle/gems/thor-0.20.3/lib/thor/group.rb +281 -0
  207. data/vendor/bundle/gems/thor-0.20.3/lib/thor/invocation.rb +177 -0
  208. data/vendor/bundle/gems/thor-0.20.3/lib/thor/line_editor/basic.rb +37 -0
  209. data/vendor/bundle/gems/thor-0.20.3/lib/thor/line_editor/readline.rb +88 -0
  210. data/vendor/bundle/gems/thor-0.20.3/lib/thor/line_editor.rb +17 -0
  211. data/vendor/bundle/gems/thor-0.20.3/lib/thor/parser/argument.rb +70 -0
  212. data/vendor/bundle/gems/thor-0.20.3/lib/thor/parser/arguments.rb +175 -0
  213. data/vendor/bundle/gems/thor-0.20.3/lib/thor/parser/option.rb +146 -0
  214. data/vendor/bundle/gems/thor-0.20.3/lib/thor/parser/options.rb +226 -0
  215. data/vendor/bundle/gems/thor-0.20.3/lib/thor/parser.rb +4 -0
  216. data/vendor/bundle/gems/thor-0.20.3/lib/thor/rake_compat.rb +71 -0
  217. data/vendor/bundle/gems/thor-0.20.3/lib/thor/runner.rb +324 -0
  218. data/vendor/bundle/gems/thor-0.20.3/lib/thor/shell/basic.rb +482 -0
  219. data/vendor/bundle/gems/thor-0.20.3/lib/thor/shell/color.rb +149 -0
  220. data/vendor/bundle/gems/thor-0.20.3/lib/thor/shell/html.rb +126 -0
  221. data/vendor/bundle/gems/thor-0.20.3/lib/thor/shell.rb +81 -0
  222. data/vendor/bundle/gems/thor-0.20.3/lib/thor/util.rb +268 -0
  223. data/vendor/bundle/gems/thor-0.20.3/lib/thor/version.rb +3 -0
  224. data/vendor/bundle/gems/thor-0.20.3/lib/thor.rb +509 -0
  225. data/vendor/bundle/gems/thor-0.20.3/thor.gemspec +21 -0
  226. data/vendor/bundle/specifications/rake-10.5.0.gemspec +43 -0
  227. data/vendor/bundle/specifications/thor-0.20.3.gemspec +35 -0
  228. metadata +314 -0
@@ -0,0 +1,281 @@
1
+ require "thor/base"
2
+
3
+ # Thor has a special class called Thor::Group. The main difference to Thor class
4
+ # is that it invokes all commands at once. It also include some methods that allows
5
+ # invocations to be done at the class method, which are not available to Thor
6
+ # commands.
7
+ class Thor::Group
8
+ class << self
9
+ # The description for this Thor::Group. If none is provided, but a source root
10
+ # exists, tries to find the USAGE one folder above it, otherwise searches
11
+ # in the superclass.
12
+ #
13
+ # ==== Parameters
14
+ # description<String>:: The description for this Thor::Group.
15
+ #
16
+ def desc(description = nil)
17
+ if description
18
+ @desc = description
19
+ else
20
+ @desc ||= from_superclass(:desc, nil)
21
+ end
22
+ end
23
+
24
+ # Prints help information.
25
+ #
26
+ # ==== Options
27
+ # short:: When true, shows only usage.
28
+ #
29
+ def help(shell)
30
+ shell.say "Usage:"
31
+ shell.say " #{banner}\n"
32
+ shell.say
33
+ class_options_help(shell)
34
+ shell.say desc if desc
35
+ end
36
+
37
+ # Stores invocations for this class merging with superclass values.
38
+ #
39
+ def invocations #:nodoc:
40
+ @invocations ||= from_superclass(:invocations, {})
41
+ end
42
+
43
+ # Stores invocation blocks used on invoke_from_option.
44
+ #
45
+ def invocation_blocks #:nodoc:
46
+ @invocation_blocks ||= from_superclass(:invocation_blocks, {})
47
+ end
48
+
49
+ # Invoke the given namespace or class given. It adds an instance
50
+ # method that will invoke the klass and command. You can give a block to
51
+ # configure how it will be invoked.
52
+ #
53
+ # The namespace/class given will have its options showed on the help
54
+ # usage. Check invoke_from_option for more information.
55
+ #
56
+ def invoke(*names, &block)
57
+ options = names.last.is_a?(Hash) ? names.pop : {}
58
+ verbose = options.fetch(:verbose, true)
59
+
60
+ names.each do |name|
61
+ invocations[name] = false
62
+ invocation_blocks[name] = block if block_given?
63
+
64
+ class_eval <<-METHOD, __FILE__, __LINE__ + 1
65
+ def _invoke_#{name.to_s.gsub(/\W/, '_')}
66
+ klass, command = self.class.prepare_for_invocation(nil, #{name.inspect})
67
+
68
+ if klass
69
+ say_status :invoke, #{name.inspect}, #{verbose.inspect}
70
+ block = self.class.invocation_blocks[#{name.inspect}]
71
+ _invoke_for_class_method klass, command, &block
72
+ else
73
+ say_status :error, %(#{name.inspect} [not found]), :red
74
+ end
75
+ end
76
+ METHOD
77
+ end
78
+ end
79
+
80
+ # Invoke a thor class based on the value supplied by the user to the
81
+ # given option named "name". A class option must be created before this
82
+ # method is invoked for each name given.
83
+ #
84
+ # ==== Examples
85
+ #
86
+ # class GemGenerator < Thor::Group
87
+ # class_option :test_framework, :type => :string
88
+ # invoke_from_option :test_framework
89
+ # end
90
+ #
91
+ # ==== Boolean options
92
+ #
93
+ # In some cases, you want to invoke a thor class if some option is true or
94
+ # false. This is automatically handled by invoke_from_option. Then the
95
+ # option name is used to invoke the generator.
96
+ #
97
+ # ==== Preparing for invocation
98
+ #
99
+ # In some cases you want to customize how a specified hook is going to be
100
+ # invoked. You can do that by overwriting the class method
101
+ # prepare_for_invocation. The class method must necessarily return a klass
102
+ # and an optional command.
103
+ #
104
+ # ==== Custom invocations
105
+ #
106
+ # You can also supply a block to customize how the option is going to be
107
+ # invoked. The block receives two parameters, an instance of the current
108
+ # class and the klass to be invoked.
109
+ #
110
+ def invoke_from_option(*names, &block)
111
+ options = names.last.is_a?(Hash) ? names.pop : {}
112
+ verbose = options.fetch(:verbose, :white)
113
+
114
+ names.each do |name|
115
+ unless class_options.key?(name)
116
+ raise ArgumentError, "You have to define the option #{name.inspect} " \
117
+ "before setting invoke_from_option."
118
+ end
119
+
120
+ invocations[name] = true
121
+ invocation_blocks[name] = block if block_given?
122
+
123
+ class_eval <<-METHOD, __FILE__, __LINE__ + 1
124
+ def _invoke_from_option_#{name.to_s.gsub(/\W/, '_')}
125
+ return unless options[#{name.inspect}]
126
+
127
+ value = options[#{name.inspect}]
128
+ value = #{name.inspect} if TrueClass === value
129
+ klass, command = self.class.prepare_for_invocation(#{name.inspect}, value)
130
+
131
+ if klass
132
+ say_status :invoke, value, #{verbose.inspect}
133
+ block = self.class.invocation_blocks[#{name.inspect}]
134
+ _invoke_for_class_method klass, command, &block
135
+ else
136
+ say_status :error, %(\#{value} [not found]), :red
137
+ end
138
+ end
139
+ METHOD
140
+ end
141
+ end
142
+
143
+ # Remove a previously added invocation.
144
+ #
145
+ # ==== Examples
146
+ #
147
+ # remove_invocation :test_framework
148
+ #
149
+ def remove_invocation(*names)
150
+ names.each do |name|
151
+ remove_command(name)
152
+ remove_class_option(name)
153
+ invocations.delete(name)
154
+ invocation_blocks.delete(name)
155
+ end
156
+ end
157
+
158
+ # Overwrite class options help to allow invoked generators options to be
159
+ # shown recursively when invoking a generator.
160
+ #
161
+ def class_options_help(shell, groups = {}) #:nodoc:
162
+ get_options_from_invocations(groups, class_options) do |klass|
163
+ klass.send(:get_options_from_invocations, groups, class_options)
164
+ end
165
+ super(shell, groups)
166
+ end
167
+
168
+ # Get invocations array and merge options from invocations. Those
169
+ # options are added to group_options hash. Options that already exists
170
+ # in base_options are not added twice.
171
+ #
172
+ def get_options_from_invocations(group_options, base_options) #:nodoc: # rubocop:disable MethodLength
173
+ invocations.each do |name, from_option|
174
+ value = if from_option
175
+ option = class_options[name]
176
+ option.type == :boolean ? name : option.default
177
+ else
178
+ name
179
+ end
180
+ next unless value
181
+
182
+ klass, _ = prepare_for_invocation(name, value)
183
+ next unless klass && klass.respond_to?(:class_options)
184
+
185
+ value = value.to_s
186
+ human_name = value.respond_to?(:classify) ? value.classify : value
187
+
188
+ group_options[human_name] ||= []
189
+ group_options[human_name] += klass.class_options.values.select do |class_option|
190
+ base_options[class_option.name.to_sym].nil? && class_option.group.nil? &&
191
+ !group_options.values.flatten.any? { |i| i.name == class_option.name }
192
+ end
193
+
194
+ yield klass if block_given?
195
+ end
196
+ end
197
+
198
+ # Returns commands ready to be printed.
199
+ def printable_commands(*)
200
+ item = []
201
+ item << banner
202
+ item << (desc ? "# #{desc.gsub(/\s+/m, ' ')}" : "")
203
+ [item]
204
+ end
205
+ alias_method :printable_tasks, :printable_commands
206
+
207
+ def handle_argument_error(command, error, _args, arity) #:nodoc:
208
+ msg = "#{basename} #{command.name} takes #{arity} argument".dup
209
+ msg << "s" if arity > 1
210
+ msg << ", but it should not."
211
+ raise error, msg
212
+ end
213
+
214
+ protected
215
+
216
+ # The method responsible for dispatching given the args.
217
+ def dispatch(command, given_args, given_opts, config) #:nodoc:
218
+ if Thor::HELP_MAPPINGS.include?(given_args.first)
219
+ help(config[:shell])
220
+ return
221
+ end
222
+
223
+ args, opts = Thor::Options.split(given_args)
224
+ opts = given_opts || opts
225
+
226
+ instance = new(args, opts, config)
227
+ yield instance if block_given?
228
+
229
+ if command
230
+ instance.invoke_command(all_commands[command])
231
+ else
232
+ instance.invoke_all
233
+ end
234
+ end
235
+
236
+ # The banner for this class. You can customize it if you are invoking the
237
+ # thor class by another ways which is not the Thor::Runner.
238
+ def banner
239
+ "#{basename} #{self_command.formatted_usage(self, false)}"
240
+ end
241
+
242
+ # Represents the whole class as a command.
243
+ def self_command #:nodoc:
244
+ Thor::DynamicCommand.new(namespace, class_options)
245
+ end
246
+ alias_method :self_task, :self_command
247
+
248
+ def baseclass #:nodoc:
249
+ Thor::Group
250
+ end
251
+
252
+ def create_command(meth) #:nodoc:
253
+ commands[meth.to_s] = Thor::Command.new(meth, nil, nil, nil, nil)
254
+ true
255
+ end
256
+ alias_method :create_task, :create_command
257
+ end
258
+
259
+ include Thor::Base
260
+
261
+ protected
262
+
263
+ # Shortcut to invoke with padding and block handling. Use internally by
264
+ # invoke and invoke_from_option class methods.
265
+ def _invoke_for_class_method(klass, command = nil, *args, &block) #:nodoc:
266
+ with_padding do
267
+ if block
268
+ case block.arity
269
+ when 3
270
+ yield(self, klass, command)
271
+ when 2
272
+ yield(self, klass)
273
+ when 1
274
+ instance_exec(klass, &block)
275
+ end
276
+ else
277
+ invoke klass, command, *args
278
+ end
279
+ end
280
+ end
281
+ end
@@ -0,0 +1,177 @@
1
+ class Thor
2
+ module Invocation
3
+ def self.included(base) #:nodoc:
4
+ base.extend ClassMethods
5
+ end
6
+
7
+ module ClassMethods
8
+ # This method is responsible for receiving a name and find the proper
9
+ # class and command for it. The key is an optional parameter which is
10
+ # available only in class methods invocations (i.e. in Thor::Group).
11
+ def prepare_for_invocation(key, name) #:nodoc:
12
+ case name
13
+ when Symbol, String
14
+ Thor::Util.find_class_and_command_by_namespace(name.to_s, !key)
15
+ else
16
+ name
17
+ end
18
+ end
19
+ end
20
+
21
+ # Make initializer aware of invocations and the initialization args.
22
+ def initialize(args = [], options = {}, config = {}, &block) #:nodoc:
23
+ @_invocations = config[:invocations] || Hash.new { |h, k| h[k] = [] }
24
+ @_initializer = [args, options, config]
25
+ super
26
+ end
27
+
28
+ # Make the current command chain accessible with in a Thor-(sub)command
29
+ def current_command_chain
30
+ @_invocations.values.flatten.map(&:to_sym)
31
+ end
32
+
33
+ # Receives a name and invokes it. The name can be a string (either "command" or
34
+ # "namespace:command"), a Thor::Command, a Class or a Thor instance. If the
35
+ # command cannot be guessed by name, it can also be supplied as second argument.
36
+ #
37
+ # You can also supply the arguments, options and configuration values for
38
+ # the command to be invoked, if none is given, the same values used to
39
+ # initialize the invoker are used to initialize the invoked.
40
+ #
41
+ # When no name is given, it will invoke the default command of the current class.
42
+ #
43
+ # ==== Examples
44
+ #
45
+ # class A < Thor
46
+ # def foo
47
+ # invoke :bar
48
+ # invoke "b:hello", ["Erik"]
49
+ # end
50
+ #
51
+ # def bar
52
+ # invoke "b:hello", ["Erik"]
53
+ # end
54
+ # end
55
+ #
56
+ # class B < Thor
57
+ # def hello(name)
58
+ # puts "hello #{name}"
59
+ # end
60
+ # end
61
+ #
62
+ # You can notice that the method "foo" above invokes two commands: "bar",
63
+ # which belongs to the same class and "hello" which belongs to the class B.
64
+ #
65
+ # By using an invocation system you ensure that a command is invoked only once.
66
+ # In the example above, invoking "foo" will invoke "b:hello" just once, even
67
+ # if it's invoked later by "bar" method.
68
+ #
69
+ # When class A invokes class B, all arguments used on A initialization are
70
+ # supplied to B. This allows lazy parse of options. Let's suppose you have
71
+ # some rspec commands:
72
+ #
73
+ # class Rspec < Thor::Group
74
+ # class_option :mock_framework, :type => :string, :default => :rr
75
+ #
76
+ # def invoke_mock_framework
77
+ # invoke "rspec:#{options[:mock_framework]}"
78
+ # end
79
+ # end
80
+ #
81
+ # As you noticed, it invokes the given mock framework, which might have its
82
+ # own options:
83
+ #
84
+ # class Rspec::RR < Thor::Group
85
+ # class_option :style, :type => :string, :default => :mock
86
+ # end
87
+ #
88
+ # Since it's not rspec concern to parse mock framework options, when RR
89
+ # is invoked all options are parsed again, so RR can extract only the options
90
+ # that it's going to use.
91
+ #
92
+ # If you want Rspec::RR to be initialized with its own set of options, you
93
+ # have to do that explicitly:
94
+ #
95
+ # invoke "rspec:rr", [], :style => :foo
96
+ #
97
+ # Besides giving an instance, you can also give a class to invoke:
98
+ #
99
+ # invoke Rspec::RR, [], :style => :foo
100
+ #
101
+ def invoke(name = nil, *args)
102
+ if name.nil?
103
+ warn "[Thor] Calling invoke() without argument is deprecated. Please use invoke_all instead.\n#{caller.join("\n")}"
104
+ return invoke_all
105
+ end
106
+
107
+ args.unshift(nil) if args.first.is_a?(Array) || args.first.nil?
108
+ command, args, opts, config = args
109
+
110
+ klass, command = _retrieve_class_and_command(name, command)
111
+ raise "Missing Thor class for invoke #{name}" unless klass
112
+ raise "Expected Thor class, got #{klass}" unless klass <= Thor::Base
113
+
114
+ args, opts, config = _parse_initialization_options(args, opts, config)
115
+ klass.send(:dispatch, command, args, opts, config) do |instance|
116
+ instance.parent_options = options
117
+ end
118
+ end
119
+
120
+ # Invoke the given command if the given args.
121
+ def invoke_command(command, *args) #:nodoc:
122
+ current = @_invocations[self.class]
123
+
124
+ unless current.include?(command.name)
125
+ current << command.name
126
+ command.run(self, *args)
127
+ end
128
+ end
129
+ alias_method :invoke_task, :invoke_command
130
+
131
+ # Invoke all commands for the current instance.
132
+ def invoke_all #:nodoc:
133
+ self.class.all_commands.map { |_, command| invoke_command(command) }
134
+ end
135
+
136
+ # Invokes using shell padding.
137
+ def invoke_with_padding(*args)
138
+ with_padding { invoke(*args) }
139
+ end
140
+
141
+ protected
142
+
143
+ # Configuration values that are shared between invocations.
144
+ def _shared_configuration #:nodoc:
145
+ {:invocations => @_invocations}
146
+ end
147
+
148
+ # This method simply retrieves the class and command to be invoked.
149
+ # If the name is nil or the given name is a command in the current class,
150
+ # use the given name and return self as class. Otherwise, call
151
+ # prepare_for_invocation in the current class.
152
+ def _retrieve_class_and_command(name, sent_command = nil) #:nodoc:
153
+ if name.nil?
154
+ [self.class, nil]
155
+ elsif self.class.all_commands[name.to_s]
156
+ [self.class, name.to_s]
157
+ else
158
+ klass, command = self.class.prepare_for_invocation(nil, name)
159
+ [klass, command || sent_command]
160
+ end
161
+ end
162
+ alias_method :_retrieve_class_and_task, :_retrieve_class_and_command
163
+
164
+ # Initialize klass using values stored in the @_initializer.
165
+ def _parse_initialization_options(args, opts, config) #:nodoc:
166
+ stored_args, stored_opts, stored_config = @_initializer
167
+
168
+ args ||= stored_args.dup
169
+ opts ||= stored_opts.dup
170
+
171
+ config ||= {}
172
+ config = stored_config.merge(_shared_configuration).merge!(config)
173
+
174
+ [args, opts, config]
175
+ end
176
+ end
177
+ end
@@ -0,0 +1,37 @@
1
+ class Thor
2
+ module LineEditor
3
+ class Basic
4
+ attr_reader :prompt, :options
5
+
6
+ def self.available?
7
+ true
8
+ end
9
+
10
+ def initialize(prompt, options)
11
+ @prompt = prompt
12
+ @options = options
13
+ end
14
+
15
+ def readline
16
+ $stdout.print(prompt)
17
+ get_input
18
+ end
19
+
20
+ private
21
+
22
+ def get_input
23
+ if echo?
24
+ $stdin.gets
25
+ else
26
+ # Lazy-load io/console since it is gem-ified as of 2.3
27
+ require "io/console" if RUBY_VERSION > "1.9.2"
28
+ $stdin.noecho(&:gets)
29
+ end
30
+ end
31
+
32
+ def echo?
33
+ options.fetch(:echo, true)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,88 @@
1
+ begin
2
+ require "readline"
3
+ rescue LoadError
4
+ end
5
+
6
+ class Thor
7
+ module LineEditor
8
+ class Readline < Basic
9
+ def self.available?
10
+ Object.const_defined?(:Readline)
11
+ end
12
+
13
+ def readline
14
+ if echo?
15
+ ::Readline.completion_append_character = nil
16
+ # Ruby 1.8.7 does not allow Readline.completion_proc= to receive nil.
17
+ if complete = completion_proc
18
+ ::Readline.completion_proc = complete
19
+ end
20
+ ::Readline.readline(prompt, add_to_history?)
21
+ else
22
+ super
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def add_to_history?
29
+ options.fetch(:add_to_history, true)
30
+ end
31
+
32
+ def completion_proc
33
+ if use_path_completion?
34
+ proc { |text| PathCompletion.new(text).matches }
35
+ elsif completion_options.any?
36
+ proc do |text|
37
+ completion_options.select { |option| option.start_with?(text) }
38
+ end
39
+ end
40
+ end
41
+
42
+ def completion_options
43
+ options.fetch(:limited_to, [])
44
+ end
45
+
46
+ def use_path_completion?
47
+ options.fetch(:path, false)
48
+ end
49
+
50
+ class PathCompletion
51
+ attr_reader :text
52
+ private :text
53
+
54
+ def initialize(text)
55
+ @text = text
56
+ end
57
+
58
+ def matches
59
+ relative_matches
60
+ end
61
+
62
+ private
63
+
64
+ def relative_matches
65
+ absolute_matches.map { |path| path.sub(base_path, "") }
66
+ end
67
+
68
+ def absolute_matches
69
+ Dir[glob_pattern].map do |path|
70
+ if File.directory?(path)
71
+ "#{path}/"
72
+ else
73
+ path
74
+ end
75
+ end
76
+ end
77
+
78
+ def glob_pattern
79
+ "#{base_path}#{text}*"
80
+ end
81
+
82
+ def base_path
83
+ "#{Dir.pwd}/"
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,17 @@
1
+ require "thor/line_editor/basic"
2
+ require "thor/line_editor/readline"
3
+
4
+ class Thor
5
+ module LineEditor
6
+ def self.readline(prompt, options = {})
7
+ best_available.new(prompt, options).readline
8
+ end
9
+
10
+ def self.best_available
11
+ [
12
+ Thor::LineEditor::Readline,
13
+ Thor::LineEditor::Basic
14
+ ].detect(&:available?)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,70 @@
1
+ class Thor
2
+ class Argument #:nodoc:
3
+ VALID_TYPES = [:numeric, :hash, :array, :string]
4
+
5
+ attr_reader :name, :description, :enum, :required, :type, :default, :banner
6
+ alias_method :human_name, :name
7
+
8
+ def initialize(name, options = {})
9
+ class_name = self.class.name.split("::").last
10
+
11
+ type = options[:type]
12
+
13
+ raise ArgumentError, "#{class_name} name can't be nil." if name.nil?
14
+ raise ArgumentError, "Type :#{type} is not valid for #{class_name.downcase}s." if type && !valid_type?(type)
15
+
16
+ @name = name.to_s
17
+ @description = options[:desc]
18
+ @required = options.key?(:required) ? options[:required] : true
19
+ @type = (type || :string).to_sym
20
+ @default = options[:default]
21
+ @banner = options[:banner] || default_banner
22
+ @enum = options[:enum]
23
+
24
+ validate! # Trigger specific validations
25
+ end
26
+
27
+ def usage
28
+ required? ? banner : "[#{banner}]"
29
+ end
30
+
31
+ def required?
32
+ required
33
+ end
34
+
35
+ def show_default?
36
+ case default
37
+ when Array, String, Hash
38
+ !default.empty?
39
+ else
40
+ default
41
+ end
42
+ end
43
+
44
+ protected
45
+
46
+ def validate!
47
+ raise ArgumentError, "An argument cannot be required and have default value." if required? && !default.nil?
48
+ raise ArgumentError, "An argument cannot have an enum other than an array." if @enum && !@enum.is_a?(Array)
49
+ end
50
+
51
+ def valid_type?(type)
52
+ self.class::VALID_TYPES.include?(type.to_sym)
53
+ end
54
+
55
+ def default_banner
56
+ case type
57
+ when :boolean
58
+ nil
59
+ when :string, :default
60
+ human_name.upcase
61
+ when :numeric
62
+ "N"
63
+ when :hash
64
+ "key:value"
65
+ when :array
66
+ "one two three"
67
+ end
68
+ end
69
+ end
70
+ end