Skip to content

Add file-system Jinja tests#154

Merged
leynos merged 18 commits intomainfrom
codex/implement-file-system-tests-with-validation-6iy3e8
Sep 14, 2025
Merged

Add file-system Jinja tests#154
leynos merged 18 commits intomainfrom
codex/implement-file-system-tests-with-validation-6iy3e8

Conversation

@leynos
Copy link
Copy Markdown
Owner

@leynos leynos commented Sep 10, 2025

Summary

  • distinguish block and character devices with dedicated is tests while retaining legacy device
  • factor Jinja test registration into a table-driven loop
  • exercise new file-type tests in behavioural scenarios
  • guard Unix-specific predicates and Cucumber steps so Windows builds remain functional
  • convert docs/srgn.md references to footnotes and remove placeholder dates
  • restrict CI test matrix to Linux to avoid Windows-only failures
  • assert resolved manifest target names and drive missing-path tests via the workspace for cross-platform consistency

Testing

  • make fmt
  • make lint
  • make test
  • make markdownlint
  • make nixie

https://chatgpt.com/codex/tasks/task_e_68c0a5d63d1483228887d76074c863ad

Summary by Sourcery

Implement file-system Jinja tests and integrate them into the build pipeline

New Features:

  • Add Jinja file-system tests (dir, file, symlink, pipe, block_device, char_device, and legacy device) via a new stdlib module

Enhancements:

  • Factor Jinja test registration into a table-driven loop
  • Guard Unix-specific predicates and Cucumber steps to ensure Windows builds remain functional
  • Assert manifest target names in Cucumber steps for cross-platform consistency

CI:

  • Restrict CI test matrix to Linux to avoid Windows-only failures

Documentation:

  • Update design docs table for file-system tests and convert srgn.md references to footnotes, removing placeholder dates

Tests:

  • Add unit tests for all file-system predicates and the underlying workspace fixture
  • Add Cucumber feature tests for the new Jinja file-system tests, separating Unix-only scenarios

Chores:

  • Introduce stdlib module and add cap-std, camino, and rustix dependencies for file-system testing

@sourcery-ai
Copy link
Copy Markdown
Contributor

sourcery-ai Bot commented Sep 10, 2025

Reviewer's Guide

This PR adds dedicated file-system Jinja tests by introducing a standard-library module that registers type predicates in a table-driven loop (using cap-std and camino), integrates these tests into the template environment, and exercises them in new Unix-gated Cucumber scenarios. It also updates documentation with footnotes, removes placeholder dates, restricts the CI matrix to Linux, and extends the test harness to assert multiple target names for cross-platform consistency.

Class diagram for new stdlib file-system test registration

classDiagram
    class Environment {
        +add_test(name: &str, fn(String) -> Result<bool, Error>)
    }
    class Stdlib {
        +register(env: &mut Environment)
        +is_file_type(path: &Utf8Path, predicate: fn(FileType) -> bool) -> Result<bool, Error>
    }
    class FileType {
        +is_dir() bool
        +is_file() bool
        +is_symlink() bool
        +is_fifo() bool
        +is_block_device() bool
        +is_char_device() bool
    }
    class Dir {
        +symlink_metadata(path: &Utf8Path) -> Metadata
    }
    class Utf8Path {
        +parent() -> Option<Utf8Path>
        +file_name() -> Option<&str>
    }
    Stdlib --> Environment : registers tests
    Stdlib --> FileType : uses predicates
    Stdlib --> Dir : uses for metadata
    Stdlib --> Utf8Path : path handling
Loading

Class diagram for new file-system Jinja tests

classDiagram
    class FileTest {
        +name: &'static str
        +predicate: fn(FileType) -> bool
    }
    class Stdlib {
        +register(env: &mut Environment)
    }
    class Environment {
        +add_test(name: &str, fn(String) -> Result<bool, Error>)
    }
    FileTest <.. Stdlib : used in registration
    Stdlib --> Environment : adds tests
Loading

File-Level Changes

Change Details Files
Implement Jinja file-system tests in a stdlib module
  • Define is_* predicates for dir, file, symlink, pipe, block_device, char_device, and device
  • Use cap-std’s Dir::symlink_metadata with camino paths to inspect FileType
  • Table-driven registration loop in register() that calls env.add_test
  • Helper is_file_type returns false on missing paths and errors on I/O failures
  • Comprehensive unit tests for each file type and missing-path behaviour
src/stdlib.rs
Integrate the new tests into manifest rendering
  • Invoke crate::stdlib::register(&mut jinja) when building the Jinja Environment
  • Ensure existing env and glob functions remain registered alongside new tests
src/manifest.rs
Add and update file-system dependencies
  • Add cap-std (fs_utf8) and camino for UTF-8 path handling
  • Include rustix for creating FIFOs and device nodes in tests
  • Update Cargo.lock to pin these new dependencies
Cargo.toml
Cargo.lock
Expand Cucumber test harness for file-system scenarios
  • Introduce fs_steps.rs to set up directory, file, symlink, FIFO, block and char device fixtures
  • Add manifest_has_targets_named step to assert multiple target names
  • Configure cucumber.rs to run Unix-specific feature suite under cfg(unix)
  • Expose fs_steps module only on Unix in steps/mod.rs
  • Add test data jinja_is.yml and feature file tests/features_unix/fs_tests.feature
tests/steps/fs_steps.rs
tests/cucumber.rs
tests/steps/mod.rs
tests/steps/manifest_steps.rs
tests/data/jinja_is.yml
tests/features_unix/fs_tests.feature
Update documentation with new tests and footnotes
  • Revise file-system tests table and implementation notes in docs/netsuke-design.md
  • Convert inline references to numbered footnotes and remove placeholder dates in docs/srgn.md
  • Mark file-system tests as complete in docs/roadmap.md
docs/netsuke-design.md
docs/srgn.md
docs/roadmap.md
Restrict CI matrix to Linux
  • Limit matrix.os in GitHub Actions to ubuntu-latest
  • Guard Windows-only code so builds remain functional on non-Unix hosts
.github/workflows/ci.yml

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Sep 10, 2025

Note

Reviews paused

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

Summary by CodeRabbit

  • New Features
    • Introduced a template standard library with filesystem tests: dir, file, symlink; plus Unix-only pipe, block_device, char_device, and device for conditional rendering in templates.
  • Documentation
    • Expanded cross-platform notes on file-type tests, added anchors, refined formatting, and marked basic filesystem tests as done in the roadmap.
  • Tests
    • Added Unix-only feature scenarios and steps, new test data for template conditions, and enabled an extra Unix test suite.
  • Chores
    • Prepared CI for matrix OS runners and added supporting dependencies.

Walkthrough

Add a public stdlib module and register filesystem-type Jinja tests during manifest parsing. Add filesystem-related dependencies and Unix-only test fixtures, extend docs and roadmap, add Unix-only cucumber features and step implementations, and make CI matrix-ready for multi‑OS.

Changes

