Skip to content

Commit c546aa6

Browse files
p8jathayde
andcommitted
Add digests to guide assets
This makes sure no stale stylesheets and javascript are shown to the visitors. This doesn't include images yet. Co-authored-by: John Athayde <[email protected]>
1 parent f26faa8 commit c546aa6

File tree

4 files changed

+57
-27
lines changed

4 files changed

+57
-27
lines changed

guides/rails_guides/generator.rb

Lines changed: 46 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
require "fileutils"
55
require "nokogiri"
66
require "securerandom"
7+
require "digest"
78

89
require "active_support/core_ext/string/output_safety"
910
require "active_support/core_ext/object/blank"
@@ -19,15 +20,16 @@ class Generator
1920
GUIDES_RE = /\.(?:erb|md)\z/
2021

2122
def initialize(edge:, version:, all:, only:, epub:, language:, direction: nil, lint:)
22-
@edge = edge
23-
@version = version
24-
@all = all
25-
@only = only
26-
@epub = epub
27-
@language = language
28-
@direction = direction || "ltr"
29-
@lint = lint
30-
@warnings = []
23+
@edge = edge
24+
@version = version
25+
@all = all
26+
@only = only
27+
@epub = epub
28+
@language = language
29+
@direction = direction || "ltr"
30+
@digest_paths = {}
31+
@lint = lint
32+
@warnings = []
3133

3234
if @epub
3335
register_special_mime_types
@@ -39,6 +41,14 @@ def initialize(edge:, version:, all:, only:, epub:, language:, direction: nil, l
3941
end
4042

4143
def generate
44+
if !dry_run?
45+
# First copy assets and add digests to make sure digest_paths are
46+
# present in generate_guides.
47+
process_scss
48+
copy_assets
49+
add_digests
50+
end
51+
4252
generate_guides
4353

4454
if @lint && @warnings.any?
@@ -47,8 +57,6 @@ def generate
4757
end
4858

4959
if !dry_run?
50-
process_scss
51-
copy_assets
5260
generate_epub if @epub
5361
end
5462
end
@@ -122,16 +130,33 @@ def select_only(guides)
122130

123131
def process_scss
124132
system "bundle exec dartsass \
125-
#{@guides_dir}/assets/stylesrc/style.scss:#{@output_dir}/stylesheets/style-v2.css \
126-
#{@guides_dir}/assets/stylesrc/highlight.scss:#{@output_dir}/stylesheets/highlight-v2.css \
127-
#{@guides_dir}/assets/stylesrc/print.scss:#{@output_dir}/stylesheets/print-v2.css"
133+
#{@guides_dir}/assets/stylesrc/style.scss:#{@output_dir}/stylesheets/style.css \
134+
#{@guides_dir}/assets/stylesrc/highlight.scss:#{@output_dir}/stylesheets/highlight.css \
135+
#{@guides_dir}/assets/stylesrc/print.scss:#{@output_dir}/stylesheets/print.css"
128136
end
129137

130138
def copy_assets
131139
source_files = Dir.glob("#{@guides_dir}/assets/*").reject { |name| name.include?("stylesrc") }
132140
FileUtils.cp_r(source_files, @output_dir)
133141
end
134142

143+
def add_digests
144+
assets_files = Dir.glob("{javascripts,stylesheets}/**/*", base: @output_dir)
145+
# Add the MD5 digest to the asset names.
146+
assets_files.each do |asset|
147+
asset_path = File.join(@output_dir, asset)
148+
if File.file?(asset_path)
149+
digest = Digest::MD5.file(asset_path).hexdigest
150+
ext = File.extname(asset)
151+
basename = File.basename(asset, ext)
152+
dirname = File.dirname(asset)
153+
digest_path = "#{dirname}/#{basename}-#{digest}#{ext}"
154+
FileUtils.mv(asset_path, "#{@output_dir}/#{digest_path}")
155+
@digest_paths[asset] = digest_path
156+
end
157+
end
158+
end
159+
135160
def output_file_for(guide)
136161
if guide.end_with?(".md")
137162
guide.sub(/md\z/, "html")
@@ -157,12 +182,13 @@ def generate_guide(guide, output_file)
157182

158183
view = ActionView::Base.with_empty_template_cache.with_view_paths(
159184
[@source_dir],
160-
edge: @edge,
161-
version: @version,
162-
epub: "epub/#{epub_filename}",
163-
language: @language,
164-
direction: @direction,
165-
uuid: SecureRandom.uuid
185+
edge: @edge,
186+
version: @version,
187+
epub: "epub/#{epub_filename}",
188+
language: @language,
189+
direction: @direction,
190+
uuid: SecureRandom.uuid,
191+
digest_paths: @digest_paths
166192
)
167193
view.extend(Helpers)
168194

guides/rails_guides/helpers.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,9 @@ def code(&block)
5151
c = capture(&block)
5252
content_tag(:code, c)
5353
end
54+
55+
def digest_path(original_filename)
56+
@digest_paths[original_filename] || original_filename
57+
end
5458
end
5559
end

guides/source/epub/layout.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<html xmlns="http://www.w3.org/1999/xhtml">
33
<head>
44
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
5-
<link rel="stylesheet" type="text/css" href="stylesheets/epub.css"></link>
5+
<link rel="stylesheet" type="text/css" href="<%= digest_path('stylesheets/epub.css') %>"></link>
66
<title><%= yield(:page_title) || 'Ruby on Rails Guides' %></title>
77
</head>
88
<body class="guide">

guides/source/layout.html.erb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@
55
<meta charset="utf-8">
66
<meta name="viewport" content="width=device-width, initial-scale=1">
77
<title><%= yield(:page_title) %></title>
8-
<link rel="stylesheet" type="text/css" href="stylesheets/style-v2.css" data-turbo-track="reload">
9-
<link rel="stylesheet" type="text/css" href="stylesheets/print-v2.css" media="print">
10-
<link rel="stylesheet" type="text/css" href="stylesheets/highlight-v2.css" data-turbo-track="reload">
8+
<link rel="stylesheet" type="text/css" href="<%= digest_path('stylesheets/style.css') %>" data-turbo-track="reload">
9+
<link rel="stylesheet" type="text/css" href="<%= digest_path('stylesheets/print.css') %>" media="print">
10+
<link rel="stylesheet" type="text/css" href="<%= digest_path('stylesheets/highlight.css') %>" data-turbo-track="reload">
1111

1212
<link rel="icon" href="images/favicon.ico" sizes="any">
1313

1414
<link rel="apple-touch-icon" href="images/icon.png">
1515

16-
<script src="javascripts/@hotwired--turbo.js" data-turbo-track="reload"></script>
17-
<script src="javascripts/clipboard.js" data-turbo-track="reload"></script>
18-
<script src="javascripts/guides.js" data-turbo-track="reload"></script>
16+
<script src="<%= digest_path('javascripts/@hotwired--turbo.js') %>" data-turbo-track="reload"></script>
17+
<script src="<%= digest_path('javascripts/clipboard.js') %>" data-turbo-track="reload"></script>
18+
<script src="<%= digest_path('javascripts/guides.js') %>" data-turbo-track="reload"></script>
1919

2020
<meta property="og:title" content="<%= yield(:page_title) %>" />
2121
<meta name="description" content="<%= yield(:description) %>" />

0 commit comments

Comments
 (0)