middleman-core 4.3.6 → 4.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/features/asset_hash.feature +64 -62
- data/features/data.feature +20 -0
- data/features/default_alt_tag.feature +11 -0
- data/features/front-matter-neighbor.feature +33 -27
- data/features/front-matter.feature +11 -5
- data/features/i18n_preview.feature +238 -238
- data/features/liquid.feature +5 -2
- data/features/relative_assets.feature +1 -1
- data/features/relative_assets_helpers_only.feature +1 -1
- data/features/support/env.rb +0 -3
- data/features/unicode_filenames.feature +3 -3
- data/fixtures/basic-data-app/data/test3.toml +7 -0
- data/fixtures/basic-data-app/source/data4.html.erb +5 -0
- data/fixtures/default-alt-tags-app/config.rb +0 -0
- data/fixtures/default-alt-tags-app/source/empty-alt-tag.html.erb +1 -0
- data/fixtures/default-alt-tags-app/source/images/blank.gif +0 -0
- data/fixtures/default-alt-tags-app/source/meaningful-alt-tag.html.erb +1 -0
- data/fixtures/frontmatter-app/source/raw-front-matter-toml.html +6 -0
- data/fixtures/frontmatter-app/source/raw-front-matter.html +1 -1
- data/fixtures/frontmatter-neighbor-app/source/raw-front-matter-toml.html +1 -0
- data/fixtures/frontmatter-neighbor-app/source/raw-front-matter-toml.html.frontmatter +4 -0
- data/lib/middleman-core/builder.rb +1 -1
- data/lib/middleman-core/core_extensions/data.rb +4 -2
- data/lib/middleman-core/core_extensions/default_helpers.rb +3 -0
- data/lib/middleman-core/core_extensions/front_matter.rb +1 -0
- data/lib/middleman-core/core_extensions/rendering.rb +0 -6
- data/lib/middleman-core/dns_resolver.rb +2 -4
- data/lib/middleman-core/dns_resolver/basic_network_resolver.rb +0 -2
- data/lib/middleman-core/extensions/asset_hash.rb +1 -1
- data/lib/middleman-core/preview_server/server_ip_address.rb +5 -14
- data/lib/middleman-core/rack.rb +2 -1
- data/lib/middleman-core/step_definitions/commandline_steps.rb +0 -4
- data/lib/middleman-core/step_definitions/middleman_steps.rb +1 -1
- data/lib/middleman-core/step_definitions/server_steps.rb +3 -2
- data/lib/middleman-core/template_context.rb +3 -3
- data/lib/middleman-core/template_renderer.rb +1 -1
- data/lib/middleman-core/util/data.rb +28 -0
- data/lib/middleman-core/util/paths.rb +2 -1
- data/lib/middleman-core/version.rb +1 -1
- data/middleman-core.gemspec +8 -6
- data/spec/middleman-core/dns_resolver_spec.rb +8 -24
- data/spec/spec_helper.rb +0 -3
- metadata +57 -1078
- data/features/stylus.feature +0 -54
- data/lib/middleman-core/renderers/stylus.rb +0 -10
data/features/liquid.feature
CHANGED
@@ -4,8 +4,11 @@ Feature: Support liquid partials
|
|
4
4
|
Given the Server is running at "liquid-app"
|
5
5
|
When I go to "/liquid_master.html"
|
6
6
|
Then I should see "Greetings"
|
7
|
-
|
7
|
+
|
8
8
|
Scenario: Rendering liquid
|
9
9
|
Given the Server is running at "liquid-app"
|
10
10
|
When I go to "/data2.html"
|
11
|
-
Then I should see "OneTwo"
|
11
|
+
Then I should see "OneTwo"
|
12
|
+
|
13
|
+
Scenario: Building liquid
|
14
|
+
Given a successfully built app at "liquid-app"
|
@@ -131,7 +131,7 @@ Feature: Relative Assets
|
|
131
131
|
"""
|
132
132
|
And the Server is running at "relative-assets-app"
|
133
133
|
When I go to "/sub/image_tag.html"
|
134
|
-
Then I should see '<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" />'
|
134
|
+
Then I should see '<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" alt="" />'
|
135
135
|
|
136
136
|
Scenario: URLs are not rewritten for rewrite ignored paths
|
137
137
|
Given a fixture app "relative-assets-app"
|
@@ -87,7 +87,7 @@ Feature: Relative Assets (Helpers Only)
|
|
87
87
|
"""
|
88
88
|
And the Server is running at "relative-assets-app"
|
89
89
|
When I go to "/sub/image_tag.html"
|
90
|
-
Then I should see '<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" />'
|
90
|
+
Then I should see '<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" alt="" />'
|
91
91
|
|
92
92
|
@wip
|
93
93
|
Scenario: URLs are not rewritten for rewrite ignored paths
|
data/features/support/env.rb
CHANGED
@@ -8,9 +8,6 @@ SimpleCov.root(File.expand_path(File.dirname(__FILE__) + '/../..'))
|
|
8
8
|
require 'coveralls'
|
9
9
|
Coveralls.wear!
|
10
10
|
|
11
|
-
require 'codeclimate-test-reporter'
|
12
|
-
CodeClimate::TestReporter.start
|
13
|
-
|
14
11
|
PROJECT_ROOT_PATH = File.dirname(File.dirname(File.dirname(__FILE__)))
|
15
12
|
require File.join(PROJECT_ROOT_PATH, 'lib', 'middleman-core')
|
16
13
|
require File.join(PROJECT_ROOT_PATH, 'lib', 'middleman-core', 'step_definitions')
|
@@ -1,4 +1,4 @@
|
|
1
|
-
@encoding @
|
1
|
+
@encoding @wip
|
2
2
|
|
3
3
|
Feature: Unicode filenames
|
4
4
|
In order to support non-ASCII characters in filenames
|
@@ -12,7 +12,7 @@ Feature: Unicode filenames
|
|
12
12
|
"""
|
13
13
|
Snowman!
|
14
14
|
<div style="text-align:center; font-size:4000%;">
|
15
|
-
|
15
|
+
☃
|
16
16
|
</div>
|
17
17
|
"""
|
18
18
|
And a successfully built app at "empty-app"
|
@@ -28,7 +28,7 @@ Feature: Unicode filenames
|
|
28
28
|
"""
|
29
29
|
Snowman!
|
30
30
|
<div style="text-align:center; font-size:4000%;">
|
31
|
-
|
31
|
+
☃
|
32
32
|
</div>
|
33
33
|
"""
|
34
34
|
And the Server is running
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= image_tag "blank.gif" %>
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= image_tag "blank.gif", alt: "Meaningful alt text" %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<h1><%= current_page.data.title %></h1>
|
@@ -229,7 +229,7 @@ module Middleman
|
|
229
229
|
if resource.binary?
|
230
230
|
export_file!(output_file, resource.file_descriptor[:full_path])
|
231
231
|
else
|
232
|
-
response = @rack.get(::
|
232
|
+
response = @rack.get(::WEBrick::HTTPUtils.escape(resource.request_path))
|
233
233
|
|
234
234
|
# If we get a response, save it to a tempfile.
|
235
235
|
if response.status == 200
|
@@ -17,7 +17,7 @@ module Middleman
|
|
17
17
|
expose_to_template data: :data_store
|
18
18
|
|
19
19
|
# The regex which tells Middleman which files are for data
|
20
|
-
DATA_FILE_MATCHER = /^(.*?)[\w-]+\.(yml|yaml|json)$/
|
20
|
+
DATA_FILE_MATCHER = /^(.*?)[\w-]+\.(yml|yaml|json|toml)$/
|
21
21
|
|
22
22
|
def initialize(app, config={}, &block)
|
23
23
|
super
|
@@ -102,13 +102,15 @@ module Middleman
|
|
102
102
|
extension = File.extname(data_path)
|
103
103
|
basename = File.basename(data_path, extension)
|
104
104
|
|
105
|
-
return unless %w(.yaml .yml .json).include?(extension)
|
105
|
+
return unless %w(.yaml .yml .json .toml).include?(extension)
|
106
106
|
|
107
107
|
if %w(.yaml .yml).include?(extension)
|
108
108
|
data, postscript = ::Middleman::Util::Data.parse(file, @app.config[:frontmatter_delims], :yaml)
|
109
109
|
data[:postscript] = postscript if !postscript.nil? && data.is_a?(Hash)
|
110
110
|
elsif extension == '.json'
|
111
111
|
data, _postscript = ::Middleman::Util::Data.parse(file, @app.config[:frontmatter_delims], :json)
|
112
|
+
elsif extension == '.toml'
|
113
|
+
data, _postscript = ::Middleman::Util::Data.parse(file, @app.config[:frontmatter_delims], :toml)
|
112
114
|
end
|
113
115
|
|
114
116
|
data_branch = @local_data
|
@@ -6,6 +6,7 @@ require 'padrino-helpers/format_helpers'
|
|
6
6
|
require 'padrino-helpers/number_helpers'
|
7
7
|
require 'padrino-helpers/output_helpers'
|
8
8
|
require 'padrino-helpers/render_helpers'
|
9
|
+
require 'active_support/core_ext/array/extract_options'
|
9
10
|
require 'middleman-core/contracts'
|
10
11
|
|
11
12
|
# Don't fail on invalid locale, that's not what our current
|
@@ -282,6 +283,8 @@ class Middleman::CoreExtensions::DefaultHelpers < ::Middleman::Extension
|
|
282
283
|
params[:srcset] = images_sources.join(', ')
|
283
284
|
end
|
284
285
|
|
286
|
+
params[:alt] ||= ''
|
287
|
+
|
285
288
|
super(path, params)
|
286
289
|
end
|
287
290
|
|
@@ -17,6 +17,7 @@ module Middleman::CoreExtensions
|
|
17
17
|
# Set textual delimiters that denote the start and end of frontmatter
|
18
18
|
define_setting :frontmatter_delims, {
|
19
19
|
json: [%w(;;; ;;;)],
|
20
|
+
toml: [%w(+++ +++)],
|
20
21
|
yaml: [%w(--- ---), %w(--- ...)]
|
21
22
|
}, 'Allowed frontmatter delimiters'
|
22
23
|
|
@@ -47,9 +47,3 @@ Middleman::Extensions.register :less_renderer, auto_activate: :before_configurat
|
|
47
47
|
require 'middleman-core/renderers/less'
|
48
48
|
Middleman::Renderers::Less
|
49
49
|
end
|
50
|
-
|
51
|
-
# Stylus Support
|
52
|
-
Middleman::Extensions.register :stylus_renderer, auto_activate: :before_configuration do
|
53
|
-
require 'middleman-core/renderers/stylus'
|
54
|
-
Middleman::Renderers::Stylus
|
55
|
-
end
|
@@ -31,10 +31,8 @@ module Middleman
|
|
31
31
|
@resolvers = []
|
32
32
|
@resolvers << opts.fetch(:hosts_resolver, HostsResolver.new)
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
@resolvers << opts.fetch(:local_link_resolver, LocalLinkResolver.new)
|
37
|
-
end
|
34
|
+
require 'middleman-core/dns_resolver/local_link_resolver'
|
35
|
+
@resolvers << opts.fetch(:local_link_resolver, LocalLinkResolver.new)
|
38
36
|
|
39
37
|
@resolvers << opts.fetch(:network_resolver, NetworkResolver.new)
|
40
38
|
end
|
@@ -87,7 +87,7 @@ class Middleman::Extensions::AssetHash < ::Middleman::Extension
|
|
87
87
|
else
|
88
88
|
# Render through the Rack interface so middleware and mounted apps get a shot
|
89
89
|
response = @rack_client.get(
|
90
|
-
::
|
90
|
+
::WEBrick::HTTPUtils.escape(resource.destination_path),
|
91
91
|
'bypass_inline_url_rewriter_asset_hash' => 'true'
|
92
92
|
)
|
93
93
|
|
@@ -35,20 +35,11 @@ module Middleman
|
|
35
35
|
format('[%s]', to_s)
|
36
36
|
end
|
37
37
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
false
|
44
|
-
end
|
45
|
-
else
|
46
|
-
def self.match?(str)
|
47
|
-
str = str.to_s.sub(/%.*$/, '')
|
48
|
-
IPAddr.new(str).ipv6?
|
49
|
-
rescue IPAddr::InvalidAddressError, IPAddr::AddressFamilyError
|
50
|
-
false
|
51
|
-
end
|
38
|
+
def self.match?(str)
|
39
|
+
str = str.to_s.sub(/%.*$/, '')
|
40
|
+
IPAddr.new(str).ipv6?
|
41
|
+
rescue IPAddr::InvalidAddressError, IPAddr::AddressFamilyError
|
42
|
+
false
|
52
43
|
end
|
53
44
|
end
|
54
45
|
end
|
data/lib/middleman-core/rack.rb
CHANGED
@@ -3,6 +3,7 @@ require 'rack/file'
|
|
3
3
|
require 'rack/lint'
|
4
4
|
require 'rack/head'
|
5
5
|
require 'rack/utils'
|
6
|
+
require 'webrick'
|
6
7
|
|
7
8
|
require 'middleman-core/util'
|
8
9
|
require 'middleman-core/logger'
|
@@ -86,7 +87,7 @@ module Middleman
|
|
86
87
|
def process_request(env, req, res)
|
87
88
|
start_time = Time.now
|
88
89
|
|
89
|
-
request_path =
|
90
|
+
request_path = WEBrick::HTTPUtils.unescape(env['PATH_INFO'].dup)
|
90
91
|
if request_path.respond_to? :force_encoding
|
91
92
|
request_path.force_encoding('UTF-8')
|
92
93
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'middleman-core/rack'
|
2
2
|
require 'rspec/expectations'
|
3
3
|
require 'capybara/cucumber'
|
4
|
+
require 'webrick'
|
4
5
|
|
5
6
|
Given /^a clean server$/ do
|
6
7
|
@initialize_commands = []
|
@@ -72,11 +73,11 @@ Given /^a template named "([^\"]*)" with:$/ do |name, string|
|
|
72
73
|
end
|
73
74
|
|
74
75
|
When /^I go to "([^\"]*)"$/ do |url|
|
75
|
-
visit(
|
76
|
+
visit(WEBrick::HTTPUtils.escape(url))
|
76
77
|
end
|
77
78
|
|
78
79
|
Then /^going to "([^\"]*)" should not raise an exception$/ do |url|
|
79
|
-
expect{ visit(
|
80
|
+
expect{ visit(WEBrick::HTTPUtils.escape(url)) }.to_not raise_exception
|
80
81
|
end
|
81
82
|
|
82
83
|
Then /^the content type should be "([^\"]*)"$/ do |expected|
|
@@ -99,8 +99,8 @@ module Middleman
|
|
99
99
|
# @param [Hash] options
|
100
100
|
# @param [Proc] block A block will be evaluated to return internal contents.
|
101
101
|
# @return [String]
|
102
|
-
Contract Any, Or[Symbol, String], Hash
|
103
|
-
def render(_, name, options={}, &block)
|
102
|
+
Contract Any, Or[Symbol, String], Hash, Hash, Maybe[Proc] => String
|
103
|
+
def render(_, name, options={}, locals={}, &block)
|
104
104
|
name = name.to_s
|
105
105
|
|
106
106
|
partial_file = locate_partial(name, false) || locate_partial(name, true)
|
@@ -114,7 +114,7 @@ module Middleman
|
|
114
114
|
partial_file.read
|
115
115
|
else
|
116
116
|
opts = options.dup
|
117
|
-
locs =
|
117
|
+
locs = locals.dup
|
118
118
|
|
119
119
|
render_file(partial_file, locs, opts, &block)
|
120
120
|
end
|
@@ -132,7 +132,7 @@ module Middleman
|
|
132
132
|
@app.extensions.add_exposed_to_context(context)
|
133
133
|
|
134
134
|
locals.each do |k, _|
|
135
|
-
next unless context.respond_to?(k) && ![:current_path, :paginate, :page_articles, :blog_controller, :lang, :locale].include?(k.to_sym)
|
135
|
+
next unless context.respond_to?(k) && ![:current_path, :paginate, :page_articles, :blog_controller, :lang, :locale, :data].include?(k.to_sym)
|
136
136
|
|
137
137
|
msg = "Template local `#{k}` tried to overwrite an existing context value. Please rename the key when passing to `locals`"
|
138
138
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
require 'json'
|
3
|
+
require 'toml'
|
3
4
|
require 'pathname'
|
4
5
|
require 'backports/2.1.0/array/to_h'
|
5
6
|
require 'hashie'
|
@@ -65,6 +66,8 @@ module Middleman
|
|
65
66
|
return [parse_yaml(content, full_path), nil]
|
66
67
|
when :json
|
67
68
|
return [parse_json(content, full_path), nil]
|
69
|
+
when :toml
|
70
|
+
return [parse_toml(content, full_path), nil]
|
68
71
|
end
|
69
72
|
end
|
70
73
|
|
@@ -79,6 +82,11 @@ module Middleman
|
|
79
82
|
parse_json("{#{match[:frontmatter]}}", full_path),
|
80
83
|
match[:additional_content]
|
81
84
|
]
|
85
|
+
when *frontmatter_delims[:toml]
|
86
|
+
[
|
87
|
+
parse_toml(match[:frontmatter], full_path),
|
88
|
+
match[:additional_content]
|
89
|
+
]
|
82
90
|
else
|
83
91
|
[
|
84
92
|
{},
|
@@ -122,6 +130,26 @@ module Middleman
|
|
122
130
|
c ? symbolize_recursive(c) : {}
|
123
131
|
end
|
124
132
|
memoize :parse_yaml
|
133
|
+
|
134
|
+
# Parse TOML frontmatter out of a string
|
135
|
+
# @param [String] content
|
136
|
+
# @return [Hash]
|
137
|
+
Contract String, Pathname => Hash
|
138
|
+
def parse_toml(content, full_path)
|
139
|
+
c = begin
|
140
|
+
::Middleman::Util.instrument 'parse.toml' do
|
141
|
+
::TOML.load(content)
|
142
|
+
end
|
143
|
+
rescue StandardError
|
144
|
+
# TOML parser swallows useful error, so we can't warn about it.
|
145
|
+
# https://github.com/jm/toml/issues/47
|
146
|
+
warn "TOML Exception parsing #{full_path}"
|
147
|
+
{}
|
148
|
+
end
|
149
|
+
|
150
|
+
c ? symbolize_recursive(c) : {}
|
151
|
+
end
|
152
|
+
memoize :parse_yaml
|
125
153
|
|
126
154
|
# Parse JSON frontmatter out of a string
|
127
155
|
# @param [String] content
|
@@ -4,6 +4,7 @@ require 'uri'
|
|
4
4
|
require 'addressable/uri'
|
5
5
|
require 'memoist'
|
6
6
|
require 'tilt'
|
7
|
+
require 'webrick'
|
7
8
|
|
8
9
|
require 'middleman-core/contracts'
|
9
10
|
|
@@ -33,7 +34,7 @@ module Middleman
|
|
33
34
|
Contract String => String
|
34
35
|
def normalize_path(path)
|
35
36
|
# The tr call works around a bug in Ruby's Unicode handling
|
36
|
-
::
|
37
|
+
WEBrick::HTTPUtils.unescape(path).sub(%r{^/}, '').tr('', '')
|
37
38
|
end
|
38
39
|
memoize :normalize_path
|
39
40
|
|
data/middleman-core.gemspec
CHANGED
@@ -16,10 +16,10 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.files = `git ls-files -z`.split("\0")
|
17
17
|
s.test_files = `git ls-files -z -- {fixtures,features}/*`.split("\0")
|
18
18
|
s.require_path = 'lib'
|
19
|
-
s.required_ruby_version = '>= 2.
|
19
|
+
s.required_ruby_version = '>= 2.5.0'
|
20
20
|
|
21
21
|
# Core
|
22
|
-
s.add_dependency('bundler')
|
22
|
+
s.add_dependency('bundler', '~> 2.0')
|
23
23
|
s.add_dependency('rack', ['>= 1.4.5', '< 3'])
|
24
24
|
s.add_dependency('tilt', ['~> 2.0.9'])
|
25
25
|
s.add_dependency('erubis')
|
@@ -27,18 +27,20 @@ Gem::Specification.new do |s|
|
|
27
27
|
s.add_dependency('parallel')
|
28
28
|
s.add_dependency('servolux')
|
29
29
|
s.add_dependency('dotenv')
|
30
|
+
s.add_dependency('toml')
|
31
|
+
s.add_dependency('webrick')
|
30
32
|
|
31
33
|
# Helpers
|
32
|
-
s.add_dependency('activesupport', ['>=
|
33
|
-
s.add_dependency('padrino-helpers', ['~> 0.
|
34
|
-
s.add_dependency("addressable", ["~> 2.
|
34
|
+
s.add_dependency('activesupport', ['>= 6.1', '< 7.0'])
|
35
|
+
s.add_dependency('padrino-helpers', ['~> 0.15.0'])
|
36
|
+
s.add_dependency("addressable", ["~> 2.4"])
|
35
37
|
s.add_dependency('memoist', ['~> 0.14'])
|
36
38
|
|
37
39
|
# Watcher
|
38
40
|
s.add_dependency('listen', ['~> 3.0.0'])
|
39
41
|
|
40
42
|
# i18n
|
41
|
-
s.add_dependency('i18n', ['~>
|
43
|
+
s.add_dependency('i18n', ['~> 1.6.0'])
|
42
44
|
|
43
45
|
# Automatic Image Sizes
|
44
46
|
s.add_dependency('fastimage', ['~> 2.0'])
|