...
This commit is contained in:
308
examples/data/atlas/debug_recursive/debug_atlas.vsh
Normal file
308
examples/data/atlas/debug_recursive/debug_atlas.vsh
Normal file
@@ -0,0 +1,308 @@
|
||||
#!/usr/bin/env -S vrun
|
||||
|
||||
import incubaid.herolib.data.atlas
|
||||
import incubaid.herolib.ui.console
|
||||
import os
|
||||
|
||||
fn main() {
|
||||
println('=== ATLAS DEBUG SCRIPT ===\n')
|
||||
|
||||
// Create and scan atlas
|
||||
mut a := atlas.new(name: 'main')!
|
||||
|
||||
// Scan the collections
|
||||
println('Scanning collections...\n')
|
||||
a.scan(
|
||||
path: '/Users/despiegk/code/git.ourworld.tf/geomind/docs_geomind/collections/mycelium_nodes_tiers'
|
||||
)!
|
||||
a.scan(
|
||||
path: '/Users/despiegk/code/git.ourworld.tf/geomind/docs_geomind/collections/geomind_compare'
|
||||
)!
|
||||
a.scan(path: '/Users/despiegk/code/git.ourworld.tf/geomind/docs_geomind/collections/geoaware')!
|
||||
a.scan(
|
||||
path: '/Users/despiegk/code/git.ourworld.tf/tfgrid/docs_tfgrid4/collections/mycelium_economics'
|
||||
)!
|
||||
a.scan(
|
||||
path: '/Users/despiegk/code/git.ourworld.tf/tfgrid/docs_tfgrid4/collections/mycelium_concepts'
|
||||
)!
|
||||
a.scan(
|
||||
path: '/Users/despiegk/code/git.ourworld.tf/tfgrid/docs_tfgrid4/collections/mycelium_cloud_tech'
|
||||
)!
|
||||
|
||||
// Initialize atlas (post-scanning validation)
|
||||
a.init_post()!
|
||||
|
||||
// Print all pages per collection
|
||||
println('\n=== COLLECTIONS & PAGES ===\n')
|
||||
for col_name, col in a.collections {
|
||||
println('Collection: ${col_name}')
|
||||
println(' Pages (${col.pages.len}):')
|
||||
if col.pages.len > 0 {
|
||||
for page_name, _ in col.pages {
|
||||
println(' - ${page_name}')
|
||||
}
|
||||
} else {
|
||||
println(' (empty)')
|
||||
}
|
||||
println(' Files/Images (${col.files.len}):')
|
||||
if col.files.len > 0 {
|
||||
for file_name, _ in col.files {
|
||||
println(' - ${file_name}')
|
||||
}
|
||||
} else {
|
||||
println(' (empty)')
|
||||
}
|
||||
}
|
||||
|
||||
// Validate links (this will recursively find links across collections)
|
||||
println('\n=== VALIDATING LINKS (RECURSIVE) ===\n')
|
||||
a.validate_links()!
|
||||
println('✓ Link validation complete\n')
|
||||
|
||||
// Check for broken links
|
||||
println('\n=== BROKEN LINKS ===\n')
|
||||
mut total_errors := 0
|
||||
for col_name, col in a.collections {
|
||||
if col.has_errors() {
|
||||
println('Collection: ${col_name} (${col.errors.len} errors)')
|
||||
for err in col.errors {
|
||||
println(' [${err.category_str()}] Page: ${err.page_key}')
|
||||
println(' Message: ${err.message}')
|
||||
println('')
|
||||
total_errors++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if total_errors == 0 {
|
||||
println('✓ No broken links found!')
|
||||
} else {
|
||||
println('\n❌ Total broken link errors: ${total_errors}')
|
||||
}
|
||||
|
||||
// Show discovered links per page (validates recursive discovery)
|
||||
println('\n\n=== DISCOVERED LINKS (RECURSIVE RESOLUTION) ===\n')
|
||||
println('Checking for files referenced by cross-collection pages...\n')
|
||||
mut total_links := 0
|
||||
for col_name, col in a.collections {
|
||||
mut col_has_links := false
|
||||
for page_name, page in col.pages {
|
||||
if page.links.len > 0 {
|
||||
if !col_has_links {
|
||||
println('Collection: ${col_name}')
|
||||
col_has_links = true
|
||||
}
|
||||
println(' Page: ${page_name} (${page.links.len} links)')
|
||||
for link in page.links {
|
||||
target_col := if link.target_collection_name != '' {
|
||||
link.target_collection_name
|
||||
} else {
|
||||
col_name
|
||||
}
|
||||
println(' → ${target_col}:${link.target_item_name} [${link.file_type}]')
|
||||
total_links++
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
println('\n✓ Total links discovered: ${total_links}')
|
||||
|
||||
// List pages that need investigation
|
||||
println('\n=== CHECKING SPECIFIC MISSING PAGES ===\n')
|
||||
|
||||
missing_pages := [
|
||||
'compare_electricity',
|
||||
'internet_basics',
|
||||
'centralization_risk',
|
||||
'gdp_negative',
|
||||
]
|
||||
|
||||
// Check in geoaware collection
|
||||
if 'geoaware' in a.collections {
|
||||
mut geoaware := a.get_collection('geoaware')!
|
||||
|
||||
println('Collection: geoaware')
|
||||
if geoaware.pages.len > 0 {
|
||||
println(' All pages in collection:')
|
||||
for page_name, _ in geoaware.pages {
|
||||
println(' - ${page_name}')
|
||||
}
|
||||
} else {
|
||||
println(' (No pages found)')
|
||||
}
|
||||
|
||||
println('\n Checking for specific missing pages:')
|
||||
for page_name in missing_pages {
|
||||
exists := page_name in geoaware.pages
|
||||
status := if exists { '✓' } else { '✗' }
|
||||
println(' ${status} ${page_name}')
|
||||
}
|
||||
}
|
||||
|
||||
// Check for pages across all collections
|
||||
println('\n\n=== LOOKING FOR MISSING PAGES ACROSS ALL COLLECTIONS ===\n')
|
||||
|
||||
for missing_page in missing_pages {
|
||||
println('Searching for "${missing_page}":')
|
||||
mut found := false
|
||||
for col_name, col in a.collections {
|
||||
if missing_page in col.pages {
|
||||
println(' ✓ Found in: ${col_name}')
|
||||
found = true
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
println(' ✗ Not found in any collection')
|
||||
}
|
||||
}
|
||||
|
||||
// Check for the solution page
|
||||
println('\n\n=== CHECKING FOR "solution" PAGE ===\n')
|
||||
for col_name in ['mycelium_nodes_tiers', 'geomind_compare', 'geoaware', 'mycelium_economics',
|
||||
'mycelium_concepts', 'mycelium_cloud_tech'] {
|
||||
if col_name in a.collections {
|
||||
mut col := a.get_collection(col_name)!
|
||||
exists := col.page_exists('solution')!
|
||||
status := if exists { '✓' } else { '✗' }
|
||||
println('${status} ${col_name}: "solution" page')
|
||||
}
|
||||
}
|
||||
|
||||
// Print error summary
|
||||
println('\n\n=== ERROR SUMMARY BY CATEGORY ===\n')
|
||||
mut category_counts := map[string]int{}
|
||||
for _, col in a.collections {
|
||||
for err in col.errors {
|
||||
cat_str := err.category_str()
|
||||
category_counts[cat_str]++
|
||||
}
|
||||
}
|
||||
|
||||
if category_counts.len == 0 {
|
||||
println('✓ No errors found!')
|
||||
} else {
|
||||
for cat, count in category_counts {
|
||||
println('${cat}: ${count}')
|
||||
}
|
||||
}
|
||||
|
||||
// ===== EXPORT AND FILE VERIFICATION TEST =====
|
||||
println('\n\n=== EXPORT AND FILE VERIFICATION TEST ===\n')
|
||||
|
||||
// Create export directory
|
||||
export_path := '/tmp/atlas_debug_export'
|
||||
if os.exists(export_path) {
|
||||
os.rmdir_all(export_path)!
|
||||
}
|
||||
os.mkdir_all(export_path)!
|
||||
|
||||
println('Exporting to: ${export_path}\n')
|
||||
a.export(destination: export_path)!
|
||||
println('✓ Export completed\n')
|
||||
|
||||
// Collect all files found during link validation
|
||||
mut expected_files := map[string]string{} // key: file_name, value: collection_name
|
||||
mut file_count := 0
|
||||
for col_name, col in a.collections {
|
||||
for page_name, page in col.pages {
|
||||
for link in page.links {
|
||||
if link.status == .found && (link.file_type == .file || link.file_type == .image) {
|
||||
file_key := link.target_item_name
|
||||
expected_files[file_key] = link.target_collection_name
|
||||
file_count++
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
println('Expected to find ${file_count} file references in links\n')
|
||||
println('=== VERIFYING FILES IN EXPORT DIRECTORY ===\n')
|
||||
|
||||
// Get the first collection name (the primary exported collection)
|
||||
mut primary_col_name := ''
|
||||
for col_name, _ in a.collections {
|
||||
primary_col_name = col_name
|
||||
break
|
||||
}
|
||||
|
||||
if primary_col_name == '' {
|
||||
println('❌ No collections found')
|
||||
} else {
|
||||
mut verified_count := 0
|
||||
mut missing_count := 0
|
||||
mut found_files := map[string]bool{}
|
||||
|
||||
// Check both img and files directories
|
||||
img_dir := '${export_path}/content/${primary_col_name}/img'
|
||||
files_dir := '${export_path}/content/${primary_col_name}/files'
|
||||
|
||||
// Scan img directory
|
||||
if os.exists(img_dir) {
|
||||
img_files := os.ls(img_dir) or { []string{} }
|
||||
for img_file in img_files {
|
||||
found_files[img_file] = true
|
||||
}
|
||||
}
|
||||
|
||||
// Scan files directory
|
||||
if os.exists(files_dir) {
|
||||
file_list := os.ls(files_dir) or { []string{} }
|
||||
for file in file_list {
|
||||
found_files[file] = true
|
||||
}
|
||||
}
|
||||
|
||||
println('Files/Images found in export directory:')
|
||||
if found_files.len > 0 {
|
||||
for file_name, _ in found_files {
|
||||
println(' ✓ ${file_name}')
|
||||
if file_name in expected_files {
|
||||
verified_count++
|
||||
}
|
||||
}
|
||||
} else {
|
||||
println(' (none found)')
|
||||
}
|
||||
|
||||
println('\n=== FILE VERIFICATION RESULTS ===\n')
|
||||
println('Expected files from links: ${file_count}')
|
||||
println('Files found in export: ${found_files.len}')
|
||||
println('Files verified (present in export): ${verified_count}')
|
||||
|
||||
// Check for missing expected files
|
||||
for expected_file, source_col in expected_files {
|
||||
if expected_file !in found_files {
|
||||
missing_count++
|
||||
println(' ✗ Missing: ${expected_file} (from ${source_col})')
|
||||
}
|
||||
}
|
||||
|
||||
if missing_count > 0 {
|
||||
println('\n❌ ${missing_count} expected files are MISSING from export!')
|
||||
} else if verified_count == file_count && file_count > 0 {
|
||||
println('\n✓ All expected files are present in export directory!')
|
||||
} else if file_count == 0 {
|
||||
println('\n⚠ No file links were found during validation (check if pages have file references)')
|
||||
}
|
||||
|
||||
// Show directory structure
|
||||
println('\n=== EXPORT DIRECTORY STRUCTURE ===\n')
|
||||
if os.exists('${export_path}/content/${primary_col_name}') {
|
||||
println('${export_path}/content/${primary_col_name}/')
|
||||
|
||||
content_files := os.ls('${export_path}/content/${primary_col_name}') or { []string{} }
|
||||
for item in content_files {
|
||||
full_path := '${export_path}/content/${primary_col_name}/${item}'
|
||||
if os.is_dir(full_path) {
|
||||
sub_items := os.ls(full_path) or { []string{} }
|
||||
println(' ${item}/ (${sub_items.len} items)')
|
||||
for sub_item in sub_items {
|
||||
println(' - ${sub_item}')
|
||||
}
|
||||
} else {
|
||||
println(' - ${item}')
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user