Skip to content

Feature/bring v0.4 into main#3

Merged
AurelienNicosiaULaval merged 14 commits into
mainfrom
feature/bring-v0.4-into-main
Feb 13, 2026
Merged

Feature/bring v0.4 into main#3
AurelienNicosiaULaval merged 14 commits into
mainfrom
feature/bring-v0.4-into-main

Conversation

@AurelienNicosiaULaval
Copy link
Copy Markdown
Owner

Summary

This PR integrates the v0.4 publication-ready roadmap for tutorizeR, with a focus on making conversion workflows more robust for teacher-scale usage.

What this PR adds

  • Core conversion stability:
    • deterministic chunk label handling
    • improved parsing/transform pipeline for Rmd/qmd
    • preserved setup and options behavior
  • New MCQ ecosystem:
    • reusable question bank support (YAML/JSON): load_question_bank(), validate_question_bank()
    • MCQ reference blocks: {tutorizeR-mcq-ref}
  • Linting and validation:
    • lint_source() with explicit severities/codes
    • richer tutorize_report + write_tutorize_report()
  • i18n and teacher UX:
    • FR/EN message localization via tr()
    • clearer, localized errors and UX text
  • Addins and export tooling:
    • preview addin workflow
    • LMS manifest export (export_lms_manifest())
    • optional tutorial package scaffolding (export_tutorial_package())
  • Documentation and publication readiness:
    • JOSS paper scaffold (paper/paper.md, paper/paper.bib)
    • expanded vignettes (question-bank, lint-and-debug)
    • release/gov metadata and CI hardening

Validation

  • R CMD check --as-cran --no-manual (pass, with expected non-blocking environment notes)
  • Rscript -e "lintr::lint_package()" (No lints found)
  • Rscript -e "testthat::test_local()" (98 PASS, 0 FAIL)
  • CI green on matrix + lint + coverage jobs

Breaking changes

  • None expected for public API:
    • convert_to_tutorial() preserved
    • convert_folder() preserved
    • new primary API entrypoint: tutorize() kept additive

Reviewer notes

  • This PR is intentionally broad (v0.4 baseline + robustness + publication prep).
  • If preferred, I can split into smaller follow-up PRs by layer (core/lint/i18n/exports/docs) in a second pass.

@AurelienNicosiaULaval AurelienNicosiaULaval merged commit 0693d25 into main Feb 13, 2026
5 checks passed
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f76e705ab0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread R/transform.R
Comment on lines +480 to +482
if (!(definition$strategy %in% c("ordered", "random"))) {
definition$strategy <- "ordered"
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Propagate normalized MCQ-ref strategy to caller

validate_mcq_ref_definition() tries to coerce invalid strategy values to "ordered", but this assignment is local and the function only returns TRUE; the original invalid value is still passed to select_questions_from_bank(), where match.arg() raises an error. Any tutorizeR-mcq-ref block with a typo like strategy: ordred will fail conversion instead of following the validator’s fallback logic.

Useful? React with 👍 / 👎.

Comment thread R/transform.R
))
}

build_callout_question_lines(question = question, answers = answers, language = "en")
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Respect selected language in explicit Quarto MCQ blocks

For explicit tutorizeR-mcq blocks rendered to quarto-live, the callout builder is hard-coded with language = "en", so tutorize(..., language = "fr") still emits English quiz labels. This creates mixed-language output in localized tutorials and bypasses the i18n flow used elsewhere.

Useful? React with 👍 / 👎.

Comment thread R/export.R
Comment on lines +203 to +204
} else if (is_r_chunk(block)) {
item_type <- "exercise"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Exclude non-exercise tagged chunks from LMS manifest items

derive_manifest_items() labels every R chunk as an exercise without checking parsed tutorize tags, so chunks marked skip, narrative-only, or solution-only are still exported as learner exercises with solution_available. In files using these tags, the generated LMS manifest overstates interactive activities and can misrepresent what learners actually see.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant