rails_csi 2.3.5.p6

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 (320) hide show
  1. data/CHANGELOG +2172 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README +243 -0
  4. data/Rakefile +368 -0
  5. data/bin/about +4 -0
  6. data/bin/console +3 -0
  7. data/bin/dbconsole +3 -0
  8. data/bin/destroy +3 -0
  9. data/bin/generate +3 -0
  10. data/bin/performance/benchmarker +3 -0
  11. data/bin/performance/profiler +3 -0
  12. data/bin/plugin +3 -0
  13. data/bin/rails +20 -0
  14. data/bin/runner +3 -0
  15. data/bin/server +3 -0
  16. data/builtin/rails_info/rails/info.rb +131 -0
  17. data/builtin/rails_info/rails/info_controller.rb +9 -0
  18. data/builtin/rails_info/rails/info_helper.rb +2 -0
  19. data/builtin/rails_info/rails_info_controller.rb +2 -0
  20. data/configs/databases/frontbase.yml +28 -0
  21. data/configs/databases/ibm_db.yml +62 -0
  22. data/configs/databases/mysql.yml +60 -0
  23. data/configs/databases/oracle.yml +39 -0
  24. data/configs/databases/postgresql.yml +51 -0
  25. data/configs/databases/sqlite2.yml +19 -0
  26. data/configs/databases/sqlite3.yml +22 -0
  27. data/configs/empty.log +0 -0
  28. data/configs/initializers/backtrace_silencers.rb +7 -0
  29. data/configs/initializers/inflections.rb +10 -0
  30. data/configs/initializers/mime_types.rb +5 -0
  31. data/configs/initializers/new_rails_defaults.rb +21 -0
  32. data/configs/initializers/session_store.rb +15 -0
  33. data/configs/locales/en.yml +5 -0
  34. data/configs/routes.rb +43 -0
  35. data/configs/seeds.rb +7 -0
  36. data/dispatches/config.ru +7 -0
  37. data/dispatches/dispatch.fcgi +24 -0
  38. data/dispatches/dispatch.rb +10 -0
  39. data/dispatches/gateway.cgi +97 -0
  40. data/doc/README_FOR_APP +2 -0
  41. data/environments/boot.rb +110 -0
  42. data/environments/development.rb +17 -0
  43. data/environments/environment.rb +41 -0
  44. data/environments/production.rb +28 -0
  45. data/environments/test.rb +28 -0
  46. data/fresh_rakefile +10 -0
  47. data/guides/files/javascripts/code_highlighter.js +188 -0
  48. data/guides/files/javascripts/guides.js +8 -0
  49. data/guides/files/javascripts/highlighters.js +90 -0
  50. data/guides/files/stylesheets/main.css +441 -0
  51. data/guides/files/stylesheets/print.css +52 -0
  52. data/guides/files/stylesheets/reset.css +43 -0
  53. data/guides/files/stylesheets/style.css +13 -0
  54. data/guides/files/stylesheets/syntax.css +31 -0
  55. data/guides/images/belongs_to.png +0 -0
  56. data/guides/images/book_icon.gif +0 -0
  57. data/guides/images/bullet.gif +0 -0
  58. data/guides/images/chapters_icon.gif +0 -0
  59. data/guides/images/check_bullet.gif +0 -0
  60. data/guides/images/credits_pic_blank.gif +0 -0
  61. data/guides/images/csrf.png +0 -0
  62. data/guides/images/customized_error_messages.png +0 -0
  63. data/guides/images/error_messages.png +0 -0
  64. data/guides/images/feature_tile.gif +0 -0
  65. data/guides/images/footer_tile.gif +0 -0
  66. data/guides/images/fxn.jpg +0 -0
  67. data/guides/images/grey_bullet.gif +0 -0
  68. data/guides/images/habtm.png +0 -0
  69. data/guides/images/has_many.png +0 -0
  70. data/guides/images/has_many_through.png +0 -0
  71. data/guides/images/has_one.png +0 -0
  72. data/guides/images/has_one_through.png +0 -0
  73. data/guides/images/header_backdrop.png +0 -0
  74. data/guides/images/header_tile.gif +0 -0
  75. data/guides/images/i18n/demo_localized_pirate.png +0 -0
  76. data/guides/images/i18n/demo_translated_en.png +0 -0
  77. data/guides/images/i18n/demo_translated_pirate.png +0 -0
  78. data/guides/images/i18n/demo_translation_missing.png +0 -0
  79. data/guides/images/i18n/demo_untranslated.png +0 -0
  80. data/guides/images/icons/README +5 -0
  81. data/guides/images/icons/callouts/1.png +0 -0
  82. data/guides/images/icons/callouts/10.png +0 -0
  83. data/guides/images/icons/callouts/11.png +0 -0
  84. data/guides/images/icons/callouts/12.png +0 -0
  85. data/guides/images/icons/callouts/13.png +0 -0
  86. data/guides/images/icons/callouts/14.png +0 -0
  87. data/guides/images/icons/callouts/15.png +0 -0
  88. data/guides/images/icons/callouts/2.png +0 -0
  89. data/guides/images/icons/callouts/3.png +0 -0
  90. data/guides/images/icons/callouts/4.png +0 -0
  91. data/guides/images/icons/callouts/5.png +0 -0
  92. data/guides/images/icons/callouts/6.png +0 -0
  93. data/guides/images/icons/callouts/7.png +0 -0
  94. data/guides/images/icons/callouts/8.png +0 -0
  95. data/guides/images/icons/callouts/9.png +0 -0
  96. data/guides/images/icons/caution.png +0 -0
  97. data/guides/images/icons/example.png +0 -0
  98. data/guides/images/icons/home.png +0 -0
  99. data/guides/images/icons/important.png +0 -0
  100. data/guides/images/icons/next.png +0 -0
  101. data/guides/images/icons/note.png +0 -0
  102. data/guides/images/icons/prev.png +0 -0
  103. data/guides/images/icons/tip.png +0 -0
  104. data/guides/images/icons/up.png +0 -0
  105. data/guides/images/icons/warning.png +0 -0
  106. data/guides/images/nav_arrow.gif +0 -0
  107. data/guides/images/polymorphic.png +0 -0
  108. data/guides/images/posts_index.png +0 -0
  109. data/guides/images/rails_guides_logo.gif +0 -0
  110. data/guides/images/rails_logo_remix.gif +0 -0
  111. data/guides/images/rails_welcome.png +0 -0
  112. data/guides/images/session_fixation.png +0 -0
  113. data/guides/images/tab_grey.gif +0 -0
  114. data/guides/images/tab_info.gif +0 -0
  115. data/guides/images/tab_note.gif +0 -0
  116. data/guides/images/tab_red.gif +0 -0
  117. data/guides/images/tab_yellow.gif +0 -0
  118. data/guides/images/tab_yellow.png +0 -0
  119. data/guides/images/validation_error_messages.png +0 -0
  120. data/guides/rails_guides.rb +42 -0
  121. data/guides/rails_guides/generator.rb +138 -0
  122. data/guides/rails_guides/helpers.rb +34 -0
  123. data/guides/rails_guides/indexer.rb +55 -0
  124. data/guides/rails_guides/textile_extensions.rb +41 -0
  125. data/guides/source/2_2_release_notes.textile +422 -0
  126. data/guides/source/2_3_release_notes.textile +610 -0
  127. data/guides/source/action_controller_overview.textile +776 -0
  128. data/guides/source/action_mailer_basics.textile +424 -0
  129. data/guides/source/active_record_basics.textile +135 -0
  130. data/guides/source/active_record_querying.textile +969 -0
  131. data/guides/source/activerecord_validations_callbacks.textile +1086 -0
  132. data/guides/source/association_basics.textile +1781 -0
  133. data/guides/source/caching_with_rails.textile +524 -0
  134. data/guides/source/command_line.textile +589 -0
  135. data/guides/source/configuring.textile +234 -0
  136. data/guides/source/contribute.textile +71 -0
  137. data/guides/source/contributing_to_rails.textile +239 -0
  138. data/guides/source/credits.erb.textile +52 -0
  139. data/guides/source/debugging_rails_applications.textile +709 -0
  140. data/guides/source/form_helpers.textile +766 -0
  141. data/guides/source/getting_started.textile +1297 -0
  142. data/guides/source/i18n.textile +912 -0
  143. data/guides/source/index.erb.textile +124 -0
  144. data/guides/source/layout.html.erb +103 -0
  145. data/guides/source/layouts_and_rendering.textile +979 -0
  146. data/guides/source/migrations.textile +591 -0
  147. data/guides/source/nested_model_forms.textile +222 -0
  148. data/guides/source/performance_testing.textile +531 -0
  149. data/guides/source/plugins.textile +1512 -0
  150. data/guides/source/rails_on_rack.textile +309 -0
  151. data/guides/source/routing.textile +903 -0
  152. data/guides/source/security.textile +986 -0
  153. data/guides/source/testing.textile +951 -0
  154. data/helpers/application_controller.rb +10 -0
  155. data/helpers/application_helper.rb +3 -0
  156. data/helpers/performance_test.rb +9 -0
  157. data/helpers/test_helper.rb +38 -0
  158. data/html/404.html +30 -0
  159. data/html/422.html +30 -0
  160. data/html/500.html +30 -0
  161. data/html/favicon.ico +0 -0
  162. data/html/images/rails.png +0 -0
  163. data/html/index.html +275 -0
  164. data/html/javascripts/application.js +2 -0
  165. data/html/javascripts/controls.js +963 -0
  166. data/html/javascripts/dragdrop.js +973 -0
  167. data/html/javascripts/effects.js +1128 -0
  168. data/html/javascripts/prototype.js +4320 -0
  169. data/html/robots.txt +5 -0
  170. data/lib/code_statistics.rb +107 -0
  171. data/lib/commands.rb +17 -0
  172. data/lib/commands/about.rb +3 -0
  173. data/lib/commands/console.rb +45 -0
  174. data/lib/commands/dbconsole.rb +87 -0
  175. data/lib/commands/destroy.rb +6 -0
  176. data/lib/commands/generate.rb +6 -0
  177. data/lib/commands/ncgi/listener +86 -0
  178. data/lib/commands/ncgi/tracker +69 -0
  179. data/lib/commands/performance/benchmarker.rb +24 -0
  180. data/lib/commands/performance/profiler.rb +50 -0
  181. data/lib/commands/plugin.rb +968 -0
  182. data/lib/commands/runner.rb +54 -0
  183. data/lib/commands/server.rb +114 -0
  184. data/lib/commands/update.rb +4 -0
  185. data/lib/console_app.rb +30 -0
  186. data/lib/console_sandbox.rb +6 -0
  187. data/lib/console_with_helpers.rb +5 -0
  188. data/lib/dispatcher.rb +24 -0
  189. data/lib/fcgi_handler.rb +239 -0
  190. data/lib/initializer.rb +1128 -0
  191. data/lib/performance_test_help.rb +5 -0
  192. data/lib/rails/backtrace_cleaner.rb +54 -0
  193. data/lib/rails/gem_builder.rb +21 -0
  194. data/lib/rails/gem_dependency.rb +311 -0
  195. data/lib/rails/plugin.rb +179 -0
  196. data/lib/rails/plugin/loader.rb +198 -0
  197. data/lib/rails/plugin/locator.rb +100 -0
  198. data/lib/rails/rack.rb +8 -0
  199. data/lib/rails/rack/debugger.rb +23 -0
  200. data/lib/rails/rack/log_tailer.rb +35 -0
  201. data/lib/rails/rack/metal.rb +51 -0
  202. data/lib/rails/rack/static.rb +46 -0
  203. data/lib/rails/vendor_gem_source_index.rb +140 -0
  204. data/lib/rails/version.rb +9 -0
  205. data/lib/rails_generator.rb +43 -0
  206. data/lib/rails_generator/base.rb +266 -0
  207. data/lib/rails_generator/commands.rb +621 -0
  208. data/lib/rails_generator/generated_attribute.rb +46 -0
  209. data/lib/rails_generator/generators/applications/app/USAGE +9 -0
  210. data/lib/rails_generator/generators/applications/app/app_generator.rb +263 -0
  211. data/lib/rails_generator/generators/applications/app/scm/git.rb +18 -0
  212. data/lib/rails_generator/generators/applications/app/scm/scm.rb +8 -0
  213. data/lib/rails_generator/generators/applications/app/scm/svn.rb +7 -0
  214. data/lib/rails_generator/generators/applications/app/template_runner.rb +401 -0
  215. data/lib/rails_generator/generators/components/controller/USAGE +30 -0
  216. data/lib/rails_generator/generators/components/controller/controller_generator.rb +43 -0
  217. data/lib/rails_generator/generators/components/controller/templates/controller.rb +7 -0
  218. data/lib/rails_generator/generators/components/controller/templates/functional_test.rb +8 -0
  219. data/lib/rails_generator/generators/components/controller/templates/helper.rb +2 -0
  220. data/lib/rails_generator/generators/components/controller/templates/helper_test.rb +4 -0
  221. data/lib/rails_generator/generators/components/controller/templates/view.html.erb +2 -0
  222. data/lib/rails_generator/generators/components/helper/USAGE +24 -0
  223. data/lib/rails_generator/generators/components/helper/helper_generator.rb +25 -0
  224. data/lib/rails_generator/generators/components/helper/templates/helper.rb +2 -0
  225. data/lib/rails_generator/generators/components/helper/templates/helper_test.rb +4 -0
  226. data/lib/rails_generator/generators/components/integration_test/USAGE +8 -0
  227. data/lib/rails_generator/generators/components/integration_test/integration_test_generator.rb +16 -0
  228. data/lib/rails_generator/generators/components/integration_test/templates/integration_test.rb +10 -0
  229. data/lib/rails_generator/generators/components/mailer/USAGE +16 -0
  230. data/lib/rails_generator/generators/components/mailer/mailer_generator.rb +30 -0
  231. data/lib/rails_generator/generators/components/mailer/templates/fixture.erb +3 -0
  232. data/lib/rails_generator/generators/components/mailer/templates/fixture.rhtml +0 -0
  233. data/lib/rails_generator/generators/components/mailer/templates/mailer.rb +15 -0
  234. data/lib/rails_generator/generators/components/mailer/templates/unit_test.rb +20 -0
  235. data/lib/rails_generator/generators/components/mailer/templates/view.erb +3 -0
  236. data/lib/rails_generator/generators/components/mailer/templates/view.rhtml +0 -0
  237. data/lib/rails_generator/generators/components/metal/USAGE +8 -0
  238. data/lib/rails_generator/generators/components/metal/metal_generator.rb +8 -0
  239. data/lib/rails_generator/generators/components/metal/templates/metal.rb +12 -0
  240. data/lib/rails_generator/generators/components/migration/USAGE +29 -0
  241. data/lib/rails_generator/generators/components/migration/migration_generator.rb +20 -0
  242. data/lib/rails_generator/generators/components/migration/templates/migration.rb +11 -0
  243. data/lib/rails_generator/generators/components/model/USAGE +27 -0
  244. data/lib/rails_generator/generators/components/model/model_generator.rb +52 -0
  245. data/lib/rails_generator/generators/components/model/templates/fixtures.yml +19 -0
  246. data/lib/rails_generator/generators/components/model/templates/migration.rb +16 -0
  247. data/lib/rails_generator/generators/components/model/templates/model.rb +5 -0
  248. data/lib/rails_generator/generators/components/model/templates/unit_test.rb +8 -0
  249. data/lib/rails_generator/generators/components/observer/USAGE +13 -0
  250. data/lib/rails_generator/generators/components/observer/observer_generator.rb +16 -0
  251. data/lib/rails_generator/generators/components/observer/templates/observer.rb +2 -0
  252. data/lib/rails_generator/generators/components/observer/templates/unit_test.rb +8 -0
  253. data/lib/rails_generator/generators/components/performance_test/USAGE +8 -0
  254. data/lib/rails_generator/generators/components/performance_test/performance_test_generator.rb +16 -0
  255. data/lib/rails_generator/generators/components/performance_test/templates/performance_test.rb +9 -0
  256. data/lib/rails_generator/generators/components/plugin/USAGE +25 -0
  257. data/lib/rails_generator/generators/components/plugin/plugin_generator.rb +39 -0
  258. data/lib/rails_generator/generators/components/plugin/templates/MIT-LICENSE +20 -0
  259. data/lib/rails_generator/generators/components/plugin/templates/README +13 -0
  260. data/lib/rails_generator/generators/components/plugin/templates/Rakefile +23 -0
  261. data/lib/rails_generator/generators/components/plugin/templates/USAGE +8 -0
  262. data/lib/rails_generator/generators/components/plugin/templates/generator.rb +8 -0
  263. data/lib/rails_generator/generators/components/plugin/templates/init.rb +1 -0
  264. data/lib/rails_generator/generators/components/plugin/templates/install.rb +1 -0
  265. data/lib/rails_generator/generators/components/plugin/templates/plugin.rb +1 -0
  266. data/lib/rails_generator/generators/components/plugin/templates/tasks.rake +4 -0
  267. data/lib/rails_generator/generators/components/plugin/templates/test_helper.rb +3 -0
  268. data/lib/rails_generator/generators/components/plugin/templates/uninstall.rb +1 -0
  269. data/lib/rails_generator/generators/components/plugin/templates/unit_test.rb +8 -0
  270. data/lib/rails_generator/generators/components/resource/USAGE +23 -0
  271. data/lib/rails_generator/generators/components/resource/resource_generator.rb +76 -0
  272. data/lib/rails_generator/generators/components/resource/templates/controller.rb +2 -0
  273. data/lib/rails_generator/generators/components/resource/templates/functional_test.rb +8 -0
  274. data/lib/rails_generator/generators/components/resource/templates/helper.rb +2 -0
  275. data/lib/rails_generator/generators/components/resource/templates/helper_test.rb +4 -0
  276. data/lib/rails_generator/generators/components/scaffold/USAGE +29 -0
  277. data/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb +103 -0
  278. data/lib/rails_generator/generators/components/scaffold/templates/controller.rb +85 -0
  279. data/lib/rails_generator/generators/components/scaffold/templates/functional_test.rb +45 -0
  280. data/lib/rails_generator/generators/components/scaffold/templates/helper.rb +2 -0
  281. data/lib/rails_generator/generators/components/scaffold/templates/helper_test.rb +4 -0
  282. data/lib/rails_generator/generators/components/scaffold/templates/layout.html.erb +17 -0
  283. data/lib/rails_generator/generators/components/scaffold/templates/style.css +54 -0
  284. data/lib/rails_generator/generators/components/scaffold/templates/view_edit.html.erb +18 -0
  285. data/lib/rails_generator/generators/components/scaffold/templates/view_index.html.erb +24 -0
  286. data/lib/rails_generator/generators/components/scaffold/templates/view_new.html.erb +17 -0
  287. data/lib/rails_generator/generators/components/scaffold/templates/view_show.html.erb +10 -0
  288. data/lib/rails_generator/generators/components/session_migration/USAGE +10 -0
  289. data/lib/rails_generator/generators/components/session_migration/session_migration_generator.rb +18 -0
  290. data/lib/rails_generator/generators/components/session_migration/templates/migration.rb +16 -0
  291. data/lib/rails_generator/lookup.rb +249 -0
  292. data/lib/rails_generator/manifest.rb +53 -0
  293. data/lib/rails_generator/options.rb +150 -0
  294. data/lib/rails_generator/scripts.rb +89 -0
  295. data/lib/rails_generator/scripts/destroy.rb +29 -0
  296. data/lib/rails_generator/scripts/generate.rb +7 -0
  297. data/lib/rails_generator/scripts/update.rb +12 -0
  298. data/lib/rails_generator/secret_key_generator.rb +24 -0
  299. data/lib/rails_generator/simple_logger.rb +46 -0
  300. data/lib/rails_generator/spec.rb +44 -0
  301. data/lib/railties_path.rb +1 -0
  302. data/lib/ruby_version_check.rb +17 -0
  303. data/lib/rubyprof_ext.rb +35 -0
  304. data/lib/source_annotation_extractor.rb +102 -0
  305. data/lib/tasks/annotations.rake +20 -0
  306. data/lib/tasks/databases.rake +436 -0
  307. data/lib/tasks/documentation.rake +88 -0
  308. data/lib/tasks/framework.rake +143 -0
  309. data/lib/tasks/gems.rake +78 -0
  310. data/lib/tasks/log.rake +9 -0
  311. data/lib/tasks/middleware.rake +7 -0
  312. data/lib/tasks/misc.rake +63 -0
  313. data/lib/tasks/rails.rb +9 -0
  314. data/lib/tasks/routes.rake +18 -0
  315. data/lib/tasks/statistics.rake +17 -0
  316. data/lib/tasks/testing.rake +139 -0
  317. data/lib/tasks/tmp.rake +37 -0
  318. data/lib/test_help.rb +38 -0
  319. data/lib/webrick_server.rb +156 -0
  320. metadata +495 -0
