Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

deserialize mutates the caller's dictionary by calling pop().

Abierto Apto para principiantes
#52 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
78/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
python
Área
backend

Línea de trabajo

Empieza leyendo ComplexTypeMetaDataMixin.deserialize, BasicTypeMetaDataMixin.deserialize y EnumWithMetaMixin.deserialize, que, según indica la issue, modifican el diccionario de entrada. Ejecuta las pruebas de regresión incluidas para ComplexTypeMetaDataMixin y BasicTypeMetaDataMixin; después, inspecciona también EnumWithMetaMixin. Se considera terminado cuando cada método conserva sin cambios el diccionario del llamador, incluidas sus claves que empiezan por @, en las llamadas a deserialize.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Bug Report

Steps to Reproduce:
  1. Build a dict representing a serialised Rune object, including @-prefixed
    metadata keys (e.g. {"@type": "...", "@data": "..."}).
  2. Pass the dict to ComplexTypeMetaDataMixin.deserialize,
    BasicTypeMetaDataMixin.deserialize, or EnumWithMetaMixin.deserialize.
  3. 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'
    )
Lenguaje dominante
Python
Estrellas
0
Forks
4
Merge medio
1 d 11 h
PR fusionados (30 d)
3

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de finos/rune-python-runtime

Todos los issues de finos/rune-python-runtime

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.