Ignore:
Timestamp:
01/24/13 15:07:56 (15 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Check the sink channel cardinality and link duplication when adding a new link.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/scheme/scheme.py

    r11219 r11275  
    2020 
    2121from .errors import ( 
    22     SchemeCycleError, IncompatibleChannelTypeError 
     22    SchemeCycleError, IncompatibleChannelTypeError, SinkChannelError, 
     23    DuplicatedLinkError 
    2324) 
    2425 
     
    164165 
    165166    def add_link(self, link): 
    166         """Add a link to the scheme 
     167        """ 
     168        Add a link to the scheme. 
    167169        """ 
    168170        check_type(link, SchemeLink) 
    169         existing = self.find_links(link.source_node, link.source_channel, 
    170                                    link.sink_node, link.sink_channel) 
    171         check_arg(not existing, 
    172                   "Link %r already in the scheme." % link) 
    173171 
    174172        self.check_connect(link) 
     
    185183    def new_link(self, source_node, source_channel, 
    186184                 sink_node, sink_channel): 
    187         """Crate a new SchemeLink and add it to the scheme. 
     185        """ 
     186        Create a new SchemeLink and add it to the scheme. 
     187 
    188188        Same as: 
    189189 
     
    212212 
    213213    def check_connect(self, link): 
    214         """Check if the link can be added to the scheme. 
     214        """ 
     215        Check if the link can be added to the scheme. 
    215216 
    216217        Can raise: 
     218            - `TypeError` if link is not an instance of :class:`SchemeLink`. 
    217219            - `SchemeCycleError` if the link would introduce a cycle 
    218220            - `IncompatibleChannelTypeError` if the channel types are not 
    219                 compatible 
     221               compatible 
     222            - `SinkChannelError` if a sink channel has a `Single` flag 
     223               specification and there is already connected. 
     224            - `DuplicatedLinkError` if a link duplicates an already present 
     225               link. 
    220226 
    221227        """ 
    222228        check_type(link, SchemeLink) 
     229 
    223230        if self.creates_cycle(link): 
    224231            raise SchemeCycleError("Cannot create cycles in the scheme") 
     
    226233        if not self.compatible_channels(link): 
    227234            raise IncompatibleChannelTypeError( 
    228                     "Cannot connect %r to %r" \ 
    229                     % (link.source_channel, link.sink_channel) 
     235                    "Cannot connect %r to %r." \ 
     236                    % (link.source_channel.type, link.sink_channel.type) 
    230237                ) 
     238 
     239        links = self.find_links(source_node=link.source_node, 
     240                                source_channel=link.source_channel, 
     241                                sink_node=link.sink_node, 
     242                                sink_channel=link.sink_channel) 
     243 
     244        if links: 
     245            raise DuplicatedLinkError( 
     246                    "A link from %r (%r) -> %r (%r) already exists" \ 
     247                    % (link.source_node.title, link.source_channel.name, 
     248                       link.sink_node.title, link.sink_channel.name) 
     249                ) 
     250 
     251        if link.sink_channel.single: 
     252            links = self.find_links(sink_node=link.sink_node, 
     253                                    sink_channel=link.sink_channel) 
     254            if links: 
     255                raise SinkChannelError( 
     256                        "%r is already connected." % link.sink_channel.name 
     257                    ) 
    231258 
    232259    def creates_cycle(self, link): 
Note: See TracChangeset for help on using the changeset viewer.