Ignore:
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/orngCanvas.pyw

    r10827 r10838  
    1111     
    1212import sys, os, cPickle, orngRegistry, OWGUI 
     13import pkg_resources 
    1314import orngTabs, orngDoc, orngDlgs, orngOutput, orngHelp, OWReport 
    1415import user, orngMisc 
     
    10381039        for num in [16, 32, 40, 48, 60]: 
    10391040            names.append("%s_%d%s" % (name, num, ext)) 
    1040              
    1041         widgetDir = str(widgetInfo.directory)  #os.path.split(self.getFileName())[0] 
     1041         
     1042        if widgetInfo.module: 
     1043            widgetDir = '' 
     1044        else: 
     1045            widgetDir = str(widgetInfo.directory)  #os.path.split(self.getFileName())[0] 
    10421046        fullPaths = [] 
    10431047        for paths in [(self.widgetDir, widgetInfo.category), (self.widgetDir,), (self.picsDir,), tuple(), (widgetDir,), (widgetDir, "icons")]: 
    10441048            for name in names + [iconName]: 
    10451049                fname = os.path.join(*paths + (name,)) 
    1046                 if os.path.exists(fname): 
     1050                if widgetInfo.module: 
     1051                    if pkg_resources.resource_exists(widgetInfo.module, fname): 
     1052                        # TODO: Optimize, we should not be required to extract the icon 
     1053                        fullPaths.append(pkg_resources.resource_filename(widgetInfo.module, fname)) 
     1054                elif os.path.exists(fname): 
    10471055                    fullPaths.append(fname) 
    10481056            if len(fullPaths) > 1 and fullPaths[-1].endswith(iconName): 
     
    10531061     
    10541062    def getFullIconBackgroundName(self, widgetInfo): 
    1055         widgetDir = str(widgetInfo.directory) 
     1063        if widgetInfo.module: 
     1064            widgetDir = '' 
     1065        else: 
     1066            widgetDir = str(widgetInfo.directory) 
    10561067        fullPaths = [] 
    10571068        for paths in [(widgetDir, "icons"), (self.widgetDir, widgetInfo.category, "icons"), (self.widgetDir, "icons"), (self.picsDir,), tuple(), (widgetDir,), (widgetDir, "icons")]: 
    10581069            for name in ["background_%d.png" % num for num in [16, 32, 40, 48, 60]]: 
    10591070                fname = os.path.join(*paths + (name,)) 
    1060 #                print fname 
    1061                 if os.path.exists(fname): 
     1071                if widgetInfo.module: 
     1072                    if pkg_resources.resource_exists(widgetInfo.module, fname): 
     1073                        # TODO: Optimize, we should not be required to extract the icon 
     1074                        fullPaths.append(pkg_resources.resource_filename(widgetInfo.module, fname)) 
     1075                elif os.path.exists(fname): 
    10621076                    fullPaths.append(fname) 
    10631077            if fullPaths != []: 
  • 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, 
  • Orange/utils/environ.py

    r10582 r10838  
    9797import os, sys 
    9898import ConfigParser 
     99import pkg_resources 
     100from pkg_resources import working_set 
    99101 
    100102def _path_fix(): 
     
    297299add_orange_directories_to_path() 
    298300directories = dict([(dname, globals()[dname]) for dname in _ALL_DIR_OPTIONS]) 
     301 
     302def load_eggs(search_path): 
     303    distributions, errors = working_set.find_plugins( 
     304        pkg_resources.Environment(search_path) 
     305    ) 
     306    map(working_set.add, distributions) 
     307 
     308    if errors: 
     309        import warnings 
     310        warnings.warn("Error loading eggs: %s" % (errors,)) 
     311 
     312load_eggs([add_ons_dir_user]) 
  • README.rst

    r10825 r10837  
    2525 
    2626     orange-canvas 
     27 
     28Installation for Developers 
     29--------------------------- 
     30 
     31To install in `development mode`_ run:: 
     32 
     33    python setup.py develop 
     34    
     35.. _development mode: http://packages.python.org/distribute/setuptools.html#development-mode 
Note: See TracChangeset for help on using the changeset viewer.