authorails 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (347) hide show
  1. data/AUTHORAILS_README +20 -0
  2. data/CHANGELOG +1366 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README +182 -0
  5. data/Rakefile +334 -0
  6. data/bin/about +3 -0
  7. data/bin/authorails +19 -0
  8. data/bin/breakpointer +3 -0
  9. data/bin/console +3 -0
  10. data/bin/destroy +3 -0
  11. data/bin/generate +3 -0
  12. data/bin/performance/benchmarker +3 -0
  13. data/bin/performance/profiler +3 -0
  14. data/bin/plugin +3 -0
  15. data/bin/process/inspector +3 -0
  16. data/bin/process/reaper +3 -0
  17. data/bin/process/spawner +3 -0
  18. data/bin/runner +3 -0
  19. data/bin/server +3 -0
  20. data/builtin/rails_info/rails/info.rb +123 -0
  21. data/builtin/rails_info/rails/info_controller.rb +9 -0
  22. data/builtin/rails_info/rails/info_helper.rb +2 -0
  23. data/builtin/rails_info/rails_info_controller.rb +2 -0
  24. data/configs/apache.conf +40 -0
  25. data/configs/databases/frontbase.yml +28 -0
  26. data/configs/databases/mysql.yml +48 -0
  27. data/configs/databases/oracle.yml +39 -0
  28. data/configs/databases/postgresql.yml +44 -0
  29. data/configs/databases/sqlite2.yml +16 -0
  30. data/configs/databases/sqlite3.yml +19 -0
  31. data/configs/empty.log +0 -0
  32. data/configs/lighttpd.conf +54 -0
  33. data/configs/routes.rb +23 -0
  34. data/controllers/accounts_controller.rb +11 -0
  35. data/controllers/admin_controller.rb +76 -0
  36. data/controllers/begin_controller.rb +5 -0
  37. data/controllers/login_controller.rb +101 -0
  38. data/controllers/permission_controller.rb +91 -0
  39. data/controllers/roles_controller.rb +58 -0
  40. data/controllers/tables_controller.rb +714 -0
  41. data/dispatches/dispatch.fcgi +24 -0
  42. data/dispatches/dispatch.rb +10 -0
  43. data/dispatches/gateway.cgi +97 -0
  44. data/doc/README_FOR_APP +2 -0
  45. data/environments/boot.rb +45 -0
  46. data/environments/development.rb +21 -0
  47. data/environments/environment.rb +63 -0
  48. data/environments/production.rb +18 -0
  49. data/environments/test.rb +19 -0
  50. data/fresh_rakefile +10 -0
  51. data/helpers/application.rb +607 -0
  52. data/helpers/application_helper.rb +315 -0
  53. data/helpers/permission_helper.rb +27 -0
  54. data/helpers/test_helper.rb +28 -0
  55. data/html/404.html +30 -0
  56. data/html/500.html +30 -0
  57. data/html/favicon.ico +0 -0
  58. data/html/images/ArrowDn.png +0 -0
  59. data/html/images/ArrowUp.png +0 -0
  60. data/html/images/arrow.gif +0 -0
  61. data/html/images/authorails_logo.gif +0 -0
  62. data/html/images/delete.png +0 -0
  63. data/html/images/edit.png +0 -0
  64. data/html/images/minus.gif +0 -0
  65. data/html/images/plus.gif +0 -0
  66. data/html/images/rails.png +0 -0
  67. data/html/images/show.png +0 -0
  68. data/html/images/spinner.gif +0 -0
  69. data/html/index.html +273 -0
  70. data/html/javascripts/application.js +2 -0
  71. data/html/javascripts/controls.js +833 -0
  72. data/html/javascripts/dragdrop.js +942 -0
  73. data/html/javascripts/effects.js +1088 -0
  74. data/html/javascripts/live_validation.js +4 -0
  75. data/html/javascripts/prototype.js +2515 -0
  76. data/html/robots.txt +1 -0
  77. data/lib/authorails/version.rb +9 -0
  78. data/lib/binding_of_caller.rb +85 -0
  79. data/lib/breakpoint.rb +553 -0
  80. data/lib/breakpoint_client.rb +196 -0
  81. data/lib/code_statistics.rb +107 -0
  82. data/lib/commands.rb +17 -0
  83. data/lib/commands/about.rb +2 -0
  84. data/lib/commands/breakpointer.rb +1 -0
  85. data/lib/commands/console.rb +25 -0
  86. data/lib/commands/destroy.rb +6 -0
  87. data/lib/commands/generate.rb +6 -0
  88. data/lib/commands/ncgi/listener +86 -0
  89. data/lib/commands/ncgi/tracker +69 -0
  90. data/lib/commands/performance/benchmarker.rb +24 -0
  91. data/lib/commands/performance/profiler.rb +50 -0
  92. data/lib/commands/plugin.rb +918 -0
  93. data/lib/commands/process/inspector.rb +68 -0
  94. data/lib/commands/process/reaper.rb +149 -0
  95. data/lib/commands/process/spawner.rb +209 -0
  96. data/lib/commands/process/spinner.rb +57 -0
  97. data/lib/commands/runner.rb +48 -0
  98. data/lib/commands/server.rb +39 -0
  99. data/lib/commands/servers/base.rb +19 -0
  100. data/lib/commands/servers/lighttpd.rb +94 -0
  101. data/lib/commands/servers/mongrel.rb +65 -0
  102. data/lib/commands/servers/webrick.rb +59 -0
  103. data/lib/commands/update.rb +4 -0
  104. data/lib/console_app.rb +27 -0
  105. data/lib/console_sandbox.rb +6 -0
  106. data/lib/console_with_helpers.rb +23 -0
  107. data/lib/dispatcher.rb +173 -0
  108. data/lib/fcgi_handler.rb +225 -0
  109. data/lib/initializer.rb +702 -0
  110. data/lib/rails_generator.rb +43 -0
  111. data/lib/rails_generator/base.rb +261 -0
  112. data/lib/rails_generator/commands.rb +581 -0
  113. data/lib/rails_generator/generated_attribute.rb +42 -0
  114. data/lib/rails_generator/generators/applications/app/USAGE +16 -0
  115. data/lib/rails_generator/generators/applications/app/app_generator.rb +341 -0
  116. data/lib/rails_generator/generators/components/controller/USAGE +30 -0
  117. data/lib/rails_generator/generators/components/controller/controller_generator.rb +37 -0
  118. data/lib/rails_generator/generators/components/controller/templates/controller.rb +10 -0
  119. data/lib/rails_generator/generators/components/controller/templates/functional_test.rb +18 -0
  120. data/lib/rails_generator/generators/components/controller/templates/helper.rb +2 -0
  121. data/lib/rails_generator/generators/components/controller/templates/view.rhtml +2 -0
  122. data/lib/rails_generator/generators/components/integration_test/USAGE +14 -0
  123. data/lib/rails_generator/generators/components/integration_test/integration_test_generator.rb +16 -0
  124. data/lib/rails_generator/generators/components/integration_test/templates/integration_test.rb +10 -0
  125. data/lib/rails_generator/generators/components/mailer/USAGE +18 -0
  126. data/lib/rails_generator/generators/components/mailer/mailer_generator.rb +34 -0
  127. data/lib/rails_generator/generators/components/mailer/templates/fixture.rhtml +3 -0
  128. data/lib/rails_generator/generators/components/mailer/templates/mailer.rb +13 -0
  129. data/lib/rails_generator/generators/components/mailer/templates/unit_test.rb +37 -0
  130. data/lib/rails_generator/generators/components/mailer/templates/view.rhtml +3 -0
  131. data/lib/rails_generator/generators/components/migration/USAGE +14 -0
  132. data/lib/rails_generator/generators/components/migration/migration_generator.rb +7 -0
  133. data/lib/rails_generator/generators/components/migration/templates/migration.rb +7 -0
  134. data/lib/rails_generator/generators/components/model/USAGE +26 -0
  135. data/lib/rails_generator/generators/components/model/model_generator.rb +38 -0
  136. data/lib/rails_generator/generators/components/model/templates/fixtures.yml +11 -0
  137. data/lib/rails_generator/generators/components/model/templates/migration.rb +13 -0
  138. data/lib/rails_generator/generators/components/model/templates/model.rb +2 -0
  139. data/lib/rails_generator/generators/components/model/templates/unit_test.rb +10 -0
  140. data/lib/rails_generator/generators/components/observer/USAGE +15 -0
  141. data/lib/rails_generator/generators/components/observer/observer_generator.rb +16 -0
  142. data/lib/rails_generator/generators/components/observer/templates/observer.rb +2 -0
  143. data/lib/rails_generator/generators/components/observer/templates/unit_test.rb +10 -0
  144. data/lib/rails_generator/generators/components/plugin/USAGE +35 -0
  145. data/lib/rails_generator/generators/components/plugin/plugin_generator.rb +38 -0
  146. data/lib/rails_generator/generators/components/plugin/templates/README +4 -0
  147. data/lib/rails_generator/generators/components/plugin/templates/Rakefile +22 -0
  148. data/lib/rails_generator/generators/components/plugin/templates/USAGE +8 -0
  149. data/lib/rails_generator/generators/components/plugin/templates/generator.rb +8 -0
  150. data/lib/rails_generator/generators/components/plugin/templates/init.rb +1 -0
  151. data/lib/rails_generator/generators/components/plugin/templates/install.rb +1 -0
  152. data/lib/rails_generator/generators/components/plugin/templates/plugin.rb +1 -0
  153. data/lib/rails_generator/generators/components/plugin/templates/tasks.rake +4 -0
  154. data/lib/rails_generator/generators/components/plugin/templates/uninstall.rb +1 -0
  155. data/lib/rails_generator/generators/components/plugin/templates/unit_test.rb +8 -0
  156. data/lib/rails_generator/generators/components/resource/resource_generator.rb +76 -0
  157. data/lib/rails_generator/generators/components/resource/templates/USAGE +18 -0
  158. data/lib/rails_generator/generators/components/resource/templates/controller.rb +2 -0
  159. data/lib/rails_generator/generators/components/resource/templates/fixtures.yml +11 -0
  160. data/lib/rails_generator/generators/components/resource/templates/functional_test.rb +20 -0
  161. data/lib/rails_generator/generators/components/resource/templates/helper.rb +2 -0
  162. data/lib/rails_generator/generators/components/resource/templates/migration.rb +13 -0
  163. data/lib/rails_generator/generators/components/resource/templates/model.rb +2 -0
  164. data/lib/rails_generator/generators/components/resource/templates/unit_test.rb +10 -0
  165. data/lib/rails_generator/generators/components/scaffold/USAGE +32 -0
  166. data/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb +208 -0
  167. data/lib/rails_generator/generators/components/scaffold/templates/controller.rb +134 -0
  168. data/lib/rails_generator/generators/components/scaffold/templates/form.rhtml +3 -0
  169. data/lib/rails_generator/generators/components/scaffold/templates/form_scaffolding.rhtml +35 -0
  170. data/lib/rails_generator/generators/components/scaffold/templates/functional_test.rb +102 -0
  171. data/lib/rails_generator/generators/components/scaffold/templates/helper.rb +2 -0
  172. data/lib/rails_generator/generators/components/scaffold/templates/layout.rhtml +17 -0
  173. data/lib/rails_generator/generators/components/scaffold/templates/partial_list_elements.rhtml +127 -0
  174. data/lib/rails_generator/generators/components/scaffold/templates/style.css +74 -0
  175. data/lib/rails_generator/generators/components/scaffold/templates/view_edit.rhtml +75 -0
  176. data/lib/rails_generator/generators/components/scaffold/templates/view_list.rhtml +30 -0
  177. data/lib/rails_generator/generators/components/scaffold/templates/view_new.rhtml +8 -0
  178. data/lib/rails_generator/generators/components/scaffold/templates/view_show.rhtml +37 -0
  179. data/lib/rails_generator/generators/components/scaffold_resource/USAGE +29 -0
  180. data/lib/rails_generator/generators/components/scaffold_resource/scaffold_resource_generator.rb +92 -0
  181. data/lib/rails_generator/generators/components/scaffold_resource/templates/controller.rb +79 -0
  182. data/lib/rails_generator/generators/components/scaffold_resource/templates/fixtures.yml +11 -0
  183. data/lib/rails_generator/generators/components/scaffold_resource/templates/functional_test.rb +57 -0
  184. data/lib/rails_generator/generators/components/scaffold_resource/templates/helper.rb +2 -0
  185. data/lib/rails_generator/generators/components/scaffold_resource/templates/layout.rhtml +17 -0
  186. data/lib/rails_generator/generators/components/scaffold_resource/templates/migration.rb +13 -0
  187. data/lib/rails_generator/generators/components/scaffold_resource/templates/model.rb +2 -0
  188. data/lib/rails_generator/generators/components/scaffold_resource/templates/style.css +74 -0
  189. data/lib/rails_generator/generators/components/scaffold_resource/templates/unit_test.rb +10 -0
  190. data/lib/rails_generator/generators/components/scaffold_resource/templates/view_edit.rhtml +19 -0
  191. data/lib/rails_generator/generators/components/scaffold_resource/templates/view_index.rhtml +24 -0
  192. data/lib/rails_generator/generators/components/scaffold_resource/templates/view_new.rhtml +18 -0
  193. data/lib/rails_generator/generators/components/scaffold_resource/templates/view_show.rhtml +10 -0
  194. data/lib/rails_generator/generators/components/session_migration/USAGE +15 -0
  195. data/lib/rails_generator/generators/components/session_migration/session_migration_generator.rb +18 -0
  196. data/lib/rails_generator/generators/components/session_migration/templates/migration.rb +16 -0
  197. data/lib/rails_generator/generators/components/web_service/USAGE +28 -0
  198. data/lib/rails_generator/generators/components/web_service/templates/api_definition.rb +5 -0
  199. data/lib/rails_generator/generators/components/web_service/templates/controller.rb +8 -0
  200. data/lib/rails_generator/generators/components/web_service/templates/functional_test.rb +19 -0
  201. data/lib/rails_generator/generators/components/web_service/web_service_generator.rb +29 -0
  202. data/lib/rails_generator/lookup.rb +209 -0
  203. data/lib/rails_generator/manifest.rb +53 -0
  204. data/lib/rails_generator/options.rb +143 -0
  205. data/lib/rails_generator/scripts.rb +83 -0
  206. data/lib/rails_generator/scripts/destroy.rb +7 -0
  207. data/lib/rails_generator/scripts/generate.rb +7 -0
  208. data/lib/rails_generator/scripts/update.rb +12 -0
  209. data/lib/rails_generator/simple_logger.rb +46 -0
  210. data/lib/rails_generator/spec.rb +44 -0
  211. data/lib/railties_path.rb +1 -0
  212. data/lib/ruby_version_check.rb +17 -0
  213. data/lib/rubyprof_ext.rb +35 -0
  214. data/lib/tasks/databases.rake +187 -0
  215. data/lib/tasks/documentation.rake +82 -0
  216. data/lib/tasks/framework.rake +112 -0
  217. data/lib/tasks/log.rake +9 -0
  218. data/lib/tasks/misc.rake +4 -0
  219. data/lib/tasks/pre_namespace_aliases.rake +53 -0
  220. data/lib/tasks/rails.rb +8 -0
  221. data/lib/tasks/statistics.rake +18 -0
  222. data/lib/tasks/testing.rake +120 -0
  223. data/lib/tasks/tmp.rake +37 -0
  224. data/lib/test_help.rb +19 -0
  225. data/lib/webrick_server.rb +166 -0
  226. data/libs/migration_helper.rb +11 -0
  227. data/migrations/001_create_logins.rb +22 -0
  228. data/migrations/002_create_admins.rb +16 -0
  229. data/migrations/003_create_roles.rb +13 -0
  230. data/migrations/004_create_tables.rb +11 -0
  231. data/migrations/005_create_attr_types.rb +13 -0
  232. data/migrations/006_create_table_fields.rb +22 -0
  233. data/migrations/007_create_tab_operations.rb +13 -0
  234. data/migrations/008_create_attr_operations.rb +13 -0
  235. data/migrations/009_create_tab_permissions.rb +21 -0
  236. data/migrations/010_create_attr_permissions.rb +21 -0
  237. data/migrations/011_create_relations.rb +23 -0
  238. data/migrations/012_create_scaffolds.rb +11 -0
  239. data/migrations/013_create_relation_permissions.rb +20 -0
  240. data/models/admin.rb +38 -0
  241. data/models/attr_operation.rb +3 -0
  242. data/models/attr_permission.rb +5 -0
  243. data/models/attr_type.rb +3 -0
  244. data/models/login.rb +51 -0
  245. data/models/relation.rb +5 -0
  246. data/models/relation_permission.rb +4 -0
  247. data/models/role.rb +13 -0
  248. data/models/scaffold.rb +2 -0
  249. data/models/tab_operation.rb +3 -0
  250. data/models/tab_permission.rb +5 -0
  251. data/models/table.rb +18 -0
  252. data/models/table_field.rb +6 -0
  253. data/plugins/redhillonrails_core/CHANGELOG +186 -0
  254. data/plugins/redhillonrails_core/MIT-LICENSE +20 -0
  255. data/plugins/redhillonrails_core/README +152 -0
  256. data/plugins/redhillonrails_core/init.rb +1 -0
  257. data/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/base.rb +54 -0
  258. data/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/abstract_adapter.rb +46 -0
  259. data/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/column.rb +21 -0
  260. data/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/foreign_key_definition.rb +26 -0
  261. data/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/index_definition.rb +11 -0
  262. data/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/mysql_adapter.rb +94 -0
  263. data/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/mysql_column.rb +8 -0
  264. data/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/postgresql_adapter.rb +131 -0
  265. data/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/schema_statements.rb +23 -0
  266. data/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/sqlite3_adapter.rb +9 -0
  267. data/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/table_definition.rb +27 -0
  268. data/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/schema.rb +25 -0
  269. data/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/schema_dumper.rb +58 -0
  270. data/plugins/redhillonrails_core/lib/redhillonrails_core.rb +19 -0
  271. data/plugins/redhillonrails_core/tasks/db/comments.rake +9 -0
  272. data/plugins/schema_validations/CHANGELOG +149 -0
  273. data/plugins/schema_validations/MIT-LICENSE +20 -0
  274. data/plugins/schema_validations/README +54 -0
  275. data/plugins/schema_validations/about.yml +5 -0
  276. data/plugins/schema_validations/init.rb +1 -0
  277. data/plugins/schema_validations/install.rb +1 -0
  278. data/plugins/schema_validations/lib/red_hill_consulting/schema_validations/active_record/base.rb +108 -0
  279. data/plugins/schema_validations/lib/schema_validations.rb +1 -0
  280. data/plugins/svn/README +69 -0
  281. data/plugins/svn/Rakefile +22 -0
  282. data/plugins/svn/assets/javascripts/live_validation.js +4 -0
  283. data/plugins/svn/assets/stylesheets/live_validation.css +28 -0
  284. data/plugins/svn/init.rb +2 -0
  285. data/plugins/svn/install.rb +1 -0
  286. data/plugins/svn/lib/form_helpers.rb +49 -0
  287. data/plugins/svn/lib/live_validations.rb +73 -0
  288. data/plugins/svn/tasks/live_validation_tasks.rake +17 -0
  289. data/plugins/svn/test/form_helpers_test.rb +214 -0
  290. data/plugins/svn/test/live_validations_test.rb +124 -0
  291. data/plugins/svn/test/resource.rb +17 -0
  292. data/plugins/svn/uninstall.rb +1 -0
  293. data/stylesheets/live_validation.css +28 -0
  294. data/stylesheets/print.css +72 -0
  295. data/stylesheets/scaffold.css +175 -0
  296. data/views/accounts/index.rhtml +12 -0
  297. data/views/accounts/show.rhtml +5 -0
  298. data/views/admin/_form.rhtml +15 -0
  299. data/views/admin/add_user.rhtml +21 -0
  300. data/views/admin/change_pwd.rhtml +23 -0
  301. data/views/admin/edit_user.rhtml +12 -0
  302. data/views/admin/index.rhtml +19 -0
  303. data/views/begin/index.rhtml +0 -0
  304. data/views/layouts/general.rhtml +59 -0
  305. data/views/layouts/login.rhtml +18 -0
  306. data/views/login/change_pwd.rhtml +21 -0
  307. data/views/login/expired_pwd.rhtml +19 -0
  308. data/views/login/index.rhtml +15 -0
  309. data/views/permission/index.rhtml +17 -0
  310. data/views/permission/relations.rhtml +28 -0
  311. data/views/permission/roles.rhtml +45 -0
  312. data/views/permission/tables.rhtml +53 -0
  313. data/views/roles/_form.rhtml +8 -0
  314. data/views/roles/edit.rhtml +11 -0
  315. data/views/roles/list.rhtml +28 -0
  316. data/views/roles/new.rhtml +8 -0
  317. data/views/roles/show.rhtml +14 -0
  318. data/views/shared_views/_advanced_search.rhtml +35 -0
  319. data/views/shared_views/_child_elements.rhtml +30 -0
  320. data/views/shared_views/_childs.rhtml +20 -0
  321. data/views/shared_views/_father_elements.rhtml +27 -0
  322. data/views/shared_views/_fathers.rhtml +21 -0
  323. data/views/shared_views/_fathers_header.rhtml +58 -0
  324. data/views/shared_views/_many_to_many_elements.rhtml +50 -0
  325. data/views/shared_views/_many_to_manys.rhtml +18 -0
  326. data/views/shared_views/_one_to_one_elements.rhtml +24 -0
  327. data/views/shared_views/_one_to_one_father_elements.rhtml +26 -0
  328. data/views/shared_views/_one_to_ones.rhtml +42 -0
  329. data/views/shared_views/_one_to_ones_header.rhtml +117 -0
  330. data/views/shared_views/edit_child.rhtml +89 -0
  331. data/views/shared_views/edit_many.rhtml +75 -0
  332. data/views/tables/_cascade.rhtml +10 -0
  333. data/views/tables/_field.rhtml +10 -0
  334. data/views/tables/_fk.rhtml +9 -0
  335. data/views/tables/_form.rhtml +9 -0
  336. data/views/tables/_join_table_name.rhtml +16 -0
  337. data/views/tables/_relation_types.rhtml +5 -0
  338. data/views/tables/_tables.rhtml +15 -0
  339. data/views/tables/attributes.rhtml +15 -0
  340. data/views/tables/edit.rhtml +11 -0
  341. data/views/tables/edit_field.rhtml +18 -0
  342. data/views/tables/list.rhtml +39 -0
  343. data/views/tables/new.rhtml +8 -0
  344. data/views/tables/new_field.rhtml +25 -0
  345. data/views/tables/relations.rhtml +24 -0
  346. data/views/tables/show.rhtml +24 -0
  347. metadata +518 -0
