middleman-core 4.1.0.rc.2 → 4.1.0

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 (64) hide show
  1. checksums.yaml +4 -4
  2. data/features/asset_hash.feature +30 -32
  3. data/features/asset_host.feature +2 -0
  4. data/features/gzip.feature +1 -1
  5. data/features/import_files.feature +0 -2
  6. data/features/nested_layouts.feature +20 -17
  7. data/fixtures/asset-host-app/source/javascripts/asset_host.js +2 -0
  8. data/fixtures/frontmatter-neighbor-app/config.rb +1 -1
  9. data/fixtures/frontmatter-settings-neighbor-app/config.rb +1 -1
  10. data/fixtures/nested-layout-app/source/layouts/inner.erb +5 -2
  11. data/fixtures/nested-layout-app/source/layouts/inner_haml.haml +6 -2
  12. data/fixtures/nested-layout-app/source/layouts/inner_slim.slim +6 -2
  13. data/fixtures/nested-layout-app/source/layouts/master.erb +7 -1
  14. data/fixtures/nested-layout-app/source/layouts/master_haml.haml +5 -1
  15. data/fixtures/nested-layout-app/source/layouts/master_slim.slim +5 -1
  16. data/fixtures/nested-layout-app/source/layouts/outer.erb +6 -2
  17. data/fixtures/nested-layout-app/source/layouts/outer_haml.haml +5 -1
  18. data/fixtures/nested-layout-app/source/layouts/outer_slim.slim +5 -1
  19. data/lib/middleman-core.rb +0 -3
  20. data/lib/middleman-core/application.rb +7 -9
  21. data/lib/middleman-core/builder.rb +88 -44
  22. data/lib/middleman-core/contracts.rb +102 -13
  23. data/lib/middleman-core/core_extensions/data.rb +15 -10
  24. data/lib/middleman-core/core_extensions/default_helpers.rb +15 -6
  25. data/lib/middleman-core/core_extensions/file_watcher.rb +2 -2
  26. data/lib/middleman-core/core_extensions/front_matter.rb +11 -3
  27. data/lib/middleman-core/core_extensions/i18n.rb +1 -1
  28. data/lib/middleman-core/core_extensions/inline_url_rewriter.rb +2 -2
  29. data/lib/middleman-core/extension.rb +1 -1
  30. data/lib/middleman-core/extensions.rb +1 -1
  31. data/lib/middleman-core/extensions/asset_hash.rb +1 -1
  32. data/lib/middleman-core/extensions/asset_host.rb +1 -1
  33. data/lib/middleman-core/extensions/automatic_image_sizes.rb +1 -1
  34. data/lib/middleman-core/extensions/cache_buster.rb +1 -1
  35. data/lib/middleman-core/extensions/external_pipeline.rb +2 -1
  36. data/lib/middleman-core/extensions/gzip.rb +2 -2
  37. data/lib/middleman-core/extensions/minify_css.rb +1 -1
  38. data/lib/middleman-core/extensions/minify_javascript.rb +1 -1
  39. data/lib/middleman-core/extensions/relative_assets.rb +1 -1
  40. data/lib/middleman-core/file_renderer.rb +12 -9
  41. data/lib/middleman-core/logger.rb +1 -0
  42. data/lib/middleman-core/preview_server.rb +14 -14
  43. data/lib/middleman-core/renderers/haml.rb +3 -1
  44. data/lib/middleman-core/renderers/less.rb +1 -1
  45. data/lib/middleman-core/renderers/liquid.rb +1 -1
  46. data/lib/middleman-core/renderers/sass.rb +7 -2
  47. data/lib/middleman-core/sitemap/extensions/ignores.rb +2 -2
  48. data/lib/middleman-core/sitemap/extensions/import.rb +3 -1
  49. data/lib/middleman-core/sitemap/resource.rb +7 -6
  50. data/lib/middleman-core/sources.rb +30 -13
  51. data/lib/middleman-core/sources/source_watcher.rb +50 -12
  52. data/lib/middleman-core/step_definitions/middleman_steps.rb +2 -2
  53. data/lib/middleman-core/template_context.rb +1 -1
  54. data/lib/middleman-core/template_renderer.rb +13 -4
  55. data/lib/middleman-core/util.rb +6 -606
  56. data/lib/middleman-core/util/binary.rb +79 -0
  57. data/lib/middleman-core/util/data.rb +37 -8
  58. data/lib/middleman-core/util/files.rb +134 -0
  59. data/lib/middleman-core/util/paths.rb +251 -0
  60. data/lib/middleman-core/util/rack.rb +52 -0
  61. data/lib/middleman-core/util/uri_templates.rb +97 -0
  62. data/lib/middleman-core/version.rb +1 -1
  63. data/middleman-core.gemspec +1 -0
  64. metadata +25 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d02a12c78f163c9213f8fdfb955ccc033b311e5c
