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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/features/asset_hash.feature +64 -62
  3. data/features/data.feature +20 -0
  4. data/features/default_alt_tag.feature +11 -0
  5. data/features/front-matter-neighbor.feature +33 -27
  6. data/features/front-matter.feature +11 -5
  7. data/features/i18n_preview.feature +238 -238
  8. data/features/liquid.feature +5 -2
  9. data/features/relative_assets.feature +1 -1
  10. data/features/relative_assets_helpers_only.feature +1 -1
  11. data/features/support/env.rb +0 -3
  12. data/features/unicode_filenames.feature +3 -3
  13. data/fixtures/basic-data-app/data/test3.toml +7 -0
  14. data/fixtures/basic-data-app/source/data4.html.erb +5 -0
  15. data/fixtures/default-alt-tags-app/config.rb +0 -0
  16. data/fixtures/default-alt-tags-app/source/empty-alt-tag.html.erb +1 -0
  17. data/fixtures/default-alt-tags-app/source/images/blank.gif +0 -0
  18. data/fixtures/default-alt-tags-app/source/meaningful-alt-tag.html.erb +1 -0
  19. data/fixtures/frontmatter-app/source/raw-front-matter-toml.html +6 -0
  20. data/fixtures/frontmatter-app/source/raw-front-matter.html +1 -1
  21. data/fixtures/frontmatter-neighbor-app/source/raw-front-matter-toml.html +1 -0
  22. data/fixtures/frontmatter-neighbor-app/source/raw-front-matter-toml.html.frontmatter +4 -0
  23. data/lib/middleman-core/builder.rb +1 -1
  24. data/lib/middleman-core/core_extensions/data.rb +4 -2
  25. data/lib/middleman-core/core_extensions/default_helpers.rb +3 -0
  26. data/lib/middleman-core/core_extensions/front_matter.rb +1 -0
  27. data/lib/middleman-core/core_extensions/rendering.rb +0 -6
  28. data/lib/middleman-core/dns_resolver.rb +2 -4
  29. data/lib/middleman-core/dns_resolver/basic_network_resolver.rb +0 -2
  30. data/lib/middleman-core/extensions/asset_hash.rb +1 -1
  31. data/lib/middleman-core/preview_server/server_ip_address.rb +5 -14
  32. data/lib/middleman-core/rack.rb +2 -1
  33. data/lib/middleman-core/step_definitions/commandline_steps.rb +0 -4
  34. data/lib/middleman-core/step_definitions/middleman_steps.rb +1 -1
  35. data/lib/middleman-core/step_definitions/server_steps.rb +3 -2
  36. data/lib/middleman-core/template_context.rb +3 -3
  37. data/lib/middleman-core/template_renderer.rb +1 -1
  38. data/lib/middleman-core/util/data.rb +28 -0
  39. data/lib/middleman-core/util/paths.rb +2 -1
  40. data/lib/middleman-core/version.rb +1 -1
  41. data/middleman-core.gemspec +8 -6
  42. data/spec/middleman-core/dns_resolver_spec.rb +8 -24
  43. data/spec/spec_helper.rb +0 -3
  44. metadata +57 -1078
  45. data/features/stylus.feature +0 -54
  46. data/lib/middleman-core/renderers/stylus.rb +0 -10
@@ -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
@@ -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 @travishatesme @wip
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
@@ -0,0 +1,7 @@
1
+ [titles]
2
+
3
+ [titles.first]
4
+ title = "One"
5
+
6
+ [titles.second]
7
+ title = "Two"
@@ -0,0 +1,5 @@
1
+ <% if data.respond_to?(:test3) && data.test3.respond_to?(:titles) %>
2
+ <%= data.test3.titles.map { |r| r[1].title }.join(":") %>
3
+ <% else %>
4
+ No Test Data
5
+ <% end %>
File without changes
@@ -0,0 +1 @@
1
+ <%= image_tag "blank.gif" %>
@@ -0,0 +1 @@
1
+ <%= image_tag "blank.gif", alt: "Meaningful alt text" %>
@@ -0,0 +1,6 @@
1
+ +++
2
+ layout = false
3
+ title = "This is the title"
4
+ +++
5
+
6
+ <h1><%= current_page.data.title %></h1>
@@ -3,4 +3,4 @@ layout: false
3
3
  title: This is the title
4
4
  ---
5
5
 
6
- <h1><%= current_page.data.title %></h1>
6
+ <h1><%= current_page.data.title %></h1>
@@ -0,0 +1 @@
1
+ <h1><%= current_page.data.title %></h1>
@@ -0,0 +1,4 @@
1
+ +++
2
+ layout = false
3
+ title = "This is the title"
4
+ +++
@@ -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(::URI.escape(resource.request_path))
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
- if RUBY_VERSION >= '2.1'
35
- require 'middleman-core/dns_resolver/local_link_resolver'
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
@@ -43,8 +43,6 @@ module Middleman
43
43
  # @param [Integer] value
44
44
  # The timeout value
45
45
  def timeouts=(timeouts)
46
- return if RUBY_VERSION < '2'
47
-
48
46
  resolver.timeouts = timeouts
49
47
  end
50
48
  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
- ::URI.escape(resource.destination_path),
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
- if RUBY_VERSION < '2'
39
- def self.match?(str)
40
- str = str.to_s.sub(/%.*$/, '')
41
- IPAddr.new(str).ipv6?
42
- rescue StandardError
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
@@ -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 = URI.decode(env['PATH_INFO'].dup)
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
@@ -82,7 +82,3 @@ end
82
82
  After do
83
83
  only_processes.each { |p| p.terminate }
84
84
  end
85
-
86
- Before '@ruby-2.1' do
87
- skip_this_scenario if RUBY_VERSION < '2.1'
88
- end
@@ -35,7 +35,7 @@ Then /^the file "([^\"]*)" has the contents$/ do |path, contents|
35
35
  end
36
36
 
37
37
  Then /^the file "([^\"]*)" is removed$/ do |path|
38
- step %Q{I remove the file "#{path}"}
38
+ FileUtils.rm(expand_path(path))
39
39
 
40
40
  @server_inst.files.poll_once!
41
41
  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(URI.encode(url).to_s)
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(URI.encode(url).to_s) }.to_not raise_exception
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 => String, Maybe[Proc] => String
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 = opts.delete(:locals)
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
- ::URI.decode(path).sub(%r{^/}, '').tr('', '')
37
+ WEBrick::HTTPUtils.unescape(path).sub(%r{^/}, '').tr('', '')
37
38
  end
38
39
  memoize :normalize_path
39
40
 
@@ -1,5 +1,5 @@
1
1
  module Middleman
2
2
  # Current Version
3
3
  # @return [String]
4
- VERSION = '4.3.6'.freeze unless const_defined?(:VERSION)
4
+ VERSION = '4.4.0'.freeze unless const_defined?(:VERSION)
5
5
  end
@@ -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.2.0'
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', ['>= 4.2', '< 5.1'])
33
- s.add_dependency('padrino-helpers', ['~> 0.13.0'])
34
- s.add_dependency("addressable", ["~> 2.3"])
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', ['~> 0.9.0'])
43
+ s.add_dependency('i18n', ['~> 1.6.0'])
42
44
 
43
45
  # Automatic Image Sizes
44
46
  s.add_dependency('fastimage', ['~> 2.0'])