railties 3.0.0.beta

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 (334) hide show
  1. data/CHANGELOG +2201 -0
  2. data/README +286 -0
  3. data/bin/rails +11 -0
  4. data/builtin/rails_info/rails/info.rb +147 -0
  5. data/builtin/rails_info/rails/info_controller.rb +15 -0
  6. data/builtin/rails_info/rails/info_helper.rb +2 -0
  7. data/builtin/routes.rb +3 -0
  8. data/guides/files/javascripts/code_highlighter.js +188 -0
  9. data/guides/files/javascripts/guides.js +7 -0
  10. data/guides/files/javascripts/highlighters.js +90 -0
  11. data/guides/files/stylesheets/main.css +441 -0
  12. data/guides/files/stylesheets/print.css +52 -0
  13. data/guides/files/stylesheets/reset.css +43 -0
  14. data/guides/files/stylesheets/style.css +13 -0
  15. data/guides/files/stylesheets/syntax.css +31 -0
  16. data/guides/images/belongs_to.png +0 -0
  17. data/guides/images/book_icon.gif +0 -0
  18. data/guides/images/bullet.gif +0 -0
  19. data/guides/images/chapters_icon.gif +0 -0
  20. data/guides/images/check_bullet.gif +0 -0
  21. data/guides/images/credits_pic_blank.gif +0 -0
  22. data/guides/images/csrf.png +0 -0
  23. data/guides/images/customized_error_messages.png +0 -0
  24. data/guides/images/error_messages.png +0 -0
  25. data/guides/images/feature_tile.gif +0 -0
  26. data/guides/images/footer_tile.gif +0 -0
  27. data/guides/images/fxn.png +0 -0
  28. data/guides/images/grey_bullet.gif +0 -0
  29. data/guides/images/habtm.png +0 -0
  30. data/guides/images/has_many.png +0 -0
  31. data/guides/images/has_many_through.png +0 -0
  32. data/guides/images/has_one.png +0 -0
  33. data/guides/images/has_one_through.png +0 -0
  34. data/guides/images/header_backdrop.png +0 -0
  35. data/guides/images/header_tile.gif +0 -0
  36. data/guides/images/i18n/demo_localized_pirate.png +0 -0
  37. data/guides/images/i18n/demo_translated_en.png +0 -0
  38. data/guides/images/i18n/demo_translated_pirate.png +0 -0
  39. data/guides/images/i18n/demo_translation_missing.png +0 -0
  40. data/guides/images/i18n/demo_untranslated.png +0 -0
  41. data/guides/images/icons/README +5 -0
  42. data/guides/images/icons/callouts/1.png +0 -0
  43. data/guides/images/icons/callouts/10.png +0 -0
  44. data/guides/images/icons/callouts/11.png +0 -0
  45. data/guides/images/icons/callouts/12.png +0 -0
  46. data/guides/images/icons/callouts/13.png +0 -0
  47. data/guides/images/icons/callouts/14.png +0 -0
  48. data/guides/images/icons/callouts/15.png +0 -0
  49. data/guides/images/icons/callouts/2.png +0 -0
  50. data/guides/images/icons/callouts/3.png +0 -0
  51. data/guides/images/icons/callouts/4.png +0 -0
  52. data/guides/images/icons/callouts/5.png +0 -0
  53. data/guides/images/icons/callouts/6.png +0 -0
  54. data/guides/images/icons/callouts/7.png +0 -0
  55. data/guides/images/icons/callouts/8.png +0 -0
  56. data/guides/images/icons/callouts/9.png +0 -0
  57. data/guides/images/icons/caution.png +0 -0
  58. data/guides/images/icons/example.png +0 -0
  59. data/guides/images/icons/home.png +0 -0
  60. data/guides/images/icons/important.png +0 -0
  61. data/guides/images/icons/next.png +0 -0
  62. data/guides/images/icons/note.png +0 -0
  63. data/guides/images/icons/prev.png +0 -0
  64. data/guides/images/icons/tip.png +0 -0
  65. data/guides/images/icons/up.png +0 -0
  66. data/guides/images/icons/warning.png +0 -0
  67. data/guides/images/nav_arrow.gif +0 -0
  68. data/guides/images/polymorphic.png +0 -0
  69. data/guides/images/posts_index.png +0 -0
  70. data/guides/images/rails_guides_logo.gif +0 -0
  71. data/guides/images/rails_logo_remix.gif +0 -0
  72. data/guides/images/rails_welcome.png +0 -0
  73. data/guides/images/session_fixation.png +0 -0
  74. data/guides/images/tab_grey.gif +0 -0
  75. data/guides/images/tab_info.gif +0 -0
  76. data/guides/images/tab_note.gif +0 -0
  77. data/guides/images/tab_red.gif +0 -0
  78. data/guides/images/tab_yellow.gif +0 -0
  79. data/guides/images/tab_yellow.png +0 -0
  80. data/guides/images/validation_error_messages.png +0 -0
  81. data/guides/rails_guides.rb +44 -0
  82. data/guides/rails_guides/generator.rb +178 -0
  83. data/guides/rails_guides/helpers.rb +34 -0
  84. data/guides/rails_guides/indexer.rb +55 -0
  85. data/guides/rails_guides/levenshtein.rb +31 -0
  86. data/guides/rails_guides/textile_extensions.rb +41 -0
  87. data/guides/source/2_2_release_notes.textile +422 -0
  88. data/guides/source/2_3_release_notes.textile +610 -0
  89. data/guides/source/3_0_release_notes.textile +560 -0
  90. data/guides/source/action_controller_overview.textile +783 -0
  91. data/guides/source/action_mailer_basics.textile +437 -0
  92. data/guides/source/action_view_overview.textile +1481 -0
  93. data/guides/source/active_record_basics.textile +204 -0
  94. data/guides/source/active_record_querying.textile +961 -0
  95. data/guides/source/active_support_core_extensions.textile +1835 -0
  96. data/guides/source/activerecord_validations_callbacks.textile +1127 -0
  97. data/guides/source/ajax_on_rails.textile +342 -0
  98. data/guides/source/association_basics.textile +1816 -0
  99. data/guides/source/caching_with_rails.textile +390 -0
  100. data/guides/source/command_line.textile +589 -0
  101. data/guides/source/configuring.textile +290 -0
  102. data/guides/source/contribute.textile +71 -0
  103. data/guides/source/contributing_to_rails.textile +272 -0
  104. data/guides/source/credits.textile.erb +52 -0
  105. data/guides/source/debugging_rails_applications.textile +709 -0
  106. data/guides/source/form_helpers.textile +768 -0
  107. data/guides/source/generators.textile +378 -0
  108. data/guides/source/getting_started.textile +1310 -0
  109. data/guides/source/i18n.textile +879 -0
  110. data/guides/source/index.textile.erb +124 -0
  111. data/guides/source/layout.html.erb +103 -0
  112. data/guides/source/layouts_and_rendering.textile +979 -0
  113. data/guides/source/migrations.textile +591 -0
  114. data/guides/source/nested_model_forms.textile +222 -0
  115. data/guides/source/performance_testing.textile +531 -0
  116. data/guides/source/plugins.textile +1512 -0
  117. data/guides/source/rails_application_templates.textile +238 -0
  118. data/guides/source/rails_on_rack.textile +306 -0
  119. data/guides/source/routing.textile +903 -0
  120. data/guides/source/security.textile +984 -0
  121. data/guides/source/testing.textile +946 -0
  122. data/lib/generators/erb.rb +8 -0
  123. data/lib/generators/erb/controller/controller_generator.rb +21 -0
  124. data/lib/generators/erb/controller/templates/view.html.erb +2 -0
  125. data/lib/generators/erb/mailer/mailer_generator.rb +20 -0
  126. data/lib/generators/erb/mailer/templates/view.text.erb +3 -0
  127. data/lib/generators/erb/scaffold/scaffold_generator.rb +53 -0
  128. data/lib/generators/erb/scaffold/templates/_form.html.erb +13 -0
  129. data/lib/generators/erb/scaffold/templates/edit.html.erb +6 -0
  130. data/lib/generators/erb/scaffold/templates/index.html.erb +27 -0
  131. data/lib/generators/erb/scaffold/templates/layout.html.erb +16 -0
  132. data/lib/generators/erb/scaffold/templates/new.html.erb +5 -0
  133. data/lib/generators/erb/scaffold/templates/show.html.erb +10 -0
  134. data/lib/generators/rails/app/USAGE +9 -0
  135. data/lib/generators/rails/app/app_generator.rb +262 -0
  136. data/lib/generators/rails/app/templates/Gemfile +34 -0
  137. data/lib/generators/rails/app/templates/README +243 -0
  138. data/lib/generators/rails/app/templates/Rakefile +10 -0
  139. data/lib/generators/rails/app/templates/app/controllers/application_controller.rb +3 -0
  140. data/lib/generators/rails/app/templates/app/helpers/application_helper.rb +2 -0
  141. data/lib/generators/rails/app/templates/app/models/.empty_directory +0 -0
  142. data/lib/generators/rails/app/templates/app/views/layouts/.empty_directory +0 -0
  143. data/lib/generators/rails/app/templates/config.ru +4 -0
  144. data/lib/generators/rails/app/templates/config/application.rb +51 -0
  145. data/lib/generators/rails/app/templates/config/boot.rb +17 -0
  146. data/lib/generators/rails/app/templates/config/databases/frontbase.yml +28 -0
  147. data/lib/generators/rails/app/templates/config/databases/ibm_db.yml +71 -0
  148. data/lib/generators/rails/app/templates/config/databases/mysql.yml +60 -0
  149. data/lib/generators/rails/app/templates/config/databases/oracle.yml +39 -0
  150. data/lib/generators/rails/app/templates/config/databases/postgresql.yml +51 -0
  151. data/lib/generators/rails/app/templates/config/databases/sqlite3.yml +22 -0
  152. data/lib/generators/rails/app/templates/config/environment.rb +5 -0
  153. data/lib/generators/rails/app/templates/config/environments/development.rb.tt +19 -0
  154. data/lib/generators/rails/app/templates/config/environments/production.rb.tt +33 -0
  155. data/lib/generators/rails/app/templates/config/environments/test.rb.tt +29 -0
  156. data/lib/generators/rails/app/templates/config/initializers/backtrace_silencers.rb +7 -0
  157. data/lib/generators/rails/app/templates/config/initializers/cookie_verification_secret.rb.tt +7 -0
  158. data/lib/generators/rails/app/templates/config/initializers/inflections.rb +10 -0
  159. data/lib/generators/rails/app/templates/config/initializers/mime_types.rb +5 -0
  160. data/lib/generators/rails/app/templates/config/initializers/session_store.rb.tt +15 -0
  161. data/lib/generators/rails/app/templates/config/locales/en.yml +5 -0
  162. data/lib/generators/rails/app/templates/config/routes.rb +58 -0
  163. data/lib/generators/rails/app/templates/db/seeds.rb +7 -0
  164. data/lib/generators/rails/app/templates/doc/README_FOR_APP +2 -0
  165. data/lib/generators/rails/app/templates/gitignore +4 -0
  166. data/lib/generators/rails/app/templates/public/404.html +26 -0
  167. data/lib/generators/rails/app/templates/public/422.html +26 -0
  168. data/lib/generators/rails/app/templates/public/500.html +26 -0
  169. data/lib/generators/rails/app/templates/public/favicon.ico +0 -0
  170. data/lib/generators/rails/app/templates/public/images/rails.png +0 -0
  171. data/lib/generators/rails/app/templates/public/index.html +278 -0
  172. data/lib/generators/rails/app/templates/public/javascripts/application.js +2 -0
  173. data/lib/generators/rails/app/templates/public/javascripts/controls.js +963 -0
  174. data/lib/generators/rails/app/templates/public/javascripts/dragdrop.js +973 -0
  175. data/lib/generators/rails/app/templates/public/javascripts/effects.js +1128 -0
  176. data/lib/generators/rails/app/templates/public/javascripts/prototype.js +4320 -0
  177. data/lib/generators/rails/app/templates/public/javascripts/rails.js +110 -0
  178. data/lib/generators/rails/app/templates/public/robots.txt +5 -0
  179. data/lib/generators/rails/app/templates/public/stylesheets/.empty_directory +0 -0
  180. data/lib/generators/rails/app/templates/script/rails +9 -0
  181. data/lib/generators/rails/app/templates/test/fixtures/.empty_directory +0 -0
  182. data/lib/generators/rails/app/templates/test/functional/.empty_directory +0 -0
  183. data/lib/generators/rails/app/templates/test/integration/.empty_directory +0 -0
  184. data/lib/generators/rails/app/templates/test/performance/browsing_test.rb +9 -0
  185. data/lib/generators/rails/app/templates/test/test_helper.rb +13 -0
  186. data/lib/generators/rails/app/templates/test/unit/.empty_directory +0 -0
  187. data/lib/generators/rails/controller/USAGE +18 -0
  188. data/lib/generators/rails/controller/controller_generator.rb +14 -0
  189. data/lib/generators/rails/controller/templates/controller.rb +7 -0
  190. data/lib/generators/rails/generator/USAGE +11 -0
  191. data/lib/generators/rails/generator/generator_generator.rb +25 -0
  192. data/lib/generators/rails/generator/templates/%file_name%_generator.rb.tt +5 -0
  193. data/lib/generators/rails/generator/templates/USAGE.tt +8 -0
  194. data/lib/generators/rails/generator/templates/templates/.empty_directory +0 -0
  195. data/lib/generators/rails/helper/USAGE +17 -0
  196. data/lib/generators/rails/helper/helper_generator.rb +13 -0
  197. data/lib/generators/rails/helper/templates/helper.rb +2 -0
  198. data/lib/generators/rails/integration_test/USAGE +10 -0
  199. data/lib/generators/rails/integration_test/integration_test_generator.rb +7 -0
  200. data/lib/generators/rails/mailer/USAGE +15 -0
  201. data/lib/generators/rails/mailer/mailer_generator.rb +14 -0
  202. data/lib/generators/rails/mailer/templates/mailer.rb +16 -0
  203. data/lib/generators/rails/metal/USAGE +8 -0
  204. data/lib/generators/rails/metal/metal_generator.rb +11 -0
  205. data/lib/generators/rails/metal/templates/metal.rb +12 -0
  206. data/lib/generators/rails/migration/USAGE +29 -0
  207. data/lib/generators/rails/migration/migration_generator.rb +8 -0
  208. data/lib/generators/rails/model/USAGE +30 -0
  209. data/lib/generators/rails/model/model_generator.rb +8 -0
  210. data/lib/generators/rails/model_subclass/model_subclass_generator.rb +12 -0
  211. data/lib/generators/rails/observer/USAGE +12 -0
  212. data/lib/generators/rails/observer/observer_generator.rb +7 -0
  213. data/lib/generators/rails/performance_test/USAGE +10 -0
  214. data/lib/generators/rails/performance_test/performance_test_generator.rb +7 -0
  215. data/lib/generators/rails/plugin/USAGE +13 -0
  216. data/lib/generators/rails/plugin/plugin_generator.rb +47 -0
  217. data/lib/generators/rails/plugin/templates/MIT-LICENSE.tt +20 -0
  218. data/lib/generators/rails/plugin/templates/README.tt +13 -0
  219. data/lib/generators/rails/plugin/templates/Rakefile.tt +10 -0
  220. data/lib/generators/rails/plugin/templates/init.rb +1 -0
  221. data/lib/generators/rails/plugin/templates/install.rb +1 -0
  222. data/lib/generators/rails/plugin/templates/lib/%file_name%.rb.tt +1 -0
  223. data/lib/generators/rails/plugin/templates/lib/tasks/%file_name%_tasks.rake.tt +4 -0
  224. data/lib/generators/rails/plugin/templates/uninstall.rb +1 -0
  225. data/lib/generators/rails/resource/USAGE +23 -0
  226. data/lib/generators/rails/resource/resource_generator.rb +34 -0
  227. data/lib/generators/rails/scaffold/USAGE +29 -0
  228. data/lib/generators/rails/scaffold/scaffold_generator.rb +13 -0
  229. data/lib/generators/rails/scaffold_controller/USAGE +20 -0
  230. data/lib/generators/rails/scaffold_controller/scaffold_controller_generator.rb +27 -0
  231. data/lib/generators/rails/scaffold_controller/templates/controller.rb +85 -0
  232. data/lib/generators/rails/session_migration/USAGE +8 -0
  233. data/lib/generators/rails/session_migration/session_migration_generator.rb +8 -0
  234. data/lib/generators/rails/stylesheets/USAGE +5 -0
  235. data/lib/generators/rails/stylesheets/stylesheets_generator.rb +9 -0
  236. data/lib/generators/rails/stylesheets/templates/scaffold.css +61 -0
  237. data/lib/generators/test_unit.rb +8 -0
  238. data/lib/generators/test_unit/controller/controller_generator.rb +14 -0
  239. data/lib/generators/test_unit/controller/templates/functional_test.rb +8 -0
  240. data/lib/generators/test_unit/helper/helper_generator.rb +13 -0
  241. data/lib/generators/test_unit/helper/templates/helper_test.rb +4 -0
  242. data/lib/generators/test_unit/integration/integration_generator.rb +13 -0
  243. data/lib/generators/test_unit/integration/templates/integration_test.rb +10 -0
  244. data/lib/generators/test_unit/mailer/mailer_generator.rb +21 -0
  245. data/lib/generators/test_unit/mailer/templates/fixture +3 -0
  246. data/lib/generators/test_unit/mailer/templates/functional_test.rb +22 -0
  247. data/lib/generators/test_unit/model/model_generator.rb +24 -0
  248. data/lib/generators/test_unit/model/templates/fixtures.yml +23 -0
  249. data/lib/generators/test_unit/model/templates/unit_test.rb +8 -0
  250. data/lib/generators/test_unit/observer/observer_generator.rb +13 -0
  251. data/lib/generators/test_unit/observer/templates/unit_test.rb +8 -0
  252. data/lib/generators/test_unit/performance/performance_generator.rb +13 -0
  253. data/lib/generators/test_unit/performance/templates/performance_test.rb +9 -0
  254. data/lib/generators/test_unit/plugin/plugin_generator.rb +13 -0
  255. data/lib/generators/test_unit/plugin/templates/%file_name%_test.rb.tt +8 -0
  256. data/lib/generators/test_unit/plugin/templates/test_helper.rb +3 -0
  257. data/lib/generators/test_unit/scaffold/scaffold_generator.rb +18 -0
  258. data/lib/generators/test_unit/scaffold/templates/functional_test.rb +47 -0
  259. data/lib/rails.rb +95 -0
  260. data/lib/rails/all.rb +14 -0
  261. data/lib/rails/application.rb +125 -0
  262. data/lib/rails/application/bootstrap.rb +85 -0
  263. data/lib/rails/application/configurable.rb +19 -0
  264. data/lib/rails/application/configuration.rb +86 -0
  265. data/lib/rails/application/finisher.rb +49 -0
  266. data/lib/rails/application/metal_loader.rb +50 -0
  267. data/lib/rails/application/railties.rb +31 -0
  268. data/lib/rails/application/routes_reloader.rb +46 -0
  269. data/lib/rails/backtrace_cleaner.rb +54 -0
  270. data/lib/rails/code_statistics.rb +107 -0
  271. data/lib/rails/commands.rb +72 -0
  272. data/lib/rails/commands/application.rb +13 -0
  273. data/lib/rails/commands/console.rb +55 -0
  274. data/lib/rails/commands/dbconsole.rb +104 -0
  275. data/lib/rails/commands/destroy.rb +9 -0
  276. data/lib/rails/commands/generate.rb +9 -0
  277. data/lib/rails/commands/performance/benchmarker.rb +23 -0
  278. data/lib/rails/commands/performance/profiler.rb +46 -0
  279. data/lib/rails/commands/plugin.rb +542 -0
  280. data/lib/rails/commands/runner.rb +51 -0
  281. data/lib/rails/commands/server.rb +75 -0
  282. data/lib/rails/commands/update.rb +9 -0
  283. data/lib/rails/configuration.rb +191 -0
  284. data/lib/rails/console/app.rb +33 -0
  285. data/lib/rails/console/helpers.rb +5 -0
  286. data/lib/rails/console/sandbox.rb +6 -0
  287. data/lib/rails/deprecation.rb +62 -0
  288. data/lib/rails/dispatcher.rb +24 -0
  289. data/lib/rails/engine.rb +130 -0
  290. data/lib/rails/engine/configurable.rb +25 -0
  291. data/lib/rails/engine/configuration.rb +49 -0
  292. data/lib/rails/generators.rb +289 -0
  293. data/lib/rails/generators/actions.rb +309 -0
  294. data/lib/rails/generators/active_model.rb +78 -0
  295. data/lib/rails/generators/base.rb +362 -0
  296. data/lib/rails/generators/generated_attribute.rb +48 -0
  297. data/lib/rails/generators/migration.rb +64 -0
  298. data/lib/rails/generators/named_base.rb +95 -0
  299. data/lib/rails/generators/resource_helpers.rb +80 -0
  300. data/lib/rails/generators/test_case.rb +239 -0
  301. data/lib/rails/initializable.rb +97 -0
  302. data/lib/rails/paths.rb +144 -0
  303. data/lib/rails/performance_test_help.rb +3 -0
  304. data/lib/rails/plugin.rb +64 -0
  305. data/lib/rails/rack.rb +8 -0
  306. data/lib/rails/rack/debugger.rb +23 -0
  307. data/lib/rails/rack/log_tailer.rb +33 -0
  308. data/lib/rails/rack/logger.rb +34 -0
  309. data/lib/rails/rack/static.rb +5 -0
  310. data/lib/rails/railtie.rb +74 -0
  311. data/lib/rails/railtie/configurable.rb +23 -0
  312. data/lib/rails/railtie/configuration.rb +9 -0
  313. data/lib/rails/railties_path.rb +1 -0
  314. data/lib/rails/ruby_version_check.rb +10 -0
  315. data/lib/rails/rubyprof_ext.rb +35 -0
  316. data/lib/rails/source_annotation_extractor.rb +102 -0
  317. data/lib/rails/subscriber.rb +108 -0
  318. data/lib/rails/subscriber/test_helper.rb +98 -0
  319. data/lib/rails/tasks.rb +16 -0
  320. data/lib/rails/tasks/annotations.rake +20 -0
  321. data/lib/rails/tasks/documentation.rake +96 -0
  322. data/lib/rails/tasks/framework.rake +69 -0
  323. data/lib/rails/tasks/log.rake +9 -0
  324. data/lib/rails/tasks/middleware.rake +7 -0
  325. data/lib/rails/tasks/misc.rake +71 -0
  326. data/lib/rails/tasks/routes.rake +17 -0
  327. data/lib/rails/tasks/statistics.rake +16 -0
  328. data/lib/rails/tasks/tmp.rake +37 -0
  329. data/lib/rails/test_help.rb +30 -0
  330. data/lib/rails/test_unit/railtie.rb +17 -0
  331. data/lib/rails/test_unit/testing.rake +130 -0
  332. data/lib/rails/version.rb +9 -0
  333. data/lib/rails/webrick_server.rb +156 -0
  334. metadata +427 -0
