Changeset 11071:e0b3d7e7dd61 in orange


Ignore:
Timestamp:
01/10/13 08:57:22 (16 months ago)
Author:
Matija Polajnar <matija.polajnar@…>
Branch:
default
Message:

addons: always close shelve after use.

Location:
Orange
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/orngDlgs.py

    r11037 r11071  
    66from PyQt4.QtGui import * 
    77from orngCanvasItems import MyCanvasText 
     8from contextlib import closing 
    89import OWGUI, sys, os 
    910 
     
    908909        result = [] 
    909910        import Orange.utils.addons 
    910         for ao in Orange.utils.addons.addons.values(): 
    911             if ao.installed_version and ao.available_version and ao.installed_version != ao.available_version: 
    912                 result.append(ao.name) 
     911        with closing(Orange.utils.addons.open_addons()) as addons: 
     912            for ao in addons.values(): 
     913                if ao.installed_version and ao.available_version and ao.installed_version != ao.available_version: 
     914                    result.append(ao.name) 
    913915        return result 
    914916     
     
    10031005    def enableDisableButtons(self): 
    10041006        import Orange.utils.addons 
    1005         aos = Orange.utils.addons.addons.values() 
    1006         self.upgradeAllButton.setEnabled(any(ao.installed_version and ao.available_version and 
    1007                                              ao.installed_version != ao.available_version and 
    1008                                              ao.name not in self.to_upgrade for ao in aos)) 
     1007        with closing(Orange.utils.addons.open_addons()) as addons: 
     1008            aos = addons.values() 
     1009            self.upgradeAllButton.setEnabled(any(ao.installed_version and ao.available_version and 
     1010                                                 ao.installed_version != ao.available_version and 
     1011                                                 ao.name not in self.to_upgrade for ao in aos)) 
    10091012         
    10101013    def currentItemChanged(self, new, previous): 
     
    10531056         
    10541057        # Add repositories and add-ons 
    1055         addons = {} 
    1056         for name in Orange.utils.addons.search_index(self.searchStr): 
    1057             addons[name.lower()] = Orange.utils.addons.addons[name.lower()] 
    1058         self.addAddOnsToTree(addons, selected = selected_addon, to_install=to_install, to_remove=to_remove) 
    1059         self.refreshInfoPane() 
     1058        with closing(Orange.utils.addons.open_addons()) as global_addons: 
     1059            addons = {} 
     1060            for name in Orange.utils.addons.search_index(self.searchStr): 
     1061                addons[name.lower()] = global_addons[name.lower()] 
     1062            self.addAddOnsToTree(addons, selected = selected_addon, to_install=to_install, to_remove=to_remove) 
     1063            self.refreshInfoPane() 
    10601064 
    10611065        #TODO Should we somehow show the legacy registered addons? 
  • Orange/utils/addons.py

    r11037 r11071  
    3131import platform 
    3232from collections import namedtuple, defaultdict 
     33from contextlib import closing 
    3334 
    3435import Orange.utils.environ 
     
    4748 
    4849AOLIST_FILE = os.path.join(Orange.utils.environ.orange_settings_dir, "addons.shelve") 
    49 try: 
    50     addons = shelve.open(AOLIST_FILE, 'c') 
    51     if any(name != name.lower() for name, record in addons.items()):  # Try to read the whole list and check for sanity. 
    52         raise Exception("Corrupted add-on list.") 
    53 except: 
    54     if os.path.isfile(AOLIST_FILE): 
    55         os.remove(AOLIST_FILE) 
    56     addons = shelve.open(AOLIST_FILE, 'n') 
    57  
    58 addons_corrupted = len(addons)==0 
     50def open_addons(): 
     51    try: 
     52        addons = shelve.open(AOLIST_FILE, 'c') 
     53        if any(name != name.lower() for name, record in addons.items()):  # Try to read the whole list and check for sanity. 
     54            raise Exception("Corrupted add-on list.") 
     55    except: 
     56        if os.path.isfile(AOLIST_FILE): 
     57            os.remove(AOLIST_FILE) 
     58        addons = shelve.open(AOLIST_FILE, 'n') 
     59    return addons 
     60 
     61global addons_corrupted 
     62with closing(open_addons()) as addons: 
     63    addons_corrupted = len(addons)==0 
    5964 
    6065addon_refresh_callback = [] 
     
    6671 
    6772    index = defaultdict(list) 
    68     for name, ao in addons.items(): 
    69         for s in [name, ao.summary, ao.description, ao.author] + (ao.keywords if ao.keywords else []): 
    70             if not s: 
    71                 continue 
    72             words = [word for word in re.split(INDEX_RE, s.lower()) 
    73                      if len(word)>1] 
    74             for word in words: 
    75                 for i in range(len(word)): 
    76                     index[word[:i+1]].append(name) 
     73    with closing(open_addons()) as addons: 
     74        for name, ao in addons.items(): 
     75            for s in [name, ao.summary, ao.description, ao.author] + (ao.keywords if ao.keywords else []): 
     76                if not s: 
     77                    continue 
     78                words = [word for word in re.split(INDEX_RE, s.lower()) 
     79                         if len(word)>1] 
     80                for word in words: 
     81                    for i in range(len(word)): 
     82                        index[word[:i+1]].append(name) 
    7783 
    7884def search_index(query): 
     
    8187    words = [word for word in re.split(INDEX_RE, query.lower()) if len(word)>1] 
    8288    if not words: 
    83         return addons.keys() 
     89        with closing(open_addons()) as addons: 
     90            return addons.keys() 
    8491    for word in words: 
    8592        result.update(index[word]) 
     
    104111        readthedocs = None 
    105112 
     113    global addons_corrupted 
    106114    docs = {} 
    107115    if progress_callback: 
    108116        progress_callback(len(pkg_dict)+1, 1) 
    109     for i, (name, (_, version)) in enumerate(pkg_dict.items()): 
    110         if force or name not in addons or addons[name.lower()].available_version != version: 
    111             try: 
    112                 data = pypi.release_data(name, version) 
    113                 rel = pypi.release_urls(name, version)[0] 
    114  
    115                 if readthedocs: 
    116                     try: 
    117                         docs = readthedocs.project.get(slug=name.lower())['objects'][0] 
    118                     except: 
    119                         docs = {} 
    120                 addons[name.lower()] = OrangeAddOn(name = name, 
    121                                            available_version = data['version'], 
    122                                            installed_version = addons[name.lower()].installed_version if name.lower() in addons else None, 
    123                                            summary = data['summary'], 
    124                                            description = data.get('description', ''), 
    125                                            author = str((data.get('author', '') or '') + ' ' + (data.get('author_email', '') or '')).strip(), 
    126                                            docs_url = data.get('docs_url', docs.get('subdomain', '')), 
    127                                            keywords = data.get('keywords', "").split(","), 
    128                                            homepage = data.get('home_page', ''), 
    129                                            package_url = data.get('package_url', ''), 
    130                                            release_url = rel.get('url', None), 
    131                                            release_size = rel.get('size', -1), 
    132                                            python_version = rel.get('python_version', None)) 
    133             except Exception, e: 
    134                 import traceback 
    135                 traceback.print_exc() 
    136                 warnings.warn('Could not load data for the following add-on: %s'%name) 
    137         if progress_callback: 
    138             progress_callback(len(pkg_dict)+1, i+2) 
    139     addons_corrupted = False 
    140     addons.sync() 
     117    with closing(open_addons()) as addons: 
     118        for i, (name, (_, version)) in enumerate(pkg_dict.items()): 
     119            if force or name not in addons or addons[name.lower()].available_version != version: 
     120                try: 
     121                    data = pypi.release_data(name, version) 
     122                    rel = pypi.release_urls(name, version)[0] 
     123 
     124                    if readthedocs: 
     125                        try: 
     126                            docs = readthedocs.project.get(slug=name.lower())['objects'][0] 
     127                        except: 
     128                            docs = {} 
     129                    addons[name.lower()] = OrangeAddOn(name = name, 
     130                                               available_version = data['version'], 
     131                                               installed_version = addons[name.lower()].installed_version if name.lower() in addons else None, 
     132                                               summary = data['summary'], 
     133                                               description = data.get('description', ''), 
     134                                               author = str((data.get('author', '') or '') + ' ' + (data.get('author_email', '') or '')).strip(), 
     135                                               docs_url = data.get('docs_url', docs.get('subdomain', '')), 
     136                                               keywords = data.get('keywords', "").split(","), 
     137                                               homepage = data.get('home_page', ''), 
     138                                               package_url = data.get('package_url', ''), 
     139                                               release_url = rel.get('url', None), 
     140                                               release_size = rel.get('size', -1), 
     141                                               python_version = rel.get('python_version', None)) 
     142                except Exception, e: 
     143                    import traceback 
     144                    traceback.print_exc() 
     145                    warnings.warn('Could not load data for the following add-on: %s'%name) 
     146            if progress_callback: 
     147                progress_callback(len(pkg_dict)+1, i+2) 
     148        addons_corrupted = False 
    141149 
    142150    rebuild_index() 
     
    144152def load_installed_addons(): 
    145153    found = set() 
    146     for entry_point in pkg_resources.iter_entry_points(ADDONS_ENTRY_POINT): 
    147         name, version = entry_point.dist.project_name, entry_point.dist.version 
    148         #TODO We could import setup.py from entry_point.location and load descriptions and such ... 
    149         if name.lower() in addons: 
    150             addons[name.lower()] = addons[name.lower()]._replace(installed_version = version) 
    151         else: 
    152             addons[name.lower()] = OrangeAddOn(name = name, 
    153                 available_version = None, 
    154                 installed_version = version, 
    155                 summary = "", 
    156                 description = "", 
    157                 author = "", 
    158                 docs_url = "", 
    159                 keywords = "", 
    160                 homepage = "", 
    161                 package_url = "", 
    162                 release_url = "", 
    163                 release_size = None, 
    164                 python_version = None) 
    165         found.add(name.lower()) 
    166     for name in set(addons).difference(found): 
    167         addons[name.lower()] = addons[name.lower()]._replace(installed_version = None) 
    168     addons.sync() 
     154    with closing(open_addons()) as addons: 
     155        for entry_point in pkg_resources.iter_entry_points(ADDONS_ENTRY_POINT): 
     156            name, version = entry_point.dist.project_name, entry_point.dist.version 
     157            #TODO We could import setup.py from entry_point.location and load descriptions and such ... 
     158            if name.lower() in addons: 
     159                addons[name.lower()] = addons[name.lower()]._replace(installed_version = version) 
     160            else: 
     161                addons[name.lower()] = OrangeAddOn(name = name, 
     162                    available_version = None, 
     163                    installed_version = version, 
     164                    summary = "", 
     165                    description = "", 
     166                    author = "", 
     167                    docs_url = "", 
     168                    keywords = "", 
     169                    homepage = "", 
     170                    package_url = "", 
     171                    release_url = "", 
     172                    release_size = None, 
     173                    python_version = None) 
     174            found.add(name.lower()) 
     175        for name in set(addons).difference(found): 
     176            addons[name.lower()] = addons[name.lower()]._replace(installed_version = None) 
    169177    rebuild_index() 
    170178 
     
    209217        import urllib 
    210218        rh = (lambda done, bs, fs: progress_callback(fs/bs, done)) if progress_callback else None 
    211         egg = urllib.urlretrieve(addons[name.lower()].release_url, reporthook=rh)[0] 
     219        with closing(open_addons()) as addons: 
     220            egg = urllib.urlretrieve(addons[name.lower()].release_url, reporthook=rh)[0] 
    212221    except Exception, e: 
    213222        raise Exception("Unable to download add-on from repository: %s" % e) 
     
    218227            egg_contents = tarfile.open(egg) 
    219228            egg_contents.extractall(tmpdir) 
    220             setup_py = os.path.join(tmpdir, name+'-'+addons[name.lower()].available_version, 'setup.py') 
     229            with closing(open_addons()) as addons: 
     230                setup_py = os.path.join(tmpdir, name+'-'+addons[name.lower()].available_version, 'setup.py') 
    221231        except Exception, e: 
    222232            raise Exception("Unable to unpack add-on: %s" % e) 
Note: See TracChangeset for help on using the changeset viewer.