@@ -0,0 +1,5 @@
1
+ require 'action_controller/performance_test'
2
+
3
+ ActionController::Base.perform_caching = true
4
+ ActiveSupport::Dependencies.mechanism = :require
5
+ Rails.logger.level = ActiveSupport::BufferedLogger::INFO
@@ -0,0 +1,54 @@
1
+ module Rails
2
+ class BacktraceCleaner < ActiveSupport::BacktraceCleaner
3
+ ERB_METHOD_SIG = /:in `_run_erb_.*/
4
+
5
+ RAILS_GEMS = %w( actionpack activerecord actionmailer activesupport activeresource rails )
6
+
7
+ VENDOR_DIRS = %w( vendor/rails )
8
+ SERVER_DIRS = %w( lib/mongrel bin/mongrel
9
+ lib/passenger bin/passenger-spawn-server
10
+ lib/rack )
11
+ RAILS_NOISE = %w( script/server )
12
+ RUBY_NOISE = %w( rubygems/custom_require benchmark.rb )
13
+
14
+ ALL_NOISE = VENDOR_DIRS + SERVER_DIRS + RAILS_NOISE + RUBY_NOISE
15
+
16
+ def initialize
17
+ super
18
+ add_filter { |line| line.sub("#{RAILS_ROOT}/", '') }
19
+ add_filter { |line| line.sub(ERB_METHOD_SIG, '') }
20
+ add_filter { |line| line.sub('./', '/') } # for tests
21
+
22
+ add_gem_filters
23
+
24
+ add_silencer { |line| ALL_NOISE.any? { |dir| line.include?(dir) } }
25
+ add_silencer { |line| RAILS_GEMS.any? { |gem| line =~ /^#{gem} / } }
26
+ add_silencer { |line| line =~ %r(vendor/plugins/[^\/]+/lib) }
27
+ end
28
+
29
+
30
+ private
31
+ def add_gem_filters
32
+ Gem.path.each do |path|
33
+ # http://gist.github.com/30430
34
+ add_filter { |line| line.sub(/(#{path})\/gems\/([a-z]+)-([0-9.]+)\/(.*)/, '\2 (\3) \4')}
35
+ end
36
+
37
+ vendor_gems_path = Rails::GemDependency.unpacked_path.sub("#{RAILS_ROOT}/",'')
38
+ add_filter { |line| line.sub(/(#{vendor_gems_path})\/([a-z]+)-([0-9.]+)\/(.*)/, '\2 (\3) [v] \4')}
39
+ end
40
+ end
41
+
42
+ # For installing the BacktraceCleaner in the test/unit
43
+ module BacktraceFilterForTestUnit #:nodoc:
44
+ def self.included(klass)
45
+ klass.send :alias_method_chain, :filter_backtrace, :cleaning
46
+ end
47
+
48
+ def filter_backtrace_with_cleaning(backtrace, prefix=nil)
49
+ backtrace = filter_backtrace_without_cleaning(backtrace, prefix)
50
+ backtrace = backtrace.first.split("\n") if backtrace.size == 1
51
+ Rails.backtrace_cleaner.clean(backtrace)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,21 @@
1
+ require 'rubygems'
2
+ require 'rubygems/installer'
3
+
4
+ module Rails
5
+
6
+ # this class hijacks the functionality of Gem::Installer by overloading its
7
+ # initializer to only provide the information needed by
8
+ # Gem::Installer#build_extensions (which happens to be what we have)
9
+ class GemBuilder < Gem::Installer
10
+
11
+ def initialize(spec, gem_dir)
12
+ @spec = spec
13
+ @gem_dir = gem_dir
14
+ end
15
+
16
+ # silence the underlying builder
17
+ def say(message)
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,311 @@
1
+ require 'rails/vendor_gem_source_index'
2
+
3
+ module Gem
4
+ def self.source_index=(index)
5
+ @@source_index = index
6
+ end
7
+ end
8
+
9
+ module Rails
10
+ class GemDependency < Gem::Dependency
11
+ attr_accessor :lib, :source, :dep
12
+
13
+ def self.unpacked_path
14
+ @unpacked_path ||= File.join(RAILS_ROOT, 'vendor', 'gems')
15
+ end
16
+
17
+ @@framework_gems = {}
18
+
19
+ def self.add_frozen_gem_path
20
+ @@paths_loaded ||= begin
21
+ source_index = Rails::VendorGemSourceIndex.new(Gem.source_index)
22
+ Gem.clear_paths
23
+ Gem.source_index = source_index
24
+ # loaded before us - we can't change them, so mark them
25
+ Gem.loaded_specs.each do |name, spec|
26
+ @@framework_gems[name] = spec
27
+ end
28
+ true
29
+ end
30
+ end
31
+
32
+ def self.from_directory_name(directory_name, load_spec=true)
33
+ directory_name_parts = File.basename(directory_name).split('-')
34
+ name = directory_name_parts[0..-2].join('-')
35
+ version = directory_name_parts.last
36
+ result = self.new(name, :version => version)
37
+ spec_filename = File.join(directory_name, '.specification')
38
+ if load_spec
39
+ raise "Missing specification file in #{File.dirname(spec_filename)}. Perhaps you need to do a 'rake gems:refresh_specs'?" unless File.exists?(spec_filename)
40
+ spec = YAML::load_file(spec_filename)
41
+ result.specification = spec
42
+ end
43
+ result
44
+ rescue ArgumentError => e
45
+ raise "Unable to determine gem name and version from '#{directory_name}'"
46
+ end
47
+
48
+ def initialize(name, options = {})
49
+ require 'rubygems' unless Object.const_defined?(:Gem)
50
+
51
+ if options[:requirement]
52
+ req = options[:requirement]
53
+ elsif options[:version]
54
+ req = Gem::Requirement.create(options[:version])
55
+ else
56
+ req = Gem::Requirement.default
57
+ end
58
+
59
+ @lib = options[:lib]
60
+ @source = options[:source]
61
+ @loaded = @frozen = @load_paths_added = false
62
+
63
+ super(name, req)
64
+ end
65
+
66
+ def add_load_paths
67
+ self.class.add_frozen_gem_path
68
+ return if @loaded || @load_paths_added
69
+ if framework_gem?
70
+ @load_paths_added = @loaded = @frozen = true
71
+ return
72
+ end
73
+ gem self
74
+ @spec = Gem.loaded_specs[name]
75
+ @frozen = @spec.loaded_from.include?(self.class.unpacked_path) if @spec
76
+ @load_paths_added = true
77
+ rescue Gem::LoadError
78
+ end
79
+
80
+ def dependencies
81
+ return [] if framework_gem?
82
+ return [] unless installed?
83
+ specification.dependencies.reject do |dependency|
84
+ dependency.type == :development
85
+ end.map do |dependency|
86
+ GemDependency.new(dependency.name, :requirement => dependency.version_requirements)
87
+ end
88
+ end
89
+
90
+ def specification
91
+ # code repeated from Gem.activate. Find a matching spec, or the currently loaded version.
92
+ # error out if loaded version and requested version are incompatible.
93
+ @spec ||= begin
94
+ matches = Gem.source_index.search(self)
95
+ matches << @@framework_gems[name] if framework_gem?
96
+ if Gem.loaded_specs[name] then
97
+ # This gem is already loaded. If the currently loaded gem is not in the
98
+ # list of candidate gems, then we have a version conflict.
99
+ existing_spec = Gem.loaded_specs[name]
100
+ unless matches.any? { |spec| spec.version == existing_spec.version } then
101
+ raise Gem::Exception,
102
+ "can't activate #{@dep}, already activated #{existing_spec.full_name}"
103
+ end
104
+ # we're stuck with it, so change to match
105
+ version_requirements = Gem::Requirement.create("=#{existing_spec.version}")
106
+ existing_spec
107
+ else
108
+ # new load
109
+ matches.last
110
+ end
111
+ end
112
+ end
113
+
114
+ def specification=(s)
115
+ @spec = s
116
+ end
117
+
118
+ def requirement
119
+ r = version_requirements
120
+ (r == Gem::Requirement.default) ? nil : r
121
+ end
122
+
123
+ def built?
124
+ return false unless frozen?
125
+
126
+ if vendor_gem?
127
+ specification.extensions.each do |ext|
128
+ makefile = File.join(unpacked_gem_directory, File.dirname(ext), 'Makefile')
129
+ return false unless File.exists?(makefile)
130
+ end
131
+ end
132
+
133
+ true
134
+ end
135
+
136
+ def framework_gem?
137
+ @@framework_gems.has_key?(name)
138
+ end
139
+
140
+ def frozen?
141
+ @frozen ||= vendor_rails? || vendor_gem?
142
+ end
143
+
144
+ def installed?
145
+ Gem.loaded_specs.keys.include?(name)
146
+ end
147
+
148
+ def load_paths_added?
149
+ # always try to add load paths - even if a gem is loaded, it may not
150
+ # be a compatible version (ie random_gem 0.4 is loaded and a later spec
151
+ # needs >= 0.5 - gem 'random_gem' will catch this and error out)
152
+ @load_paths_added
153
+ end
154
+
155
+ def loaded?
156
+ @loaded ||= begin
157
+ if vendor_rails?
158
+ true
159
+ elsif specification.nil?
160
+ false
161
+ else
162
+ # check if the gem is loaded by inspecting $"
163
+ # specification.files lists all the files contained in the gem
164
+ gem_files = specification.files
165
+ # select only the files contained in require_paths - typically in bin and lib
166
+ require_paths_regexp = Regexp.new("^(#{specification.require_paths*'|'})/")
167
+ gem_lib_files = gem_files.select { |f| require_paths_regexp.match(f) }
168
+ # chop the leading directory off - a typical file might be in
169
+ # lib/gem_name/file_name.rb, but it will be 'require'd as gem_name/file_name.rb
170
+ gem_lib_files.map! { |f| f.split('/', 2)[1] }
171
+ # if any of the files from the above list appear in $", the gem is assumed to
172
+ # have been loaded
173
+ !(gem_lib_files & $").empty?
174
+ end
175
+ end
176
+ end
177
+
178
+ def vendor_rails?
179
+ Gem.loaded_specs.has_key?(name) && Gem.loaded_specs[name].loaded_from.empty?
180
+ end
181
+
182
+ def vendor_gem?
183
+ specification && File.exists?(unpacked_gem_directory)
184
+ end
185
+
186
+ def build(options={})
187
+ require 'rails/gem_builder'
188
+ return if specification.nil?
189
+ if options[:force] || !built?
190
+ return unless File.exists?(unpacked_specification_filename)
191
+ spec = YAML::load_file(unpacked_specification_filename)
192
+ Rails::GemBuilder.new(spec, unpacked_gem_directory).build_extensions
193
+ puts "Built gem: '#{unpacked_gem_directory}'"
194
+ end
195
+ dependencies.each { |dep| dep.build(options) }
196
+ end
197
+
198
+ def install
199
+ unless installed?
200
+ cmd = "#{gem_command} #{install_command.join(' ')}"
201
+ puts cmd
202
+ puts %x(#{cmd})
203
+ end
204
+ end
205
+
206
+ def load
207
+ return if @loaded || @load_paths_added == false
208
+ require(@lib || name) unless @lib == false
209
+ @loaded = true
210
+ rescue LoadError
211
+ puts $!.to_s
212
+ $!.backtrace.each { |b| puts b }
213
+ end
214
+
215
+ def refresh
216
+ Rails::VendorGemSourceIndex.silence_spec_warnings = true
217
+ real_gems = Gem.source_index.installed_source_index
218
+ exact_dep = Gem::Dependency.new(name, "= #{specification.version}")
219
+ matches = real_gems.search(exact_dep)
220
+ installed_spec = matches.first
221
+ if frozen?
222
+ if installed_spec
223
+ # we have a real copy
224
+ # get a fresh spec - matches should only have one element
225
+ # note that there is no reliable method to check that the loaded
226
+ # spec is the same as the copy from real_gems - Gem.activate changes
227
+ # some of the fields
228
+ real_spec = Gem::Specification.load(matches.first.loaded_from)
229
+ write_specification(real_spec)
230
+ puts "Reloaded specification for #{name} from installed gems."
231
+ else
232
+ # the gem isn't installed locally - write out our current specs
233
+ write_specification(specification)
234
+ puts "Gem #{name} not loaded locally - writing out current spec."
235
+ end
236
+ else
237
+ if framework_gem?
238
+ puts "Gem directory for #{name} not found - check if it's loading before rails."
239
+ else
240
+ puts "Something bad is going on - gem directory not found for #{name}."
241
+ end
242
+ end
243
+ end
244
+
245
+ def unpack(options={})
246
+ unless frozen? || framework_gem?
247
+ FileUtils.mkdir_p unpack_base
248
+ Dir.chdir unpack_base do
249
+ Gem::GemRunner.new.run(unpack_command)
250
+ end
251
+ # Gem.activate changes the spec - get the original
252
+ real_spec = Gem::Specification.load(specification.loaded_from)
253
+ write_specification(real_spec)
254
+ end
255
+ dependencies.each { |dep| dep.unpack(options) } if options[:recursive]
256
+ end
257
+
258
+ def write_specification(spec)
259
+ # copy the gem's specification into GEMDIR/.specification so that
260
+ # we can access information about the gem on deployment systems
261
+ # without having the gem installed
262
+ File.open(unpacked_specification_filename, 'w') do |file|
263
+ file.puts spec.to_yaml
264
+ end
265
+ end
266
+
267
+ def ==(other)
268
+ self.name == other.name && self.requirement == other.requirement
269
+ end
270
+ alias_method :"eql?", :"=="
271
+
272
+ private
273
+
274
+ def gem_command
275
+ case RUBY_PLATFORM
276
+ when /win32/
277
+ 'gem.bat'
278
+ when /java/
279
+ 'jruby -S gem'
280
+ else
281
+ 'gem'
282
+ end
283
+ end
284
+
285
+ def install_command
286
+ cmd = %w(install) << name
287
+ cmd << "--version" << %("#{requirement.to_s}") if requirement
288
+ cmd << "--source" << @source if @source
289
+ cmd
290
+ end
291
+
292
+ def unpack_command
293
+ cmd = %w(unpack) << name
294
+ cmd << "--version" << "= "+specification.version.to_s if requirement
295
+ cmd
296
+ end
297
+
298
+ def unpack_base
299
+ Rails::GemDependency.unpacked_path
300
+ end
301
+
302
+ def unpacked_gem_directory
303
+ File.join(unpack_base, specification.full_name)
304
+ end
305
+
306
+ def unpacked_specification_filename
307
+ File.join(unpacked_gem_directory, '.specification')
308
+ end
309
+
310
+ end
311
+ end
@@ -0,0 +1,179 @@
1
+ module Rails
2
+ # The Plugin class should be an object which provides the following methods:
3
+ #
4
+ # * +name+ - Used during initialisation to order the plugin (based on name and
5
+ # the contents of <tt>config.plugins</tt>).
6
+ # * +valid?+ - Returns true if this plugin can be loaded.
7
+ # * +load_paths+ - Each path within the returned array will be added to the <tt>$LOAD_PATH</tt>.
8
+ # * +load+ - Finally 'load' the plugin.
9
+ #
10
+ # These methods are expected by the Rails::Plugin::Locator and Rails::Plugin::Loader classes.
11
+ # The default implementation returns the <tt>lib</tt> directory as its <tt>load_paths</tt>,
12
+ # and evaluates <tt>init.rb</tt> when <tt>load</tt> is called.
13
+ #
14
+ # You can also inspect the about.yml data programmatically:
15
+ #
16
+ # plugin = Rails::Plugin.new(path_to_my_plugin)
17
+ # plugin.about["author"] # => "James Adam"
18
+ # plugin.about["url"] # => "http://interblah.net"
19
+ class Plugin
20
+ include Comparable
21
+
22
+ attr_reader :directory, :name
23
+
24
+ def initialize(directory)
25
+ @directory = directory
26
+ @name = File.basename(@directory) rescue nil
27
+ @loaded = false
28
+ end
29
+
30
+ def valid?
31
+ File.directory?(directory) && (has_app_directory? || has_lib_directory? || has_init_file?)
32
+ end
33
+
34
+ # Returns a list of paths this plugin wishes to make available in <tt>$LOAD_PATH</tt>.
35
+ def load_paths
36
+ report_nonexistant_or_empty_plugin! unless valid?
37
+
38
+ returning [] do |load_paths|
39
+ load_paths << lib_path if has_lib_directory?
40
+ load_paths << app_paths if has_app_directory?
41
+ end.flatten
42
+ end
43
+
44
+ # Evaluates a plugin's init.rb file.
45
+ def load(initializer)
46
+ return if loaded?
47
+ report_nonexistant_or_empty_plugin! unless valid?
48
+ evaluate_init_rb(initializer)
49
+ @loaded = true
50
+ end
51
+
52
+ def loaded?
53
+ @loaded
54
+ end
55
+
56
+ def <=>(other_plugin)
57
+ name <=> other_plugin.name
58
+ end
59
+
60
+ def about
61
+ @about ||= load_about_information
62
+ end
63
+
64
+ # Engines are plugins with an app/ directory.
65
+ def engine?
66
+ has_app_directory?
67
+ end
68
+
69
+ # Returns true if the engine ships with a routing file
70
+ def routed?
71
+ File.exist?(routing_file)
72
+ end
73
+
74
+ # Returns true if there is any localization file in locale_path
75
+ def localized?
76
+ locale_files.any?
77
+ end
78
+
79
+ def view_path
80
+ File.join(directory, 'app', 'views')
81
+ end
82
+
83
+ def controller_path
84
+ File.join(directory, 'app', 'controllers')
85
+ end
86
+
87
+ def metal_path
88
+ File.join(directory, 'app', 'metal')
89
+ end
90
+
91
+ def routing_file
92
+ File.join(directory, 'config', 'routes.rb')
93
+ end
94
+
95
+ def locale_path
96
+ File.join(directory, 'config', 'locales')
97
+ end
98
+
99
+ def locale_files
100
+ Dir[ File.join(locale_path, '*.{rb,yml}') ]
101
+ end
102
+
103
+
104
+ private
105
+ def load_about_information
106
+ about_yml_path = File.join(@directory, "about.yml")
107
+ parsed_yml = File.exist?(about_yml_path) ? YAML.load(File.read(about_yml_path)) : {}
108
+ parsed_yml || {}
109
+ rescue Exception
110
+ {}
111
+ end
112
+
113
+ def report_nonexistant_or_empty_plugin!
114
+ raise LoadError, "Can not find the plugin named: #{name}"
115
+ end
116
+
117
+
118
+ def app_paths
119
+ [ File.join(directory, 'app', 'models'), File.join(directory, 'app', 'helpers'), controller_path, metal_path ]
120
+ end
121
+
122
+ def lib_path
123
+ File.join(directory, 'lib')
124
+ end
125
+
126
+ def classic_init_path
127
+ File.join(directory, 'init.rb')
128
+ end
129
+
130
+ def gem_init_path
131
+ File.join(directory, 'rails', 'init.rb')
132
+ end
133
+
134
+ def init_path
135
+ File.file?(gem_init_path) ? gem_init_path : classic_init_path
136
+ end
137
+
138
+
139
+ def has_app_directory?
140
+ File.directory?(File.join(directory, 'app'))
141
+ end
142
+
143
+ def has_lib_directory?
144
+ File.directory?(lib_path)
145
+ end
146
+
147
+ def has_init_file?
148
+ File.file?(init_path)
149
+ end
150
+
151
+
152
+ def evaluate_init_rb(initializer)
153
+ if has_init_file?
154
+ silence_warnings do
155
+ # Allow plugins to reference the current configuration object
156
+ config = initializer.configuration
157
+
158
+ eval(IO.read(init_path), binding, init_path)
159
+ end
160
+ end
161
+ end
162
+ end
163
+
164
+ # This Plugin subclass represents a Gem plugin. Although RubyGems has already
165
+ # taken care of $LOAD_PATHs, it exposes its load_paths to add them
166
+ # to Dependencies.load_paths.
167
+ class GemPlugin < Plugin
168
+ # Initialize this plugin from a Gem::Specification.
169
+ def initialize(spec, gem)
170
+ directory = spec.full_gem_path
171
+ super(directory)
172
+ @name = spec.name
173
+ end
174
+
175
+ def init_path
176
+ File.join(directory, 'rails', 'init.rb')
177
+ end
178
+ end
179
+ end