@@ -0,0 +1,130 @@
1
+ require 'active_support/core_ext/module/delegation'
2
+ require 'rails/railtie'
3
+
4
+ module Rails
5
+ class Engine < Railtie
6
+ autoload :Configurable, "rails/engine/configurable"
7
+ autoload :Configuration, "rails/engine/configuration"
8
+
9
+ class << self
10
+ attr_accessor :called_from
11
+
12
+ alias :engine_name :railtie_name
13
+ alias :engine_names :railtie_names
14
+
15
+ def inherited(base)
16
+ unless abstract_railtie?(base)
17
+ base.called_from = begin
18
+ call_stack = caller.map { |p| p.split(':').first }
19
+ File.dirname(call_stack.detect { |p| p !~ %r[railties/lib/rails|rack/lib/rack] })
20
+ end
21
+ end
22
+
23
+ super
24
+ end
25
+
26
+ def find_root_with_flag(flag, default=nil)
27
+ root_path = self.called_from
28
+
29
+ while root_path && File.directory?(root_path) && !File.exist?("#{root_path}/#{flag}")
30
+ parent = File.dirname(root_path)
31
+ root_path = parent != root_path && parent
32
+ end
33
+
34
+ root = File.exist?("#{root_path}/#{flag}") ? root_path : default
35
+ raise "Could not find root path for #{self}" unless root
36
+
37
+ RUBY_PLATFORM =~ /(:?mswin|mingw)/ ?
38
+ Pathname.new(root).expand_path : Pathname.new(root).realpath
39
+ end
40
+ end
41
+
42
+ delegate :middleware, :paths, :root, :to => :config
43
+
44
+ def load_tasks
45
+ super
46
+ config.paths.lib.tasks.to_a.sort.each { |ext| load(ext) }
47
+ end
48
+
49
+ # Add configured load paths to ruby load paths and remove duplicates.
50
+ initializer :set_load_path, :before => :bootstrap_load_path do
51
+ config.load_paths.reverse_each do |path|
52
+ $LOAD_PATH.unshift(path) if File.directory?(path)
53
+ end
54
+ $LOAD_PATH.uniq!
55
+ end
56
+
57
+ # Set the paths from which Rails will automatically load source files,
58
+ # and the load_once paths.
59
+ initializer :set_autoload_paths, :before => :bootstrap_load_path do |app|
60
+ ActiveSupport::Dependencies.load_paths.unshift(*config.load_paths)
61
+
62
+ if reloadable?(app)
63
+ ActiveSupport::Dependencies.load_once_paths.unshift(*config.load_once_paths)
64
+ else
65
+ ActiveSupport::Dependencies.load_once_paths.unshift(*config.load_paths)
66
+ end
67
+
68
+ # Freeze so future modifications will fail rather than do nothing mysteriously
69
+ config.load_paths.freeze
70
+ config.load_once_paths.freeze
71
+ end
72
+
73
+ initializer :add_routing_paths do |app|
74
+ paths.config.routes.to_a.each do |route|
75
+ app.routes_reloader.paths.unshift(route) if File.exists?(route)
76
+ end
77
+ end
78
+
79
+ initializer :add_routing_namespaces do |app|
80
+ paths.app.controllers.to_a.each do |load_path|
81
+ load_path = File.expand_path(load_path)
82
+ Dir["#{load_path}/*/*_controller.rb"].collect do |path|
83
+ namespace = File.dirname(path).sub(/#{load_path}\/?/, '')
84
+ app.routes.controller_namespaces << namespace unless namespace.empty?
85
+ end
86
+ end
87
+ end
88
+
89
+ # I18n load paths are a special case since the ones added
90
+ # later have higher priority.
91
+ initializer :add_locales do
92
+ config.i18n.engines_load_path.concat(paths.config.locales.to_a)
93
+ end
94
+
95
+ initializer :add_view_paths do
96
+ views = paths.app.views.to_a
97
+ ActionController::Base.view_paths.unshift(*views) if defined?(ActionController)
98
+ ActionMailer::Base.view_paths.unshift(*views) if defined?(ActionMailer)
99
+ end
100
+
101
+ initializer :add_metals do |app|
102
+ app.metal_loader.paths.unshift(*paths.app.metals.to_a)
103
+ end
104
+
105
+ initializer :load_application_initializers do
106
+ paths.config.initializers.to_a.sort.each do |initializer|
107
+ load(initializer)
108
+ end
109
+ end
110
+
111
+ initializer :load_application_classes do |app|
112
+ next if $rails_rake_task
113
+
114
+ if app.config.cache_classes
115
+ config.eager_load_paths.each do |load_path|
116
+ matcher = /\A#{Regexp.escape(load_path)}\/(.*)\.rb\Z/
117
+ Dir.glob("#{load_path}/**/*.rb").sort.each do |file|
118
+ require_dependency file.sub(matcher, '\1')
119
+ end
120
+ end
121
+ end
122
+ end
123
+
124
+ protected
125
+
126
+ def reloadable?(app)
127
+ app.config.reload_engines
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,25 @@
1
+ module Rails
2
+ class Engine
3
+ module Configurable
4
+ def self.included(base)
5
+ base.extend ClassMethods
6
+ end
7
+
8
+ module ClassMethods
9
+ delegate :middleware, :root, :paths, :to => :config
10
+
11
+ def config
12
+ @config ||= Engine::Configuration.new(find_root_with_flag("lib"))
13
+ end
14
+
15
+ def inherited(base)
16
+ raise "You cannot inherit from a Rails::Engine child"
17
+ end
18
+ end
19
+
20
+ def config
21
+ self.class.config
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,49 @@
1
+ require 'rails/railtie/configuration'
2
+
3
+ module Rails
4
+ class Engine
5
+ class Configuration < ::Rails::Railtie::Configuration
6
+ attr_reader :root
7
+ attr_writer :eager_load_paths, :load_once_paths, :load_paths
8
+
9
+ def initialize(root=nil)
10
+ @root = root
11
+ end
12
+
13
+ def paths
14
+ @paths ||= begin
15
+ paths = Rails::Paths::Root.new(@root)
16
+ paths.app "app", :eager_load => true, :glob => "*"
17
+ paths.app.controllers "app/controllers", :eager_load => true
18
+ paths.app.helpers "app/helpers", :eager_load => true
19
+ paths.app.models "app/models", :eager_load => true
20
+ paths.app.metals "app/metal"
21
+ paths.app.views "app/views"
22
+ paths.lib "lib", :load_path => true
23
+ paths.lib.tasks "lib/tasks", :glob => "**/*.rake"
24
+ paths.config "config"
25
+ paths.config.initializers "config/initializers", :glob => "**/*.rb"
26
+ paths.config.locales "config/locales", :glob => "*.{rb,yml}"
27
+ paths.config.routes "config/routes.rb"
28
+ paths
29
+ end
30
+ end
31
+
32
+ def root=(value)
33
+ @root = paths.path = Pathname.new(value).expand_path
34
+ end
35
+
36
+ def eager_load_paths
37
+ @eager_load_paths ||= paths.eager_load
38
+ end
39
+
40
+ def load_once_paths
41
+ @eager_load_paths ||= paths.load_once
42
+ end
43
+
44
+ def load_paths
45
+ @load_paths ||= paths.load_paths
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,289 @@
1
+ activesupport_path = File.expand_path('../../../../activesupport/lib', __FILE__)
2
+ $:.unshift(activesupport_path) if File.directory?(activesupport_path) && !$:.include?(activesupport_path)
3
+
4
+ require 'active_support'
5
+ require 'active_support/core_ext/object/blank'
6
+ require 'active_support/core_ext/object/metaclass'
7
+ require 'active_support/core_ext/array/extract_options'
8
+ require 'active_support/core_ext/hash/deep_merge'
9
+ require 'active_support/core_ext/module/attribute_accessors'
10
+ require 'active_support/core_ext/string/inflections'
11
+
12
+ require 'rails/generators/base'
13
+ require 'rails/generators/named_base'
14
+
15
+ module Rails
16
+ module Generators
17
+ DEFAULT_ALIASES = {
18
+ :rails => {
19
+ :actions => '-a',
20
+ :orm => '-o',
21
+ :resource_controller => '-c',
22
+ :scaffold_controller => '-c',
23
+ :stylesheets => '-y',
24
+ :template_engine => '-e',
25
+ :test_framework => '-t'
26
+ },
27
+
28
+ :test_unit => {
29
+ :fixture_replacement => '-r',
30
+ },
31
+
32
+ :plugin => {
33
+ :generator => '-g',
34
+ :tasks => '-r'
35
+ }
36
+ }
37
+
38
+ DEFAULT_OPTIONS = {
39
+ :erb => {
40
+ :layout => true
41
+ },
42
+
43
+ :rails => {
44
+ :force_plural => false,
45
+ :helper => true,
46
+ :layout => true,
47
+ :orm => nil,
48
+ :integration_tool => nil,
49
+ :performance_tool => nil,
50
+ :resource_controller => :controller,
51
+ :scaffold_controller => :scaffold_controller,
52
+ :singleton => false,
53
+ :stylesheets => true,
54
+ :test_framework => nil,
55
+ :template_engine => :erb
56
+ },
57
+
58
+ :plugin => {
59
+ :generator => false,
60
+ :tasks => false
61
+ }
62
+ }
63
+
64
+ def self.configure!(config = Rails.application.config.generators) #:nodoc:
65
+ no_color! unless config.colorize_logging
66
+ aliases.deep_merge! config.aliases
67
+ options.deep_merge! config.options
68
+ fallbacks.merge! config.fallbacks
69
+ end
70
+
71
+ def self.aliases #:nodoc:
72
+ @aliases ||= DEFAULT_ALIASES.dup
73
+ end
74
+
75
+ def self.options #:nodoc:
76
+ @options ||= DEFAULT_OPTIONS.dup
77
+ end
78
+
79
+ # Hold configured generators fallbacks. If a plugin developer wants a
80
+ # generator group to fallback to another group in case of missing generators,
81
+ # they can add a fallback.
82
+ #
83
+ # For example, shoulda is considered a test_framework and is an extension
84
+ # of test_unit. However, most part of shoulda generators are similar to
85
+ # test_unit ones.
86
+ #
87
+ # Shoulda then can tell generators to search for test_unit generators when
88
+ # some of them are not available by adding a fallback:
89
+ #
90
+ # Rails::Generators.fallbacks[:shoulda] = :test_unit
91
+ #
92
+ def self.fallbacks
93
+ @fallbacks ||= {}
94
+ end
95
+
96
+ # Remove the color from output.
97
+ def self.no_color!
98
+ Thor::Base.shell = Thor::Shell::Basic
99
+ end
100
+
101
+ # Track all generators subclasses.
102
+ def self.subclasses
103
+ @subclasses ||= []
104
+ end
105
+
106
+ # Rails finds namespaces similar to thor, it only adds one rule:
107
+ #
108
+ # Generators names must end with "_generator.rb". This is required because Rails
109
+ # looks in load paths and loads the generator just before it's going to be used.
110
+ #
111
+ # ==== Examples
112
+ #
113
+ # find_by_namespace :webrat, :rails, :integration
114
+ #
115
+ # Will search for the following generators:
116
+ #
117
+ # "rails:webrat", "webrat:integration", "webrat"
118
+ #
119
+ # Notice that "rails:generators:webrat" could be loaded as well, what
120
+ # Rails looks for is the first and last parts of the namespace.
121
+ #
122
+ def self.find_by_namespace(name, base=nil, context=nil) #:nodoc:
123
+ lookups = []
124
+ lookups << "#{base}:#{name}" if base
125
+ lookups << "#{name}:#{context}" if context
126
+
127
+ unless base || context
128
+ unless name.to_s.include?(?:)
129
+ lookups << "#{name}:#{name}"
130
+ lookups << "rails:#{name}"
131
+ end
132
+ lookups << "#{name}"
133
+ end
134
+
135
+ lookup(lookups)
136
+
137
+ namespaces = subclasses.inject({}) do |hash, klass|
138
+ hash[klass.namespace] = klass
139
+ hash
140
+ end
141
+
142
+ lookups.each do |namespace|
143
+ klass = namespaces[namespace]
144
+ return klass if klass
145
+ end
146
+
147
+ invoke_fallbacks_for(name, base) || invoke_fallbacks_for(context, name)
148
+ end
149
+
150
+ # Receives a namespace, arguments and the behavior to invoke the generator.
151
+ # It's used as the default entry point for generate, destroy and update
152
+ # commands.
153
+ def self.invoke(namespace, args=ARGV, config={})
154
+ names = namespace.to_s.split(':')
155
+ if klass = find_by_namespace(names.pop, names.shift)
156
+ args << "--help" if args.empty? && klass.arguments.any? { |a| a.required? }
157
+ klass.start(args, config)
158
+ else
159
+ puts "Could not find generator #{namespace}."
160
+ end
161
+ end
162
+
163
+ # Show help message with available generators.
164
+ def self.help
165
+ lookup!
166
+
167
+ namespaces = subclasses.map{ |k| k.namespace }
168
+ namespaces.sort!
169
+
170
+ groups = Hash.new { |h,k| h[k] = [] }
171
+ namespaces.each do |namespace|
172
+ base = namespace.split(':').first
173
+ groups[base] << namespace
174
+ end
175
+
176
+ puts "Usage: rails generate GENERATOR [args] [options]"
177
+ puts
178
+ puts "General options:"
179
+ puts " -h, [--help] # Print generators options and usage"
180
+ puts " -p, [--pretend] # Run but do not make any changes"
181
+ puts " -f, [--force] # Overwrite files that already exist"
182
+ puts " -s, [--skip] # Skip files that already exist"
183
+ puts " -q, [--quiet] # Supress status output"
184
+ puts
185
+ puts "Please choose a generator below."
186
+ puts
187
+
188
+ # Print Rails defaults first.
189
+ rails = groups.delete("rails")
190
+ rails.map! { |n| n.sub(/^rails:/, '') }
191
+ rails.delete("app")
192
+ print_list("rails", rails)
193
+
194
+ groups.sort.each { |b, n| print_list(b, n) }
195
+ end
196
+
197
+ protected
198
+
199
+ # Prints a list of generators.
200
+ def self.print_list(base, namespaces) #:nodoc:
201
+ return if namespaces.empty?
202
+ puts "#{base.camelize}:"
203
+ namespaces.each { |namespace| puts(" #{namespace}") }
204
+ puts
205
+ end
206
+
207
+ # Try fallbacks for the given base.
208
+ def self.invoke_fallbacks_for(name, base) #:nodoc:
209
+ return nil unless base && fallbacks[base.to_sym]
210
+ invoked_fallbacks = []
211
+
212
+ Array(fallbacks[base.to_sym]).each do |fallback|
213
+ next if invoked_fallbacks.include?(fallback)
214
+ invoked_fallbacks << fallback
215
+
216
+ klass = find_by_namespace(name, fallback)
217
+ return klass if klass
218
+ end
219
+
220
+ nil
221
+ end
222
+
223
+ # Receives namespaces in an array and tries to find matching generators
224
+ # in the load path.
225
+ def self.lookup(namespaces) #:nodoc:
226
+ load_generators_from_railties!
227
+ paths = namespaces_to_paths(namespaces)
228
+
229
+ paths.each do |raw_path|
230
+ ["rails_generators", "generators"].each do |base|
231
+ path = "#{base}/#{raw_path}_generator"
232
+
233
+ begin
234
+ require path
235
+ return
236
+ rescue LoadError => e
237
+ raise unless e.message =~ /#{Regexp.escape(path)}$/
238
+ rescue NameError => e
239
+ raise unless e.message =~ /Rails::Generator([\s(::)]|$)/
240
+ warn "[WARNING] Could not load generator #{path.inspect} because it's a Rails 2.x generator, which is not supported anymore. Error: #{e.message}.\n#{e.backtrace.join("\n")}"
241
+ rescue Exception => e
242
+ warn "[WARNING] Could not load generator #{path.inspect}. Error: #{e.message}.\n#{e.backtrace.join("\n")}"
243
+ end
244
+ end
245
+ end
246
+ end
247
+
248
+ # This will try to load any generator in the load path to show in help.
249
+ def self.lookup! #:nodoc:
250
+ load_generators_from_railties!
251
+
252
+ $LOAD_PATH.each do |base|
253
+ Dir[File.join(base, "{generators,rails_generators}", "**", "*_generator.rb")].each do |path|
254
+ begin
255
+ require path
256
+ rescue Exception => e
257
+ # No problem
258
+ end
259
+ end
260
+ end
261
+ end
262
+
263
+ # Allow generators to be loaded from custom paths.
264
+ def self.load_generators_from_railties! #:nodoc:
265
+ return if defined?(@generators_from_railties) || Rails.application.nil?
266
+ @generators_from_railties = true
267
+ Rails.application.load_generators
268
+ end
269
+
270
+ # Convert namespaces to paths by replacing ":" for "/" and adding
271
+ # an extra lookup. For example, "rails:model" should be searched
272
+ # in both: "rails/model/model_generator" and "rails/model_generator".
273
+ def self.namespaces_to_paths(namespaces) #:nodoc:
274
+ paths = []
275
+ namespaces.each do |namespace|
276
+ pieces = namespace.split(":")
277
+ paths << pieces.dup.push(pieces.last).join("/") unless pieces.uniq.size == 1
278
+ paths << pieces.join("/")
279
+ end
280
+ paths.uniq!
281
+ paths
282
+ end
283
+
284
+ end
285
+ end
286
+
287
+ # If the application was already defined, configure generators,
288
+ # otherwise you have to configure it by hand.
289
+ Rails::Generators.configure! if Rails.respond_to?(:application) && Rails.application