Cohort / File(s) Summary
CI Workflow
/.github/workflows/ci.yml
Switch runs-on to matrix.os and add ubuntu-latest to matrix.os; no other CI steps changed.
Crate Dependencies
/Cargo.toml
Add cap-std (feature fs_utf8) and camino to dependencies; add rustix (feature fs) to dev-dependencies for test fixtures.
Public API & Integration
/src/lib.rs, /src/manifest.rs, /src/stdlib.rs
Expose pub mod stdlib;. Call crate::stdlib::register(&mut jinja) when building the template environment. Implement stdlib::register to add Jinja tests: dir, file, symlink, and Unix-only pipe, block_device, char_device, plus device alias; add is_file_type helper and structured IO error handling.
Documentation Updates
/docs/netsuke-design.md, /docs/roadmap.md, /docs/srgn.md
Reflow and renumber enumerations, add anchors and cross-references for file-type tests, mark filesystem tests done in roadmap, and apply typographic/formatting adjustments.
Cucumber Test Runner
/tests/cucumber.rs
On Unix, run additional feature suite tests/features_unix (guarded by #[cfg(unix)]).
Cucumber Features & Data
/tests/features_unix/fs_tests.feature, /tests/data/jinja_is.yml
Add Unix-only feature asserting seven file-type targets and missing-path behaviour; add YAML manifest exercising is tests for dir/file/symlink/pipe/block_device/char_device/device.
Cucumber Steps (Unix FS fixtures)
/tests/steps/fs_steps.rs, /tests/steps/mod.rs
Add Unix-only step handlers to create dir/file/symlink/FIFO/block/char devices and set env vars for tests; gate module with #[cfg(unix)].
Cucumber Steps (Manifest assertions)
/tests/steps/manifest_steps.rs
Add step to assert manifest contains targets with exact names via BTreeSet; add expand_env helper and apply environment expansion when setting variables.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor CLI as CLI
  participant Manifest as manifest::from_str_named
  participant Jinja as Minijinja::Environment
  participant Stdlib as stdlib::register
  participant FS as cap_std::fs

  CLI->>Manifest: Parse manifest string
  Manifest->>Jinja: Build template environment
  Manifest->>Stdlib: register(&mut env)
  Stdlib-->>Jinja: Add tests (dir,file,symlink,pipe,...)
  Manifest-->>CLI: Return parsed manifest

  rect rgb(247,250,255)
    note right of Jinja: When evaluating a `when` expression
    CLI->>Jinja: Evaluate "{{ env('PATH') is file_type }}"
    Jinja->>Stdlib: Invoke test predicate with path
    Stdlib->>FS: symlink_metadata(path)
    FS-->>Stdlib: FileType or error
    Stdlib-->>Jinja: bool (false if missing) or templating error
    Jinja-->>CLI: Condition result
  end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Poem

Add tests that ask what lies beneath the name,
is it file, dir, or symlink, none the same.
Pipes and devices hum where Unix tests roam,
cap‑std and camino craft the temporary home.
CI widens its matrix, ready to roam.

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed Confirm the title succinctly and accurately summarises the primary change: it adds file-system Jinja tests and is concise, on-topic and readable for a teammate scanning history; it avoids noise and irrelevant details. Therefore the title matches the stated criteria.
Description Check ✅ Passed Confirm the pull request description is related to the changeset and clearly summarises the main additions (stdlib Jinja tests, CI and docs updates, tests, and dependencies) along with the test commands, so it satisfies this lenient check. The description is on-topic and informative for reviewers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

Comment @coderabbitai help to get the list of available commands and usage tips.

codescene-delta-analysis[bot]

This comment was marked as outdated.

sourcery-ai[bot]

This comment was marked as resolved.

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 suggestions.

Reply with @codex fix comments to fix any unresolved comments.

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, or 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 fix this CI failure" or "@codex address that feedback".

Comment thread tests/steps/fs_steps.rs Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 14

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/srgn.md (1)

83-116: Avoid 2nd-person pronouns per docs style guide.
Rewrite instructional sentences to remove “you/your”. Multiple instances exist in installation and recipes sections.

Offer to generate a patch that rewrites affected sentences while preserving meaning. Do you want an automated edit across the file?

Also applies to: 145-149, 411-416, 441-443, 523-527

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 25c6489 and e0a6b9b.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (14)
  • .github/workflows/ci.yml (1 hunks)
  • Cargo.toml (2 hunks)
  • docs/netsuke-design.md (8 hunks)
  • docs/roadmap.md (1 hunks)
  • docs/srgn.md (2 hunks)
  • src/lib.rs (1 hunks)
  • src/manifest.rs (1 hunks)
  • src/stdlib.rs (1 hunks)
  • tests/cucumber.rs (1 hunks)
  • tests/data/jinja_is.yml (1 hunks)
  • tests/features_unix/fs_tests.feature (1 hunks)
  • tests/steps/fs_steps.rs (1 hunks)
  • tests/steps/manifest_steps.rs (1 hunks)
  • tests/steps/mod.rs (1 hunks)
🧰 Additional context used
📓 Path-based instructions (6)
**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

**/*.rs: Use en-GB-oxendict spelling and grammar in code comments (exceptions allowed for external API names)
Function documentation must include clear examples; test documentation should omit redundant examples
Keep file size manageable: no Rust source file longer than 400 lines; split large switches/dispatch tables and move big test data to external files
Disallow Clippy warnings; fix warnings in code rather than silencing them
Extract helper functions for long functions; maintain separation of concerns and CQRS
Group many related parameters into meaningful structs
If returning a large error type, consider using Arc to reduce data copied/returned
Each Rust module must begin with a module-level //! comment stating purpose and utility
Document public APIs with Rustdoc (///) so cargo doc can generate documentation
Prefer immutable data; avoid unnecessary mut bindings
Handle errors with Result instead of panicking where feasible
Avoid unsafe code unless absolutely necessary and document any usage clearly
Place function attributes after doc comments
Do not use return in single-line functions
Use predicate functions when conditional criteria have more than two branches
Do not silence lints except as a last resort; suppressions must be tightly scoped and include a clear reason
Prefer expect over allow for lint management
Use conditional compilation (#[cfg]/#[cfg_attr]) for functions unused under specific feature sets
Prefer .expect() over .unwrap()
Use concat!() for long string literals instead of escaping newlines with backslashes
Prefer single-line function bodies when appropriate (e.g., pub fn new(id: u64) -> Self { Self(id) })
Prefer semantic error enums (derive std::error::Error via thiserror) for inspectable conditions
Use an opaque eyre::Report only at the application boundary for human-readable logs; do not expose in public APIs
Never export eyre::Report from libraries; convert to domain error enums at API boundaries and to eyre only in main/top-level async tas...

Files:

  • src/lib.rs
  • tests/cucumber.rs
  • src/manifest.rs
  • tests/steps/manifest_steps.rs
  • tests/steps/mod.rs
  • src/stdlib.rs
  • tests/steps/fs_steps.rs

⚙️ CodeRabbit configuration file

**/*.rs: * Seek to keep the cyclomatic complexity of functions no more than 12.

  • Adhere to single responsibility and CQRS

  • Place function attributes after doc comments.

  • Do not use return in single-line functions.

  • Move conditionals with >2 branches into a predicate function.

  • Avoid unsafe unless absolutely necessary.

  • Every module must begin with a //! doc comment that explains the module's purpose and utility.

  • Comments and docs must follow en-GB-oxendict (-ize / -our) spelling and grammar

  • Lints must not be silenced except as a last resort.

    • #[allow] is forbidden.
    • Only narrowly scoped #[expect(lint, reason = "...")] is allowed.
    • No lint groups, no blanket or file-wide suppression.
    • Include FIXME: with link if a fix is expected.
  • Where code is only used by specific features, it must be conditionally compiled or a conditional expectation for unused_code applied.

  • Use rstest fixtures for shared setup and to avoid repetition between tests.

  • Replace duplicated tests with #[rstest(...)] parameterised cases.

  • Prefer mockall for mocks/stubs.

  • Prefer .expect() over .unwrap()

  • Ensure that any API or behavioural changes are reflected in the documentation in docs/

  • Ensure that any completed roadmap steps are recorded in the appropriate roadmap in docs/

  • Files must not exceed 400 lines in length

    • Large modules must be decomposed
    • Long match statements or dispatch tables should be decomposed by domain and collocated with targets
    • Large blocks of inline data (e.g., test fixtures, constants or templates) must be moved to external files and inlined at compile-time or loaded at run-time.
  • Environment access (env::set_var and env::remove_var) are always unsafe in Rust 2024 and MUST be marked as such

    • For testing of functionality depending upon environment variables, dependency injection and the mockable crate are the preferred option.
    • If mockable cannot be used, env mutations in tests ...

Files:

  • src/lib.rs
  • tests/cucumber.rs
  • src/manifest.rs
  • tests/steps/manifest_steps.rs
  • tests/steps/mod.rs
  • src/stdlib.rs
  • tests/steps/fs_steps.rs
docs/**/*.{rs,md}

📄 CodeRabbit inference engine (docs/rust-doctest-dry-guide.md)

In fenced code blocks for docs, explicitly mark code fences with rust (```rust) for clarity

Files:

  • docs/roadmap.md
  • docs/srgn.md
  • docs/netsuke-design.md
docs/**/*.md

📄 CodeRabbit inference engine (AGENTS.md)

docs/**/*.md: Use docs/ as the knowledge base and source of truth for requirements, dependencies, and architecture
Proactively update docs/ when decisions, requirements, libraries, or architecture change to keep documentation current
Documentation must use en-GB-oxendict spelling and grammar (LICENSE name unchanged)

Files:

  • docs/roadmap.md
  • docs/srgn.md
  • docs/netsuke-design.md
**/*.md

📄 CodeRabbit inference engine (AGENTS.md)

**/*.md: Validate Markdown with make markdownlint
Run make fmt after documentation changes to format Markdown and fix table markup
Validate Mermaid diagrams in Markdown files using make nixie
Wrap Markdown paragraphs and bullet points at 80 columns; code blocks at 120; do not wrap tables or headings
Use dashes (-) for list bullets in Markdown
Use GitHub-flavoured Markdown footnotes ([^1]) for references

Files:

  • docs/roadmap.md
  • docs/srgn.md
  • docs/netsuke-design.md

⚙️ CodeRabbit configuration file

**/*.md: * Avoid 2nd person or 1st person pronouns ("I", "you", "we")

  • Use en-GB-oxendict (-ize / -our) spelling and grammar
  • Headings must not be wrapped.
  • Documents must start with a level 1 heading
  • Headings must correctly increase or decrease by no more than one level at a time
  • Use GitHub-flavoured Markdown style for footnotes and endnotes.
  • Numbered footnotes must be numbered by order of appearance in the document.

Files:

  • docs/roadmap.md
  • docs/srgn.md
  • docs/netsuke-design.md
tests/**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

tests/**/*.rs: Write unit and behavioural tests for new functionality; run before and after changes
Use rstest fixtures for shared setup and replace duplicated tests with #[rstest(...)] parameterised cases
Prefer mockall for mocks/stubs
Mock non-deterministic dependencies via dependency injection using mockable (traits like Env and Clock) where appropriate; follow docs/reliable-testing-in-rust-via-dependency-injection.md

Files:

  • tests/cucumber.rs
  • tests/steps/manifest_steps.rs
  • tests/steps/mod.rs
  • tests/steps/fs_steps.rs
Cargo.toml

📄 CodeRabbit inference engine (AGENTS.md)

Cargo.toml: Use explicit SemVer caret version requirements for dependencies; keep dependencies up-to-date
Mandate caret requirements for all dependencies (e.g., some-crate = "1.2.3")
Prohibit wildcard (*) and open-ended (>=) version requirements; use ~ only with a specific documented reason

Files:

  • Cargo.toml
🧬 Code graph analysis (1)
src/manifest.rs (1)
src/stdlib.rs (1)
  • register (37-58)
🔍 Remote MCP

Additional Context for Reviewing PR #154

  1. Dependency Versions & Compatibility

    • The cap-std crate at version 3.4.4 (as added here) is the current release used by Bytecode Alliance projects such as Wasmtime (cap-std = "3.4.4") (gitee.com).
    • cap-std’s fs_utf8 feature (which brings in the camino crate for UTF-8 paths) requires a minimum Rust version of 1.63 (docs.rs).
    • The rustix crate at version 1.0.8 is the latest stable release and provides safe bindings to POSIX/Linux syscalls; aside from its net module, most of its functionality (including mknodat for creating pipes and device nodes) is Unix-only and is disabled on Windows (docs.rs, github.com).
  2. CI Workflow Matrix

    • GitHub Actions supports a matrix strategy where runs-on: ${{ matrix.os }} runs one job per OS listed in matrix.os (e.g. ubuntu-latest, windows-latest) (docs.github.com).
    • Restricting the matrix to [ubuntu-latest] confines testing to Linux runners, intentionally avoiding Windows failures for the newly added Unix-specific tests.
  3. MiniJinja Custom Test Registration

    • In MiniJinja, custom boolean tests (used via {% if foo is test_name %}) are registered by calling env.add_test("test_name", fn). The new register function in src/stdlib.rs loops over a table of (name, predicate) pairs and invokes add_test for each filesystem predicate (dir, file, symlink, etc.) (docs.rs).
🔇 Additional comments (10)
Cargo.toml (1)

20-21: LGTM on adding cap-std + camino; they align with fs_utf8 usage.
No issues spotted with SemVer pins.

tests/data/jinja_is.yml (1)

1-30: LGTM; targets map 1:1 to registered tests.
Naming and usage align with the Jinja tests and env-driven scenarios.

tests/steps/fs_steps.rs (1)

54-57: Remove environment restoration recommendation
The Drop implementation in tests/cucumber.rs (lines 34–38) already drains and restores env_vars via

restore_many(self.env_vars.drain().collect());

Likely an incorrect or invalid review comment.

docs/netsuke-design.md (1)

826-831: Keep the behaviour note; it matches the implementation.

“Missing paths evaluate to false; I/O errors raise a template error.” is accurate for the registered is-* tests.

src/lib.rs (1)

14-14: Expose stdlib publicly to make Jinja tests available.

The new pub mod stdlib; is the right integration point for downstream use.

tests/steps/mod.rs (1)

7-8: Gate Unix-only steps behind cfg(unix).

Keep platform builds green while enabling Unix scenarios on Linux runners.

tests/cucumber.rs (1)

44-45: Run Unix feature suite conditionally.

Execute tests/features_unix only on Unix. This preserves Windows buildability while adding coverage where supported.

src/manifest.rs (1)

541-541: Register stdlib tests before evaluation.

Register tests on the environment prior to foreach/when evaluation so is-* predicates are usable in those expressions.

tests/steps/manifest_steps.rs (1)

201-216: Assert exact target-name set for stronger behaviour guarantees.

Split/trim the expected list and compare to actual names; this is precise and matches the feature intent.

tests/features_unix/fs_tests.feature (1)

3-19: Validate Unix file-type detection and missing-path semantics.

Cover the happy path and the all-missing-paths case; steps compose cleanly with the workspace and env guards.

Comment thread .github/workflows/ci.yml
Comment thread Cargo.toml
Comment thread docs/netsuke-design.md
Comment thread docs/netsuke-design.md Outdated
Comment thread docs/roadmap.md Outdated
Comment thread src/stdlib.rs Outdated
Comment thread src/stdlib.rs
Comment thread src/stdlib.rs
Comment thread tests/steps/fs_steps.rs Outdated
Comment thread tests/steps/fs_steps.rs Outdated
codescene-delta-analysis[bot]

This comment was marked as outdated.

codescene-delta-analysis[bot]

This comment was marked as outdated.

codescene-delta-analysis[bot]

This comment was marked as outdated.

codescene-delta-analysis[bot]

This comment was marked as outdated.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 6

♻️ Duplicate comments (9)
src/stdlib.rs (6)

8-33: Optional: collapse boilerplate via a small macro and const table.

Generate is_* predicates and a single TESTS table; keep register loop trivial. This reduces repetition and aligns with prior feedback.

Also applies to: 38-51


36-38: Add a Rustdoc usage example to the public API.

Provide a minimal example so cargo doc is useful and meets docs policy.

Apply:

-/// Register standard library helpers with the Jinja environment.
+/// Register standard library helpers with the Jinja environment.
+///
+/// # Examples
+/// ```
+/// # use minijinja::Environment;
+/// # fn main() {
+/// let mut env = Environment::new();
+/// netsuke::stdlib::register(&mut env);
+/// // `env` now supports: `is dir`, `is file`, `is symlink`
+/// // and (on Unix) `is pipe`, `is block_device`, `is char_device`, `is device`.
+/// # }
+/// ```
 pub fn register(env: &mut Environment<'_>) {

1-7: Add a module-level //! doc comment.

Document purpose, registered tests (and Unix-only variants), and error semantics (NotFound → false; other I/O → InvalidOperation) per guidelines.

Apply:

+//! Filesystem predicate tests for MiniJinja.
+//!
+//! Registers `{% if path is <test> %}` tests:
+//! - dir, file, symlink (all platforms)
+//! - pipe, block_device, char_device, and legacy device (Unix only)
+//!
+//! Missing paths yield `false`; other I/O errors raise `InvalidOperation`.
 use camino::Utf8Path;

53-57: Harden test registration: accept any Jinja value; treat non-strings as false.

Avoid type errors when templates pass non-strings/undefined.

Apply:

-    for &(name, pred) in TESTS {
-        env.add_test(name, move |path: String| {
-            is_file_type(Utf8Path::new(&path), pred)
-        });
-    }
+    for &(name, pred) in TESTS {
+        env.add_test(name, move |val: minijinja::value::Value| -> minijinja::Result<bool> {
+            if let Some(s) = val.as_str() {
+                return is_file_type(Utf8Path::new(s), pred);
+            }
+            Ok(false)
+        });
+    }

Also align non‑Unix fallbacks accordingly (see next hunk).


59-63: Align non‑Unix fallbacks with the Value-accepting signature.

Keep API consistent across platforms.

Apply:

-        env.add_test("pipe", |_path: String| Ok(false));
-        env.add_test("device", |_path: String| Ok(false));
+        env.add_test("pipe", |_v: minijinja::value::Value| Ok(false));
+        env.add_test("device", |_v: minijinja::value::Value| Ok(false));

73-76: Fix path splitting for roots and trailing separators.

unwrap_or("") can yield an empty component causing incorrect lookups; normalise to "." where appropriate.

Apply:

-    let (dir_path, file_name) = path.parent().map_or_else(
-        || (Utf8Path::new("."), path.as_str()),
-        |parent| (parent, path.file_name().unwrap_or("")),
-    );
+    let (dir_path, file_name) = match (path.parent(), path.file_name()) {
+        (Some(parent), Some(name)) => (parent, name),
+        (Some(parent), None) => (parent, "."), // e.g. "dir/"
+        (None, Some(name)) => (Utf8Path::new("."), name),
+        (None, None) => (Utf8Path::new("."), "."), // e.g. "."
+    };
docs/netsuke-design.md (2)

1669-1671: Fix footnote formatting and complete the access date.

Remove the stray list marker and add the year.

Apply:

-[^1]: Ninja, a small build system with a focus on speed. Accessed on 12 July
-
-      1. <https://ninja-build.org/>
+[^1]: Ninja, a small build system with a focus on speed. Accessed on 12 July 2025.
+      <https://ninja-build.org/>

811-825: Correct the file-system tests table to match implemented features.

Do not document predicates that are not shipped in this PR.

Apply:

-| Test                                                  | True when the operand…                                           |
-| ----------------------------------------------------- | ---------------------------------------------------------------- |
-| `dir` / `file` / `symlink`                            | …is that object type                                             |
-| `pipe` / `block_device` / `char_device` *(Unix-only)* | …is that object type                                             |
-| `device` (legacy, Unix-only)                          | …is a block or character device                                  |
-| `present`                                             | …exists (any type)                                               |
-| `owned`                                               | …is owned by the current UID                                     |
-| `readable` / `writable` / `executable`                | …has the corresponding permission bit for current user           |
-| `empty`                                               | …has size 0 bytes                                                |
-| `older_than(value)`                                   | …has `mtime` < given value (seconds, `timedelta`, or file)       |
-| `newer_than(value)`                                   | …has `mtime` > given value                                       |
-| `contains(substr)`                                    | …file’s text contains **substr**                                 |
-| `matches(regex)`                                      | …file’s text matches **regex**                                   |
-| `type(kind)`                                          | …is of the file-type string supplied (`"file"`, `"dir"`, etc.)   |
+| Test                                                  | True when the operand…          |
+| ----------------------------------------------------- | -------------------------------- |
+| `dir` / `file` / `symlink`                            | …is that object type             |
+| `pipe` / `block_device` / `char_device` *(Unix-only)* | …is that object type             |
+| `device` (legacy, Unix-only)                          | …is a block or character device  |
tests/steps/fs_steps.rs (1)

70-77: Use a hidden parent and pre-create it for stable missing paths

Prevent accidental collisions with real fixtures and keep semantics (file itself remains missing).

Apply this diff:

 #[given(expr = "the environment variable {string} is set to a missing path")]
 fn set_missing_env_path(world: &mut CliWorld, key: String) {
     let temp = world.temp.as_ref().expect("file-type workspace tempdir");
-    let path = Utf8PathBuf::from_path_buf(temp.path().join("__missing__").join(key.to_lowercase()))
-        .expect("utf8 missing path");
+    let missing_dir = temp.path().join(".missing");
+    std::fs::create_dir_all(&missing_dir).expect("create .missing parent");
+    let path = Utf8PathBuf::from_path_buf(missing_dir.join(key.to_lowercase()))
+        .expect("utf8 missing path");
     let previous = set_var(&key, path.as_std_path().as_os_str());
     world.env_vars.entry(key).or_insert(previous);
 }
📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e0a6b9b and d1dadd5.

📒 Files selected for processing (5)
  • docs/netsuke-design.md (8 hunks)
  • src/stdlib.rs (1 hunks)
  • tests/features_unix/fs_tests.feature (1 hunks)
  • tests/steps/fs_steps.rs (1 hunks)
  • tests/steps/manifest_steps.rs (2 hunks)
🧰 Additional context used
📓 Path-based instructions (5)
**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

**/*.rs: Use en-GB-oxendict spelling and grammar in code comments (exceptions allowed for external API names)
Function documentation must include clear examples; test documentation should omit redundant examples
Keep file size manageable: no Rust source file longer than 400 lines; split large switches/dispatch tables and move big test data to external files
Disallow Clippy warnings; fix warnings in code rather than silencing them
Extract helper functions for long functions; maintain separation of concerns and CQRS
Group many related parameters into meaningful structs
If returning a large error type, consider using Arc to reduce data copied/returned
Each Rust module must begin with a module-level //! comment stating purpose and utility
Document public APIs with Rustdoc (///) so cargo doc can generate documentation
Prefer immutable data; avoid unnecessary mut bindings
Handle errors with Result instead of panicking where feasible
Avoid unsafe code unless absolutely necessary and document any usage clearly
Place function attributes after doc comments
Do not use return in single-line functions
Use predicate functions when conditional criteria have more than two branches
Do not silence lints except as a last resort; suppressions must be tightly scoped and include a clear reason
Prefer expect over allow for lint management
Use conditional compilation (#[cfg]/#[cfg_attr]) for functions unused under specific feature sets
Prefer .expect() over .unwrap()
Use concat!() for long string literals instead of escaping newlines with backslashes
Prefer single-line function bodies when appropriate (e.g., pub fn new(id: u64) -> Self { Self(id) })
Prefer semantic error enums (derive std::error::Error via thiserror) for inspectable conditions
Use an opaque eyre::Report only at the application boundary for human-readable logs; do not expose in public APIs
Never export eyre::Report from libraries; convert to domain error enums at API boundaries and to eyre only in main/top-level async tas...

Files:

  • tests/steps/manifest_steps.rs
  • src/stdlib.rs
  • tests/steps/fs_steps.rs

⚙️ CodeRabbit configuration file

**/*.rs: * Seek to keep the cyclomatic complexity of functions no more than 12.

  • Adhere to single responsibility and CQRS

  • Place function attributes after doc comments.

  • Do not use return in single-line functions.

  • Move conditionals with >2 branches into a predicate function.

  • Avoid unsafe unless absolutely necessary.

  • Every module must begin with a //! doc comment that explains the module's purpose and utility.

  • Comments and docs must follow en-GB-oxendict (-ize / -our) spelling and grammar

  • Lints must not be silenced except as a last resort.

    • #[allow] is forbidden.
    • Only narrowly scoped #[expect(lint, reason = "...")] is allowed.
    • No lint groups, no blanket or file-wide suppression.
    • Include FIXME: with link if a fix is expected.
  • Where code is only used by specific features, it must be conditionally compiled or a conditional expectation for unused_code applied.

  • Use rstest fixtures for shared setup and to avoid repetition between tests.

  • Replace duplicated tests with #[rstest(...)] parameterised cases.

  • Prefer mockall for mocks/stubs.

  • Prefer .expect() over .unwrap()

  • Ensure that any API or behavioural changes are reflected in the documentation in docs/

  • Ensure that any completed roadmap steps are recorded in the appropriate roadmap in docs/

  • Files must not exceed 400 lines in length

    • Large modules must be decomposed
    • Long match statements or dispatch tables should be decomposed by domain and collocated with targets
    • Large blocks of inline data (e.g., test fixtures, constants or templates) must be moved to external files and inlined at compile-time or loaded at run-time.
  • Environment access (env::set_var and env::remove_var) are always unsafe in Rust 2024 and MUST be marked as such

    • For testing of functionality depending upon environment variables, dependency injection and the mockable crate are the preferred option.
    • If mockable cannot be used, env mutations in tests ...

Files:

  • tests/steps/manifest_steps.rs
  • src/stdlib.rs
  • tests/steps/fs_steps.rs
tests/**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

tests/**/*.rs: Write unit and behavioural tests for new functionality; run before and after changes
Use rstest fixtures for shared setup and replace duplicated tests with #[rstest(...)] parameterised cases
Prefer mockall for mocks/stubs
Mock non-deterministic dependencies via dependency injection using mockable (traits like Env and Clock) where appropriate; follow docs/reliable-testing-in-rust-via-dependency-injection.md

Files:

  • tests/steps/manifest_steps.rs
  • tests/steps/fs_steps.rs
docs/**/*.{rs,md}

📄 CodeRabbit inference engine (docs/rust-doctest-dry-guide.md)

In fenced code blocks for docs, explicitly mark code fences with rust (```rust) for clarity

Files:

  • docs/netsuke-design.md
docs/**/*.md

📄 CodeRabbit inference engine (AGENTS.md)

docs/**/*.md: Use docs/ as the knowledge base and source of truth for requirements, dependencies, and architecture
Proactively update docs/ when decisions, requirements, libraries, or architecture change to keep documentation current
Documentation must use en-GB-oxendict spelling and grammar (LICENSE name unchanged)

Files:

  • docs/netsuke-design.md
**/*.md

📄 CodeRabbit inference engine (AGENTS.md)

**/*.md: Validate Markdown with make markdownlint
Run make fmt after documentation changes to format Markdown and fix table markup
Validate Mermaid diagrams in Markdown files using make nixie
Wrap Markdown paragraphs and bullet points at 80 columns; code blocks at 120; do not wrap tables or headings
Use dashes (-) for list bullets in Markdown
Use GitHub-flavoured Markdown footnotes ([^1]) for references

Files:

  • docs/netsuke-design.md

⚙️ CodeRabbit configuration file

**/*.md: * Avoid 2nd person or 1st person pronouns ("I", "you", "we")

  • Use en-GB-oxendict (-ize / -our) spelling and grammar
  • Headings must not be wrapped.
  • Documents must start with a level 1 heading
  • Headings must correctly increase or decrease by no more than one level at a time
  • Use GitHub-flavoured Markdown style for footnotes and endnotes.
  • Numbered footnotes must be numbered by order of appearance in the document.

Files:

  • docs/netsuke-design.md
🔇 Additional comments (3)
docs/netsuke-design.md (1)

826-833: LGTM (behaviour note aligns with code).

The Unix/non‑Unix behaviour description matches src/stdlib.rs registration.

tests/steps/manifest_steps.rs (1)

202-217: LGTM: order-insensitive target-name check

Use of BTreeSet removes ordering concerns and matches intent.

tests/steps/fs_steps.rs (1)

1-2: Gate Unix-only steps behind cfg(unix)

Prevent Windows build failures; this module uses symlink, FIFOs and device nodes.

Add a file-level gate to tests/steps/fs_steps.rs:

 //! Steps for preparing file-system fixtures used in Jinja tests.
+#![cfg(unix)]

Guard the import in tests/steps/mod.rs with #[cfg(unix)] if you prefer to gate at the module level.

Comment thread src/stdlib.rs
Comment thread tests/features_unix/fs_tests.feature
Comment thread tests/features_unix/fs_tests.feature
Comment thread tests/steps/fs_steps.rs Outdated
Comment thread tests/steps/fs_steps.rs Outdated
Comment thread tests/steps/manifest_steps.rs Outdated
codescene-delta-analysis[bot]

This comment was marked as outdated.

codescene-delta-analysis[bot]

This comment was marked as outdated.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

♻️ Duplicate comments (10)
tests/steps/manifest_steps.rs (1)

226-241: Emit diff-friendly failure and ignore empty list items

Skip empties from stray commas and surface missing/extra explicitly.

Apply:

 fn manifest_has_targets_named(world: &mut CliWorld, names: String) {
-    let expected: BTreeSet<String> = names.split(',').map(|s| s.trim().to_string()).collect();
+    let expected: BTreeSet<String> = names
+        .split(',')
+        .map(|s| s.trim())
+        .filter(|s| !s.is_empty())
+        .map(ToString::to_string)
+        .collect();
@@
-    assert_eq!(actual, expected);
+    let missing: Vec<_> = expected.difference(&actual).cloned().collect();
+    let extra: Vec<_> = actual.difference(&expected).cloned().collect();
+    assert!(
+        missing.is_empty() && extra.is_empty(),
+        "target names mismatch; missing: {missing:?}, extra: {extra:?}"
+    );
 }
tests/steps/fs_steps.rs (2)

40-41: Fix invalid Errno variant: use ACCES (EACCES)

Errno::ACCESS does not exist; compilation fails.

Apply:

-        Err(e) if e == Errno::PERM || e == Errno::ACCESS => Utf8PathBuf::from("/dev/loop0"),
+        Err(e) if e == Errno::PERM || e == Errno::ACCES => Utf8PathBuf::from("/dev/loop0"),

50-52: Fix invalid Errno variant here as well

Mirror the ACCES fix for the char-device fallback.

Apply:

-        Err(e) if e == Errno::PERM || e == Errno::ACCESS => Utf8PathBuf::from("/dev/null"),
+        Err(e) if e == Errno::PERM || e == Errno::ACCES => Utf8PathBuf::from("/dev/null"),
tests/features_unix/fs_tests.feature (2)

1-3: Tag as Unix-only

Make Unix scope explicit for suite selection.

Apply:

-# Unix-specific file tests
-Feature: File-system tests
+# Unix-specific file tests
+@unix
+Feature: File-system tests

3-7: Add explicit cardinality assertion (7 targets)

Assert the exact count alongside the names.

Apply:

   Scenario: file system tests detect path types
     Given a file-type test workspace
     When the manifest file "tests/data/jinja_is.yml" is parsed
+    And the manifest has targets 7
     And the manifest has targets named "is-dir, is-file, is-symlink, is-pipe, is-block-device, is-char-device, is-device"
docs/netsuke-design.md (2)

811-825: Remove unimplemented file-system tests from the table.

Document only what the code actually registers: dir, file, symlink, pipe (Unix), block_device (Unix), char_device (Unix), and legacy device (Unix). The extra rows create a false contract.

-| Test                                                  | True when the operand…                                           |
-| ----------------------------------------------------- | ---------------------------------------------------------------- |
-| `dir` / `file` / `symlink`                            | …is that object type                                             |
-| `pipe` / `block_device` / `char_device` *(Unix-only)* | …is that object type                                             |
-| `device` (legacy, Unix-only)                          | …is a block or character device                                  |
-| `present`                                             | …exists (any type)                                               |
-| `owned`                                               | …is owned by the current UID                                     |
-| `readable` / `writable` / `executable`                | …has the corresponding permission bit for current user           |
-| `empty`                                               | …has size 0 bytes                                                |
-| `older_than(value)`                                   | …has `mtime` < given value (seconds, `timedelta`, or file)       |
-| `newer_than(value)`                                   | …has `mtime` > given value                                       |
-| `contains(substr)`                                    | …file’s text contains **substr**                                 |
-| `matches(regex)`                                      | …file’s text matches **regex**                                   |
-| `type(kind)`                                          | …is of the file-type string supplied (`"file"`, `"dir"`, etc.)   |
+| Test                                                  | True when the operand…                 |
+| ----------------------------------------------------- | -------------------------------------- |
+| `dir` / `file` / `symlink`                            | …is that object type                   |
+| `pipe` / `block_device` / `char_device` *(Unix-only)* | …is that object type                   |
+| `device` (legacy, Unix-only)                          | …is a block or character device        |

1670-1673: Fix footnote [^1] formatting and complete the access date.

Remove the stray numbered list marker and add the year.

-[^1]: Ninja, a small build system with a focus on speed. Accessed on 12 July
-
-      1. <https://ninja-build.org/>
+[^1]: Ninja, a small build system with a focus on speed. Accessed on 12 July 2025.
+      <https://ninja-build.org/>
src/stdlib.rs (3)

1-7: Add the required module-level //! documentation.

Comply with the docs mandate and clarify platform semantics.

+//! Filesystem predicate tests for MiniJinja.
+//!
+//! Registers `{% if path is <test> %}` tests:
+//! - dir, file, symlink (all platforms)
+//! - pipe, block_device, char_device, device (Unix-only; `device` is legacy)
+//!
+//! Missing paths yield `false`. Other I/O errors surface as `InvalidOperation`.
 use camino::Utf8Path;

36-38: Add a Rustdoc example to register.

Public APIs must include examples.

 /// Register standard library helpers with the Jinja environment.
+///
+/// # Examples
+/// ```
+/// # use minijinja::Environment;
+/// # fn main() {
+/// let mut env = Environment::new();
+/// netsuke::stdlib::register(&mut env);
+/// // env now supports: `is dir`, `is file`, `is symlink`, and (on Unix) device tests.
+/// # }
+/// ```
 pub fn register(env: &mut Environment<'_>) {

134-167: Remove CAP_MKNOD requirements in unit tests; use /dev fallbacks.

Creating block/char devices in tests fails on typical CI. Reuse existing nodes under /dev.

-        let bdev = root.join("b");
-        let cdev = root.join("c");
+        let mut bdev = root.join("b"); // placeholder; replaced on Unix below
+        let mut cdev = root.join("c"); // placeholder; replaced on Unix below
@@
-        #[cfg(unix)]
-        mknodat(
-            &handle,
-            "b",
-            FileType::BlockDevice,
-            Mode::RUSR | Mode::WUSR,
-            Dev::default(),
-        )
-        .expect("block");
-        #[cfg(unix)]
-        mknodat(
-            &handle,
-            "c",
-            FileType::CharacterDevice,
-            Mode::RUSR | Mode::WUSR,
-            Dev::default(),
-        )
-        .expect("char");
+        #[cfg(unix)]
+        {
+            // Discover existing devices in /dev to avoid CAP_MKNOD.
+            let dev = Dir::open_ambient_dir("/dev", ambient_authority()).expect("open /dev");
+            let mut found_block = None;
+            let mut found_char = None;
+            for entry in dev.entries().expect("list /dev") {
+                let md = entry.symlink_metadata().expect("md");
+                let ft = md.file_type();
+                if found_block.is_none() && ft.is_block_device() {
+                    found_block = Some(camino::Utf8PathBuf::from(format!("/dev/{}", entry.file_name())));
+                }
+                if found_char.is_none() && ft.is_char_device() {
+                    found_char = Some(camino::Utf8PathBuf::from(format!("/dev/{}", entry.file_name())));
+                }
+                if found_block.is_some() && found_char.is_some() {
+                    break;
+                }
+            }
+            bdev = found_block.unwrap_or_else(|| camino::Utf8PathBuf::from("/dev/loop0"));
+            cdev = found_char.unwrap_or_else(|| camino::Utf8PathBuf::from("/dev/null"));
+        }
📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d1dadd5 and 4ba8b85.

📒 Files selected for processing (5)
  • docs/netsuke-design.md (8 hunks)
  • src/stdlib.rs (1 hunks)
  • tests/features_unix/fs_tests.feature (1 hunks)
  • tests/steps/fs_steps.rs (1 hunks)
  • tests/steps/manifest_steps.rs (4 hunks)
🧰 Additional context used
📓 Path-based instructions (5)
**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

**/*.rs: Use en-GB-oxendict spelling and grammar in code comments (exceptions allowed for external API names)
Function documentation must include clear examples; test documentation should omit redundant examples
Keep file size manageable: no Rust source file longer than 400 lines; split large switches/dispatch tables and move big test data to external files
Disallow Clippy warnings; fix warnings in code rather than silencing them
Extract helper functions for long functions; maintain separation of concerns and CQRS
Group many related parameters into meaningful structs
If returning a large error type, consider using Arc to reduce data copied/returned
Each Rust module must begin with a module-level //! comment stating purpose and utility
Document public APIs with Rustdoc (///) so cargo doc can generate documentation
Prefer immutable data; avoid unnecessary mut bindings
Handle errors with Result instead of panicking where feasible
Avoid unsafe code unless absolutely necessary and document any usage clearly
Place function attributes after doc comments
Do not use return in single-line functions
Use predicate functions when conditional criteria have more than two branches
Do not silence lints except as a last resort; suppressions must be tightly scoped and include a clear reason
Prefer expect over allow for lint management
Use conditional compilation (#[cfg]/#[cfg_attr]) for functions unused under specific feature sets
Prefer .expect() over .unwrap()
Use concat!() for long string literals instead of escaping newlines with backslashes
Prefer single-line function bodies when appropriate (e.g., pub fn new(id: u64) -> Self { Self(id) })
Prefer semantic error enums (derive std::error::Error via thiserror) for inspectable conditions
Use an opaque eyre::Report only at the application boundary for human-readable logs; do not expose in public APIs
Never export eyre::Report from libraries; convert to domain error enums at API boundaries and to eyre only in main/top-level async tas...

Files:

  • tests/steps/fs_steps.rs
  • tests/steps/manifest_steps.rs
  • src/stdlib.rs

⚙️ CodeRabbit configuration file

**/*.rs: * Seek to keep the cyclomatic complexity of functions no more than 12.

  • Adhere to single responsibility and CQRS

  • Place function attributes after doc comments.

  • Do not use return in single-line functions.

  • Move conditionals with >2 branches into a predicate function.

  • Avoid unsafe unless absolutely necessary.

  • Every module must begin with a //! doc comment that explains the module's purpose and utility.

  • Comments and docs must follow en-GB-oxendict (-ize / -our) spelling and grammar

  • Lints must not be silenced except as a last resort.

    • #[allow] is forbidden.
    • Only narrowly scoped #[expect(lint, reason = "...")] is allowed.
    • No lint groups, no blanket or file-wide suppression.
    • Include FIXME: with link if a fix is expected.
  • Where code is only used by specific features, it must be conditionally compiled or a conditional expectation for unused_code applied.

  • Use rstest fixtures for shared setup and to avoid repetition between tests.

  • Replace duplicated tests with #[rstest(...)] parameterised cases.

  • Prefer mockall for mocks/stubs.

  • Prefer .expect() over .unwrap()

  • Ensure that any API or behavioural changes are reflected in the documentation in docs/

  • Ensure that any completed roadmap steps are recorded in the appropriate roadmap in docs/

  • Files must not exceed 400 lines in length

    • Large modules must be decomposed
    • Long match statements or dispatch tables should be decomposed by domain and collocated with targets
    • Large blocks of inline data (e.g., test fixtures, constants or templates) must be moved to external files and inlined at compile-time or loaded at run-time.
  • Environment access (env::set_var and env::remove_var) are always unsafe in Rust 2024 and MUST be marked as such

    • For testing of functionality depending upon environment variables, dependency injection and the mockable crate are the preferred option.
    • If mockable cannot be used, env mutations in tests ...

Files:

  • tests/steps/fs_steps.rs
  • tests/steps/manifest_steps.rs
  • src/stdlib.rs
tests/**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

tests/**/*.rs: Write unit and behavioural tests for new functionality; run before and after changes
Use rstest fixtures for shared setup and replace duplicated tests with #[rstest(...)] parameterised cases
Prefer mockall for mocks/stubs
Mock non-deterministic dependencies via dependency injection using mockable (traits like Env and Clock) where appropriate; follow docs/reliable-testing-in-rust-via-dependency-injection.md

Files:

  • tests/steps/fs_steps.rs
  • tests/steps/manifest_steps.rs
docs/**/*.{rs,md}

📄 CodeRabbit inference engine (docs/rust-doctest-dry-guide.md)

In fenced code blocks for docs, explicitly mark code fences with rust (```rust) for clarity

Files:

  • docs/netsuke-design.md
docs/**/*.md

📄 CodeRabbit inference engine (AGENTS.md)

docs/**/*.md: Use docs/ as the knowledge base and source of truth for requirements, dependencies, and architecture
Proactively update docs/ when decisions, requirements, libraries, or architecture change to keep documentation current
Documentation must use en-GB-oxendict spelling and grammar (LICENSE name unchanged)

Files:

  • docs/netsuke-design.md
**/*.md

📄 CodeRabbit inference engine (AGENTS.md)

**/*.md: Validate Markdown with make markdownlint
Run make fmt after documentation changes to format Markdown and fix table markup
Validate Mermaid diagrams in Markdown files using make nixie
Wrap Markdown paragraphs and bullet points at 80 columns; code blocks at 120; do not wrap tables or headings
Use dashes (-) for list bullets in Markdown
Use GitHub-flavoured Markdown footnotes ([^1]) for references

Files:

  • docs/netsuke-design.md

⚙️ CodeRabbit configuration file

**/*.md: * Avoid 2nd person or 1st person pronouns ("I", "you", "we")

  • Use en-GB-oxendict (-ize / -our) spelling and grammar
  • Headings must not be wrapped.
  • Documents must start with a level 1 heading
  • Headings must correctly increase or decrease by no more than one level at a time
  • Use GitHub-flavoured Markdown style for footnotes and endnotes.
  • Numbered footnotes must be numbered by order of appearance in the document.

Files:

  • docs/netsuke-design.md
🧬 Code graph analysis (1)
tests/steps/manifest_steps.rs (1)
test_support/src/env.rs (4)
  • set_var (28-28)
  • set_var (32-34)
  • set_var (38-40)
  • set_var (61-67)
🔍 Remote MCP Deepwiki

, which explains why the PR includes fallback logic for unprivileged device creation in tests.

Project Context from DeepWiki The netsuke project is a build system compiler that transforms declarative YAML manifests into efficient Ninja build graphs, with filesystem tests being part of the standard library to provide Jinja template capabilities for querying file properties. The stdlib module provides built-in helpers including file-system tests like dir, file, symlink, pipe, and device to check properties of files and directories within Netsukefile manifests. The manifest parsing in netsuke follows a two-stage pipeline: first Jinja templating to resolve dynamic content, then YAML deserialization. The Jinja environment is configured with custom functions and filters to provide build-specific functionality, serving as the "logic layer" for the build system.

Key Review Points

  1. Security considerations: The use of cap-std provides sandboxed filesystem access during template evaluation
  2. Cross-platform compatibility: The PR properly guards Unix-specific tests behind #[cfg(unix)]
  3. Test infrastructure: The addition of comprehensive test fixtures for different file types using appropriate system calls
  4. MiniJinja integration: Correct usage of the test registration API for extending template capabilities
🔇 Additional comments (8)
tests/steps/manifest_steps.rs (2)

9-9: LGTM: deterministic set chosen

Using BTreeSet for stable order is appropriate for diagnostics.


92-94: LGTM: expand before set

Expanding the value prior to set_var aligns with the feature steps’ expectations.

tests/steps/fs_steps.rs (3)

1-2: LGTM: module purpose documented

Module-level doc comment meets guidelines.


22-30: LGTM: FIFO fixture creation

Unprivileged FIFO via mknodat with 0600 is correct.


11-79: Leave as‑is — fs_steps already Unix‑gated.

#[cfg(unix)] precedes mod fs_steps in tests/steps/mod.rs (line 7), so no additional cfg guard is required.

docs/netsuke-design.md (2)

826-834: LGTM: Behavioural notes match implementation.

Non‑Unix registering only pipe and device as always‑false aligns with src/stdlib.rs.


1200-1215: LGTM: CLI forwarding and stdio piping.

Forwarding -j, resolving -C internally, and piping stdio is correct and coherent with Section 6.1.

src/stdlib.rs (1)

80-105: LGTM: Error handling and NotFound semantics.

Return false on NotFound; wrap other I/O errors as InvalidOperation with source preserved.

Comment thread src/stdlib.rs
Comment thread tests/steps/fs_steps.rs Outdated
Comment thread tests/steps/manifest_steps.rs
@leynos
Copy link
Copy Markdown
Owner Author

leynos commented Sep 12, 2025

@coderabbitai pause

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Sep 12, 2025

✅ Actions performed

Reviews paused.

@leynos
Copy link
Copy Markdown
Owner Author

leynos commented Sep 12, 2025

@coderabbitai Have the following now been resolved?

  • In fs_steps, consider restoring or isolating the modified environment variables after each scenario to prevent test state from leaking across Cucumber steps.
  • The error‐handling branches in is_file_type for opening the directory and reading metadata are almost identical—extracting a small helper to wrap the IO→Jinja error conversion could reduce duplication.
  • It might be worth adding a note in the docs or comments to clarify that symlink tests use symlink_metadata (which doesn’t follow links) so users know exactly why is_symlink and is_file won’t both be true for the same path.

@coderabbitai

This comment was marked as resolved.

codescene-delta-analysis[bot]

This comment was marked as outdated.

codescene-delta-analysis[bot]

This comment was marked as outdated.

@leynos

This comment was marked as resolved.

@coderabbitai

This comment was marked as resolved.

codescene-delta-analysis[bot]

This comment was marked as outdated.

codescene-delta-analysis[bot]

This comment was marked as outdated.

Repository owner deleted a comment from coderabbitai Bot Sep 14, 2025
Repository owner deleted a comment from coderabbitai Bot Sep 14, 2025
codescene-delta-analysis[bot]

This comment was marked as outdated.

codescene-delta-analysis[bot]

This comment was marked as outdated.

Repository owner deleted a comment from coderabbitai Bot Sep 14, 2025
codescene-delta-analysis[bot]

This comment was marked as outdated.

codescene-delta-analysis[bot]

This comment was marked as outdated.

Repository owner deleted a comment from coderabbitai Bot Sep 14, 2025
codescene-delta-analysis[bot]

This comment was marked as outdated.

@leynos leynos force-pushed the codex/implement-file-system-tests-with-validation-6iy3e8 branch from 0c7473c to f161850 Compare September 14, 2025 19:20
@leynos leynos merged commit 5b65a2a into main Sep 14, 2025
7 checks passed
@leynos leynos deleted the codex/implement-file-system-tests-with-validation-6iy3e8 branch September 14, 2025 19:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant