rails 4.2.10 → 6.1.3

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 (218) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +54 -36
  3. metadata +90 -251
  4. data/guides/CHANGELOG.md +0 -93
  5. data/guides/Rakefile +0 -92
  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 -59
  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 -713
  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 -54
  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/bug_report_templates/generic_gem.rb +0 -15
  148. data/guides/bug_report_templates/generic_master.rb +0 -26
  149. data/guides/rails_guides.rb +0 -63
  150. data/guides/rails_guides/generator.rb +0 -248
  151. data/guides/rails_guides/helpers.rb +0 -53
  152. data/guides/rails_guides/indexer.rb +0 -68
  153. data/guides/rails_guides/kindle.rb +0 -119
  154. data/guides/rails_guides/levenshtein.rb +0 -37
  155. data/guides/rails_guides/markdown.rb +0 -167
  156. data/guides/rails_guides/markdown/renderer.rb +0 -82
  157. data/guides/source/2_2_release_notes.md +0 -435
  158. data/guides/source/2_3_release_notes.md +0 -621
  159. data/guides/source/3_0_release_notes.md +0 -611
  160. data/guides/source/3_1_release_notes.md +0 -559
  161. data/guides/source/3_2_release_notes.md +0 -568
  162. data/guides/source/4_0_release_notes.md +0 -279
  163. data/guides/source/4_1_release_notes.md +0 -730
  164. data/guides/source/4_2_release_notes.md +0 -877
  165. data/guides/source/_license.html.erb +0 -2
  166. data/guides/source/_welcome.html.erb +0 -23
  167. data/guides/source/action_controller_overview.md +0 -1192
  168. data/guides/source/action_mailer_basics.md +0 -757
  169. data/guides/source/action_view_overview.md +0 -1561
  170. data/guides/source/active_job_basics.md +0 -339
  171. data/guides/source/active_model_basics.md +0 -554
  172. data/guides/source/active_record_basics.md +0 -374
  173. data/guides/source/active_record_callbacks.md +0 -413
  174. data/guides/source/active_record_migrations.md +0 -1018
  175. data/guides/source/active_record_postgresql.md +0 -433
  176. data/guides/source/active_record_querying.md +0 -1781
  177. data/guides/source/active_record_validations.md +0 -1179
  178. data/guides/source/active_support_core_extensions.md +0 -3856
  179. data/guides/source/active_support_instrumentation.md +0 -488
  180. data/guides/source/api_documentation_guidelines.md +0 -361
  181. data/guides/source/asset_pipeline.md +0 -1304
  182. data/guides/source/association_basics.md +0 -2245
  183. data/guides/source/autoloading_and_reloading_constants.md +0 -1311
  184. data/guides/source/caching_with_rails.md +0 -379
  185. data/guides/source/command_line.md +0 -625
  186. data/guides/source/configuring.md +0 -1070
  187. data/guides/source/contributing_to_ruby_on_rails.md +0 -628
  188. data/guides/source/credits.html.erb +0 -80
  189. data/guides/source/debugging_rails_applications.md +0 -861
  190. data/guides/source/development_dependencies_install.md +0 -289
  191. data/guides/source/documents.yaml +0 -205
  192. data/guides/source/engines.md +0 -1412
  193. data/guides/source/form_helpers.md +0 -1024
  194. data/guides/source/generators.md +0 -676
  195. data/guides/source/getting_started.md +0 -2086
  196. data/guides/source/i18n.md +0 -1087
  197. data/guides/source/index.html.erb +0 -28
  198. data/guides/source/initialization.md +0 -704
  199. data/guides/source/kindle/copyright.html.erb +0 -1
  200. data/guides/source/kindle/layout.html.erb +0 -27
  201. data/guides/source/kindle/rails_guides.opf.erb +0 -52
  202. data/guides/source/kindle/toc.html.erb +0 -24
  203. data/guides/source/kindle/toc.ncx.erb +0 -64
  204. data/guides/source/kindle/welcome.html.erb +0 -5
  205. data/guides/source/layout.html.erb +0 -140
  206. data/guides/source/layouts_and_rendering.md +0 -1226
  207. data/guides/source/maintenance_policy.md +0 -78
  208. data/guides/source/nested_model_forms.md +0 -228
  209. data/guides/source/plugins.md +0 -444
  210. data/guides/source/rails_application_templates.md +0 -266
  211. data/guides/source/rails_on_rack.md +0 -335
  212. data/guides/source/routing.md +0 -1155
  213. data/guides/source/ruby_on_rails_guides_guidelines.md +0 -127
  214. data/guides/source/security.md +0 -1024
  215. data/guides/source/testing.md +0 -1132
  216. data/guides/source/upgrading_ruby_on_rails.md +0 -1186
  217. data/guides/source/working_with_javascript_in_rails.md +0 -407
  218. data/guides/w3c_validator.rb +0 -97
