Ignore:
Timestamp:
04/21/12 23:49:28 (2 years ago)
Author:
mitar
Branch:
default
Message:

Support also add-ons in Python eggs.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/orngRegistry.py

    r10827 r10838  
    9494                addOn.name = entry_point.name 
    9595                addOn.directory = module.__path__[0] # This is invalid and useless as documentation is not there, but to set it to something 
    96                 directories.append((entry_point.name, module.__path__[0], addOn, False, module.__name__)) 
     96                directories.append((entry_point.name, module.__path__[0], addOn, False, module)) 
    9797            else: 
    9898                # It is a module 
     
    140140     
    141141    widgets = [] 
    142      
     142 
    143143    if not defaultCategory: 
    144144        predir, defaultCategory = os.path.split(directory.strip(os.path.sep).strip(os.path.altsep)) 
     
    148148    if defaultCategory.lower() == "prototypes" or prototype: 
    149149        defaultCategory = "Prototypes" 
    150      
    151     for filename in glob.iglob(os.path.join(directory, "*.py")): 
    152         if os.path.isdir(filename): 
    153             continue 
     150    
     151    if module: 
     152        files = [f for f in pkg_resources.resource_listdir(module.__name__, '') if f.endswith('.py')] 
     153    else: 
     154        files = glob.iglob(os.path.join(directory, "*.py")) 
     155 
     156    for filename in files: 
     157        if module: 
     158            if pkg_resources.resource_isdir(module.__name__, filename): 
     159                continue 
     160        else: 
     161            if os.path.isdir(filename): 
     162                continue 
    154163         
    155         datetime = str(os.stat(filename)[stat.ST_MTIME]) 
     164        if module: 
     165            if getattr(module, '__loader__', None): 
     166                datetime = str(os.stat(module.__loader__.archive)[stat.ST_MTIME]) 
     167            else: 
     168                datetime = str(os.stat(pkg_resources.resource_filename(module.__name__, filename))[stat.ST_MTIME]) 
     169        else: 
     170            datetime = str(os.stat(filename)[stat.ST_MTIME]) 
    156171        cachedDescription = cachedWidgetDescriptions.get(filename, None) 
    157172        if cachedDescription and cachedDescription.time == datetime and hasattr(cachedDescription, "inputClasses"): 
     
    159174            continue 
    160175         
    161         data = file(filename).read() 
     176        if module: 
     177            data = pkg_resources.resource_string(module.__name__, filename) 
     178        else: 
     179            data = file(filename).read() 
    162180        try: 
    163181            meta = widgetParser.WidgetMetaData(data, defaultCategory, enforceDefaultCategory=prototype) 
     
    185203            # but we need to append the path to sys.path in case the module would want to load 
    186204            # something 
    187             dirnameInPath = dirname in sys.path 
    188             if not dirnameInPath: 
    189                 sys.path.append(dirname) 
     205            if dirname: 
     206                dirnameInPath = dirname in sys.path 
     207                if not dirnameInPath: 
     208                    sys.path.append(dirname) 
    190209            if module: 
    191                 wmod = imp.load_source("%s.%s" % (module, widgname), filename) 
     210                # TODO: We could optimize this probably with loading the module in a way which would not need filename directly 
     211                wmod = imp.load_source("%s.%s" % (module.__name__, widgname), pkg_resources.resource_filename(module.__name__, filename)) 
    192212            else: 
    193213                wmod = imp.load_source(widgname, filename) 
    194             if not dirnameInPath and dirname in sys.path: # I have no idea, why we need this, but it seems to disappear sometimes?! 
     214            if dirname and not dirnameInPath and dirname in sys.path: # I have no idea, why we need this, but it seems to disappear sometimes?! 
    195215                sys.path.remove(dirname) 
    196216            widgClass = wmod.__dict__[widgname] 
     
    224244                             time = datetime, 
    225245                             fileName = widgname, 
    226                              module = module, 
    227                              fullName = filename, 
     246                             module = module.__name__ if module else None, 
     247                             fullName = wmod.__file__, 
    228248                             directory = directory, 
    229249                             addOn = addOn, 
Note: See TracChangeset for help on using the changeset viewer.