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,104 @@
1
+ require "thor/actions/empty_directory"
2
+
3
+ class Thor
4
+ module Actions
5
+ # Create a new file relative to the destination root with the given data,
6
+ # which is the return value of a block or a data string.
7
+ #
8
+ # ==== Parameters
9
+ # destination<String>:: the relative path to the destination root.
10
+ # data<String|NilClass>:: the data to append to the file.
11
+ # config<Hash>:: give :verbose => false to not log the status.
12
+ #
13
+ # ==== Examples
14
+ #
15
+ # create_file "lib/fun_party.rb" do
16
+ # hostname = ask("What is the virtual hostname I should use?")
17
+ # "vhost.name = #{hostname}"
18
+ # end
19
+ #
20
+ # create_file "config/apache.conf", "your apache config"
21
+ #
22
+ def create_file(destination, *args, &block)
23
+ config = args.last.is_a?(Hash) ? args.pop : {}
24
+ data = args.first
25
+ action CreateFile.new(self, destination, block || data.to_s, config)
26
+ end
27
+ alias_method :add_file, :create_file
28
+
29
+ # CreateFile is a subset of Template, which instead of rendering a file with
30
+ # ERB, it gets the content from the user.
31
+ #
32
+ class CreateFile < EmptyDirectory #:nodoc:
33
+ attr_reader :data
34
+
35
+ def initialize(base, destination, data, config = {})
36
+ @data = data
37
+ super(base, destination, config)
38
+ end
39
+
40
+ # Checks if the content of the file at the destination is identical to the rendered result.
41
+ #
42
+ # ==== Returns
43
+ # Boolean:: true if it is identical, false otherwise.
44
+ #
45
+ def identical?
46
+ exists? && File.binread(destination) == render
47
+ end
48
+
49
+ # Holds the content to be added to the file.
50
+ #
51
+ def render
52
+ @render ||= if data.is_a?(Proc)
53
+ data.call
54
+ else
55
+ data
56
+ end
57
+ end
58
+
59
+ def invoke!
60
+ invoke_with_conflict_check do
61
+ require "fileutils"
62
+ FileUtils.mkdir_p(File.dirname(destination))
63
+ File.open(destination, "wb") { |f| f.write render }
64
+ end
65
+ given_destination
66
+ end
67
+
68
+ protected
69
+
70
+ # Now on conflict we check if the file is identical or not.
71
+ #
72
+ def on_conflict_behavior(&block)
73
+ if identical?
74
+ say_status :identical, :blue
75
+ else
76
+ options = base.options.merge(config)
77
+ force_or_skip_or_conflict(options[:force], options[:skip], &block)
78
+ end
79
+ end
80
+
81
+ # If force is true, run the action, otherwise check if it's not being
82
+ # skipped. If both are false, show the file_collision menu, if the menu
83
+ # returns true, force it, otherwise skip.
84
+ #
85
+ def force_or_skip_or_conflict(force, skip, &block)
86
+ if force
87
+ say_status :force, :yellow
88
+ yield unless pretend?
89
+ elsif skip
90
+ say_status :skip, :yellow
91
+ else
92
+ say_status :conflict, :red
93
+ force_or_skip_or_conflict(force_on_collision?, true, &block)
94
+ end
95
+ end
96
+
97
+ # Shows the file collision menu to the user and gets the result.
98
+ #
99
+ def force_on_collision?
100
+ base.shell.file_collision(destination) { render }
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,60 @@
1
+ require "thor/actions/create_file"
2
+
3
+ class Thor
4
+ module Actions
5
+ # Create a new file relative to the destination root from the given source.
6
+ #
7
+ # ==== Parameters
8
+ # destination<String>:: the relative path to the destination root.
9
+ # source<String|NilClass>:: the relative path to the source root.
10
+ # config<Hash>:: give :verbose => false to not log the status.
11
+ # :: give :symbolic => false for hard link.
12
+ #
13
+ # ==== Examples
14
+ #
15
+ # create_link "config/apache.conf", "/etc/apache.conf"
16
+ #
17
+ def create_link(destination, *args)
18
+ config = args.last.is_a?(Hash) ? args.pop : {}
19
+ source = args.first
20
+ action CreateLink.new(self, destination, source, config)
21
+ end
22
+ alias_method :add_link, :create_link
23
+
24
+ # CreateLink is a subset of CreateFile, which instead of taking a block of
25
+ # data, just takes a source string from the user.
26
+ #
27
+ class CreateLink < CreateFile #:nodoc:
28
+ attr_reader :data
29
+
30
+ # Checks if the content of the file at the destination is identical to the rendered result.
31
+ #
32
+ # ==== Returns
33
+ # Boolean:: true if it is identical, false otherwise.
34
+ #
35
+ def identical?
36
+ exists? && File.identical?(render, destination)
37
+ end
38
+
39
+ def invoke!
40
+ invoke_with_conflict_check do
41
+ require "fileutils"
42
+ FileUtils.mkdir_p(File.dirname(destination))
43
+ # Create a symlink by default
44
+ config[:symbolic] = true if config[:symbolic].nil?
45
+ File.unlink(destination) if exists?
46
+ if config[:symbolic]
47
+ File.symlink(render, destination)
48
+ else
49
+ File.link(render, destination)
50
+ end
51
+ end
52
+ given_destination
53
+ end
54
+
55
+ def exists?
56
+ super || File.symlink?(destination)
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,118 @@
1
+ require "thor/actions/empty_directory"
2
+
3
+ class Thor
4
+ module Actions
5
+ # Copies recursively the files from source directory to root directory.
6
+ # If any of the files finishes with .tt, it's considered to be a template
7
+ # and is placed in the destination without the extension .tt. If any
8
+ # empty directory is found, it's copied and all .empty_directory files are
9
+ # ignored. If any file name is wrapped within % signs, the text within
10
+ # the % signs will be executed as a method and replaced with the returned
11
+ # value. Let's suppose a doc directory with the following files:
12
+ #
13
+ # doc/
14
+ # components/.empty_directory
15
+ # README
16
+ # rdoc.rb.tt
17
+ # %app_name%.rb
18
+ #
19
+ # When invoked as:
20
+ #
21
+ # directory "doc"
22
+ #
23
+ # It will create a doc directory in the destination with the following
24
+ # files (assuming that the `app_name` method returns the value "blog"):
25
+ #
26
+ # doc/
27
+ # components/
28
+ # README
29
+ # rdoc.rb
30
+ # blog.rb
31
+ #
32
+ # <b>Encoded path note:</b> Since Thor internals use Object#respond_to? to check if it can
33
+ # expand %something%, this `something` should be a public method in the class calling
34
+ # #directory. If a method is private, Thor stack raises PrivateMethodEncodedError.
35
+ #
36
+ # ==== Parameters
37
+ # source<String>:: the relative path to the source root.
38
+ # destination<String>:: the relative path to the destination root.
39
+ # config<Hash>:: give :verbose => false to not log the status.
40
+ # If :recursive => false, does not look for paths recursively.
41
+ # If :mode => :preserve, preserve the file mode from the source.
42
+ # If :exclude_pattern => /regexp/, prevents copying files that match that regexp.
43
+ #
44
+ # ==== Examples
45
+ #
46
+ # directory "doc"
47
+ # directory "doc", "docs", :recursive => false
48
+ #
49
+ def directory(source, *args, &block)
50
+ config = args.last.is_a?(Hash) ? args.pop : {}
51
+ destination = args.first || source
52
+ action Directory.new(self, source, destination || source, config, &block)
53
+ end
54
+
55
+ class Directory < EmptyDirectory #:nodoc:
56
+ attr_reader :source
57
+
58
+ def initialize(base, source, destination = nil, config = {}, &block)
59
+ @source = File.expand_path(base.find_in_source_paths(source.to_s))
60
+ @block = block
61
+ super(base, destination, {:recursive => true}.merge(config))
62
+ end
63
+
64
+ def invoke!
65
+ base.empty_directory given_destination, config
66
+ execute!
67
+ end
68
+
69
+ def revoke!
70
+ execute!
71
+ end
72
+
73
+ protected
74
+
75
+ def execute!
76
+ lookup = Util.escape_globs(source)
77
+ lookup = config[:recursive] ? File.join(lookup, "**") : lookup
78
+ lookup = file_level_lookup(lookup)
79
+
80
+ files(lookup).sort.each do |file_source|
81
+ next if File.directory?(file_source)
82
+ next if config[:exclude_pattern] && file_source.match(config[:exclude_pattern])
83
+ file_destination = File.join(given_destination, file_source.gsub(source, "."))
84
+ file_destination.gsub!("/./", "/")
85
+
86
+ case file_source
87
+ when /\.empty_directory$/
88
+ dirname = File.dirname(file_destination).gsub(%r{/\.$}, "")
89
+ next if dirname == given_destination
90
+ base.empty_directory(dirname, config)
91
+ when /#{TEMPLATE_EXTNAME}$/
92
+ base.template(file_source, file_destination[0..-4], config, &@block)
93
+ else
94
+ base.copy_file(file_source, file_destination, config, &@block)
95
+ end
96
+ end
97
+ end
98
+
99
+ if RUBY_VERSION < "2.0"
100
+ def file_level_lookup(previous_lookup)
101
+ File.join(previous_lookup, "{*,.[a-z]*}")
102
+ end
103
+
104
+ def files(lookup)
105
+ Dir[lookup]
106
+ end
107
+ else
108
+ def file_level_lookup(previous_lookup)
109
+ File.join(previous_lookup, "*")
110
+ end
111
+
112
+ def files(lookup)
113
+ Dir.glob(lookup, File::FNM_DOTMATCH)
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,143 @@
1
+ class Thor
2
+ module Actions
3
+ # Creates an empty directory.
4
+ #
5
+ # ==== Parameters
6
+ # destination<String>:: the relative path to the destination root.
7
+ # config<Hash>:: give :verbose => false to not log the status.
8
+ #
9
+ # ==== Examples
10
+ #
11
+ # empty_directory "doc"
12
+ #
13
+ def empty_directory(destination, config = {})
14
+ action EmptyDirectory.new(self, destination, config)
15
+ end
16
+
17
+ # Class which holds create directory logic. This is the base class for
18
+ # other actions like create_file and directory.
19
+ #
20
+ # This implementation is based in Templater actions, created by Jonas Nicklas
21
+ # and Michael S. Klishin under MIT LICENSE.
22
+ #
23
+ class EmptyDirectory #:nodoc:
24
+ attr_reader :base, :destination, :given_destination, :relative_destination, :config
25
+
26
+ # Initializes given the source and destination.
27
+ #
28
+ # ==== Parameters
29
+ # base<Thor::Base>:: A Thor::Base instance
30
+ # source<String>:: Relative path to the source of this file
31
+ # destination<String>:: Relative path to the destination of this file
32
+ # config<Hash>:: give :verbose => false to not log the status.
33
+ #
34
+ def initialize(base, destination, config = {})
35
+ @base = base
36
+ @config = {:verbose => true}.merge(config)
37
+ self.destination = destination
38
+ end
39
+
40
+ # Checks if the destination file already exists.
41
+ #
42
+ # ==== Returns
43
+ # Boolean:: true if the file exists, false otherwise.
44
+ #
45
+ def exists?
46
+ ::File.exist?(destination)
47
+ end
48
+
49
+ def invoke!
50
+ invoke_with_conflict_check do
51
+ require "fileutils"
52
+ ::FileUtils.mkdir_p(destination)
53
+ end
54
+ end
55
+
56
+ def revoke!
57
+ say_status :remove, :red
58
+ require "fileutils"
59
+ ::FileUtils.rm_rf(destination) if !pretend? && exists?
60
+ given_destination
61
+ end
62
+
63
+ protected
64
+
65
+ # Shortcut for pretend.
66
+ #
67
+ def pretend?
68
+ base.options[:pretend]
69
+ end
70
+
71
+ # Sets the absolute destination value from a relative destination value.
72
+ # It also stores the given and relative destination. Let's suppose our
73
+ # script is being executed on "dest", it sets the destination root to
74
+ # "dest". The destination, given_destination and relative_destination
75
+ # are related in the following way:
76
+ #
77
+ # inside "bar" do
78
+ # empty_directory "baz"
79
+ # end
80
+ #
81
+ # destination #=> dest/bar/baz
82
+ # relative_destination #=> bar/baz
83
+ # given_destination #=> baz
84
+ #
85
+ def destination=(destination)
86
+ return unless destination
87
+ @given_destination = convert_encoded_instructions(destination.to_s)
88
+ @destination = ::File.expand_path(@given_destination, base.destination_root)
89
+ @relative_destination = base.relative_to_original_destination_root(@destination)
90
+ end
91
+
92
+ # Filenames in the encoded form are converted. If you have a file:
93
+ #
94
+ # %file_name%.rb
95
+ #
96
+ # It calls #file_name from the base and replaces %-string with the
97
+ # return value (should be String) of #file_name:
98
+ #
99
+ # user.rb
100
+ #
101
+ # The method referenced can be either public or private.
102
+ #
103
+ def convert_encoded_instructions(filename)
104
+ filename.gsub(/%(.*?)%/) do |initial_string|
105
+ method = $1.strip
106
+ base.respond_to?(method, true) ? base.send(method) : initial_string
107
+ end
108
+ end
109
+
110
+ # Receives a hash of options and just execute the block if some
111
+ # conditions are met.
112
+ #
113
+ def invoke_with_conflict_check(&block)
114
+ if exists?
115
+ on_conflict_behavior(&block)
116
+ else
117
+ yield unless pretend?
118
+ say_status :create, :green
119
+ end
120
+
121
+ destination
122
+ rescue Errno::EISDIR, Errno::EEXIST
123
+ on_file_clash_behavior
124
+ end
125
+
126
+ def on_file_clash_behavior
127
+ say_status :file_clash, :red
128
+ end
129
+
130
+ # What to do when the destination file already exists.
131
+ #
132
+ def on_conflict_behavior
133
+ say_status :exist, :blue
134
+ end
135
+
136
+ # Shortcut to say_status shell method.
137
+ #
138
+ def say_status(status, color)
139
+ base.shell.say_status status, relative_destination, color if config[:verbose]
140
+ end
141
+ end
142
+ end
143
+ end