Add PageWithoutAFile class from jekyll plugins (#6556)
Merge pull request 6556
This commit is contained in:
parent
f7b45c4440
commit
38342006a3
|
@ -61,6 +61,7 @@ module Jekyll
|
|||
autoload :ThemeAssetsReader, "jekyll/readers/theme_assets_reader"
|
||||
autoload :LogAdapter, "jekyll/log_adapter"
|
||||
autoload :Page, "jekyll/page"
|
||||
autoload :PageWithoutAFile, "jekyll/page_without_a_file"
|
||||
autoload :PluginManager, "jekyll/plugin_manager"
|
||||
autoload :Publisher, "jekyll/publisher"
|
||||
autoload :Reader, "jekyll/reader"
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Jekyll
|
||||
# A Jekyll::Page subclass to handle processing files without reading it to
|
||||
# determine the page-data and page-content based on Front Matter delimiters.
|
||||
#
|
||||
# The class instance is basically just a bare-bones entity with just
|
||||
# attributes "dir", "name", "path", "url" defined on it.
|
||||
class PageWithoutAFile < Page
|
||||
def read_yaml(*)
|
||||
@data ||= {}
|
||||
end
|
||||
|
||||
def inspect
|
||||
"#<Jekyll:PageWithoutAFile @name=#{name.inspect}>"
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,6 @@
|
|||
---
|
||||
title: Physical file
|
||||
permalink: /physical/
|
||||
---
|
||||
|
||||
A physical file entity
|
|
@ -0,0 +1,159 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require "helper"
|
||||
|
||||
class TestPageWithoutAFile < JekyllUnitTest
|
||||
def setup_page(*args, base: source_dir, klass: PageWithoutAFile)
|
||||
dir, file = args
|
||||
if file.nil?
|
||||
file = dir
|
||||
dir = ""
|
||||
end
|
||||
klass.new(@site, base, dir, file)
|
||||
end
|
||||
|
||||
def render_and_write
|
||||
@site.render
|
||||
@site.cleanup
|
||||
@site.write
|
||||
end
|
||||
|
||||
context "A PageWithoutAFile" do
|
||||
setup do
|
||||
clear_dest
|
||||
@site = Site.new(Jekyll.configuration({
|
||||
"source" => source_dir,
|
||||
"destination" => dest_dir,
|
||||
"skip_config_files" => true,
|
||||
}))
|
||||
end
|
||||
|
||||
context "with default site configuration" do
|
||||
setup do
|
||||
@page = setup_page("properties.html")
|
||||
end
|
||||
|
||||
should "not have page-content and page-data defined within it" do
|
||||
assert_equal "pages", @page.type.to_s
|
||||
assert_nil @page.content
|
||||
assert_empty @page.data
|
||||
end
|
||||
|
||||
should "have basic attributes defined in it" do
|
||||
regular_page = setup_page("properties.html", :klass => Page)
|
||||
basic_attrs = %w(dir name path url)
|
||||
attrs = {
|
||||
"content" => "All the properties.\n",
|
||||
"dir" => "/",
|
||||
"excerpt" => nil,
|
||||
"foo" => "bar",
|
||||
"layout" => "default",
|
||||
"name" => "properties.html",
|
||||
"path" => "properties.html",
|
||||
"permalink" => "/properties/",
|
||||
"published" => nil,
|
||||
"title" => "Properties Page",
|
||||
"url" => "/properties.html",
|
||||
}
|
||||
attrs.each do |prop, value|
|
||||
# assert the props being accessible in a Jekyll::Page instance
|
||||
assert_equal "All the properties.\n", regular_page["content"]
|
||||
assert_equal "properties.html", regular_page["name"]
|
||||
|
||||
# assert differences with Jekyll::PageWithoutAFile instance
|
||||
if basic_attrs.include?(prop)
|
||||
assert_equal @page[prop], value, "For <page[\"#{prop}\"]>:"
|
||||
else
|
||||
assert_nil @page[prop]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "with site-wide permalink configuration" do
|
||||
setup do
|
||||
@site.permalink_style = :title
|
||||
end
|
||||
|
||||
should "generate page url accordingly" do
|
||||
page = setup_page("properties.html")
|
||||
assert_equal "/properties", page.url
|
||||
end
|
||||
end
|
||||
|
||||
context "with default front matter configuration" do
|
||||
setup do
|
||||
@site.config["defaults"] = [
|
||||
{
|
||||
"scope" => {
|
||||
"path" => "",
|
||||
"type" => "pages",
|
||||
},
|
||||
"values" => {
|
||||
"layout" => "default",
|
||||
"author" => "John Doe",
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
@page = setup_page("info.md")
|
||||
end
|
||||
|
||||
should "respect front matter defaults" do
|
||||
assert_nil @page.data["title"]
|
||||
assert_equal "John Doe", @page.data["author"]
|
||||
assert_equal "default", @page.data["layout"]
|
||||
end
|
||||
end
|
||||
|
||||
context "with a path outside site.source" do
|
||||
should "not access its contents" do
|
||||
base = "../../../"
|
||||
page = setup_page("pwd", :base => base)
|
||||
|
||||
assert_equal "pwd", page.path
|
||||
assert_nil page.content
|
||||
end
|
||||
end
|
||||
|
||||
context "while processing" do
|
||||
setup do
|
||||
clear_dest
|
||||
@site.config["title"] = "Test Site"
|
||||
@page = setup_page("physical.html", :base => test_dir("fixtures"))
|
||||
end
|
||||
|
||||
should "recieve content provided to it" do
|
||||
assert_nil @page.content
|
||||
|
||||
@page.content = "{{ site.title }}"
|
||||
assert_equal "{{ site.title }}", @page.content
|
||||
end
|
||||
|
||||
should "not be processed and written to disk at destination" do
|
||||
@page.content = "Lorem ipsum dolor sit amet"
|
||||
@page.data["permalink"] = "/virtual-about/"
|
||||
|
||||
render_and_write
|
||||
|
||||
refute_exist dest_dir("physical")
|
||||
refute_exist dest_dir("virtual-about")
|
||||
refute File.exist?(dest_dir("virtual-about", "index.html"))
|
||||
end
|
||||
|
||||
should "be processed and written to destination when passed as "\
|
||||
"an entry in 'site.pages' array" do
|
||||
@page.content = "{{ site.title }}"
|
||||
@page.data["permalink"] = "/virtual-about/"
|
||||
|
||||
@site.pages << @page
|
||||
render_and_write
|
||||
|
||||
refute_exist dest_dir("physical")
|
||||
assert_exist dest_dir("virtual-about")
|
||||
assert File.exist?(dest_dir("virtual-about", "index.html"))
|
||||
assert_equal "Test Site", File.read(dest_dir("virtual-about", "index.html"))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue