rails 4.1.4 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rails might be problematic. Click here for more details.

Files changed (284) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +55 -34
  3. metadata +93 -311
  4. data/guides/CHANGELOG.md +0 -41
  5. data/guides/Rakefile +0 -77
  6. data/guides/assets/images/akshaysurve.jpg +0 -0
  7. data/guides/assets/images/belongs_to.png +0 -0
  8. data/guides/assets/images/book_icon.gif +0 -0
  9. data/guides/assets/images/bullet.gif +0 -0
  10. data/guides/assets/images/chapters_icon.gif +0 -0
  11. data/guides/assets/images/check_bullet.gif +0 -0
  12. data/guides/assets/images/credits_pic_blank.gif +0 -0
  13. data/guides/assets/images/csrf.png +0 -0
  14. data/guides/assets/images/edge_badge.png +0 -0
  15. data/guides/assets/images/favicon.ico +0 -0
  16. data/guides/assets/images/feature_tile.gif +0 -0
  17. data/guides/assets/images/footer_tile.gif +0 -0
  18. data/guides/assets/images/fxn.png +0 -0
  19. data/guides/assets/images/getting_started/article_with_comments.png +0 -0
  20. data/guides/assets/images/getting_started/challenge.png +0 -0
  21. data/guides/assets/images/getting_started/confirm_dialog.png +0 -0
  22. data/guides/assets/images/getting_started/forbidden_attributes_for_new_article.png +0 -0
  23. data/guides/assets/images/getting_started/form_with_errors.png +0 -0
  24. data/guides/assets/images/getting_started/index_action_with_edit_link.png +0 -0
  25. data/guides/assets/images/getting_started/new_article.png +0 -0
  26. data/guides/assets/images/getting_started/rails_welcome.png +0 -0
  27. data/guides/assets/images/getting_started/routing_error_no_controller.png +0 -0
  28. data/guides/assets/images/getting_started/routing_error_no_route_matches.png +0 -0
  29. data/guides/assets/images/getting_started/show_action_for_articles.png +0 -0
  30. data/guides/assets/images/getting_started/template_is_missing_articles_new.png +0 -0
  31. data/guides/assets/images/getting_started/unknown_action_create_for_articles.png +0 -0
  32. data/guides/assets/images/getting_started/unknown_action_new_for_articles.png +0 -0
  33. data/guides/assets/images/grey_bullet.gif +0 -0
  34. data/guides/assets/images/habtm.png +0 -0
  35. data/guides/assets/images/has_many.png +0 -0
  36. data/guides/assets/images/has_many_through.png +0 -0
  37. data/guides/assets/images/has_one.png +0 -0
  38. data/guides/assets/images/has_one_through.png +0 -0
  39. data/guides/assets/images/header_backdrop.png +0 -0
  40. data/guides/assets/images/header_tile.gif +0 -0
  41. data/guides/assets/images/i18n/demo_html_safe.png +0 -0
  42. data/guides/assets/images/i18n/demo_localized_pirate.png +0 -0
  43. data/guides/assets/images/i18n/demo_translated_en.png +0 -0
  44. data/guides/assets/images/i18n/demo_translated_pirate.png +0 -0
  45. data/guides/assets/images/i18n/demo_translation_missing.png +0 -0
  46. data/guides/assets/images/i18n/demo_untranslated.png +0 -0
  47. data/guides/assets/images/icons/README +0 -5
  48. data/guides/assets/images/icons/callouts/1.png +0 -0
  49. data/guides/assets/images/icons/callouts/10.png +0 -0
  50. data/guides/assets/images/icons/callouts/11.png +0 -0
  51. data/guides/assets/images/icons/callouts/12.png +0 -0
  52. data/guides/assets/images/icons/callouts/13.png +0 -0
  53. data/guides/assets/images/icons/callouts/14.png +0 -0
  54. data/guides/assets/images/icons/callouts/15.png +0 -0
  55. data/guides/assets/images/icons/callouts/2.png +0 -0
  56. data/guides/assets/images/icons/callouts/3.png +0 -0
  57. data/guides/assets/images/icons/callouts/4.png +0 -0
  58. data/guides/assets/images/icons/callouts/5.png +0 -0
  59. data/guides/assets/images/icons/callouts/6.png +0 -0
  60. data/guides/assets/images/icons/callouts/7.png +0 -0
  61. data/guides/assets/images/icons/callouts/8.png +0 -0
  62. data/guides/assets/images/icons/callouts/9.png +0 -0
  63. data/guides/assets/images/icons/caution.png +0 -0
  64. data/guides/assets/images/icons/example.png +0 -0
  65. data/guides/assets/images/icons/home.png +0 -0
  66. data/guides/assets/images/icons/important.png +0 -0
  67. data/guides/assets/images/icons/next.png +0 -0
  68. data/guides/assets/images/icons/note.png +0 -0
  69. data/guides/assets/images/icons/prev.png +0 -0
  70. data/guides/assets/images/icons/tip.png +0 -0
  71. data/guides/assets/images/icons/up.png +0 -0
  72. data/guides/assets/images/icons/warning.png +0 -0
  73. data/guides/assets/images/nav_arrow.gif +0 -0
  74. data/guides/assets/images/oscardelben.jpg +0 -0
  75. data/guides/assets/images/polymorphic.png +0 -0
  76. data/guides/assets/images/radar.png +0 -0
  77. data/guides/assets/images/rails4_features.png +0 -0
  78. data/guides/assets/images/rails_guides_kindle_cover.jpg +0 -0
  79. data/guides/assets/images/rails_guides_logo.gif +0 -0
  80. data/guides/assets/images/rails_logo_remix.gif +0 -0
  81. data/guides/assets/images/session_fixation.png +0 -0
  82. data/guides/assets/images/tab_grey.gif +0 -0
  83. data/guides/assets/images/tab_info.gif +0 -0
  84. data/guides/assets/images/tab_note.gif +0 -0
  85. data/guides/assets/images/tab_red.gif +0 -0
  86. data/guides/assets/images/tab_yellow.gif +0 -0
  87. data/guides/assets/images/tab_yellow.png +0 -0
  88. data/guides/assets/images/vijaydev.jpg +0 -0
  89. data/guides/assets/javascripts/guides.js +0 -53
  90. data/guides/assets/javascripts/jquery.min.js +0 -4
  91. data/guides/assets/javascripts/responsive-tables.js +0 -43
  92. data/guides/assets/javascripts/syntaxhighlighter/shBrushAS3.js +0 -59
  93. data/guides/assets/javascripts/syntaxhighlighter/shBrushAppleScript.js +0 -75
  94. data/guides/assets/javascripts/syntaxhighlighter/shBrushBash.js +0 -59
  95. data/guides/assets/javascripts/syntaxhighlighter/shBrushCSharp.js +0 -65
  96. data/guides/assets/javascripts/syntaxhighlighter/shBrushColdFusion.js +0 -100
  97. data/guides/assets/javascripts/syntaxhighlighter/shBrushCpp.js +0 -97
  98. data/guides/assets/javascripts/syntaxhighlighter/shBrushCss.js +0 -91
  99. data/guides/assets/javascripts/syntaxhighlighter/shBrushDelphi.js +0 -55
  100. data/guides/assets/javascripts/syntaxhighlighter/shBrushDiff.js +0 -41
  101. data/guides/assets/javascripts/syntaxhighlighter/shBrushErlang.js +0 -52
  102. data/guides/assets/javascripts/syntaxhighlighter/shBrushGroovy.js +0 -67
  103. data/guides/assets/javascripts/syntaxhighlighter/shBrushJScript.js +0 -52
  104. data/guides/assets/javascripts/syntaxhighlighter/shBrushJava.js +0 -57
  105. data/guides/assets/javascripts/syntaxhighlighter/shBrushJavaFX.js +0 -58
  106. data/guides/assets/javascripts/syntaxhighlighter/shBrushPerl.js +0 -72
  107. data/guides/assets/javascripts/syntaxhighlighter/shBrushPhp.js +0 -88
  108. data/guides/assets/javascripts/syntaxhighlighter/shBrushPlain.js +0 -33
  109. data/guides/assets/javascripts/syntaxhighlighter/shBrushPowerShell.js +0 -74
  110. data/guides/assets/javascripts/syntaxhighlighter/shBrushPython.js +0 -64
  111. data/guides/assets/javascripts/syntaxhighlighter/shBrushRuby.js +0 -55
  112. data/guides/assets/javascripts/syntaxhighlighter/shBrushSass.js +0 -94
  113. data/guides/assets/javascripts/syntaxhighlighter/shBrushScala.js +0 -51
  114. data/guides/assets/javascripts/syntaxhighlighter/shBrushSql.js +0 -66
  115. data/guides/assets/javascripts/syntaxhighlighter/shBrushVb.js +0 -56
  116. data/guides/assets/javascripts/syntaxhighlighter/shBrushXml.js +0 -69
  117. data/guides/assets/javascripts/syntaxhighlighter/shCore.js +0 -17
  118. data/guides/assets/stylesheets/fixes.css +0 -16
  119. data/guides/assets/stylesheets/kindle.css +0 -11
  120. data/guides/assets/stylesheets/main.css +0 -710
  121. data/guides/assets/stylesheets/print.css +0 -52
  122. data/guides/assets/stylesheets/reset.css +0 -43
  123. data/guides/assets/stylesheets/responsive-tables.css +0 -50
  124. data/guides/assets/stylesheets/style.css +0 -13
  125. data/guides/assets/stylesheets/syntaxhighlighter/shCore.css +0 -226
  126. data/guides/assets/stylesheets/syntaxhighlighter/shCoreDefault.css +0 -328
  127. data/guides/assets/stylesheets/syntaxhighlighter/shCoreDjango.css +0 -331
  128. data/guides/assets/stylesheets/syntaxhighlighter/shCoreEclipse.css +0 -339
  129. data/guides/assets/stylesheets/syntaxhighlighter/shCoreEmacs.css +0 -324
  130. data/guides/assets/stylesheets/syntaxhighlighter/shCoreFadeToGrey.css +0 -328
  131. data/guides/assets/stylesheets/syntaxhighlighter/shCoreMDUltra.css +0 -324
  132. data/guides/assets/stylesheets/syntaxhighlighter/shCoreMidnight.css +0 -324
  133. data/guides/assets/stylesheets/syntaxhighlighter/shCoreRDark.css +0 -324
  134. data/guides/assets/stylesheets/syntaxhighlighter/shThemeDefault.css +0 -117
  135. data/guides/assets/stylesheets/syntaxhighlighter/shThemeDjango.css +0 -120
  136. data/guides/assets/stylesheets/syntaxhighlighter/shThemeEclipse.css +0 -128
  137. data/guides/assets/stylesheets/syntaxhighlighter/shThemeEmacs.css +0 -113
  138. data/guides/assets/stylesheets/syntaxhighlighter/shThemeFadeToGrey.css +0 -117
  139. data/guides/assets/stylesheets/syntaxhighlighter/shThemeMDUltra.css +0 -113
  140. data/guides/assets/stylesheets/syntaxhighlighter/shThemeMidnight.css +0 -113
  141. data/guides/assets/stylesheets/syntaxhighlighter/shThemeRDark.css +0 -113
  142. data/guides/assets/stylesheets/syntaxhighlighter/shThemeRailsGuides.css +0 -116
  143. data/guides/bug_report_templates/action_controller_gem.rb +0 -47
  144. data/guides/bug_report_templates/action_controller_master.rb +0 -53
  145. data/guides/bug_report_templates/active_record_gem.rb +0 -40
  146. data/guides/bug_report_templates/active_record_master.rb +0 -49
  147. data/guides/code/getting_started/Gemfile +0 -40
  148. data/guides/code/getting_started/Gemfile.lock +0 -125
  149. data/guides/code/getting_started/README.rdoc +0 -28
  150. data/guides/code/getting_started/Rakefile +0 -6
  151. data/guides/code/getting_started/app/assets/javascripts/application.js +0 -15
  152. data/guides/code/getting_started/app/assets/javascripts/comments.js.coffee +0 -3
  153. data/guides/code/getting_started/app/assets/javascripts/posts.js.coffee +0 -3
  154. data/guides/code/getting_started/app/assets/javascripts/welcome.js.coffee +0 -3
  155. data/guides/code/getting_started/app/assets/stylesheets/application.css +0 -13
  156. data/guides/code/getting_started/app/assets/stylesheets/comments.css.scss +0 -3
  157. data/guides/code/getting_started/app/assets/stylesheets/posts.css.scss +0 -3
  158. data/guides/code/getting_started/app/assets/stylesheets/welcome.css.scss +0 -3
  159. data/guides/code/getting_started/app/controllers/application_controller.rb +0 -5
  160. data/guides/code/getting_started/app/controllers/comments_controller.rb +0 -23
  161. data/guides/code/getting_started/app/controllers/posts_controller.rb +0 -53
  162. data/guides/code/getting_started/app/controllers/welcome_controller.rb +0 -4
  163. data/guides/code/getting_started/app/helpers/application_helper.rb +0 -2
  164. data/guides/code/getting_started/app/helpers/comments_helper.rb +0 -2
  165. data/guides/code/getting_started/app/helpers/posts_helper.rb +0 -2
  166. data/guides/code/getting_started/app/helpers/welcome_helper.rb +0 -2
  167. data/guides/code/getting_started/app/models/comment.rb +0 -3
  168. data/guides/code/getting_started/app/models/post.rb +0 -7
  169. data/guides/code/getting_started/app/views/comments/_comment.html.erb +0 -15
  170. data/guides/code/getting_started/app/views/comments/_form.html.erb +0 -13
  171. data/guides/code/getting_started/app/views/layouts/application.html.erb +0 -14
  172. data/guides/code/getting_started/app/views/posts/_form.html.erb +0 -27
  173. data/guides/code/getting_started/app/views/posts/edit.html.erb +0 -5
  174. data/guides/code/getting_started/app/views/posts/index.html.erb +0 -21
  175. data/guides/code/getting_started/app/views/posts/new.html.erb +0 -5
  176. data/guides/code/getting_started/app/views/posts/show.html.erb +0 -18
  177. data/guides/code/getting_started/app/views/welcome/index.html.erb +0 -4
  178. data/guides/code/getting_started/bin/bundle +0 -4
  179. data/guides/code/getting_started/bin/rails +0 -4
  180. data/guides/code/getting_started/bin/rake +0 -4
  181. data/guides/code/getting_started/config/application.rb +0 -18
  182. data/guides/code/getting_started/config/boot.rb +0 -4
  183. data/guides/code/getting_started/config/database.yml +0 -25
  184. data/guides/code/getting_started/config/environment.rb +0 -5
  185. data/guides/code/getting_started/config/environments/development.rb +0 -30
  186. data/guides/code/getting_started/config/environments/production.rb +0 -80
  187. data/guides/code/getting_started/config/environments/test.rb +0 -36
  188. data/guides/code/getting_started/config/initializers/backtrace_silencers.rb +0 -7
  189. data/guides/code/getting_started/config/initializers/filter_parameter_logging.rb +0 -4
  190. data/guides/code/getting_started/config/initializers/inflections.rb +0 -16
  191. data/guides/code/getting_started/config/initializers/locale.rb +0 -9
  192. data/guides/code/getting_started/config/initializers/mime_types.rb +0 -5
  193. data/guides/code/getting_started/config/initializers/secret_token.rb +0 -12
  194. data/guides/code/getting_started/config/initializers/session_store.rb +0 -3
  195. data/guides/code/getting_started/config/initializers/wrap_parameters.rb +0 -14
  196. data/guides/code/getting_started/config/locales/en.yml +0 -23
  197. data/guides/code/getting_started/config/routes.rb +0 -7
  198. data/guides/code/getting_started/config.ru +0 -4
  199. data/guides/code/getting_started/db/migrate/20130122042648_create_posts.rb +0 -10
  200. data/guides/code/getting_started/db/migrate/20130122045842_create_comments.rb +0 -11
  201. data/guides/code/getting_started/db/schema.rb +0 -33
  202. data/guides/code/getting_started/db/seeds.rb +0 -7
  203. data/guides/code/getting_started/public/404.html +0 -60
  204. data/guides/code/getting_started/public/422.html +0 -60
  205. data/guides/code/getting_started/public/500.html +0 -59
  206. data/guides/code/getting_started/public/favicon.ico +0 -0
  207. data/guides/code/getting_started/public/robots.txt +0 -5
  208. data/guides/code/getting_started/test/controllers/comments_controller_test.rb +0 -7
  209. data/guides/code/getting_started/test/controllers/posts_controller_test.rb +0 -7
  210. data/guides/code/getting_started/test/controllers/welcome_controller_test.rb +0 -9
  211. data/guides/code/getting_started/test/fixtures/comments.yml +0 -11
  212. data/guides/code/getting_started/test/fixtures/posts.yml +0 -9
  213. data/guides/code/getting_started/test/helpers/comments_helper_test.rb +0 -4
  214. data/guides/code/getting_started/test/helpers/posts_helper_test.rb +0 -4
  215. data/guides/code/getting_started/test/helpers/welcome_helper_test.rb +0 -4
  216. data/guides/code/getting_started/test/models/comment_test.rb +0 -7
  217. data/guides/code/getting_started/test/models/post_test.rb +0 -7
  218. data/guides/code/getting_started/test/test_helper.rb +0 -12
  219. data/guides/rails_guides/generator.rb +0 -248
  220. data/guides/rails_guides/helpers.rb +0 -53
  221. data/guides/rails_guides/indexer.rb +0 -68
  222. data/guides/rails_guides/kindle.rb +0 -119
  223. data/guides/rails_guides/levenshtein.rb +0 -31
  224. data/guides/rails_guides/markdown/renderer.rb +0 -82
  225. data/guides/rails_guides/markdown.rb +0 -163
  226. data/guides/rails_guides.rb +0 -63
  227. data/guides/source/2_2_release_notes.md +0 -435
  228. data/guides/source/2_3_release_notes.md +0 -621
  229. data/guides/source/3_0_release_notes.md +0 -611
  230. data/guides/source/3_1_release_notes.md +0 -556
  231. data/guides/source/3_2_release_notes.md +0 -565
  232. data/guides/source/4_0_release_notes.md +0 -276
  233. data/guides/source/4_1_release_notes.md +0 -731
  234. data/guides/source/_license.html.erb +0 -2
  235. data/guides/source/_welcome.html.erb +0 -25
  236. data/guides/source/action_controller_overview.md +0 -1175
  237. data/guides/source/action_mailer_basics.md +0 -689
  238. data/guides/source/action_view_overview.md +0 -1610
  239. data/guides/source/active_model_basics.md +0 -200
  240. data/guides/source/active_record_basics.md +0 -373
  241. data/guides/source/active_record_callbacks.md +0 -410
  242. data/guides/source/active_record_querying.md +0 -1773
  243. data/guides/source/active_record_validations.md +0 -1169
  244. data/guides/source/active_support_core_extensions.md +0 -3864
  245. data/guides/source/active_support_instrumentation.md +0 -496
  246. data/guides/source/api_documentation_guidelines.md +0 -315
  247. data/guides/source/asset_pipeline.md +0 -1163
  248. data/guides/source/association_basics.md +0 -2229
  249. data/guides/source/caching_with_rails.md +0 -354
  250. data/guides/source/command_line.md +0 -603
  251. data/guides/source/configuring.md +0 -942
  252. data/guides/source/contributing_to_ruby_on_rails.md +0 -544
  253. data/guides/source/credits.html.erb +0 -80
  254. data/guides/source/debugging_rails_applications.md +0 -707
  255. data/guides/source/development_dependencies_install.md +0 -278
  256. data/guides/source/documents.yaml +0 -193
  257. data/guides/source/engines.md +0 -1391
  258. data/guides/source/form_helpers.md +0 -1001
  259. data/guides/source/generators.md +0 -663
  260. data/guides/source/getting_started.md +0 -1947
  261. data/guides/source/i18n.md +0 -1043
  262. data/guides/source/index.html.erb +0 -27
  263. data/guides/source/initialization.md +0 -657
  264. data/guides/source/kindle/copyright.html.erb +0 -1
  265. data/guides/source/kindle/layout.html.erb +0 -27
  266. data/guides/source/kindle/rails_guides.opf.erb +0 -52
  267. data/guides/source/kindle/toc.html.erb +0 -24
  268. data/guides/source/kindle/toc.ncx.erb +0 -64
  269. data/guides/source/kindle/welcome.html.erb +0 -5
  270. data/guides/source/layout.html.erb +0 -146
  271. data/guides/source/layouts_and_rendering.md +0 -1226
  272. data/guides/source/maintenance_policy.md +0 -56
  273. data/guides/source/migrations.md +0 -1109
  274. data/guides/source/nested_model_forms.md +0 -225
  275. data/guides/source/plugins.md +0 -444
  276. data/guides/source/rails_application_templates.md +0 -248
  277. data/guides/source/rails_on_rack.md +0 -333
  278. data/guides/source/routing.md +0 -1115
  279. data/guides/source/ruby_on_rails_guides_guidelines.md +0 -128
  280. data/guides/source/security.md +0 -1018
  281. data/guides/source/testing.md +0 -1052
  282. data/guides/source/upgrading_ruby_on_rails.md +0 -899
  283. data/guides/source/working_with_javascript_in_rails.md +0 -405
  284. data/guides/w3c_validator.rb +0 -95
