openskies 0.0.1

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 (494) hide show
  1. data/CHANGELOG.md +87 -0
  2. data/README.rdoc +35 -0
  3. data/bin/openskies +9 -0
  4. data/guides/assets/images/belongs_to.png +0 -0
  5. data/guides/assets/images/book_icon.gif +0 -0
  6. data/guides/assets/images/bullet.gif +0 -0
  7. data/guides/assets/images/challenge.png +0 -0
  8. data/guides/assets/images/chapters_icon.gif +0 -0
  9. data/guides/assets/images/check_bullet.gif +0 -0
  10. data/guides/assets/images/credits_pic_blank.gif +0 -0
  11. data/guides/assets/images/csrf.png +0 -0
  12. data/guides/assets/images/customized_error_messages.png +0 -0
  13. data/guides/assets/images/edge_badge.png +0 -0
  14. data/guides/assets/images/error_messages.png +0 -0
  15. data/guides/assets/images/feature_tile.gif +0 -0
  16. data/guides/assets/images/footer_tile.gif +0 -0
  17. data/guides/assets/images/fxn.png +0 -0
  18. data/guides/assets/images/grey_bullet.gif +0 -0
  19. data/guides/assets/images/habtm.png +0 -0
  20. data/guides/assets/images/has_many.png +0 -0
  21. data/guides/assets/images/has_many_through.png +0 -0
  22. data/guides/assets/images/has_one.png +0 -0
  23. data/guides/assets/images/has_one_through.png +0 -0
  24. data/guides/assets/images/header_backdrop.png +0 -0
  25. data/guides/assets/images/header_tile.gif +0 -0
  26. data/guides/assets/images/i18n/demo_html_safe.png +0 -0
  27. data/guides/assets/images/i18n/demo_localized_pirate.png +0 -0
  28. data/guides/assets/images/i18n/demo_translated_en.png +0 -0
  29. data/guides/assets/images/i18n/demo_translated_pirate.png +0 -0
  30. data/guides/assets/images/i18n/demo_translation_missing.png +0 -0
  31. data/guides/assets/images/i18n/demo_untranslated.png +0 -0
  32. data/guides/assets/images/icons/README +5 -0
  33. data/guides/assets/images/icons/callouts/1.png +0 -0
  34. data/guides/assets/images/icons/callouts/10.png +0 -0
  35. data/guides/assets/images/icons/callouts/11.png +0 -0
  36. data/guides/assets/images/icons/callouts/12.png +0 -0
  37. data/guides/assets/images/icons/callouts/13.png +0 -0
  38. data/guides/assets/images/icons/callouts/14.png +0 -0
  39. data/guides/assets/images/icons/callouts/15.png +0 -0
  40. data/guides/assets/images/icons/callouts/2.png +0 -0
  41. data/guides/assets/images/icons/callouts/3.png +0 -0
  42. data/guides/assets/images/icons/callouts/4.png +0 -0
  43. data/guides/assets/images/icons/callouts/5.png +0 -0
  44. data/guides/assets/images/icons/callouts/6.png +0 -0
  45. data/guides/assets/images/icons/callouts/7.png +0 -0
  46. data/guides/assets/images/icons/callouts/8.png +0 -0
  47. data/guides/assets/images/icons/callouts/9.png +0 -0
  48. data/guides/assets/images/icons/caution.png +0 -0
  49. data/guides/assets/images/icons/example.png +0 -0
  50. data/guides/assets/images/icons/home.png +0 -0
  51. data/guides/assets/images/icons/important.png +0 -0
  52. data/guides/assets/images/icons/next.png +0 -0
  53. data/guides/assets/images/icons/note.png +0 -0
  54. data/guides/assets/images/icons/prev.png +0 -0
  55. data/guides/assets/images/icons/tip.png +0 -0
  56. data/guides/assets/images/icons/up.png +0 -0
  57. data/guides/assets/images/icons/warning.png +0 -0
  58. data/guides/assets/images/jaimeiniesta.jpg +0 -0
  59. data/guides/assets/images/nav_arrow.gif +0 -0
  60. data/guides/assets/images/polymorphic.png +0 -0
  61. data/guides/assets/images/posts_index.png +0 -0
  62. data/guides/assets/images/radar.png +0 -0
  63. data/guides/assets/images/rails_guides_kindle_cover.jpg +0 -0
  64. data/guides/assets/images/rails_guides_logo.gif +0 -0
  65. data/guides/assets/images/rails_logo_remix.gif +0 -0
  66. data/guides/assets/images/rails_welcome.png +0 -0
  67. data/guides/assets/images/session_fixation.png +0 -0
  68. data/guides/assets/images/tab_grey.gif +0 -0
  69. data/guides/assets/images/tab_info.gif +0 -0
  70. data/guides/assets/images/tab_note.gif +0 -0
  71. data/guides/assets/images/tab_red.gif +0 -0
  72. data/guides/assets/images/tab_yellow.gif +0 -0
  73. data/guides/assets/images/tab_yellow.png +0 -0
  74. data/guides/assets/images/validation_error_messages.png +0 -0
  75. data/guides/assets/images/vijaydev.jpg +0 -0
  76. data/guides/assets/javascripts/guides.js +7 -0
  77. data/guides/assets/javascripts/syntaxhighlighter/shBrushAS3.js +59 -0
  78. data/guides/assets/javascripts/syntaxhighlighter/shBrushAppleScript.js +75 -0
  79. data/guides/assets/javascripts/syntaxhighlighter/shBrushBash.js +59 -0
  80. data/guides/assets/javascripts/syntaxhighlighter/shBrushCSharp.js +65 -0
  81. data/guides/assets/javascripts/syntaxhighlighter/shBrushColdFusion.js +100 -0
  82. data/guides/assets/javascripts/syntaxhighlighter/shBrushCpp.js +97 -0
  83. data/guides/assets/javascripts/syntaxhighlighter/shBrushCss.js +91 -0
  84. data/guides/assets/javascripts/syntaxhighlighter/shBrushDelphi.js +55 -0
  85. data/guides/assets/javascripts/syntaxhighlighter/shBrushDiff.js +41 -0
  86. data/guides/assets/javascripts/syntaxhighlighter/shBrushErlang.js +52 -0
  87. data/guides/assets/javascripts/syntaxhighlighter/shBrushGroovy.js +67 -0
  88. data/guides/assets/javascripts/syntaxhighlighter/shBrushJScript.js +52 -0
  89. data/guides/assets/javascripts/syntaxhighlighter/shBrushJava.js +57 -0
  90. data/guides/assets/javascripts/syntaxhighlighter/shBrushJavaFX.js +58 -0
  91. data/guides/assets/javascripts/syntaxhighlighter/shBrushPerl.js +72 -0
  92. data/guides/assets/javascripts/syntaxhighlighter/shBrushPhp.js +88 -0
  93. data/guides/assets/javascripts/syntaxhighlighter/shBrushPlain.js +33 -0
  94. data/guides/assets/javascripts/syntaxhighlighter/shBrushPowerShell.js +74 -0
  95. data/guides/assets/javascripts/syntaxhighlighter/shBrushPython.js +64 -0
  96. data/guides/assets/javascripts/syntaxhighlighter/shBrushRuby.js +55 -0
  97. data/guides/assets/javascripts/syntaxhighlighter/shBrushSass.js +94 -0
  98. data/guides/assets/javascripts/syntaxhighlighter/shBrushScala.js +51 -0
  99. data/guides/assets/javascripts/syntaxhighlighter/shBrushSql.js +66 -0
  100. data/guides/assets/javascripts/syntaxhighlighter/shBrushVb.js +56 -0
  101. data/guides/assets/javascripts/syntaxhighlighter/shBrushXml.js +69 -0
  102. data/guides/assets/javascripts/syntaxhighlighter/shCore.js +17 -0
  103. data/guides/assets/stylesheets/fixes.css +16 -0
  104. data/guides/assets/stylesheets/kindle.css +11 -0
  105. data/guides/assets/stylesheets/main.css +453 -0
  106. data/guides/assets/stylesheets/print.css +52 -0
  107. data/guides/assets/stylesheets/reset.css +43 -0
  108. data/guides/assets/stylesheets/style.css +13 -0
  109. data/guides/assets/stylesheets/syntaxhighlighter/shCore.css +226 -0
  110. data/guides/assets/stylesheets/syntaxhighlighter/shCoreDefault.css +328 -0
  111. data/guides/assets/stylesheets/syntaxhighlighter/shCoreDjango.css +331 -0
  112. data/guides/assets/stylesheets/syntaxhighlighter/shCoreEclipse.css +339 -0
  113. data/guides/assets/stylesheets/syntaxhighlighter/shCoreEmacs.css +324 -0
  114. data/guides/assets/stylesheets/syntaxhighlighter/shCoreFadeToGrey.css +328 -0
  115. data/guides/assets/stylesheets/syntaxhighlighter/shCoreMDUltra.css +324 -0
  116. data/guides/assets/stylesheets/syntaxhighlighter/shCoreMidnight.css +324 -0
  117. data/guides/assets/stylesheets/syntaxhighlighter/shCoreRDark.css +324 -0
  118. data/guides/assets/stylesheets/syntaxhighlighter/shThemeDefault.css +117 -0
  119. data/guides/assets/stylesheets/syntaxhighlighter/shThemeDjango.css +120 -0
  120. data/guides/assets/stylesheets/syntaxhighlighter/shThemeEclipse.css +128 -0
  121. data/guides/assets/stylesheets/syntaxhighlighter/shThemeEmacs.css +113 -0
  122. data/guides/assets/stylesheets/syntaxhighlighter/shThemeFadeToGrey.css +117 -0
  123. data/guides/assets/stylesheets/syntaxhighlighter/shThemeMDUltra.css +113 -0
  124. data/guides/assets/stylesheets/syntaxhighlighter/shThemeMidnight.css +113 -0
  125. data/guides/assets/stylesheets/syntaxhighlighter/shThemeRDark.css +113 -0
  126. data/guides/assets/stylesheets/syntaxhighlighter/shThemeRailsGuides.css +116 -0
  127. data/guides/code/getting_started/Gemfile +38 -0
  128. data/guides/code/getting_started/README.rdoc +261 -0
  129. data/guides/code/getting_started/Rakefile +7 -0
  130. data/guides/code/getting_started/app/assets/images/rails.png +0 -0
  131. data/guides/code/getting_started/app/assets/javascripts/application.js +15 -0
  132. data/guides/code/getting_started/app/assets/javascripts/comments.js.coffee +3 -0
  133. data/guides/code/getting_started/app/assets/javascripts/home.js.coffee +3 -0
  134. data/guides/code/getting_started/app/assets/javascripts/posts.js.coffee +3 -0
  135. data/guides/code/getting_started/app/assets/stylesheets/application.css +13 -0
  136. data/guides/code/getting_started/app/assets/stylesheets/comments.css.scss +3 -0
  137. data/guides/code/getting_started/app/assets/stylesheets/home.css.scss +3 -0
  138. data/guides/code/getting_started/app/assets/stylesheets/posts.css.scss +3 -0
  139. data/guides/code/getting_started/app/assets/stylesheets/scaffolds.css.scss +56 -0
  140. data/guides/code/getting_started/app/controllers/application_controller.rb +3 -0
  141. data/guides/code/getting_started/app/controllers/comments_controller.rb +16 -0
  142. data/guides/code/getting_started/app/controllers/home_controller.rb +5 -0
  143. data/guides/code/getting_started/app/controllers/posts_controller.rb +84 -0
  144. data/guides/code/getting_started/app/helpers/application_helper.rb +2 -0
  145. data/guides/code/getting_started/app/helpers/comments_helper.rb +2 -0
  146. data/guides/code/getting_started/app/helpers/home_helper.rb +2 -0
  147. data/guides/code/getting_started/app/helpers/posts_helper.rb +5 -0
  148. data/guides/code/getting_started/app/models/comment.rb +3 -0
  149. data/guides/code/getting_started/app/models/post.rb +11 -0
  150. data/guides/code/getting_started/app/models/tag.rb +3 -0
  151. data/guides/code/getting_started/app/views/comments/_comment.html.erb +15 -0
  152. data/guides/code/getting_started/app/views/comments/_form.html.erb +13 -0
  153. data/guides/code/getting_started/app/views/home/index.html.erb +2 -0
  154. data/guides/code/getting_started/app/views/layouts/application.html.erb +14 -0
  155. data/guides/code/getting_started/app/views/posts/_form.html.erb +32 -0
  156. data/guides/code/getting_started/app/views/posts/edit.html.erb +6 -0
  157. data/guides/code/getting_started/app/views/posts/index.html.erb +27 -0
  158. data/guides/code/getting_started/app/views/posts/new.html.erb +5 -0
  159. data/guides/code/getting_started/app/views/posts/show.html.erb +31 -0
  160. data/guides/code/getting_started/app/views/tags/_form.html.erb +12 -0
  161. data/guides/code/getting_started/config/application.rb +59 -0
  162. data/guides/code/getting_started/config/boot.rb +6 -0
  163. data/guides/code/getting_started/config/database.yml +25 -0
  164. data/guides/code/getting_started/config/environment.rb +5 -0
  165. data/guides/code/getting_started/config/environments/development.rb +37 -0
  166. data/guides/code/getting_started/config/environments/production.rb +67 -0
  167. data/guides/code/getting_started/config/environments/test.rb +37 -0
  168. data/guides/code/getting_started/config/initializers/backtrace_silencers.rb +7 -0
  169. data/guides/code/getting_started/config/initializers/inflections.rb +15 -0
  170. data/guides/code/getting_started/config/initializers/mime_types.rb +5 -0
  171. data/guides/code/getting_started/config/initializers/secret_token.rb +7 -0
  172. data/guides/code/getting_started/config/initializers/session_store.rb +8 -0
  173. data/guides/code/getting_started/config/initializers/wrap_parameters.rb +14 -0
  174. data/guides/code/getting_started/config/locales/en.yml +5 -0
  175. data/guides/code/getting_started/config/routes.rb +64 -0
  176. data/guides/code/getting_started/config.ru +4 -0
  177. data/guides/code/getting_started/db/migrate/20110901012504_create_posts.rb +11 -0
  178. data/guides/code/getting_started/db/migrate/20110901012815_create_comments.rb +12 -0
  179. data/guides/code/getting_started/db/migrate/20110901013701_create_tags.rb +11 -0
  180. data/guides/code/getting_started/db/schema.rb +43 -0
  181. data/guides/code/getting_started/db/seeds.rb +7 -0
  182. data/guides/code/getting_started/doc/README_FOR_APP +2 -0
  183. data/guides/code/getting_started/public/404.html +26 -0
  184. data/guides/code/getting_started/public/422.html +26 -0
  185. data/guides/code/getting_started/public/500.html +25 -0
  186. data/guides/code/getting_started/public/favicon.ico +0 -0
  187. data/guides/code/getting_started/public/robots.txt +5 -0
  188. data/guides/code/getting_started/script/rails +6 -0
  189. data/guides/code/getting_started/test/fixtures/comments.yml +11 -0
  190. data/guides/code/getting_started/test/fixtures/posts.yml +11 -0
  191. data/guides/code/getting_started/test/fixtures/tags.yml +9 -0
  192. data/guides/code/getting_started/test/functional/comments_controller_test.rb +7 -0
  193. data/guides/code/getting_started/test/functional/home_controller_test.rb +9 -0
  194. data/guides/code/getting_started/test/functional/posts_controller_test.rb +49 -0
  195. data/guides/code/getting_started/test/performance/browsing_test.rb +12 -0
  196. data/guides/code/getting_started/test/test_helper.rb +13 -0
  197. data/guides/code/getting_started/test/unit/comment_test.rb +7 -0
  198. data/guides/code/getting_started/test/unit/helpers/comments_helper_test.rb +4 -0
  199. data/guides/code/getting_started/test/unit/helpers/home_helper_test.rb +4 -0
  200. data/guides/code/getting_started/test/unit/helpers/posts_helper_test.rb +4 -0
  201. data/guides/code/getting_started/test/unit/post_test.rb +7 -0
  202. data/guides/code/getting_started/test/unit/tag_test.rb +7 -0
  203. data/guides/rails_guides/generator.rb +310 -0
  204. data/guides/rails_guides/helpers.rb +45 -0
  205. data/guides/rails_guides/indexer.rb +69 -0
  206. data/guides/rails_guides/levenshtein.rb +31 -0
  207. data/guides/rails_guides/textile_extensions.rb +63 -0
  208. data/guides/rails_guides.rb +50 -0
  209. data/guides/source/2_2_release_notes.textile +422 -0
  210. data/guides/source/2_3_release_notes.textile +610 -0
  211. data/guides/source/3_0_release_notes.textile +595 -0
  212. data/guides/source/3_1_release_notes.textile +553 -0
  213. data/guides/source/3_2_release_notes.textile +540 -0
  214. data/guides/source/_license.html.erb +2 -0
  215. data/guides/source/_welcome.html.erb +19 -0
  216. data/guides/source/action_controller_overview.textile +820 -0
  217. data/guides/source/action_mailer_basics.textile +516 -0
  218. data/guides/source/action_view_overview.textile +1497 -0
  219. data/guides/source/active_model_basics.textile +205 -0
  220. data/guides/source/active_record_basics.textile +218 -0
  221. data/guides/source/active_record_querying.textile +1433 -0
  222. data/guides/source/active_record_validations_callbacks.textile +1283 -0
  223. data/guides/source/active_resource_basics.textile +120 -0
  224. data/guides/source/active_support_core_extensions.textile +3713 -0
  225. data/guides/source/ajax_on_rails.textile +267 -0
  226. data/guides/source/api_documentation_guidelines.textile +185 -0
  227. data/guides/source/asset_pipeline.textile +707 -0
  228. data/guides/source/association_basics.textile +1959 -0
  229. data/guides/source/caching_with_rails.textile +437 -0
  230. data/guides/source/command_line.textile +574 -0
  231. data/guides/source/configuring.textile +641 -0
  232. data/guides/source/contributing_to_ruby_on_rails.textile +448 -0
  233. data/guides/source/credits.html.erb +72 -0
  234. data/guides/source/debugging_rails_applications.textile +714 -0
  235. data/guides/source/documents.yaml +157 -0
  236. data/guides/source/engines.textile +618 -0
  237. data/guides/source/form_helpers.textile +798 -0
  238. data/guides/source/generators.textile +621 -0
  239. data/guides/source/getting_started.textile +1929 -0
  240. data/guides/source/i18n.textile +931 -0
  241. data/guides/source/index.html.erb +30 -0
  242. data/guides/source/initialization.textile +1116 -0
  243. data/guides/source/kindle/KINDLE.md +26 -0
  244. data/guides/source/kindle/copyright.html.erb +1 -0
  245. data/guides/source/kindle/layout.html.erb +27 -0
  246. data/guides/source/kindle/rails_guides.opf.erb +52 -0
  247. data/guides/source/kindle/toc.html.erb +24 -0
  248. data/guides/source/kindle/toc.ncx.erb +64 -0
  249. data/guides/source/kindle/welcome.html.erb +5 -0
  250. data/guides/source/layout.html.erb +124 -0
  251. data/guides/source/layouts_and_rendering.textile +1237 -0
  252. data/guides/source/migrations.textile +900 -0
  253. data/guides/source/nested_model_forms.textile +222 -0
  254. data/guides/source/performance_testing.textile +597 -0
  255. data/guides/source/plugins.textile +464 -0
  256. data/guides/source/rails_application_templates.textile +240 -0
  257. data/guides/source/rails_on_rack.textile +236 -0
  258. data/guides/source/routing.textile +885 -0
  259. data/guides/source/ruby_on_rails_guides_guidelines.textile +79 -0
  260. data/guides/source/security.textile +1004 -0
  261. data/guides/source/testing.textile +947 -0
  262. data/guides/w3c_validator.rb +91 -0
  263. data/lib/rails/all.rb +15 -0
  264. data/lib/rails/application/bootstrap.rb +73 -0
  265. data/lib/rails/application/configuration.rb +151 -0
  266. data/lib/rails/application/finisher.rb +98 -0
  267. data/lib/rails/application/railties.rb +13 -0
  268. data/lib/rails/application/route_inspector.rb +84 -0
  269. data/lib/rails/application/routes_reloader.rb +56 -0
  270. data/lib/rails/application.rb +320 -0
  271. data/lib/rails/backtrace_cleaner.rb +42 -0
  272. data/lib/rails/cli.rb +16 -0
  273. data/lib/rails/code_statistics.rb +118 -0
  274. data/lib/rails/commands/application.rb +38 -0
  275. data/lib/rails/commands/benchmarker.rb +34 -0
  276. data/lib/rails/commands/console.rb +55 -0
  277. data/lib/rails/commands/dbconsole.rb +123 -0
  278. data/lib/rails/commands/destroy.rb +10 -0
  279. data/lib/rails/commands/generate.rb +12 -0
  280. data/lib/rails/commands/plugin.rb +544 -0
  281. data/lib/rails/commands/plugin_new.rb +11 -0
  282. data/lib/rails/commands/profiler.rb +32 -0
  283. data/lib/rails/commands/runner.rb +54 -0
  284. data/lib/rails/commands/server.rb +100 -0
  285. data/lib/rails/commands/update.rb +9 -0
  286. data/lib/rails/commands.rb +104 -0
  287. data/lib/rails/configuration.rb +89 -0
  288. data/lib/rails/console/app.rb +36 -0
  289. data/lib/rails/console/helpers.rb +11 -0
  290. data/lib/rails/engine/commands.rb +43 -0
  291. data/lib/rails/engine/configuration.rb +84 -0
  292. data/lib/rails/engine/railties.rb +33 -0
  293. data/lib/rails/engine.rb +657 -0
  294. data/lib/rails/generators/actions.rb +325 -0
  295. data/lib/rails/generators/active_model.rb +78 -0
  296. data/lib/rails/generators/app_base.rb +281 -0
  297. data/lib/rails/generators/base.rb +390 -0
  298. data/lib/rails/generators/css/assets/assets_generator.rb +13 -0
  299. data/lib/rails/generators/css/assets/templates/stylesheet.css +4 -0
  300. data/lib/rails/generators/css/scaffold/scaffold_generator.rb +16 -0
  301. data/lib/rails/generators/erb/controller/controller_generator.rb +20 -0
  302. data/lib/rails/generators/erb/controller/templates/view.html.erb +2 -0
  303. data/lib/rails/generators/erb/mailer/mailer_generator.rb +13 -0
  304. data/lib/rails/generators/erb/mailer/templates/view.text.erb +3 -0
  305. data/lib/rails/generators/erb/scaffold/scaffold_generator.rb +29 -0
  306. data/lib/rails/generators/erb/scaffold/templates/_form.html.erb +23 -0
  307. data/lib/rails/generators/erb/scaffold/templates/edit.html.erb +6 -0
  308. data/lib/rails/generators/erb/scaffold/templates/index.html.erb +27 -0
  309. data/lib/rails/generators/erb/scaffold/templates/new.html.erb +5 -0
  310. data/lib/rails/generators/erb/scaffold/templates/show.html.erb +12 -0
  311. data/lib/rails/generators/erb.rb +21 -0
  312. data/lib/rails/generators/generated_attribute.rb +107 -0
  313. data/lib/rails/generators/js/assets/assets_generator.rb +13 -0
  314. data/lib/rails/generators/js/assets/templates/javascript.js +2 -0
  315. data/lib/rails/generators/migration.rb +68 -0
  316. data/lib/rails/generators/named_base.rb +202 -0
  317. data/lib/rails/generators/rails/app/USAGE +15 -0
  318. data/lib/rails/generators/rails/app/app_generator.rb +303 -0
  319. data/lib/rails/generators/rails/app/templates/Gemfile +26 -0
  320. data/lib/rails/generators/rails/app/templates/README +261 -0
  321. data/lib/rails/generators/rails/app/templates/Rakefile +7 -0
  322. data/lib/rails/generators/rails/app/templates/app/assets/images/rails.png +0 -0
  323. data/lib/rails/generators/rails/app/templates/app/assets/javascripts/application.js.tt +17 -0
  324. data/lib/rails/generators/rails/app/templates/app/assets/stylesheets/application.css +13 -0
  325. data/lib/rails/generators/rails/app/templates/app/controllers/application_controller.rb +3 -0
  326. data/lib/rails/generators/rails/app/templates/app/helpers/application_helper.rb +2 -0
  327. data/lib/rails/generators/rails/app/templates/app/mailers/.empty_directory +0 -0
  328. data/lib/rails/generators/rails/app/templates/app/models/.empty_directory +0 -0
  329. data/lib/rails/generators/rails/app/templates/app/views/layouts/application.html.erb.tt +14 -0
  330. data/lib/rails/generators/rails/app/templates/config/application.rb +74 -0
  331. data/lib/rails/generators/rails/app/templates/config/boot.rb +6 -0
  332. data/lib/rails/generators/rails/app/templates/config/databases/frontbase.yml +31 -0
  333. data/lib/rails/generators/rails/app/templates/config/databases/ibm_db.yml +86 -0
  334. data/lib/rails/generators/rails/app/templates/config/databases/jdbc.yml +62 -0
  335. data/lib/rails/generators/rails/app/templates/config/databases/jdbcmysql.yml +33 -0
  336. data/lib/rails/generators/rails/app/templates/config/databases/jdbcpostgresql.yml +43 -0
  337. data/lib/rails/generators/rails/app/templates/config/databases/jdbcsqlite3.yml +20 -0
  338. data/lib/rails/generators/rails/app/templates/config/databases/mysql.yml +54 -0
  339. data/lib/rails/generators/rails/app/templates/config/databases/oracle.yml +39 -0
  340. data/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml +55 -0
  341. data/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml +25 -0
  342. data/lib/rails/generators/rails/app/templates/config/environment.rb +5 -0
  343. data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +41 -0
  344. data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +73 -0
  345. data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +39 -0
  346. data/lib/rails/generators/rails/app/templates/config/initializers/backtrace_silencers.rb +7 -0
  347. data/lib/rails/generators/rails/app/templates/config/initializers/inflections.rb +15 -0
  348. data/lib/rails/generators/rails/app/templates/config/initializers/mime_types.rb +5 -0
  349. data/lib/rails/generators/rails/app/templates/config/initializers/secret_token.rb.tt +7 -0
  350. data/lib/rails/generators/rails/app/templates/config/initializers/session_store.rb.tt +8 -0
  351. data/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt +16 -0
  352. data/lib/rails/generators/rails/app/templates/config/locales/en.yml +5 -0
  353. data/lib/rails/generators/rails/app/templates/config/routes.rb +58 -0
  354. data/lib/rails/generators/rails/app/templates/config.ru +4 -0
  355. data/lib/rails/generators/rails/app/templates/db/seeds.rb.tt +7 -0
  356. data/lib/rails/generators/rails/app/templates/doc/README_FOR_APP +2 -0
  357. data/lib/rails/generators/rails/app/templates/gitignore +15 -0
  358. data/lib/rails/generators/rails/app/templates/public/404.html +26 -0
  359. data/lib/rails/generators/rails/app/templates/public/422.html +26 -0
  360. data/lib/rails/generators/rails/app/templates/public/500.html +25 -0
  361. data/lib/rails/generators/rails/app/templates/public/favicon.ico +0 -0
  362. data/lib/rails/generators/rails/app/templates/public/index.html +241 -0
  363. data/lib/rails/generators/rails/app/templates/public/robots.txt +5 -0
  364. data/lib/rails/generators/rails/app/templates/public/stylesheets/.empty_directory +0 -0
  365. data/lib/rails/generators/rails/app/templates/script/rails +5 -0
  366. data/lib/rails/generators/rails/app/templates/test/fixtures/.empty_directory +0 -0
  367. data/lib/rails/generators/rails/app/templates/test/functional/.empty_directory +0 -0
  368. data/lib/rails/generators/rails/app/templates/test/integration/.empty_directory +0 -0
  369. data/lib/rails/generators/rails/app/templates/test/performance/browsing_test.rb +12 -0
  370. data/lib/rails/generators/rails/app/templates/test/test_helper.rb +15 -0
  371. data/lib/rails/generators/rails/app/templates/test/unit/.empty_directory +0 -0
  372. data/lib/rails/generators/rails/assets/USAGE +20 -0
  373. data/lib/rails/generators/rails/assets/assets_generator.rb +25 -0
  374. data/lib/rails/generators/rails/assets/templates/javascript.js +2 -0
  375. data/lib/rails/generators/rails/assets/templates/stylesheet.css +4 -0
  376. data/lib/rails/generators/rails/controller/USAGE +18 -0
  377. data/lib/rails/generators/rails/controller/controller_generator.rb +20 -0
  378. data/lib/rails/generators/rails/controller/templates/controller.rb +13 -0
  379. data/lib/rails/generators/rails/generator/USAGE +12 -0
  380. data/lib/rails/generators/rails/generator/generator_generator.rb +25 -0
  381. data/lib/rails/generators/rails/generator/templates/%file_name%_generator.rb.tt +3 -0
  382. data/lib/rails/generators/rails/generator/templates/USAGE.tt +8 -0
  383. data/lib/rails/generators/rails/generator/templates/templates/.empty_directory +0 -0
  384. data/lib/rails/generators/rails/helper/USAGE +17 -0
  385. data/lib/rails/generators/rails/helper/helper_generator.rb +13 -0
  386. data/lib/rails/generators/rails/helper/templates/helper.rb +4 -0
  387. data/lib/rails/generators/rails/integration_test/USAGE +10 -0
  388. data/lib/rails/generators/rails/integration_test/integration_test_generator.rb +7 -0
  389. data/lib/rails/generators/rails/migration/USAGE +29 -0
  390. data/lib/rails/generators/rails/migration/migration_generator.rb +8 -0
  391. data/lib/rails/generators/rails/model/USAGE +45 -0
  392. data/lib/rails/generators/rails/model/model_generator.rb +8 -0
  393. data/lib/rails/generators/rails/observer/USAGE +12 -0
  394. data/lib/rails/generators/rails/observer/observer_generator.rb +7 -0
  395. data/lib/rails/generators/rails/performance_test/USAGE +10 -0
  396. data/lib/rails/generators/rails/performance_test/performance_test_generator.rb +7 -0
  397. data/lib/rails/generators/rails/plugin_new/USAGE +10 -0
  398. data/lib/rails/generators/rails/plugin_new/plugin_new_generator.rb +318 -0
  399. data/lib/rails/generators/rails/plugin_new/templates/%name%.gemspec +29 -0
  400. data/lib/rails/generators/rails/plugin_new/templates/Gemfile +23 -0
  401. data/lib/rails/generators/rails/plugin_new/templates/MIT-LICENSE +20 -0
  402. data/lib/rails/generators/rails/plugin_new/templates/README.rdoc +3 -0
  403. data/lib/rails/generators/rails/plugin_new/templates/Rakefile +31 -0
  404. data/lib/rails/generators/rails/plugin_new/templates/app/controllers/%name%/application_controller.rb.tt +4 -0
  405. data/lib/rails/generators/rails/plugin_new/templates/app/helpers/%name%/application_helper.rb.tt +4 -0
  406. data/lib/rails/generators/rails/plugin_new/templates/app/mailers/.empty_directory +0 -0
  407. data/lib/rails/generators/rails/plugin_new/templates/app/models/.empty_directory +0 -0
  408. data/lib/rails/generators/rails/plugin_new/templates/app/views/layouts/%name%/application.html.erb.tt +14 -0
  409. data/lib/rails/generators/rails/plugin_new/templates/config/routes.rb +6 -0
  410. data/lib/rails/generators/rails/plugin_new/templates/gitignore +7 -0
  411. data/lib/rails/generators/rails/plugin_new/templates/lib/%name%/engine.rb +7 -0
  412. data/lib/rails/generators/rails/plugin_new/templates/lib/%name%/version.rb +3 -0
  413. data/lib/rails/generators/rails/plugin_new/templates/lib/%name%.rb +6 -0
  414. data/lib/rails/generators/rails/plugin_new/templates/lib/tasks/%name%_tasks.rake +4 -0
  415. data/lib/rails/generators/rails/plugin_new/templates/rails/application.rb +18 -0
  416. data/lib/rails/generators/rails/plugin_new/templates/rails/boot.rb +10 -0
  417. data/lib/rails/generators/rails/plugin_new/templates/rails/routes.rb +4 -0
  418. data/lib/rails/generators/rails/plugin_new/templates/script/rails.tt +7 -0
  419. data/lib/rails/generators/rails/plugin_new/templates/test/%name%_test.rb +7 -0
  420. data/lib/rails/generators/rails/plugin_new/templates/test/integration/navigation_test.rb +12 -0
  421. data/lib/rails/generators/rails/plugin_new/templates/test/test_helper.rb +15 -0
  422. data/lib/rails/generators/rails/resource/USAGE +23 -0
  423. data/lib/rails/generators/rails/resource/resource_generator.rb +20 -0
  424. data/lib/rails/generators/rails/resource_route/resource_route_generator.rb +50 -0
  425. data/lib/rails/generators/rails/scaffold/USAGE +35 -0
  426. data/lib/rails/generators/rails/scaffold/scaffold_generator.rb +23 -0
  427. data/lib/rails/generators/rails/scaffold/templates/scaffold.css +56 -0
  428. data/lib/rails/generators/rails/scaffold_controller/USAGE +19 -0
  429. data/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb +25 -0
  430. data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb +89 -0
  431. data/lib/rails/generators/rails/session_migration/USAGE +8 -0
  432. data/lib/rails/generators/rails/session_migration/session_migration_generator.rb +8 -0
  433. data/lib/rails/generators/rails/task/USAGE +9 -0
  434. data/lib/rails/generators/rails/task/task_generator.rb +12 -0
  435. data/lib/rails/generators/rails/task/templates/task.rb +8 -0
  436. data/lib/rails/generators/resource_helpers.rb +80 -0
  437. data/lib/rails/generators/test_case.rb +247 -0
  438. data/lib/rails/generators/test_unit/controller/controller_generator.rb +15 -0
  439. data/lib/rails/generators/test_unit/controller/templates/functional_test.rb +19 -0
  440. data/lib/rails/generators/test_unit/helper/helper_generator.rb +13 -0
  441. data/lib/rails/generators/test_unit/helper/templates/helper_test.rb +6 -0
  442. data/lib/rails/generators/test_unit/integration/integration_generator.rb +13 -0
  443. data/lib/rails/generators/test_unit/integration/templates/integration_test.rb +7 -0
  444. data/lib/rails/generators/test_unit/mailer/mailer_generator.rb +14 -0
  445. data/lib/rails/generators/test_unit/mailer/templates/functional_test.rb +21 -0
  446. data/lib/rails/generators/test_unit/model/model_generator.rb +24 -0
  447. data/lib/rails/generators/test_unit/model/templates/fixtures.yml +23 -0
  448. data/lib/rails/generators/test_unit/model/templates/unit_test.rb +9 -0
  449. data/lib/rails/generators/test_unit/observer/observer_generator.rb +13 -0
  450. data/lib/rails/generators/test_unit/observer/templates/unit_test.rb +9 -0
  451. data/lib/rails/generators/test_unit/performance/performance_generator.rb +13 -0
  452. data/lib/rails/generators/test_unit/performance/templates/performance_test.rb +12 -0
  453. data/lib/rails/generators/test_unit/plugin/plugin_generator.rb +13 -0
  454. data/lib/rails/generators/test_unit/plugin/templates/%file_name%_test.rb.tt +7 -0
  455. data/lib/rails/generators/test_unit/plugin/templates/test_helper.rb +3 -0
  456. data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +38 -0
  457. data/lib/rails/generators/test_unit/scaffold/templates/functional_test.rb +51 -0
  458. data/lib/rails/generators/test_unit.rb +8 -0
  459. data/lib/rails/generators.rb +339 -0
  460. data/lib/rails/info.rb +116 -0
  461. data/lib/rails/info_controller.rb +15 -0
  462. data/lib/rails/initializable.rb +89 -0
  463. data/lib/rails/paths.rb +211 -0
  464. data/lib/rails/performance_test_help.rb +3 -0
  465. data/lib/rails/plugin.rb +92 -0
  466. data/lib/rails/rack/debugger.rb +24 -0
  467. data/lib/rails/rack/log_tailer.rb +34 -0
  468. data/lib/rails/rack/logger.rb +60 -0
  469. data/lib/rails/rack.rb +7 -0
  470. data/lib/rails/railtie/configurable.rb +35 -0
  471. data/lib/rails/railtie/configuration.rb +90 -0
  472. data/lib/rails/railtie.rb +202 -0
  473. data/lib/rails/ruby_version_check.rb +23 -0
  474. data/lib/rails/rubyprof_ext.rb +35 -0
  475. data/lib/rails/script_rails_loader.rb +29 -0
  476. data/lib/rails/source_annotation_extractor.rb +104 -0
  477. data/lib/rails/tasks/annotations.rake +20 -0
  478. data/lib/rails/tasks/documentation.rake +155 -0
  479. data/lib/rails/tasks/engine.rake +72 -0
  480. data/lib/rails/tasks/framework.rake +76 -0
  481. data/lib/rails/tasks/log.rake +9 -0
  482. data/lib/rails/tasks/middleware.rake +7 -0
  483. data/lib/rails/tasks/misc.rake +67 -0
  484. data/lib/rails/tasks/routes.rake +9 -0
  485. data/lib/rails/tasks/statistics.rake +16 -0
  486. data/lib/rails/tasks/tmp.rake +37 -0
  487. data/lib/rails/tasks.rb +16 -0
  488. data/lib/rails/test_help.rb +56 -0
  489. data/lib/rails/test_unit/railtie.rb +15 -0
  490. data/lib/rails/test_unit/sub_test_task.rb +8 -0
  491. data/lib/rails/test_unit/testing.rake +146 -0
  492. data/lib/rails/version.rb +10 -0
  493. data/lib/rails.rb +126 -0
  494. metadata +609 -0
