{"id":50508861,"url":"https://github.com/denisecase/syllabus-generator","last_synced_at":"2026-06-02T18:31:13.610Z","repository":{"id":350519742,"uuid":"1207179055","full_name":"denisecase/syllabus-generator","owner":"denisecase","description":"Creates course and term specific syllabi from a Microsoft Word Syllabus Template","archived":false,"fork":false,"pushed_at":"2026-05-01T05:27:35.000Z","size":5142,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-01T07:22:38.201Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://denisecase.github.io/syllabus-generator/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/denisecase.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-10T16:58:04.000Z","updated_at":"2026-05-01T05:27:31.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/denisecase/syllabus-generator","commit_stats":null,"previous_names":["denisecase/syllabus-generator"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/denisecase/syllabus-generator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/denisecase%2Fsyllabus-generator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/denisecase%2Fsyllabus-generator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/denisecase%2Fsyllabus-generator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/denisecase%2Fsyllabus-generator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/denisecase","download_url":"https://codeload.github.com/denisecase/syllabus-generator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/denisecase%2Fsyllabus-generator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33833277,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-02T02:00:07.132Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-02T18:31:11.400Z","updated_at":"2026-06-02T18:31:13.600Z","avatar_url":"https://github.com/denisecase.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# denisecase: syllabus-generator\n\n[![PyPI version](https://img.shields.io/pypi/v/denisecase/syllabus-generator)](https://pypi.org/project/denisecase/syllabus-generator/)\n[![Latest Release](https://img.shields.io/github/v/release/denisecase/syllabus-generator)](https://github.com/denisecase/syllabus-generator/releases)\n[![Docs](https://img.shields.io/badge/docs-live-blue)](https://denisecase.github.io/syllabus-generator/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/license/MIT)\n[![CI](https://github.com/denisecase/syllabus-generator/actions/workflows/ci-python-zensical.yml/badge.svg?branch=main)](https://github.com/denisecase/syllabus-generator/actions/workflows/ci-python-zensical.yml)\n[![Deploy-Docs](https://github.com/denisecase/syllabus-generator/actions/workflows/deploy-zensical.yml/badge.svg?branch=main)](https://github.com/denisecase/syllabus-generator/actions/workflows/deploy-zensical.yml)\n[![Check Links](https://github.com/denisecase/syllabus-generator/actions/workflows/links.yml/badge.svg)](https://github.com/denisecase/syllabus-generator/actions/workflows/links.yml)\n[![Dependabot](https://img.shields.io/badge/Dependabot-enabled-brightgreen.svg)](https://github.com/denisecase/syllabus-generator/security)\n\n\u003e This repository creates course and term specific syllabi from a Microsoft Word Syllabus Template.\n\n## Outputs\n\nThis repository produces documents under `outputs/`.\n\nOutput files are named:\n\n`course_prefix-course_number-course_sections_course_name_line1_course_name_line2_last_name_course_season_course_yy_course_block.docx`\n\ne.g. `44-620-8081_WebMiningAndAppliedNLP_Case_Sp26_OP2.docx`\n\n## Quick start (Generation)\n\nUpdate/add a data file in courses/.\nSee example [courses/44-608-2026-FA-OP1.toml](courses/44-608-2026-FA-OP1.toml).\n\nRun the full script either for a single data file or for all:\n\n```shell\nuv run python -m syllabus_generator.cli courses/44-608-2026-FA-OP1.toml\nuv run python -m syllabus_generator.cli\n```\n\n## No Slashes (/ or \\)\n\nIMPORTANT: Do not use `\\` or `/` in course_sections or course_number.\nJust combine, e.g. `613413` and `808103`.\n\n## Adding a New Data Field\n\nTo add a new field (e.g., `course_short_name`, `materials_textbook`, `materials_other`), follow these steps.\n\n### 1. Add to the data file (TOML)\n\nAdd the new field to your course file in `courses/`.\n\nExample:\n\n```toml\ncourse_short_name = \"Web Mining \u0026 NLP\"\n\nmaterials_textbook = \"\"\"\nNo required textbook. There are no required textbooks for this course.\nMining the Social Web 3rd Edition by Matthew A. Russell (Author), Mikhail Klassen (Author)\nISBN: 978-1491985045 is optional, but recommended; it has a lot of good information and resources.\n\"\"\"\n\nmaterials_other = \"Additional free resources as directed by instructor.\"\n```\n\nNotes:\n\n- Use triple quotes `\"\"\"` for multiline text.\n- Triple quotes must open and close on their own line.\n- Keep field names consistent across all course files.\n\n### 2. Add to the Word template\n\nOpen: `template/Northwest-OnlineProfessional-Syllabus_Template_26.docx`\n\nInsert placeholders where the values should appear:\n\n```text\n{{course_short_name}}\n{{materials_textbook}}\n{{materials_other}}\n```\n\nNotes:\n\n- Placeholders must match field names exactly.\n- Do not add extra spaces inside `{{ }}`.\n- Avoid splitting placeholders across lines or formatting runs.\n\n### 3. Add to the data model (models.py)\n\nUpdate `CourseData` in: `src/syllabus_generator/models.py`\n\nAdd new fields:\n\n```python\ncourse_short_name: str\nmaterials_textbook: str\nmaterials_other: str\n```\n\n### 4. Load the field (io_utils.py)\n\nUpdate the loader in: `src/syllabus_generator/io_utils.py`\n\nAdd to the constructor:\n\n```python\ncourse_short_name=_get_required_str(raw, \"course_short_name\", \"root\"),\nmaterials_textbook=_get_required_str(raw, \"materials_textbook\", \"root\"),\nmaterials_other=_get_required_str(raw, \"materials_other\", \"root\"),\n```\n\n### 5. Add to replacements (generator.py)\n\nUpdate: `src/syllabus_generator/generator.py`\n\nAdd to `build_replacements()`:\n\n```python\n\"{{course_short_name}}\": course.course_short_name,\n\"{{materials_textbook}}\": course.materials_textbook,\n\"{{materials_other}}\": course.materials_other,\n```\n\n### 6. Validate (optional but recommended)\n\nIf the field is required, add a check in:\n`src/syllabus_generator/validator.py`\n\nExample:\n\n```python\n_require_non_empty(course.course_short_name, \"course_short_name\", errors)\n```\n\n### 7. Generate and verify\n\nRun:\n\n```shell\nuv run python -m syllabus_generator.cli courses/44-620-2026-SP-OP2.toml\n```\n\nConfirm:\n\n- Field appears in output document\n- Formatting is correct\n- No placeholder text remains\n\n### Design guidance\n\n- Scalar fields → use simple `{{field_name}}` replacement\n- Repeated/tabular data → use `[[...]]` in TOML + table row generation in code\n- Multiline prose → use triple-quoted TOML strings\n\nKeep the template stable and evolve fields through the data + generator pipeline.\n\n## Command Reference\n\nThe commands below are used in the workflow guide above.\nThey are provided here for convenience.\n\nFollow the guide for the **full instructions**.\n\n\u003cdetails\u003e\n\u003csummary\u003eShow command reference\u003c/summary\u003e\n\n### In a machine terminal (open in your `Repos` folder)\n\nAfter you get a copy of this repo in your own GitHub account,\nopen a machine terminal in your `Repos` folder:\n\n```shell\n# Replace username with YOUR GitHub username.\ngit clone https://github.com/username/syllabus-generator\n\ncd syllabus-generator\ncode .\n```\n\n### In a VS Code terminal\n\n```shell\nuv self update\nuv python pin 3.14\nuv sync --extra dev --extra docs --upgrade\n\nuvx pre-commit install\ngit add -A\nuvx pre-commit run --all-files\n\n# run Python\n\nuv run ruff format .\nuv run ruff check . --fix\nuv run zensical build\n\ngit add -A\ngit commit -m \"update\"\ngit push -u origin main\n```\n\n\u003c/details\u003e\n\n## Annotations\n\n[ANNOTATIONS.md](./ANNOTATIONS.md) - REQ/WHY/OBS annotations used\n\n## Citation\n\n[CITATION.cff](./CITATION.cff)\n\n## License\n\n[MIT](./LICENSE)\n\n## SE Manifest\n\n[SE_MANIFEST.toml](./SE_MANIFEST.toml) - project intent, scope, and role\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdenisecase%2Fsyllabus-generator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdenisecase%2Fsyllabus-generator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdenisecase%2Fsyllabus-generator/lists"}