tap 0.9.1 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
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,42 +0,0 @@
1
- require 'optparse'
2
-
3
- module Rails
4
- module Generator
5
- class GeneratedAttribute
6
- attr_accessor :name, :type, :column
7
-
8
- def initialize(name, type)
9
- @name, @type = name, type.to_sym
10
- @column = ActiveRecord::ConnectionAdapters::Column.new(name, nil, @type)
11
- end
12
-
13
- def field_type
14
- @field_type ||= case type
15
- when :integer, :float, :decimal then :text_field
16
- when :datetime, :timestamp, :time then :datetime_select
17
- when :date then :date_select
18
- when :string then :text_field
19
- when :text then :text_area
20
- when :boolean then :check_box
21
- else
22
- :text_field
23
- end
24
- end
25
-
26
- def default
27
- @default ||= case type
28
- when :integer then 1
29
- when :float then 1.5
30
- when :decimal then "9.99"
31
- when :datetime, :timestamp, :time then Time.now.to_s(:db)
32
- when :date then Date.today.to_s(:db)
33
- when :string then "MyString"
34
- when :text then "MyText"
35
- when :boolean then false
36
- else
37
- ""
38
- end
39
- end
40
- end
41
- end
42
- end
@@ -1,209 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec'
2
-
3
- class Object
4
- class << self
5
- # Lookup missing generators using const_missing. This allows any
6
- # generator to reference another without having to know its location:
7
- # RubyGems, ~/.rails/generators, and RAILS_ROOT/generators.
8
- def lookup_missing_generator(class_id)
9
- if md = /(.+)Generator$/.match(class_id.to_s)
10
- name = md.captures.first.demodulize.underscore
11
- Rails::Generator::Base.lookup(name).klass
12
- else
13
- const_missing_before_generators(class_id)
14
- end
15
- end
16
-
17
- unless respond_to?(:const_missing_before_generators)
18
- alias_method :const_missing_before_generators, :const_missing
19
- alias_method :const_missing, :lookup_missing_generator
20
- end
21
- end
22
- end
23
-
24
- # User home directory lookup adapted from RubyGems.
25
- def Dir.user_home
26
- if ENV['HOME']
27
- ENV['HOME']
28
- elsif ENV['USERPROFILE']
29
- ENV['USERPROFILE']
30
- elsif ENV['HOMEDRIVE'] and ENV['HOMEPATH']
31
- "#{ENV['HOMEDRIVE']}:#{ENV['HOMEPATH']}"
32
- else
33
- File.expand_path '~'
34
- end
35
- end
36
-
37
-
38
- module Rails
39
- module Generator
40
-
41
- # Generator lookup is managed by a list of sources which return specs
42
- # describing where to find and how to create generators. This module
43
- # provides class methods for manipulating the source list and looking up
44
- # generator specs, and an #instance wrapper for quickly instantiating
45
- # generators by name.
46
- #
47
- # A spec is not a generator: it's a description of where to find
48
- # the generator and how to create it. A source is anything that
49
- # yields generators from #each. PathSource and GemSource are provided.
50
- module Lookup
51
- def self.included(base)
52
- base.extend(ClassMethods)
53
- base.use_component_sources!
54
- end
55
-
56
- # Convenience method to instantiate another generator.
57
- def instance(generator_name, args, runtime_options = {})
58
- self.class.instance(generator_name, args, runtime_options)
59
- end
60
-
61
- module ClassMethods
62
- # The list of sources where we look, in order, for generators.
63
- def sources
64
- read_inheritable_attribute(:sources) or use_component_sources!
65
- end
66
-
67
- # Add a source to the end of the list.
68
- def append_sources(*args)
69
- sources.concat(args.flatten)
70
- invalidate_cache!
71
- end
72
-
73
- # Add a source to the beginning of the list.
74
- def prepend_sources(*args)
75
- write_inheritable_array(:sources, args.flatten + sources)
76
- invalidate_cache!
77
- end
78
-
79
- # Reset the source list.
80
- def reset_sources
81
- write_inheritable_attribute(:sources, [])
82
- invalidate_cache!
83
- end
84
-
85
- # Use application generators (app, ?).
86
- def use_application_sources!
87
- reset_sources
88
- sources << PathSource.new(:builtin, "#{File.dirname(__FILE__)}/generators/applications")
89
- end
90
-
91
- # Use component generators (model, controller, etc).
92
- # 1. Rails application. If RAILS_ROOT is defined we know we're
93
- # generating in the context of a Rails application, so search
94
- # RAILS_ROOT/generators.
95
- # 2. User home directory. Search ~/.rails/generators.
96
- # 3. RubyGems. Search for gems named *_generator.
97
- # 4. Builtins. Model, controller, mailer, scaffold.
98
- def use_component_sources!
99
- reset_sources
100
- if defined? ::RAILS_ROOT
101
- sources << PathSource.new(:lib, "#{::RAILS_ROOT}/lib/generators")
102
- sources << PathSource.new(:vendor, "#{::RAILS_ROOT}/vendor/generators")
103
- sources << PathSource.new(:plugins, "#{::RAILS_ROOT}/vendor/plugins/**/generators")
104
- end
105
- sources << PathSource.new(:user, "#{Dir.user_home}/.rails/generators")
106
- sources << GemSource.new if Object.const_defined?(:Gem)
107
- sources << PathSource.new(:builtin, "#{File.dirname(__FILE__)}/generators/components")
108
- end
109
-
110
- # Lookup knows how to find generators' Specs from a list of Sources.
111
- # Searches the sources, in order, for the first matching name.
112
- def lookup(generator_name)
113
- @found ||= {}
114
- generator_name = generator_name.to_s.downcase
115
- @found[generator_name] ||= cache.find { |spec| spec.name == generator_name }
116
- unless @found[generator_name]
117
- chars = generator_name.scan(/./).map{|c|"#{c}.*?"}
118
- rx = /^#{chars}$/
119
- gns = cache.select{|spec| spec.name =~ rx }
120
- @found[generator_name] ||= gns.first if gns.length == 1
121
- raise GeneratorError, "Pattern '#{generator_name}' matches more than one generator: #{gns.map{|sp|sp.name}.join(', ')}" if gns.length > 1
122
- end
123
- @found[generator_name] or raise GeneratorError, "Couldn't find '#{generator_name}' generator"
124
- end
125
-
126
- # Convenience method to lookup and instantiate a generator.
127
- def instance(generator_name, args = [], runtime_options = {})
128
- lookup(generator_name).klass.new(args, full_options(runtime_options))
129
- end
130
-
131
- private
132
- # Lookup and cache every generator from the source list.
133
- def cache
134
- @cache ||= sources.inject([]) { |cache, source| cache + source.map }
135
- end
136
-
137
- # Clear the cache whenever the source list changes.
138
- def invalidate_cache!
139
- @cache = nil
140
- end
141
- end
142
- end
143
-
144
- # Sources enumerate (yield from #each) generator specs which describe
145
- # where to find and how to create generators. Enumerable is mixed in so,
146
- # for example, source.collect will retrieve every generator.
147
- # Sources may be assigned a label to distinguish them.
148
- class Source
149
- include Enumerable
150
-
151
- attr_reader :label
152
- def initialize(label)
153
- @label = label
154
- end
155
-
156
- # The each method must be implemented in subclasses.
157
- # The base implementation raises an error.
158
- def each
159
- raise NotImplementedError
160
- end
161
-
162
- # Return a convenient sorted list of all generator names.
163
- def names
164
- map { |spec| spec.name }.sort
165
- end
166
- end
167
-
168
-
169
- # PathSource looks for generators in a filesystem directory.
170
- class PathSource < Source
171
- attr_reader :path
172
-
173
- def initialize(label, path)
174
- super label
175
- @path = path
176
- end
177
-
178
- # Yield each eligible subdirectory.
179
- def each
180
- Dir["#{path}/[a-z]*"].each do |dir|
181
- if File.directory?(dir)
182
- yield Spec.new(File.basename(dir), dir, label)
183
- end
184
- end
185
- end
186
- end
187
-
188
-
189
- # GemSource hits the mines to quarry for generators. The latest versions
190
- # of gems named *_generator are selected.
191
- class GemSource < Source
192
- def initialize
193
- super :RubyGems
194
- end
195
-
196
- # Yield latest versions of generator gems.
197
- def each
198
- Gem::cache.search(/_generator$/).inject({}) { |latest, gem|
199
- hem = latest[gem.name]
200
- latest[gem.name] = gem if hem.nil? or gem.version > hem.version
201
- latest
202
- }.values.each { |gem|
203
- yield Spec.new(gem.name.sub(/_generator$/, ''), gem.full_gem_path, label)
204
- }
205
- end
206
- end
207
-
208
- end
209
- end
@@ -1,53 +0,0 @@
1
- module Rails
2
- module Generator
3
-
4
- # Manifest captures the actions a generator performs. Instantiate
5
- # a manifest with an optional target object, hammer it with actions,
6
- # then replay or rewind on the object of your choice.
7
- #
8
- # Example:
9
- # manifest = Manifest.new { |m|
10
- # m.make_directory '/foo'
11
- # m.create_file '/foo/bar.txt'
12
- # }
13
- # manifest.replay(creator)
14
- # manifest.rewind(destroyer)
15
- class Manifest
16
- attr_reader :target
17
-
18
- # Take a default action target. Yield self if block given.
19
- def initialize(target = nil)
20
- @target, @actions = target, []
21
- yield self if block_given?
22
- end
23
-
24
- # Record an action.
25
- def method_missing(action, *args, &block)
26
- @actions << [action, args, block]
27
- end
28
-
29
- # Replay recorded actions.
30
- def replay(target = nil)
31
- send_actions(target || @target, @actions)
32
- end
33
-
34
- # Rewind recorded actions.
35
- def rewind(target = nil)
36
- send_actions(target || @target, @actions.reverse)
37
- end
38
-
39
- # Erase recorded actions.
40
- def erase
41
- @actions = []
42
- end
43
-
44
- private
45
- def send_actions(target, actions)
46
- actions.each do |method, args, block|
47
- target.send(method, *args, &block)
48
- end
49
- end
50
- end
51
-
52
- end
53
- end
@@ -1,143 +0,0 @@
1
- require 'optparse'
2
-
3
- module Rails
4
- module Generator
5
- module Options
6
- def self.included(base)
7
- base.extend(ClassMethods)
8
- class << base
9
- if respond_to?(:inherited)
10
- alias_method :inherited_without_options, :inherited
11
- end
12
- alias_method :inherited, :inherited_with_options
13
- end
14
- end
15
-
16
- module ClassMethods
17
- def inherited_with_options(sub)
18
- inherited_without_options(sub) if respond_to?(:inherited_without_options)
19
- sub.extend(Rails::Generator::Options::ClassMethods)
20
- end
21
-
22
- def mandatory_options(options = nil)
23
- if options
24
- write_inheritable_attribute(:mandatory_options, options)
25
- else
26
- read_inheritable_attribute(:mandatory_options) or write_inheritable_attribute(:mandatory_options, {})
27
- end
28
- end
29
-
30
- def default_options(options = nil)
31
- if options
32
- write_inheritable_attribute(:default_options, options)
33
- else
34
- read_inheritable_attribute(:default_options) or write_inheritable_attribute(:default_options, {})
35
- end
36
- end
37
-
38
- # Merge together our class options. In increasing precedence:
39
- # default_options (class default options)
40
- # runtime_options (provided as argument)
41
- # mandatory_options (class mandatory options)
42
- def full_options(runtime_options = {})
43
- default_options.merge(runtime_options).merge(mandatory_options)
44
- end
45
-
46
- end
47
-
48
- # Each instance has an options hash that's populated by #parse.
49
- def options
50
- @options ||= {}
51
- end
52
- attr_writer :options
53
-
54
- protected
55
- # Convenient access to class mandatory options.
56
- def mandatory_options
57
- self.class.mandatory_options
58
- end
59
-
60
- # Convenient access to class default options.
61
- def default_options
62
- self.class.default_options
63
- end
64
-
65
- # Merge together our instance options. In increasing precedence:
66
- # default_options (class default options)
67
- # options (instance options)
68
- # runtime_options (provided as argument)
69
- # mandatory_options (class mandatory options)
70
- def full_options(runtime_options = {})
71
- self.class.full_options(options.merge(runtime_options))
72
- end
73
-
74
- # Parse arguments into the options hash. Classes may customize
75
- # parsing behavior by overriding these methods:
76
- # #banner Usage: ./script/generate [options]
77
- # #add_options! Options:
78
- # some options..
79
- # #add_general_options! General Options:
80
- # general options..
81
- def parse!(args, runtime_options = {})
82
- self.options = {}
83
-
84
- @option_parser = OptionParser.new do |opt|
85
- opt.banner = banner
86
- add_options!(opt)
87
- add_general_options!(opt)
88
- opt.parse!(args)
89
- end
90
-
91
- return args
92
- ensure
93
- self.options = full_options(runtime_options)
94
- end
95
-
96
- # Raise a usage error. Override usage_message to provide a blurb
97
- # after the option parser summary.
98
- def usage(message = usage_message)
99
- raise UsageError, "#{@option_parser}\n#{message}"
100
- end
101
-
102
- def usage_message
103
- ''
104
- end
105
-
106
- # Override with your own usage banner.
107
- def banner
108
- "Usage: #{$0} [options]"
109
- end
110
-
111
- # Override to add your options to the parser:
112
- # def add_options!(opt)
113
- # opt.on('-v', '--verbose') { |value| options[:verbose] = value }
114
- # end
115
- def add_options!(opt)
116
- end
117
-
118
- # Adds general options like -h and --quiet. Usually don't override.
119
- def add_general_options!(opt)
120
- opt.separator ''
121
- opt.separator 'Rails Info:'
122
- opt.on('-v', '--version', 'Show the Rails version number and quit.')
123
- opt.on('-h', '--help', 'Show this help message and quit.') { |v| options[:help] = v }
124
-
125
- opt.separator ''
126
- opt.separator 'General Options:'
127
-
128
- opt.on('-p', '--pretend', 'Run but do not make any changes.') { |v| options[:pretend] = v }
129
- opt.on('-f', '--force', 'Overwrite files that already exist.') { options[:collision] = :force }
130
- opt.on('-s', '--skip', 'Skip files that already exist.') { options[:collision] = :skip }
131
- opt.on('-q', '--quiet', 'Suppress normal output.') { |v| options[:quiet] = v }
132
- opt.on('-t', '--backtrace', 'Debugging: show backtrace on errors.') { |v| options[:backtrace] = v }
133
- opt.on('-c', '--svn', 'Modify files with subversion. (Note: svn must be in path)') do
134
- options[:svn] = `svn status`.inject({}) do |opt, e|
135
- opt[e.chomp[7..-1]] = true
136
- opt
137
- end
138
- end
139
- end
140
-
141
- end
142
- end
143
- end