@@ -0,0 +1,464 @@
1
+ h2. The Basics of Creating Rails Plugins
2
+
3
+ A Rails plugin is either an extension or a modification of the core framework. Plugins provide:
4
+
5
+ * a way for developers to share bleeding-edge ideas without hurting the stable code base
6
+ * a segmented architecture so that units of code can be fixed or updated on their own release schedule
7
+ * an outlet for the core developers so that they don’t have to include every cool new feature under the sun
8
+
9
+ After reading this guide you should be familiar with:
10
+
11
+ * Creating a plugin from scratch
12
+ * Writing and running tests for the plugin
13
+
14
+ This guide describes how to build a test-driven plugin that will:
15
+
16
+ * Extend core ruby classes like Hash and String
17
+ * Add methods to ActiveRecord::Base in the tradition of the 'acts_as' plugins
18
+ * Give you information about where to put generators in your plugin.
19
+
20
+ For the purpose of this guide pretend for a moment that you are an avid bird watcher.
21
+ Your favorite bird is the Yaffle, and you want to create a plugin that allows other developers to share in the Yaffle
22
+ goodness.
23
+
24
+ endprologue.
25
+
26
+ h3. Setup
27
+
28
+ Before you continue, take a moment to decide if your new plugin will be potentially shared across different Rails applications.
29
+
30
+ * If your plugin is specific to your application, your new plugin will be a _vendored plugin_.
31
+ * If you think your plugin may be used across applications, build it as a _gemified plugin_.
32
+
33
+ h4. Either generate a vendored plugin...
34
+
35
+ Use the +rails generate plugin+ command in your Rails root directory
36
+ to create a new plugin that will live in the +vendor/plugins+
37
+ directory. See usage and options by asking for help:
38
+
39
+ <shell>
40
+ $ rails generate plugin --help
41
+ </shell>
42
+
43
+ h4. Or generate a gemified plugin.
44
+
45
+ Writing your Rails plugin as a gem, rather than as a vendored plugin,
46
+ lets you share your plugin across different rails applications using
47
+ RubyGems and Bundler.
48
+
49
+ Rails 3.1 ships with a +rails plugin new+ command which creates a
50
+ skeleton for developing any kind of Rails extension with the ability
51
+ to run integration tests using a dummy Rails application. See usage
52
+ and options by asking for help:
53
+
54
+ <shell>
55
+ $ rails plugin --help
56
+ </shell>
57
+
58
+ h3. Testing your newly generated plugin
59
+
60
+ You can navigate to the directory that contains the plugin, run the +bundle install+ command
61
+ and run the one generated test using the +rake+ command.
62
+
63
+ You should see:
64
+
65
+ <shell>
66
+ 2 tests, 2 assertions, 0 failures, 0 errors, 0 skips
67
+ </shell>
68
+
69
+ This will tell you that everything got generated properly and you are ready to start adding functionality.
70
+
71
+ h3. Extending Core Classes
72
+
73
+ This section will explain how to add a method to String that will be available anywhere in your rails application.
74
+
75
+ In this example you will add a method to String named +to_squawk+. To begin, create a new test file with a few assertions:
76
+
77
+ <ruby>
78
+ # yaffle/test/core_ext_test.rb
79
+
80
+ require 'test_helper'
81
+
82
+ class CoreExtTest < Test::Unit::TestCase
83
+ def test_to_squawk_prepends_the_word_squawk
84
+ assert_equal "squawk! Hello World", "Hello World".to_squawk
85
+ end
86
+ end
87
+ </ruby>
88
+
89
+ Run +rake+ to run the test. This test should fail because we haven't implemented the +to_squawk+ method:
90
+
91
+ <shell>
92
+ 1) Error:
93
+ test_to_squawk_prepends_the_word_squawk(CoreExtTest):
94
+ NoMethodError: undefined method `to_squawk' for "Hello World":String
95
+ test/core_ext_test.rb:5:in `test_to_squawk_prepends_the_word_squawk'
96
+ </shell>
97
+
98
+ Great - now you are ready to start development.
99
+
100
+ Then in +lib/yaffle.rb+ require +lib/core_ext+:
101
+
102
+ <ruby>
103
+ # yaffle/lib/yaffle.rb
104
+
105
+ require "yaffle/core_ext"
106
+
107
+ module Yaffle
108
+ end
109
+ </ruby>
110
+
111
+ Finally, create the +core_ext.rb+ file and add the +to_squawk+ method:
112
+
113
+ <ruby>
114
+ # yaffle/lib/yaffle/core_ext.rb
115
+
116
+ String.class_eval do
117
+ def to_squawk
118
+ "squawk! #{self}".strip
119
+ end
120
+ end
121
+ </ruby>
122
+
123
+ To test that your method does what it says it does, run the unit tests with +rake+ from your plugin directory.
124
+
125
+ <shell>
126
+ 3 tests, 3 assertions, 0 failures, 0 errors, 0 skips
127
+ </shell>
128
+
129
+ To see this in action, change to the test/dummy directory, fire up a console and start squawking:
130
+
131
+ <shell>
132
+ $ rails console
133
+ >> "Hello World".to_squawk
134
+ => "squawk! Hello World"
135
+ </shell>
136
+
137
+ h3. Add an "acts_as" Method to Active Record
138
+
139
+ A common pattern in plugins is to add a method called 'acts_as_something' to models. In this case, you
140
+ want to write a method called 'acts_as_yaffle' that adds a 'squawk' method to your Active Record models.
141
+
142
+ To begin, set up your files so that you have:
143
+
144
+ <ruby>
145
+ # yaffle/test/acts_as_yaffle_test.rb
146
+
147
+ require 'test_helper'
148
+
149
+ class ActsAsYaffleTest < Test::Unit::TestCase
150
+ end
151
+ </ruby>
152
+
153
+ <ruby>
154
+ # yaffle/lib/yaffle.rb
155
+
156
+ require "yaffle/core_ext"
157
+ require 'yaffle/acts_as_yaffle'
158
+
159
+ module Yaffle
160
+ end
161
+ </ruby>
162
+
163
+ <ruby>
164
+ # yaffle/lib/yaffle/acts_as_yaffle.rb
165
+
166
+ module Yaffle
167
+ module ActsAsYaffle
168
+ # your code will go here
169
+ end
170
+ end
171
+ </ruby>
172
+
173
+ h4. Add a Class Method
174
+
175
+ This plugin will expect that you've added a method to your model named 'last_squawk'. However, the
176
+ plugin users might have already defined a method on their model named 'last_squawk' that they use
177
+ for something else. This plugin will allow the name to be changed by adding a class method called 'yaffle_text_field'.
178
+
179
+ To start out, write a failing test that shows the behavior you'd like:
180
+
181
+ <ruby>
182
+ # yaffle/test/acts_as_yaffle_test.rb
183
+
184
+ require 'test_helper'
185
+
186
+ class ActsAsYaffleTest < Test::Unit::TestCase
187
+
188
+ def test_a_hickwalls_yaffle_text_field_should_be_last_squawk
189
+ assert_equal "last_squawk", Hickwall.yaffle_text_field
190
+ end
191
+
192
+ def test_a_wickwalls_yaffle_text_field_should_be_last_tweet
193
+ assert_equal "last_tweet", Wickwall.yaffle_text_field
194
+ end
195
+
196
+ end
197
+ </ruby>
198
+
199
+ When you run +rake+, you should see the following:
200
+
201
+ <shell>
202
+ 1) Error:
203
+ test_a_hickwalls_yaffle_text_field_should_be_last_squawk(ActsAsYaffleTest):
204
+ NameError: uninitialized constant ActsAsYaffleTest::Hickwall
205
+ test/acts_as_yaffle_test.rb:6:in `test_a_hickwalls_yaffle_text_field_should_be_last_squawk'
206
+
207
+ 2) Error:
208
+ test_a_wickwalls_yaffle_text_field_should_be_last_tweet(ActsAsYaffleTest):
209
+ NameError: uninitialized constant ActsAsYaffleTest::Wickwall
210
+ test/acts_as_yaffle_test.rb:10:in `test_a_wickwalls_yaffle_text_field_should_be_last_tweet'
211
+
212
+ 5 tests, 3 assertions, 0 failures, 2 errors, 0 skips
213
+ </shell>
214
+
215
+ This tells us that we don't have the necessary models (Hickwall and Wickwall) that we are trying to test.
216
+ We can easily generate these models in our "dummy" Rails application by running the following commands from the
217
+ test/dummy directory:
218
+
219
+ <shell>
220
+ $ cd test/dummy
221
+ $ rails generate model Hickwall last_squawk:string
222
+ $ rails generate model Wickwall last_squawk:string last_tweet:string
223
+ </shell>
224
+
225
+ Now you can create the necessary database tables in your testing database by navigating to your dummy app
226
+ and migrating the database. First
227
+
228
+ <shell>
229
+ $ cd test/dummy
230
+ $ rake db:migrate
231
+ $ rake db:test:prepare
232
+ </shell>
233
+
234
+ While you are here, change the Hickwall and Wickwall models so that they know that they are supposed to act
235
+ like yaffles.
236
+
237
+ <ruby>
238
+ # test/dummy/app/models/hickwall.rb
239
+
240
+ class Hickwall < ActiveRecord::Base
241
+ acts_as_yaffle
242
+ end
243
+
244
+ # test/dummy/app/models/wickwall.rb
245
+
246
+ class Wickwall < ActiveRecord::Base
247
+ acts_as_yaffle :yaffle_text_field => :last_tweet
248
+ end
249
+
250
+ </ruby>
251
+
252
+ We will also add code to define the acts_as_yaffle method.
253
+
254
+ <ruby>
255
+ # yaffle/lib/yaffle/acts_as_yaffle.rb
256
+ module Yaffle
257
+ module ActsAsYaffle
258
+ extend ActiveSupport::Concern
259
+
260
+ included do
261
+ end
262
+
263
+ module ClassMethods
264
+ def acts_as_yaffle(options = {})
265
+ # your code will go here
266
+ end
267
+ end
268
+ end
269
+ end
270
+
271
+ ActiveRecord::Base.send :include, Yaffle::ActsAsYaffle
272
+ </ruby>
273
+
274
+ You can then return to the root directory (+cd ../..+) of your plugin and rerun the tests using +rake+.
275
+
276
+ <shell>
277
+ 1) Error:
278
+ test_a_hickwalls_yaffle_text_field_should_be_last_squawk(ActsAsYaffleTest):
279
+ NoMethodError: undefined method `yaffle_text_field' for #<Class:0x000001016661b8>
280
+ /Users/xxx/.rvm/gems/ruby-1.9.2-p136@xxx/gems/activerecord-3.0.3/lib/active_record/base.rb:1008:in `method_missing'
281
+ test/acts_as_yaffle_test.rb:5:in `test_a_hickwalls_yaffle_text_field_should_be_last_squawk'
282
+
283
+ 2) Error:
284
+ test_a_wickwalls_yaffle_text_field_should_be_last_tweet(ActsAsYaffleTest):
285
+ NoMethodError: undefined method `yaffle_text_field' for #<Class:0x00000101653748>
286
+ Users/xxx/.rvm/gems/ruby-1.9.2-p136@xxx/gems/activerecord-3.0.3/lib/active_record/base.rb:1008:in `method_missing'
287
+ test/acts_as_yaffle_test.rb:9:in `test_a_wickwalls_yaffle_text_field_should_be_last_tweet'
288
+
289
+ 5 tests, 3 assertions, 0 failures, 2 errors, 0 skips
290
+
291
+ </shell>
292
+
293
+ Getting closer... Now we will implement the code of the acts_as_yaffle method to make the tests pass.
294
+
295
+ <ruby>
296
+ # yaffle/lib/yaffle/acts_as_yaffle.rb
297
+
298
+ module Yaffle
299
+ module ActsAsYaffle
300
+ extend ActiveSupport::Concern
301
+
302
+ included do
303
+ end
304
+
305
+ module ClassMethods
306
+ def acts_as_yaffle(options = {})
307
+ cattr_accessor :yaffle_text_field
308
+ self.yaffle_text_field = (options[:yaffle_text_field] || :last_squawk).to_s
309
+ end
310
+ end
311
+ end
312
+ end
313
+
314
+ ActiveRecord::Base.send :include, Yaffle::ActsAsYaffle
315
+ </ruby>
316
+
317
+ When you run +rake+ you should see the tests all pass:
318
+
319
+ <shell>
320
+ 5 tests, 5 assertions, 0 failures, 0 errors, 0 skips
321
+ </shell>
322
+
323
+ h4. Add an Instance Method
324
+
325
+ This plugin will add a method named 'squawk' to any Active Record object that calls 'acts_as_yaffle'. The 'squawk'
326
+ method will simply set the value of one of the fields in the database.
327
+
328
+ To start out, write a failing test that shows the behavior you'd like:
329
+
330
+ <ruby>
331
+ # yaffle/test/acts_as_yaffle_test.rb
332
+ require 'test_helper'
333
+
334
+ class ActsAsYaffleTest < Test::Unit::TestCase
335
+
336
+ def test_a_hickwalls_yaffle_text_field_should_be_last_squawk
337
+ assert_equal "last_squawk", Hickwall.yaffle_text_field
338
+ end
339
+
340
+ def test_a_wickwalls_yaffle_text_field_should_be_last_tweet
341
+ assert_equal "last_tweet", Wickwall.yaffle_text_field
342
+ end
343
+
344
+ def test_hickwalls_squawk_should_populate_last_squawk
345
+ hickwall = Hickwall.new
346
+ hickwall.squawk("Hello World")
347
+ assert_equal "squawk! Hello World", hickwall.last_squawk
348
+ end
349
+
350
+ def test_wickwalls_squawk_should_populate_last_tweet
351
+ wickwall = Wickwall.new
352
+ wickwall.squawk("Hello World")
353
+ assert_equal "squawk! Hello World", wickwall.last_tweet
354
+ end
355
+ end
356
+ </ruby>
357
+
358
+ Run the test to make sure the last two tests fail with an error that contains "NoMethodError: undefined method `squawk'",
359
+ then update 'acts_as_yaffle.rb' to look like this:
360
+
361
+ <ruby>
362
+ # yaffle/lib/yaffle/acts_as_yaffle.rb
363
+
364
+ module Yaffle
365
+ module ActsAsYaffle
366
+ extend ActiveSupport::Concern
367
+
368
+ included do
369
+ end
370
+
371
+ module ClassMethods
372
+ def acts_as_yaffle(options = {})
373
+ cattr_accessor :yaffle_text_field
374
+ self.yaffle_text_field = (options[:yaffle_text_field] || :last_squawk).to_s
375
+ end
376
+ end
377
+
378
+ def squawk(string)
379
+ write_attribute(self.class.yaffle_text_field, string.to_squawk)
380
+ end
381
+
382
+ end
383
+ end
384
+
385
+ ActiveRecord::Base.send :include, Yaffle::ActsAsYaffle
386
+ </ruby>
387
+
388
+ Run +rake+ one final time and you should see:
389
+
390
+ <shell>
391
+ 7 tests, 7 assertions, 0 failures, 0 errors, 0 skips
392
+ </shell>
393
+
394
+ NOTE: The use of +write_attribute+ to write to the field in model is just one example of how a plugin can interact with the model, and will not always be the right method to use. For example, you could also use <tt>send("#{self.class.yaffle_text_field}=", string.to_squawk)</tt>.
395
+
396
+ h3. Generators
397
+
398
+ Generators can be included in your gem simply by creating them in a lib/generators directory of your plugin. More information about
399
+ the creation of generators can be found in the "Generators Guide":generators.html
400
+
401
+ h3. Publishing your Gem
402
+
403
+ Gem plugins currently in development can easily be shared from any Git repository. To share the Yaffle gem with others, simply
404
+ commit the code to a Git repository (like Github) and add a line to the Gemfile of the application in question:
405
+
406
+ <ruby>
407
+ gem 'yaffle', :git => 'git://github.com/yaffle_watcher/yaffle.git'
408
+ </ruby>
409
+
410
+ After running +bundle install+, your gem functionality will be available to the application.
411
+
412
+ When the gem is ready to be shared as a formal release, it can be published to "RubyGems":http://www.rubygems.org.
413
+ For more information about publishing gems to RubyGems, see: "http://blog.thepete.net/2010/11/creating-and-publishing-your-first-ruby.html":http://blog.thepete.net/2010/11/creating-and-publishing-your-first-ruby.html
414
+
415
+ h3. Non-Gem Plugins
416
+
417
+ Non-gem plugins are useful for functionality that won't be shared with another project. Keeping your custom functionality in the
418
+ vendor/plugins directory un-clutters the rest of the application.
419
+
420
+ Move the directory that you created for the gem based plugin into the vendor/plugins directory of a generated Rails application, create a vendor/plugins/yaffle/init.rb file that contains "require 'yaffle'" and everything will still work.
421
+
422
+ <ruby>
423
+ # yaffle/init.rb
424
+
425
+ require 'yaffle'
426
+ </ruby>
427
+
428
+ You can test this by changing to the Rails application that you added the plugin to and starting a rails console. Once in the
429
+ console we can check to see if the String has an instance method to_squawk:
430
+
431
+ <shell>
432
+ $ cd my_app
433
+ $ rails console
434
+ $ "Rails plugins are easy!".to_squawk
435
+ </shell>
436
+
437
+ You can also remove the .gemspec, Gemfile and Gemfile.lock files as they will no longer be needed.
438
+
439
+ h3. RDoc Documentation
440
+
441
+ Once your plugin is stable and you are ready to deploy do everyone else a favor and document it! Luckily, writing documentation for your plugin is easy.
442
+
443
+ The first step is to update the README file with detailed information about how to use your plugin. A few key things to include are:
444
+
445
+ * Your name
446
+ * How to install
447
+ * How to add the functionality to the app (several examples of common use cases)
448
+ * Warnings, gotchas or tips that might help users and save them time
449
+
450
+ Once your README is solid, go through and add rdoc comments to all of the methods that developers will use. It's also customary to add '#:nodoc:' comments to those parts of the code that are not included in the public api.
451
+
452
+ Once your comments are good to go, navigate to your plugin directory and run:
453
+
454
+ <shell>
455
+ $ rake rdoc
456
+ </shell>
457
+
458
+ h4. References
459
+
460
+ * "Developing a RubyGem using Bundler":https://github.com/radar/guides/blob/master/gem-development.md
461
+ * "Using Gemspecs As Intended":http://yehudakatz.com/2010/04/02/using-gemspecs-as-intended/
462
+ * "Gemspec Reference":http://docs.rubygems.org/read/chapter/20
463
+ * "GemPlugins":http://www.mbleigh.com/2008/06/11/gemplugins-a-brief-introduction-to-the-future-of-rails-plugins
464
+ * "Keeping init.rb thin":http://daddy.platte.name/2007/05/rails-plugins-keep-initrb-thin.html
@@ -0,0 +1,240 @@
1
+ h2. Rails Application Templates
2
+
3
+ Application templates are simple Ruby files containing DSL for adding plugins/gems/initializers etc. to your freshly created Rails project or an existing Rails project.
4
+
5
+ By referring to this guide, you will be able to:
6
+
7
+ * Use templates to generate/customize Rails applications
8
+ * Write your own reusable application templates using the Rails template API
9
+
10
+ endprologue.
11
+
12
+ h3. Usage
13
+
14
+ To apply a template, you need to provide the Rails generator with the location of the template you wish to apply, using -m option. This can either be path to a file or a URL.
15
+
16
+ <shell>
17
+ $ rails new blog -m ~/template.rb
18
+ $ rails new blog -m http://example.com/template.rb
19
+ </shell>
20
+
21
+ You can use the rake task +rails:template+ to apply templates to an existing Rails application. The location of the template needs to be passed in to an environment variable named LOCATION. Again, this can either be path to a file or a URL.
22
+
23
+ <shell>
24
+ $ rake rails:template LOCATION=~/template.rb
25
+ $ rake rails:template LOCATION=http://example.com/template.rb
26
+ </shell>
27
+
28
+ h3. Template API
29
+
30
+ Rails templates API is very self explanatory and easy to understand. Here's an example of a typical Rails template:
31
+
32
+ <ruby>
33
+ # template.rb
34
+ run "rm public/index.html"
35
+ generate(:scaffold, "person name:string")
36
+ route "root :to => 'people#index'"
37
+ rake("db:migrate")
38
+
39
+ git :init
40
+ git :add => "."
41
+ git :commit => "-a -m 'Initial commit'"
42
+ </ruby>
43
+
44
+ The following sections outlines the primary methods provided by the API:
45
+
46
+ h4. gem(name, options = {})
47
+
48
+ Adds a +gem+ entry for the supplied gem to the generated application’s +Gemfile+.
49
+
50
+ For example, if your application depends on the gems +bj+ and +nokogiri+:
51
+
52
+ <ruby>
53
+ gem "bj"
54
+ gem "nokogiri"
55
+ </ruby>
56
+
57
+ Please note that this will NOT install the gems for you and you will have to run +bundle install+ to do that.
58
+
59
+ <ruby>
60
+ bundle install
61
+ </ruby>
62
+
63
+ h4. gem_group(*names, &block)
64
+
65
+ Wraps gem entries inside a group.
66
+
67
+ For example, if you want to load +rspec-rails+ only in +development+ and +test+ group:
68
+
69
+ <ruby>
70
+ gem_group :development, :test do
71
+ gem "rspec-rails"
72
+ end
73
+ </ruby>
74
+
75
+ h4. add_source(source, options = {})
76
+
77
+ Adds the given source to the generated application's +Gemfile+.
78
+
79
+ For example, if you need to source a gem from "http://code.whytheluckystiff.net":
80
+
81
+ <ruby>
82
+ add_source "http://code.whytheluckystiff.net"
83
+ </ruby>
84
+
85
+ h4. plugin(name, options = {})
86
+
87
+ Installs a plugin to the generated application.
88
+
89
+ Plugin can be installed from Git:
90
+
91
+ <ruby>
92
+ plugin 'authentication', :git => 'git://github.com/foor/bar.git'
93
+ </ruby>
94
+
95
+ You can even install plugins as git submodules:
96
+
97
+ <ruby>
98
+ plugin 'authentication', :git => 'git://github.com/foor/bar.git',
99
+ :submodule => true
100
+ </ruby>
101
+
102
+ Please note that you need to +git :init+ before you can install a plugin as a submodule.
103
+
104
+ Or use plain old SVN:
105
+
106
+ <ruby>
107
+ plugin 'usingsvn', :svn => 'svn://example.com/usingsvn/trunk'
108
+ </ruby>
109
+
110
+ h4. vendor/lib/file/initializer(filename, data = nil, &block)
111
+
112
+ Adds an initializer to the generated application’s +config/initializers+ directory.
113
+
114
+ Lets say you like using +Object#not_nil?+ and +Object#not_blank?+:
115
+
116
+ <ruby>
117
+ initializer 'bloatlol.rb', <<-CODE
118
+ class Object
119
+ def not_nil?
120
+ !nil?
121
+ end
122
+
123
+ def not_blank?
124
+ !blank?
125
+ end
126
+ end
127
+ CODE
128
+ </ruby>
129
+
130
+ Similarly +lib()+ creates a file in the +lib/+ directory and +vendor()+ creates a file in the +vendor/+ directory.
131
+
132
+ There is even +file()+, which accepts a relative path from +Rails.root+ and creates all the directories/file needed:
133
+
134
+ <ruby>
135
+ file 'app/components/foo.rb', <<-CODE
136
+ class Foo
137
+ end
138
+ CODE
139
+ </ruby>
140
+
141
+ That’ll create +app/components+ directory and put +foo.rb+ in there.
142
+
143
+ h4. rakefile(filename, data = nil, &block)
144
+
145
+ Creates a new rake file under +lib/tasks+ with the supplied tasks:
146
+
147
+ <ruby>
148
+ rakefile("bootstrap.rake") do
149
+ <<-TASK
150
+ namespace :boot do
151
+ task :strap do
152
+ puts "i like boots!"
153
+ end
154
+ end
155
+ TASK
156
+ end
157
+ </ruby>
158
+
159
+ The above creates +lib/tasks/bootstrap.rake+ with a +boot:strap+ rake task.
160
+
161
+ h4. generate(what, args)
162
+
163
+ Runs the supplied rails generator with given arguments.
164
+
165
+ <ruby>
166
+ generate(:scaffold, "person", "name:string", "address:text", "age:number")
167
+ </ruby>
168
+
169
+ h4. run(command)
170
+
171
+ Executes an arbitrary command. Just like the backticks. Let's say you want to remove the +public/index.html+ file:
172
+
173
+ <ruby>
174
+ run "rm public/index.html"
175
+ </ruby>
176
+
177
+ h4. rake(command, options = {})
178
+
179
+ Runs the supplied rake tasks in the Rails application. Let's say you want to migrate the database:
180
+
181
+ <ruby>
182
+ rake "db:migrate"
183
+ </ruby>
184
+
185
+ You can also run rake tasks with a different Rails environment:
186
+
187
+ <ruby>
188
+ rake "db:migrate", :env => 'production'
189
+ </ruby>
190
+
191
+ h4. route(routing_code)
192
+
193
+ This adds a routing entry to the +config/routes.rb+ file. In above steps, we generated a person scaffold and also removed +public/index.html+. Now to make +PeopleController#index+ as the default page for the application:
194
+
195
+ <ruby>
196
+ route "root :to => 'person#index'"
197
+ </ruby>
198
+
199
+ h4. inside(dir)
200
+
201
+ Enables you to run a command from the given directory. For example, if you have a copy of edge rails that you wish to symlink from your new apps, you can do this:
202
+
203
+ <ruby>
204
+ inside('vendor') do
205
+ run "ln -s ~/commit-rails/rails rails"
206
+ end
207
+ </ruby>
208
+
209
+ h4. ask(question)
210
+
211
+ +ask()+ gives you a chance to get some feedback from the user and use it in your templates. Lets say you want your user to name the new shiny library you’re adding:
212
+
213
+ <ruby>
214
+ lib_name = ask("What do you want to call the shiny library ?")
215
+ lib_name << ".rb" unless lib_name.index(".rb")
216
+
217
+ lib lib_name, <<-CODE
218
+ class Shiny
219
+ end
220
+ CODE
221
+ </ruby>
222
+
223
+ h4. yes?(question) or no?(question)
224
+
225
+ These methods let you ask questions from templates and decide the flow based on the user’s answer. Lets say you want to freeze rails only if the user want to:
226
+
227
+ <ruby>
228
+ rake("rails:freeze:gems") if yes?("Freeze rails gems ?")
229
+ no?(question) acts just the opposite.
230
+ </ruby>
231
+
232
+ h4. git(:command)
233
+
234
+ Rails templates let you run any git command:
235
+
236
+ <ruby>
237
+ git :init
238
+ git :add => "."
239
+ git :commit => "-a -m 'Initial commit'"
240
+ </ruby>