4
- data.tar.gz: f832b54139abcf4d4629d436b7007f8f132266a5
3
+ metadata.gz: c31c9e2ea6918f6d0842f1cb1e04dc8120e4b8c4
4
+ data.tar.gz: e2f48f74a4a98aafe83b2adaeabf9aeb8eaab409
5
5
  SHA512:
6
- metadata.gz: 437c1700d0578d22e68c6b153fec52f25fa09add4aba8521ce13d60605c32593ad4754e30f58c682c5b3b81af35497ba0061d65cd56ccc5024c639bb0b549389
7
- data.tar.gz: 371e370f1e1aab80b8c1ef4ca6fcaba1f091469a56c6506c23244d8b67ec359c33be317b4a4c1d6b28a94da07ad2826c8a31b105b01d14e4bf1c25dc86b9cb1b
6
+ metadata.gz: 8a5e0965f5bca9268cdc5f65af629c9e49fff7f7f7df3468f8d3232135d00dbb3d6b9b9f6d73ed3b70d1ca91827aefdcf111a9c9558c7b14c76b7ab19fb0c61d
7
+ data.tar.gz: b2e0745dc44d43ef904c448347ef46f70f62ad25a241ebd23d7d97c43ea080777a327ee2075dce1f967d83af3528a8b3cebb0d370ff08baf80f917c55f316ca4
@@ -63,8 +63,8 @@ Feature: Assets get file hashes appended to them and references to them are upda
63
63
  Given the Server is running at "asset-hash-app"
64
64
  When I go to "/"
65
65
  Then I should see 'href="apple-touch-icon.png"'
66
- And I should see 'href="stylesheets/site-d2959d87.css"'
67
- And I should see 'href="stylesheets/fragment-a06f0dfc.css"'
66
+ And I should see 'href="stylesheets/site-d1a750ca.css"'
67
+ And I should see 'href="stylesheets/fragment-99b76247.css"'
68
68
  And I should see 'src="javascripts/application-1d8d5276.js"'
69
69
  And I should see 'src="images/100px-5fd6fb90.jpg"'
70
70
  And I should see 'srcset="images/100px-5fd6fb90.jpg 1x, images/200px-c11eb203.jpg 2x, images/300px-59adce76.jpg 3x"'
@@ -72,11 +72,11 @@ Feature: Assets get file hashes appended to them and references to them are upda
72
72
  And I should see 'src="images/100px-5fd6fb90.jpg?#test"'
73
73
  And I should see 'src="images/100px-5fd6fb90.jpg#test"'
74
74
  When I go to "/subdir/"
75
- Then I should see 'href="../stylesheets/site-d2959d87.css"'
75
+ Then I should see 'href="../stylesheets/site-d1a750ca.css"'
76
76
  And I should see 'src="../javascripts/application-1d8d5276.js"'
77
77
  And I should see 'src="../images/100px-5fd6fb90.jpg"'
78
78
  When I go to "/other/"
79
- Then I should see 'href="../stylesheets/site-d2959d87.css"'
79
+ Then I should see 'href="../stylesheets/site-d1a750ca.css"'
80
80
  And I should see 'src="../javascripts/application-1d8d5276.js"'
81
81
  And I should see 'src="../images/100px-5fd6fb90.jpg"'
82
82
  And I should see 'src="../images/100px-5fd6fb90.jpg?test"'
@@ -84,8 +84,8 @@ Feature: Assets get file hashes appended to them and references to them are upda
84
84
  And I should see 'src="../images/100px-5fd6fb90.jpg#test"'
85
85
  When I go to "/javascripts/application-1d8d5276.js"
86
86
  Then I should see "img.src = '/images/100px-5fd6fb90.jpg'"
