deserialize mutates the caller's dictionary by calling pop().
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 78/100
Direzione di ricerca
Inizia leggendo ComplexTypeMetaDataMixin.deserialize, BasicTypeMetaDataMixin.deserialize ed EnumWithMetaMixin.deserialize, che secondo l’issue modificano il dizionario di input. Esegui i test di regressione inclusi per ComplexTypeMetaDataMixin e BasicTypeMetaDataMixin, quindi esamina anche EnumWithMetaMixin. Il lavoro è completo quando ogni metodo mantiene invariato il dizionario del chiamante, incluse le chiavi con prefisso @, nelle chiamate a deserialize.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Bug Report
Steps to Reproduce:
- Build a dict representing a serialised Rune object, including @-prefixed
metadata keys (e.g. {"@type": "...", "@data": "..."}). - Pass the dict to ComplexTypeMetaDataMixin.deserialize,
BasicTypeMetaDataMixin.deserialize, or EnumWithMetaMixin.deserialize. - Inspect the original dict after the call.
Expected Result:
The original dict is unchanged; deserialize works on its own copy.
Actual Result:
The @-prefixed keys are absent from the original dict after the call:
ComplexTypeMetaDataMixin.deserialize calls obj.pop(k) for every @-key.
BasicTypeMetaDataMixin.deserialize and EnumWithMetaMixin.deserialize call
obj.pop('@data').
Re-using the same dict for a second deserialize call (e.g. round-trip or
batch processing) therefore fails.
Environment:
rune-python-runtime 2.2.2, pydantic 2.14.1, Python 3.11
Additional Context:
All three deserialize methods operate on the input dict directly rather than
a shallow copy.
Fix: replace pop() calls with dict comprehensions / dict.get() operating on a
local copy so the caller's dict is never modified.
import pytest
import finos._bundle
from finos.cdm.base.staticdata.asset.common.AssetTypeEnum import AssetTypeEnum
from finos.cdm.base.staticdata.asset.common.Security import Security
from rune.runtime.metadata import DateWithMeta
def test_r6_complex_type_deserialize_does_not_mutate_dict():
'''ComplexTypeMetaDataMixin.deserialize should not pop @-keys from the
caller's dict. After the call, @type must still be present.'''
input_dict = {
'@type': 'finos.cdm.base.staticdata.asset.common.Security',
'assetType': AssetTypeEnum.SECURITY.value,
}
original_type_key = input_dict.get('@type')
try:
Security.deserialize(input_dict, set())
except Exception:
pass # other errors are acceptable; we only check dict mutation
assert '@type' in input_dict, (
'deserialize mutated the caller\'s dict: @type was popped'
)
assert input_dict['@type'] == original_type_key
def test_r6_basic_type_deserialize_does_not_mutate_dict():
'''BasicTypeMetaDataMixin.deserialize should not pop @data from the
caller's dict. After the call, @data must still be present.'''
import datetime
input_dict = {'@data': '2024-01-15'}
try:
DateWithMeta.deserialize(
input_dict,
lambda x: x,
(datetime.date, str),
set(),
)
except Exception:
pass
assert '@data' in input_dict, (
'deserialize mutated the caller\'s dict: @data was popped'
)
- Lingua principale
- Python
- Stelle
- 0
- Fork
- 4
- Merge medio
- 1g 11h
- PR unite (30g)
- 3
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di finos/rune-python-runtime
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
finos/rune-python-runtime#51 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
finos/rune-python-runtime#50 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
finos/rune-python-runtime#48 ·
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 84/100
finos/rune-python-runtime#47 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
finos/rune-python-runtime#43 ·
Tutte le issue di finos/rune-python-runtime
Issue simili
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 85/100
521xueweihan/HelloGitHub#4115 ·
-
get_lldp_neighbors_detail: query asks for 'max-address' (typo for 'mac-address'), so remote_chassis_id is always emptyForse già presa @Jah-yee l’ha presa oggi. Aperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
-
lesson-submission pending-review
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 74/100
Ikalus1988/MisakaNet#3899 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
aws-samples/sample-per-model-bedrock#549 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 90/100