middleman-core 4.3.8 → 4.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) 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/front-matter-neighbor.feature +33 -27
  5. data/features/front-matter.feature +11 -5
  6. data/features/i18n_preview.feature +238 -238
  7. data/features/liquid.feature +5 -2
  8. data/features/support/env.rb +0 -3
  9. data/features/unicode_filenames.feature +3 -3
  10. data/fixtures/basic-data-app/data/test3.toml +7 -0
  11. data/fixtures/basic-data-app/source/data4.html.erb +5 -0
  12. data/fixtures/frontmatter-app/source/raw-front-matter-toml.html +6 -0
  13. data/fixtures/frontmatter-app/source/raw-front-matter.html +1 -1
  14. data/fixtures/frontmatter-neighbor-app/source/raw-front-matter-toml.html +1 -0
  15. data/fixtures/frontmatter-neighbor-app/source/raw-front-matter-toml.html.frontmatter +4 -0
  16. data/lib/middleman-core/builder.rb +1 -1
  17. data/lib/middleman-core/core_extensions/data.rb +4 -2
  18. data/lib/middleman-core/core_extensions/default_helpers.rb +1 -0
  19. data/lib/middleman-core/core_extensions/front_matter.rb +1 -0
  20. data/lib/middleman-core/core_extensions/rendering.rb +0 -6
  21. data/lib/middleman-core/dns_resolver/basic_network_resolver.rb +0 -2
  22. data/lib/middleman-core/dns_resolver.rb +2 -4
  23. data/lib/middleman-core/extensions/asset_hash.rb +1 -1
  24. data/lib/middleman-core/preview_server/server_ip_address.rb +5 -14
  25. data/lib/middleman-core/rack.rb +2 -1
  26. data/lib/middleman-core/step_definitions/commandline_steps.rb +0 -4
  27. data/lib/middleman-core/step_definitions/middleman_steps.rb +1 -1
  28. data/lib/middleman-core/step_definitions/server_steps.rb +3 -2
  29. data/lib/middleman-core/template_context.rb +3 -3
  30. data/lib/middleman-core/template_renderer.rb +1 -1
  31. data/lib/middleman-core/util/data.rb +28 -0
  32. data/lib/middleman-core/util/paths.rb +2 -1
  33. data/lib/middleman-core/version.rb +1 -1
  34. data/middleman-core.gemspec +8 -6
  35. data/spec/middleman-core/dns_resolver_spec.rb +8 -24
  36. data/spec/spec_helper.rb +0 -3
  37. metadata +52 -1083
  38. data/features/stylus.feature +0 -54
  39. data/lib/middleman-core/renderers/stylus.rb +0 -10
@@ -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
@@ -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
@@ -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
@@ -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.8'.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', '< 6.0'])
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'])
@@ -22,9 +22,7 @@ RSpec.describe Middleman::DnsResolver do
22
22
  context 'when hosts resolver can resolve name' do
23
23
  before :each do
24
24
  expect(hosts_resolver).to receive(:getnames).with(unresolved_ip).and_return(resolved_names)
25
- if RUBY_VERSION >= '2.1'
26
- expect(local_link_resolver).not_to receive(:getnames)
27
- end
25
+ expect(local_link_resolver).not_to receive(:getnames)
28
26
  expect(network_resolver).not_to receive(:getnames)
29
27
  end
30
28
 
@@ -37,12 +35,8 @@ RSpec.describe Middleman::DnsResolver do
37
35
  context 'when local link resolver can resolve name' do
38
36
  before :each do
39
37
  expect(hosts_resolver).to receive(:getnames).with(unresolved_ip).and_return([])
40
- if RUBY_VERSION >= '2.1'
41
- expect(local_link_resolver).to receive(:getnames).with(unresolved_ip).and_return(resolved_names)
42
- expect(network_resolver).not_to receive(:getnames)
43
- else
44
- expect(network_resolver).to receive(:getnames).with(unresolved_ip).and_return(resolved_names)
45
- end
38
+ expect(local_link_resolver).to receive(:getnames).with(unresolved_ip).and_return(resolved_names)
39
+ expect(network_resolver).not_to receive(:getnames)
46
40
  end
47
41
 
48
42
  let(:unresolved_ip) { '127.0.0.1' }
@@ -54,9 +48,7 @@ RSpec.describe Middleman::DnsResolver do
54
48
  context 'when network resolver can resolve name' do
55
49
  before :each do
56
50
  expect(hosts_resolver).to receive(:getnames).with(unresolved_ip).and_return([])
57
- if RUBY_VERSION >= '2.1'
58
- expect(local_link_resolver).to receive(:getnames).with(unresolved_ip).and_return([])
59
- end
51
+ expect(local_link_resolver).to receive(:getnames).with(unresolved_ip).and_return([])
60
52
  expect(network_resolver).to receive(:getnames).with(unresolved_ip).and_return(resolved_names)
61
53
  end
62
54
 
@@ -71,9 +63,7 @@ RSpec.describe Middleman::DnsResolver do
71
63
  context 'when hosts resolver can resolve name' do
72
64
  before :each do
73
65
  expect(hosts_resolver).to receive(:getaddresses).with(unresolved_ips).and_return(resolved_name)
74
- if RUBY_VERSION >= '2.1'
75
- expect(local_link_resolver).not_to receive(:getaddresses)
76
- end
66
+ expect(local_link_resolver).not_to receive(:getaddresses)
77
67
  expect(network_resolver).not_to receive(:getaddresses)
78
68
  end
79
69
 
@@ -86,12 +76,8 @@ RSpec.describe Middleman::DnsResolver do
86
76
  context 'when local link resolver can resolve name' do
87
77
  before :each do
88
78
  expect(hosts_resolver).to receive(:getaddresses).with(unresolved_ips).and_return([])
89
- if RUBY_VERSION >= '2.1'
90
- expect(local_link_resolver).to receive(:getaddresses).with(unresolved_ips).and_return(resolved_name)
91
- expect(network_resolver).not_to receive(:getaddresses)
92
- else
93
- expect(network_resolver).to receive(:getaddresses).with(unresolved_ips).and_return(resolved_name)
94
- end
79
+ expect(local_link_resolver).to receive(:getaddresses).with(unresolved_ips).and_return(resolved_name)
80
+ expect(network_resolver).not_to receive(:getaddresses)
95
81
  end
96
82
 
97
83
  let(:unresolved_ips) { '127.0.0.1' }
@@ -103,9 +89,7 @@ RSpec.describe Middleman::DnsResolver do
103
89
  context 'when network resolver can resolve name' do
104
90
  before :each do
105
91
  expect(hosts_resolver).to receive(:getaddresses).with(unresolved_ips).and_return([])
106
- if RUBY_VERSION >= '2.1'
107
- expect(local_link_resolver).to receive(:getaddresses).with(unresolved_ips).and_return([])
108
- end
92
+ expect(local_link_resolver).to receive(:getaddresses).with(unresolved_ips).and_return([])
109
93
  expect(network_resolver).to receive(:getaddresses).with(unresolved_ips).and_return(resolved_name)
110
94
  end
111
95
 
data/spec/spec_helper.rb CHANGED
@@ -4,9 +4,6 @@ SimpleCov.root(File.expand_path(File.dirname(__FILE__) + '/..'))
4
4
  require 'coveralls'
5
5
  Coveralls.wear!
6
6
 
7
- require 'codeclimate-test-reporter'
8
- CodeClimate::TestReporter.start
9
-
10
7
  require 'aruba/api'
11
8
  RSpec.configure do |config|
12
9
  config.include Aruba::Api