Replace use of simplegeneric with singledispatch

This commit is contained in:
Arjan Molenaar 2019-06-05 22:14:23 +02:00
parent 300b72e42e
commit 76a6e99f8a
6 changed files with 55 additions and 51 deletions

@ -1,19 +1,18 @@
"""Defines aspects for Items.
Aspects form intermediate items between tools and items.
Note: This module uses Phillip J. Eby's simplegeneric module. This
module transforms the generic class (used as fall-back) to a generic
function. In order to inherit from this class you should inherit from
Class.default. The simplegeneric module is dispatching only based on
the first argument. For Gaphas that's enough.
"""
from __future__ import absolute_import
import sys
from builtins import object
if sys.version_info.major >= 3: # Modern Python
from functools import singledispatch
else:
from singledispatch import singledispatch
from gi.repository import Gdk
from simplegeneric import generic
from gaphas.item import Item, Element
@ -31,7 +30,7 @@ class ItemFinder(object):
return item or self.view.get_item_at_point(pos)
Finder = generic(ItemFinder)
Finder = singledispatch(ItemFinder)
class ItemSelection(object):
@ -57,7 +56,7 @@ class ItemSelection(object):
self.view.unselect_item(self.item)
Selection = generic(ItemSelection)
Selection = singledispatch(ItemSelection)
class ItemInMotion(object):
@ -95,7 +94,7 @@ class ItemInMotion(object):
pass
InMotion = generic(ItemInMotion)
InMotion = singledispatch(ItemInMotion)
class ItemHandleFinder(object):
@ -111,7 +110,7 @@ class ItemHandleFinder(object):
return self.view.get_handle_at_point(pos)
HandleFinder = generic(ItemHandleFinder)
HandleFinder = singledispatch(ItemHandleFinder)
class ItemHandleSelection(object):
@ -131,10 +130,10 @@ class ItemHandleSelection(object):
pass
HandleSelection = generic(ItemHandleSelection)
HandleSelection = singledispatch(ItemHandleSelection)
@HandleSelection.when_type(Element)
@HandleSelection.register(Element)
class ElementHandleSelection(ItemHandleSelection):
CURSORS = ("nw-resize", "ne-resize", "se-resize", "sw-resize")
@ -228,7 +227,7 @@ class ItemHandleInMotion(object):
return None
HandleInMotion = generic(ItemHandleInMotion)
HandleInMotion = singledispatch(ItemHandleInMotion)
class ItemConnector(object):
@ -306,7 +305,7 @@ class ItemConnector(object):
self.item.canvas.disconnect_item(self.item, self.handle)
Connector = generic(ItemConnector)
Connector = singledispatch(ItemConnector)
class ItemConnectionSink(object):
@ -338,7 +337,7 @@ class ItemConnectionSink(object):
return port
ConnectionSink = generic(ItemConnectionSink)
ConnectionSink = singledispatch(ItemConnectionSink)
##
@ -360,7 +359,7 @@ class ItemPaintFocused(object):
pass
PaintFocused = generic(ItemPaintFocused)
PaintFocused = singledispatch(ItemPaintFocused)
# vim:sw=4:et:ai

