Ignore:
Location:
Orange
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/orngRegistry.py

    r10581 r10824  
    33 
    44import os, sys, re, glob, stat 
    5 from orngSignalManager import OutputSignal, InputSignal 
     5from orngSignalManager import OutputSignal, InputSignal, resolveSignal 
    66from PyQt4.QtCore import * 
    77from PyQt4.QtGui import * 
     
    4444    # of types inside the Orange hierarchy, if that changes the cache should be 
    4545    # invalidated) 
    46     currentCacheVersion = (2, orange_version) 
     46    currentCacheVersion = (3, orange_version) 
    4747     
    4848    global widgetsWithError, widgetsWithErrorPrototypes 
     
    166166                sys.path.remove(dirname) 
    167167            widgClass = wmod.__dict__[widgname] 
    168             inputClasses = set(eval(x[1], wmod.__dict__).__name__ for x in eval(meta.inputList)) 
    169             outputClasses = set(y.__name__ for x in eval(meta.outputList) for y in eval(x[1], wmod.__dict__).mro()) 
    170              
     168 
     169            # Evaluate the input/output list (all tuple items are strings) 
     170            inputs = eval(meta.inputList) 
     171            outputs = eval(meta.outputList) 
     172 
     173            inputs = [InputSignal(*input) for input in inputs] 
     174            outputs = [OutputSignal(*output) for output in outputs] 
     175 
     176            # Resolve signal type names into concrete type instances 
     177            inputs = [resolveSignal(input, globals=wmod.__dict__) 
     178                      for input in inputs] 
     179            outputs = [resolveSignal(output, globals=wmod.__dict__) 
     180                      for output in outputs] 
     181 
     182            inputClasses = set([s.type.__name__ for s in inputs]) 
     183            outputClasses = set([klass.__name__ for s in outputs 
     184                                 for klass in s.type.mro()]) 
     185 
     186            # Convert all signal types back into qualified names. 
     187            # This is to prevent any possible import problems when cached 
     188            # descriptions are unpickled (the relevant code using this lists 
     189            # should be able to handle missing types better). 
     190            for s in inputs + outputs: 
     191                s.type = "%s.%s" % (s.type.__module__, s.type.__name__) 
     192 
    171193            widgetInfo = WidgetDescription( 
    172                              name = meta.name, 
     194                             name =meta.name, 
    173195                             time = datetime, 
    174196                             fileName = widgname, 
     
    178200                             inputList = meta.inputList, outputList = meta.outputList, 
    179201                             inputClasses = inputClasses, outputClasses = outputClasses, 
    180                              tags=meta.tags 
     202                             tags=meta.tags, 
     203                             inputs=inputs, 
     204                             outputs=outputs, 
    181205                             ) 
    182      
     206 
    183207            for attr in ["contact", "icon", "priority", "description", "category"]: 
    184208                setattr(widgetInfo, attr, getattr(meta, attr)) 
    185      
     209 
    186210            # build the tooltip 
    187             widgetInfo.inputs = [InputSignal(*signal) for signal in eval(widgetInfo.inputList)] 
    188211            if len(widgetInfo.inputs) == 0: 
    189212                formatedInList = "<b>Inputs:</b><br> &nbsp;&nbsp; None<br>" 
     
    192215                for signal in widgetInfo.inputs: 
    193216                    formatedInList += " &nbsp;&nbsp; - " + signal.name + " (" + signal.type + ")<br>" 
    194      
    195             widgetInfo.outputs = [OutputSignal(*signal) for signal in eval(widgetInfo.outputList)] 
     217 
    196218            if len(widgetInfo.outputs) == 0: 
    197219                formatedOutList = "<b>Outputs:</b><br> &nbsp; &nbsp; None<br>" 
  • Orange/OrangeCanvas/orngSignalManager.py

    r10651 r10821  
    55 
    66import sys, os, time 
     7import copy 
    78import logging 
    89import logging.handlers 
     10 
     11import __builtin__ 
    912 
    1013import orange 
     
    2831        self.handler = handler 
    2932 
    30         if type(parameters) == str:  
     33        if type(parameters) == str: 
    3134            parameters = eval(parameters)   # parameters are stored as strings 
    3235        # if we have the old definition of parameters then transform them 
    33         if parameters in [0,1]: 
     36        if parameters in [0, 1]: 
    3437            self.single = parameters 
    3538            self.default = not oldParam 
    3639            return 
    3740 
    38         if not (parameters & Single or parameters & Multiple): parameters += Single 
    39         if not (parameters & Default or parameters & NonDefault): parameters += NonDefault 
     41        if not (parameters & Single or parameters & Multiple): 
     42            parameters += Single 
     43        if not (parameters & Default or parameters & NonDefault): 
     44            parameters += NonDefault 
    4045        self.single = parameters & Single 
    4146        self.default = parameters & Default 
     
    7075    return ret 
    7176 
     77 
     78def rgetattr(obj, name): 
     79    while "." in name: 
     80        first, name = name.split(".", 1) 
     81        obj = getattr(obj, first) 
     82    return getattr(obj, name) 
     83 
     84 
     85def resolveSignal(signal, globals={}): 
     86    """If `signal.type` is a string (used by orngRegistry) return 
     87    the signal copy with the resolved `type`, else return the signal 
     88    unchanged. 
     89    """ 
     90    if isinstance(signal.type, basestring): 
     91        type_name = signal.type 
     92        if "." in type_name: 
     93            module, name = type_name.split(".", 1) 
     94            if module in globals: 
     95                #  module and type are imported in the globals 
     96                module = globals[module] 
     97                sig_type = rgetattr(module, name) 
     98            else: 
     99                module, name = type_name.rsplit(".", 1) 
     100                module = __import__(module, fromlist=[name], globals=globals) 
     101                sig_type = getattr(module, name) 
     102        else: 
     103            if type_name in globals: 
     104                sig_type = globals[type_name] 
     105            elif hasattr(__builtin__, type_name): 
     106                sig_type = getattr(__builtin__, type_name) 
     107            else: 
     108                raise NameError(type_name) 
     109 
     110        signal = copy.copy(signal) 
     111        signal.type = sig_type 
     112    return signal 
    72113 
    73114class SignalLink(object): 
  • Orange/OrangeCanvas/orngTabs.py

    r9671 r10823  
    77import os.path, sys 
    88from string import strip, count, replace 
    9 import orngDoc, orngOutput, orngRegistry 
    10 from orngSignalManager import InputSignal, OutputSignal 
     9import orngDoc, orngOutput, orngRegistry, orngSignalManager 
     10from orngSignalManager import InputSignal, OutputSignal, resolveSignal 
    1111import OWGUIEx 
    1212import orngHelp 
     
    579579        self.suggestItems = [QListWidgetItem(self.canvasDlg.getWidgetIcon(widget), widget.name) for widget in self.suggestDict.values()] 
    580580        self.categoriesYOffset = 0 
     581        self._canConnectCache = {} 
    581582                 
    582583    def showEvent(self, ev): 
     
    610611                    obj = obj.category 
    611612                    obj.setEnabled(True) 
    612             else:  
     613            else: 
    613614                act.setEnabled(False) 
    614      
     615 
     616    def selectInputActions(self, widgetInfo): 
     617        """Enable widgets which can consume the output from `widgetInfo`'s 
     618        output channels. 
     619         
     620        """ 
     621        for cat in self.allCatActions: 
     622            cat.setEnabled(False) 
     623 
     624        for act in self.allActions: 
     625            if self.canConnect(widgetInfo, act.widgetInfo): 
     626                act.setEnabled(True) 
     627                obj = act 
     628                while hasattr(obj, "category"): 
     629                    obj = obj.category 
     630                    obj.setEnabled(True) 
     631            else: 
     632                act.setEnabled(False) 
     633 
     634    def selectOutputActions(self, widgetInfo): 
     635        """Enable widgets which can produce the input for `widgetInfo`'s 
     636        input channels. 
     637          
     638        """ 
     639        for cat in self.allCatActions: 
     640            cat.setEnabled(False) 
     641 
     642        for act in self.allActions: 
     643            if self.canConnect(act.widgetInfo, widgetInfo): 
     644                act.setEnabled(True) 
     645                obj = act 
     646                while hasattr(obj, "category"): 
     647                    obj = obj.category 
     648                    obj.setEnabled(True) 
     649            else: 
     650                act.setEnabled(False) 
     651 
     652    def canConnect(self, outWidgetDesc, inWidgetDesc): 
     653        """Can connect any output from outWidgetDesc to input 
     654        from inWidgetDesc. 
     655         
     656        """ 
     657        if (outWidgetDesc, inWidgetDesc) not in self._canConnectCache: 
     658            ret = any(orngSignalManager.canConnect( 
     659                        resolveSignal(out), 
     660                        resolveSignal(in_), dynamic=True) \ 
     661                      for out in outWidgetDesc.outputs \ 
     662                      for in_ in inWidgetDesc.inputs 
     663                      ) 
     664            self._canConnectCache[(outWidgetDesc, inWidgetDesc)] = ret 
     665        return self._canConnectCache[(outWidgetDesc, inWidgetDesc)] 
     666 
    615667    def updateWidgesByOutputs(self, widgetInfo): 
    616         self.selectActions("outputClasses", widgetInfo.inputClasses) 
    617          
     668        self.selectOutputActions(widgetInfo) 
     669 
    618670    def updateWidgetsByInputs(self, widgetInfo): 
    619         self.selectActions("inputClasses", widgetInfo.outputClasses) 
    620      
     671        self.selectInputActions(widgetInfo) 
     672 
    621673    def updatePredictedWidgets(self, widgets, actClassesAttr, ioClasses=None): 
    622674        self.candidates = [] 
  • Orange/OrangeWidgets/Prototypes/OWRScript.py

    r10462 r10819  
    1010from OWItemModels import PyListModel, ModelActionsWidget 
    1111 
    12 import Orange.misc.r as r 
     12import Orange.utils.r as r 
    1313 
    1414globalenv = r.globalenv 
  • Orange/OrangeWidgets/Regression/OWPLS.py

    r9671 r10820  
    1414import Orange 
    1515from Orange.regression import pls 
    16 from Orange.optimization import PreprocessedLearner 
     16from Orange.tuning import PreprocessedLearner 
    1717 
    1818class OWPLS(OWWidget): 
Note: See TracChangeset for help on using the changeset viewer.