From 2aa16a298f8fa6725e75cb838838d2b2b43ce0e0 Mon Sep 17 00:00:00 2001 From: bofandra Date: Wed, 30 Sep 2026 23:40:52 +0700 Subject: [PATCH 1/6] Add citation metadata --- CITATION.cff | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 CITATION.cff diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000..0f7837b --- /dev/null +++ b/CITATION.cff @@ -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 From 645b6c7aeeaf456793896a4fdf32d93a4da577b1 Mon Sep 17 00:00:00 2001 From: bofandra Date: Wed, 30 Sep 2026 23:40:55 +0700 Subject: [PATCH 2/6] Add course accessibility guidance --- ACCESSIBILITY.md | 67 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 ACCESSIBILITY.md diff --git a/ACCESSIBILITY.md b/ACCESSIBILITY.md new file mode 100644 index 0000000..6ebc4cf --- /dev/null +++ b/ACCESSIBILITY.md @@ -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). From c9d8ca62140b6a920638961cfbef0a85ed883c00 Mon Sep 17 00:00:00 2001 From: bofandra Date: Wed, 30 Sep 2026 23:41:28 +0700 Subject: [PATCH 3/6] Add citation and accessibility publication guidance --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 3ca0ca2..f26fd66 100644 --- a/README.md +++ b/README.md @@ -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) @@ -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). From 6583a34c70944759892fa4428e7ed02b8756bad8 Mon Sep 17 00:00:00 2001 From: bofandra Date: Wed, 30 Sep 2026 23:41:31 +0700 Subject: [PATCH 4/6] Add accessibility contribution guardrails --- CONTRIBUTING.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 54dc4bf..7c6cc7d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -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 @@ -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 @@ -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. From 65afb63038bfcfb536c53eae3d45405aa8b247f7 Mon Sep 17 00:00:00 2001 From: bofandra Date: Wed, 30 Sep 2026 23:41:34 +0700 Subject: [PATCH 5/6] Document publication polish --- CHANGELOG.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a3f7c7..7eb2fa2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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. From 683ba3ad208596366b2fb1e6f35f905d5c880aaf Mon Sep 17 00:00:00 2001 From: bofandra Date: Wed, 30 Sep 2026 23:41:36 +0700 Subject: [PATCH 6/6] Validate citation and accessibility assets --- scripts/validate_course.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/scripts/validate_course.py b/scripts/validate_course.py index 16b9fdf..97bb5b8 100644 --- a/scripts/validate_course.py +++ b/scripts/validate_course.py @@ -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", @@ -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/", @@ -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), @@ -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) @@ -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")