@ -3,11 +3,15 @@ Module implements guides when moving items and handles around.
"""
from __future__ import division
import sys
from builtins import map
from builtins import object
from functools import reduce
from simplegeneric import generic
if sys.version_info.major >= 3: # Modern Python
from functools import singledispatch
else:
from singledispatch import singledispatch
from gaphas.aspect import InMotion, HandleInMotion, PaintFocused
from gaphas.aspect import ItemInMotion, ItemHandleInMotion, ItemPaintFocused
@ -35,10 +39,10 @@ class ItemGuide(object):
return ()
Guide = generic(ItemGuide)
Guide = singledispatch(ItemGuide)
@Guide.when_type(Element)
@Guide.register(Element)
class ElementGuide(ItemGuide):
"""Guide to align Element items.
@ -53,7 +57,7 @@ class ElementGuide(ItemGuide):
return (0, x / 2, x)
@Guide.when_type(Line)
@Guide.register(Line)
class LineGuide(ItemGuide):
"""Guide for orthogonal lines.
@ -205,7 +209,7 @@ class GuideMixin(object):
return 0, ()
@InMotion.when_type(Item)
@InMotion.register(Item)
class GuidedItemInMotion(GuideMixin, ItemInMotion):
"""
Move the item, lock position on any element that's located at the
@ -253,7 +257,7 @@ class GuidedItemInMotion(GuideMixin, ItemInMotion):
pass
@HandleInMotion.when_type(Item)
@HandleInMotion.register(Item)
class GuidedItemHandleInMotion(GuideMixin, ItemHandleInMotion):
"""Move a handle and lock the position of other elements.
@ -304,7 +308,7 @@ class GuidedItemHandleInMotion(GuideMixin, ItemHandleInMotion):
pass
@PaintFocused.when_type(Item)
@PaintFocused.register(Item)
class GuidePainter(ItemPaintFocused):
def paint(self, context):
try:

@ -3,11 +3,16 @@ Allow for easily adding segments to lines.
"""
from __future__ import division
import sys
from builtins import object
from builtins import zip
if sys.version_info.major >= 3: # Modern Python
from functools import singledispatch
else:
from singledispatch import singledispatch
from cairo import Matrix, ANTIALIAS_NONE
from simplegeneric import generic
from gaphas.aspect import ConnectionSink
from gaphas.aspect import HandleFinder, HandleSelection, PaintFocused
@ -16,13 +21,13 @@ from gaphas.geometry import distance_point_point_fast, distance_line_point
from gaphas.item import Line
@generic
@singledispatch
class Segment(object):
def __init__(self, item, view):
raise TypeError
@Segment.when_type(Line)
@Segment.register(Line)
class LineSegment(object):
def __init__(self, item, view):
self.item = item
@ -168,7 +173,7 @@ class LineSegment(object):
canvas.reconnect_item(item, handle, constraint=constraint)
@HandleFinder.when_type(Line)
@HandleFinder.register(Line)
class SegmentHandleFinder(ItemHandleFinder):
"""Find a handle on a line.
@ -193,7 +198,7 @@ class SegmentHandleFinder(ItemHandleFinder):
return item, handle
@HandleSelection.when_type(Line)
@HandleSelection.register(Line)
class SegmentHandleSelection(ItemHandleSelection):
"""
In addition to the default behaviour, merge segments if the handle
@ -229,7 +234,7 @@ class SegmentHandleSelection(ItemHandleSelection):
item.request_update()
@PaintFocused.when_type(Line)
@PaintFocused.register(Line)
class LineSegmentPainter(ItemPaintFocused):
"""
This painter draws pseudo-handles on gaphas.item.Line

34
poetry.lock generated

@ -104,14 +104,6 @@ optional = false
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4"
version = "4.5.3"
[[package]]
category = "main"
description = "Better living through Python with decorators"
name = "decorator"
optional = false
python-versions = ">=2.6, !=3.0.*, !=3.1.*"
version = "4.4.0"
[[package]]
category = "dev"
description = "A platform independent file lock."
@ -327,15 +319,16 @@ description = "pytest: simple powerful testing with Python"
name = "pytest"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "4.5.0"
version = "4.6.2"
[package.dependencies]
atomicwrites = ">=1.0"
attrs = ">=17.4.0"
colorama = "*"
pluggy = ">=0.9,<0.10 || >0.10,<1.0"
importlib-metadata = ">=0.12"
packaging = "*"
pluggy = ">=0.12,<1.0"
py = ">=1.5.0"
setuptools = "*"
six = ">=1.10.0"
wcwidth = "*"
@ -407,14 +400,18 @@ version = "1.10.0"
[[package]]
category = "main"
description = "Simple generic functions (similar to Python's own len(), pickle.dump(), etc.)"
name = "simplegeneric"
description = "This library brings functools.singledispatch from Python 3.4 to Python 2.6-3.3."
marker = "python_version >= \"2.7\" and python_version < \"2.8\""
name = "singledispatch"
optional = false
python-versions = "*"
version = "0.8.1"
version = "3.4.0.3"
[package.dependencies]
six = "*"
[[package]]
category = "dev"
category = "main"
description = "Python 2 and 3 compatibility utilities"
name = "six"
optional = false
@ -488,7 +485,7 @@ python-versions = ">=2.7"
version = "0.5.1"
[metadata]
content-hash = "b7ea07c07cc100bc42be00a37aea7ff7175b802ddd83c25f07efac34ddd5f18b"
content-hash = "aa6639173e680a371c3926655f034b24e0f880e3cb7434b40239f390a0c93f35"
python-versions = "~2.7 || ^3.5"
[metadata.hashes]
@ -503,7 +500,6 @@ colorama = ["05eed71e2e327246ad6b38c540c4a3117230b19679b875190486ddd2d721422d",
configparser = ["8be81d89d6e7b4c0d4e44bcc525845f6da25821de80cb5e06e7e0238a2899e32", "da60d0014fd8c55eb48c1c5354352e363e2d30bbf7057e5e171a468390184c75"]
contextlib2 = ["509f9419ee91cdd00ba34443217d5ca51f5a364a404e1dce9e8979cea969ca48", "f5260a6e679d2ff42ec91ec5252f4eeffdcf21053db9113bd0a8e4d953769c00"]
coverage = ["0c5fe441b9cfdab64719f24e9684502a59432df7570521563d7b1aff27ac755f", "2b412abc4c7d6e019ce7c27cbc229783035eef6d5401695dccba80f481be4eb3", "3684fabf6b87a369017756b551cef29e505cb155ddb892a7a29277b978da88b9", "39e088da9b284f1bd17c750ac672103779f7954ce6125fd4382134ac8d152d74", "3c205bc11cc4fcc57b761c2da73b9b72a59f8d5ca89979afb0c1c6f9e53c7390", "42692db854d13c6c5e9541b6ffe0fe921fe16c9c446358d642ccae1462582d3b", "465ce53a8c0f3a7950dfb836438442f833cf6663d407f37d8c52fe7b6e56d7e8", "48020e343fc40f72a442c8a1334284620f81295256a6b6ca6d8aa1350c763bbe", "4ec30ade438d1711562f3786bea33a9da6107414aed60a5daa974d50a8c2c351", "5296fc86ab612ec12394565c500b412a43b328b3907c0d14358950d06fd83baf", "5f61bed2f7d9b6a9ab935150a6b23d7f84b8055524e7be7715b6513f3328138e", "6899797ac384b239ce1926f3cb86ffc19996f6fa3a1efbb23cb49e0c12d8c18c", "68a43a9f9f83693ce0414d17e019daee7ab3f7113a70c79a3dd4c2f704e4d741", "6b8033d47fe22506856fe450470ccb1d8ba1ffb8463494a15cfc96392a288c09", "7ad7536066b28863e5835e8cfeaa794b7fe352d99a8cded9f43d1161be8e9fbd", "7bacb89ccf4bedb30b277e96e4cc68cd1369ca6841bde7b005191b54d3dd1034", "839dc7c36501254e14331bcb98b27002aa415e4af7ea039d9009409b9d2d5420", "8e679d1bde5e2de4a909efb071f14b472a678b788904440779d2c449c0355b27", "8f9a95b66969cdea53ec992ecea5406c5bd99c9221f539bca1e8406b200ae98c", "932c03d2d565f75961ba1d3cec41ddde00e162c5b46d03f7423edcb807734eab", "93f965415cc51604f571e491f280cff0f5be35895b4eb5e55b47ae90c02a497b", "988529edadc49039d205e0aa6ce049c5ccda4acb2d6c3c5c550c17e8c02c05ba", "998d7e73548fe395eeb294495a04d38942edb66d1fa61eb70418871bc621227e", "9de60893fb447d1e797f6bf08fdf0dbcda0c1e34c1b06c92bd3a363c0ea8c609", "9e80d45d0c7fcee54e22771db7f1b0b126fb4a6c0a2e5afa72f66827207ff2f2", "a545a3dfe5082dc8e8c3eb7f8a2cf4f2870902ff1860bd99b6198cfd1f9d1f49", "a5d8f29e5ec661143621a8f4de51adfb300d7a476224156a39a392254f70687b", "a9abc8c480e103dc05d9b332c6cc9fb1586330356fc14f1aa9c0ca5745097d19", "aca06bfba4759bbdb09bf52ebb15ae20268ee1f6747417837926fae990ebc41d", "bb23b7a6fd666e551a3094ab896a57809e010059540ad20acbeec03a154224ce", "bfd1d0ae7e292105f29d7deaa9d8f2916ed8553ab9d5f39ec65bcf5deadff3f9", "c22ab9f96cbaff05c6a84e20ec856383d27eae09e511d3e6ac4479489195861d", "c62ca0a38958f541a73cf86acdab020c2091631c137bd359c4f5bddde7b75fd4", "c709d8bda72cf4cd348ccec2a4881f2c5848fd72903c185f363d361b2737f773", "c968a6aa7e0b56ecbd28531ddf439c2ec103610d3e2bf3b75b813304f8cb7723", "ca58eba39c68010d7e87a823f22a081b5290e3e3c64714aac3c91481d8b34d22", "df785d8cb80539d0b55fd47183264b7002077859028dfe3070cf6359bf8b2d9c", "f406628ca51e0ae90ae76ea8398677a921b36f0bd71aab2099dfed08abd0322f", "f46087bbd95ebae244a0eda01a618aff11ec7a069b15a3ef8f6b520db523dcf1", "f8019c5279eb32360ca03e9fac40a12667715546eed5c5eb59eb381f2f501260", "fc5f4d209733750afd2714e9109816a29500718b32dd9a5db01c0cb3a019b96a"]
decorator = ["86156361c50488b84a3f148056ea716ca587df2f0de1d34750d35c21312725de", "f069f3a01830ca754ba5258fde2278454a0b5b79e0d7f5c13b3b97e57d4acff6"]
filelock = ["18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59", "929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836"]
funcsigs = ["330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca", "a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50"]
future = ["67045236dcfd6816dc439556d009594abf643e5eb48992e36beac09c2ca659b8"]
@ -521,13 +517,13 @@ py = ["64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa", "dc639
pycairo = ["70172e58b6bad7572a3518c26729b074acdde15e6fee6cbab6d3528ad552b786"]
pygobject = ["4165d9fb4157e69c76f29e52a6d73a39a804e18ad9ef0eede15efd9c57c52bf2"]
pyparsing = ["1873c03321fc118f4e9746baf201ff990ceb915f433f23b395f5580d1840cb2a", "9b6323ef4ab914af344ba97510e966d64ba91055d6b9afa6b30799340e89cc03"]
pytest = ["1a8aa4fa958f8f451ac5441f3ac130d9fc86ea38780dd2715e6d5c5882700b24", "b8bf138592384bd4e87338cb0f256bf5f615398a649d4bd83915f0e4047a5ca6"]
pytest = ["6032845e68a17a96e8da3088037f899b56357769a724122056265ca2ea1890ee", "bea27a646a3d74cbbcf8d3d4a06b2dfc336baf3dc2cc85cf70ad0157e73e8322"]
pytest-cov = ["2b097cde81a302e1047331b48cadacf23577e431b61e9c6f49a1170bbe3d3da6", "e00ea4fdde970725482f1f35630d12f074e121a23801aabf2ae154ec6bdd343a"]
pytest-runner = ["175d3d9271332b54df0190bec59c3614676f6895ad1056aa391ed034e03f95f6", "d1cb3d654b120d6124914bc33dcd25679860464545e4509bb6bf96eed5a2f1ef"]
pytest-sugar = ["26cf8289fe10880cbbc130bd77398c4e6a8b936d8393b116a5c16121d95ab283", "fcd87a74b2bce5386d244b49ad60549bfbc4602527797fac167da147983f58ab"]
pyyaml = ["1adecc22f88d38052fb787d959f003811ca858b799590a5eaa70e63dca50308c", "436bc774ecf7c103814098159fbb84c2715d25980175292c648f2da143909f95", "460a5a4248763f6f37ea225d19d5c205677d8d525f6a83357ca622ed541830c2", "5a22a9c84653debfbf198d02fe592c176ea548cccce47553f35f466e15cf2fd4", "7a5d3f26b89d688db27822343dfa25c599627bc92093e788956372285c6298ad", "9372b04a02080752d9e6f990179a4ab840227c6e2ce15b95e1278456664cf2ba", "a5dcbebee834eaddf3fa7366316b880ff4062e4bcc9787b78c7fbb4a26ff2dd1", "aee5bab92a176e7cd034e57f46e9df9a9862a71f8f37cad167c6fc74c65f5b4e", "c51f642898c0bacd335fc119da60baae0824f2cde95b0330b56c0553439f0673", "c68ea4d3ba1705da1e0d85da6684ac657912679a649e8868bd850d2c299cce13", "e23d0cc5299223dcc37885dae624f382297717e459ea24053709675a976a3e19"]
scandir = ["2586c94e907d99617887daed6c1d102b5ca28f1085f90446554abf1faf73123e", "2ae41f43797ca0c11591c0c35f2f5875fa99f8797cb1a1fd440497ec0ae4b022", "2b8e3888b11abb2217a32af0766bc06b65cc4a928d8727828ee68af5a967fa6f", "2c712840c2e2ee8dfaf36034080108d30060d759c7b73a01a52251cc8989f11f", "4d4631f6062e658e9007ab3149a9b914f3548cb38bfb021c64f39a025ce578ae", "67f15b6f83e6507fdc6fca22fedf6ef8b334b399ca27c6b568cbfaa82a364173", "7d2d7a06a252764061a020407b997dd036f7bd6a175a5ba2b345f0a357f0b3f4", "8c5922863e44ffc00c5c693190648daa6d15e7c1207ed02d6f46a8dcc2869d32", "92c85ac42f41ffdc35b6da57ed991575bdbe69db895507af88b9f499b701c188", "b24086f2375c4a094a6b51e78b4cf7ca16c721dcee2eddd7aa6494b42d6d519d", "cb925555f43060a1745d0a321cca94bcea927c50114b623d73179189a4e100ac"]
simplegeneric = ["dc972e06094b9af5b855b3df4a646395e43d1c9d0d39ed345b7393560d0b9173"]
singledispatch = ["5b06af87df13818d14f08a028e42f566640aef80805c3b50c5056b086e3c2b9c", "833b46966687b3de7f438c761ac475213e53b306740f1abfaa86e1d1aae56aa8"]
six = ["3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", "d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73"]
termcolor = ["1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"]
toml = ["229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c", "235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e", "f1db651f9657708513243e61e6cc67d101a39bad662eaa9b5546f789338e07a3"]

@ -28,10 +28,10 @@ classifiers = [
# Requirements
[tool.poetry.dependencies]
python = "~2.7 || ^3.5"
simplegeneric = "^0.8.1"
PyGObject = "^3.20.0"
pycairo = "^1.10.0"
future = "^0.17.0"
singledispatch = { version = "~3.4.0", python = "~2.7" }
[tool.poetry.dev-dependencies]
pytest = "^4.0"

@ -51,10 +51,10 @@ setup(
packages=find_packages(),
setup_requires=["setuptools-git >= 0.3.4"] + pytest_runner + pytest_cov,
install_requires=[
"simplegeneric >= 0.6",
"PyGObject >= 3.20.0",
"pycairo >= 1.10.0",
"future >= 0.17.0",
"singledispatch >= 3.4.0; python_version == '2.7'",
],
zip_safe=False,
python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",