Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pasting association items fails #3263

Closed
2 of 3 tasks
amolenaar opened this issue Apr 22, 2024 · 0 comments · Fixed by #3264
Closed
2 of 3 tasks

Pasting association items fails #3263

amolenaar opened this issue Apr 22, 2024 · 0 comments · Fixed by #3264
Labels
bug An issue in the application

Comments

@amolenaar
Copy link
Member

amolenaar commented Apr 22, 2024

Describe the bug

An issue occurs during diagram updating after new elements have been pasted.

This looks like a regression, due to the changes in the update process in 2.25.0.

To Reproduce

Steps to reproduce the behavior:

  1. Open models/UML.gaphor
  2. Copy all elements in one model
  3. Create a new diagram
  4. Paste in new diagram -> error
Error Report
Gaphor version:         2.25.0
Operating System:       Darwin (23.4.0)
Display:                GdkMacosDisplay
Python version:         3.11.9
GTK version:            4.14.3
Adwaita version:        1.5.0
GtkSourceView version:  5.11.0
Cairo version:          1.18.0
Pango version:          1.52.2
PyGObject version:      3.48.2
Pycairo version:        1.26.0


Errors:

Time since application startup: 0:00:58
|Traceback (most recent call last):
|  File "/Users/arjan/Development/gaphor/gaphor/ui/copyservice.py", line 84, in on_paste
|    new_items = paster(copy_buffer.buffer, diagram)
|                │      │                   └ <gaphor.core.modeling.diagram.Diagram element cd4825cc-0093-11ef-8465-be7f4daace3f>
|                │      └ <copyservice.CopyBuffer object at 0x122be1940 (gaphor+ui+copyservice+CopyBuffer at 0x142ce3ff0)>
|                └ <function paste_link at 0x10a023060>
|  File "/Users/arjan/Development/gaphor/gaphor/diagram/copypaste.py", line 65, in paste_link
|    return _paste(copy_data, diagram, full=False)
|           │      │          └ <gaphor.core.modeling.diagram.Diagram element cd4825cc-0093-11ef-8465-be7f4daace3f>
|           │      └ CopyData(elements={'aac36821-e964-11ea-96dc-bf74f1f80424': PresentationCopy(cls=<class 'gaphor.UML.classes.association.Associati...
|           └ <function _paste at 0x10a0489a0>
|  File "/Users/arjan/Development/gaphor/gaphor/diagram/copypaste.py", line 238, in _paste
|    element_lookup(old_id)
|    │              └ 'aac36821-e964-11ea-96dc-bf74f1f80424'
|    └ <function _paste.<locals>.element_lookup at 0x121d5aa20>
|  File "/Users/arjan/Development/gaphor/gaphor/diagram/copypaste.py", line 225, in element_lookup
|    new_elements[ref] = next(paster)
|    │            │           └ <generator object _paste_presentation at 0x120cf56c0>
|    │            └ 'aac36821-e964-11ea-96dc-bf74f1f80424'
|    └ {'70258172-e964-11ea-96dc-bf74f1f80424': <gaphor.core.modeling.diagram.Diagram element cd4825cc-0093-11ef-8465-be7f4daace3f>}
|  File "/Users/arjan/Development/gaphor/gaphor/diagram/copypaste.py", line 195, in _paste_presentation
|    item = diagram.create(cls)
|           │              └ <class 'gaphor.UML.classes.association.AssociationItem'>
|           └ <gaphor.core.modeling.diagram.Diagram element cd4825cc-0093-11ef-8465-be7f4daace3f>
|  File "/Users/arjan/Development/gaphor/gaphor/core/modeling/diagram.py", line 364, in create
|    return self.create_as(type_, generate_id(), parent, subject)
|           │              │      │              │       └ None
|           │              │      │              └ None
|           │              │      └ <function generate_id at 0x105ce62a0>
|           │              └ <class 'gaphor.UML.classes.association.AssociationItem'>
|           └ <gaphor.core.modeling.diagram.Diagram element cd4825cc-0093-11ef-8465-be7f4daace3f>
|  File "/Users/arjan/Development/gaphor/gaphor/core/modeling/diagram.py", line 381, in create_as
|    self.update({item})
|    │            └ <gaphor.UML.classes.association.AssociationItem element de0771ce-0093-11ef-8465-be7f4daace3f>
|    └ <gaphor.core.modeling.diagram.Diagram element cd4825cc-0093-11ef-8465-be7f4daace3f>
|  File "/Users/arjan/Development/gaphor/gaphor/core/modeling/diagram.py", line 440, in update
|    update(UpdateContext(style=self.style(StyledItem(item))))
|    │      │                   │          │          └ <gaphor.UML.classes.association.AssociationItem element de0771ce-0093-11ef-8465-be7f4daace3f>
|    │      │                   │          └ <class 'gaphor.core.modeling.diagram.StyledItem'>
|    │      │                   └ <gaphor.core.modeling.diagram.Diagram element cd4825cc-0093-11ef-8465-be7f4daace3f>
|    │      └ <class 'gaphor.core.modeling.diagram.UpdateContext'>
|    └ <bound method AssociationItem.update of <gaphor.UML.classes.association.AssociationItem element de0771ce-0093-11ef-8465-be7f4daa...
|  File "/Users/arjan/Development/gaphor/gaphor/core/modeling/diagram.py", line 333, in style
|    compiled_style_sheet.compute_style(node)
|    │                                  └ <gaphor.core.modeling.diagram.StyledItem object at 0x122ba9310>
|    └ <gaphor.core.styling.CompiledStyleSheet object at 0x122bab450>
|  File "/Users/arjan/Development/gaphor/gaphor/core/styling/__init__.py", line 178, in _compute_style_uncached
|    return merge_styles(
|  File "/Users/arjan/Development/gaphor/gaphor/core/styling/__init__.py", line 180, in <genexpr>
|    *(declarations for selector, declarations in self.rules if selector(node)),
|      │                │         │                             │        └ <gaphor.core.modeling.diagram.StyledItem object at 0x122ba9310>
|      │                │         │                             └ <function compile_compound_selector.<locals>.<lambda> at 0x120d7f4c0>
|      │                │         └ {'color': (0.0, 0.0, 1.0, 1.0)}
|      │                └ <function compile_compound_selector.<locals>.<lambda> at 0x120d7f4c0>
|      └ {'color': (0.0, 0.0, 1.0, 1.0)}
|  File "/Users/arjan/Development/gaphor/gaphor/core/styling/compiler.py", line 137, in <lambda>
|    return lambda el: all(expr(el) for expr in sub_expressions)
|                               │               └ [<function compile_name_selector.<locals>.<lambda> at 0x120d7f560>, <function compile_functional_pseudo_class_selector.<locals>....
|                               └ <gaphor.core.modeling.diagram.StyledItem object at 0x122ba9310>
|  File "/Users/arjan/Development/gaphor/gaphor/core/styling/compiler.py", line 137, in <genexpr>
|    return lambda el: all(expr(el) for expr in sub_expressions)
|                          │    │       └ <function compile_functional_pseudo_class_selector.<locals>.<lambda> at 0x120d7f600>
|                          │    └ <gaphor.core.modeling.diagram.StyledItem object at 0x122ba9310>
|                          └ <function compile_functional_pseudo_class_selector.<locals>.<lambda> at 0x120d7f600>
|  File "/Users/arjan/Development/gaphor/gaphor/core/styling/compiler.py", line 258, in <lambda>
|    return lambda el: not any(sel(el) for sel, _ in sub_selectors)
|                                  │                 └ [(<function compile_compound_selector.<locals>.<lambda> at 0x120d7f6a0>, (0, 1, 0))]
|                                  └ <gaphor.core.modeling.diagram.StyledItem object at 0x122ba9310>
|  File "/Users/arjan/Development/gaphor/gaphor/core/styling/compiler.py", line 258, in <genexpr>
|    return lambda el: not any(sel(el) for sel, _ in sub_selectors)
|                              │   │       │    └ (0, 1, 0)
|                              │   │       └ <function compile_compound_selector.<locals>.<lambda> at 0x120d7f6a0>
|                              │   └ <gaphor.core.modeling.diagram.StyledItem object at 0x122ba9310>
|                              └ <function compile_compound_selector.<locals>.<lambda> at 0x120d7f6a0>
|  File "/Users/arjan/Development/gaphor/gaphor/core/styling/compiler.py", line 137, in <lambda>
|    return lambda el: all(expr(el) for expr in sub_expressions)
|                               │               └ [<function compile_attribute_selector.<locals>.<lambda> at 0x120d7f740>]
|                               └ <gaphor.core.modeling.diagram.StyledItem object at 0x122ba9310>
|  File "/Users/arjan/Development/gaphor/gaphor/core/styling/compiler.py", line 137, in <genexpr>
|    return lambda el: all(expr(el) for expr in sub_expressions)
|                          │    │       └ <function compile_attribute_selector.<locals>.<lambda> at 0x120d7f740>
|                          │    └ <gaphor.core.modeling.diagram.StyledItem object at 0x122ba9310>
|                          └ <function compile_attribute_selector.<locals>.<lambda> at 0x120d7f740>
|  File "/Users/arjan/Development/gaphor/gaphor/core/styling/compiler.py", line 214, in <lambda>
|    return lambda el: value and value in el.attribute(name)
|                      │         │        │            └ 'memberend.navigability'
|                      │         │        └ <gaphor.core.modeling.diagram.StyledItem object at 0x122ba9310>
|                      │         └ 'true'
|                      └ 'true'
|TypeError: argument of type 'NoneType' is not iterable

|During handling of the above exception, another exception occurred:

|Traceback (most recent call last):
|  File "/Users/arjan/Development/gaphor/gaphor/ui/copyservice.py", line 82, in on_paste
|    with Transaction(self.event_manager):
|  File "/Users/arjan/Development/gaphor/gaphor/transaction.py", line 132, in __exit__
|    self.commit()
|    └ <gaphor.transaction.Transaction object at 0x142927d90>
|  File "/Users/arjan/Development/gaphor/gaphor/transaction.py", line 73, in commit
|    self._handle(TransactionRollback(self.context))
|    │            │                   └ <gaphor.transaction.Transaction object at 0x142927d90>
|    │            └ <class 'gaphor.event.TransactionRollback'>
|    └ <gaphor.transaction.Transaction object at 0x142927d90>
|  File "/Users/arjan/Development/gaphor/gaphor/transaction.py", line 114, in _handle
|    self.event_manager.handle(event)
|    │                         └ <gaphor.event.TransactionRollback object at 0x120122250>
|    └ <gaphor.transaction.Transaction object at 0x142927d90>
|  File "/Users/arjan/Development/gaphor/gaphor/core/eventmanager.py", line 83, in handle
|    self._events.handle(queue.pop())
|    │                   └ deque([])
|    └ <gaphor.core.eventmanager.EventManager object at 0x111043850>
|  File "/Users/arjan/Development/gaphor/.venv/lib/python3.11/site-packages/generic/event.py", line 61, in handle
|    raise ExceptionGroup("Error while handling events", exceptions)
|          │                                             └ [KeyError(<gaphor.UML.classes.association.AssociationItem element de0771ce-0093-11ef-8465-be7f4daace3f>)]
|          └ <class 'ExceptionGroup'>
|ExceptionGroup: Error while handling events (1 sub-exception)
└─┬──────────────────────────────╌┄┈
  |Traceback (most recent call last):
  |  File "/Users/arjan/Development/gaphor/gaphor/ui/copyservice.py", line 84, in on_paste
  |    new_items = paster(copy_buffer.buffer, diagram)
  |                │      │                   └ <gaphor.core.modeling.diagram.Diagram element cd4825cc-0093-11ef-8465-be7f4daace3f>
  |                │      └ <copyservice.CopyBuffer object at 0x122be1940 (gaphor+ui+copyservice+CopyBuffer at 0x142ce3ff0)>
  |                └ <function paste_link at 0x10a023060>
  |  File "/Users/arjan/Development/gaphor/gaphor/diagram/copypaste.py", line 65, in paste_link
  |    return _paste(copy_data, diagram, full=False)
  |           │      │          └ <gaphor.core.modeling.diagram.Diagram element cd4825cc-0093-11ef-8465-be7f4daace3f>
  |           │      └ CopyData(elements={'aac36821-e964-11ea-96dc-bf74f1f80424': PresentationCopy(cls=<class 'gaphor.UML.classes.association.Associati...
  |           └ <function _paste at 0x10a0489a0>
  |  File "/Users/arjan/Development/gaphor/gaphor/diagram/copypaste.py", line 238, in _paste
  |    element_lookup(old_id)
  |    │              └ 'aac36821-e964-11ea-96dc-bf74f1f80424'
  |    └ <function _paste.<locals>.element_lookup at 0x121d5aa20>
  |  File "/Users/arjan/Development/gaphor/gaphor/diagram/copypaste.py", line 225, in element_lookup
  |    new_elements[ref] = next(paster)
  |    │            │           └ <generator object _paste_presentation at 0x120cf56c0>
  |    │            └ 'aac36821-e964-11ea-96dc-bf74f1f80424'
  |    └ {'70258172-e964-11ea-96dc-bf74f1f80424': <gaphor.core.modeling.diagram.Diagram element cd4825cc-0093-11ef-8465-be7f4daace3f>}
  |  File "/Users/arjan/Development/gaphor/gaphor/diagram/copypaste.py", line 195, in _paste_presentation
  |    item = diagram.create(cls)
  |           │              └ <class 'gaphor.UML.classes.association.AssociationItem'>
  |           └ <gaphor.core.modeling.diagram.Diagram element cd4825cc-0093-11ef-8465-be7f4daace3f>
  |  File "/Users/arjan/Development/gaphor/gaphor/core/modeling/diagram.py", line 364, in create
  |    return self.create_as(type_, generate_id(), parent, subject)
  |           │              │      │              │       └ None
  |           │              │      │              └ None
  |           │              │      └ <function generate_id at 0x105ce62a0>
  |           │              └ <class 'gaphor.UML.classes.association.AssociationItem'>
  |           └ <gaphor.core.modeling.diagram.Diagram element cd4825cc-0093-11ef-8465-be7f4daace3f>
  |  File "/Users/arjan/Development/gaphor/gaphor/core/modeling/diagram.py", line 381, in create_as
  |    self.update({item})
  |    │            └ <gaphor.UML.classes.association.AssociationItem element de0771ce-0093-11ef-8465-be7f4daace3f>
  |    └ <gaphor.core.modeling.diagram.Diagram element cd4825cc-0093-11ef-8465-be7f4daace3f>
  |  File "/Users/arjan/Development/gaphor/gaphor/core/modeling/diagram.py", line 440, in update
  |    update(UpdateContext(style=self.style(StyledItem(item))))
  |    │      │                   │          │          └ <gaphor.UML.classes.association.AssociationItem element de0771ce-0093-11ef-8465-be7f4daace3f>
  |    │      │                   │          └ <class 'gaphor.core.modeling.diagram.StyledItem'>
  |    │      │                   └ <gaphor.core.modeling.diagram.Diagram element cd4825cc-0093-11ef-8465-be7f4daace3f>
  |    │      └ <class 'gaphor.core.modeling.diagram.UpdateContext'>
  |    └ <bound method AssociationItem.update of <gaphor.UML.classes.association.AssociationItem element de0771ce-0093-11ef-8465-be7f4daa...
  |  File "/Users/arjan/Development/gaphor/gaphor/core/modeling/diagram.py", line 333, in style
  |    compiled_style_sheet.compute_style(node)
  |    │                                  └ <gaphor.core.modeling.diagram.StyledItem object at 0x122ba9310>
  |    └ <gaphor.core.styling.CompiledStyleSheet object at 0x122bab450>
  |  File "/Users/arjan/Development/gaphor/gaphor/core/styling/__init__.py", line 178, in _compute_style_uncached
  |    return merge_styles(
  |  File "/Users/arjan/Development/gaphor/gaphor/core/styling/__init__.py", line 180, in <genexpr>
  |    *(declarations for selector, declarations in self.rules if selector(node)),
  |      │                │         │                             │        └ <gaphor.core.modeling.diagram.StyledItem object at 0x122ba9310>
  |      │                │         │                             └ <function compile_compound_selector.<locals>.<lambda> at 0x120d7f4c0>
  |      │                │         └ {'color': (0.0, 0.0, 1.0, 1.0)}
  |      │                └ <function compile_compound_selector.<locals>.<lambda> at 0x120d7f4c0>
  |      └ {'color': (0.0, 0.0, 1.0, 1.0)}
  |  File "/Users/arjan/Development/gaphor/gaphor/core/styling/compiler.py", line 137, in <lambda>
  |    return lambda el: all(expr(el) for expr in sub_expressions)
  |                               │               └ [<function compile_name_selector.<locals>.<lambda> at 0x120d7f560>, <function compile_functional_pseudo_class_selector.<locals>....
  |                               └ <gaphor.core.modeling.diagram.StyledItem object at 0x122ba9310>
  |  File "/Users/arjan/Development/gaphor/gaphor/core/styling/compiler.py", line 137, in <genexpr>
  |    return lambda el: all(expr(el) for expr in sub_expressions)
  |                          │    │       └ <function compile_functional_pseudo_class_selector.<locals>.<lambda> at 0x120d7f600>
  |                          │    └ <gaphor.core.modeling.diagram.StyledItem object at 0x122ba9310>
  |                          └ <function compile_functional_pseudo_class_selector.<locals>.<lambda> at 0x120d7f600>
  |  File "/Users/arjan/Development/gaphor/gaphor/core/styling/compiler.py", line 258, in <lambda>
  |    return lambda el: not any(sel(el) for sel, _ in sub_selectors)
  |                                  │                 └ [(<function compile_compound_selector.<locals>.<lambda> at 0x120d7f6a0>, (0, 1, 0))]
  |                                  └ <gaphor.core.modeling.diagram.StyledItem object at 0x122ba9310>
  |  File "/Users/arjan/Development/gaphor/gaphor/core/styling/compiler.py", line 258, in <genexpr>
  |    return lambda el: not any(sel(el) for sel, _ in sub_selectors)
  |                              │   │       │    └ (0, 1, 0)
  |                              │   │       └ <function compile_compound_selector.<locals>.<lambda> at 0x120d7f6a0>
  |                              │   └ <gaphor.core.modeling.diagram.StyledItem object at 0x122ba9310>
  |                              └ <function compile_compound_selector.<locals>.<lambda> at 0x120d7f6a0>
  |  File "/Users/arjan/Development/gaphor/gaphor/core/styling/compiler.py", line 137, in <lambda>
  |    return lambda el: all(expr(el) for expr in sub_expressions)
  |                               │               └ [<function compile_attribute_selector.<locals>.<lambda> at 0x120d7f740>]
  |                               └ <gaphor.core.modeling.diagram.StyledItem object at 0x122ba9310>
  |  File "/Users/arjan/Development/gaphor/gaphor/core/styling/compiler.py", line 137, in <genexpr>
  |    return lambda el: all(expr(el) for expr in sub_expressions)
  |                          │    │       └ <function compile_attribute_selector.<locals>.<lambda> at 0x120d7f740>
  |                          │    └ <gaphor.core.modeling.diagram.StyledItem object at 0x122ba9310>
  |                          └ <function compile_attribute_selector.<locals>.<lambda> at 0x120d7f740>
  |  File "/Users/arjan/Development/gaphor/gaphor/core/styling/compiler.py", line 214, in <lambda>
  |    return lambda el: value and value in el.attribute(name)
  |                      │         │        │            └ 'memberend.navigability'
  |                      │         │        └ <gaphor.core.modeling.diagram.StyledItem object at 0x122ba9310>
  |                      │         └ 'true'
  |                      └ 'true'
  |TypeError: argument of type 'NoneType' is not iterable

  |During handling of the above exception, another exception occurred:

  |Traceback (most recent call last):
  |  File "/Users/arjan/Development/gaphor/.venv/lib/python3.11/site-packages/generic/event.py", line 57, in handle
  |    handler(event)
  |    │       └ <gaphor.core.modeling.event.AssociationDeleted object at 0x122bc2610>
  |    └ <bound method ElementDispatcher.on_element_change_event of <gaphor.core.modeling.elementdispatcher.ElementDispatcher object at 0...
  |  File "/Users/arjan/Development/gaphor/gaphor/core/modeling/elementdispatcher.py", line 240, in on_element_change_event
  |    handler(event)
  |    │       └ <gaphor.core.modeling.event.AssociationDeleted object at 0x122bc2610>
  |    └ <bound method Diagram._order_owned_presentation of <gaphor.core.modeling.diagram.Diagram element cd4825cc-0093-11ef-8465-be7f4da...
  |  File "/Users/arjan/Development/gaphor/gaphor/core/modeling/diagram.py", line 300, in _owned_presentation_changed
  |    self._update_dirty_items(removed_items={event.old_value})
  |    │                                       └ <gaphor.core.modeling.event.AssociationDeleted object at 0x122bc2610>
  |    └ <gaphor.core.modeling.diagram.Diagram element cd4825cc-0093-11ef-8465-be7f4daace3f>
  |  File "/Users/arjan/Development/gaphor/gaphor/core/modeling/diagram.py", line 500, in _update_dirty_items
  |    v.request_update(dirty_items, removed_items)
  |    │                │            └ {<gaphor.UML.classes.association.AssociationItem element de0771ce-0093-11ef-8465-be7f4daace3f>}
  |    │                └ ()
  |    └ <gtkview.GtkView object at 0x122bcf340 (GaphasView at 0x142b4ba00)>
  |  File "/Users/arjan/Development/gaphor/.venv/lib/python3.11/site-packages/gaphas/view/gtkview.py", line 270, in request_update
  |    self._qtree.remove(item)
  |    │                  └ <gaphor.UML.classes.association.AssociationItem element de0771ce-0093-11ef-8465-be7f4daace3f>
  |    └ <gtkview.GtkView object at 0x122bcf340 (GaphasView at 0x142b4ba00)>
  |  File "/Users/arjan/Development/gaphor/.venv/lib/python3.11/site-packages/gaphas/quadtree.py", line 157, in remove
  |    bounds, data = self._ids[item]
  |                   │         └ <gaphor.UML.classes.association.AssociationItem element de0771ce-0093-11ef-8465-be7f4daace3f>
  |                   └ <gaphas.quadtree.Quadtree object at 0x122bcf4d0>
  |KeyError: <gaphor.UML.classes.association.AssociationItem element de0771ce-0093-11ef-8465-be7f4daace3f>
  └─────────────────────────────╌┄┈

Expected behavior

A clear and concise description of what you expected to happen.

Screenshots

If applicable, add screenshots to help explain your problem.

OS

  • Linux (Please put in notes the specific distro)
  • macOS
  • Windows

Version

Version of Gaphor: 2.25.0

Additional information

@danyeaw Should we yank (retract) 2.25.0 for now? It has a few issues: pasting elements, and screen updates on macOS.

@amolenaar amolenaar added the bug An issue in the application label Apr 22, 2024
@amolenaar amolenaar linked a pull request Apr 22, 2024 that will close this issue
6 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug An issue in the application
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant