Changeset a17e4f6 in flexoentity


Ignore:
Timestamp:
01/15/26 11:19:14 (2 hours ago)
Author:
Enrico Schwass <ennoausberlin@…>
Branches:
master
Parents:
a1c4ba3
Message:

add fork method to FlexoEntity to simplify copy / paste operations

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • flexoentity/flexo_entity.py

    ra1c4ba3 ra17e4f6  
    306306        obj._deserialize_content(data.get("content", {}))
    307307        return obj
     308    def fork(
     309        self,
     310        *,
     311        domain_id: str | None = None,
     312        reset_state: bool = True,
     313        keep_origin: bool = True,
     314    ) -> "FlexoEntity":
     315        """
     316        Create a new independent entity derived from this one.
     317        """
     318        data = self.to_dict()
     319        meta = data["meta"]
     320
     321        # Provenance
     322        if keep_origin:
     323            meta["origin"] = str(self.flexo_id)
     324
     325        # Reset lifecycle
     326        if reset_state:
     327            meta["version"] = 1
     328            meta["state"] = EntityState.DRAFT.value
     329
     330        # Generate new identity
     331        new_flexo_id = FlexOID.safe_generate(
     332            domain_id=domain_id or self.domain_id,
     333            entity_type=self.entity_type.value,
     334            state=meta["state"],
     335            text=self.text_seed,
     336            version=meta["version"],
     337        )
     338
     339        meta["flexo_id"] = str(new_flexo_id)
     340
     341        return self.__class__.from_dict(data)
    308342
    309343    def to_json(self, indent: int = 2) -> str:
     
    453487            )
    454488
    455         self.origin = self.flexo_id
    456         self.flexo_id = new_fid
     489            self.origin = self.flexo_id
     490            self.flexo_id = new_fid
    457491
    458492        return self
  • tests/test_id_lifecycle.py

    ra1c4ba3 ra17e4f6  
    115115    with pytest.raises(RuntimeError, match="mark obsolete"):
    116116        q.bump_version()
     117
     118def test_fork_creates_independent_domain(sample_domain):
     119    original = sample_domain
     120
     121    forked = original.fork(domain_id="DST")
     122
     123    # ─── identity ───────────────────────────────────────────────────────
     124    assert forked is not original
     125    assert isinstance(forked.flexo_id, FlexOID)
     126    assert forked.flexo_id != original.flexo_id
     127
     128    # ─── lifecycle reset ────────────────────────────────────────────────
     129    assert forked.state == EntityState.DRAFT
     130    assert forked.version == 1
     131
     132    # ─── provenance ─────────────────────────────────────────────────────
     133    assert forked.origin == str(original.flexo_id)
     134
     135    # ─── domain reassigned ──────────────────────────────────────────────
     136    assert forked.domain_id == "DST"
     137
     138def test_fork_does_not_mutate_original(sample_domain):
     139    original = sample_domain
     140    original_id = original.flexo_id
     141    original_fp = original.fingerprint
     142
     143    _ = original.fork(domain_id="DST")
     144
     145    assert original.flexo_id == original_id
     146    assert original.fingerprint == original_fp
     147    assert original.origin is None
     148
     149def test_fork_does_not_shadow_state(sample_domain):
     150    forked = sample_domain.fork(domain_id="DST")
     151
     152    # No instance attribute allowed
     153    assert "state" not in forked.__dict__
     154
     155    # Property must still work
     156    assert forked.state == EntityState.DRAFT
     157
     158def test_fork_without_origin(sample_domain):
     159    forked = sample_domain.fork(domain_id="DST", keep_origin=False)
     160
     161    assert forked.origin is None
Note: See TracChangeset for help on using the changeset viewer.