@@ -1,40 +0,0 @@
1
- # Activate the gem you are reporting the issue against.
2
- gem 'activerecord', '4.2.0'
3
- require 'active_record'
4
- require 'minitest/autorun'
5
- require 'logger'
6
-
7
- # Ensure backward compatibility with Minitest 4
8
- Minitest::Test = MiniTest::Unit::TestCase unless defined?(Minitest::Test)
9
-
10
- # This connection will do for database-independent bug reports.
11
- ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
12
- ActiveRecord::Base.logger = Logger.new(STDOUT)
13
-
14
- ActiveRecord::Schema.define do
15
- create_table :posts do |t|
16
- end
17
-
18
- create_table :comments do |t|
19
- t.integer :post_id
20
- end
21
- end
22
-
23
- class Post < ActiveRecord::Base
24
- has_many :comments
25
- end
26
-
27
- class Comment < ActiveRecord::Base
28
- belongs_to :post
29
- end
30
-
31
- class BugTest < Minitest::Test
32
- def test_association_stuff
33
- post = Post.create!
34
- post.comments << Comment.create!
35
-
36
- assert_equal 1, post.comments.count
37
- assert_equal 1, Comment.count
38
- assert_equal post.id, Comment.first.post.id
39
- end
40
- end
@@ -1,49 +0,0 @@
1
- unless File.exist?('Gemfile')
2
- File.write('Gemfile', <<-GEMFILE)
3
- source 'https://rubygems.org'
4
- gem 'rails', github: 'rails/rails'
5
- gem 'arel', github: 'rails/arel'
6
- gem 'sqlite3'
7
- GEMFILE
8
-
9
- system 'bundle'
10
- end
11
-
12
- require 'bundler'
13
- Bundler.setup(:default)
14
-
15
- require 'active_record'
16
- require 'minitest/autorun'
17
- require 'logger'
18
-
19
- # This connection will do for database-independent bug reports.
20
- ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
21
- ActiveRecord::Base.logger = Logger.new(STDOUT)
22
-
23
- ActiveRecord::Schema.define do
24
- create_table :posts do |t|
25
- end
26
-
27
- create_table :comments do |t|
28
- t.integer :post_id
29
- end
30
- end
31
-
32
- class Post < ActiveRecord::Base
33
- has_many :comments
34
- end
35
-
36
- class Comment < ActiveRecord::Base
37
- belongs_to :post
38
- end
39
-
40
- class BugTest < Minitest::Test
41
- def test_association_stuff
42
- post = Post.create!
43
- post.comments << Comment.create!
44
-
45
- assert_equal 1, post.comments.count
46
- assert_equal 1, Comment.count
47
- assert_equal post.id, Comment.first.post.id
48
- end
49
- end
@@ -1,15 +0,0 @@
1
- # Activate the gems you are reporting the issue against.
2
- gem 'activesupport', '4.2.0'
3
- require 'active_support'
4
- require 'active_support/core_ext/object/blank'
5
- require 'minitest/autorun'
6
-
7
- # Ensure backward compatibility with Minitest 4
8
- Minitest::Test = MiniTest::Unit::TestCase unless defined?(Minitest::Test)
9
-
10
- class BugTest < Minitest::Test
11
- def test_stuff
12
- assert "zomg".present?
13
- refute "".present?
14
- end
15
- end
@@ -1,26 +0,0 @@
1
- unless File.exist?('Gemfile')
2
- File.write('Gemfile', <<-GEMFILE)
3
- source 'https://rubygems.org'
4
- gem 'rails', github: 'rails/rails'
5
- gem 'arel', github: 'rails/arel'
6
- GEMFILE
7
-
8
- system 'bundle'
9
- end
10
-
11
- require 'bundler'
12
- Bundler.setup(:default)
13
-
14
- require 'active_support'
15
- require 'active_support/core_ext/object/blank'
16
- require 'minitest/autorun'
17
-
18
- # Ensure backward compatibility with Minitest 4
19
- Minitest::Test = MiniTest::Unit::TestCase unless defined?(Minitest::Test)
20
-
21
- class BugTest < Minitest::Test
22
- def test_stuff
23
- assert "zomg".present?
24
- refute "".present?
25
- end
26
- end
@@ -1,63 +0,0 @@
1
- pwd = File.dirname(__FILE__)
2
- $:.unshift pwd
3
-
4
- # This is a predicate useful for the doc:guides task of applications.
5
- def bundler?
6
- # Note that rake sets the cwd to the one that contains the Rakefile
7
- # being executed.
8
- File.exist?('Gemfile')
9
- end
10
-
11
- begin
12
- # Guides generation in the Rails repo.
13
- as_lib = File.join(pwd, "../activesupport/lib")
14
- ap_lib = File.join(pwd, "../actionpack/lib")
15
-
16
- $:.unshift as_lib if File.directory?(as_lib)
17
- $:.unshift ap_lib if File.directory?(ap_lib)
18
- rescue LoadError
19
- # Guides generation from gems.
20
- gem "actionpack", '>= 3.0'
21
- end
22
-
23
- begin
24
- require 'redcarpet'
25
- rescue LoadError
26
- # This can happen if doc:guides is executed in an application.
27
- $stderr.puts('Generating guides requires Redcarpet 3.1.2+.')
28
- $stderr.puts(<<ERROR) if bundler?
29
- Please add
30
-
31
- gem 'redcarpet', '~> 3.1.2'
32
-
33
- to the Gemfile, run
34
-
35
- bundle install
36
-
37
- and try again.
38
- ERROR
39
- exit 1
40
- end
41
-
42
- begin
43
- require 'nokogiri'
44
- rescue LoadError
45
- # This can happen if doc:guides is executed in an application.
46
- $stderr.puts('Generating guides requires Nokogiri.')
47
- $stderr.puts(<<ERROR) if bundler?
48
- Please add
49
-
50
- gem 'nokogiri'
51
-
52
- to the Gemfile, run
53
-
54
- bundle install
55
-
56
- and try again.
57
- ERROR
58
- exit 1
59
- end
60
-
61
- require 'rails_guides/markdown'
62
- require "rails_guides/generator"
63
- RailsGuides::Generator.new.generate
@@ -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