tap 0.9.1 → 0.10.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 (244) hide show
  1. data/History +37 -30
  2. data/MIT-LICENSE +1 -1
  3. data/README +92 -44
  4. data/bin/tap +62 -75
  5. data/cmd/console.rb +42 -0
  6. data/cmd/destroy.rb +16 -0
  7. data/cmd/generate.rb +16 -0
  8. data/cmd/run.rb +126 -0
  9. data/doc/Class Reference +362 -0
  10. data/doc/Command Reference +153 -0
  11. data/doc/Tutorial +237 -0
  12. data/lib/tap.rb +6 -45
  13. data/lib/tap/app.rb +126 -500
  14. data/lib/tap/constants.rb +2 -29
  15. data/lib/tap/env.rb +555 -250
  16. data/lib/tap/file_task.rb +60 -103
  17. data/lib/tap/generator/base.rb +109 -0
  18. data/lib/tap/generator/destroy.rb +37 -0
  19. data/lib/tap/generator/generate.rb +61 -0
  20. data/lib/tap/generator/generators/command/command_generator.rb +16 -12
  21. data/lib/tap/generator/generators/command/templates/command.erb +13 -19
  22. data/lib/tap/generator/generators/config/config_generator.rb +18 -27
  23. data/lib/tap/generator/generators/config/templates/doc.erb +12 -0
  24. data/lib/tap/generator/generators/config/templates/nodoc.erb +8 -0
  25. data/lib/tap/generator/generators/file_task/file_task_generator.rb +16 -11
  26. data/lib/tap/generator/generators/file_task/templates/file.txt +11 -2
  27. data/lib/tap/generator/generators/file_task/templates/result.yml +6 -0
  28. data/lib/tap/generator/generators/file_task/templates/task.erb +24 -31
  29. data/lib/tap/generator/generators/file_task/templates/test.erb +18 -22
  30. data/lib/tap/generator/generators/root/root_generator.rb +45 -31
  31. data/lib/tap/generator/generators/root/templates/Rakefile +64 -41
  32. data/lib/tap/generator/generators/root/templates/gemspec +27 -0
  33. data/lib/tap/generator/generators/root/templates/tapfile +8 -0
  34. data/lib/tap/generator/generators/root/templates/test/tap_test_helper.rb +0 -0
  35. data/lib/tap/generator/generators/root/templates/test/tap_test_suite.rb +1 -1
  36. data/lib/tap/generator/generators/root/templates/test/tapfile_test.rb +15 -0
  37. data/lib/tap/generator/generators/task/task_generator.rb +21 -28
  38. data/lib/tap/generator/generators/task/templates/task.erb +13 -23
  39. data/lib/tap/generator/generators/task/templates/test.erb +15 -18
  40. data/lib/tap/generator/manifest.rb +14 -0
  41. data/lib/tap/patches/rake/rake_test_loader.rb +0 -0
  42. data/lib/tap/patches/rake/testtask.rb +0 -0
  43. data/lib/tap/patches/ruby19/backtrace_filter.rb +0 -0
  44. data/lib/tap/patches/ruby19/parsedate.rb +0 -0
  45. data/lib/tap/root.rb +260 -21
  46. data/lib/tap/support/aggregator.rb +11 -11
  47. data/lib/tap/support/assignments.rb +172 -0
  48. data/lib/tap/support/audit.rb +20 -18
  49. data/lib/tap/support/batchable.rb +21 -10
  50. data/lib/tap/support/batchable_class.rb +107 -0
  51. data/lib/tap/support/class_configuration.rb +154 -239
  52. data/lib/tap/support/command_line.rb +97 -102
  53. data/lib/tap/support/comment.rb +270 -0
  54. data/lib/tap/support/configurable.rb +86 -65
  55. data/lib/tap/support/configurable_class.rb +296 -0
  56. data/lib/tap/support/configuration.rb +122 -0
  57. data/lib/tap/support/constant.rb +70 -0
  58. data/lib/tap/support/constant_utils.rb +127 -0
  59. data/lib/tap/support/declarations.rb +111 -0
  60. data/lib/tap/support/executable.rb +30 -17
  61. data/lib/tap/support/executable_queue.rb +0 -0
  62. data/lib/tap/support/framework.rb +71 -0
  63. data/lib/tap/support/framework_class.rb +199 -0
  64. data/lib/tap/support/instance_configuration.rb +147 -0
  65. data/lib/tap/support/lazydoc.rb +428 -0
  66. data/lib/tap/support/manifest.rb +89 -0
  67. data/lib/tap/support/run_error.rb +0 -0
  68. data/lib/tap/support/shell_utils.rb +33 -9
  69. data/lib/tap/support/summary.rb +30 -0
  70. data/lib/tap/support/tdoc.rb +339 -134
  71. data/lib/tap/support/tdoc/tdoc_html_generator.rb +0 -0
  72. data/lib/tap/support/tdoc/tdoc_html_template.rb +0 -0
  73. data/lib/tap/support/templater.rb +180 -0
  74. data/lib/tap/support/validation.rb +409 -76
  75. data/lib/tap/support/versions.rb +5 -3
  76. data/lib/tap/task.rb +78 -174
  77. data/lib/tap/tasks/dump.rb +56 -0
  78. data/lib/tap/tasks/rake.rb +93 -0
  79. data/lib/tap/test.rb +3 -3
  80. data/lib/tap/test/env_vars.rb +2 -2
  81. data/lib/tap/test/file_methods.rb +19 -20
  82. data/lib/tap/test/script_methods.rb +144 -0
  83. data/lib/tap/test/subset_methods.rb +1 -1
  84. data/lib/tap/test/tap_methods.rb +28 -62
  85. data/lib/tap/workflow.rb +22 -39
  86. metadata +48 -179
  87. data/Basic Overview +0 -151
  88. data/Command Reference +0 -99
  89. data/Rakefile +0 -127
  90. data/Tutorial +0 -287
  91. data/lib/tap/cmd/console.rb +0 -31
  92. data/lib/tap/cmd/destroy.rb +0 -20
  93. data/lib/tap/cmd/generate.rb +0 -20
  94. data/lib/tap/cmd/run.rb +0 -151
  95. data/lib/tap/dump.rb +0 -57
  96. data/lib/tap/generator.rb +0 -91
  97. data/lib/tap/generator/generators/command/USAGE +0 -6
  98. data/lib/tap/generator/generators/config/USAGE +0 -21
  99. data/lib/tap/generator/generators/config/templates/config.erb +0 -1
  100. data/lib/tap/generator/generators/file_task/USAGE +0 -3
  101. data/lib/tap/generator/generators/file_task/templates/file.yml +0 -3
  102. data/lib/tap/generator/generators/generator/USAGE +0 -0
  103. data/lib/tap/generator/generators/generator/generator_generator.rb +0 -21
  104. data/lib/tap/generator/generators/generator/templates/generator.erb +0 -32
  105. data/lib/tap/generator/generators/generator/templates/usage.erb +0 -1
  106. data/lib/tap/generator/generators/root/USAGE +0 -0
  107. data/lib/tap/generator/generators/root/templates/ReadMe.txt +0 -0
  108. data/lib/tap/generator/generators/root/templates/tap.yml +0 -80
  109. data/lib/tap/generator/generators/task/USAGE +0 -3
  110. data/lib/tap/generator/generators/workflow/USAGE +0 -0
  111. data/lib/tap/generator/generators/workflow/templates/task.erb +0 -16
  112. data/lib/tap/generator/generators/workflow/templates/test.erb +0 -7
  113. data/lib/tap/generator/generators/workflow/workflow_generator.rb +0 -6
  114. data/lib/tap/generator/options.rb +0 -26
  115. data/lib/tap/generator/usage.rb +0 -26
  116. data/lib/tap/support/batchable_methods.rb +0 -34
  117. data/lib/tap/support/command_line_methods.rb +0 -76
  118. data/lib/tap/support/configurable_methods.rb +0 -224
  119. data/lib/tap/support/logger.rb +0 -88
  120. data/lib/tap/support/rake.rb +0 -43
  121. data/lib/tap/support/tdoc/config_attr.rb +0 -362
  122. data/test/app/config/another/task.yml +0 -1
  123. data/test/app/config/batch.yml +0 -2
  124. data/test/app/config/empty.yml +0 -0
  125. data/test/app/config/erb.yml +0 -2
  126. data/test/app/config/some/task.yml +0 -1
  127. data/test/app/config/template.yml +0 -2
  128. data/test/app/config/version-0.1.yml +0 -1
  129. data/test/app/config/version.yml +0 -1
  130. data/test/app/lib/app_test_task.rb +0 -3
  131. data/test/app_test.rb +0 -1849
  132. data/test/env/test_configure/recurse_a.yml +0 -2
  133. data/test/env/test_configure/recurse_b.yml +0 -2
  134. data/test/env/test_configure/tap.yml +0 -23
  135. data/test/env/test_load_env_config/dir/tap.yml +0 -3
  136. data/test/env/test_load_env_config/recurse_a.yml +0 -2
  137. data/test/env/test_load_env_config/recurse_b.yml +0 -2
  138. data/test/env/test_load_env_config/tap.yml +0 -3
  139. data/test/env_test.rb +0 -198
  140. data/test/file_task/config/batch.yml +0 -2
  141. data/test/file_task/config/configured.yml +0 -1
  142. data/test/file_task/old_file_one.txt +0 -0
  143. data/test/file_task/old_file_two.txt +0 -0
  144. data/test/file_task_test.rb +0 -1291
  145. data/test/root/alt_lib/alt_module.rb +0 -4
  146. data/test/root/file.txt +0 -0
  147. data/test/root/glob/one.txt +0 -0
  148. data/test/root/glob/two.txt +0 -0
  149. data/test/root/lib/absolute_alt_filepath.rb +0 -2
  150. data/test/root/lib/alternative_filepath.rb +0 -2
  151. data/test/root/lib/another_module.rb +0 -2
  152. data/test/root/lib/nested/some_module.rb +0 -4
  153. data/test/root/lib/no_module_included.rb +0 -0
  154. data/test/root/lib/some/module.rb +0 -4
  155. data/test/root/lib/some_class.rb +0 -2
  156. data/test/root/lib/some_module.rb +0 -3
  157. data/test/root/load_path/load_path_module.rb +0 -2
  158. data/test/root/load_path/skip_module.rb +0 -2
  159. data/test/root/mtime/older.txt +0 -0
  160. data/test/root/unload/full_path.rb +0 -2
  161. data/test/root/unload/loaded_by_nested.rb +0 -2
  162. data/test/root/unload/nested/nested_load.rb +0 -6
  163. data/test/root/unload/nested/nested_with_ext.rb +0 -4
  164. data/test/root/unload/nested/relative_path.rb +0 -4
  165. data/test/root/unload/older.rb +0 -2
  166. data/test/root/unload/unload_base.rb +0 -9
  167. data/test/root/versions/another.yml +0 -0
  168. data/test/root/versions/file-0.1.2.yml +0 -0
  169. data/test/root/versions/file-0.1.yml +0 -0
  170. data/test/root/versions/file.yml +0 -0
  171. data/test/root_test.rb +0 -718
  172. data/test/support/aggregator_test.rb +0 -99
  173. data/test/support/audit_test.rb +0 -445
  174. data/test/support/batchable_test.rb +0 -74
  175. data/test/support/class_configuration_test.rb +0 -331
  176. data/test/support/command_line_test.rb +0 -58
  177. data/test/support/configurable/config/configured.yml +0 -2
  178. data/test/support/configurable_test.rb +0 -295
  179. data/test/support/executable_queue_test.rb +0 -103
  180. data/test/support/executable_test.rb +0 -38
  181. data/test/support/logger_test.rb +0 -31
  182. data/test/support/rake_test.rb +0 -37
  183. data/test/support/shell_utils_test.rb +0 -24
  184. data/test/support/tdoc_test.rb +0 -370
  185. data/test/support/validation_test.rb +0 -54
  186. data/test/support/versions_test.rb +0 -103
  187. data/test/tap_test_helper.rb +0 -57
  188. data/test/tap_test_suite.rb +0 -7
  189. data/test/task/config/batch.yml +0 -2
  190. data/test/task/config/batched.yml +0 -2
  191. data/test/task/config/configured.yml +0 -1
  192. data/test/task/config/example.yml +0 -1
  193. data/test/task_base_test.rb +0 -24
  194. data/test/task_syntax_test.rb +0 -300
  195. data/test/task_test.rb +0 -320
  196. data/test/test/env_vars_test.rb +0 -48
  197. data/test/test/file_methods/test_assert_files/expected/one.txt +0 -1
  198. data/test/test/file_methods/test_assert_files/expected/two.txt +0 -1
  199. data/test/test/file_methods/test_assert_files/input/one.txt +0 -1
  200. data/test/test/file_methods/test_assert_files/input/two.txt +0 -1
  201. data/test/test/file_methods/test_assert_files_can_have_no_expected_files_if_specified/input/one.txt +0 -1
  202. data/test/test/file_methods/test_assert_files_can_have_no_expected_files_if_specified/input/two.txt +0 -1
  203. data/test/test/file_methods/test_assert_files_fails_for_different_content/expected/one.txt +0 -1
  204. data/test/test/file_methods/test_assert_files_fails_for_different_content/expected/two.txt +0 -1
  205. data/test/test/file_methods/test_assert_files_fails_for_different_content/input/one.txt +0 -1
  206. data/test/test/file_methods/test_assert_files_fails_for_different_content/input/two.txt +0 -1
  207. data/test/test/file_methods/test_assert_files_fails_for_missing_expected_file/expected/one.txt +0 -1
  208. data/test/test/file_methods/test_assert_files_fails_for_missing_expected_file/input/one.txt +0 -1
  209. data/test/test/file_methods/test_assert_files_fails_for_missing_expected_file/input/two.txt +0 -1
  210. data/test/test/file_methods/test_assert_files_fails_for_missing_output_file/expected/one.txt +0 -1
  211. data/test/test/file_methods/test_assert_files_fails_for_missing_output_file/expected/two.txt +0 -1
  212. data/test/test/file_methods/test_assert_files_fails_for_missing_output_file/input/one.txt +0 -1
  213. data/test/test/file_methods/test_assert_files_fails_for_missing_output_file/input/two.txt +0 -1
  214. data/test/test/file_methods/test_assert_files_fails_for_no_expected_files/input/one.txt +0 -1
  215. data/test/test/file_methods/test_assert_files_fails_for_no_expected_files/input/two.txt +0 -1
  216. data/test/test/file_methods/test_method_glob/expected/file.yml +0 -0
  217. data/test/test/file_methods/test_method_glob/expected/file_1.txt +0 -0
  218. data/test/test/file_methods/test_method_glob/expected/file_2.txt +0 -0
  219. data/test/test/file_methods_doc/test_sub/expected/one.txt +0 -1
  220. data/test/test/file_methods_doc/test_sub/expected/two.txt +0 -1
  221. data/test/test/file_methods_doc/test_sub/input/one.txt +0 -1
  222. data/test/test/file_methods_doc/test_sub/input/two.txt +0 -1
  223. data/test/test/file_methods_doc_test.rb +0 -29
  224. data/test/test/file_methods_test.rb +0 -275
  225. data/test/test/subset_methods_test.rb +0 -171
  226. data/test/test/tap_methods/test_assert_files/expected/task/name/a.txt +0 -1
  227. data/test/test/tap_methods/test_assert_files/expected/task/name/b.txt +0 -1
  228. data/test/test/tap_methods/test_assert_files/input/a.txt +0 -1
  229. data/test/test/tap_methods/test_assert_files/input/b.txt +0 -1
  230. data/test/test/tap_methods_test.rb +0 -399
  231. data/test/workflow_test.rb +0 -120
  232. data/vendor/rails_generator.rb +0 -56
  233. data/vendor/rails_generator/base.rb +0 -263
  234. data/vendor/rails_generator/commands.rb +0 -581
  235. data/vendor/rails_generator/generated_attribute.rb +0 -42
  236. data/vendor/rails_generator/lookup.rb +0 -209
  237. data/vendor/rails_generator/manifest.rb +0 -53
  238. data/vendor/rails_generator/options.rb +0 -143
  239. data/vendor/rails_generator/scripts.rb +0 -83
  240. data/vendor/rails_generator/scripts/destroy.rb +0 -7
  241. data/vendor/rails_generator/scripts/generate.rb +0 -7
  242. data/vendor/rails_generator/scripts/update.rb +0 -12
  243. data/vendor/rails_generator/simple_logger.rb +0 -46
  244. data/vendor/rails_generator/spec.rb +0 -44
