middleman-core 4.0.0.beta.1 → 4.0.0.beta.2
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.
- checksums.yaml +4 -4
- data/lib/middleman-core/application.rb +126 -112
- data/lib/middleman-core/builder.rb +7 -17
- data/lib/middleman-core/callback_manager.rb +61 -0
- data/lib/middleman-core/cli/server.rb +10 -0
- data/lib/middleman-core/config_context.rb +6 -46
- data/lib/middleman-core/contracts.rb +4 -17
- data/lib/middleman-core/core_extensions/collections/step_context.rb +4 -2
- data/lib/middleman-core/core_extensions/i18n.rb +19 -0
- data/lib/middleman-core/core_extensions/show_exceptions.rb +1 -1
- data/lib/middleman-core/extension.rb +1 -0
- data/lib/middleman-core/extension_manager.rb +11 -0
- data/lib/middleman-core/file_renderer.rb +5 -15
- data/lib/middleman-core/preview_server.rb +31 -2
- data/lib/middleman-core/rack.rb +1 -1
- data/lib/middleman-core/renderers/coffee_script.rb +1 -3
- data/lib/middleman-core/sitemap/extensions/ignores.rb +1 -1
- data/lib/middleman-core/sitemap/extensions/on_disk.rb +9 -10
- data/lib/middleman-core/sitemap/store.rb +20 -9
- data/lib/middleman-core/sources.rb +10 -9
- data/lib/middleman-core/sources/source_watcher.rb +7 -27
- data/lib/middleman-core/version.rb +1 -1
- data/middleman-core.gemspec +0 -1
- data/spec/middleman-core/callbacks_spec.rb +132 -0
- metadata +4 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e102996c549a19735369428a6ca1fb6d2d9a735b
|
4
|
+
data.tar.gz: bd3b7074ef91dbef4d80491e1b67c41117ff0699
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 52f6338f6da3da3c1f113826597376f95f0bf7948f6f01a512a924949eb9f8efc7784f4a082f6f32b3892e9f88d3ad6258e662ac297f14bf0b98547faaea2909
|
7
|
+
data.tar.gz: 44a55d6fcff77e9136d7701b15cfe4104eae02de1dc1f8d73698f02eddb5a5a089f2c201a7c2d36e680df845f2550edc9c6aa171258c61271856732fdb9fad32
|
@@ -1,29 +1,14 @@
|
|
1
|
-
# i18n Built-in
|
2
|
-
require 'i18n'
|
3
|
-
|
4
|
-
# Don't fail on invalid locale, that's not what our current
|
5
|
-
# users expect.
|
6
|
-
::I18n.enforce_available_locales = false
|
7
|
-
|
8
1
|
# Use ActiveSupport JSON
|
9
2
|
require 'active_support/json'
|
10
3
|
require 'active_support/core_ext/integer/inflections'
|
11
4
|
|
12
|
-
# Simple callback library
|
13
|
-
require 'hooks'
|
14
|
-
|
15
|
-
# Our custom logger
|
16
|
-
require 'middleman-core/logger'
|
17
|
-
|
18
5
|
require 'middleman-core/contracts'
|
19
|
-
|
6
|
+
require 'middleman-core/callback_manager'
|
7
|
+
require 'middleman-core/logger'
|
20
8
|
require 'middleman-core/sitemap/store'
|
21
|
-
|
22
9
|
require 'middleman-core/configuration'
|
23
|
-
|
24
10
|
require 'middleman-core/extension_manager'
|
25
11
|
require 'middleman-core/core_extensions'
|
26
|
-
|
27
12
|
require 'middleman-core/config_context'
|
28
13
|
require 'middleman-core/file_renderer'
|
29
14
|
require 'middleman-core/template_renderer'
|
@@ -38,6 +23,9 @@ module Middleman
|
|
38
23
|
include Contracts
|
39
24
|
|
40
25
|
class << self
|
26
|
+
extend Forwardable
|
27
|
+
def_delegator :config, :define_setting
|
28
|
+
|
41
29
|
# Global configuration for the whole Middleman project.
|
42
30
|
# @return [ConfigurationManager]
|
43
31
|
def config
|
@@ -56,108 +44,119 @@ module Middleman
|
|
56
44
|
end
|
57
45
|
end
|
58
46
|
|
59
|
-
|
60
|
-
|
61
|
-
include Hooks::InstanceHooks
|
47
|
+
Contract ::Middleman::ConfigContext
|
48
|
+
attr_reader :config_context
|
62
49
|
|
63
|
-
|
64
|
-
|
65
|
-
define_hook :before_configuration
|
50
|
+
Contract ::Middleman::Sitemap::Store
|
51
|
+
attr_reader :sitemap
|
66
52
|
|
67
|
-
#
|
68
|
-
|
53
|
+
# An anonymous subclass of ::Middleman::TemplateContext
|
54
|
+
attr_reader :template_context_class
|
69
55
|
|
70
|
-
#
|
71
|
-
|
56
|
+
# An instance of the above anonymouse class.
|
57
|
+
attr_reader :generic_template_context
|
72
58
|
|
73
|
-
|
74
|
-
|
59
|
+
Contract ::Middleman::Configuration::ConfigurationManager
|
60
|
+
attr_reader :config
|
75
61
|
|
76
|
-
|
77
|
-
|
62
|
+
Contract ::Middleman::ExtensionManager
|
63
|
+
attr_reader :extensions
|
78
64
|
|
79
|
-
|
65
|
+
Contract SetOf[MiddlewareDescriptor]
|
66
|
+
attr_reader :middleware
|
80
67
|
|
81
|
-
|
82
|
-
|
68
|
+
Contract SetOf[MapDescriptor]
|
69
|
+
attr_reader :mappings
|
83
70
|
|
84
71
|
# Which host preview should start on.
|
85
72
|
# @return [Fixnum]
|
86
|
-
|
73
|
+
define_setting :host, '0.0.0.0', 'The preview server host'
|
87
74
|
|
88
75
|
# Which port preview should start on.
|
89
76
|
# @return [Fixnum]
|
90
|
-
|
77
|
+
define_setting :port, 4567, 'The preview server port'
|
78
|
+
|
79
|
+
# Whether to serve the preview server over HTTPS.
|
80
|
+
# @return [Boolean]
|
81
|
+
config.define_setting :https, false, 'Serve the preview server over SSL/TLS'
|
82
|
+
|
83
|
+
# The (optional) path to the SSL cert to use for the preview server.
|
84
|
+
# @return [String]
|
85
|
+
config.define_setting :ssl_certificate, nil, 'Path to an X.509 certificate to use for the preview server'
|
86
|
+
|
87
|
+
# The (optional) private key for the certificate in :ssl_certificate.
|
88
|
+
# @return [String]
|
89
|
+
config.define_setting :ssl_private_key, nil, "Path to an RSA private key for the preview server's certificate"
|
91
90
|
|
92
91
|
# Name of the source directory
|
93
92
|
# @return [String]
|
94
|
-
|
93
|
+
define_setting :source, 'source', 'Name of the source directory'
|
95
94
|
|
96
95
|
# Middleman mode. Defaults to :server, set to :build by the build process
|
97
96
|
# @return [String]
|
98
|
-
|
97
|
+
define_setting :mode, ((ENV['MM_ENV'] && ENV['MM_ENV'].to_sym) || :server), 'Middleman mode. Defaults to :server'
|
99
98
|
|
100
99
|
# Middleman environment. Defaults to :development
|
101
100
|
# @return [String]
|
102
|
-
|
101
|
+
define_setting :environment, :development, 'Middleman environment. Defaults to :development'
|
103
102
|
|
104
103
|
# Which file should be used for directory indexes
|
105
104
|
# @return [String]
|
106
|
-
|
105
|
+
define_setting :index_file, 'index.html', 'Which file should be used for directory indexes'
|
107
106
|
|
108
107
|
# Whether to strip the index file name off links to directory indexes
|
109
108
|
# @return [Boolean]
|
110
|
-
|
109
|
+
define_setting :strip_index_file, true, 'Whether to strip the index file name off links to directory indexes'
|
111
110
|
|
112
111
|
# Whether to include a trailing slash when stripping the index file
|
113
112
|
# @return [Boolean]
|
114
|
-
|
113
|
+
define_setting :trailing_slash, true, 'Whether to include a trailing slash when stripping the index file'
|
115
114
|
|
116
115
|
# Location of javascripts within source.
|
117
116
|
# @return [String]
|
118
|
-
|
117
|
+
define_setting :js_dir, 'javascripts', 'Location of javascripts within source'
|
119
118
|
|
120
119
|
# Location of stylesheets within source. Used by Compass.
|
121
120
|
# @return [String]
|
122
|
-
|
121
|
+
define_setting :css_dir, 'stylesheets', 'Location of stylesheets within source'
|
123
122
|
|
124
123
|
# Location of images within source. Used by HTML helpers and Compass.
|
125
124
|
# @return [String]
|
126
|
-
|
125
|
+
define_setting :images_dir, 'images', 'Location of images within source'
|
127
126
|
|
128
127
|
# Location of fonts within source. Used by Compass.
|
129
128
|
# @return [String]
|
130
|
-
|
129
|
+
define_setting :fonts_dir, 'fonts', 'Location of fonts within source'
|
131
130
|
|
132
131
|
# Location of layouts within source. Used by renderers.
|
133
132
|
# @return [String]
|
134
|
-
|
133
|
+
define_setting :layouts_dir, 'layouts', 'Location of layouts within source'
|
135
134
|
|
136
135
|
# Where to build output files
|
137
136
|
# @return [String]
|
138
|
-
|
137
|
+
define_setting :build_dir, 'build', 'Where to build output files'
|
139
138
|
|
140
139
|
# Default prefix for building paths. Used by HTML helpers and Compass.
|
141
140
|
# @return [String]
|
142
|
-
|
141
|
+
define_setting :http_prefix, '/', 'Default prefix for building paths'
|
143
142
|
|
144
143
|
# Default layout name
|
145
144
|
# @return [String, Symbold]
|
146
|
-
|
145
|
+
define_setting :layout, :_auto_layout, 'Default layout name'
|
147
146
|
|
148
147
|
# Default string encoding for templates and output.
|
149
148
|
# @return [String]
|
150
|
-
|
149
|
+
define_setting :encoding, 'utf-8', 'Default string encoding for templates and output'
|
151
150
|
|
152
151
|
# Should Padrino include CRSF tag
|
153
152
|
# @return [Boolean]
|
154
|
-
|
153
|
+
define_setting :protect_from_csrf, false, 'Should Padrino include CRSF tag'
|
155
154
|
|
156
155
|
# Set to automatically convert some characters into a directory
|
157
|
-
|
156
|
+
define_setting :automatic_directory_matcher, nil, 'Set to automatically convert some characters into a directory'
|
158
157
|
|
159
158
|
# Setup callbacks which can exclude paths from the sitemap
|
160
|
-
|
159
|
+
define_setting :ignored_sitemap_matchers, {
|
161
160
|
# Files starting with an underscore, but not a double-underscore
|
162
161
|
partials: proc { |file|
|
163
162
|
ignored = false
|
@@ -178,37 +177,40 @@ module Middleman
|
|
178
177
|
}
|
179
178
|
}, 'Callbacks that can exclude paths from the sitemap'
|
180
179
|
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
attr_reader :config_context
|
186
|
-
attr_reader :sitemap
|
187
|
-
attr_reader :cache
|
188
|
-
attr_reader :template_context_class
|
189
|
-
attr_reader :config
|
190
|
-
attr_reader :generic_template_context
|
191
|
-
attr_reader :extensions
|
192
|
-
attr_reader :sources
|
193
|
-
|
194
|
-
Contract SetOf[MiddlewareDescriptor]
|
195
|
-
attr_reader :middleware
|
196
|
-
|
197
|
-
Contract SetOf[MapDescriptor]
|
198
|
-
attr_reader :mappings
|
180
|
+
define_setting :watcher_disable, false, 'If the Listen watcher should not run'
|
181
|
+
define_setting :watcher_force_polling, false, 'If the Listen watcher should run in polling mode'
|
182
|
+
define_setting :watcher_latency, nil, 'The Listen watcher latency'
|
199
183
|
|
200
|
-
#
|
184
|
+
# Delegate convenience methods off to their implementations
|
201
185
|
def_delegator :"::Middleman::Logger", :singleton, :logger
|
202
186
|
def_delegator :"::Middleman::Util", :instrument
|
203
187
|
def_delegators :"self.class", :root, :root_path
|
204
188
|
def_delegators :@generic_template_context, :link_to, :image_tag, :asset_path
|
205
189
|
def_delegators :@extensions, :activate
|
190
|
+
def_delegators :config, :define_setting
|
206
191
|
|
207
192
|
# Initialize the Middleman project
|
208
193
|
def initialize(&block)
|
209
194
|
# Search the root of the project for required files
|
210
195
|
$LOAD_PATH.unshift(root) unless $LOAD_PATH.include?(root)
|
211
196
|
|
197
|
+
@callbacks = ::Middleman::CallbackManager.new
|
198
|
+
@callbacks.install_methods!(self, [
|
199
|
+
:initialized,
|
200
|
+
:configure,
|
201
|
+
:before_sitemap,
|
202
|
+
:before_configuration,
|
203
|
+
:after_configuration,
|
204
|
+
:after_configuration_eval,
|
205
|
+
:ready,
|
206
|
+
:before_build,
|
207
|
+
:after_build,
|
208
|
+
:before_shutdown,
|
209
|
+
:before, # Before Rack requests
|
210
|
+
:before_render,
|
211
|
+
:after_render
|
212
|
+
])
|
213
|
+
|
212
214
|
@middleware = Set.new
|
213
215
|
@mappings = Set.new
|
214
216
|
|
@@ -216,21 +218,22 @@ module Middleman
|
|
216
218
|
@generic_template_context = @template_context_class.new(self)
|
217
219
|
@config_context = ConfigContext.new(self, @template_context_class)
|
218
220
|
|
219
|
-
::Middleman::FileRenderer.cache.clear
|
220
|
-
::Middleman::TemplateRenderer.cache.clear
|
221
|
-
|
222
221
|
# Setup the default values from calls to set before initialization
|
223
222
|
@config = ::Middleman::Configuration::ConfigurationManager.new
|
224
223
|
@config.load_settings(self.class.config.all_settings)
|
225
224
|
|
226
225
|
config[:source] = ENV['MM_SOURCE'] if ENV['MM_SOURCE']
|
227
226
|
|
227
|
+
# TODO, make this less global
|
228
|
+
::Middleman::FileRenderer.cache.clear
|
229
|
+
::Middleman::TemplateRenderer.cache.clear
|
230
|
+
|
228
231
|
@extensions = ::Middleman::ExtensionManager.new(self)
|
229
232
|
|
230
233
|
# Evaluate a passed block if given
|
231
234
|
config_context.instance_exec(&block) if block_given?
|
232
235
|
|
233
|
-
|
236
|
+
execute_callbacks(:before_sitemap)
|
234
237
|
|
235
238
|
# Initialize the Sitemap
|
236
239
|
@sitemap = ::Middleman::Sitemap::Store.new(self)
|
@@ -242,42 +245,40 @@ module Middleman
|
|
242
245
|
|
243
246
|
::Middleman::Extension.clear_after_extension_callbacks
|
244
247
|
|
245
|
-
|
248
|
+
after_configuration_eval(&method(:prune_tilt_templates))
|
249
|
+
|
250
|
+
start_lifecycle
|
251
|
+
end
|
246
252
|
|
247
|
-
|
253
|
+
# Boot the app.
|
254
|
+
def start_lifecycle
|
255
|
+
# Before config is parsed, before extensions get to it.
|
256
|
+
execute_callbacks(:initialized)
|
248
257
|
|
249
|
-
|
258
|
+
# Before config is parsed. Mostly used for extensions.
|
259
|
+
execute_callbacks(:before_configuration)
|
250
260
|
|
251
|
-
|
261
|
+
# Eval config.
|
262
|
+
evaluate_configuration!
|
252
263
|
|
253
|
-
#
|
254
|
-
|
255
|
-
# polluted with paths from other test app directories that don't
|
256
|
-
# exist anymore.
|
257
|
-
if ENV['TEST']
|
258
|
-
::I18n.load_path.delete_if { |path| path =~ %r{tmp/aruba} }
|
259
|
-
::I18n.reload!
|
260
|
-
end
|
264
|
+
# Run any `configure` blocks for the current environment.
|
265
|
+
execute_callbacks([:configure, config[:environment]])
|
261
266
|
|
262
|
-
#
|
263
|
-
|
264
|
-
begin
|
265
|
-
Tilt[".#{key}"]
|
266
|
-
rescue LoadError, NameError
|
267
|
-
Tilt.mappings.delete(key)
|
268
|
-
end
|
269
|
-
end
|
267
|
+
# Run any `configure` blocks for the current mode.
|
268
|
+
execute_callbacks([:configure, config[:mode]])
|
270
269
|
|
271
|
-
|
270
|
+
# Post parsing, pre-extension callback
|
271
|
+
execute_callbacks(:after_configuration_eval)
|
272
272
|
|
273
|
-
|
274
|
-
|
273
|
+
# After extensions have worked after_config
|
274
|
+
execute_callbacks(:after_configuration)
|
275
275
|
|
276
|
-
|
277
|
-
|
276
|
+
# Everything is stable
|
277
|
+
execute_callbacks(:ready)
|
278
278
|
end
|
279
279
|
|
280
|
-
|
280
|
+
# Eval config
|
281
|
+
def evaluate_configuration!
|
281
282
|
# Check for and evaluate local configuration in `config.rb`
|
282
283
|
config_rb = File.join(root, 'config.rb')
|
283
284
|
if File.exist? config_rb
|
@@ -293,55 +294,67 @@ module Middleman
|
|
293
294
|
end
|
294
295
|
|
295
296
|
env_config = File.join(root, 'environments', "#{config[:environment]}.rb")
|
296
|
-
|
297
|
-
logger.debug "== Reading: #{config[:environment]} config"
|
298
|
-
config_context.instance_eval File.read(env_config), env_config, 1
|
299
|
-
end
|
297
|
+
return unless File.exist? env_config
|
300
298
|
|
301
|
-
|
302
|
-
config_context.
|
299
|
+
logger.debug "== Reading: #{config[:environment]} config"
|
300
|
+
config_context.instance_eval File.read(env_config), env_config, 1
|
301
|
+
end
|
303
302
|
|
304
|
-
|
305
|
-
|
303
|
+
# Clean up missing Tilt exts
|
304
|
+
def prune_tilt_templates
|
305
|
+
::Tilt.mappings.each do |key, _|
|
306
|
+
begin
|
307
|
+
::Tilt[".#{key}"]
|
308
|
+
rescue LoadError, NameError
|
309
|
+
::Tilt.mappings.delete(key)
|
310
|
+
end
|
311
|
+
end
|
306
312
|
end
|
307
313
|
|
308
314
|
# Whether we're in server mode
|
309
315
|
# @return [Boolean] If we're in dev mode
|
316
|
+
Contract Bool
|
310
317
|
def server?
|
311
318
|
config[:mode] == :server
|
312
319
|
end
|
313
320
|
|
314
321
|
# Whether we're in build mode
|
315
322
|
# @return [Boolean] If we're in dev mode
|
323
|
+
Contract Bool
|
316
324
|
def build?
|
317
325
|
config[:mode] == :build
|
318
326
|
end
|
319
327
|
|
320
328
|
# Whether we're in a specific environment
|
321
329
|
# @return [Boolean]
|
330
|
+
Contract Bool
|
322
331
|
def environment?(key)
|
323
332
|
config[:environment] == key
|
324
333
|
end
|
325
334
|
|
326
335
|
# Backwards compatible helper. What the current environment is.
|
327
336
|
# @return [Symbol]
|
337
|
+
Contract Symbol
|
328
338
|
def environment
|
329
339
|
config[:environment]
|
330
340
|
end
|
331
341
|
|
332
342
|
# Backwards compatible helper. Whether we're in dev mode.
|
333
343
|
# @return [Boolean]
|
344
|
+
Contract Bool
|
334
345
|
def development?
|
335
346
|
environment?(:development)
|
336
347
|
end
|
337
348
|
|
338
349
|
# Backwards compatible helper. Whether we're in production mode.
|
339
350
|
# @return [Boolean]
|
351
|
+
Contract Bool
|
340
352
|
def production?
|
341
353
|
environment?(:production)
|
342
354
|
end
|
343
355
|
|
344
356
|
# Backwards compatible helper. The full path to the default source dir.
|
357
|
+
Contract Pathname
|
345
358
|
def source_dir
|
346
359
|
Pathname(File.join(root, config[:source]))
|
347
360
|
end
|
@@ -364,8 +377,9 @@ module Middleman
|
|
364
377
|
@mappings << MapDescriptor.new(map, block)
|
365
378
|
end
|
366
379
|
|
380
|
+
# Let everyone know we're shutting down.
|
367
381
|
def shutdown!
|
368
|
-
|
382
|
+
execute_callbacks(:before_shutdown)
|
369
383
|
end
|
370
384
|
|
371
385
|
# Work around this bug: http://bugs.ruby-lang.org/issues/4521
|
@@ -2,6 +2,7 @@ require 'pathname'
|
|
2
2
|
require 'fileutils'
|
3
3
|
require 'tempfile'
|
4
4
|
require 'middleman-core/rack'
|
5
|
+
require 'middleman-core/callback_manager'
|
5
6
|
require 'middleman-core/contracts'
|
6
7
|
|
7
8
|
module Middleman
|
@@ -36,10 +37,11 @@ module Middleman
|
|
36
37
|
@glob = opts.fetch(:glob)
|
37
38
|
@cleaning = opts.fetch(:clean)
|
38
39
|
|
39
|
-
@_event_callbacks = []
|
40
|
-
|
41
40
|
rack_app = ::Middleman::Rack.new(@app).to_app
|
42
41
|
@rack = ::Rack::MockRequest.new(rack_app)
|
42
|
+
|
43
|
+
@callbacks = ::Middleman::CallbackManager.new
|
44
|
+
@callbacks.install_methods!(self, [:on_build_event])
|
43
45
|
end
|
44
46
|
|
45
47
|
# Run the build phase.
|
@@ -49,7 +51,7 @@ module Middleman
|
|
49
51
|
@has_error = false
|
50
52
|
@events = {}
|
51
53
|
|
52
|
-
@app.
|
54
|
+
@app.execute_callbacks(:before_build, [self])
|
53
55
|
|
54
56
|
queue_current_paths if @cleaning
|
55
57
|
prerender_css
|
@@ -60,21 +62,11 @@ module Middleman
|
|
60
62
|
|
61
63
|
::Middleman::Profiling.report('build')
|
62
64
|
|
63
|
-
|
64
|
-
@app.run_hook :after_build, self
|
65
|
-
@app.config_context.execute_after_build_callbacks(self)
|
65
|
+
@app.execute_callbacks(:after_build, [self])
|
66
66
|
|
67
67
|
!@has_error
|
68
68
|
end
|
69
69
|
|
70
|
-
# Attach callbacks for build events.
|
71
|
-
# @return [Array<Proc>] All the attached events.
|
72
|
-
Contract Proc => ArrayOf[Proc]
|
73
|
-
def on_build_event(&block)
|
74
|
-
@_event_callbacks << block if block_given?
|
75
|
-
@_event_callbacks
|
76
|
-
end
|
77
|
-
|
78
70
|
# Pre-request CSS to give Compass a chance to build sprites
|
79
71
|
# @return [Array<Resource>] List of css resources that were output.
|
80
72
|
Contract ResourceList
|
@@ -253,9 +245,7 @@ module Middleman
|
|
253
245
|
@events[event_type] ||= []
|
254
246
|
@events[event_type] << target
|
255
247
|
|
256
|
-
|
257
|
-
callback.call(event_type, target, extra)
|
258
|
-
end
|
248
|
+
execute_callbacks(:on_build_event, [event_type, target, extra])
|
259
249
|
end
|
260
250
|
end
|
261
251
|
end
|