Skip to content

Commit 67d102b

Browse files
committed
Add hasApi flag to package manifest and gate API Reference link on it
1 parent 96b48b5 commit 67d102b

4 files changed

Lines changed: 37 additions & 6 deletions

File tree

scripts/build.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ def generate_package_manifest(package_id: str, dry_run: bool = False):
467467
version_tags.sort(key=parse_version, reverse=True)
468468
latest_tag = version_tags[0]
469469

470-
# Build versions list with release dates and examples availability
470+
# Build versions list with release dates, examples, and API availability
471471
versions = []
472472
for tag in version_tags:
473473
released = get_tag_date(repo_path, tag)
@@ -481,10 +481,23 @@ def generate_package_manifest(package_id: str, dry_run: bool = False):
481481
has_examples = len(version_manifest.get("notebooks", [])) > 0
482482
except Exception:
483483
pass
484+
# Check if this version has an API extract. Packages whose source is
485+
# essentially empty (e.g. an early scaffolded stub) produce no api.json,
486+
# in which case the frontend must not advertise an "API Reference" link.
487+
api_path = output_dir / tag / "api.json"
488+
has_api = False
489+
if api_path.exists():
490+
try:
491+
with open(api_path, "r", encoding="utf-8") as f:
492+
api_data = json.load(f)
493+
has_api = bool(api_data.get("modules"))
494+
except Exception:
495+
pass
484496
versions.append({
485497
"tag": tag,
486498
"released": released,
487499
"hasExamples": has_examples,
500+
"hasApi": has_api,
488501
})
489502

490503
# Check if roadmap exists

src/lib/api/versions.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export interface VersionInfo {
66
tag: string;
77
released: string;
88
hasExamples?: boolean;
9+
hasApi?: boolean;
910
}
1011

1112
export interface PackageManifest {
@@ -108,6 +109,16 @@ export function versionHasExamples(tag: string, manifest: PackageManifest): bool
108109
return version?.hasExamples ?? false;
109110
}
110111

112+
/**
113+
* Check if a version has an extracted API. Returns true when the flag is
114+
* missing (older manifests) so we err on the side of showing the link.
115+
*/
116+
export function versionHasApi(tag: string, manifest: PackageManifest): boolean {
117+
const normalized = normalizeTag(tag);
118+
const version = manifest.versions.find((v) => v.tag === normalized);
119+
return version?.hasApi ?? true;
120+
}
121+
111122
/**
112123
* Check if a package has roadmap items
113124
*/

src/lib/components/layout/Sidebar.svelte

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import { searchTarget } from '$lib/stores/searchNavigation';
1515
import { exampleGroupsStore } from '$lib/stores/examplesContext';
1616
import type { PackageManifest } from '$lib/api/versions';
17-
import { versionHasExamples, packageHasRoadmap } from '$lib/api/versions';
17+
import { versionHasExamples, versionHasApi, packageHasRoadmap } from '$lib/api/versions';
1818
import { SearchInput, SearchResult as SearchResultComponent } from '$lib/components/search';
1919
2020
interface Props {
@@ -30,17 +30,22 @@
3030
manifest && currentTag ? versionHasExamples(currentTag, manifest) : false
3131
);
3232
33+
// Check if current version has API (false for packages with no Python source)
34+
let hasApi = $derived(
35+
manifest && currentTag ? versionHasApi(currentTag, manifest) : !!manifest
36+
);
37+
3338
// Check if package has roadmap items
3439
let hasRoadmap = $derived(manifest ? packageHasRoadmap(manifest) : false);
3540
3641
// Filter sidebar items based on availability
37-
// - Hide API Reference if no manifest (no versioned docs exist)
42+
// - Hide API Reference if version has no extracted API
3843
// - Hide Examples if current version has no examples
3944
// - Hide Roadmap if package has no roadmap items
4045
let items = $derived(
4146
getSidebarItems(packageId, currentTag).filter(
4247
(item) =>
43-
(item.title !== 'API Reference' || manifest) &&
48+
(item.title !== 'API Reference' || hasApi) &&
4449
(item.title !== 'Examples' || hasExamples) &&
4550
(item.title !== 'Roadmap' || hasRoadmap)
4651
)

src/lib/components/pages/PackageOverview.svelte

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import NotebookCell from '$lib/components/common/NotebookCell.svelte';
77
import { packages, type PackageId, type InstallOption } from '$lib/config/packages';
88
import { copyToClipboard } from '$lib/utils/clipboard';
9-
import { type PackageManifest, versionHasExamples, packageHasRoadmap } from '$lib/api/versions';
9+
import { type PackageManifest, versionHasExamples, versionHasApi, packageHasRoadmap } from '$lib/api/versions';
1010
import { packageVersionsStore } from '$lib/stores/packageVersionsStore';
1111
1212
/**
@@ -70,7 +70,9 @@
7070
}
7171
7272
// Reactively compute availability based on manifest and selectedTag
73-
let apiAvailable = $derived(manifest !== null && selectedTag !== null);
73+
let apiAvailable = $derived(
74+
manifest && selectedTag ? versionHasApi(selectedTag, manifest) : false
75+
);
7476
let examplesAvailable = $derived(
7577
manifest && selectedTag ? versionHasExamples(selectedTag, manifest) : false
7678
);

0 commit comments

Comments
 (0)