model_copy(deep=True) follows __rune_parent links, producing an attached copy instead of a detached subtree.

Đang mở
#49 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

@whawk46 đang làm issue này rồi.

Từ ngày 30/10/2026.

  • #54 của @whawk46 — đang mở

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
58/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
python
Lĩnh vực
backend

Hướng nghiên cứu

Start with rune/runtime/cow.py and the BaseDataClass definition, then inspect how model_copy(deep=True) handles dict and PARENT_PROP. Run the included regression test for _clone_for_write and check whether a deep copy omits the parent link while preserving the copied subtree. Done means the clone has no rune parent and deep nested graphs avoid copying their ancestors.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

Bug Report

Steps to Reproduce:
  1. Build a parent–child object graph (any nested CDM types where fields are
    set via normal assignment, which calls _set_rune_parent).
  2. Call a generated Rune function that writes to a nested field — the function
    body calls _clone_for_write, which calls value.model_copy(deep=True).
  3. For a graph of depth d, observe O(d²) object allocations; for deep CDM
    graphs, observe RecursionError.
Expected Result:

_clone_for_write returns a detached copy with no __rune_parent (the clone is
independent of the original tree).

Actual Result:

model_copy(deep=True) uses copy.deepcopy on dict, which follows the
PARENT_PROP (__rune_parent) pointer up the tree. The clone retains the
original parent reference, and copies of the entire ancestor chain are made.

Environment:

rune-python-runtime 2.2.2, pydantic 2.14.1, Python 3.11

Additional Context:

cow.py _clone_for_write has no special handling for the back-link.
Fix: add a deepcopy override to BaseDataClass that excludes PARENT_PROP
so model_copy(deep=True) produces a detached subtree.

import pytest

import finos._bundle
from finos.cdm.base.staticdata.asset.common.Security import Security
from rune.runtime.cow import _clone_for_write

def test_r3_clone_for_write_copies_rune_parent():
    '''_clone_for_write(child) should produce a detached copy with no
    rune_parent.  Currently model_copy(deep=True) copies the parent link,
    so the clone remains attached to the original parent.'''
    parent = Security.model_construct()
    child = Security.model_construct()
    child._set_rune_parent(parent)

    assert child.get_rune_parent() is parent  # confirm setup

    clone = _clone_for_write(child)

    # A detached clone must not carry the original parent reference.
    # Bug: clone.get_rune_parent() returns the original parent object.
    assert clone.get_rune_parent() is None, (
        '_clone_for_write should produce a detached copy (no rune_parent); '
        f'got {clone.get_rune_parent()}'
    )
Ngôn ngữ chính
Python
Star
0
Fork
4
Merge trung bình
1 ngày 17 giờ
Pull request đã merge (30 ngày)
2

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của finos/rune-python-runtime

Tất cả issue của finos/rune-python-runtime

Issue tương tự

Thêm issue về Python

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.