Skip to content

Select single image file and avoid accessing image attributes after close #3430

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

Conversation

itafraze
Copy link
Contributor

@itafraze itafraze commented Aug 9, 2024

While playing on #3428 I noticed how in gaphor/diagram/general/generalpropertypages.py attributes of the image object are accessed after its close().

image = Image.open(io.BytesIO(image_data))
image.verify()
image.close()
base64_encoded_data = base64.b64encode(image_data)
with Transaction(self.event_manager):
self.subject.subject.content = base64_encoded_data.decode(
"ascii"
)
self.subject.width = image.width
self.subject.height = image.height

Moreover, in current implementation the user is allowed to select multiple image files:

def open_files(self, filenames):
for filename in filenames:
with open(filename, "rb") as file:

Todo:

  • Run regression tests
  • Add test

PR Checklist

PR Type

  • Bug fix
  • Feature
  • Chore (refactoring, formatting, local variables, other cleanup)
  • Documentation content changes

What is the current behavior?

  1. Add a Picture to a diagram;
  2. Select picture...
  3. The user is allowed to select more than one file

image-1

What is the new behavior?

  1. Add a Picture to a diagram;
  2. Select picture...
  3. The user is allowed to select only one file

Does this PR introduce a breaking change?

  • Yes
  • No

Other information

The change adds a new multiple argument to

def open_file_dialog(
title,
handler,
parent=None,
dirname=None,
filters=None,
image_filter=False,
) -> None:

in order to retrieve a single element instead of a list. This should not break other behaviours, although there do not seem to be many scenarios where the application would need to select multiple files.

@github-actions github-actions bot added the python Pull requests that update Python code label Aug 9, 2024
@itafraze itafraze force-pushed the chore/image-single-selection-and-attribute-access-after-close branch from 6376b2d to 9a57f30 Compare August 16, 2024 15:40
@itafraze
Copy link
Contributor Author

Regression tests

Pre

$ git show
commit 62b2fa0d0719362e6d644a332cc55ec3b66daa46 (HEAD -> main, origin/main, mirror/main, mirror/HEAD)
Merge: 90a791c3e 8521fb444
Author: Dan Yeaw <dan@yeaw.me>
Date:   Tue Aug 13 21:58:10 2024 -0400

    Merge pull request #3444 from gaphor/remove-xmi-export
    
    Remove XMI export plugin
Click to expand the test results

$ poetry run pytest
====================================== test session starts =======================================
platform linux -- Python 3.12.5, pytest-8.3.2, pluggy-1.5.0
Using --randomly-seed=1209225051
rootdir: *
configfile: pyproject.toml
testpaths: gaphor, tests, docs
plugins: randomly-3.15.0, cov-5.0.0, archon-0.0.6, xdoctest-1.1.6, mock-3.14.0, hypothesis-6.111.0
collected 2018 items                                                                             

