External pipeline manifest helpers (#2528)

* Update middleman-core gemspec deps (allow activesupport 7 usage)

* update lock file

* fix yaml loading

* fix dump for yaml

* update bundler for ruby 3.1

* Array, Hash allowed in safe_load + use CLOCK_MONOTONIC

* Update test deps

* back contracts 0.16.0

* update mini_racer

* fix corrupted cache

* lock contracts gem (patch version break middleman)

* add x86_64-linux platform to lock

* add x86_64-linux and x86_64-darwin-20 platforms to lock

* revert fix corrupted cache

* disable check 3.1 - nokogiri issue

* Support ruby 3.0.0 (commented some contracts)

* Fix rubocop

* no success for 3.1 - mini_racer build error on CI

* be more specific about padrino-helpers

* trying to back 3.1

* try to disable platform fetch

* disable js runtime

* trying to fix https://github.com/simplecov-ruby/simplecov/issues/1003

* `Trying to back min_racer

* No success with min_racer

* remove comments, move in correct place openssl

* Support manifest json for external pipeline

* Support manifest json helpers for external pipeline

* Add tests for external pipeline helpers

* Add tests for external pipeline helpers, more cases

* Add tests for external pipeline helpers, more cases
This commit is contained in:
Alexey Vasiliev 2022-01-30 19:44:54 +02:00 committed by GitHub
parent 97ddbc52ea
commit f9f92dd52b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
35 changed files with 266 additions and 175 deletions

View File

@ -10,7 +10,7 @@ jobs:
strategy:
matrix:
os: [ubuntu, macos]
ruby-version: ['3.0', 2.7]
ruby-version: ['3.1', '3.0']
steps:
- uses: actions/checkout@v2
- name: Set up Ruby

10
Gemfile
View File

@ -8,10 +8,10 @@ gem 'yard', '~> 0.9.27', require: false
# Test tools
gem 'addressable', '~> 2.8', require: false
gem 'aruba', '~> 1.0.4', require: false
gem 'aruba', '~> 2', require: false
gem 'byebug'
gem 'capybara', '~> 3.36.0', require: false
gem 'cucumber', '~> 5.3', require: false
gem 'cucumber', '~> 7', require: false
gem 'rspec', '~> 3.10', require: false
# Pry tools
@ -25,17 +25,13 @@ gem 'haml', '>= 4.0.5', require: false
gem 'kramdown', '~> 2.3', require: false
gem 'liquid', '>= 3.0', require: false
gem 'redcarpet', '>= 3.1', require: false
gem 'sassc', '~> 2.4', require: false
gem 'sassc', '~> 2', require: false
gem 'sinatra', '>= 2.0.0.beta2', require: false
gem 'slim', '>= 2.0', require: false
# Dns server to test preview server
gem 'rubydns', '~> 2.0.2', require: false
# For less, note there is no compatible JS runtime for windows
gem 'mini_racer', '~> 0.4.0', platforms: :ruby
gem 'therubyrhino', '>= 2.0', platforms: :jruby
# Code Quality
gem 'rubocop', '~> 1.24', require: false
gem 'rubocop-performance', '~> 1.13', require: false

View File

@ -9,56 +9,56 @@ PATH
specs:
middleman-core (5.0.0.rc.2)
activesupport (>= 5.0.0)
addressable (~> 2.3)
addressable (~> 2)
bundler
contracts (~> 0.16.0)
contracts (~> 0.17)
dotenv
erubis
execjs (~> 2.0)
fastimage (~> 2.0)
hamster (~> 3.0)
hashie (~> 4.0)
i18n (~> 0.9.0)
listen (~> 3.0)
memoist (~> 0.14)
oj (~> 3.7)
padrino-helpers (~> 0.14.4)
execjs (~> 2)
fastimage (~> 2)
hamster (~> 3)
hashie (~> 5)
i18n (~> 1)
listen (~> 3)
memoist (~> 0)
oj (~> 3)
padrino-helpers (~> 0.15.0)
parallel
rack (>= 1.4.5, < 3)
rgl (~> 0.5.3)
sassc (~> 2.0)
rgl (~> 0.5)
sassc (~> 2)
servolux
tilt (~> 2.0.9)
toml
uglifier (~> 4.1)
uglifier (~> 4)
webrick
GEM
remote: https://rubygems.org/
specs:
activesupport (6.0.3.4)
activesupport (7.0.0)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
tzinfo (~> 1.1)
zeitwerk (~> 2.2, >= 2.2.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
addressable (2.8.0)
public_suffix (>= 2.0.2, < 5.0)
aruba (1.0.4)
aruba (2.0.0)
bundler (>= 1.17, < 3.0)
childprocess (>= 2.0, < 5.0)
contracts (~> 0.16.0)
cucumber (>= 2.4, < 6.0)
contracts (>= 0.16.0, < 0.18.0)
cucumber (>= 4.0, < 8.0)
rspec-expectations (~> 3.4)
thor (~> 1.0)
ast (2.4.2)
async (1.28.2)
async (1.30.1)
console (~> 1.10)
nio4r (~> 2.3)
timers (~> 4.1)
async-dns (1.2.5)
async-dns (1.3.0)
async-io (~> 1.15)
async-io (1.30.1)
async (~> 1.14)
async-io (1.32.2)
async
binding_of_caller (1.0.0)
debug_inspector (>= 0.0.1)
builder (3.2.4)
@ -72,55 +72,55 @@ GEM
rack-test (>= 0.6.3)
regexp_parser (>= 1.5, < 3.0)
xpath (~> 3.2)
childprocess (4.0.0)
childprocess (4.1.0)
coderay (1.1.3)
coffee-script (2.4.1)
coffee-script-source
execjs
coffee-script-source (1.12.2)
concurrent-ruby (1.1.8)
console (1.10.1)
concurrent-ruby (1.1.9)
console (1.14.0)
fiber-local
contracts (0.16.0)
cucumber (5.3.0)
contracts (0.17)
cucumber (7.1.0)
builder (~> 3.2, >= 3.2.4)
cucumber-core (~> 8.0, >= 8.0.1)
cucumber-create-meta (~> 2.0, >= 2.0.2)
cucumber-cucumber-expressions (~> 10.3, >= 10.3.0)
cucumber-gherkin (~> 15.0, >= 15.0.2)
cucumber-html-formatter (~> 9.0, >= 9.0.0)
cucumber-messages (~> 13.1, >= 13.1.0)
cucumber-wire (~> 4.0, >= 4.0.1)
cucumber-core (~> 10.1, >= 10.1.0)
cucumber-create-meta (~> 6.0, >= 6.0.1)
cucumber-cucumber-expressions (~> 14.0, >= 14.0.0)
cucumber-gherkin (~> 22.0, >= 22.0.0)
cucumber-html-formatter (~> 17.0, >= 17.0.0)
cucumber-messages (~> 17.1, >= 17.1.1)
cucumber-wire (~> 6.2, >= 6.2.0)
diff-lcs (~> 1.4, >= 1.4.4)
mime-types (~> 3.3, >= 3.3.1)
multi_test (~> 0.1, >= 0.1.2)
sys-uname (~> 1.2, >= 1.2.1)
cucumber-core (8.0.1)
cucumber-gherkin (~> 15.0, >= 15.0.2)
cucumber-messages (~> 13.0, >= 13.0.1)
cucumber-tag-expressions (~> 2.0, >= 2.0.4)
cucumber-create-meta (2.0.4)
cucumber-messages (~> 13.1, >= 13.1.0)
sys-uname (~> 1.2, >= 1.2.1)
cucumber-cucumber-expressions (10.3.0)
cucumber-gherkin (15.0.2)
cucumber-messages (~> 13.0, >= 13.0.1)
cucumber-html-formatter (9.0.0)
cucumber-messages (~> 13.0, >= 13.0.1)
cucumber-messages (13.2.1)
protobuf-cucumber (~> 3.10, >= 3.10.8)
cucumber-tag-expressions (2.0.4)
cucumber-wire (4.0.1)
cucumber-core (~> 8.0, >= 8.0.1)
cucumber-cucumber-expressions (~> 10.3, >= 10.3.0)
cucumber-messages (~> 13.0, >= 13.0.1)
debug_inspector (1.0.0)
diff-lcs (1.4.4)
docile (1.3.5)
sys-uname (~> 1.2, >= 1.2.2)
cucumber-core (10.1.0)
cucumber-gherkin (~> 22.0, >= 22.0.0)
cucumber-messages (~> 17.1, >= 17.1.1)
cucumber-tag-expressions (~> 4.0, >= 4.0.2)
cucumber-create-meta (6.0.4)
cucumber-messages (~> 17.1, >= 17.1.1)
sys-uname (~> 1.2, >= 1.2.2)
cucumber-cucumber-expressions (14.0.0)
cucumber-gherkin (22.0.0)
cucumber-messages (~> 17.1, >= 17.1.1)
cucumber-html-formatter (17.0.0)
cucumber-messages (~> 17.1, >= 17.1.0)
cucumber-messages (17.1.1)
cucumber-tag-expressions (4.1.0)
cucumber-wire (6.2.0)
cucumber-core (~> 10.1, >= 10.1.0)
cucumber-cucumber-expressions (~> 14.0, >= 14.0.0)
cucumber-messages (~> 17.1, >= 17.1.1)
debug_inspector (1.1.0)
diff-lcs (1.5.0)
docile (1.4.0)
dotenv (2.7.6)
erubis (2.7.0)
execjs (2.7.0)
fastimage (2.2.3)
ffi (1.14.2)
execjs (2.8.1)
fastimage (2.2.6)
ffi (1.15.4)
fiber-local (1.0.0)
generator (0.0.1)
haml (5.2.2)
@ -128,49 +128,43 @@ GEM
tilt
hamster (3.0.0)
concurrent-ruby (~> 1.0)
hashie (4.1.0)
i18n (0.9.5)
hashie (5.0.0)
i18n (1.8.11)
concurrent-ruby (~> 1.0)
interception (0.5)
kramdown (2.3.1)
rexml
lazy_priority_queue (0.1.1)
libv8-node (15.14.0.1)
liquid (5.1.0)
listen (3.4.1)
listen (3.7.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
matrix (0.4.2)
memoist (0.16.2)
method_source (1.0.0)
middleware (0.1.0)
mime-types (3.4.1)
mime-types-data (~> 3.2015)
mime-types-data (3.2021.1115)
mini_mime (1.1.2)
mini_portile2 (2.6.1)
mini_racer (0.4.0)
libv8-node (~> 15.14.0.0)
minitest (5.14.3)
minitest (5.15.0)
multi_test (0.1.2)
mustermann (1.1.1)
ruby2_keywords (~> 0.0.1)
nio4r (2.5.4)
nio4r (2.5.8)
nokogiri (1.12.5)
mini_portile2 (~> 2.6.1)
racc (~> 1.4)
oj (3.11.2)
padrino-helpers (0.14.4)
i18n (~> 0.6, >= 0.6.7)
padrino-support (= 0.14.4)
oj (3.13.10)
padrino-helpers (0.15.1)
i18n (>= 0.6.7, < 2)
padrino-support (= 0.15.1)
tilt (>= 1.4.1, < 3)
padrino-support (0.14.4)
padrino-support (0.15.1)
parallel (1.21.0)
parser (3.1.0.0)
ast (~> 2.4.1)
parslet (1.8.2)
protobuf-cucumber (3.10.8)
activesupport (>= 3.2)
middleware
thor
thread_safe
parslet (2.0.0)
pry (0.14.1)
coderay (~> 1.1)
method_source (~> 1.0)
@ -189,7 +183,7 @@ GEM
rack (>= 1.0, < 3)
rainbow (3.0.0)
rake (13.0.6)
rb-fsevent (0.10.4)
rb-fsevent (0.11.0)
rb-inotify (0.10.1)
ffi (~> 1.0)
redcarpet (3.5.1)
@ -207,7 +201,7 @@ GEM
rspec-expectations (3.10.1)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.10.0)
rspec-mocks (3.10.1)
rspec-mocks (3.10.2)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.10.0)
rspec-support (3.10.2)
@ -226,7 +220,7 @@ GEM
rubocop (>= 1.7.0, < 2.0)
rubocop-ast (>= 0.4.0)
ruby-progressbar (1.11.0)
ruby2_keywords (0.0.2)
ruby2_keywords (0.0.5)
rubydns (2.0.2)
async-dns (~> 1.0)
sassc (2.4.0)
@ -237,7 +231,7 @@ GEM
simplecov-html (~> 0.11)
simplecov_json_formatter (~> 0.1)
simplecov-html (0.12.3)
simplecov_json_formatter (0.1.2)
simplecov_json_formatter (0.1.3)
sinatra (2.1.0)
mustermann (~> 1.0)
rack (~> 2.2)
@ -252,13 +246,12 @@ GEM
ffi (~> 1.1)
temple (0.8.2)
thor (1.1.0)
thread_safe (0.3.6)
tilt (2.0.10)
timers (4.3.2)
toml (0.2.0)
parslet (~> 1.8.0)
tzinfo (1.2.9)
thread_safe (~> 0.1)
timers (4.3.3)
toml (0.3.0)
parslet (>= 1.8.0, < 3.0.0)
tzinfo (2.0.4)
concurrent-ruby (~> 1.0)
uglifier (4.2.0)
execjs (>= 0.3.0, < 3)
unicode-display_width (2.1.0)
@ -267,24 +260,22 @@ GEM
nokogiri (~> 1.8)
yard (0.9.27)
webrick (~> 1.7.0)
zeitwerk (2.4.2)
PLATFORMS
ruby
DEPENDENCIES
addressable (~> 2.8)
aruba (~> 1.0.4)
aruba (~> 2)
byebug
capybara (~> 3.36.0)
coffee-script (~> 2.2)
cucumber (~> 5.3)
cucumber (~> 7)
haml (>= 4.0.5)
kramdown (~> 2.3)
liquid (>= 3.0)
middleman-cli!
middleman-core!
mini_racer (~> 0.4.0)
pry
pry-rescue
pry-stack_explorer
@ -294,12 +285,11 @@ DEPENDENCIES
rubocop (~> 1.24)
rubocop-performance (~> 1.13)
rubydns (~> 2.0.2)
sassc (~> 2.4)
sassc (~> 2)
simplecov (~> 0.21)
sinatra (>= 2.0.0.beta2)
slim (>= 2.0)
therubyrhino (>= 2.0)
yard (~> 0.9.27)
BUNDLED WITH
2.2.3
2.3.4

View File

@ -1,7 +1,7 @@
SimpleCov.start do
SimpleCov.configure do
add_filter '/fixtures/'
add_filter '/features/'
add_filter '/spec/'
add_filter '/step_definitions/'
add_filter '/lib/vendored-middleman-deps/'
end
end

View File

@ -16,7 +16,7 @@ Gem::Specification.new do |s|
s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(fixtures|features|spec)/}) }
s.executable = 'middleman'
s.require_path = 'lib'
s.required_ruby_version = '>= 2.5.0'
s.required_ruby_version = '>= 3.0.0'
# CLI
s.add_dependency('thor', ['>= 0.17.0', '< 2.0'])

View File

@ -1,7 +1,7 @@
SimpleCov.start do
SimpleCov.configure do
add_filter '/fixtures/'
add_filter '/features/'
add_filter '/spec/'
add_filter '/step_definitions/'
add_filter '/lib/vendored-middleman-deps/'
end
end

View File

@ -25,7 +25,7 @@ Feature: Alternate between multiple asset hosts
And a file named "config.rb" with:
"""
activate :asset_host, host: Proc.new { |asset|
hash = Digest::MD5.digest(asset).bytes.map!(&:ord).reduce(&:+)
hash = Digest::SHA256.digest(asset).bytes.map!(&:ord).reduce(&:+)
"http://assets%d.example.com" % (hash % 4)
}
"""

View File

@ -52,6 +52,14 @@ Feature: Builder
When I run `middleman b`
Then was successfully built
Scenario: Build external_pipeline with helpers
Given a successfully built app at "external-pipeline-helpers"
When I cd to "build"
And the file "index.html" should contain '<link href="/app-553d121b3246dc3ea415.css" rel="stylesheet" media="all" />'
And the file "index.html" should contain '<script src="/app-6427c0e37380b2306421.js" async="async"></script>'
And the file "another-file.html" should contain '<link href="/app-553d121b3246dc3ea415.css" rel="stylesheet" />'
And the file "another-file.html" should contain '<script src="/app-6427c0e37380b2306421.js"></script>'
Scenario: Builded text file(ex: html, css, xml, txt)'s permission is 0644
Given a successfully built app at "large-build-app"
When I cd to "build"

View File

@ -1,4 +1,4 @@
# frozen_string_literal: true
data.store :static_array, ::YAML.load_file(File.expand_path('static_array.yml', File.dirname(__FILE__)))
data.store :static_hash, ::YAML.load_file(File.expand_path('static_hash.yml', File.dirname(__FILE__)))
data.store :static_array, ::YAML.safe_load(File.read(File.expand_path('static_array.yml', File.dirname(__FILE__))), permitted_classes: [Date, Time, DateTime, Symbol, Regexp], aliases: true)
data.store :static_hash, ::YAML.safe_load(File.read(File.expand_path('static_hash.yml', File.dirname(__FILE__))), permitted_classes: [Date, Time, DateTime, Symbol, Regexp], aliases: true)

View File

@ -0,0 +1,3 @@
body {
font-family: 'Courier New', Courier, monospace;
}

View File

@ -0,0 +1 @@
console.log('Hello')

View File

@ -0,0 +1,15 @@
# frozen_string_literal: true
activate :external_pipeline,
name: :assets,
command: 'echo "Done"',
source: Dir.mktmpdir,
latency: 2,
manifest_json: File.expand_path('manifest.json', __dir__)
activate :external_pipeline,
name: :different_pipeline,
command: 'echo "Done"',
source: Dir.mktmpdir,
latency: 2,
manifest_json: File.expand_path('different_manifest.json', __dir__)

View File

@ -0,0 +1,8 @@
{
"app.js": {
"file": "/app-6427c0e37380b2306421.js",
"css": [
"/app-553d121b3246dc3ea415.css"
]
}
}

View File

@ -0,0 +1,10 @@
{
"app.css": {
"src": "/app-553d121b3246dc3ea415.css",
"integrity": "sha256-owU0/VSxjr/sZKK0WZQJzevzgcUEzXvPcBZFiUGzJFg="
},
"app.js": {
"src": "/app-6427c0e37380b2306421.js",
"integrity": "sha256-0PLWRauwxSW9A9b9VOa9TPyDj3gRGfxyKRhTVBKN0EM="
}
}

View File

@ -0,0 +1,2 @@
<%= external_pipeline_stylesheet_tag :different_pipeline, ['app.js', 'css', 0] %>
<%= external_pipeline_javascript_tag :different_pipeline, ['app.js', 'file'] %>

View File

@ -0,0 +1,2 @@
<%= external_pipeline_stylesheet_tag :assets, ['app.css', 'src'], media: 'all' %>
<%= external_pipeline_javascript_tag :assets, ['app.js', 'src'], async: 'async' %>

View File

@ -54,8 +54,8 @@ module Middleman
end
# Needed so that method_missing makes sense
def respond_to?(method, include_private = false)
super || defines_setting?(method) || (method =~ /^(\w+)=$/ && defines_setting?(Regexp.last_match(1)))
def respond_to_missing?(method, include_private = false)
defines_setting?(method) || (method =~ /^(\w+)=$/ && defines_setting?(Regexp.last_match(1))) || super
end
# Does this configuration manager know about the setting identified by key?

View File

@ -52,22 +52,18 @@ module Middleman
@leaves.clear
end
Contract Symbol, LazyCollectorStep => Any
def register_collector(label, endpoint)
@collectors_by_name[label] = endpoint
end
Contract LazyCollectorRoot
def sitemap_collector
live_collector { |_, resources| resources.to_a }
end
Contract LazyCollectorRoot
def data_collector
live_collector { |app, _| app.data }
end
Contract Proc => LazyCollectorRoot
def live_collector(&block)
root = LazyCollectorRoot.new(self)

View File

@ -6,6 +6,8 @@ module Middleman
module CoreExtensions
module Collections
class LazyCollectorRoot < BasicObject
DELEGATE = %i[hash eql? is_a? puts p].freeze
def initialize(parent)
@data = nil
@parent = parent
@ -24,8 +26,14 @@ module Middleman
end
def method_missing(name, *args, &block)
return ::Kernel.send(name, *args, &block) if DELEGATE.include? name
LazyCollectorStep.new(name, args, block, self)
end
def respond_to_missing?(_method_name, _include_private = false)
true
end
end
end
end

View File

@ -4,7 +4,7 @@ module Middleman
module CoreExtensions
module Collections
class LazyCollectorStep < BasicObject
DELEGATE = %i[hash eql?].freeze
DELEGATE = %i[hash eql? is_a? puts p].freeze
def initialize(name, args, block, parent = nil)
@name = name
@ -46,6 +46,10 @@ module Middleman
LazyCollectorStep.new(name, args, block, self)
end
def respond_to_missing?(_method_name, _include_private = false)
true
end
end
end
end

View File

@ -30,6 +30,12 @@ module Middleman
@app.config_context.send(name, *args, &block)
end
end
def respond_to_missing?(method_name, include_private = false)
return super if method_name.to_s.start_with?('_internal_')
respond_to?(:"_internal_#{method_name}") || super
end
end
end
end

View File

@ -94,8 +94,8 @@ module Middleman
end
# Needed so that method_missing makes sense
def respond_to?(method, include_private = false)
super || key?(method)
def respond_to_missing?(method, include_private = false)
key?(method) || super
end
# Convert all the data into a static hash

View File

@ -65,8 +65,8 @@ module Middleman
end
# Needed so that method_missing makes sense
def respond_to?(method, include_private = false)
super || @ctx.internal_data_store.key?(method)
def respond_to_missing?(method, include_private = false)
@ctx.internal_data_store.key?(method) || super
end
end
end

View File

@ -3,6 +3,7 @@
require 'hamster'
require 'set'
require 'pathname'
require 'date'
require 'yaml'
require 'fileutils'
require 'middleman-core/contracts'
@ -55,7 +56,7 @@ module Middleman
Contract String => Graph
def parse_yaml(file_path)
::YAML.load_file(file_path)
::YAML.safe_load(File.read(file_path), permitted_classes: [Date, Time, DateTime, Symbol, Regexp], aliases: true)
rescue StandardError, ::Psych::SyntaxError => e
warn "YAML Exception parsing dependency graph: #{e.message}"
end

View File

@ -9,6 +9,46 @@ class Middleman::Extensions::ExternalPipeline < ::Middleman::Extension
option :latency, 0.25, 'Latency between refreshes of source'
option :disable_background_execution, false, "Don't run the command in a separate background thread"
option :ignore_exit_code, false, 'Ignore exit code for restart or stop of a command'
option :manifest_json, nil, 'JSON file, which contain information about external assets paths'
helpers do
def external_pipeline_manifest_value(pipeline_name, path = [])
return @cached_manifest[pipeline_name].dig(*path) if build? && @cached_manifest&.key?(pipeline_name)
selected_extension = extensions[:external_pipeline].find { |_k, ep| ep.options[:name] == pipeline_name }&.last
if selected_extension.nil?
raise [
"Couldn't find external pipeline with name #{pipeline_name}.",
"Have only #{extensions[:external_pipeline].values.map { |ep| ep.options[:name] }.inspect}"
].join(' ')
end
manifest_json = selected_extension.options[:manifest_json]
raise "Couldn't find manifest_json file at path #{manifest_json}" if manifest_json.nil? || !File.exist?(manifest_json)
manifest_content = if build?
@cached_manifest ||= {}
@cached_manifest[pipeline_name] ||= JSON.parse(File.read(manifest_json))
@cached_manifest[pipeline_name]
else
JSON.parse(File.read(manifest_json)) # no caching for dev
end
manifest_content.dig(*path)
end
def external_pipeline_javascript_tag(pipeline_name, path = [], options = {})
content_tag(:script, nil, {
src: external_pipeline_manifest_value(pipeline_name, path)
}.update(options))
end
def external_pipeline_stylesheet_tag(pipeline_name, path = [], options = {})
tag(:link, {
href: external_pipeline_manifest_value(pipeline_name, path),
rel: 'stylesheet'
}.update(options))
end
end
def initialize(app, options_hash = ::Middleman::EMPTY_HASH, &block)
super

View File

@ -25,30 +25,30 @@
</p>
<h2 id="core">Core Configuration</h2>
<ul class="settings">
<% global_config.each do |setting| %>
<li class="setting"><%= setting.render %></li>
<% end %>
<%- global_config.each do |setting| -%>
<li class="setting"><%= setting.render %></li>
<%- end -%>
</ul>
<h2 id="extensions">Extensions</h2>
<ul class="extensions">
<% [extension_config, auto_activated_config].each do |extensions| %>
<% extensions.each do |ext_name, configs| %>
<li>
<% registered_extensions.delete(ext_name) %>
<span class="extension active">:<%= ext_name %></span>
<% if configs && !configs.empty? %>
<ul class="settings">
<% configs.each do |setting| %>
<li class="setting"><%= setting.render %></li>
<% end %>
</ul>
<% end %>
</li>
<% end %>
<% end %>
<% registered_extensions.keys.each do |ext_name| %>
<li><span class="extension inactive"><%= ext_name.inspect %></span></li>
<% end %>
<%- [extension_config, auto_activated_config].each do |extensions| -%>
<%- extensions.each do |ext_name, configs| -%>
<li>
<%- registered_extensions.delete(ext_name) -%>
<span class="extension active">:<%= ext_name %></span>
<%- if configs && !configs.empty? -%>
<ul class="settings">
<%- configs.each do |setting| -%>
<li class="setting"><%= setting.render %></li>
<%- end -%>
</ul>
<%- end -%>
</li>
<%- end -%>
<%- end -%>
<%- registered_extensions.keys.each do |ext_name| -%>
<li><span class="extension inactive"><%= ext_name.inspect %></span></li>
<%- end -%>
</ul>
</article>
</div>

View File

@ -21,7 +21,7 @@
<a href="https://middlemanapp.com/advanced/sitemap/">the sitemap</a>,
Middleman's view of your site.
</p>
<%= sitemap_tree.render %>
<%= sitemap_tree.render %>
</article>
</div>
</body>

View File

@ -1,6 +1,5 @@
# frozen_string_literal: true
require 'openssl'
require 'middleman-core/meta_pages'
require 'middleman-core/logger'
require 'middleman-core/rack'

View File

@ -1,5 +1,6 @@
# frozen_string_literal: true
require 'openssl'
require 'webrick'
require 'webrick/https'

View File

@ -87,7 +87,7 @@ module Middleman
# @param [Rack::Request] req
# @param [Rack::Response] res
def process_request(env, req, res)
start_time = Time.now
start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
request_path = Addressable::URI.unencode(env['PATH_INFO'].dup)
if request_path.respond_to? :force_encoding
@ -120,7 +120,7 @@ module Middleman
end
# End the request
logger.debug "== Finishing Request: #{resource.destination_path} (#{(Time.now - start_time).round(2)}s)"
logger.debug "== Finishing Request: #{resource.destination_path} (#{(Process.clock_gettime(Process::CLOCK_MONOTONIC) - start_time).round(2)}s)"
halt res.finish
end

View File

@ -204,7 +204,7 @@ module Middleman
# Render this resource
# @return [String]
Contract Hash, Hash, Maybe[Proc] => String
Contract Maybe[Hash], Maybe[Hash], Maybe[Proc] => String
def render(options_hash = ::Middleman::EMPTY_HASH, locs = ::Middleman::EMPTY_HASH, &_block)
@vertices = ::Hamster::Set.empty

View File

@ -1,5 +1,6 @@
# frozen_string_literal: true
require 'date'
require 'yaml'
require 'json'
require 'toml'
@ -126,7 +127,7 @@ module Middleman
def parse_yaml(content, full_path)
c = begin
::Middleman::Util.instrument 'parse.yaml' do
::YAML.load(content)
::YAML.safe_load(content, permitted_classes: [Date, Time, DateTime, Symbol, Regexp], aliases: true)
end
rescue StandardError, ::Psych::SyntaxError => e
warn "YAML Exception parsing #{full_path}: #{e.message}"

View File

@ -15,7 +15,7 @@ Gem::Specification.new do |s|
s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(fixtures|features|spec)/}) }
s.require_path = 'lib'
s.required_ruby_version = '>= 2.5.0'
s.required_ruby_version = '>= 3.0.0'
# Core
s.add_dependency('bundler')
@ -25,39 +25,39 @@ Gem::Specification.new do |s|
s.add_dependency('parallel')
s.add_dependency('servolux')
s.add_dependency('dotenv')
s.add_dependency('rgl', ['~> 0.5.3'])
s.add_dependency('rgl', ['~> 0.5'])
s.add_dependency('toml')
s.add_dependency('webrick')
# Helpers
s.add_dependency('activesupport', ['>= 5.0.0'])
s.add_dependency('padrino-helpers', ['~> 0.14.4'])
s.add_dependency('addressable', ['~> 2.3'])
s.add_dependency('memoist', ['~> 0.14'])
s.add_dependency('padrino-helpers', ['~> 0.15.0'])
s.add_dependency('addressable', ['~> 2'])
s.add_dependency('memoist', ['~> 0'])
# Watcher
s.add_dependency('listen', ['~> 3.0'])
s.add_dependency('listen', ['~> 3'])
# i18n
s.add_dependency('i18n', ['~> 0.9.0'])
s.add_dependency('i18n', ['~> 1'])
# Automatic Image Sizes
s.add_dependency('fastimage', ['~> 2.0'])
s.add_dependency('fastimage', ['~> 2'])
# Sass and Minify CSS
s.add_dependency('sassc', ['~> 2.0'])
s.add_dependency('sassc', ['~> 2'])
# Minify JS
s.add_dependency('uglifier', ['~> 4.1'])
s.add_dependency('execjs', ['~> 2.0'])
s.add_dependency('uglifier', ['~> 4'])
s.add_dependency('execjs', ['~> 2'])
# Perf
s.add_dependency('oj', ['~> 3.7'])
s.add_dependency('oj', ['~> 3'])
# Testing
s.add_dependency('contracts', ['~> 0.16.0'])
s.add_dependency('contracts', ['~> 0.17'])
# Hash stuff
s.add_dependency('hashie', ['~> 4.0'])
s.add_dependency('hamster', ['~> 3.0'])
s.add_dependency('hashie', ['~> 5'])
s.add_dependency('hamster', ['~> 3'])
end

View File

@ -1,5 +1,5 @@
SimpleCov.start do
SimpleCov.configure do
add_filter '/fixtures/'
add_filter '/features/'
add_filter '/spec/'
end
end

View File

@ -16,12 +16,12 @@ Gem::Specification.new do |s|
s.files = `git ls-files -z`.split("\0")
s.test_files = `git ls-files -z -- {fixtures,features}/*`.split("\0")
s.require_path = 'lib'
s.required_ruby_version = '>= 2.5.0'
s.required_ruby_version = '>= 3.0.0'
s.add_dependency('middleman-core', Middleman::VERSION)
s.add_dependency('middleman-cli', Middleman::VERSION)
s.add_dependency('haml', ['>= 4.0.5'])
s.add_dependency('coffee-script', ['~> 2.2'])
s.add_dependency('coffee-script', ['~> 2.4'])
s.add_dependency('kramdown', ['~> 2.3'])
s.add_dependency('webrick', ['~> 1.7'])
end