87
- When I go to "/stylesheets/site-d2959d87.css"
88
- Then I should see 'background-image: url("../images/100px-5fd6fb90.jpg")'
87
+ When I go to "/stylesheets/site-d1a750ca.css"
88
+ Then I should see 'background-image: url("../images/100px-5fd6fb90.jpg");'
89
89
  When I go to "/api.json"
90
90
  Then I should see 'images/100px-5fd6fb90.gif'
91
91
  And I should see 'images/100px-5fd6fb90.jpg'
@@ -94,11 +94,11 @@ Feature: Assets get file hashes appended to them and references to them are upda
94
94
  Then I should see 'images/100px-5fd6fb90.gif'
95
95
  And I should see 'images/100px-5fd6fb90.jpg'
96
96
  And I should see 'images/100px-1242c368.png'
97
- When I go to "/stylesheets/fragment-a06f0dfc.css"
98
- And I should see 'url("../images/100px-5fd6fb90.jpg")'
99
- And I should see 'url("../images/100px-5fd6fb90.jpg?test")'
100
- And I should see 'url("../images/100px-5fd6fb90.jpg?#test")'
101
- And I should see 'url("../images/100px-5fd6fb90.jpg#test")'
97
+ When I go to "/stylesheets/fragment-99b76247.css"
98
+ And I should see 'url("../images/100px-5fd6fb90.jpg");'
99
+ And I should see 'url("../images/100px-5fd6fb90.jpg?test");'
100
+ And I should see 'url("../images/100px-5fd6fb90.jpg?#test");'
101
+ And I should see 'url("../images/100px-5fd6fb90.jpg#test");'
102
102
 
103
103
  Scenario: Hashed assets work with Slim
104
104
  Given the Server is running at "asset-hash-app"
@@ -117,26 +117,26 @@ Feature: Assets get file hashes appended to them and references to them are upda
117
117
  """
118
118
  Given the Server is running at "asset-hash-host-app"
119
119
  When I go to "/"
120
- Then I should see 'href="http://middlemanapp.com/stylesheets/site-4b64a653.css"'
121
- Then I should see 'href="http://middlemanapp.com/stylesheets/fragment-a772891f.css"'
120
+ Then I should see 'href="http://middlemanapp.com/stylesheets/site-210612a0.css"'
121
+ Then I should see 'href="http://middlemanapp.com/stylesheets/fragment-7000b132.css"'
122
122
  And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg"'
123
123
  And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg?test"'
124
124
  And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg?#test"'
125
125
  And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg#test"'
126
126
  When I go to "/subdir/"
127
- Then I should see 'href="http://middlemanapp.com/stylesheets/site-4b64a653.css"'
127
+ Then I should see 'href="http://middlemanapp.com/stylesheets/site-210612a0.css"'
128
128
  And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg"'
129
129
  When I go to "/other/"
130
- Then I should see 'href="http://middlemanapp.com/stylesheets/site-4b64a653.css"'
130
+ Then I should see 'href="http://middlemanapp.com/stylesheets/site-210612a0.css"'
131
131
  And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg"'
132
132
  And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg?test"'
133
133
  And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg?#test"'
134
134
  And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg#test"'
135
- When I go to "/stylesheets/fragment-a772891f.css"
136
- And I should see 'url("http://middlemanapp.com/images/100px-5fd6fb90.jpg")'
137
- And I should see 'url("http://middlemanapp.com/images/100px-5fd6fb90.jpg?test")'
138
- And I should see 'url("http://middlemanapp.com/images/100px-5fd6fb90.jpg?#test")'
139
- And I should see 'url("http://middlemanapp.com/images/100px-5fd6fb90.jpg#test")'
135
+ When I go to "/stylesheets/fragment-7000b132.css"
136
+ And I should see 'url("http://middlemanapp.com/images/100px-5fd6fb90.jpg");'
137
+ And I should see 'url("http://middlemanapp.com/images/100px-5fd6fb90.jpg?test");'
138
+ And I should see 'url("http://middlemanapp.com/images/100px-5fd6fb90.jpg?#test");'
139
+ And I should see 'url("http://middlemanapp.com/images/100px-5fd6fb90.jpg#test");'
140
140
 
141
141
  Scenario: Enabling an asset host still produces hashed files and references (host first)
142
142
  Given a fixture app "asset-hash-host-app"
@@ -148,22 +148,22 @@ Feature: Assets get file hashes appended to them and references to them are upda
148
148
  """