gaphor/ui/tests/test_filemanager.py ....s....                                              [  0%]
gaphor/SysML/tests/test_drop.py ....                                                       [  0%]
gaphor/UML/actions/tests/test_actionspropertypages.py .......                              [  0%]
gaphor/diagram/tests/test_propertypages.py .......                                         [  1%]
gaphor/UML/tests/test_interactions.py ....                                                 [  1%]
gaphor/UML/profiles/tests/test_metaclasspropertypage.py ..                                 [  1%]
gaphor/SysML/tests/test_sysml.py .......                                                   [  1%]
gaphor/UML/actions/tests/test_copypaste.py ...                                             [  2%]
gaphor/UML/interactions/tests/test_copypaste.py ..                                         [  2%]
gaphor/SysML/blocks/tests/test_group.py ...                                                [  2%]
gaphor/diagram/general/tests/test_simpleitem.py ...                                        [  2%]
tests/test_diagramexport.py ....                                                           [  2%]
gaphor/tests/test_action.py ....                                                           [  2%]
gaphor/storage/tests/test_recovery_recorder.py ................                            [  3%]
gaphor/UML/interactions/tests/test_drop.py .                                               [  3%]
gaphor/diagram/tests/test_copypaste_grouping.py ...                                        [  3%]
gaphor/storage/tests/test_xmlwriter.py .....                                               [  4%]
gaphor/UML/tests/test_copypaste.py ...                                                     [  4%]
gaphor/UML/classes/tests/test_association.py ........                                      [  4%]
gaphor/services/tests/test_undomanager.py ..................                               [  5%]
tests/test_session_recovery.py ..................                                          [  6%]
gaphor/UML/usecases/tests/test_include.py ....                                             [  6%]
gaphor/core/modeling/tests/test_element.py ..                                              [  6%]
gaphor/diagram/general/tests/test_comment.py ............                                  [  7%]
gaphor/tests/test_babel.py .                                                               [  7%]
gaphor/ui/tests/test_filedialog.py .....                                                   [  7%]
gaphor/core/styling/tests/test_declarations.py ............................                [  9%]
gaphor/UML/actions/tests/test_activitynodes.py .....                                       [  9%]
gaphor/services/tests/test_moduleloader.py .                                               [  9%]
gaphor/UML/deployments/tests/test_connector.py ..                                          [  9%]
gaphor/storage/tests/test_parser.py ....                                                   [  9%]
tests/test_presentations.py .................                                              [ 10%]
gaphor/UML/states/tests/test_pseudostates.py ............                                  [ 11%]
gaphor/UML/profiles/tests/test_stereotypepropertypages.py .....                            [ 11%]
gaphor/core/modeling/tests/test_collection.py ..............                               [ 12%]
gaphor/UML/tests/test_uml2.py ...........................                                  [ 13%]
gaphor/UML/actions/tests/test_drop.py .......                                              [ 13%]
gaphor/UML/actions/tests/test_partitionpage.py ...                                         [ 13%]
gaphor/C4Model/tests/test_modelinglanguage.py ......                                       [ 14%]
tests/test_composite_association.py .                                                      [ 14%]
gaphor/core/modeling/tests/test_diagram_style.py ....                                      [ 14%]
gaphor/ui/tests/test_recentfiles.py ...                                                    [ 14%]
gaphor/ui/modelmerge/tests/test_organize.py .................                              [ 15%]
gaphor/UML/tests/test_activity.py ...........................                              [ 16%]
gaphor/UML/states/tests/test_transition.py .                                               [ 16%]
gaphor/SysML/blocks/tests/test_proxy_port.py ....                                          [ 16%]
gaphor/UML/actions/tests/test_flowconnect.py ........................................      [ 18%]
gaphor/UML/states/tests/test_group.py ........                                             [ 19%]
gaphor/storage/tests/test_storage_c4_upgrades.py .                                         [ 19%]
gaphor/UML/classes/tests/test_classeseditors.py .                                          [ 19%]
tests/test_properties.py ................................................................. [ 22%]
..........................                                                                 [ 23%]
gaphor/ui/tests/test_main.py ..                                                            [ 24%]
gaphor/UML/interactions/tests/test_interactionspropertypages.py ..                         [ 24%]
gaphor/core/modeling/tests/test_elementdispatcher.py ...............                       [ 24%]
gaphor/UML/classes/tests/test_interface.py ..                                              [ 25%]
tests/test_comment_line_placement.py .                                                     [ 25%]
tests/test_action_issue.py .                                                               [ 25%]
gaphor/diagram/tests/test_segment.py .                                                     [ 25%]
gaphor/core/changeset/tests/test_compare.py ....................                           [ 26%]
gaphor/diagram/tools/tests/test_dropzone.py ..                                             [ 26%]
gaphor/plugins/console/tests/test_consolewindow.py .                                       [ 26%]
gaphor/ui/tests/test_treemodel.py .................                                        [ 27%]
gaphor/UML/classes/tests/test_enumerationpropertypages.py ..                               [ 27%]
gaphor/storage/tests/test_storage_upgrades.py ...............                              [ 27%]
gaphor/plugins/autolayout/tests/test_pydot.py .........                                    [ 28%]
gaphor/core/modeling/tests/test_literal_eval.py ......                                     [ 28%]
gaphor/core/modeling/tests/test_elementfactory.py ..............                           [ 29%]
gaphor/ui/installschemas/tests/test_installschemas.py .                                    [ 29%]
gaphor/UML/tests/test_state_machine.py ................................................... [ 32%]
.........                                                                                  [ 32%]
gaphor/UML/tests/test_group.py ..........                                                  [ 32%]
gaphor/diagram/tools/tests/test_shortcut.py ..                                             [ 33%]
gaphor/ui/tests/test_toolbox.py ......                                                     [ 33%]
gaphor/UML/profiles/tests/test_classifier_stereotypes.py .......                           [ 33%]
gaphor/diagram/tests/test_instanteditors.py ...                                            [ 33%]
tests/test_architecture.py ........                                                        [ 34%]
gaphor/ui/modelmerge/tests/test_organize_uml.py ..........                                 [ 34%]
gaphor/UML/classes/tests/test_interfaceconnect.py .......                                  [ 35%]
gaphor/core/styling/tests/test_inherit.py ..                                               [ 35%]
gaphor/SysML/requirements/tests/test_connectors.py .......                                 [ 35%]
gaphor/plugins/console/tests/test_console.py .....                                         [ 35%]
gaphor/UML/interactions/tests/test_group.py .                                              [ 35%]
gaphor/storage/tests/test_storage_uml_2_5_upgrade.py ......                                [ 36%]
gaphor/tests/test_main.py ......                                                           [ 36%]
gaphor/UML/classes/tests/test_associationpropertypages.py ...                              [ 36%]
gaphor/UML/classes/tests/test_generalizationconnect.py ........                            [ 36%]
gaphor/core/modeling/tests/test_style_attributes.py ..............                         [ 37%]
gaphor/ui/tests/test_statuswindow.py .                                                     [ 37%]
gaphor/SysML/tests/test_propertypages.py ....................                              [ 38%]
gaphor/UML/tests/test_recipes.py ...............                                           [ 39%]
gaphor/UML/actions/tests/test_pinconnect.py .......                                        [ 39%]
gaphor/SysML/tests/test_sysmlfmt.py ......                                                 [ 40%]
gaphor/core/modeling/tests/test_presentation.py ..........                                 [ 40%]
gaphor/plugins/console/tests/test_docstring_formatting.py ...                              [ 40%]
gaphor/UML/tests/test_uml2_overrides.py ....                                               [ 40%]
gaphor/ui/tests/test_selftest.py .                                                         [ 40%]
gaphor/UML/actions/tests/test_flow.py ....                                                 [ 41%]
gaphor/UML/actions/tests/test_action.py ..                                                 [ 41%]
gaphor/ui/tests/test_modelchanged.py ..                                                    [ 41%]
gaphor/diagram/tests/test_copypaste_full.py ........                                       [ 41%]
gaphor/UML/classes/tests/test_dependencypropertypages.py ..                                [ 41%]
gaphor/UML/classes/tests/test_class.py ...                                                 [ 42%]
gaphor/UML/actions/tests/test_forknode.py ...                                              [ 42%]
gaphor/UML/tests/test_iconname.py .                                                        [ 42%]
gaphor/UML/profiles/tests/test_packageimportconnect.py ...                                 [ 42%]
gaphor/core/changeset/tests/test_apply.py .....................                            [ 43%]
gaphor/SysML/tests/test_diagramitems.py .................................                  [ 45%]
gaphor/ui/tests/test_notifier.py ...                                                       [ 45%]
gaphor/tests/test_raises.py ....                                                           [ 45%]
gaphor/ui/tests/test_menufragment.py .                                                     [ 45%]
gaphor/storage/tests/test_mergeconflict.py .                                               [ 45%]
gaphor/action.py .                                                                         [ 45%]
gaphor/core/modeling/collection.py .                                                       [ 45%]
gaphor/core/modeling/element.py .                                                          [ 45%]
gaphor/storage/storage.py .                                                                [ 45%]
gaphor/storage/upgrade_canvasitem.py .                                                     [ 45%]
gaphor/transaction.py .                                                                    [ 45%]
gaphor/SysML/blocks/tests/test_connectors.py ........                                      [ 46%]
gaphor/plugins/errorreports/tests/test_errorreport.py ...                                  [ 46%]
tests/test_undo.py ................                                                        [ 47%]
gaphor/ui/modelmerge/tests/test_modelmerge.py .                                            [ 47%]
gaphor/SysML/tests/test_diagramtype.py .                                                   [ 47%]
gaphor/storage/tests/test_loading.py ......                                                [ 47%]
gaphor/tests/test_entrypoint.py ...                                                        [ 47%]
tests/test_package_removal.py ..                                                           [ 47%]
tests/test_multiple_associations.py ..                                                     [ 47%]
gaphor/tests/test_version.py .                                                             [ 47%]
gaphor/UML/interactions/tests/test_executionspecification.py ...........                   [ 48%]
gaphor/UML/actions/tests/test_activitypropertypage.py ................                     [ 49%]
gaphor/ui/tests/test_actiongroup.py ...........                                            [ 49%]
gaphor/diagram/tests/test_styling.py .                                                     [ 49%]
gaphor/tests/test_application.py ....                                                      [ 50%]
gaphor/diagram/tests/test_presentation.py ........                                         [ 50%]
gaphor/UML/tests/test_sanitizerservice.py .............                                    [ 51%]
tests/test_load_model.py .                                                                 [ 51%]
gaphor/diagram/tests/test_shapes.py ..................                                     [ 52%]
gaphor/UML/classes/tests/test_realizationconnect.py .....                                  [ 52%]
gaphor/UML/tests/test_drop.py .......                                                      [ 52%]
gaphor/core/modeling/tests/test_modelinglanguage.py ...                                    [ 52%]
gaphor/diagram/tests/test_iconname.py .                                                    [ 52%]
gaphor/core/styling/tests/test_css.py .................................................... [ 55%]
.                                                                                          [ 55%]
gaphor/services/tests/test_componentregistry.py ..                                         [ 55%]
gaphor/storage/tests/test_storage_message_item_upgrade.py .                                [ 55%]
tests/test_plugins.py .                                                                    [ 55%]
gaphor/tests/test_i18n.py .                                                                [ 55%]
gaphor/diagram/tests/test_export.py .....                                                  [ 55%]
gaphor/UML/states/tests/test_transition_connect.py ........                                [ 56%]
tests/test_placement_tools.py ............................................................ [ 59%]
...............................................................................            [ 63%]
gaphor/UML/classes/tests/test_datatype_connect.py .                                        [ 63%]
gaphor/codegen/tests/test_coder.py .......................                                 [ 64%]
gaphor/ui/tests/test_copyservice.py ..                                                     [ 64%]
tests/test_elements_have_owner.py ....                                                     [ 64%]
gaphor/tests/test_settings.py ..                                                           [ 64%]
gaphor/ui/tests/test_macosshim.py s                                                        [ 64%]
gaphor/UML/classes/tests/test_dependencyconnect.py ..........                              [ 65%]
gaphor/SysML/allocations/tests/test_allocate_relationship.py .........................     [ 66%]
gaphor/diagram/general/tests/test_generalpropertypages.py ...                              [ 66%]
gaphor/ui/tests/test_handletool.py ......                                                  [ 67%]
gaphor/core/styling/tests/test_compiler.py ..........................................      [ 69%]
gaphor/ui/tests/test_diagrampage.py ....                                                   [ 69%]
gaphor/ui/tests/test_mainwindow.py .......ss                                               [ 69%]
gaphor/UML/profiles/tests/test_copypaste.py ..                                             [ 69%]
gaphor/UML/actions/tests/test_partition.py ...                                             [ 70%]
gaphor/services/tests/test_undo_presentation.py .....................                      [ 71%]
tests/test_remove_unused_elements.py ..                                                    [ 71%]
tests/test_models_up_to_date.py .....                                                      [ 71%]
gaphor/UML/actions/tests/test_grouping.py ......                                           [ 71%]
gaphor/diagram/tests/test_group.py ........                                                [ 72%]
gaphor/C4Model/tests/test_grouping.py ....                                                 [ 72%]
gaphor/core/tests/test_eventmanager.py ....                                                [ 72%]
gaphor/UML/states/tests/test_states.py .....                                               [ 72%]
gaphor/core/modeling/tests/test_diagram.py ..........                                      [ 73%]
gaphor/diagram/tests/test_merge.py .                                                       [ 73%]
gaphor/diagram/tools/tests/test_tool_set.py ...                                            [ 73%]
gaphor/UML/states/tests/test_propertypages.py .....                                        [ 73%]
gaphor/SysML/tests/test_diagramlabel.py ..                                                 [ 73%]
gaphor/diagram/tools/tests/test_txtool.py .                                                [ 73%]
gaphor/services/tests/test_modelinglanguage.py ....                                        [ 74%]
gaphor/UML/usecases/tests/test_grouping.py ...                                             [ 74%]
gaphor/ui/tests/test_lifecycle.py ....                                                     [ 74%]
gaphor/UML/usecases/tests/test_extend.py ....                                              [ 74%]
gaphor/ui/tests/test_modelbrowser.py ......................                                [ 75%]
gaphor/UML/interactions/tests/test_ordering.py ..                                          [ 75%]
gaphor/UML/deployments/tests/test_grouping.py .......                                      [ 76%]
gaphor/UML/usecases/tests/test_connect.py ..                                               [ 76%]
gaphor/UML/tests/test_umllex.py .....................................                      [ 78%]
gaphor/UML/actions/tests/test_callbehaviouraction.py ..                                    [ 78%]
gaphor/UML/actions/tests/test_pin.py .                                                     [ 78%]
tests/test_unioncache_in_derived_response.py .                                             [ 78%]
gaphor/UML/classes/tests/test_associationconnect.py ...........x...                        [ 78%]
gaphor/UML/classes/tests/test_containmentconnect.py ........                               [ 79%]
gaphor/UML/deployments/tests/test_copypaste.py .                                           [ 79%]
gaphor/UML/classes/tests/test_copypaste.py ..........                                      [ 79%]
gaphor/UML/classes/tests/test_interfacerealizationconnect.py ...                           [ 80%]
gaphor/UML/states/tests/test_drop.py ...                                                   [ 80%]
gaphor/UML/profiles/tests/test_stereotypepage.py ..                                        [ 80%]
gaphor/diagram/tests/test_text.py .......................                                  [ 81%]
tests/test_auto_layouting.py .                                                             [ 81%]
gaphor/UML/actions/tests/test_actionseditors.py ...                                        [ 81%]
gaphor/storage/tests/test_recovery_eventlog.py .....x.                                     [ 82%]
gaphor/UML/tests/test_diagramitems.py .................................................... [ 84%]
.......................................................................................... [ 89%]
...........                                                                                [ 89%]
gaphor/UML/interactions/tests/test_messageconnect.py ...................                   [ 90%]
gaphor/diagram/tools/tests/test_handlemove.py ...                                          [ 90%]
gaphor/extensions/tests/test_ipython.py .                                                  [ 90%]
gaphor/extensions/tests/test_sphinx.py ..                                                  [ 90%]
gaphor/UML/usecases/tests/test_actor.py ...                                                [ 90%]
gaphor/ui/tests/test_greeter.py ..                                                         [ 91%]
gaphor/tests/test_transaction.py ........                                                  [ 91%]
tests/test_model_consistency.py .                                                          [ 91%]
gaphor/storage/tests/test_group.py .                                                       [ 91%]
gaphor/UML/interactions/tests/test_message.py ....                                         [ 91%]
tests/test_issue_gaphas.py .                                                               [ 91%]
gaphor/diagram/general/tests/test_generaleditors.py .                                      [ 91%]
gaphor/services/tests/test_undo_diagram.py ..                                              [ 91%]
gaphor/ui/tests/test_help.py ...                                                           [ 92%]
gaphor/storage/tests/test_storage.py ...............                                       [ 92%]
gaphor/UML/states/tests/test_copypaste.py ..                                               [ 92%]
gaphor/ui/tests/test_elementeditor.py ...                                                  [ 93%]
gaphor/diagram/tests/test_copypaste.py ..                                                  [ 93%]
gaphor/services/tests/test_properties.py ...                                               [ 93%]
gaphor/UML/deployments/tests/test_connect.py ................                              [ 94%]
gaphor/SysML/blocks/tests/test_block.py ..                                                 [ 94%]
gaphor/core/modeling/tests/test_properties.py ...............................              [ 95%]
gaphor/UML/tests/test_umlfmt.py .....................................                      [ 97%]
gaphor/diagram/tests/test_copypaste_link.py ..........                                     [ 98%]
gaphor/C4Model/tests/test_propertypages.py ..                                              [ 98%]
gaphor/ui/tests/test_treesearch.py .....                                                   [ 98%]
gaphor/core/styling/tests/test_cascading.py ...........                                    [ 99%]
gaphor/UML/classes/tests/test_classespropertypages.py ..........                           [ 99%]
gaphor/UML/profiles/tests/test_extensionconnect.py .......                                 [ 99%]
gaphor/UML/actions/tests/test_objectnode.py ...                                            [100%]