@@ -1,7 +0,0 @@
1
- require 'test_helper'
2
-
3
- class CommentsControllerTest < ActionController::TestCase
4
- # test "the truth" do
5
- # assert true
6
- # end
7
- end
@@ -1,7 +0,0 @@
1
- require 'test_helper'
2
-
3
- class PostsControllerTest < ActionController::TestCase
4
- # test "the truth" do
5
- # assert true
6
- # end
7
- end
@@ -1,9 +0,0 @@
1
- require 'test_helper'
2
-
3
- class WelcomeControllerTest < ActionController::TestCase
4
- test "should get index" do
5
- get :index
6
- assert_response :success
7
- end
8
-
9
- end
@@ -1,11 +0,0 @@
1
- # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
2
-
3
- one:
4
- commenter: MyString
5
- body: MyText
6
- post_id:
7
-
8
- two:
9
- commenter: MyString
10
- body: MyText
11
- post_id:
@@ -1,9 +0,0 @@
1
- # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
2
-
3
- one:
4
- title: MyString
5
- text: MyText
6
-
7
- two:
8
- title: MyString
9
- text: MyText
@@ -1,4 +0,0 @@
1
- require 'test_helper'
2
-
3
- class CommentsHelperTest < ActionView::TestCase
4
- end
@@ -1,4 +0,0 @@
1
- require 'test_helper'
2
-
3
- class PostsHelperTest < ActionView::TestCase
4
- end
@@ -1,4 +0,0 @@
1
- require 'test_helper'
2
-
3
- class WelcomeHelperTest < ActionView::TestCase
4
- end
@@ -1,7 +0,0 @@
1
- require 'test_helper'
2
-
3
- class CommentTest < ActiveSupport::TestCase
4
- # test "the truth" do
5
- # assert true
6
- # end
7
- end
@@ -1,7 +0,0 @@
1
- require 'test_helper'
2
-
3
- class PostTest < ActiveSupport::TestCase
4
- # test "the truth" do
5
- # assert true
6
- # end
7
- end
@@ -1,12 +0,0 @@
1
- ENV["RAILS_ENV"] = "test"
2
- require File.expand_path('../../config/environment', __FILE__)
3
- require 'rails/test_help'
4
-
5
- class ActiveSupport::TestCase
6
- ActiveRecord::Migration.check_pending!
7
-
8
- # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
9
- fixtures :all
10
-
11
- # Add more helper methods to be used by all tests here...
12
- end
@@ -1,248 +0,0 @@
1
- # ---------------------------------------------------------------------------
2
- #
3
- # This script generates the guides. It can be invoked via the
4
- # guides:generate rake task within the guides directory.
5
- #
6
- # Guides are taken from the source directory, and the resulting HTML goes into the
7
- # output directory. Assets are stored under files, and copied to output/files as
8
- # part of the generation process.
9
- #
10
- # Some arguments may be passed via environment variables:
11
- #
12
- # WARNINGS
13
- # If you are writing a guide, please work always with WARNINGS=1. Users can
14
- # generate the guides, and thus this flag is off by default.
15
- #
16
- # Internal links (anchors) are checked. If a reference is broken levenshtein
17
- # distance is used to suggest an existing one. This is useful since IDs are
18
- # generated by Markdown from headers and thus edits alter them.
19
- #
20
- # Also detects duplicated IDs. They happen if there are headers with the same
21
- # text. Please do resolve them, if any, so guides are valid XHTML.
22
- #
23
- # ALL
24
- # Set to "1" to force the generation of all guides.
25
- #
26
- # ONLY
27
- # Use ONLY if you want to generate only one or a set of guides. Prefixes are
28
- # enough:
29
- #
30
- # # generates only association_basics.html
31
- # ONLY=assoc ruby rails_guides.rb
32
- #
33
- # Separate many using commas:
34
- #
35
- # # generates only association_basics.html and migrations.html
36
- # ONLY=assoc,migrations ruby rails_guides.rb
37
- #
38
- # Note that if you are working on a guide generation will by default process
39
- # only that one, so ONLY is rarely used nowadays.
40
- #
41
- # GUIDES_LANGUAGE
42
- # Use GUIDES_LANGUAGE when you want to generate translated guides in
43
- # <tt>source/<GUIDES_LANGUAGE></tt> folder (such as <tt>source/es</tt>).
44
- # Ignore it when generating English guides.
45
- #
46
- # EDGE
47
- # Set to "1" to indicate generated guides should be marked as edge. This
48
- # inserts a badge and changes the preamble of the home page.
49
- #
50
- # ---------------------------------------------------------------------------
51
-
52
- require 'set'
53
- require 'fileutils'
54
-
55
- require 'active_support/core_ext/string/output_safety'
56
- require 'active_support/core_ext/object/blank'
57
- require 'action_controller'
58
- require 'action_view'
59
-
60
- require 'rails_guides/indexer'
61
- require 'rails_guides/helpers'
62
- require 'rails_guides/levenshtein'
63
-
64
- module RailsGuides
65
- class Generator
66
- attr_reader :guides_dir, :source_dir, :output_dir, :edge, :warnings, :all
67
-
68
- GUIDES_RE = /\.(?:erb|md)\z/
69
-
70
- def initialize(output=nil)
71
- set_flags_from_environment
72
-
73
- if kindle?
74
- check_for_kindlegen
75
- register_kindle_mime_types
76
- end
77
-
78
- initialize_dirs(output)
79
- create_output_dir_if_needed
80
- end
81
-
82
- def set_flags_from_environment
83
- @edge = ENV['EDGE'] == '1'
84
- @warnings = ENV['WARNINGS'] == '1'
85
- @all = ENV['ALL'] == '1'
86
- @kindle = ENV['KINDLE'] == '1'
87
- @version = ENV['RAILS_VERSION'] || 'local'
88
- @lang = ENV['GUIDES_LANGUAGE']
89
- end
90
-
91
- def register_kindle_mime_types
92
- Mime::Type.register_alias("application/xml", :opf, %w(opf))
93
- Mime::Type.register_alias("application/xml", :ncx, %w(ncx))
94
- end
95
-
96
- def generate
97
- generate_guides
98
- copy_assets
99
- generate_mobi if kindle?
100
- end
101
-
102
- private
103
-
104
- def kindle?
105
- @kindle
106
- end
107
-
108
- def check_for_kindlegen
109
- if `which kindlegen`.blank?
110
- raise "Can't create a kindle version without `kindlegen`."
111
- end
112
- end
113
-
114
- def generate_mobi
115
- require 'rails_guides/kindle'
116
- out = "#{output_dir}/kindlegen.out"
117
- Kindle.generate(output_dir, mobi, out)
118
- puts "(kindlegen log at #{out})."
119
- end
120
-
121
- def mobi
122
- "ruby_on_rails_guides_#@version%s.mobi" % (@lang.present? ? ".#@lang" : '')
123
- end
124
-
125
- def initialize_dirs(output)
126
- @guides_dir = File.join(File.dirname(__FILE__), '..')
127
- @source_dir = "#@guides_dir/source/#@lang"
128
- @output_dir = if output
129
- output
130
- elsif kindle?
131
- "#@guides_dir/output/kindle/#@lang"
132
- else
133
- "#@guides_dir/output/#@lang"
134
- end.sub(%r</$>, '')
135
- end
136
-
137
- def create_output_dir_if_needed
138
- FileUtils.mkdir_p(output_dir)
139
- end
140
-
141
- def generate_guides
142
- guides_to_generate.each do |guide|
143
- output_file = output_file_for(guide)
144
- generate_guide(guide, output_file) if generate?(guide, output_file)
145
- end
146
- end
147
-
148
- def guides_to_generate
149
- guides = Dir.entries(source_dir).grep(GUIDES_RE)
150
-
151
- if kindle?
152
- Dir.entries("#{source_dir}/kindle").grep(GUIDES_RE).map do |entry|
153
- next if entry == 'KINDLE.md'
154
- guides << "kindle/#{entry}"
155
- end
156
- end
157
-
158
- ENV.key?('ONLY') ? select_only(guides) : guides
159
- end
160
-
161
- def select_only(guides)
162
- prefixes = ENV['ONLY'].split(",").map(&:strip)
163
- guides.select do |guide|
164
- prefixes.any? { |p| guide.start_with?(p) || guide.start_with?("kindle") }
165
- end
166
- end
167
-
168
- def copy_assets
169
- FileUtils.cp_r(Dir.glob("#{guides_dir}/assets/*"), output_dir)
170
- end
171
-
172
- def output_file_for(guide)
173
- if guide.end_with?('.md')
174
- guide.sub(/md\z/, 'html')
175
- else
176
- guide.sub(/\.erb\z/, '')
177
- end
178
- end
179
-
180
- def output_path_for(output_file)
181
- File.join(output_dir, File.basename(output_file))
182
- end
183
-
184
- def generate?(source_file, output_file)
185
- fin = File.join(source_dir, source_file)
186
- fout = output_path_for(output_file)
187
- all || !File.exist?(fout) || File.mtime(fout) < File.mtime(fin)
188
- end
189
-
190
- def generate_guide(guide, output_file)
191
- output_path = output_path_for(output_file)
192
- puts "Generating #{guide} as #{output_file}"
193
- layout = kindle? ? 'kindle/layout' : 'layout'
194
-
195
- File.open(output_path, 'w') do |f|
196
- view = ActionView::Base.new(source_dir, :edge => @edge, :version => @version, :mobi => "kindle/#{mobi}")
197
- view.extend(Helpers)
198
-
199
- if guide =~ /\.(\w+)\.erb$/
200
- # Generate the special pages like the home.
201
- # Passing a template handler in the template name is deprecated. So pass the file name without the extension.
202
- result = view.render(:layout => layout, :formats => [$1], :file => $`)
203
- else
204
- body = File.read(File.join(source_dir, guide))
205
- result = RailsGuides::Markdown.new(view, layout).render(body)
206
-
207
- warn_about_broken_links(result) if @warnings
208
- end
209
-
210
- f.write(result)
211
- end
212
- end
213
-
214
- def warn_about_broken_links(html)
215
- anchors = extract_anchors(html)
216
- check_fragment_identifiers(html, anchors)
217
- end
218
-
219
- def extract_anchors(html)
220
- # Markdown generates headers with IDs computed from titles.
221
- anchors = Set.new
222
- html.scan(/<h\d\s+id="([^"]+)/).flatten.each do |anchor|
223
- if anchors.member?(anchor)
224
- puts "*** DUPLICATE ID: #{anchor}, please make sure that there're no headings with the same name at the same level."
225
- else
226
- anchors << anchor
227
- end
228
- end
229
-
230
- # Footnotes.
231
- anchors += Set.new(html.scan(/<p\s+class="footnote"\s+id="([^"]+)/).flatten)
232
- anchors += Set.new(html.scan(/<sup\s+class="footnote"\s+id="([^"]+)/).flatten)
233
- return anchors
234
- end
235
-
236
- def check_fragment_identifiers(html, anchors)
237
- html.scan(/<a\s+href="#([^"]+)/).flatten.each do |fragment_identifier|
238
- next if fragment_identifier == 'mainCol' # in layout, jumps to some DIV
239
- unless anchors.member?(fragment_identifier)
240
- guess = anchors.min { |a, b|
241
- Levenshtein.distance(fragment_identifier, a) <=> Levenshtein.distance(fragment_identifier, b)
242
- }
243
- puts "*** BROKEN LINK: ##{fragment_identifier}, perhaps you meant ##{guess}."
244
- end
245
- end
246
- end
247
- end
248
- end
@@ -1,53 +0,0 @@
1
- require 'yaml'
2
-
3
- module RailsGuides
4
- module Helpers
5
- def guide(name, url, options = {}, &block)
6
- link = content_tag(:a, :href => url) { name }
7
- result = content_tag(:dt, link)
8
-
9
- if options[:work_in_progress]
10
- result << content_tag(:dd, 'Work in progress', :class => 'work-in-progress')
11
- end
12
-
13
- result << content_tag(:dd, capture(&block))
14
- result
15
- end
16
-
17
- def documents_by_section
18
- @documents_by_section ||= YAML.load_file(File.expand_path('../../source/documents.yaml', __FILE__))
19
- end
20
-
21
- def documents_flat
22
- documents_by_section.flat_map {|section| section['documents']}
23
- end
24
-
25
- def finished_documents(documents)
26
- documents.reject { |document| document['work_in_progress'] }
27
- end
28
-
29
- def docs_for_menu(position=nil)
30
- if position.nil?
31
- documents_by_section
32
- elsif position == 'L'
33
- documents_by_section.to(3)
34
- else
35
- documents_by_section.from(4)
36
- end
37
- end
38
-
39
- def author(name, nick, image = 'credits_pic_blank.gif', &block)
40
- image = "images/#{image}"
41
-
42
- result = content_tag(:img, nil, :src => image, :class => 'left pic', :alt => name, :width => 91, :height => 91)
43
- result << content_tag(:h3, name)
44
- result << content_tag(:p, capture(&block))
45
- content_tag(:div, result, :class => 'clearfix', :id => nick)
46
- end
47
-
48
- def code(&block)
49
- c = capture(&block)
50
- content_tag(:code, c)
51
- end
52
- end
53
- end
@@ -1,68 +0,0 @@
1
- require 'active_support/core_ext/object/blank'
2
- require 'active_support/core_ext/string/inflections'
3
-
4
- module RailsGuides
5
- class Indexer
6
- attr_reader :body, :result, :warnings, :level_hash
7
-
8
- def initialize(body, warnings)
9
- @body = body
10
- @result = @body.dup
11
- @warnings = warnings
12
- end
13
-
14
- def index
15
- @level_hash = process(body)
16
- end
17
-
18
- private
19
-
20
- def process(string, current_level=3, counters=[1])
21
- s = StringScanner.new(string)
22
-
23
- level_hash = {}
24
-
25
- while !s.eos?
26
- re = %r{^h(\d)(?:\((#.*?)\))?\s*\.\s*(.*)$}
27
- s.match?(re)
28
- if matched = s.matched
29
- matched =~ re
30
- level, idx, title = $1.to_i, $2, $3.strip
31
-
32
- if level < current_level
33
- # This is needed. Go figure.
34
- return level_hash
35
- elsif level == current_level
36
- index = counters.join(".")
37
- idx ||= '#' + title_to_idx(title)
38
-
39
- raise "Parsing Fail" unless @result.sub!(matched, "h#{level}(#{idx}). #{index} #{title}")
40
-
41
- key = {
42
- :title => title,
43
- :id => idx
44
- }
45
- # Recurse
46
- counters << 1
47
- level_hash[key] = process(s.post_match, current_level + 1, counters)
48
- counters.pop
49
-
50
- # Increment the current level
51
- last = counters.pop
52
- counters << last + 1
53
- end
54
- end
55
- s.getch
56
- end
57
- level_hash
58
- end
59
-
60
- def title_to_idx(title)
61
- idx = title.strip.parameterize.sub(/^\d+/, '')
62
- if warnings && idx.blank?
63
- puts "BLANK ID: please put an explicit ID for section #{title}, as in h5(#my-id)"
64
- end
65
- idx
66
- end
67
- end
68
- end
@@ -1,119 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- unless `which kindlerb`
4
- abort "Please gem install kindlerb"
5
- end
6
-
7
- require 'nokogiri'
8
- require 'fileutils'
9
- require 'yaml'
10
- require 'date'
11
-
12
- module Kindle
13
- extend self
14
-
15
- def generate(output_dir, mobi_outfile, logfile)
16
- output_dir = File.absolute_path(output_dir)
17
- Dir.chdir output_dir do
18
- puts "=> Using output dir: #{output_dir}"
19
- puts "=> Arranging html pages in document order"
20
- toc = File.read("toc.ncx")
21
- doc = Nokogiri::XML(toc).xpath("//ncx:content", 'ncx' => "http://www.daisy.org/z3986/2005/ncx/")
22
- html_pages = doc.select {|c| c[:src]}.map {|c| c[:src]}.uniq
23
-
24
- generate_front_matter(html_pages)
25
-
26
- generate_sections(html_pages)
27
-
28
- generate_document_metadata(mobi_outfile)
29
-
30
- puts "Creating MOBI document with kindlegen. This make take a while."
31
- cmd = "kindlerb . > #{File.absolute_path logfile} 2>&1"
32
- puts cmd
33
- system(cmd)
34
- puts "MOBI document generated at #{File.expand_path(mobi_outfile, output_dir)}"
35
- end
36
- end
37
-
38
- def generate_front_matter(html_pages)
39
- frontmatter = []
40
- html_pages.delete_if {|x|
41
- if x =~ /(toc|welcome|credits|copyright).html/
42
- frontmatter << x unless x =~ /toc/
43
- true
44
- end
45
- }
46
- html = frontmatter.map {|x|
47
- Nokogiri::HTML(File.open(x)).at("body").inner_html
48
- }.join("\n")
49
-
50
- fdoc = Nokogiri::HTML(html)
51
- fdoc.search("h3").each do |h3|
52
- h3.name = 'h4'
53
- end
54
- fdoc.search("h2").each do |h2|
55
- h2.name = 'h3'
56
- h2['id'] = h2.inner_text.gsub(/\s/, '-')
57
- end
58
- add_head_section fdoc, "Front Matter"
59
- File.open("frontmatter.html",'w') {|f| f.puts fdoc.to_html}
60
- html_pages.unshift "frontmatter.html"
61
- end
62
-
63
- def generate_sections(html_pages)
64
- FileUtils::rm_rf("sections/")
65
- html_pages.each_with_index do |page, section_idx|
66
- FileUtils::mkdir_p("sections/%03d" % section_idx)
67
- doc = Nokogiri::HTML(File.open(page))
68
- title = doc.at("title").inner_text.gsub("Ruby on Rails Guides: ", '')
69
- title = page.capitalize.gsub('.html', '') if title.strip == ''
70
- File.open("sections/%03d/_section.txt" % section_idx, 'w') {|f| f.puts title}
71
- doc.xpath("//h3[@id]").each_with_index do |h3,item_idx|
72
- subsection = h3.inner_text
73
- content = h3.xpath("./following-sibling::*").take_while {|x| x.name != "h3"}.map {|x| x.to_html}
74
- item = Nokogiri::HTML(h3.to_html + content.join("\n"))
75
- item_path = "sections/%03d/%03d.html" % [section_idx, item_idx]
76
- add_head_section(item, subsection)
77
- item.search("img").each do |img|
78
- img['src'] = "#{Dir.pwd}/#{img['src']}"
79
- end
80
- item.xpath("//li/p").each {|p| p.swap(p.children); p.remove}
81
- File.open(item_path, 'w') {|f| f.puts item.to_html}
82
- end
83
- end
84
- end
85
-
86
- def generate_document_metadata(mobi_outfile)
87
- puts "=> Generating _document.yml"
88
- x = Nokogiri::XML(File.open("rails_guides.opf")).remove_namespaces!
89
- cover_jpg = "#{Dir.pwd}/images/rails_guides_kindle_cover.jpg"
90
- cover_gif = cover_jpg.sub(/jpg$/, 'gif')
91
- puts `convert #{cover_jpg} #{cover_gif}`
92
- document = {
93
- 'doc_uuid' => x.at("package")['unique-identifier'],
94
- 'title' => x.at("title").inner_text.gsub(/\(.*$/, " v2"),
95
- 'publisher' => x.at("publisher").inner_text,
96
- 'author' => x.at("creator").inner_text,
97
- 'subject' => x.at("subject").inner_text,
98
- 'date' => x.at("date").inner_text,
99
- 'cover' => cover_gif,
100
- 'masthead' => nil,
101
- 'mobi_outfile' => mobi_outfile
102
- }
103
- puts document.to_yaml
104
- File.open("_document.yml", 'w'){|f| f.puts document.to_yaml}
105
- end
106
-
107
- def add_head_section(doc, title)
108
- head = Nokogiri::XML::Node.new "head", doc
109
- title_node = Nokogiri::XML::Node.new "title", doc
110
- title_node.content = title
111
- title_node.parent = head
112
- css = Nokogiri::XML::Node.new "link", doc
113
- css['rel'] = 'stylesheet'
114
- css['type'] = 'text/css'
115
- css['href'] = "#{Dir.pwd}/stylesheets/kindle.css"
116
- css.parent = head
117
- doc.at("body").before head
118
- end
119
- end
@@ -1,31 +0,0 @@
1
- module RailsGuides
2
- module Levenshtein
3
- # Based on the pseudocode in http://en.wikipedia.org/wiki/Levenshtein_distance
4
- def self.distance(s1, s2)
5
- s = s1.unpack('U*')
6
- t = s2.unpack('U*')
7
- m = s.length
8
- n = t.length
9
-
10
- # matrix initialization
11
- d = []
12
- 0.upto(m) { |i| d << [i] }
13
- 0.upto(n) { |j| d[0][j] = j }
14
-
15
- # distance computation
16
- 1.upto(m) do |i|
17
- 1.upto(n) do |j|
18
- cost = s[i] == t[j] ? 0 : 1
19
- d[i][j] = [
20
- d[i-1][j] + 1, # deletion
21
- d[i][j-1] + 1, # insertion
22
- d[i-1][j-1] + cost, # substitution
23
- ].min
24
- end
25
- end
26
-
27
- # all done
28
- return d[m][n]
29
- end
30
- end
31
- end