149
149
  Given the Server is running at "asset-hash-host-app"
150
150
  When I go to "/"
151
- Then I should see 'href="http://middlemanapp.com/stylesheets/site-4b64a653.css"'
152
- Then I should see 'href="http://middlemanapp.com/stylesheets/fragment-a772891f.css"'
151
+ Then I should see 'href="http://middlemanapp.com/stylesheets/site-210612a0.css"'
152
+ Then I should see 'href="http://middlemanapp.com/stylesheets/fragment-7000b132.css"'
153
153
  And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg"'
154
154
  And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg?test"'
155
155
  And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg?#test"'
156
156
  And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg#test"'
157
157
  When I go to "/subdir/"
158
- Then I should see 'href="http://middlemanapp.com/stylesheets/site-4b64a653.css"'
158
+ Then I should see 'href="http://middlemanapp.com/stylesheets/site-210612a0.css"'
159
159
  And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg"'
160
160
  When I go to "/other/"
161
- Then I should see 'href="http://middlemanapp.com/stylesheets/site-4b64a653.css"'
161
+ Then I should see 'href="http://middlemanapp.com/stylesheets/site-210612a0.css"'
162
162
  And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg"'
163
163
  And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg?test"'
164
164
  And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg?#test"'
165
165
  And I should see 'src="http://middlemanapp.com/images/100px-5fd6fb90.jpg#test"'
166
- When I go to "/stylesheets/fragment-a772891f.css"
166
+ When I go to "/stylesheets/fragment-7000b132.css"
167
167
  And I should see 'url("http://middlemanapp.com/images/100px-5fd6fb90.jpg")'
168
168
  And I should see 'url("http://middlemanapp.com/images/100px-5fd6fb90.jpg?test")'
169
169
  And I should see 'url("http://middlemanapp.com/images/100px-5fd6fb90.jpg?#test")'
@@ -177,14 +177,14 @@ Feature: Assets get file hashes appended to them and references to them are upda
177
177
  font-size: 14px
178
178
  """
179
179
  When I go to "/partials/"
180
- Then I should see 'href="../stylesheets/uses_partials-44fb2764.css'
180
+ Then I should see 'href="../stylesheets/uses_partials-4d4e34e6.css'
181
181
  And the file "source/stylesheets/_partial.sass" has the contents
182
182
  """
183
183
  body
184
184
  font-size: 18px !important
185
185
  """
186
186
  When I go to "/partials/"
187
- Then I should see 'href="../stylesheets/uses_partials-10d8ae33.css'
187
+ Then I should see 'href="../stylesheets/uses_partials-ec347271.css'
188
188
 
189
189
  Scenario: The asset hash should change when a Rack-based filter changes
190
190
  Given a fixture app "asset-hash-app"
@@ -198,12 +198,10 @@ Feature: Assets get file hashes appended to them and references to them are upda
198
198
  """
199
199
  Given the Server is running at "asset-hash-app"
200
200
  When I go to "/"
201
- Then I should see 'href="stylesheets/site-30784643.css'
202
- When I go to "stylesheets/site-30784643.css"
203
- Then I should see 'background-image'
201
+ Then I should see 'href="stylesheets/site-5ad7def0.css'
202
+ When I go to "stylesheets/site-5ad7def0.css"
203
+ Then I should see 'background-image: url("../images/100px-5fd6fb90.jpg")'
204
204
  Then I should see 'Added by Rack filter'
205
- When I go to "stylesheets/site-7474cadd.css"
206
- Then I should see 'Not Found'
207
205
 
208
206
  Scenario: Hashed-asset files are not produced for ignored paths
209
207
  Given a fixture app "asset-hash-app"
@@ -17,6 +17,8 @@ Feature: Alternate between multiple asset hosts
17
17
  When I go to "/stylesheets/asset_host.css"