@@ -1,32 +0,0 @@
1
- class <%= class_name_without_nesting %>Generator < Rails::Generator::NamedBase
2
- attr_accessor :app
3
-
4
- def initialize(*args)
5
- super(*args)
6
- @app = Tap::App.instance
7
- @destination_root = app[:root]
8
- end
9
-
10
- def manifest
11
- record do |m|
12
- # Use statements like these to make directories you need.
13
- # Note directories will be created relative to @destination_root (ie app[:root])
14
- target_dir = 'target'
15
- m.directory target_dir
16
-
17
- # These statements use the templates to create the following files:
18
- # templates/ruby_file.erb => target_dir/class_name.rb
19
- # templates/text_file.erb => target_dir/class_name.txt
20
- #
21
- # In templates, use class_name_without_nesting in conjunction with
22
- # the :class_nesting option to properly indent nested classes, like:
23
- #
24
- # [ruby_file.erb]
25
- # class <%= class_name_without_nesting %>
26
- # end
27
- #
28
- m.template "ruby_file.erb", File.join(target_dir, class_name.underscore + ".rb"), :class_nesting => class_nesting
29
- m.template "text_file.erb", File.join(target_dir, class_name.underscore + ".txt")
30
- end
31
- end
32
- end
@@ -1 +0,0 @@
1
- <%= class_name %> Usage
File without changes
@@ -1,80 +0,0 @@
1
- ######################################################
2
- # App Configurations:
3
- #
4
- # These are configurations that directly affect the application,
5
- # including the directory structure options, and logging.
6
- #
7
- ######################################################
8
-
9
- # You can set an alternate root, but this is
10
- # an odd and perhaps unwise thing to do
11
- #root:
12
-
13
- # Specify aliases for directories relative to root.
14
- #directories:
15
- #lib: path/to/lib
16
- #lib/generators: path/to/lib/generators
17
- #...
18
-
19
- # Specify aliases for absolute paths
20
- #absolute_paths:
21
- #log: /path/to/logs
22
- #...
23
-
24
- # Specify options
25
- #options:
26
- #debug: true # full error output, increased logging
27
- #quiet: true # supresses logging
28
- #... # you can add your own options
29
-
30
- # Specify logging options
31
- #logger:
32
- #device: # STDOUT by default
33
- #level: 1 # [DEBUG, INFO, WARN, ERROR, FATAL, ANY]
34
- #datetime_format: %H:%M:%S # Hour:Minute:Second
35
-
36
- # Map task names to task classes here. The example causes
37
- # app.task('some/task_name') to intialize a Tap::FileTask
38
- # with that name. Any number of mappings can be specified.
39
- #map:
40
- # some/task_name: Tap::FileTask
41
- # CapsAreOk: Tap::Task
42
-
43
- ######################################################
44
- # Environment Configurations:
45
- #
46
- # These are configurations that affect the execution environment
47
- # for Tap and are NOT passed to the application itself.
48
- #
49
- # All paths are resolved to the directories setup above.
50
- #
51
- ######################################################
52
-
53
- # Designate load paths here for automatic loading of modules
54
- # through the active_support Dependencies module.
55
- # load_paths are also added to $LOAD_PATH.
56
- #load_paths:
57
- # - lib
58
-
59
- # Specifies load_once_paths for Dependencies.
60
- #load_once_paths:
61
-
62
- # Designate paths for discovering and executing commands.
63
- #command_paths:
64
- # - cmd
65
-
66
- # Designate paths for discovering generators.
67
- #generator_paths:
68
- # - lib/generators
69
-
70
- # Specify gems to add to the environment. Versions may be specified.
71
- #gems:
72
- # - gem_name
73
- # - gem_with_version > 1.0.0
74
-
75
- # Specify code to execute before and after Tap executes
76
- #before: |
77
- # puts "beginning..."
78
- # Tap::Env.instance.discover_gems
79
- #after: |
80
- # puts "done!"
@@ -1,3 +0,0 @@
1
- Description:
2
- Generates a new Task and test files. Pass the task name,
3
- either CamelCased or under_scored.
File without changes
@@ -1,16 +0,0 @@
1
- # == Description
2
- #
3
- # === Usage
4
- # Replace with your command line usage instructions
5
- #
6
- class <%= class_name_without_nesting %> < Tap::Workflow
7
- protected
8
-
9
- def workflow
10
- # Define the workflow entry and exit points,
11
- # as well as the workflow logic.
12
- self.entry_point = Tap::Task.new
13
-
14
- # app.sequence(entry_point, 'another/task')
15
- end
16
- end
@@ -1,7 +0,0 @@
1
- require File.join(File.dirname(__FILE__), '<%= '../' * class_nesting_depth %>tap_test_helper.rb')
2
- require '<%= class_path.empty? ? file_name : File.join(class_path, file_name) %>'
3
-
4
- class <%= class_name %>Test < Test::Unit::TestCase
5
- acts_as_tap_test
6
-
7
- end
@@ -1,6 +0,0 @@
1
- require 'tap/generator/generators/task/task_generator'
2
-
3
- module Tap::Generator::Generators
4
- class WorkflowGenerator < TaskGenerator # :nodoc:
5
- end
6
- end
@@ -1,26 +0,0 @@
1
- module Tap
2
- module Generator
3
- module Options # :nodoc:
4
- protected
5
-
6
- # Adapted from code in 'rails/rails_generator/options.rb'
7
- def add_general_options!(opt)
8
- opt.separator ''
9
- opt.separator 'General Options:'
10
-
11
- opt.on('-h', '--help', 'Show this help message and quit.') { |v| options[:help] = v }
12
- opt.on('-p', '--pretend', 'Run but do not make any changes.') { |v| options[:pretend] = v }
13
- opt.on('-f', '--force', 'Overwrite files that already exist.') { options[:collision] = :force }
14
- opt.on('-s', '--skip', 'Skip files that already exist.') { options[:collision] = :skip }
15
- opt.on('-q', '--quiet', 'Suppress normal output.') { |v| options[:quiet] = v }
16
- opt.on('-t', '--backtrace', 'Debugging: show backtrace on errors.') { |v| options[:backtrace] = v }
17
- opt.on('-c', '--svn', 'Modify files with subversion. (Note: svn must be in path)') do
18
- options[:svn] = `svn status`.inject({}) do |opt, e|
19
- opt[e.chomp[7..-1]] = true
20
- opt
21
- end
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,26 +0,0 @@
1
- require 'tap/generator/options'
2
-
3
- module Tap
4
- module Generator
5
- module Usage # :nodoc:
6
- include Options
7
-
8
- protected
9
-
10
- # Adapted from code in 'rails/rails_generator/scripts.rb'
11
- def usage_message
12
- usage = "\nInstalled Generators\n"
13
- Rails::Generator::Base.sources.each do |source|
14
- label = source.label.to_s.capitalize
15
- names = source.names
16
- usage << " #{label}: #{names.join(', ')}\n" unless names.empty?
17
- end
18
-
19
- usage << <<end_blurb
20
-
21
- end_blurb
22
- return usage
23
- end
24
- end
25
- end
26
- end
@@ -1,34 +0,0 @@
1
- module Tap
2
- module Support
3
-
4
- # BatchableMethods encapsulates class methods related to Batchable.
5
- module BatchableMethods
6
-
7
- # Merges the batches for the specified objects. All objects
8
- # sharing the individual object batches will be affected, even
9
- # if they are not listed explicitly as an input.
10
- #
11
- # t1 = Tap::Task.new
12
- # t2 = Tap::Task.new
13
- # t3 = t2.initialize_batch_obj
14
- #
15
- # Batchable.batch(t1, t2)
16
- # t3.batch # => [t1,t2,t3]
17
- #
18
- # Returns the new batch.
19
- def batch(*batchables)
20
- merged = []
21
- batches = batchables.collect {|batchable| batchable.batch }.uniq
22
- batches.each do |batch|
23
- merged.concat(batch)
24
- batch.clear
25
- end
26
- merged.uniq!
27
- batches.each {|batch| batch.concat(merged) }
28
- merged
29
- end
30
-
31
- end
32
-
33
- end
34
- end
@@ -1,76 +0,0 @@
1
- module Tap
2
- module Support
3
- autoload(:TDoc, 'tap/support/tdoc')
4
- autoload(:CommandLine, 'tap/support/command_line')
5
-
6
- # Under Construction
7
- module CommandLineMethods
8
-
9
- # Returns the TDoc documentation for self.
10
- def tdoc
11
- @tdoc ||= Tap::Support::TDoc[self]
12
- end
13
-
14
- # EXPERIMENTAL
15
- def help(opts=configurations.to_opts)
16
- return "could not find help for '#{self}'" if tdoc == nil
17
-
18
- sections = tdoc.comment_sections(/Description|Usage/i, true)
19
- %Q{#{self}
20
- #{sections["Description"]}
21
- Usage:
22
- #{sections["Usage"]}
23
- Options:
24
- #{Tap::Support::CommandLine.usage_options(opts)}
25
-
26
- }
27
- end
28
-
29
- # EXPERIMENTAL
30
- def argv_enq(app=App.instance, &block)
31
- if block_given?
32
- @argv_enq_block = block
33
- return
34
- end
35
- return @argv_enq_block.call(app) if @argv_enq_block ||= nil
36
-
37
- config = {}
38
- opts = configurations.to_opts
39
- opts << ['--help', nil, GetoptLong::NO_ARGUMENT, "Print this help."]
40
- opts << ['--debug', nil, GetoptLong::NO_ARGUMENT, "Trace execution and debug"]
41
- opts << ['--use', nil, GetoptLong::REQUIRED_ARGUMENT, "Loads inputs from file."]
42
- opts << ['--iterate', nil, GetoptLong::NO_ARGUMENT, "Iterates over inputs."]
43
-
44
- iterate = false
45
- Tap::Support::CommandLine.handle_options(*opts) do |opt, value|
46
- case opt
47
- when '--help'
48
- puts help(opts)
49
- exit
50
-
51
- when '--debug'
52
- app.options.debug = true
53
-
54
- when '--use'
55
- hash = YAML.load_file(value)
56
- hash.values.each do |args|
57
- ARGV.concat(args)
58
- end
59
-
60
- when '--iterate'
61
- iterate = true
62
-
63
- else
64
- key = configurations.opt_map(opt)
65
- config[key] = YAML.load(value)
66
- end
67
- end
68
-
69
- # instantiate and configure task
70
- task = new(ARGV.shift, config, app)
71
- iterate ? ARGV.each {|input| task.enq(input) } : task.enq(*ARGV)
72
- end
73
- end
74
-
75
- end
76
- end
@@ -1,224 +0,0 @@
1
- module Tap
2
- module Support
3
-
4
- # ConfigurableMethods encapsulates all class methods used to declare
5
- # configurations in Tasks. ConfigurableMethods extends classes that
6
- # include Tap::Support::Configurable.
7
- #
8
- # class ConfigurableClass
9
- # include Configurable
10
- #
11
- # config :one, 'one'
12
- # config :two, 'two'
13
- # config :three, 'three'
14
- # end
15
- #
16
- # ConfigurableClass.new.config # => {:one => 'one', :two => 'two', :three => 'three'}
17
- #
18
- # See the 'Configuration' section in the Tap::Task documentation for
19
- # more details on how Configurable works in practice.
20
- module ConfigurableMethods
21
-
22
- # A Tap::Support::ClassConfiguration holding the class configurations.
23
- attr_reader :configurations
24
-
25
- # When subclassed, the configurations are duplicated and passed to
26
- # the child class where they can be extended/modified without affecting
27
- # the configurations of the parent class.
28
- def inherited(child)
29
- super
30
- child.instance_variable_set(:@configurations, ClassConfiguration.new(child, @configurations))
31
- child.instance_variable_set(:@source_files, source_files.dup)
32
- end
33
-
34
- # EXPERIMENTAL
35
- attr_reader :source_files # :nodoc:
36
-
37
- # EXPERIMENTAL
38
- # Identifies source files for TDoc documentation.
39
- def source_file(arg) # :nodoc:
40
- source_files << arg
41
- end
42
-
43
- # Declares a configuration without any accessors.
44
- #
45
- # With no keys specified, sets config to make no
46
- # accessors for each new configuration.
47
- def declare_config(*keys)
48
- if keys.empty?
49
- self.config_mode = :none
50
- else
51
- keys.each {|key| configurations.add(key)}
52
- end
53
- end
54
-
55
- # Creates a configuration writer for the input keys. Works like
56
- # attr_writer, except the value is written to config, rather than
57
- # a local variable. In addition, the config will be validated
58
- # using validate_config upon setting the value.
59
- #
60
- # With no keys specified, sets config to create config_writer
61
- # for each new configuration.
62
- def config_writer(*keys)
63
- if keys.empty?
64
- self.config_mode = :config_writer
65
- else
66
- keys.each do |key|
67
- configurations.add(key)
68
- define_config_writer(key)
69
- end
70
- end
71
- end
72
-
73
- # Creates a configuration reader for the input keys. Works like
74
- # attr_reader, except the value is read from config, rather than
75
- # a local variable.
76
- #
77
- # With no keys specified, sets config to create a config_reader
78
- # for each new configuration.
79
- def config_reader(*keys)
80
- if keys.empty?
81
- self.config_mode = :config_reader
82
- else
83
- keys.each do |key|
84
- configurations.add(key)
85
- define_config_reader(key)
86
- end
87
- end
88
- end
89
-
90
- # Creates configuration accessors for the input keys. Works like
91
- # attr_accessor, except the value is read from and written to config,
92
- # rather than a local variable.
93
- #
94
- # With no keys specified, sets config to create a config_accessor
95
- # for each new configuration.
96
- def config_accessor(*keys)
97
- if keys.empty?
98
- self.config_mode = :config_accessor
99
- else
100
- keys.each do |key|
101
- configurations.add(key)
102
- define_config_reader(key)
103
- define_config_writer(key)
104
- end
105
- end
106
- end
107
-
108
- # Sets a class configuration. Configurations are inherited, but can
109
- # be overridden or added in subclasses. Accessors are created by
110
- # default, but this behavior can be modified by use of the other
111
- # config methods.
112
- #
113
- # class SampleClass
114
- # include Configurable
115
- #
116
- # config :key, 'value'
117
- # config_reader
118
- # config :reader_only
119
- # end
120
- #
121
- # t = SampleClass.new
122
- # t.respond_to?(:reader_only) # => true
123
- # t.respond_to?(:reader_only=) # => false
124
- #
125
- # t.config # => {:key => 'value', :reader_only => nil}
126
- # t.key # => 'value'
127
- # t.key = 'another'
128
- # t.config # => {:key => 'another', :reader_only => nil}
129
- #
130
- # A block can be specified for validation/pre-processing. All inputs
131
- # set through the config accessors, as well as the instance config=
132
- # method are processed by the block before they set the value in the
133
- # config hash. The config value will be set to the return of the block.
134
- #
135
- # The Tap::Support::Validation module provides methods to perform
136
- # common checks and transformations. These can be accessed through
137
- # the class method 'c':
138
- #
139
- # class ValidatingClass
140
- # include Configurable
141
- #
142
- # config :one, 'one', &c.check(String)
143
- # config :two, 'two' do |v|
144
- # v.upcase
145
- # end
146
- # end
147
- #
148
- # t = ValidatingClass.new
149
- #
150
- # # note the default values ARE processed
151
- # t.config # => {:one => 'one', :two => 'TWO'}
152
- # t.one = 1 # => ValidationError
153
- # t.config = {:one => 1} # => ValidationError
154
- #
155
- # t.config = {:one => 'str', :two => 'str'}
156
- # t.config # => {:one => 'str', :two => 'STR'}
157
- #
158
- def config(key, value=nil, &validation)
159
- configurations.add(key, value, &validation)
160
-
161
- case config_mode
162
- when :config_accessor
163
- define_config_writer(key)
164
- define_config_reader(key)
165
- when :config_writer
166
- define_config_writer(key)
167
- when :config_reader
168
- define_config_reader(key)
169
- end
170
- end
171
-
172
- def config_merge(klass)
173
- configurations.merge(klass.configurations) do |key|
174
- case config_mode
175
- when :config_accessor
176
- define_config_writer(key)
177
- define_config_reader(key)
178
- when :config_writer
179
- define_config_writer(key)
180
- when :config_reader
181
- define_config_reader(key)
182
- end
183
- end
184
- end
185
-
186
- # Returns the default name for the class: class.to_s.underscore
187
- def default_name
188
- @default_name ||= to_s.underscore
189
- end
190
-
191
- protected
192
-
193
- attr_writer :config_mode
194
-
195
- # Tracks the current configuration mode, to determine what
196
- # in any accessors should be generated for the configuration.
197
- # (default :config_accessor)
198
- def config_mode
199
- @config_mode ||= :config_accessor
200
- end
201
-
202
- # Alias for Tap::Support::Validation
203
- def c
204
- Validation
205
- end
206
-
207
- private
208
-
209
- def define_config_reader(name, key=name) # :nodoc:
210
- key = key.to_sym
211
- define_method(name) do
212
- config[key]
213
- end
214
- end
215
-
216
- def define_config_writer(name, key=name) # :nodoc:
217
- key = key.to_sym
218
- define_method("#{name}=") do |value|
219
- set_config(key, value)
220
- end
221
- end
222
- end
223
- end
224
- end