feat: add RankClass and LegacyRank rank attribute value objects #202

Merged
manlycucumber merged 1 commit from feature/10-rank-class into develop 2026-07-01 05:08:17 +00:00
manlycucumber commented 2026-07-01 05:07:12 +00:00 (Migrated from github.com)

Closes #10

The first per-edition attribute value objects (Wave 1 · Epic #6). Rank is an edition attribute, never part of an observance's identity.

  • RankClass — the 1960 classes I–IV as a comparable value object: classI()classIV() / fromOrdinal(), ordinal()/label(), and a total ordering (isHigherThan/isLowerThan/equals; class I is highest).
  • LegacyRank — the native pre-1960 rank token (duplex-i-classis, semiduplex, simplex, …) retained verbatim for round-trip fidelity; the lossy-upward remap onto I–IV is a data-load concern of the edition layer (v0.3.0).
  • New Introibo\Core\Attribute\ namespace (src/Attribute/) cleanly separates Layer-2 attributes from Layer-1 identity (src/Observance/).

Constructed from edition attribute data, not parsed from an identifier (per the reworded #10).

Verified locally: phpcs 0 · phpstan L6 [OK] · phpunit 49 tests, 111 assertions OK.

Closes #10 The first per-edition **attribute** value objects (Wave 1 · Epic #6). Rank is an edition attribute, never part of an observance's identity. - **`RankClass`** — the 1960 classes I–IV as a comparable value object: `classI()`…`classIV()` / `fromOrdinal()`, `ordinal()`/`label()`, and a total ordering (`isHigherThan`/`isLowerThan`/`equals`; class I is highest). - **`LegacyRank`** — the native pre-1960 rank token (`duplex-i-classis`, `semiduplex`, `simplex`, …) retained verbatim for round-trip fidelity; the lossy-upward remap onto I–IV is a data-load concern of the edition layer (v0.3.0). - New `Introibo\Core\Attribute\` namespace (`src/Attribute/`) cleanly separates Layer-2 attributes from Layer-1 identity (`src/Observance/`). Constructed from edition attribute data, **not** parsed from an identifier (per the reworded #10). Verified locally: phpcs **0** · phpstan L6 **`[OK]`** · phpunit **49 tests, 111 assertions** OK.
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Directorium/Core!202
No description provided.