Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions ACCESSIBILITY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# Accessibility Guide

This repository is primarily text- and code-based. The goal of this guide is to keep the course usable for learners who rely on keyboard navigation, screen readers, zoom, high-contrast settings, or reduced visual complexity.

## Learner guidance

The course can be used directly in GitHub or through Google Colab.

For a lower-friction path:

1. begin with [Start Here](START_HERE.md);
2. use the [Colab notebook index](COLAB.md);
3. increase browser/Colab zoom or font size as needed;
4. use the Markdown course notes when notebook rendering is difficult;
5. use the module README, exercises, assignment, and mastery checks as text alternatives to notebook navigation.

## Content authoring rules

When adding or editing course material:

- use descriptive headings in logical order;
- use meaningful link text instead of "click here";
- keep code examples small and explain their purpose in surrounding text;
- do not rely on color alone to communicate meaning;
- provide text explanations for diagrams and visual relationships;
- add useful alt text to images if images are introduced;
- keep tables simple enough to read linearly;
- avoid decorative Unicode that carries essential meaning without a text explanation;
- avoid autoplaying audio/video or time-dependent interaction as required course content;
- keep essential instructions available as plain text.

## Diagrams

ASCII or text diagrams are used throughout the course because they remain readable without image rendering.

When a richer diagram is added, include a nearby text description that communicates the same learning point.

Example:

```text
Car
└── has-a → Engine
```

The surrounding explanation should still state the relationship in words.

## Notebooks

Notebook cells should remain understandable when read from top to bottom.

Authors should:

- introduce the goal of a code cell before or immediately after it;
- avoid making a screenshot the only source of required information;
- keep learner TODO instructions in Markdown or comments;
- avoid hidden setup steps;
- preserve sequential execution.

## Assessment accessibility

Assessment quality should depend on understanding OOP concepts, not on visual speed or familiarity with a specific interface.

Facilitators may adapt presentation or timing to learner needs as long as the assessed learning outcome is preserved.

## Contributions

Accessibility improvements are welcome. Use the repository issue templates or follow [CONTRIBUTING.md](CONTRIBUTING.md).
8 changes: 7 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,4 +83,10 @@ The GitHub Actions validation workflow passed on `main` after the audit and lear

## Unreleased

Future changes should preserve the course progression, assessment guardrails, reference alignment, and self-paced/open-course neutrality described in the repository documentation.
### Publication polish

- added `CITATION.cff` so the repository has machine-readable citation metadata;
- added `ACCESSIBILITY.md` with learner and contributor accessibility guidance;
- added validation guards for citation/accessibility publication assets.

Future changes should preserve the course progression, assessment guardrails, reference alignment, accessibility guidance, and self-paced/open-course neutrality described in the repository documentation.
16 changes: 16 additions & 0 deletions CITATION.cff
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
cff-version: 1.2.0
message: "If you use this open course in teaching, training, research, or adapted learning materials, please cite it as below."
title: "Object Oriented Programming — Open Course"
type: software
authors:
- family-names: "Muhammad"
given-names: "Bofandra"
repository-code: "https://github.com/bofandra/oop-course"
url: "https://github.com/bofandra/oop-course"
abstract: "A self-paced open course for learning object-oriented thinking using Python, with executable notebooks, assessments, mastery checks, and a complete capstone."
keywords:
- object-oriented-programming
- python
- open-course
- education
- jupyter-notebook
3 changes: 3 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Read:
- [Reference Map](REFERENCE_MAP.md)
- [Assessment Alignment](ASSESSMENT_ALIGNMENT.md)
- [Execution Audit](EXECUTION_AUDIT.md)
- [Accessibility Guide](ACCESSIBILITY.md)

## Course design guardrails

Expand All @@ -22,6 +23,7 @@ Please preserve these principles:
5. Keep learner-facing material self-paced and independent of institution-specific or fixed-calendar scheduling.
6. Do not publish answer keys for assessments that may be reused by facilitated cohorts.
7. Keep formal concepts aligned to the documented references.
8. Preserve accessibility: essential meaning must not depend only on color, images, or a specific interface.

## Module changes

