feat(openenum): add is_open boolean slot to enum expressions#261
feat(openenum): add is_open boolean slot to enum expressions#261noelmcloughlin wants to merge 1 commit into
Conversation
4d688c8 to
19a714c
Compare
|
The basic idea makes total sense to me. I just wonder if we want to have a single way of declaring this across the few places we want similar behavior - e.g.
Basically I am in favor of this but just wondering if we want to have a similar mechanism/pattern across all "openness" specs, or if there is a reason this one should be a boolean only |
|
I am just now thinking maybe But issue linkml/linkml#127 proposes 'open enums' via I noted linkml/linkml#1595 discusses |
|
This has been a general naming tension between how I normally think and how linkml does names - I generally tend towards more general names whose meaning varies by context, and linkml tends to have specific names and only use them in one or a few contexts in which is has a single meaning. So where I would probably gravitate towards a single
But anyway, need to decide if we want to have common mechanism/pattern for declaring "all/none/some" openness, or if sometimes binary and sometimes trinary is fine. That also narrows down which names work. |
|
As this issue is slightly beyond my current ability to judge, @amc-corey-cox has volunteered to thinking through the implications and presenting a short version of this at the next developer call in one week. Sorry for the delay - please keep pushing if we slow you down; I can find more aggressive alternative review processes. 🚀 |
There was a problem hiding this comment.
The shape looks right to me. is_open as a boolean fits the metamodel: it mirrors id_prefixes_are_closed — one slot builds the value set, another says whether it's exhaustive. is_open: true just demotes the permissible values from MUST to SHOULD; it doesn't collapse the range.
@sneakers-the-rat on binary-vs-trinary: I don't think enums need the all/none/some shape that extra_slots has. extra_slots had to be trinary because it has no set-construction of its own. Enums already do that via permissible_values/reachable_from/matches/include/minus. And per-value constraints already work: a slot pattern holds independently of enum membership, so "extras must be well-formed" needs nothing new.
If a real case for open_to: shows up, that will need more definition than we're ready to do here and we should design around the live case.
| exact_mappings: | ||
| - cdisc:PermissibleValue | ||
|
|
||
| is_open: |
There was a problem hiding this comment.
A boolean feels right here. id_prefixes_are_closed (line 249) is the precedent: one slot builds the set, another says if it's exhaustive. is_open: true is also the top case of a future open_to: <expr>, so this forecloses nothing.
| that are not in the set of permissible values are permitted (though they SHOULD be | ||
| drawn from the permissible values if available). If false (runtime default), the | ||
| enumeration is closed and data values MUST be drawn from the set of permissible values. | ||
| ifabsent: false |
There was a problem hiding this comment.
Drop ifabsent: false. It materializes False on every enum and the dumper emits it, so all schemas grow an is_open: false line. No other boolean slot in the metamodel uses ifabsent.
| ifabsent: false | ||
| comments: | ||
| - An open enumeration is analogous to the `allow-other="yes"` construct in the OSCAL Metamodel. | ||
| - When an enum is open, the permissible values are advisory - they document the recommended |
There was a problem hiding this comment.
This contradicts the description above. Open means the value set isn't exhaustive, not that other constraints vanish — a slot pattern should still hold. The "maps to a plain string" bit is a JSON Schema lowering detail; leave that to linkml#3712 and remove the reference to JSON Schema.
| - https://github.com/linkml/linkml/pull/3712 | ||
| in_subset: | ||
| - SpecificationSubset | ||
| # BasicSubset |
There was a problem hiding this comment.
Drop the commented-out # BasicSubset.
| in_subset: | ||
| - SpecificationSubset | ||
| # BasicSubset | ||
| status: testing |
There was a problem hiding this comment.
Worth a tests/input/examples/schema_definition-open-enums.yaml so make test-examples covers it.
This PR adds
is_openboolean slot to enum expressions in the meta model.See linkml/linkml#127 and linkml/linkml#3712