===================== 2012 passed, 4 skipped, 2 xfailed in 176.28s (0:02:56) =====================

Post

$ git show
commit 467abad0781b31d58e084dadcb426dc6fa18793e 
Author: Emanuele Zarfati <zarfati.tecno@gmail.com>
Date:   Fri Aug 16 19:31:53 2024 +0200

    Add some tests
Click to expand the test results

$ poetry run pytest
====================================== test session starts =======================================
platform linux -- Python 3.12.5, pytest-8.3.2, pluggy-1.5.0
Using --randomly-seed=1643379200
rootdir: *
configfile: pyproject.toml
testpaths: gaphor, tests, docs
plugins: randomly-3.15.0, cov-5.0.0, archon-0.0.6, xdoctest-1.1.6, mock-3.14.0, hypothesis-6.111.0
collected 2023 items                                                                             

gaphor/SysML/tests/test_propertypages.py ....................                              [  0%]
gaphor/UML/classes/tests/test_dependencypropertypages.py ..                                [  1%]
tests/test_composite_association.py .                                                      [  1%]
gaphor/ui/modelmerge/tests/test_modelmerge.py .                                            [  1%]
gaphor/core/modeling/tests/test_style_attributes.py ..............                         [  1%]
gaphor/ui/tests/test_statuswindow.py .                                                     [  1%]
gaphor/services/tests/test_properties.py ...                                               [  2%]
gaphor/core/styling/tests/test_inherit.py ..                                               [  2%]
gaphor/ui/tests/test_filemanager.py ..s......                                              [  2%]
gaphor/ui/modelmerge/tests/test_organize.py .................                              [  3%]
gaphor/UML/states/tests/test_states.py .....                                               [  3%]
gaphor/UML/actions/tests/test_partitionpage.py ...                                         [  3%]
gaphor/diagram/tests/test_iconname.py .                                                    [  3%]
gaphor/tests/test_action.py ....                                                           [  4%]
gaphor/SysML/tests/test_sysml.py .......                                                   [  4%]
gaphor/UML/classes/tests/test_generalizationconnect.py ........                            [  4%]
gaphor/codegen/tests/test_coder.py .......................                                 [  5%]
gaphor/ui/tests/test_toolbox.py ......                                                     [  6%]
tests/test_issue_gaphas.py .                                                               [  6%]
gaphor/UML/states/tests/test_drop.py ...                                                   [  6%]
gaphor/UML/classes/tests/test_dependencyconnect.py ..........                              [  6%]
gaphor/plugins/errorreports/tests/test_errorreport.py ...                                  [  7%]
gaphor/ui/tests/test_copyservice.py ..                                                     [  7%]
gaphor/storage/tests/test_parser.py ....                                                   [  7%]
gaphor/diagram/general/tests/test_simpleitem.py ...                                        [  7%]
gaphor/UML/classes/tests/test_containmentconnect.py ........                               [  7%]
gaphor/core/modeling/tests/test_diagram_style.py ....                                      [  8%]
gaphor/UML/actions/tests/test_flow.py ....                                                 [  8%]
gaphor/core/modeling/tests/test_diagram.py ..........                                      [  8%]
tests/test_presentations.py .................                                              [  9%]
gaphor/UML/tests/test_group.py ..........                                                  [ 10%]
gaphor/C4Model/tests/test_modelinglanguage.py ......                                       [ 10%]
gaphor/UML/interactions/tests/test_messageconnect.py ...................                   [ 11%]
gaphor/ui/tests/test_treemodel.py .................                                        [ 12%]
gaphor/plugins/console/tests/test_consolewindow.py .                                       [ 12%]
gaphor/SysML/tests/test_diagramlabel.py ..                                                 [ 12%]
gaphor/diagram/tests/test_copypaste_full.py ........                                       [ 12%]
gaphor/services/tests/test_componentregistry.py ..                                         [ 12%]
gaphor/core/tests/test_eventmanager.py ....                                                [ 13%]
tests/test_elements_have_owner.py ....                                                     [ 13%]
gaphor/UML/deployments/tests/test_connector.py ..                                          [ 13%]
gaphor/services/tests/test_undomanager.py ..................                               [ 14%]
gaphor/ui/tests/test_modelbrowser.py ......................                                [ 15%]
gaphor/SysML/blocks/tests/test_group.py ...                                                [ 15%]
gaphor/ui/tests/test_selftest.py .                                                         [ 15%]
gaphor/SysML/tests/test_diagramtype.py .                                                   [ 15%]
gaphor/storage/tests/test_storage_c4_upgrades.py .                                         [ 15%]
gaphor/diagram/tests/test_presentation.py ........                                         [ 16%]
gaphor/tests/test_main.py ......                                                           [ 16%]
gaphor/UML/actions/tests/test_actionseditors.py ...                                        [ 16%]
gaphor/storage/tests/test_storage_message_item_upgrade.py .                                [ 16%]
gaphor/UML/classes/tests/test_interface.py ..                                              [ 16%]
gaphor/storage/tests/test_xmlwriter.py .....                                               [ 16%]
gaphor/UML/deployments/tests/test_copypaste.py .                                           [ 16%]
gaphor/UML/tests/test_diagramitems.py .................................................... [ 19%]
.......................................................................................... [ 23%]
...........                                                                                [ 24%]
gaphor/ui/tests/test_elementeditor.py ...                                                  [ 24%]
gaphor/UML/classes/tests/test_copypaste.py ..........                                      [ 25%]
gaphor/tests/test_entrypoint.py ...                                                        [ 25%]
gaphor/UML/actions/tests/test_copypaste.py ...                                             [ 25%]
gaphor/UML/actions/tests/test_actionspropertypages.py .......                              [ 25%]
gaphor/storage/tests/test_mergeconflict.py .                                               [ 25%]
gaphor/UML/tests/test_state_machine.py ................................................... [ 28%]
.........                                                                                  [ 28%]
tests/test_multiple_associations.py ..                                                     [ 28%]
gaphor/UML/actions/tests/test_activitypropertypage.py ................                     [ 29%]
gaphor/SysML/blocks/tests/test_proxy_port.py ....                                          [ 29%]
gaphor/UML/classes/tests/test_associationconnect.py ...........x...                        [ 30%]
gaphor/services/tests/test_undo_diagram.py ..                                              [ 30%]
gaphor/UML/states/tests/test_pseudostates.py ............                                  [ 31%]
gaphor/diagram/tests/test_merge.py .                                                       [ 31%]
tests/test_comment_line_placement.py .                                                     [ 31%]
gaphor/storage/tests/test_recovery_eventlog.py .....x.                                     [ 31%]
gaphor/core/styling/tests/test_css.py .................................................... [ 34%]
.                                                                                          [ 34%]
gaphor/diagram/general/tests/test_comment.py ............                                  [ 34%]
gaphor/core/styling/tests/test_compiler.py ..........................................      [ 37%]
gaphor/UML/tests/test_copypaste.py ...                                                     [ 37%]
gaphor/ui/modelmerge/tests/test_organize_uml.py ..........                                 [ 37%]
gaphor/extensions/tests/test_ipython.py .                                                  [ 37%]
gaphor/SysML/tests/test_drop.py ....                                                       [ 37%]
gaphor/services/tests/test_moduleloader.py .                                               [ 38%]
gaphor/UML/profiles/tests/test_extensionconnect.py .......                                 [ 38%]
gaphor/UML/interactions/tests/test_copypaste.py ..                                         [ 38%]
gaphor/C4Model/tests/test_grouping.py ....                                                 [ 38%]
gaphor/SysML/blocks/tests/test_connectors.py ........                                      [ 39%]
gaphor/UML/interactions/tests/test_interactionspropertypages.py ..                         [ 39%]
tests/test_plugins.py .                                                                    [ 39%]
gaphor/UML/interactions/tests/test_group.py .                                              [ 39%]
gaphor/ui/tests/test_handletool.py ......                                                  [ 39%]
gaphor/UML/classes/tests/test_enumerationpropertypages.py ..                               [ 39%]
gaphor/tests/test_application.py ....                                                      [ 39%]
gaphor/ui/tests/test_mainwindow.py .....s.s.                                               [ 40%]
gaphor/UML/deployments/tests/test_connect.py ................                              [ 41%]
gaphor/UML/classes/tests/test_realizationconnect.py .....                                  [ 41%]
gaphor/storage/tests/test_storage.py ...............                                       [ 42%]
gaphor/core/modeling/tests/test_presentation.py ..........                                 [ 42%]
gaphor/UML/usecases/tests/test_grouping.py ...                                             [ 42%]
gaphor/UML/profiles/tests/test_stereotypepage.py ..                                        [ 42%]
gaphor/ui/tests/test_greeter.py ..                                                         [ 42%]
gaphor/core/modeling/tests/test_elementdispatcher.py ...............                       [ 43%]
gaphor/SysML/tests/test_sysmlfmt.py ......                                                 [ 43%]
gaphor/UML/profiles/tests/test_metaclasspropertypage.py ..                                 [ 44%]
gaphor/action.py .                                                                         [ 44%]
gaphor/core/modeling/element.py .                                                          [ 44%]
gaphor/core/modeling/collection.py .                                                       [ 44%]
gaphor/storage/storage.py .                                                                [ 44%]
gaphor/storage/upgrade_canvasitem.py .                                                     [ 44%]
gaphor/transaction.py .                                                                    [ 44%]
gaphor/UML/profiles/tests/test_copypaste.py ..                                             [ 44%]
gaphor/storage/tests/test_group.py .                                                       [ 44%]
tests/test_remove_unused_elements.py ..                                                    [ 44%]
tests/test_session_recovery.py ..................                                          [ 45%]
gaphor/ui/tests/test_recentfiles.py ...                                                    [ 45%]
gaphor/diagram/tools/tests/test_dropzone.py ..                                             [ 45%]
gaphor/diagram/general/tests/test_generalpropertypages.py ...                              [ 45%]
gaphor/UML/tests/test_umllex.py .....................................                      [ 47%]
gaphor/core/modeling/tests/test_element.py ..                                              [ 47%]
gaphor/ui/tests/test_notifier.py ...                                                       [ 47%]
gaphor/UML/actions/tests/test_flowconnect.py ........................................      [ 49%]
gaphor/UML/actions/tests/test_callbehaviouraction.py ..                                    [ 50%]
gaphor/UML/tests/test_uml2.py ...........................                                  [ 51%]
gaphor/UML/tests/test_drop.py .......                                                      [ 51%]
gaphor/diagram/tests/test_styling.py .                                                     [ 51%]
gaphor/core/modeling/tests/test_modelinglanguage.py ...                                    [ 51%]
gaphor/SysML/blocks/tests/test_block.py ..                                                 [ 52%]
gaphor/storage/tests/test_storage_upgrades.py ...............                              [ 52%]
gaphor/storage/tests/test_loading.py ......                                                [ 53%]
gaphor/ui/tests/test_main.py ..                                                            [ 53%]
tests/test_placement_tools.py ............................................................ [ 56%]
...............................................................................            [ 60%]
gaphor/UML/tests/test_iconname.py .                                                        [ 60%]
gaphor/UML/tests/test_uml2_overrides.py ....                                               [ 60%]
gaphor/UML/states/tests/test_propertypages.py .....                                        [ 60%]
gaphor/plugins/console/tests/test_docstring_formatting.py ...                              [ 60%]
gaphor/UML/profiles/tests/test_stereotypepropertypages.py .....                            [ 60%]
gaphor/C4Model/tests/test_propertypages.py ..                                              [ 60%]
gaphor/services/tests/test_modelinglanguage.py ....                                        [ 61%]
gaphor/core/changeset/tests/test_apply.py .....................                            [ 62%]
gaphor/ui/installschemas/tests/test_installschemas.py .                                    [ 62%]
gaphor/ui/tests/test_modelchanged.py ..                                                    [ 62%]
tests/test_architecture.py ........                                                        [ 62%]
gaphor/UML/deployments/tests/test_grouping.py .......                                      [ 63%]
gaphor/core/modeling/tests/test_properties.py ...............................              [ 64%]
gaphor/SysML/allocations/tests/test_allocate_relationship.py .........................     [ 65%]
gaphor/core/styling/tests/test_declarations.py ............................                [ 67%]
gaphor/ui/tests/test_lifecycle.py ....                                                     [ 67%]
gaphor/UML/actions/tests/test_pin.py .                                                     [ 67%]
gaphor/diagram/tools/tests/test_txtool.py .                                                [ 67%]
gaphor/UML/actions/tests/test_drop.py .......                                              [ 67%]
gaphor/storage/tests/test_storage_uml_2_5_upgrade.py ......                                [ 68%]
tests/test_undo.py ................                                                        [ 69%]
gaphor/UML/usecases/tests/test_extend.py ....                                              [ 69%]
gaphor/ui/tests/test_help.py ...                                                           [ 69%]
gaphor/UML/states/tests/test_copypaste.py ..                                               [ 69%]
gaphor/extensions/tests/test_sphinx.py ..                                                  [ 69%]
gaphor/UML/tests/test_recipes.py ...............                                           [ 70%]
gaphor/ui/tests/test_actiongroup.py ...........                                            [ 70%]
gaphor/diagram/general/tests/test_generaleditors.py .                                      [ 70%]
tests/test_action_issue.py .                                                               [ 70%]
gaphor/UML/profiles/tests/test_classifier_stereotypes.py .......                           [ 71%]
gaphor/diagram/tests/test_copypaste.py ..                                                  [ 71%]
gaphor/core/changeset/tests/test_compare.py ....................                           [ 72%]
gaphor/UML/interactions/tests/test_executionspecification.py ...........                   [ 72%]
gaphor/diagram/tests/test_group.py ........                                                [ 73%]
gaphor/UML/tests/test_activity.py ...........................                              [ 74%]
gaphor/tests/test_babel.py .                                                               [ 74%]
gaphor/UML/actions/tests/test_objectnode.py ...                                            [ 74%]
gaphor/UML/classes/tests/test_interfacerealizationconnect.py ...                           [ 74%]
gaphor/SysML/requirements/tests/test_connectors.py .......                                 [ 75%]
gaphor/services/tests/test_undo_presentation.py .....................                      [ 76%]
gaphor/UML/classes/tests/test_datatype_connect.py .                                        [ 76%]
tests/test_diagramexport.py ....                                                           [ 76%]
gaphor/UML/usecases/tests/test_connect.py ..                                               [ 76%]
gaphor/UML/classes/tests/test_interfaceconnect.py .......                                  [ 77%]
tests/test_properties.py ................................................................. [ 80%]
..........................                                                                 [ 81%]
gaphor/UML/usecases/tests/test_actor.py ...                                                [ 81%]
gaphor/UML/states/tests/test_transition.py .                                               [ 81%]
gaphor/UML/classes/tests/test_classespropertypages.py ..........                           [ 82%]
gaphor/UML/interactions/tests/test_message.py ....                                         [ 82%]
gaphor/diagram/tests/test_shapes.py ..................                                     [ 83%]
gaphor/UML/actions/tests/test_grouping.py ......                                           [ 83%]
tests/test_load_model.py .                                                                 [ 83%]
tests/test_model_consistency.py .                                                          [ 83%]
gaphor/diagram/tests/test_export.py .....                                                  [ 83%]
gaphor/UML/actions/tests/test_pinconnect.py .......                                        [ 84%]
gaphor/UML/actions/tests/test_forknode.py ...                                              [ 84%]
gaphor/core/modeling/tests/test_literal_eval.py ......                                     [ 84%]
gaphor/UML/interactions/tests/test_drop.py .                                               [ 84%]
gaphor/UML/classes/tests/test_association.py ........                                      [ 85%]
gaphor/diagram/tests/test_copypaste_grouping.py ...                                        [ 85%]
tests/test_unioncache_in_derived_response.py .                                             [ 85%]
gaphor/plugins/autolayout/tests/test_pydot.py .........                                    [ 85%]
gaphor/UML/tests/test_umlfmt.py .....................................                      [ 87%]
gaphor/diagram/tests/test_propertypages.py .......                                         [ 88%]
gaphor/UML/profiles/tests/test_packageimportconnect.py ...                                 [ 88%]
gaphor/tests/test_i18n.py .                                                                [ 88%]
gaphor/diagram/tests/test_segment.py .                                                     [ 88%]
gaphor/diagram/tests/test_copypaste_link.py ..........                                     [ 88%]
gaphor/UML/classes/tests/test_associationpropertypages.py ...                              [ 88%]
gaphor/UML/classes/tests/test_class.py ...                                                 [ 89%]
gaphor/UML/tests/test_sanitizerservice.py .............                                    [ 89%]
gaphor/tests/test_transaction.py ........                                                  [ 90%]
gaphor/ui/tests/test_filedialog.py ..........                                              [ 90%]
gaphor/diagram/tools/tests/test_shortcut.py ..                                             [ 90%]
gaphor/plugins/console/tests/test_console.py .....                                         [ 90%]
gaphor/SysML/tests/test_diagramitems.py .................................                  [ 92%]
gaphor/tests/test_settings.py ..                                                           [ 92%]
gaphor/core/styling/tests/test_cascading.py ...........                                    [ 93%]
gaphor/diagram/tests/test_instanteditors.py ...                                            [ 93%]
gaphor/UML/states/tests/test_transition_connect.py ........                                [ 93%]
gaphor/tests/test_version.py .                                                             [ 93%]
gaphor/UML/actions/tests/test_action.py ..                                                 [ 93%]
gaphor/UML/tests/test_interactions.py ....                                                 [ 94%]
gaphor/ui/tests/test_diagrampage.py ....                                                   [ 94%]
gaphor/ui/tests/test_menufragment.py .                                                     [ 94%]
gaphor/tests/test_raises.py ....                                                           [ 94%]
gaphor/diagram/tools/tests/test_handlemove.py ...                                          [ 94%]
gaphor/UML/usecases/tests/test_include.py ....                                             [ 94%]
gaphor/UML/states/tests/test_group.py ........                                             [ 95%]
gaphor/UML/classes/tests/test_classeseditors.py .                                          [ 95%]
gaphor/core/modeling/tests/test_collection.py ..............                               [ 96%]
gaphor/diagram/tests/test_text.py .......................                                  [ 97%]
gaphor/ui/tests/test_macosshim.py s                                                        [ 97%]
tests/test_package_removal.py ..                                                           [ 97%]
gaphor/diagram/tools/tests/test_tool_set.py ...                                            [ 97%]
gaphor/ui/tests/test_treesearch.py .....                                                   [ 97%]
gaphor/UML/actions/tests/test_partition.py ...                                             [ 97%]
gaphor/core/modeling/tests/test_elementfactory.py ..............                           [ 98%]
gaphor/UML/actions/tests/test_activitynodes.py .....                                       [ 98%]
tests/test_auto_layouting.py .                                                             [ 98%]
gaphor/UML/interactions/tests/test_ordering.py ..                                          [ 98%]
tests/test_models_up_to_date.py .....                                                      [ 99%]
gaphor/storage/tests/test_recovery_recorder.py ................                            [100%]

===================== 2017 passed, 4 skipped, 2 xfailed in 164.15s (0:02:44) =====================

@itafraze itafraze marked this pull request as ready for review August 16, 2024 17:50
@amolenaar
Copy link
Member

Thanks @itafraze, this is a nice improvement.

@all-contributors add @itafraze for code.

@amolenaar amolenaar merged commit 7dfd2a5 into gaphor:main Aug 21, 2024
17 of 20 checks passed
Copy link
Contributor

@amolenaar

I've put up a pull request to add @itafraze! 🎉

@itafraze itafraze deleted the chore/image-single-selection-and-attribute-access-after-close branch August 27, 2024 19:32
@danyeaw danyeaw added chore Maintenance related PR and removed python Pull requests that update Python code labels Sep 22, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
chore Maintenance related PR
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants