From afb13508dcfc4d70bed640fd9d997c9c216df746 Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Fri, 14 Aug 2026 16:33:16 +0200 Subject: [PATCH] #14514 Remove PERFID and DSHIFT from the ORIONEVENTS format They are not planned as part of the file format. PERFID on a completion event is now an unknown-attribute error like any other unrecognized key, and DSHIFT on keyword events is forwarded unchanged instead of being stripped with a warning. FILTER keeps its ignore-with-warning behavior outside PERFORATION events. --- GrpcInterface/Python/rips/orion_events.py | 14 +++++------ .../Python/rips/tests/test_orion_events.py | 24 +++++++++---------- docs/orionEvents.md | 4 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/GrpcInterface/Python/rips/orion_events.py b/GrpcInterface/Python/rips/orion_events.py index 8dd72d296e..6400bd9a92 100644 --- a/GrpcInterface/Python/rips/orion_events.py +++ b/GrpcInterface/Python/rips/orion_events.py @@ -103,8 +103,8 @@ Notes on the grammar: searched in STATIC_NATIVE, then DYNAMIC_NATIVE, then GENERATED results; a ``TYPE.`` qualifier (``STATIC``/``DYNAMIC``/``GENERATED`` or the full ``*_NATIVE`` form, case-insensitive) restricts the search to that type. -* Any other attribute key parses; keys the applier does not support yet - (``PERFID``, ``DSHIFT``) are ignored with a warning when applied. +* Any other attribute key parses; ``FILTER`` on events other than + PERFORATION is ignored with a warning when applied. * The parser recovers per line and reports **all** errors in one pass: the raised :class:`OrionParseError` carries one :class:`ParseIssue` per problem. Unknown names come with "did you mean" suggestions where possible. @@ -853,11 +853,11 @@ class ApplyReport: _POLICIES = ("warn", "error", "skip") # Attributes accepted on a keyword event but intentionally not emitted. -_IGNORED_KEYWORD_ATTRS = {"DSHIFT", "FILTER", "PERFID"} +_IGNORED_KEYWORD_ATTRS = {"FILTER"} # Completion event attribute handling: (required, known-optional) per type. -# FILTER is applied on PERFORATION events; FILTER/PERFID are accepted on the -# other completion events but ignored with a warning. +# FILTER is applied on PERFORATION events; it is accepted on the other +# completion events but ignored with a warning. _PERF_REQUIRED = ("MDSTART", "MDEND") _PERF_KNOWN = {"MDSTART", "MDEND", "RADIUS", "SKIN", "COMPLETION_NUMBER", "FILTER"} _TUBING_REQUIRED = ("MDSTART", "MDEND") @@ -872,7 +872,7 @@ _VALVE_KNOWN = {"MD", "TYPE", "STATE", "CV", "AREA"} | { } _STATE_REQUIRED = ("STATE",) _STATE_KNOWN = {"STATE"} -_COMPLETION_IGNORED = {"FILTER", "PERFID"} +_COMPLETION_IGNORED = {"FILTER"} _PERF_IGNORED = _COMPLETION_IGNORED # backwards-compatible alias # ORIONEVENTS -> Eclipse item-name translations per keyword. @@ -1189,7 +1189,7 @@ def _apply_perforation( ctx: Optional[_FilterContext] = None, ) -> None: if not _check_completion_attrs( - event, "PERFORATION", _PERF_KNOWN, _PERF_REQUIRED, report, ignored={"PERFID"} + event, "PERFORATION", _PERF_KNOWN, _PERF_REQUIRED, report, ignored=set() ): return diff --git a/GrpcInterface/Python/rips/tests/test_orion_events.py b/GrpcInterface/Python/rips/tests/test_orion_events.py index c3345afa00..e535836580 100644 --- a/GrpcInterface/Python/rips/tests/test_orion_events.py +++ b/GrpcInterface/Python/rips/tests/test_orion_events.py @@ -227,11 +227,6 @@ class TestParsing: assert filter_attr.quoted is True assert doc.wells[0].events[0].attributes["MDEND"].value == 2 - def test_perfid_attribute_parses(self): - text = 'ORIONEVENTS 2.0\nWELL "W"\n @2018-01-01 PERFORATION MDSTART=1 MDEND=2 PERFID=Valysar\n' - doc = parse_orion_events(text) - assert doc.wells[0].events[0].attributes["PERFID"].value == "Valysar" - def test_trailing_comment_ignored_but_not_inside_quotes(self): text = ( 'ORIONEVENTS 2.0\nWELL "W"\n' @@ -752,17 +747,18 @@ class TestApplying: assert data["NEW_VALUE"] == 50 # VALUE -> NEW_VALUE assert data["CMODE"] == "BHP" - def test_dshift_is_ignored_with_warning(self): + def test_keyword_attributes_forward_without_special_casing(self): + # DSHIFT is not part of the format; it forwards unchanged like any + # other attribute instead of being stripped. text = ( 'ORIONEVENTS 2.0\nWELL "55_33-A-1"\n' " @2018-01-01 WCONHIST STATUS=OPEN CMODE=ORAT DSHIFT=10\n" ) timeline, report = self._apply(text) data = timeline.keyword_calls[0]["keyword_data"] - assert "DSHIFT" not in data - # Event date is NOT shifted. + assert data["DSHIFT"] == 10 assert timeline.keyword_calls[0]["event_date"] == "2018-01-01" - assert any("DSHIFT" in w for w in report.warnings) + assert not report.warnings def test_report_dates_on_apply_report(self): text = ( @@ -778,14 +774,18 @@ class TestApplying: assert report.report_dates == ["2018-03-01", "2018-07-01"] assert report.events_applied == 1 - def test_perfid_on_perforation_warns_and_applies(self): + def test_perfid_on_perforation_is_unknown_attribute_error(self): + # PERFID is not part of the format; it is rejected like any other + # unknown completion attribute. text = ( 'ORIONEVENTS 2.0\nWELL "55_33-A-1"\n' " @2018-01-01 PERFORATION MDSTART=1 MDEND=2 PERFID=Valysar\n" ) timeline, report = self._apply(text) - assert report.events_applied == 1 - assert any("PERFID" in w for w in report.warnings) + assert report.events_applied == 0 + assert report.events_skipped == 1 + assert any("PERFID" in e for e in report.errors) + assert not timeline.perf_calls def test_filter_on_keyword_event_warns_and_applies(self): text = ( diff --git a/docs/orionEvents.md b/docs/orionEvents.md index 4005d5ef9f..e395e37ac6 100644 --- a/docs/orionEvents.md +++ b/docs/orionEvents.md @@ -183,7 +183,7 @@ Event lines are `@ KEY=VALUE ...`. Inside a WELL block, |---|---|---| | `STATE` | yes | `well_state`: `OPEN`, `SHUT` or `STOP` | -Unknown attributes on a completion event are an error and skip the event. `PERFID` is accepted but ignored with a warning (reserved for future use); on completion events other than `PERFORATION`, `FILTER` is likewise ignored with a warning. +Unknown attributes on a completion event are an error and skip the event. On completion events other than `PERFORATION`, `FILTER` is ignored with a warning. ### Well keyword events @@ -194,7 +194,7 @@ Any other event type in a WELL block is passed through as an Eclipse well keywor | `WCONHIST` | `VFP` → `VFP_TABLE` | | `WELTARG` | `VALUE` → `NEW_VALUE` | -All other keywords (`WRFTPLT`, `WCONPROD`, `WELOPEN`, ...) forward attributes unchanged, so attribute keys must match the Eclipse item names ResInsight uses for that keyword. `DSHIFT`, `FILTER` and `PERFID` are ignored with a warning. +All other keywords (`WRFTPLT`, `WCONPROD`, `WELOPEN`, ...) forward attributes unchanged, so attribute keys must match the Eclipse item names ResInsight uses for that keyword. `FILTER` is ignored with a warning. An event type that closely resembles a misspelled built-in (e.g. `PERFORATIN`) is **not** passed through as a keyword; it is handled by the `on_unknown_event` policy with a "did you mean" hint.