Expand Down Expand Up @@ -74,4 +76,5 @@ Confirm that:
- Colab launch coverage remains complete;
- reference mapping remains accurate;
- learner-facing wording remains self-paced and institution-neutral;
- new visuals have meaningful text alternatives and essential instructions remain text-accessible;
- no assessment answer key has been published accidentally.
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ Open-course guidance:
- [Reference Map](REFERENCE_MAP.md)
- [Instructor Guide](INSTRUCTOR_GUIDE.md)
- [Execution Audit](EXECUTION_AUDIT.md)
- [Accessibility Guide](ACCESSIBILITY.md)
- [Changelog](CHANGELOG.md)
- [Grading Operational System](GRADING_SYSTEM.md)
- [Gradebook Quick Start](GRADEBOOK_GUIDE.md)
Expand Down Expand Up @@ -211,6 +212,16 @@ Move to next module when ready

Use the [Colab notebook index](COLAB.md) to launch the executable course notebooks directly in Google Colab. Save a personal copy, run the examples, complete the TODO cells, and compare your work against the stated requirements and rubrics.

## Citation and reuse

If you use or adapt this course for teaching, training, or research, use the repository's [citation metadata](CITATION.cff). GitHub can use this file to provide a **Cite this repository** action.

For adapted instructional material, preserve appropriate attribution and follow the license terms below.

## Accessibility

See the [Accessibility Guide](ACCESSIBILITY.md) for learner guidance and content-authoring rules. Essential course instructions should remain available as text, and new visuals should include equivalent text descriptions.

## License

Instructional materials are licensed under **Creative Commons Attribution 4.0 International (CC BY 4.0)** and code/software portions are licensed under the **MIT License**, except where otherwise noted. See [LICENSE.md](LICENSE.md).
Expand Down
35 changes: 35 additions & 0 deletions scripts/validate_course.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ def required_structure(errors: list[str]) -> None:
required = [
"README.md",
"CHANGELOG.md",
"CITATION.cff",
"ACCESSIBILITY.md",
"COURSE_MAP.md",
"OPEN_COURSE_GUIDE.md",
"SELF_PACED_GUIDE.md",
Expand Down Expand Up @@ -395,6 +397,8 @@ def validate_publication_navigation(errors: list[str]) -> None:
"REFERENCE_MAP.md",
"SELF_PACED_GUIDE.md",
"SELF_ASSESSMENT_GUIDE.md",
"ACCESSIBILITY.md",
"CITATION.cff",
"CHANGELOG.md",
"00-python-primer/readiness-check.md",
"week-01/",
Expand All @@ -421,6 +425,35 @@ def validate_publication_navigation(errors: list[str]) -> None:
fail(errors, f"{path.name}: missing public navigation link to {link}")


def validate_publication_metadata(errors: list[str]) -> None:
citation_path = ROOT / "CITATION.cff"
if citation_path.exists():
text = citation_path.read_text(encoding="utf-8")
required_fragments = [
"cff-version: 1.2.0",
'title: "Object Oriented Programming — Open Course"',
"authors:",
'family-names: "Muhammad"',
'given-names: "Bofandra"',
'repository-code: "https://github.com/bofandra/oop-course"',
]
for fragment in required_fragments:
if fragment not in text:
fail(errors, f"CITATION.cff: missing required metadata fragment: {fragment}")

accessibility_path = ROOT / "ACCESSIBILITY.md"
if accessibility_path.exists():
text = accessibility_path.read_text(encoding="utf-8")
for heading in [
"# Accessibility Guide",
"## Learner guidance",
"## Content authoring rules",
"## Assessment accessibility",
]:
if heading not in text:
fail(errors, f"ACCESSIBILITY.md: missing required section: {heading}")


def validate_open_course_neutrality(errors: list[str]) -> None:
forbidden_patterns = {
"institution affiliation": re.compile(r"TANRI\s+ABENG", re.IGNORECASE),
Expand Down Expand Up @@ -553,6 +586,7 @@ def main() -> int:
validate_module_colab_navigation(errors)
validate_reference_map(errors)
validate_publication_navigation(errors)
validate_publication_metadata(errors)
validate_assessment_structure(errors)
validate_public_assessment_safety(errors)
validate_open_course_neutrality(errors)
Expand Down Expand Up @@ -580,6 +614,7 @@ def main() -> int:
print("- direct module Colab navigation: OK")
print("- reference-map coverage: OK")
print("- publication navigation: OK")
print("- citation/accessibility metadata: OK")
print("- assignment rubric / quiz structure: OK")
print("- learner-facing assessment neutrality: OK")
print("- public assessment-key guard: OK")
Expand Down
Loading