pandorga 1.5.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +51 -0
- data/README.md +1 -1
- data/_includes/chord-tab.html +7 -7
- data/_includes/content-runtime/41-listing-helpers.html +7 -0
- data/_includes/content-runtime/43-blocks.html +4 -3
- data/_includes/content-runtime/60-fragments.html +77 -11
- data/_includes/page/site-footer.html +3 -2
- data/_includes/theme/critical-preload.html +35 -0
- data/_includes/theme/json-ld.html +35 -0
- data/_includes/transcription.html +5 -5
- data/_layouts/articles.html +8 -2
- data/_layouts/cv.html +20 -14
- data/_layouts/home.html +23 -3
- data/_layouts/shell.html +53 -12
- data/assets/css/ledger/chrome.css +23 -0
- data/assets/css/ledger/cv.css +13 -0
- data/assets/css/ledger/home.css +27 -20
- data/assets/css/ledger/writing.css +27 -3
- data/assets/css/tailwind.css +3 -0
- data/assets/tailwind-play.js +2 -1
- data/lib/pandorga/commands/doctor.rb +3 -1
- data/lib/pandorga/commands/new.rb +1 -1
- data/lib/pandorga/discovery.rb +78 -0
- data/lib/pandorga/jekyll/plugins/discovery.rb +32 -0
- data/lib/pandorga/version.rb +1 -1
- data/scripts/cdn-allowlist.json +2 -5
- data/scripts/tailwind/build.sh +19 -0
- data/scripts/tailwind/input.css +12 -0
- data/scripts/tailwind/tailwind.config.js +102 -0
- data/scripts/test/render-parity/blocks/project-inventory-row.json +3 -2
- data/scripts/test/test-css-delivery.rb +32 -0
- data/scripts/test/test-css-structure.rb +8 -0
- data/scripts/test/test-discovery.rb +46 -0
- data/scripts/test/test-doctor.rb +38 -0
- data/scripts/test/test-examples-build.rb +15 -0
- data/scripts/test/test-hero-portraits.mjs +1 -1
- data/scripts/test/test-hydrate-reserve.rb +64 -0
- data/scripts/test/test-new.rb +11 -0
- data/scripts/test/test-shell-a11y.rb +30 -0
- data/scripts/test/test-template-packages.rb +8 -0
- data/scripts/test/test-validate-allowlist.rb +29 -0
- data/scripts/validate.sh +7 -1
- metadata +14 -2
- data/assets/css/cv.css +0 -13
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Stylesheet delivery (PLT-AC-19).
|
|
5
|
+
# The Play CDN blocked first paint, and every page linked every ledger sheet.
|
|
6
|
+
|
|
7
|
+
require "pathname"
|
|
8
|
+
|
|
9
|
+
ROOT = Pathname.new(__dir__).join("..", "..").expand_path
|
|
10
|
+
|
|
11
|
+
def fail!(message)
|
|
12
|
+
warn "FAIL test-css-delivery: #{message}"
|
|
13
|
+
exit 1
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
shell = ROOT.join("_layouts/shell.html").read
|
|
17
|
+
css = ROOT.join("assets/css/tailwind.css").read
|
|
18
|
+
|
|
19
|
+
fail!("shell still loads the Tailwind Play CDN") if shell.include?("cdn.tailwindcss.com")
|
|
20
|
+
fail!("shell still loads tailwind-play.js") if shell.include?("tailwind-play.js")
|
|
21
|
+
fail!("shell does not link the compiled utilities") unless shell.include?('href="/assets/css/tailwind.css"')
|
|
22
|
+
fail!("shell still links every ledger sheet") if shell.include?('sheet.path contains "/assets/css/ledger/"')
|
|
23
|
+
fail!("shell still links the empty cv.css") if shell.include?('href="/assets/css/cv.css"')
|
|
24
|
+
fail!("empty cv.css is still in the tree") if ROOT.join("assets/css/cv.css").exist?
|
|
25
|
+
fail!("home layout has no ledger sheet") unless shell.include?('when "home"') && shell.include?('assign _ledger = "home"')
|
|
26
|
+
fail!("articles layout misses the writing sheet") unless shell.include?("writing|detail")
|
|
27
|
+
fail!("shared chrome is not always linked") unless shell.include?("ledger/chrome.css") && shell.include?("ledger/footer.css")
|
|
28
|
+
fail!("compiled utilities are missing flex") unless css.include?(".flex{")
|
|
29
|
+
fail!("compiled utilities dropped the separator tint") unless css.include?("bg-outline-variant\\/30")
|
|
30
|
+
fail!("compiled utilities dropped the dev-reexport border") unless css.include?("border-tertiary\\/40")
|
|
31
|
+
|
|
32
|
+
puts "PASS test-css-delivery"
|
|
@@ -64,6 +64,14 @@ sheets.each do |path|
|
|
|
64
64
|
errors << "#{relative}: #{depth} unclosed brace(s) — every rule after the " \
|
|
65
65
|
"offending block is swallowed and silently stops applying"
|
|
66
66
|
end
|
|
67
|
+
|
|
68
|
+
if cleaned.match?(/\{[ \t\r\n]*\}/)
|
|
69
|
+
errors << "#{relative}: empty ruleset (a block that matches nothing)"
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
if source.include?("home-profile-summary")
|
|
73
|
+
errors << "#{relative}: .home-profile-summary is unused"
|
|
74
|
+
end
|
|
67
75
|
end
|
|
68
76
|
|
|
69
77
|
fail!("CSS structure problems:\n - #{errors.join("\n - ")}") unless errors.empty?
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Portrait sources and discovery documents (PLT-AC-20, PLT-AC-21).
|
|
5
|
+
|
|
6
|
+
require "pathname"
|
|
7
|
+
|
|
8
|
+
require_relative "../../lib/pandorga/discovery"
|
|
9
|
+
|
|
10
|
+
ROOT = Pathname.new(__dir__).join("..", "..").expand_path
|
|
11
|
+
|
|
12
|
+
def fail!(message)
|
|
13
|
+
warn "FAIL test-discovery: #{message}"
|
|
14
|
+
exit 1
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
origin = Pandorga::Discovery.origin(
|
|
18
|
+
"url" => "https://fallback.example",
|
|
19
|
+
"pandorga" => { "identity" => { "url" => "https://example.com/" } }
|
|
20
|
+
)
|
|
21
|
+
fail!("identity.url must win over site.url") unless origin == "https://example.com"
|
|
22
|
+
|
|
23
|
+
paths = Pandorga::Discovery.public_paths([
|
|
24
|
+
{ "url" => "/", "data" => {} },
|
|
25
|
+
{ "url" => "/pages/articles/", "data" => {} },
|
|
26
|
+
{ "url" => "/sitemap.xml", "data" => {} },
|
|
27
|
+
{ "url" => "/secret/", "data" => { "sitemap" => false } }
|
|
28
|
+
])
|
|
29
|
+
fail!("sitemap filtering is wrong: #{paths.inspect}") unless paths == ["/", "/pages/articles/"]
|
|
30
|
+
|
|
31
|
+
xml = Pandorga::Discovery.sitemap_xml("https://example.com", paths)
|
|
32
|
+
fail!("sitemap missing a loc") unless xml.include?("<loc>https://example.com/pages/articles/</loc>")
|
|
33
|
+
fail!("sitemap included a skipped path") if xml.include?("secret")
|
|
34
|
+
|
|
35
|
+
robots = Pandorga::Discovery.robots_txt("https://example.com/sitemap.xml")
|
|
36
|
+
fail!("robots missing the sitemap line") unless robots.include?("Sitemap: https://example.com/sitemap.xml")
|
|
37
|
+
fail!("robots missing the studio skip") unless robots.include?("Disallow: /studio/")
|
|
38
|
+
|
|
39
|
+
runtime = ROOT.join("_includes/content-runtime/60-fragments.html").read
|
|
40
|
+
fail!("portrait srcset is not read") unless runtime.include?("record.srcset = srcset")
|
|
41
|
+
fail!("portrait sources are not applied") unless runtime.include?("applyHeroPortraitSources")
|
|
42
|
+
shell = ROOT.join("_layouts/shell.html").read
|
|
43
|
+
fail!("shell missing JSON-LD") unless shell.include?("theme/json-ld.html")
|
|
44
|
+
fail!("discovery generator is not loaded from the plugin dir") unless ROOT.join("lib/pandorga/jekyll/plugins/discovery.rb").file?
|
|
45
|
+
|
|
46
|
+
puts "PASS test-discovery"
|
data/scripts/test/test-doctor.rb
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
# Refs: PLT-0.3, PLT-AC-5
|
|
4
4
|
require "pathname"
|
|
5
5
|
require "open3"
|
|
6
|
+
require "fileutils"
|
|
6
7
|
|
|
7
8
|
ROOT = Pathname.new(__dir__).join("../..").expand_path
|
|
8
9
|
EXAMPLE = ROOT.join("examples/minimal")
|
|
@@ -36,4 +37,41 @@ unless err.include?("pandorga:")
|
|
|
36
37
|
exit 1
|
|
37
38
|
end
|
|
38
39
|
|
|
40
|
+
missing = ROOT.join("tmp/doctor-missing-pages")
|
|
41
|
+
FileUtils.rm_rf(missing)
|
|
42
|
+
missing.mkpath
|
|
43
|
+
missing.join("_config.yml").write(<<~YAML)
|
|
44
|
+
pandorga:
|
|
45
|
+
identity:
|
|
46
|
+
name: Ada Example
|
|
47
|
+
YAML
|
|
48
|
+
_out, err, st = run_doctor(missing)
|
|
49
|
+
unless st.success?
|
|
50
|
+
warn "FAIL test-doctor: missing pages should warn, not fail\n#{err}"
|
|
51
|
+
exit 1
|
|
52
|
+
end
|
|
53
|
+
unless err.include?("pandorga.pages is missing")
|
|
54
|
+
warn "FAIL test-doctor: expected a missing-pages warning\n#{err}"
|
|
55
|
+
exit 1
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
empty = ROOT.join("tmp/doctor-empty-pages")
|
|
59
|
+
FileUtils.rm_rf(empty)
|
|
60
|
+
empty.mkpath
|
|
61
|
+
empty.join("_config.yml").write(<<~YAML)
|
|
62
|
+
pandorga:
|
|
63
|
+
identity:
|
|
64
|
+
name: Ada Example
|
|
65
|
+
pages: []
|
|
66
|
+
YAML
|
|
67
|
+
_out, err, st = run_doctor(empty)
|
|
68
|
+
unless st.success?
|
|
69
|
+
warn "FAIL test-doctor: empty pages should warn, not fail\n#{err}"
|
|
70
|
+
exit 1
|
|
71
|
+
end
|
|
72
|
+
unless err.include?("pandorga.pages is empty")
|
|
73
|
+
warn "FAIL test-doctor: expected an empty-pages warning\n#{err}"
|
|
74
|
+
exit 1
|
|
75
|
+
end
|
|
76
|
+
|
|
39
77
|
puts "PASS test-doctor"
|
|
@@ -55,6 +55,21 @@ end
|
|
|
55
55
|
warn "FAIL test-examples-build: #{name} home layout missing"
|
|
56
56
|
exit 1
|
|
57
57
|
end
|
|
58
|
+
origin = name == "full" ? "https://example.org" : "https://example.com"
|
|
59
|
+
sitemap = example.join("_site/sitemap.xml").read
|
|
60
|
+
robots = example.join("_site/robots.txt").read
|
|
61
|
+
unless sitemap.include?("<loc>#{origin}/</loc>") || sitemap.include?("<loc>#{origin}/index.html</loc>")
|
|
62
|
+
warn "FAIL test-examples-build: #{name} sitemap missing the home URL\n#{sitemap}"
|
|
63
|
+
exit 1
|
|
64
|
+
end
|
|
65
|
+
unless robots.include?("Sitemap: #{origin}/sitemap.xml")
|
|
66
|
+
warn "FAIL test-examples-build: #{name} robots missing the sitemap line\n#{robots}"
|
|
67
|
+
exit 1
|
|
68
|
+
end
|
|
69
|
+
unless html.include?('application/ld+json') && html.include?('"@type": "Person"')
|
|
70
|
+
warn "FAIL test-examples-build: #{name} home is missing JSON-LD"
|
|
71
|
+
exit 1
|
|
72
|
+
end
|
|
58
73
|
end
|
|
59
74
|
|
|
60
75
|
puts "PASS test-examples-build"
|
|
@@ -13,7 +13,7 @@ const source = fs.readFileSync(
|
|
|
13
13
|
);
|
|
14
14
|
|
|
15
15
|
const start = source.indexOf('function heroPortraitEntries');
|
|
16
|
-
const end = source.indexOf('function applyHeroPortrait');
|
|
16
|
+
const end = source.indexOf('function applyHeroPortrait(');
|
|
17
17
|
if (start < 0 || end < start) {
|
|
18
18
|
console.error('hero portrait functions missing from 60-fragments.html');
|
|
19
19
|
process.exit(1);
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Hero LCP, listing/CV shift, revision contrast, inventory button.
|
|
5
|
+
# PLT-AC-16, PLT-AC-17, PLT-AC-18. The subtitle size is PLT-AC-13.
|
|
6
|
+
|
|
7
|
+
require "pathname"
|
|
8
|
+
|
|
9
|
+
ROOT = Pathname.new(__dir__).join("..", "..").expand_path
|
|
10
|
+
|
|
11
|
+
def fail!(message)
|
|
12
|
+
warn "FAIL test-hydrate-reserve: #{message}"
|
|
13
|
+
exit 1
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
shell = ROOT.join("_layouts/shell.html").read
|
|
17
|
+
preload = ROOT.join("_includes/theme/critical-preload.html").read
|
|
18
|
+
home = ROOT.join("_layouts/home.html").read
|
|
19
|
+
articles = ROOT.join("_layouts/articles.html").read
|
|
20
|
+
cv = ROOT.join("_layouts/cv.html").read
|
|
21
|
+
fragments = ROOT.join("_includes/content-runtime/60-fragments.html").read
|
|
22
|
+
listing = ROOT.join("_includes/content-runtime/41-listing-helpers.html").read
|
|
23
|
+
blocks = ROOT.join("_includes/content-runtime/43-blocks.html").read
|
|
24
|
+
home_css = ROOT.join("assets/css/ledger/home.css").read
|
|
25
|
+
writing_css = ROOT.join("assets/css/ledger/writing.css").read
|
|
26
|
+
cv_css = ROOT.join("assets/css/ledger/cv.css").read
|
|
27
|
+
|
|
28
|
+
fail!("shell does not preload critical JSON") unless shell.include?("theme/critical-preload.html")
|
|
29
|
+
fail!("home preload misses the hero summary") unless preload.include?("pages/cv/summary.json")
|
|
30
|
+
fail!("home preload misses the subtitle") unless preload.include?("pages/home/subtitle.json")
|
|
31
|
+
fail!("articles preload misses the writing index") unless preload.include?("data/writing_index.json")
|
|
32
|
+
fail!("preload must run before stylesheets") unless shell.index("critical-preload.html") < shell.index('href="/assets/css/base.css"')
|
|
33
|
+
|
|
34
|
+
fail!("loadJson ignores the preload cache") unless fragments.include?("window.__pandorgaPreload")
|
|
35
|
+
fail!("quiet fragments still write Loading...") unless fragments.include?("data-content-quiet")
|
|
36
|
+
fail!("a painted fragment is written twice") unless fragments.include?("data-content-painted")
|
|
37
|
+
|
|
38
|
+
fail!("hero summary is not quiet") unless home.include?('data-content-fragment="cv/summary" data-content-quiet')
|
|
39
|
+
fail!("hero subtitle is not quiet") unless home.include?('data-content-fragment="home/subtitle" data-content-quiet')
|
|
40
|
+
fail!("hero does not paint the summary early") unless home.include?("paint('home-cv-summary'")
|
|
41
|
+
fail!("hero subtitle size left --type-body") unless home_css.include?("font-size: var(--type-body);")
|
|
42
|
+
tagline = home_css[/\.home-hero-tagline \{[^}]*\}/m]
|
|
43
|
+
fail!("tagline rule missing") unless tagline
|
|
44
|
+
fail!("tagline is not body size") unless tagline.include?("font-size: var(--type-body);")
|
|
45
|
+
fail!("hero summary has no reserved box") unless home_css.include?(".home-hero-summary:empty")
|
|
46
|
+
|
|
47
|
+
fail!("articles listing has no row reserve") unless articles.include?("writing-reserve-row")
|
|
48
|
+
fail!("articles lead has no reserved box") unless writing_css.include?("#articles-lead:empty")
|
|
49
|
+
fail!("CV experience has no reserve") unless cv.include?('id="cv-experience-list"') && cv.include?("data-content-reserve")
|
|
50
|
+
fail!("CV summary still ships Loading...") if cv.include?("Loading...")
|
|
51
|
+
fail!("showLoadingState collapses a reserve") unless listing.include?("data-content-reserve")
|
|
52
|
+
fail!("CV reserve card has no height") unless cv_css.include?(".cv-reserve-card")
|
|
53
|
+
|
|
54
|
+
revised = writing_css[/\.writing-index \.writing-revised \{[^}]+\}/m]
|
|
55
|
+
fail!("writing-revised rule missing") unless revised
|
|
56
|
+
fail!("writing-revised still fades the ink") if revised.include?("color-mix") || revised.include?("transparent")
|
|
57
|
+
fail!("writing-revised is not the variant ink") unless revised.include?("color: var(--color-on-surface-variant);")
|
|
58
|
+
|
|
59
|
+
selectable = blocks[/function renderProjectInventoryRow.*?function renderSystemCard/m]
|
|
60
|
+
fail!("inventory renderer missing") unless selectable
|
|
61
|
+
fail!("selectable inventory row is still an article with role=button") if selectable.include?("role', 'button'") || selectable.include?('role", "button"') || selectable.include?("setAttribute('role'")
|
|
62
|
+
fail!("selectable inventory row is not a button") unless selectable.include?("createElement(selectable ? 'button' : 'article')")
|
|
63
|
+
|
|
64
|
+
puts "PASS test-hydrate-reserve"
|
data/scripts/test/test-new.rb
CHANGED
|
@@ -21,6 +21,17 @@ def run_doctor(dir)
|
|
|
21
21
|
Open3.capture3(env, "ruby", EXE.to_s, "doctor", dir.to_s)
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
+
guide = ROOT.join("docs/getting-started.md").read
|
|
25
|
+
readme = ROOT.join("README.md").read
|
|
26
|
+
unless guide.include?('gem at `~> 1.3`')
|
|
27
|
+
warn "FAIL test-new: getting-started must document the scaffold pin ~> 1.3"
|
|
28
|
+
exit 1
|
|
29
|
+
end
|
|
30
|
+
if readme.include?("once 1.1 is on RubyGems")
|
|
31
|
+
warn "FAIL test-new: README still says the gem is unpublished at 1.1"
|
|
32
|
+
exit 1
|
|
33
|
+
end
|
|
34
|
+
|
|
24
35
|
FileUtils.rm_rf(DEST)
|
|
25
36
|
|
|
26
37
|
stdout, stderr, status = run_new(DEST.to_s)
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Shell accessibility (skip link and home-link name).
|
|
5
|
+
# The top bar and footer used site.author alone, so a site with no author
|
|
6
|
+
# exposed the accessible name " – Home" and hid the visible wordmark.
|
|
7
|
+
|
|
8
|
+
require "pathname"
|
|
9
|
+
|
|
10
|
+
ROOT = Pathname.new(__dir__).join("..", "..").expand_path
|
|
11
|
+
SHELL = ROOT.join("_layouts/shell.html").read
|
|
12
|
+
FOOTER = ROOT.join("_includes/page/site-footer.html").read
|
|
13
|
+
CSS = ROOT.join("assets/css/ledger/chrome.css").read
|
|
14
|
+
|
|
15
|
+
def fail!(message)
|
|
16
|
+
warn "FAIL test-shell-a11y: #{message}"
|
|
17
|
+
exit 1
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
fail!("missing skip link") unless SHELL.include?('class="skip-link"') && SHELL.include?('href="#page-content"')
|
|
21
|
+
fail!("missing skip target") unless SHELL.include?('id="page-content"')
|
|
22
|
+
fail!("skip link is not shown on focus") unless CSS.include?(".skip-link:focus")
|
|
23
|
+
|
|
24
|
+
bare = 'aria-label="{{ site.author }} – Home"'
|
|
25
|
+
fail!("shell home link still uses site.author alone") if SHELL.include?(bare)
|
|
26
|
+
fail!("footer home link still uses site.author alone") if FOOTER.include?(bare)
|
|
27
|
+
fail!("shell home link needs an identity.name fallback") unless SHELL.include?("site.pandorga.identity.name")
|
|
28
|
+
fail!("footer home link needs an identity.name fallback") unless FOOTER.include?("site.pandorga.identity.name")
|
|
29
|
+
|
|
30
|
+
puts "PASS test-shell-a11y"
|
|
@@ -46,6 +46,14 @@ TEMPLATES.each do |name|
|
|
|
46
46
|
end
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
+
%w[_includes/chord-tab.html _includes/transcription.html].each do |rel|
|
|
50
|
+
text = ROOT.join(rel).read
|
|
51
|
+
if text.include?("Exibe")
|
|
52
|
+
warn "FAIL test-template-packages: #{rel} still has a Portuguese comment"
|
|
53
|
+
failed = true
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
49
57
|
exit 1 if failed
|
|
50
58
|
|
|
51
59
|
puts "PASS test-template-packages"
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# A listed gate that is not on disk must fail the run. Skipping it lets a
|
|
5
|
+
# renamed test disappear from CI while validate.sh still exits 0.
|
|
6
|
+
|
|
7
|
+
require "pathname"
|
|
8
|
+
|
|
9
|
+
ROOT = Pathname.new(__dir__).join("..", "..").expand_path
|
|
10
|
+
SCRIPT = ROOT.join("scripts/validate.sh")
|
|
11
|
+
|
|
12
|
+
def fail!(message)
|
|
13
|
+
warn "FAIL test-validate-allowlist: #{message}"
|
|
14
|
+
exit 1
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
source = SCRIPT.read
|
|
18
|
+
block = source[/if \[\[ ! -f "\$test" \]\]; then.*?fi/m]
|
|
19
|
+
fail!("missing-file branch not found") unless block
|
|
20
|
+
fail!("a missing listed test must set failed=1") unless block.include?("failed=1")
|
|
21
|
+
fail!("a missing listed test must not be skipped") if block.include?("skip")
|
|
22
|
+
|
|
23
|
+
listed = source.scan(%r{scripts/test/test-[A-Za-z0-9_.-]+})
|
|
24
|
+
fail!("allowlist is empty") if listed.empty?
|
|
25
|
+
|
|
26
|
+
missing = listed.uniq.reject { |rel| ROOT.join(rel).file? }
|
|
27
|
+
fail!("listed tests are not on disk: #{missing.join(', ')}") unless missing.empty?
|
|
28
|
+
|
|
29
|
+
puts "PASS test-validate-allowlist"
|
data/scripts/validate.sh
CHANGED
|
@@ -55,12 +55,18 @@ TESTS=(
|
|
|
55
55
|
scripts/test/test-r2-json-sync.rb
|
|
56
56
|
scripts/test/test-writing-slug-limits.rb
|
|
57
57
|
scripts/test/test-examples-build.rb
|
|
58
|
+
scripts/test/test-validate-allowlist.rb
|
|
59
|
+
scripts/test/test-shell-a11y.rb
|
|
60
|
+
scripts/test/test-hydrate-reserve.rb
|
|
61
|
+
scripts/test/test-css-delivery.rb
|
|
62
|
+
scripts/test/test-discovery.rb
|
|
58
63
|
)
|
|
59
64
|
|
|
60
65
|
failed=0
|
|
61
66
|
for test in "${TESTS[@]}"; do
|
|
62
67
|
if [[ ! -f "$test" ]]; then
|
|
63
|
-
echo "-- ${test} (missing
|
|
68
|
+
echo "-- ${test} (missing)"
|
|
69
|
+
failed=1
|
|
64
70
|
continue
|
|
65
71
|
fi
|
|
66
72
|
echo "-- ${test}"
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: pandorga
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.6.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- The Pandorga contributors
|
|
@@ -149,9 +149,11 @@ files:
|
|
|
149
149
|
- _includes/page/site-footer.html
|
|
150
150
|
- _includes/page/timeline-section.html
|
|
151
151
|
- _includes/plotly.html
|
|
152
|
+
- _includes/theme/critical-preload.html
|
|
152
153
|
- _includes/theme/dev-reexport.html
|
|
153
154
|
- _includes/theme/favicons.html
|
|
154
155
|
- _includes/theme/font-loader.html
|
|
156
|
+
- _includes/theme/json-ld.html
|
|
155
157
|
- _includes/theme/shell-theme-boot.html
|
|
156
158
|
- _includes/theme/site-logo.html
|
|
157
159
|
- _includes/theme/tailwind-theme-colors.json.liquid
|
|
@@ -212,7 +214,6 @@ files:
|
|
|
212
214
|
- _plugins/writing_slug_limits.rb
|
|
213
215
|
- assets/css/article.css
|
|
214
216
|
- assets/css/base.css
|
|
215
|
-
- assets/css/cv.css
|
|
216
217
|
- assets/css/global-link.css
|
|
217
218
|
- assets/css/ledger/bibliography.css
|
|
218
219
|
- assets/css/ledger/chrome.css
|
|
@@ -225,6 +226,7 @@ files:
|
|
|
225
226
|
- assets/css/ledger/rascunhos.css
|
|
226
227
|
- assets/css/ledger/sources.css
|
|
227
228
|
- assets/css/ledger/writing.css
|
|
229
|
+
- assets/css/tailwind.css
|
|
228
230
|
- assets/icons/studio-logo.svg
|
|
229
231
|
- assets/tailwind-play.js
|
|
230
232
|
- examples/full/Gemfile
|
|
@@ -269,6 +271,7 @@ files:
|
|
|
269
271
|
- lib/pandorga/commands/publish.rb
|
|
270
272
|
- lib/pandorga/commands/serve.rb
|
|
271
273
|
- lib/pandorga/commands/studio_schema.rb
|
|
274
|
+
- lib/pandorga/discovery.rb
|
|
272
275
|
- lib/pandorga/jekyll.rb
|
|
273
276
|
- lib/pandorga/jekyll/generator.rb
|
|
274
277
|
- lib/pandorga/jekyll/plugins/bibliography_artifact.rb
|
|
@@ -282,6 +285,7 @@ files:
|
|
|
282
285
|
- lib/pandorga/jekyll/plugins/content_validators_hook.rb
|
|
283
286
|
- lib/pandorga/jekyll/plugins/content_writing_index.rb
|
|
284
287
|
- lib/pandorga/jekyll/plugins/content_writing_paths.rb
|
|
288
|
+
- lib/pandorga/jekyll/plugins/discovery.rb
|
|
285
289
|
- lib/pandorga/jekyll/plugins/force_utf8_encoding.rb
|
|
286
290
|
- lib/pandorga/jekyll/plugins/git_chronology.rb
|
|
287
291
|
- lib/pandorga/jekyll/plugins/git_metadata.rb
|
|
@@ -318,6 +322,9 @@ files:
|
|
|
318
322
|
- scripts/lib/writing_index_contract.rb
|
|
319
323
|
- scripts/pdf/md-to-pdf.mjs
|
|
320
324
|
- scripts/pdf/md-to-pdf.sh
|
|
325
|
+
- scripts/tailwind/build.sh
|
|
326
|
+
- scripts/tailwind/input.css
|
|
327
|
+
- scripts/tailwind/tailwind.config.js
|
|
321
328
|
- scripts/test/fixtures/dual-template/_config.yml
|
|
322
329
|
- scripts/test/fixtures/dual-template/index.html
|
|
323
330
|
- scripts/test/render-parity/article-note.json
|
|
@@ -379,10 +386,12 @@ files:
|
|
|
379
386
|
- scripts/test/test-content-license.rb
|
|
380
387
|
- scripts/test/test-content-render-parity.rb
|
|
381
388
|
- scripts/test/test-content-validators.rb
|
|
389
|
+
- scripts/test/test-css-delivery.rb
|
|
382
390
|
- scripts/test/test-css-structure.rb
|
|
383
391
|
- scripts/test/test-cv-export-contract.rb
|
|
384
392
|
- scripts/test/test-detail-render-parity.rb
|
|
385
393
|
- scripts/test/test-dev-reexport.rb
|
|
394
|
+
- scripts/test/test-discovery.rb
|
|
386
395
|
- scripts/test/test-doctor.rb
|
|
387
396
|
- scripts/test/test-dual-template-instances.rb
|
|
388
397
|
- scripts/test/test-dual-template-runtime.rb
|
|
@@ -396,6 +405,7 @@ files:
|
|
|
396
405
|
- scripts/test/test-hero-portraits.mjs
|
|
397
406
|
- scripts/test/test-hero-portraits.rb
|
|
398
407
|
- scripts/test/test-home-band-art.rb
|
|
408
|
+
- scripts/test/test-hydrate-reserve.rb
|
|
399
409
|
- scripts/test/test-install-functions.rb
|
|
400
410
|
- scripts/test/test-language-export.rb
|
|
401
411
|
- scripts/test/test-ledger-blocks.rb
|
|
@@ -410,6 +420,7 @@ files:
|
|
|
410
420
|
- scripts/test/test-r2-json-sync.rb
|
|
411
421
|
- scripts/test/test-registry-home.rb
|
|
412
422
|
- scripts/test/test-runtime-js-syntax.rb
|
|
423
|
+
- scripts/test/test-shell-a11y.rb
|
|
413
424
|
- scripts/test/test-slim-writing-index.rb
|
|
414
425
|
- scripts/test/test-studio-api-contract.rb
|
|
415
426
|
- scripts/test/test-studio-content-files.rb
|
|
@@ -425,6 +436,7 @@ files:
|
|
|
425
436
|
- scripts/test/test-text-excerpt.rb
|
|
426
437
|
- scripts/test/test-unwrap-media-src.mjs
|
|
427
438
|
- scripts/test/test-unwrap-media-src.rb
|
|
439
|
+
- scripts/test/test-validate-allowlist.rb
|
|
428
440
|
- scripts/test/test-withdrawn-content-export.rb
|
|
429
441
|
- scripts/test/test-writing-index-export-slugs.rb
|
|
430
442
|
- scripts/test/test-writing-slug-limits.rb
|
data/assets/css/cv.css
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/* ── Public CV page ── (intentionally empty)
|
|
2
|
-
|
|
3
|
-
This file held the pre-redesign CV entry styles: .cv-section, .job-title,
|
|
4
|
-
.job-department, .job-meta, .institution and .cv-description. The public CV
|
|
5
|
-
page was rebuilt as the architectural register in `_layouts/cv.html`, which
|
|
6
|
-
emits .cv-register / .cv-entry-* / .cv-product-* and styles them from
|
|
7
|
-
`assets/css/ledger/cv.css`. None of the six old classes is emitted by any
|
|
8
|
-
layout, include, runtime renderer or content file any more, so they were
|
|
9
|
-
removed rather than left to rot.
|
|
10
|
-
|
|
11
|
-
The file itself stays because `_layouts/shell.html` links it unconditionally
|
|
12
|
-
and dropping the <link> belongs to whoever owns that layout. Once that line
|
|
13
|
-
is gone, delete this file. */
|