@@ -0,0 +1,225 @@
1
+ require 'fcgi'
2
+ require 'logger'
3
+ require 'dispatcher'
4
+ require 'rbconfig'
5
+
6
+ class RailsFCGIHandler
7
+ SIGNALS = {
8
+ 'HUP' => :reload,
9
+ 'INT' => :exit_now,
10
+ 'TERM' => :exit_now,
11
+ 'USR1' => :exit,
12
+ 'USR2' => :restart,
13
+ 'SIGTRAP' => :breakpoint
14
+ }
15
+ GLOBAL_SIGNALS = SIGNALS.keys - %w(USR1)
16
+
17
+ attr_reader :when_ready
18
+
19
+ attr_accessor :log_file_path
20
+ attr_accessor :gc_request_period
21
+
22
+
23
+ # Initialize and run the FastCGI instance, passing arguments through to new.
24
+ def self.process!(*args, &block)
25
+ new(*args, &block).process!
26
+ end
27
+
28
+ # Initialize the FastCGI instance with the path to a crash log
29
+ # detailing unhandled exceptions (default RAILS_ROOT/log/fastcgi.crash.log)
30
+ # and the number of requests to process between garbage collection runs
31
+ # (default nil for normal GC behavior.) Optionally, pass a block which
32
+ # takes this instance as an argument for further configuration.
33
+ def initialize(log_file_path = nil, gc_request_period = nil)
34
+ self.log_file_path = log_file_path || "#{RAILS_ROOT}/log/fastcgi.crash.log"
35
+ self.gc_request_period = gc_request_period
36
+
37
+ # Yield for additional configuration.
38
+ yield self if block_given?
39
+
40
+ # Safely install signal handlers.
41
+ install_signal_handlers
42
+
43
+ # Start error timestamp at 11 seconds ago.
44
+ @last_error_on = Time.now - 11
45
+
46
+ dispatcher_log :info, "starting"
47
+ end
48
+
49
+ def process!(provider = FCGI)
50
+ # Make a note of $" so we can safely reload this instance.
51
+ mark!
52
+
53
+ run_gc! if gc_request_period
54
+
55
+ process_each_request!(provider)
56
+
57
+ GC.enable
58
+ dispatcher_log :info, "terminated gracefully"
59
+
60
+ rescue SystemExit => exit_error
61
+ dispatcher_log :info, "terminated by explicit exit"
62
+
63
+ rescue Exception => fcgi_error # FCGI errors
64
+ # retry on errors that would otherwise have terminated the FCGI process,
65
+ # but only if they occur more than 10 seconds apart.
66
+ if !(SignalException === fcgi_error) && Time.now - @last_error_on > 10
67
+ @last_error_on = Time.now
68
+ dispatcher_error(fcgi_error, "almost killed by this error")
69
+ retry
70
+ else
71
+ dispatcher_error(fcgi_error, "killed by this error")
72
+ end
73
+ end
74
+
75
+
76
+ protected
77
+ def logger
78
+ @logger ||= Logger.new(@log_file_path)
79
+ end
80
+
81
+ def dispatcher_log(level, msg)
82
+ time_str = Time.now.strftime("%d/%b/%Y:%H:%M:%S")
83
+ logger.send(level, "[#{time_str} :: #{$$}] #{msg}")
84
+ rescue Exception => log_error # Logger errors
85
+ STDERR << "Couldn't write to #{@log_file_path.inspect}: #{msg}\n"
86
+ STDERR << " #{log_error.class}: #{log_error.message}\n"
87
+ end
88
+
89
+ def dispatcher_error(e, msg = "")
90
+ error_message =
91
+ "Dispatcher failed to catch: #{e} (#{e.class})\n" +
92
+ " #{e.backtrace.join("\n ")}\n#{msg}"
93
+ dispatcher_log(:error, error_message)
94
+ end
95
+
96
+ def install_signal_handlers
97
+ GLOBAL_SIGNALS.each { |signal| install_signal_handler(signal) }
98
+ end
99
+
100
+ def install_signal_handler(signal, handler = nil)
101
+ handler ||= method("#{SIGNALS[signal]}_handler").to_proc
102
+ trap(signal, handler)
103
+ rescue ArgumentError
104
+ dispatcher_log :warn, "Ignoring unsupported signal #{signal}."
105
+ end
106
+
107
+ def with_signal_handler(signal)
108
+ install_signal_handler(signal)
109
+ yield
110
+ ensure
111
+ install_signal_handler(signal, 'DEFAULT')
112
+ end
113
+
114
+ def exit_now_handler(signal)
115
+ dispatcher_log :info, "asked to terminate immediately"
116
+ exit
117
+ end
118
+
119
+ def exit_handler(signal)
120
+ dispatcher_log :info, "asked to terminate ASAP"
121
+ @when_ready = :exit
122
+ end
123
+
124
+ def reload_handler(signal)
125
+ dispatcher_log :info, "asked to reload ASAP"
126
+ @when_ready = :reload
127
+ end
128
+
129
+ def restart_handler(signal)
130
+ dispatcher_log :info, "asked to restart ASAP"
131
+ @when_ready = :restart
132
+ end
133
+
134
+ def breakpoint_handler(signal)
135
+ dispatcher_log :info, "asked to breakpoint ASAP"
136
+ @when_ready = :breakpoint
137
+ end
138
+
139
+ def process_each_request!(provider)
140
+ cgi = nil
141
+ provider.each_cgi do |cgi|
142
+ with_signal_handler 'USR1' do
143
+ process_request(cgi)
144
+ end
145
+
146
+ case when_ready
147
+ when :reload
148
+ reload!
149
+ when :restart
150
+ close_connection(cgi)
151
+ restart!
152
+ when :exit
153
+ close_connection(cgi)
154
+ break
155
+ when :breakpoint
156
+ close_connection(cgi)
157
+ breakpoint!
158
+ end
159
+
160
+ gc_countdown
161
+ end
162
+ rescue SignalException => signal
163
+ raise unless signal.message == 'SIGUSR1'
164
+ close_connection(cgi) if cgi
165
+ end
166
+
167
+ def process_request(cgi)
168
+ Dispatcher.dispatch(cgi)
169
+ rescue Exception => e # errors from CGI dispatch
170
+ raise if SignalException === e
171
+ dispatcher_error(e)
172
+ end
173
+
174
+ def restart!
175
+ config = ::Config::CONFIG
176
+ ruby = File::join(config['bindir'], config['ruby_install_name']) + config['EXEEXT']
177
+ command_line = [ruby, $0, ARGV].flatten.join(' ')
178
+
179
+ dispatcher_log :info, "restarted"
180
+
181
+ exec(command_line)
182
+ end
183
+
184
+ def reload!
185
+ run_gc! if gc_request_period
186
+ restore!
187
+ @when_ready = nil
188
+ dispatcher_log :info, "reloaded"
189
+ end
190
+
191
+ def mark!
192
+ @features = $".clone
193
+ end
194
+
195
+ def restore!
196
+ $".replace @features
197
+ Dispatcher.reset_application!
198
+ ActionController::Routing::Routes.reload
199
+ end
200
+
201
+ def breakpoint!
202
+ require 'breakpoint'
203
+ port = defined?(BREAKPOINT_SERVER_PORT) ? BREAKPOINT_SERVER_PORT : 42531
204
+ Breakpoint.activate_drb("druby://localhost:#{port}", nil, !defined?(FastCGI))
205
+ dispatcher_log :info, "breakpointing"
206
+ breakpoint
207
+ @when_ready = nil
208
+ end
209
+
210
+ def run_gc!
211
+ @gc_request_countdown = gc_request_period
212
+ GC.enable; GC.start; GC.disable
213
+ end
214
+
215
+ def gc_countdown
216
+ if gc_request_period
217
+ @gc_request_countdown -= 1
218
+ run_gc! if @gc_request_countdown <= 0
219
+ end
220
+ end
221
+
222
+ def close_connection(cgi)
223
+ cgi.instance_variable_get("@request").finish
224
+ end
225
+ end
@@ -0,0 +1,702 @@
1
+ require 'logger'
2
+ require 'set'
3
+ require File.join(File.dirname(__FILE__), 'railties_path')
4
+ require File.join(File.dirname(__FILE__), 'authorails/version')
5
+
6
+ RAILS_ENV = (ENV['RAILS_ENV'] || 'development').dup unless defined?(RAILS_ENV)
7
+
8
+ module Rails
9
+ # The Initializer is responsible for processing the Rails configuration, such
10
+ # as setting the $LOAD_PATH, requiring the right frameworks, initializing
11
+ # logging, and more. It can be run either as a single command that'll just
12
+ # use the default configuration, like this:
13
+ #
14
+ # Rails::Initializer.run
15
+ #
16
+ # But normally it's more interesting to pass in a custom configuration
17
+ # through the block running:
18
+ #
19
+ # Rails::Initializer.run do |config|
20
+ # config.frameworks -= [ :action_web_service ]
21
+ # end
22
+ #
23
+ # This will use the default configuration options from Rails::Configuration,
24
+ # but allow for overwriting on select areas.
25
+ class Initializer
26
+ # The Configuration instance used by this Initializer instance.
27
+ attr_reader :configuration
28
+
29
+ # The set of loaded plugins.
30
+ attr_reader :loaded_plugins
31
+
32
+ # Runs the initializer. By default, this will invoke the #process method,
33
+ # which simply executes all of the initialization routines. Alternately,
34
+ # you can specify explicitly which initialization routine you want:
35
+ #
36
+ # Rails::Initializer.run(:set_load_path)
37
+ #
38
+ # This is useful if you only want the load path initialized, without
39
+ # incuring the overhead of completely loading the entire environment.
40
+ def self.run(command = :process, configuration = Configuration.new)
41
+ yield configuration if block_given?
42
+ initializer = new configuration
43
+ initializer.send(command)
44
+ initializer
45
+ end
46
+
47
+ # Create a new Initializer instance that references the given Configuration
48
+ # instance.
49
+ def initialize(configuration)
50
+ @configuration = configuration
51
+ @loaded_plugins = []
52
+ end
53
+
54
+ # Sequentially step through all of the available initialization routines,
55
+ # in order:
56
+ #
57
+ # * #set_load_path
58
+ # * #set_connection_adapters
59
+ # * #require_frameworks
60
+ # * #load_environment
61
+ # * #initialize_database
62
+ # * #initialize_logger
63
+ # * #initialize_framework_logging
64
+ # * #initialize_framework_views
65
+ # * #initialize_dependency_mechanism
66
+ # * #initialize_breakpoints
67
+ # * #initialize_whiny_nils
68
+ # * #initialize_framework_settings
69
+ # * #load_environment
70
+ # * #load_plugins
71
+ # * #load_observers
72
+ # * #initialize_routing
73
+ #
74
+ # (Note that #load_environment is invoked twice, once at the start and
75
+ # once at the end, to support the legacy configuration style where the
76
+ # environment could overwrite the defaults directly, instead of via the
77
+ # Configuration instance.
78
+ def process
79
+ check_ruby_version
80
+ set_load_path
81
+ set_connection_adapters
82
+
83
+ require_frameworks
84
+ set_autoload_paths
85
+ load_environment
86
+
87
+ initialize_encoding
88
+ initialize_database
89
+ initialize_logger
90
+ initialize_framework_logging
91
+ initialize_framework_views
92
+ initialize_dependency_mechanism
93
+ initialize_breakpoints
94
+ initialize_whiny_nils
95
+ initialize_temporary_directories
96
+ initialize_framework_settings
97
+
98
+ # Support for legacy configuration style where the environment
99
+ # could overwrite anything set from the defaults/global through
100
+ # the individual base class configurations.
101
+ load_environment
102
+
103
+ add_support_load_paths
104
+
105
+ load_plugins
106
+
107
+ # Observers are loaded after plugins in case Observers or observed models are modified by plugins.
108
+ load_observers
109
+
110
+ # Routing must be initialized after plugins to allow the former to extend the routes
111
+ initialize_routing
112
+
113
+ # the framework is now fully initialized
114
+ after_initialize
115
+ end
116
+
117
+ # Check for valid Ruby version
118
+ # This is done in an external file, so we can use it
119
+ # from the `rails` program as well without duplication.
120
+ def check_ruby_version
121
+ require 'ruby_version_check'
122
+ end
123
+
124
+ # Set the <tt>$LOAD_PATH</tt> based on the value of
125
+ # Configuration#load_paths. Duplicates are removed.
126
+ def set_load_path
127
+ load_paths = configuration.load_paths + configuration.framework_paths
128
+ load_paths.reverse_each { |dir| $LOAD_PATH.unshift(dir) if File.directory?(dir) }
129
+ $LOAD_PATH.uniq!
130
+ end
131
+
132
+ # Set the paths from which Rails will automatically load source files, and
133
+ # the load_once paths.
134
+ def set_autoload_paths
135
+ Dependencies.load_paths = configuration.load_paths.uniq
136
+ Dependencies.load_once_paths = configuration.load_once_paths.uniq
137
+
138
+ extra = Dependencies.load_once_paths - Dependencies.load_paths
139
+ unless extra.empty?
140
+ abort <<-end_error
141
+ load_once_paths must be a subset of the load_paths.
142
+ Extra items in load_once_paths: #{extra * ','}
143
+ end_error
144
+ end
145
+
146
+ # Freeze the arrays so future modifications will fail rather than do nothing mysteriously
147
+ configuration.load_once_paths.freeze
148
+ end
149
+
150
+ # Sets the +RAILS_CONNECTION_ADAPTERS+ constant based on the value of
151
+ # Configuration#connection_adapters. This constant is used to determine
152
+ # which database adapters should be loaded (by default, all adapters are
153
+ # loaded).
154
+ def set_connection_adapters
155
+ Object.const_set("RAILS_CONNECTION_ADAPTERS", configuration.connection_adapters) if configuration.connection_adapters
156
+ end
157
+
158
+ # Requires all frameworks specified by the Configuration#frameworks
159
+ # list. By default, all frameworks (ActiveRecord, ActiveSupport,
160
+ # ActionPack, ActionMailer, and ActionWebService) are loaded.
161
+ def require_frameworks
162
+ configuration.frameworks.each { |framework| require(framework.to_s) }
163
+ end
164
+
165
+ # Add the load paths used by support functions such as the info controller
166
+ def add_support_load_paths
167
+ end
168
+
169
+ # Loads all plugins in <tt>config.plugin_paths</tt>. <tt>plugin_paths</tt>
170
+ # defaults to <tt>vendor/plugins</tt> but may also be set to a list of
171
+ # paths, such as
172
+ # config.plugin_paths = ['lib/plugins', 'vendor/plugins']
173
+ #
174
+ # Each plugin discovered in <tt>plugin_paths</tt> is initialized:
175
+ # * add its +lib+ directory, if present, to the beginning of the load path
176
+ # * evaluate <tt>init.rb</tt> if present
177
+ #
178
+ # After all plugins are loaded, duplicates are removed from the load path.
179
+ # If an array of plugin names is specified in config.plugins, the plugins
180
+ # will be loaded in that order. Otherwise, plugins are loaded in alphabetical
181
+ # order.
182
+ def load_plugins
183
+ if configuration.plugins.nil?
184
+ # a nil value implies we don't care about plugins; load 'em all in a reliable order
185
+ find_plugins(configuration.plugin_paths).sort.each { |path| load_plugin path }
186
+ elsif !configuration.plugins.empty?
187
+ # we've specified a config.plugins array, so respect that order
188
+ plugin_paths = find_plugins(configuration.plugin_paths)
189
+ configuration.plugins.each do |name|
190
+ path = plugin_paths.find { |p| File.basename(p) == name }
191
+ raise(LoadError, "Cannot find the plugin '#{name}'!") if path.nil?
192
+ load_plugin path
193
+ end
194
+ end
195
+ $LOAD_PATH.uniq!
196
+ end
197
+
198
+ # Loads the environment specified by Configuration#environment_path, which
199
+ # is typically one of development, testing, or production.
200
+ def load_environment
201
+ silence_warnings do
202
+ config = configuration
203
+ constants = self.class.constants
204
+ eval(IO.read(configuration.environment_path), binding, configuration.environment_path)
205
+ (self.class.constants - constants).each do |const|
206
+ Object.const_set(const, self.class.const_get(const))
207
+ end
208
+ end
209
+ end
210
+
211
+ def load_observers
212
+ ActiveRecord::Base.instantiate_observers
213
+ end
214
+
215
+ # This initialzation sets $KCODE to 'u' to enable the multibyte safe operations.
216
+ # Plugin authors supporting other encodings should override this behaviour and
217
+ # set the relevant +default_charset+ on ActionController::Base
218
+ def initialize_encoding
219
+ $KCODE='u'
220
+ end
221
+
222
+ # This initialization routine does nothing unless <tt>:active_record</tt>
223
+ # is one of the frameworks to load (Configuration#frameworks). If it is,
224
+ # this sets the database configuration from Configuration#database_configuration
225
+ # and then establishes the connection.
226
+ def initialize_database
227
+ return unless configuration.frameworks.include?(:active_record)
228
+ ActiveRecord::Base.configurations = configuration.database_configuration
229
+ ActiveRecord::Base.establish_connection
230
+ end
231
+
232
+ # If the +RAILS_DEFAULT_LOGGER+ constant is already set, this initialization
233
+ # routine does nothing. If the constant is not set, and Configuration#logger
234
+ # is not +nil+, this also does nothing. Otherwise, a new logger instance
235
+ # is created at Configuration#log_path, with a default log level of
236
+ # Configuration#log_level.
237
+ #
238
+ # If the log could not be created, the log will be set to output to
239
+ # +STDERR+, with a log level of +WARN+.
240
+ def initialize_logger
241
+ # if the environment has explicitly defined a logger, use it
242
+ return if defined?(RAILS_DEFAULT_LOGGER)
243
+
244
+ unless logger = configuration.logger
245
+ begin
246
+ logger = Logger.new(configuration.log_path)
247
+ logger.level = Logger.const_get(configuration.log_level.to_s.upcase)
248
+ rescue StandardError
249
+ logger = Logger.new(STDERR)
250
+ logger.level = Logger::WARN
251
+ logger.warn(
252
+ "Rails Error: Unable to access log file. Please ensure that #{configuration.log_path} exists and is chmod 0666. " +
253
+ "The log level has been raised to WARN and the output directed to STDERR until the problem is fixed."
254
+ )
255
+ end
256
+ end
257
+
258
+ silence_warnings { Object.const_set "RAILS_DEFAULT_LOGGER", logger }
259
+ end
260
+
261
+ # Sets the logger for ActiveRecord, ActionController, and ActionMailer
262
+ # (but only for those frameworks that are to be loaded). If the framework's
263
+ # logger is already set, it is not changed, otherwise it is set to use
264
+ # +RAILS_DEFAULT_LOGGER+.
265
+ def initialize_framework_logging
266
+ for framework in ([ :active_record, :action_controller, :action_mailer ] & configuration.frameworks)
267
+ framework.to_s.camelize.constantize.const_get("Base").logger ||= RAILS_DEFAULT_LOGGER
268
+ end
269
+ end
270
+
271
+ # Sets the +template_root+ for ActionController::Base and ActionMailer::Base
272
+ # (but only for those frameworks that are to be loaded). If the framework's
273
+ # +template_root+ has already been set, it is not changed, otherwise it is
274
+ # set to use Configuration#view_path.
275
+ def initialize_framework_views
276
+ for framework in ([ :action_controller, :action_mailer ] & configuration.frameworks)
277
+ framework.to_s.camelize.constantize.const_get("Base").template_root ||= configuration.view_path
278
+ end
279
+ end
280
+
281
+ # If ActionController is not one of the loaded frameworks (Configuration#frameworks)
282
+ # this does nothing. Otherwise, it loads the routing definitions and sets up
283
+ # loading module used to lazily load controllers (Configuration#controller_paths).
284
+ def initialize_routing
285
+ return unless configuration.frameworks.include?(:action_controller)
286
+ ActionController::Routing.controller_paths = configuration.controller_paths
287
+ ActionController::Routing::Routes.reload
288
+ end
289
+
290
+ # Sets the dependency loading mechanism based on the value of
291
+ # Configuration#cache_classes.
292
+ def initialize_dependency_mechanism
293
+ Dependencies.mechanism = configuration.cache_classes ? :require : :load
294
+ end
295
+
296
+ # Sets the +BREAKPOINT_SERVER_PORT+ if Configuration#breakpoint_server
297
+ # is true.
298
+ def initialize_breakpoints
299
+ silence_warnings { Object.const_set("BREAKPOINT_SERVER_PORT", 42531) if configuration.breakpoint_server }
300
+ end
301
+
302
+ # Loads support for "whiny nil" (noisy warnings when methods are invoked
303
+ # on +nil+ values) if Configuration#whiny_nils is true.
304
+ def initialize_whiny_nils
305
+ require('active_support/whiny_nil') if configuration.whiny_nils
306
+ end
307
+
308
+ def initialize_temporary_directories
309
+ if configuration.frameworks.include?(:action_controller)
310
+ session_path = "#{RAILS_ROOT}/tmp/sessions/"
311
+ ActionController::Base.session_options[:tmpdir] = File.exist?(session_path) ? session_path : Dir::tmpdir
312
+
313
+ cache_path = "#{RAILS_ROOT}/tmp/cache/"
314
+ if File.exist?(cache_path)
315
+ ActionController::Base.fragment_cache_store = :file_store, cache_path
316
+ end
317
+ end
318
+ end
319
+
320
+ # Initializes framework-specific settings for each of the loaded frameworks
321
+ # (Configuration#frameworks). The available settings map to the accessors
322
+ # on each of the corresponding Base classes.
323
+ def initialize_framework_settings
324
+ configuration.frameworks.each do |framework|
325
+ base_class = framework.to_s.camelize.constantize.const_get("Base")
326
+
327
+ configuration.send(framework).each do |setting, value|
328
+ base_class.send("#{setting}=", value)
329
+ end
330
+ end
331
+ end
332
+
333
+ # Fires the user-supplied after_initialize block (Configuration#after_initialize)
334
+ def after_initialize
335
+ configuration.after_initialize_block.call if configuration.after_initialize_block
336
+ end
337
+
338
+ protected
339
+ # Return a list of plugin paths within base_path. A plugin path is
340
+ # a directory that contains either a lib directory or an init.rb file.
341
+ # This recurses into directories which are not plugin paths, so you
342
+ # may organize your plugins within the plugin path.
343
+ def find_plugins(*base_paths)
344
+ base_paths.flatten.inject([]) do |plugins, base_path|
345
+ Dir.glob(File.join(base_path, '*')).each do |path|
346
+ if plugin_path?(path)
347
+ plugins << path if plugin_enabled?(path)
348
+ elsif File.directory?(path)
349
+ plugins += find_plugins(path)
350
+ end
351
+ end
352
+ plugins
353
+ end
354
+ end
355
+
356
+ def plugin_path?(path)
357
+ File.directory?(path) and (File.directory?(File.join(path, 'lib')) or File.file?(File.join(path, 'init.rb')))
358
+ end
359
+
360
+ def plugin_enabled?(path)
361
+ configuration.plugins.nil? || configuration.plugins.include?(File.basename(path))
362
+ end
363
+
364
+ # Load the plugin at <tt>path</tt> unless already loaded.
365
+ #
366
+ # Each plugin is initialized:
367
+ # * add its +lib+ directory, if present, to the beginning of the load path
368
+ # * evaluate <tt>init.rb</tt> if present
369
+ #
370
+ # Returns <tt>true</tt> if the plugin is successfully loaded or
371
+ # <tt>false</tt> if it is already loaded (similar to Kernel#require).
372
+ # Raises <tt>LoadError</tt> if the plugin is not found.
373
+ def load_plugin(directory)
374
+ name = File.basename(directory)
375
+ return false if loaded_plugins.include?(name)
376
+
377
+ # Catch nonexistent and empty plugins.
378
+ raise LoadError, "No such plugin: #{directory}" unless plugin_path?(directory)
379
+
380
+ lib_path = File.join(directory, 'lib')
381
+ init_path = File.join(directory, 'init.rb')
382
+ has_lib = File.directory?(lib_path)
383
+ has_init = File.file?(init_path)
384
+
385
+ # Add lib to load path *after* the application lib, to allow
386
+ # application libraries to override plugin libraries.
387
+ if has_lib
388
+ application_lib_index = $LOAD_PATH.index(File.join(RAILS_ROOT, "lib")) || 0
389
+ $LOAD_PATH.insert(application_lib_index + 1, lib_path)
390
+ Dependencies.load_paths << lib_path
391
+ Dependencies.load_once_paths << lib_path
392
+ end
393
+
394
+ # Allow plugins to reference the current configuration object
395
+ config = configuration
396
+
397
+ # Add to set of loaded plugins before 'name' collapsed in eval.
398
+ loaded_plugins << name
399
+
400
+ # Evaluate init.rb.
401
+ silence_warnings { eval(IO.read(init_path), binding, init_path) } if has_init
402
+
403
+ true
404
+ end
405
+ end
406
+
407
+ # The Configuration class holds all the parameters for the Initializer and
408
+ # ships with defaults that suites most Rails applications. But it's possible
409
+ # to overwrite everything. Usually, you'll create an Configuration file
410
+ # implicitly through the block running on the Initializer, but it's also
411
+ # possible to create the Configuration instance in advance and pass it in
412
+ # like this:
413
+ #
414
+ # config = Rails::Configuration.new
415
+ # Rails::Initializer.run(:process, config)
416
+ class Configuration
417
+ # A stub for setting options on ActionController::Base
418
+ attr_accessor :action_controller
419
+
420
+ # A stub for setting options on ActionMailer::Base
421
+ attr_accessor :action_mailer
422
+
423
+ # A stub for setting options on ActionView::Base
424
+ attr_accessor :action_view
425
+
426
+ # A stub for setting options on ActionWebService::Base
427
+ attr_accessor :action_web_service
428
+
429
+ # A stub for setting options on ActiveRecord::Base
430
+ attr_accessor :active_record
431
+
432
+ # Whether or not to use the breakpoint server (boolean)
433
+ attr_accessor :breakpoint_server
434
+
435
+ # Whether or not classes should be cached (set to false if you want
436
+ # application classes to be reloaded on each request)
437
+ attr_accessor :cache_classes
438
+
439
+ # The list of connection adapters to load. (By default, all connection
440
+ # adapters are loaded. You can set this to be just the adapter(s) you
441
+ # will use to reduce your application's load time.)
442
+ attr_accessor :connection_adapters
443
+
444
+ # The list of paths that should be searched for controllers. (Defaults
445
+ # to <tt>app/controllers</tt> and <tt>components</tt>.)
446
+ attr_accessor :controller_paths
447
+
448
+ # The path to the database configuration file to use. (Defaults to
449
+ # <tt>config/database.yml</tt>.)
450
+ attr_accessor :database_configuration_file
451
+
452
+ # The list of rails framework components that should be loaded. (Defaults
453
+ # to <tt>:active_record</tt>, <tt>:action_controller</tt>,
454
+ # <tt>:action_view</tt>, <tt>:action_mailer</tt>, and
455
+ # <tt>:action_web_service</tt>).
456
+ attr_accessor :frameworks
457
+
458
+ # An array of additional paths to prepend to the load path. By default,
459
+ # all +app+, +lib+, +vendor+ and mock paths are included in this list.
460
+ attr_accessor :load_paths
461
+
462
+ # An array of paths from which Rails will automatically load from only once.
463
+ # All elements of this array must also be in +load_paths+.
464
+ attr_accessor :load_once_paths
465
+
466
+ # The log level to use for the default Rails logger. In production mode,
467
+ # this defaults to <tt>:info</tt>. In development mode, it defaults to
468
+ # <tt>:debug</tt>.
469
+ attr_accessor :log_level
470
+
471
+ # The path to the log file to use. Defaults to log/#{environment}.log
472
+ # (e.g. log/development.log or log/production.log).
473
+ attr_accessor :log_path
474
+
475
+ # The specific logger to use. By default, a logger will be created and
476
+ # initialized using #log_path and #log_level, but a programmer may
477
+ # specifically set the logger to use via this accessor and it will be
478
+ # used directly.
479
+ attr_accessor :logger
480
+
481
+ # The root of the application's views. (Defaults to <tt>app/views</tt>.)
482
+ attr_accessor :view_path
483
+
484
+ # Set to +true+ if you want to be warned (noisily) when you try to invoke
485
+ # any method of +nil+. Set to +false+ for the standard Ruby behavior.
486
+ attr_accessor :whiny_nils
487
+
488
+ # The list of plugins to load. If this is set to <tt>nil</tt>, all plugins will
489
+ # be loaded. If this is set to <tt>[]</tt>, no plugins will be loaded. Otherwise,
490
+ # plugins will be loaded in the order specified.
491
+ attr_accessor :plugins
492
+
493
+ # The path to the root of the plugins directory. By default, it is in
494
+ # <tt>vendor/plugins</tt>.
495
+ attr_accessor :plugin_paths
496
+
497
+ # Create a new Configuration instance, initialized with the default
498
+ # values.
499
+ def initialize
500
+ self.frameworks = default_frameworks
501
+ self.load_paths = default_load_paths
502
+ self.load_once_paths = default_load_once_paths
503
+ self.log_path = default_log_path
504
+ self.log_level = default_log_level
505
+ self.view_path = default_view_path
506
+ self.controller_paths = default_controller_paths
507
+ self.cache_classes = default_cache_classes
508
+ self.breakpoint_server = default_breakpoint_server
509
+ self.whiny_nils = default_whiny_nils
510
+ self.plugins = default_plugins
511
+ self.plugin_paths = default_plugin_paths
512
+ self.database_configuration_file = default_database_configuration_file
513
+
514
+ for framework in default_frameworks
515
+ self.send("#{framework}=", Rails::OrderedOptions.new)
516
+ end
517
+ end
518
+
519
+ # Loads and returns the contents of the #database_configuration_file. The
520
+ # contents of the file are processed via ERB before being sent through
521
+ # YAML::load.
522
+ def database_configuration
523
+ YAML::load(ERB.new(IO.read(database_configuration_file)).result)
524
+ end
525
+
526
+ # The path to the current environment's file (development.rb, etc.). By
527
+ # default the file is at <tt>config/environments/#{environment}.rb</tt>.
528
+ def environment_path
529
+ "#{root_path}/config/environments/#{environment}.rb"
530
+ end
531
+
532
+ # Return the currently selected environment. By default, it returns the
533
+ # value of the +RAILS_ENV+ constant.
534
+ def environment
535
+ ::RAILS_ENV
536
+ end
537
+
538
+ # Sets a block which will be executed after rails has been fully initialized.
539
+ # Useful for per-environment configuration which depends on the framework being
540
+ # fully initialized.
541
+ def after_initialize(&after_initialize_block)
542
+ @after_initialize_block = after_initialize_block
543
+ end
544
+
545
+ # Returns the block set in Configuration#after_initialize
546
+ def after_initialize_block
547
+ @after_initialize_block
548
+ end
549
+
550
+ # Add a preparation callback that will run before every request in development
551
+ # mode, or before the first request in production.
552
+ #
553
+ # See Dispatcher#to_prepare.
554
+ def to_prepare(&callback)
555
+ require 'dispatcher' unless defined?(::Dispatcher)
556
+ Dispatcher.to_prepare(&callback)
557
+ end
558
+
559
+ def builtin_directories
560
+ # Include builtins only in the development environment.
561
+ (environment == 'development') ? Dir["#{RAILTIES_PATH}/builtin/*/"] : []
562
+ end
563
+
564
+ def framework_paths
565
+ # TODO: Don't include dirs for frameworks that are not used
566
+ %w(
567
+ railties
568
+ railties/lib
569
+ actionpack/lib
570
+ activesupport/lib
571
+ activerecord/lib
572
+ actionmailer/lib
573
+ actionwebservice/lib
574
+ ).map { |dir| "#{framework_root_path}/#{dir}" }.select { |dir| File.directory?(dir) }
575
+ end
576
+
577
+ private
578
+ def root_path
579
+ ::RAILS_ROOT
580
+ end
581
+
582
+ def framework_root_path
583
+ defined?(::RAILS_FRAMEWORK_ROOT) ? ::RAILS_FRAMEWORK_ROOT : "#{root_path}/vendor/rails"
584
+ end
585
+
586
+ def default_frameworks
587
+ [ :active_record, :action_controller, :action_view, :action_mailer, :action_web_service ]
588
+ end
589
+
590
+ def default_load_paths
591
+ paths = ["#{root_path}/test/mocks/#{environment}"]
592
+
593
+ # Add the app's controller directory
594
+ paths.concat(Dir["#{root_path}/app/controllers/"])
595
+
596
+ # Then components subdirectories.
597
+ paths.concat(Dir["#{root_path}/components/[_a-z]*"])
598
+
599
+ # Followed by the standard includes.
600
+ paths.concat %w(
601
+ app
602
+ app/models
603
+ app/controllers
604
+ app/helpers
605
+ app/services
606
+ app/apis
607
+ components
608
+ config
609
+ lib
610
+ vendor
611
+ ).map { |dir| "#{root_path}/#{dir}" }.select { |dir| File.directory?(dir) }
612
+
613
+ paths.concat builtin_directories
614
+ end
615
+
616
+ # Doesn't matter since plugins aren't in load_paths yet.
617
+ def default_load_once_paths
618
+ []
619
+ end
620
+
621
+ def default_log_path
622
+ File.join(root_path, 'log', "#{environment}.log")
623
+ end
624
+
625
+ def default_log_level
626
+ environment == 'production' ? :info : :debug
627
+ end
628
+
629
+ def default_database_configuration_file
630
+ File.join(root_path, 'config', 'database.yml')
631
+ end
632
+
633
+ def default_view_path
634
+ File.join(root_path, 'app', 'views')
635
+ end
636
+
637
+ def default_controller_paths
638
+ paths = [ File.join(root_path, 'app', 'controllers'), File.join(root_path, 'components') ]
639
+ paths.concat builtin_directories
640
+ paths
641
+ end
642
+
643
+ def default_dependency_mechanism
644
+ :load
645
+ end
646
+
647
+ def default_cache_classes
648
+ false
649
+ end
650
+
651
+ def default_breakpoint_server
652
+ false
653
+ end
654
+
655
+ def default_whiny_nils
656
+ false
657
+ end
658
+
659
+ def default_plugins
660
+ nil
661
+ end
662
+
663
+ def default_plugin_paths
664
+ ["#{root_path}/vendor/plugins"]
665
+ end
666
+ end
667
+ end
668
+
669
+ # Needs to be duplicated from Active Support since its needed before Active
670
+ # Support is available. Here both Options and Hash are namespaced to prevent
671
+ # conflicts with other implementations AND with the classes residing in ActiveSupport.
672
+ class Rails::OrderedOptions < Array #:nodoc:
673
+ def []=(key, value)
674
+ key = key.to_sym
675
+
676
+ if pair = find_pair(key)
677
+ pair.pop
678
+ pair << value
679
+ else
680
+ self << [key, value]
681
+ end
682
+ end
683
+
684
+ def [](key)
685
+ pair = find_pair(key.to_sym)
686
+ pair ? pair.last : nil
687
+ end
688
+
689
+ def method_missing(name, *args)
690
+ if name.to_s =~ /(.*)=$/
691
+ self[$1.to_sym] = args.first
692
+ else
693
+ self[name]
694
+ end
695
+ end
696
+
697
+ private
698
+ def find_pair(key)
699
+ self.each { |i| return i if i.first == key }
700
+ return false
701
+ end
702
+ end