Development setup, TTL editing, validation, and deployment workflow
This guide covers the full workflow for contributing to the Iroko Framework vocabulary — from setting up your local environment through validation, HTML generation, and deployment. The vocabulary files are RDF/Turtle (.ttl); the HTML documentation pages are generated from them programmatically.
pip install rdflib
git clone https://github.com/iroko-framework/iroko-framework.git
cd iroko-framework
iroko-framework/
index.html # Homepage
assets/
IHS-Logo.jpg
iroko-style.css # Shared stylesheet
vocab/
index.html # Vocabulary index
iroko-core.ttl # Core module (source of truth)
iroko-core.html # Generated — do not edit directly
iroko-ewe.ttl
iroko-ewe.html
iroko-nkisi.ttl
iroko-nkisi.html
iroko-travay.ttl
iroko-travay.html
iroko-ile.ttl
iroko-ile.html
docs/
index.html # This documentation index
CONTRIBUTING.html
REUSE.html
ARCHITECTURE.html
generate_browse_pages.py # HTML generator script
@baserdfs:label values in English (@en); add skos:prefLabel in additional languages for concept schemesrdfs:comment and skos:definition values in English only unless explicitly multilingualEvery property must carry iroko:minimumAccessLevel pointing to a concept in the Access Level Classification scheme. The six levels are:
iroko:access-public-unrestricted — visible to anyoneiroko:access-community-restricted — visible to recognized community membersiroko:access-initiated-only — visible to initiated practitionersiroko:access-elder-only — visible to recognized eldersiroko:access-no-access — not exported; internal record onlya skos:ConceptScheme with rdfs:label, skos:prefLabel (all five languages), and skos:hasTopConcept listing all top-level conceptsa skos:Concept, skos:inScheme, skos:prefLabel (all five languages), and skos:definitionskos:scopeNote for anything contested or requiring clarificationpython3 -c "
from rdflib import Graph
g = Graph()
g.parse('vocab/iroko-core.ttl', format='turtle')
print(f'OK - {len(g)} triples')
"
Run against all TTL files before committing:
for f in vocab/*.ttl; do
python3 -c "
from rdflib import Graph
g = Graph()
g.parse('$f', format='turtle')
print(f'OK: $f — {len(g)} triples')
"
done
After editing any TTL file, regenerate the HTML browse pages:
python3 generate_browse_pages.py
This reads all TTL source files and overwrites the corresponding .html files. Commit both the TTL and the regenerated HTML together.
.ttl filepython3 -c "from rdflib import Graph; g = Graph(); g.parse('vocab/iroko-X.ttl'); print(len(g))"python3 generate_browse_pages.pygit add vocab/ && git commit -m "Update iroko-X: [describe change]"git push origin mainskos:scopeNote or iroko:contestedNotes in the TTL, not resolved silently