18
18
  Then I should see content matching %r{http://assets1.example.com/}
19
19
  Then I should not see content matching %r{http://assets1.example.com//}
20
+ When I go to "/javascripts/asset_host.js"
21
+ Then I should not see content matching %r{http://assets1.example.com/}
20
22
 
21
23
  Scenario: Set proc host with inline-option
22
24
  Given a fixture app "asset-host-app"
@@ -22,7 +22,7 @@ Feature: GZIP assets during build
22
22
  Given a fixture app "gzip-app"
23
23
  And a file named "config.rb" with:
24
24
  """
25
- activate :gzip, exts: %w(.js .html .htm)
25
+ activate :gzip, exts: %w(.htm .html .js .xhtml)
26
26
  """
27
27
  And a successfully built app at "gzip-app"
28
28
  Then the following files should exist:
@@ -13,5 +13,3 @@ Feature: Import files
13
13
  Then I should see 'jQuery'
14
14
  When I go to "/bower_components2/jquery/dist/jquery.js"
15
15
  Then I should see 'jQuery'
16
-
17
-
@@ -5,37 +5,37 @@ Feature: Allow nesting of layouts
5
5
  When I go to "/index.html"
6
6
  Then I should see:
7
7
  """
8
- Master
8
+ Master Erb
9
9
  <h1>Index Title</h1>
10
- Outer
11
- Inner
10
+ I am Outer
11
+ I am Inner
12
12
  Template
13
-
13
+
14
14
  """
15
15
  When I go to "/another.html"
16
16
  Then I should see:
17
17
  """
18
- Master
18
+ Master Erb
19
19
  <h1>New Article Title</h1>
20
- Outer
21
- Inner
20
+ I am Outer
21
+ I am Inner
22
22
  <p>The Article Content</p>
23
23
  """
24
-
24
+
25
25
  Scenario: A page uses an inner layout when uses an outer layout (slim)
26
26
  Given the Server is running at "nested-layout-app"
27
27
  When I go to "/slim-test.html"
28
- Then I should see "<h1>Master</h1><p>New Article Title</p><div><h2>Outer</h2><h3>Inner</h3><p>The Article Content</p>"
29
-
28
+ Then I should see "<h1>Master Slim</h1><p>New Article Title</p><div><h2>I am Outer</h2><h3>I am Inner</h3><p>The Article Content</p>"
29
+
30
30
  Scenario: A page uses an inner layout when uses an outer layout (haml)
31
31
  Given the Server is running at "nested-layout-app"
32
32
  When I go to "/haml-test.html"
33
33
  Then I should see:
34
34
  """
35
- Master
35
+ Master Haml
36
36
  <h1>New Article Title</h1>
37
- Outer
38
- Inner
37
+ I am Outer
38
+ I am Inner
39
39
  <p>The Article Content</p>
40
40
  """
41
41
 
@@ -43,13 +43,16 @@ Feature: Allow nesting of layouts
43
43
  Given the Server is running at "nested-layout-app"
44
44
  When I go to "/data-one.html"
45
45
  Then I should see "Page Number One"
46
- And I should see "Inner"
46
+ And I should see "Page #1"
47
+ And I should see "I am Inner"
48
+ And I should see "I am Outer"
49
+ And I should see "Master Erb"
47
50
  When I go to "/data-two.html"
48
51
  Then I should see "Page Number Two"
49
- And I should not see "Inner"
52
+ And I should not see "I am Inner"
50
53
  When I go to "/data-one.html"
51
54
  Then I should see "Page Number One"
52
- And I should see "Inner"
55
+ And I should see "I am Inner"
53
56
  When I go to "/data-two.html"
54
57
  Then I should see "Page Number Two"
55
- And I should not see "Inner"
58
+ And I should not see "I am Inner"
@@ -0,0 +1,2 @@
1
+ var a = jQuery.css("h1", "font-size");
2
+ console.log(a);
@@ -15,7 +15,7 @@ class NeighborFrontmatter < ::Middleman::Extension
15
15
 
16
16
  next unless file
17
17
 
18
- fmdata = ::Middleman::Util::Data.parse(file[:full_path], app.config[:frontmatter_delims], :yaml).first
18
+ fmdata = ::Middleman::Util::Data.parse(file, app.config[:frontmatter_delims], :yaml).first
19
19
  opts = fmdata.extract!(:layout, :layout_engine, :renderer_options, :directory_index, :content_type)
20
20
  opts[:renderer_options].symbolize_keys! if opts.key?(:renderer_options)
21
21
  ignored = fmdata.delete(:ignored)
@@ -26,7 +26,7 @@ class NeighborFrontmatter < ::Middleman::Extension
26
26
  end
27
27
 
28
28
  def apply_neighbor_data(resource, file)
29
- fmdata = ::Middleman::Util::Data.parse(file[:full_path], app.config[:frontmatter_delims], :yaml).first
29
+ fmdata = ::Middleman::Util::Data.parse(file, app.config[:frontmatter_delims], :yaml).first
30
30
  opts = fmdata.extract!(:layout, :layout_engine, :renderer_options, :directory_index, :content_type)
31
31
  opts[:renderer_options].symbolize_keys! if opts.key?(:renderer_options)
32
32
  ignored = fmdata.delete(:ignored)
@@ -1,4 +1,7 @@
1
+ ---
2
+ inner: true
3
+ ---
1
4
  <% wrap_layout :outer do %>
2
- Inner
5
+ I am Inner
3
6
  <%= yield %>
4
- <% end %>
7
+ <% end %>
@@ -1,3 +1,7 @@
1
+ ---
2
+ inner_haml: true
3
+ ---
4
+
1
5
  = wrap_layout :outer_haml do
2
- Inner
3
- = yield
6
+ I am Inner
7
+ = yield
@@ -1,3 +1,7 @@
1
+ ---
2
+ inner_slim: true
3
+ ---
4
+
1
5
  = wrap_layout :outer_slim do
2
- h3 Inner
3
- == yield
6
+ h3 I am Inner
7
+ == yield
@@ -1,3 +1,9 @@
1
- Master
1
+ ---
2
+ master: true
3
+ ---
4
+
5
+ Master Erb
2
6
  <h1><%= current_page.data.title %></h1>
3
7
  <%= yield %>
8
+
9
+ Using Inner: <%= current_page.data.inner ? 'true' : 'false' %>
@@ -1,3 +1,7 @@
1
- Master
1
+ ---
2
+ master_haml: true
3
+ ---
4
+
5
+ Master Haml
2
6
  %h1= current_page.data.title
3
7
  = yield
@@ -1,3 +1,7 @@
1
- h1 Master
1
+ ---
2
+ master_slim: true
3
+ ---
4
+
5
+ h1 Master Slim
2
6
  p== current_page.data.title
3
7
  div== yield
@@ -1,4 +1,8 @@
1
+ ---
2
+ outer: true
3
+ ---
4
+
1
5
  <% wrap_layout :master do %>
2
- Outer
6
+ I am Outer
3
7
  <%= yield %>
4
- <% end %>
8
+ <% end %>
@@ -1,3 +1,7 @@
1
+ ---
2
+ outer_haml: true
3
+ ---
4
+
1
5
  = wrap_layout :master_haml do
2
- Outer
6
+ I am Outer
3
7
  = yield
@@ -1,3 +1,7 @@
1
+ ---
2
+ outer_slim: true
3
+ ---
4
+
1
5
  = wrap_layout :master_slim do
2
- h2 Outer
6
+ h2 I am Outer
3
7
  == yield
@@ -6,9 +6,6 @@ $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
6
6
 
7
7
  # Top-level Middleman namespace
8
8
  module Middleman
9
- # Backwards compatibility namespace
10
- module Features; end
11
-
12
9
  autoload :Application, 'middleman-core/application'
13
10
  end
14
11
 
@@ -149,9 +149,13 @@ module Middleman
149
149
  define_setting :http_prefix, '/', 'Default prefix for building paths'
150
150
 
151
151
  # Default layout name
152
- # @return [String, Symbold]
152
+ # @return [String]
153
153
  define_setting :layout, :_auto_layout, 'Default layout name'
154
154
 
155
+ # Which file extensions have a layout by default.
156
+ # @return [Array.<String>]
157
+ define_setting :extensions_with_layout, %w(.htm .html .xhtml .php), 'Which file extensions have a layout by default.'
158
+
155
159
  # Default string encoding for templates and output.
156
160
  # @return [String]
157
161
  define_setting :encoding, 'utf-8', 'Default string encoding for templates and output'
@@ -184,13 +188,7 @@ module Middleman
184
188
  end
185
189
  }, 'Callbacks that can exclude paths from the sitemap'
186
190
 
187
- # Set textual delimiters that denote the start and end of frontmatter
188
- define_setting :frontmatter_delims, {
189
- json: [%w(;;; ;;;)],
190
- yaml: [%w(--- ---), %w(--- ...)]
191
- }, 'Allowed frontmatter delimiters'
192
-
193
- define_setting :skip_build_clean, proc { |p| [/\.git/].any? { |r| r.match(p) } }, 'Whether some paths should not be removed during a clean build.'
191
+ define_setting :skip_build_clean, proc { |p| [/\.git/].any? { |r| p =~ r } }, 'Whether some paths should not be removed during a clean build.'
194
192
 
195
193
  define_setting :watcher_disable, false, 'If the Listen watcher should not run'
196
194
  define_setting :watcher_force_polling, false, 'If the Listen watcher should run in polling mode'
@@ -320,7 +318,7 @@ module Middleman
320
318
 
321
319
  # Clean up missing Tilt exts
322
320
  def prune_tilt_templates!
323
- ::Tilt.mappings.each do |key, _|
321
+ ::Tilt.mappings.each_key do |key|
324
322
  begin
325
323
  ::Tilt[".#{key}"]
326
324
  rescue LoadError, NameError
@@ -1,6 +1,7 @@
1
1
  require 'pathname'
2
2
  require 'fileutils'
3
3
  require 'tempfile'
4
+ require 'parallel'
4
5
  require 'middleman-core/rack'
5
6
  require 'middleman-core/callback_manager'
6
7
  require 'middleman-core/contracts'
@@ -36,6 +37,7 @@ module Middleman
36
37
 
37
38
  @glob = opts.fetch(:glob)
38
39
  @cleaning = opts.fetch(:clean)
40
+ @parallel = opts.fetch(:parallel, true)
39
41
 
40
42
  rack_app = ::Middleman::Rack.new(@app).to_app
41
43
  @rack = ::Rack::MockRequest.new(rack_app)
@@ -51,18 +53,33 @@ module Middleman
51
53
  @has_error = false
52
54
  @events = {}
53
55
 
54
- @app.execute_callbacks(:before_build, [self])
56
+ ::Middleman::Util.instrument 'builder.before' do
57
+ @app.execute_callbacks(:before_build, [self])
58
+ end
55
59
 
56
- queue_current_paths if @cleaning
60
+ ::Middleman::Util.instrument 'builder.queue' do
61
+ queue_current_paths if @cleaning
62
+ end
57
63
 
58
- prerender_css
59
- output_files
64
+ ::Middleman::Util.instrument 'builder.prerender' do
65
+ prerender_css
66
+ end
60
67
 
61
- clean! if @cleaning
68
+ ::Middleman::Profiling.start
69
+
70
+ ::Middleman::Util.instrument 'builder.output' do
71
+ output_files
72
+ end
62
73
 
63
74
  ::Middleman::Profiling.report('build')
64
75
 
65
- @app.execute_callbacks(:after_build, [self])
76
+ ::Middleman::Util.instrument 'builder.clean' do
77
+ clean! if @cleaning
78
+ end
79
+
80
+ ::Middleman::Util.instrument 'builder.after' do
81
+ @app.execute_callbacks(:after_build, [self])
82
+ end
66
83
 
67
84
  !@has_error
68
85
  end
@@ -73,14 +90,17 @@ module Middleman
73
90
  def prerender_css
74
91
  logger.debug '== Prerendering CSS'
75
92
 
76
- css_files = @app.sitemap.resources
77
- .select { |resource| resource.ext == '.css' }
78
- .each(&method(:output_resource))
93
+ css_files = ::Middleman::Util.instrument 'builder.prerender.output' do
94
+ resources = @app.sitemap.resources.select { |resource| resource.ext == '.css' }
95
+ output_resources(resources)
96
+ end
79
97
 
80
- # Double-check for compass sprites
81
- if @app.files.find_new_files!.length > 0
82
- logger.debug '== Checking for Compass sprites'
83
- @app.sitemap.ensure_resource_list_updated!
98
+ ::Middleman::Util.instrument 'builder.prerender.check-files' do
99
+ # Double-check for compass sprites
100
+ if @app.files.find_new_files!.length > 0
101
+ logger.debug '== Checking for Compass sprites'
102
+ @app.sitemap.ensure_resource_list_updated!
103
+ end
84
104
  end
85
105
 
86
106
  css_files
@@ -92,11 +112,43 @@ module Middleman
92
112
  def output_files
93
113
  logger.debug '== Building files'
94
114
 
95
- @app.sitemap.resources
96
- .sort_by { |resource| SORT_ORDER.index(resource.ext) || 100 }
97
- .reject { |resource| resource.ext == '.css' }
98
- .select { |resource| !@glob || File.fnmatch(@glob, resource.destination_path) }
99
- .each(&method(:output_resource))
115
+ resources = @app.sitemap.resources
116
+ .reject { |resource| resource.ext == '.css' }
117
+ .sort_by { |resource| SORT_ORDER.index(resource.ext) || 100 }
118
+
119
+ if @glob
120
+ resources = resources.select { |resource| File.fnmatch(@glob, resource.destination_path) }
121
+ end
122
+
123
+ output_resources(resources)
124
+ end
125
+
126
+ Contract ResourceList => ResourceList
127
+ def output_resources(resources)
128
+ results = if @parallel
129
+ ::Parallel.map(resources, &method(:output_resource))
130
+ else
131
+ resources.map(&method(:output_resource))
132
+ end
133
+
134
+ @has_error = true if results.any? { |r| r == false }
135
+
136
+ if @cleaning && !@has_error
137
+ results.each do |p|
138
+ next unless p.exist?
139
+
140
+ # handle UTF-8-MAC filename on MacOS
141
+ cleaned_name = if RUBY_PLATFORM =~ /darwin/
142
+ p.to_s.encode('UTF-8', 'UTF-8-MAC')
143
+ else
144
+ p
145
+ end
146
+
147
+ @to_clean.delete(Pathname(cleaned_name))
148
+ end
149
+ end
150
+
151
+ resources
100
152
  end
101
153
 
102
154
  # Figure out the correct event mode.
@@ -160,40 +212,32 @@ module Middleman
160
212
  # Try to output a resource and capture errors.
161
213
  # @param [Middleman::Sitemap::Resource] resource The resource.
162
214
  # @return [void]
163
- Contract IsA['Middleman::Sitemap::Resource'] => Any
215
+ Contract IsA['Middleman::Sitemap::Resource'] => Or[Pathname, Bool]
164
216
  def output_resource(resource)
165
- output_file = @build_dir + resource.destination_path.gsub('%20', ' ')
166
-
167
- begin
168
- if resource.binary?
169
- export_file!(output_file, resource.file_descriptor[:full_path])
170
- else
171
- response = @rack.get(::URI.escape(resource.request_path))
217
+ ::Middleman::Util.instrument 'builder.output.resource', path: File.basename(resource.destination_path) do
218
+ output_file = @build_dir + resource.destination_path.gsub('%20', ' ')
172
219
 
173
- # If we get a response, save it to a tempfile.
174
- if response.status == 200
175
- export_file!(output_file, binary_encode(response.body))
220
+ begin
221
+ if resource.binary?
222
+ export_file!(output_file, resource.file_descriptor[:full_path])
176
223
  else
177
- @has_error = true
178
- trigger(:error, output_file, response.body)
224
+ response = @rack.get(::URI.escape(resource.request_path))
225
+
226
+ # If we get a response, save it to a tempfile.
227
+ if response.status == 200
228
+ export_file!(output_file, binary_encode(response.body))
229
+ else
230
+ trigger(:error, output_file, response.body)
231
+ return false
232
+ end
179
233
  end
234
+ rescue => e
235
+ trigger(:error, output_file, "#{e}\n#{e.backtrace.join("\n")}")
236
+ return false
180
237
  end
181
- rescue => e
182
- @has_error = true
183
- trigger(:error, output_file, "#{e}\n#{e.backtrace.join("\n")}")
184
- end
185
238
 
186
- return unless @cleaning
187
- return unless output_file.exist?
188
-
189
- # handle UTF-8-MAC filename on MacOS
190
- cleaned_name = if RUBY_PLATFORM =~ /darwin/
191
- output_file.to_s.encode('UTF-8', 'UTF-8-MAC')
192
- else
193
239
  output_file
194
240
  end
195
-
196
- @to_clean.delete(Pathname(cleaned_name))
197
241
  end
198
242
 
199
243
  # Get a list of all the paths in the destination folder and save them