Changeset 7831:8518296d7331 in orange


Ignore:
Timestamp:
04/12/11 10:06:44 (3 years ago)
Author:
matija <matija.polajnar@…>
Branch:
default
Convert:
ba6cf6410942a51d003319b670631f06478766d5
Message:

Refactoring and extensive documentation of orngAddOns –> Orange.misc.addons.

Location:
orange
Files:
1 added
1 deleted
8 edited

Legend:

Unmodified
Added
Removed
  • orange/Orange/misc/__init__.py

    r7794 r7831  
    9191 
    9292================== 
     93Add-on Management 
     94================== 
     95 
     96.. index:: add-ons 
     97 
     98.. automodule:: Orange.misc.addons 
     99 
     100================== 
    93101Server files 
    94102================== 
     
    104112import render 
    105113import serverfiles 
     114# addons is intentionally not imported; if it were, add-ons' directories would 
     115# be added to the python path. If that sounds OK, this can be changed ... 
    106116 
    107117__all__ = ["counters", "selection", "render", "serverfiles", 
  • orange/OrangeCanvas/orngCanvas.pyw

    r7814 r7831  
    55# This module has to be imported first because it takes care of the system PATH variable 
    66# Namely, it throws out the MikTeX directories which contain an incompatible Qt .dll's 
    7 import orngEnviron, orngAddOns 
     7import orngEnviron, Orange.misc.addons 
    88 
    99from PyQt4.QtCore import * 
     
    175175            orngTabs.constructCategoriesPopup(self) 
    176176            self.createWidgetsToolbar() 
    177         orngAddOns.addOnRefreshCallback.append(addOnRefreshCallback) 
     177        Orange.misc.addons.addon_refresh_callback.append(addOnRefreshCallback) 
    178178 
    179179        # create menu 
     
    698698                anyFailed = False 
    699699                anyDone = False 
    700                 for r in orngAddOns.availableRepositories: 
     700                for r in Orange.misc.addons.available_repositories: 
    701701                    #TODO: # Should show some progress (and enable cancellation) 
    702702                    try: 
    703                         if r.refreshData(force=True): 
     703                        if r.refreshdata(force=True): 
    704704                            anyDone = True 
    705705                        else: 
     
    720720                    addOn.uninstall(refresh=False) 
    721721                    if id in dlg.addOnsToAdd.items(): 
    722                         orngAddOns.installAddOnFromRepo(dlg.addOnsToAdd[id], globalInstall=False, refresh=False) 
     722                        Orange.misc.addons.install_addon_from_repo(dlg.addOnsToAdd[id], global_install=False, refresh=False) 
    723723                        del dlg.addOnsToAdd[id] 
    724724                except Exception, e: 
     
    727727                if id.startswith("registered:"): 
    728728                    try: 
    729                         orngAddOns.registerAddOn(addOn.name, addOn.directory, refresh=False, systemWide=False) 
     729                        Orange.misc.addons.register_addon(addOn.name, addOn.directory, refresh=False, systemwide=False) 
    730730                    except Exception, e: 
    731731                        print "Problem registering add-on %s: %s" % (addOn.name, e) 
    732732                else: 
    733733                    try: 
    734                         orngAddOns.installAddOnFromRepo(dlg.addOnsToAdd[id], globalInstall=False, refresh=False) 
     734                        Orange.misc.addons.install_addon_from_repo(dlg.addOnsToAdd[id], global_install=False, refresh=False) 
    735735                    except Exception, e: 
    736736                        print "Problem installing add-on %s: %s" % (addOn.name, e) 
    737737            if len(dlg.addOnsToAdd)+len(dlg.addOnsToRemove)>0: 
    738                 orngAddOns.refreshAddOns(reloadPath=True) 
     738                Orange.misc.addons.refresh_addons(reload_path=True) 
    739739                 
    740740                     
  • orange/OrangeCanvas/orngDlgs.py

    r7154 r7831  
    800800        self.addOnsToAdd = {} 
    801801        self.addOnsToRemove = {} 
    802         import orngAddOns 
    803         self.repositories = [repo.clone() for repo in orngAddOns.availableRepositories] 
     802        import Orange.misc.addons 
     803        self.repositories = [repo.clone() for repo in Orange.misc.addons.available_repositories] 
    804804         
    805805        # Bottom info pane 
     
    887887     
    888888    def accept(self): 
    889         import orngAddOns 
     889        import Orange.misc.addons 
    890890        if len(self.addOnsToAdd) + len(self.addOnsToRemove) > 0: 
    891891            summary = AddOnManagerSummary(self.addOnsToAdd, self.addOnsToRemove, self) 
    892892            if summary.exec_() == QDialog.Rejected: 
    893893                return 
    894         orngAddOns.availableRepositories = self.repositories 
    895         orngAddOns.saveRepositories() 
     894        Orange.misc.addons.available_repositories = self.repositories 
     895        Orange.misc.addons.save_repositories() 
    896896        QDialog.accept(self) 
    897897         
     
    899899        dlg = AddOnRepositoryData() 
    900900        while dlg.exec_() == QDialog.Accepted: 
    901             import orngAddOns 
     901            import Orange.misc.addons 
    902902            try: 
    903                 repo = orngAddOns.OrangeAddOnRepository(dlg.name, dlg.url)   #TODO: This can take some time - inform the user! 
     903                repo = Orange.misc.addons.OrangeAddOnRepository(dlg.name, dlg.url)   #TODO: This can take some time - inform the user! 
    904904                self.repositories.append(repo) 
    905905            except Exception, e: 
     
    916916        dlg = AddOnRepositoryData(name=repo.name, url=repo.url) 
    917917        while dlg.exec_() == QDialog.Accepted: 
    918             import orngAddOns 
     918            import Orange.misc.addons 
    919919            try: 
    920920                oldname, oldurl = repo.name, repo.url 
    921921                repo.name, repo.url = dlg.name, dlg.url 
    922922                if oldurl != repo.url: 
    923                     repo.refreshData(force=True)  #TODO: This can take some time - inform the user! 
     923                    repo.refreshdata(force=True)  #TODO: This can take some time - inform the user! 
    924924            except Exception, e: 
    925925                repo.name, repo.url = oldname, oldurl 
     
    934934            return 
    935935        # Is it a default repository? We cannot delete it! 
    936         import orngAddOns 
    937         if repo.__class__ is orngAddOns.OrangeDefaultAddOnRepository: 
     936        import Orange.misc.addons 
     937        if repo.__class__ is Orange.misc.addons.OrangeDefaultAddOnRepository: 
    938938            return 
    939939         
     
    952952        for repo in self.repositories: 
    953953            try: 
    954                 repo.refreshData(force=True) 
     954                repo.refreshdata(force=True) 
    955955            except Exception, e:  # Maybe gather all exceptions (for all repositories) and show them in the end? 
    956956                QMessageBox.critical(self, "Error", "Could not reload repository '%s': %s." % (repo.name, e)) 
    957957        # Were any installation-pending add-ons removed from repositories? 
    958958        for (id, addOn) in self.addOnsToAdd.items(): 
    959             if id in addOn.repository.addOns: 
    960                 newObject = [version for version in addOn.repository.addOns[id] if version.version == addOn.version] 
     959            if id in addOn.repository.addons: 
     960                newObject = [version for version in addOn.repository.addons[id] if version.version == addOn.version] 
    961961                if newObject != []: 
    962962                    self.addOnsToAdd[id] = newObject[0] 
     
    970970    def upgradeCandidates(self): 
    971971        result = [] 
    972         import orngEnviron, orngAddOns 
     972        import orngEnviron, Orange.misc.addons 
    973973        for item in self.tree.addOnItems: 
    974974            id = item.newest.id 
    975975            if id.startswith("registered:"): continue 
    976             installedAo = orngAddOns.installedAddOns[id] if id in orngAddOns.installedAddOns else None 
     976            installedAo = Orange.misc.addons.installed_addons[id] if id in Orange.misc.addons.installed_addons else None 
    977977            installed = installedAo.version if installedAo else None  
    978978            selected = self.addOnsToAdd[id].version if id in self.addOnsToAdd else None 
     
    997997        if not newAddOn: 
    998998            return 
    999         import orngAddOns 
    1000         self.addOnsToRemove[newAddOn.id] = orngAddOns.installedAddOns[newAddOn.id] 
     999        import Orange.misc.addons 
     1000        self.addOnsToRemove[newAddOn.id] = Orange.misc.addons.installed_addons[newAddOn.id] 
    10011001        self.addOnsToAdd[newAddOn.id] = newAddOn 
    10021002        if refresh: 
     
    10111011            if os.path.exists(os.path.join(dir, "widgets")): 
    10121012                name = os.path.split(dir)[1] 
    1013                 import orngAddOns 
     1013                import Orange.misc.addons 
    10141014                id = "registered:"+dir 
    1015                 self.addOnsToAdd[id] = orngAddOns.OrangeRegisteredAddOn(name, dir, systemWide=False) 
     1015                self.addOnsToAdd[id] = Orange.misc.addons.OrangeRegisteredAddOn(name, dir, systemwide=False) 
    10161016                self.refreshView(id) 
    10171017            else: 
     
    10211021        addOn = self.getAddOnFromItem(self.tree.currentItem()) 
    10221022        if not addOn: return 
    1023         if not addOn.homePage: return 
     1023        if not addOn.homepage: return 
    10241024        import webbrowser 
    1025         webbrowser.open(addOn.homePage) 
     1025        webbrowser.open(addOn.homepage) 
    10261026         
    10271027    def listWidgets(self): 
    10281028        addOn = self.getAddOnFromItem(self.tree.currentItem()) 
    10291029        if not addOn: return 
    1030         import orngAddOns 
    1031         if addOn.__class__ is not orngAddOns.OrangeAddOnInRepo: return 
    1032         if not addOn.repository.hasWebScript: return 
    1033         self.canvasDlg.helpWindow.open("%s/addOnServer.py/%s/doc/widgets/" % (addOn.repository.url, addOn.fileName), modal=True) 
     1030        import Orange.misc.addons 
     1031        if addOn.__class__ is not Orange.misc.addons.OrangeAddOnInRepo: return 
     1032        if not addOn.repository.has_web_script: return 
     1033        self.canvasDlg.helpWindow.open("%s/addOnServer.py/%s/doc/widgets/" % (addOn.repository.url, addOn.filename), modal=True) 
    10341034         
    10351035         
     
    10631063                    self.addOnsToAdd[id] = addOn 
    10641064        else:                                 # Mark for removal (or delete installation request) 
    1065             import orngAddOns, orngEnviron 
    1066             installedAo = orngAddOns.installedAddOns[id] if id in orngAddOns.installedAddOns else None  
     1065            import Orange.misc.addons, orngEnviron 
     1066            installedAo = Orange.misc.addons.installed_addons[id] if id in Orange.misc.addons.installed_addons else None  
    10671067            if installedAo: 
    10681068                if not installedAo.directory.startswith(orngEnviron.addOnsDirUser): 
     
    10741074                del self.addOnsToAdd[id] 
    10751075            elif id not in self.addOnsToRemove: 
    1076                 import orngAddOns 
    1077                 if id in orngAddOns.installedAddOns: 
    1078                     self.addOnsToRemove[id] = orngAddOns.installedAddOns[id] 
     1076                import Orange.misc.addons 
     1077                if id in Orange.misc.addons.installed_addons: 
     1078                    self.addOnsToRemove[id] = Orange.misc.addons.installed_addons[id] 
    10791079                elif id.startswith("registered:"): 
    10801080                    self.addOnsToRemove[id] = item.newest 
     
    10851085        if not item: 
    10861086            return None 
    1087         import orngAddOns 
     1087        import Orange.misc.addons 
    10881088        if hasattr(item, "repository"): 
    10891089            return item.repository 
    10901090        else: 
    1091             if item.newest.__class__ is not orngAddOns.OrangeAddOnInRepo: 
     1091            if item.newest.__class__ is not Orange.misc.addons.OrangeAddOnInRepo: 
    10921092                return None 
    10931093            return  item.newest.repository 
     
    11051105        if not item: 
    11061106            item = self.tree.currentItem() 
    1107         import orngAddOns 
     1107        import Orange.misc.addons 
    11081108        if hasattr(item, "newest"): 
    1109             if item.newest.__class__ is not orngAddOns.OrangeRegisteredAddOn: 
    1110                 import orngAddOns, orngEnviron 
     1109            if item.newest.__class__ is not Orange.misc.addons.OrangeRegisteredAddOn: 
     1110                import orngEnviron 
    11111111                addOn = item.newest 
    11121112                self.lblDescription.setText(addOn.description.strip() if addOn else "") 
    1113                 self.lblVerAvailValue.setText(addOn.versionStr) 
     1113                self.lblVerAvailValue.setText(addOn.version_str) 
    11141114     
    1115                 addOnInstalled = orngAddOns.installedAddOns[addOn.id] if addOn.id in orngAddOns.installedAddOns else None 
     1115                addOnInstalled = Orange.misc.addons.installed_addons[addOn.id] if addOn.id in Orange.misc.addons.installed_addons else None 
    11161116                addOnToInstall = self.addOnsToAdd[addOn.id] if addOn.id in self.addOnsToAdd else None 
    11171117                addOnToRemove = self.addOnsToRemove[addOn.id] if addOn.id in self.addOnsToRemove else None 
    11181118                 
    1119                 self.lblVerInstalledValue.setText((addOnInstalled.versionStr+("" if addOnInstalled.directory.startswith(orngEnviron.addOnsDirUser) else " (installed system-wide)")) if addOnInstalled else "-") 
     1119                self.lblVerInstalledValue.setText((addOnInstalled.version_str+("" if addOnInstalled.directory.startswith(orngEnviron.addOnsDirUser) else " (installed system-wide)")) if addOnInstalled else "-") 
    11201120                self.upgradeButton.setVisible(addOnInstalled!=None and addOnInstalled.version < addOn.version and addOnToInstall!=addOn and addOnInstalled.directory.startswith(orngEnviron.addOnsDirUser)) 
    11211121                self.donotUpgradeButton.setVisible(addOn.id in self.addOnsToRemove and addOnToInstall==addOn) 
    1122                 self.webButton.setVisible(addOn.homePage != None) 
    1123                 self.listWidgetsButton.setVisible(len(addOn.widgets) > 0 and addOn.__class__ is orngAddOns.OrangeAddOnInRepo and addOn.repository.hasWebScript) 
     1122                self.webButton.setVisible(addOn.homepage != None) 
     1123                self.listWidgetsButton.setVisible(len(addOn.widgets) > 0 and addOn.__class__ is Orange.misc.addons.OrangeAddOnInRepo and addOn.repository.has_web_script) 
    11241124                 
    11251125                if addOnToInstall: 
     
    11321132                self.regiInfoPane.setVisible(False) 
    11331133            else: 
    1134                 self.lblRegisteredAddOnInfo.setText("This add-on is registered "+("system-wide." if item.newest.systemWide else "by user.")) 
     1134                self.lblRegisteredAddOnInfo.setText("This add-on is registered "+("system-wide." if item.newest.systemwide else "by user.")) 
    11351135                self.infoPane.setVisible(False) 
    11361136                self.regiInfoPane.setVisible(True) 
     
    11411141    def enableDisableButtons(self): 
    11421142        repo = self.getRepoFromItem(self.tree.currentItem()) 
    1143         import orngAddOns 
    1144         self.delRepoButton.setEnabled(repo.__class__ is not orngAddOns.OrangeDefaultAddOnRepository if repo!=None else False) 
    1145         self.editRepoButton.setEnabled(repo.__class__ is not orngAddOns.OrangeDefaultAddOnRepository if repo!=None else False) 
     1143        import Orange.misc.addons 
     1144        self.delRepoButton.setEnabled(repo.__class__ is not Orange.misc.addons.OrangeDefaultAddOnRepository if repo!=None else False) 
     1145        self.editRepoButton.setEnabled(repo.__class__ is not Orange.misc.addons.OrangeDefaultAddOnRepository if repo!=None else False) 
    11461146        self.upgradeAllButton.setEnabled(self.upgradeCandidates() != []) 
    11471147         
     
    11541154     
    11551155    def resetChecked(self, id): 
    1156         import orngAddOns 
    1157         value = id in orngAddOns.installedAddOns or id.startswith("registered:") 
     1156        import Orange.misc.addons 
     1157        value = id in Orange.misc.addons.installed_addons or id.startswith("registered:") 
    11581158        value = value and id not in self.addOnsToRemove 
    11591159        value = value or id in self.addOnsToAdd 
     
    11821182        # Single-addon packages last 
    11831183        if self.sortSingleLast: 
    1184             addOnList = [(n, v) for (n, v) in addOnList if not n.hasSingleWidget] \ 
    1185                       + [(n, v) for (n, v) in addOnList if     n.hasSingleWidget] 
     1184            addOnList = [(n, v) for (n, v) in addOnList if not n.has_single_widget] \ 
     1185                      + [(n, v) for (n, v) in addOnList if     n.has_single_widget] 
    11861186        # Installed first 
    11871187        if self.sortInstalledFirst and len(addOnList)>0 and "id" in addOnList[0][0].__dict__: 
    1188             import orngAddOns 
    1189             addOnList = [(n, v) for (n, v) in addOnList if     n.id in orngAddOns.installedAddOns] \ 
    1190                       + [(n, v) for (n, v) in addOnList if not n.id in orngAddOns.installedAddOns] 
     1188            import Orange.misc.addons 
     1189            addOnList = [(n, v) for (n, v) in addOnList if     n.id in Orange.misc.addons.installed_addons] \ 
     1190                      + [(n, v) for (n, v) in addOnList if not n.id in Orange.misc.addons.installed_addons] 
    11911191         
    11921192        for (i, (newest, versions)) in enumerate(addOnList): 
     
    11991199            addOnItem.disableToggleSignal = True 
    12001200            addOnItem.setText(0, newest.name) 
    1201             if newest.hasSingleWidget(): 
     1201            if newest.has_single_widget(): 
    12021202                italFont = QFont(addOnItem.font(0)) 
    12031203                italFont.setItalic(True) 
     
    12251225         
    12261226        addOnsToAdd = {} 
    1227         visibleAddOns = repo.searchIndex(self.searchStr) 
    1228         for (id, versions) in repo.addOns.items(): 
     1227        visibleAddOns = repo.search_index(self.searchStr) 
     1228        for (id, versions) in repo.addons.items(): 
    12291229            if id in visibleAddOns: 
    12301230                addOnsToAdd[id] = versions 
     
    12601260            for repo in self.repositories: 
    12611261                item = self.addRepositoryToTree(repo) 
    1262                 shownAddOns = shownAddOns.union(set(repo.addOns).intersection(repo.searchIndex(self.searchStr))) 
     1262                shownAddOns = shownAddOns.union(set(repo.addons).intersection(repo.search_index(self.searchStr))) 
    12631263        else: 
    12641264            addOns = {} 
    12651265            for repo in self.repositories: 
    1266                 for addOnId in repo.addOns: 
    1267                     if addOnId in repo.searchIndex(self.searchStr): 
     1266                for addOnId in repo.addons: 
     1267                    if addOnId in repo.search_index(self.searchStr): 
    12681268                        if addOnId in addOns: 
    1269                             addOns[addOnId].extend(repo.addOns[addOnId]) 
     1269                            addOns[addOnId].extend(repo.addons[addOnId]) 
    12701270                        else: 
    1271                             addOns[addOnId] = list(repo.addOns[addOnId]) 
     1271                            addOns[addOnId] = list(repo.addons[addOnId]) 
    12721272            self.addAddOnsToTree(self.tree, addOns) 
    12731273            shownAddOns = set(addOns) 
     
    12751275        # Add add-ons that are not present in any repository 
    12761276        if self.searchStr.strip() == "":   # but we do not need to search among installed add-ons 
    1277             import orngAddOns 
     1277            import Orange.misc.addons 
    12781278            onlyInstalledAddOns = {} 
    1279             for addOn in orngAddOns.installedAddOns.values(): 
     1279            for addOn in Orange.misc.addons.installed_addons.values(): 
    12801280                if addOn.id not in shownAddOns: 
    12811281                    onlyInstalledAddOns[addOn.id] = [addOn] 
     
    12831283             
    12841284        # Registered Add-ons 
    1285         if orngAddOns.registeredAddOns != [] or any([id.startswith("registered:") for id in self.addOnsToAdd]): 
     1285        if Orange.misc.addons.registered_addons != [] or any([id.startswith("registered:") for id in self.addOnsToAdd]): 
    12861286            regiItem = QTreeWidgetItem(self.tree) 
    12871287            regiItem.repository = None 
     
    12951295            addOnsToAdd = [] 
    12961296            import re 
    1297             words = [word for word in re.split(orngAddOns.indexRE, self.searchStr.lower()) if word!=""] 
    1298             visibleAddOns = [ao for ao in orngAddOns.registeredAddOns+[ao for ao in self.addOnsToAdd.values() if ao.id.startswith("registered:")] if all([word in ao.name for word in words])] 
     1297            words = [word for word in re.split(Orange.misc.addons.index_re, self.searchStr.lower()) if word!=""] 
     1298            visibleAddOns = [ao for ao in Orange.misc.addons.registered_addons+[ao for ao in self.addOnsToAdd.values() if ao.id.startswith("registered:")] if all([word in ao.name for word in words])] 
    12991299            self.addAddOnsToTree(regiItem, visibleAddOns) 
    13001300            if selectedRegisteredAddOnId: 
     
    14321432class saveApplicationDlg(QDialog): 
    14331433    def __init__(self, *args): 
    1434         import orngAddOns 
     1434        import Orange.misc.addons 
    14351435         
    14361436        apply(QDialog.__init__,(self,) + args) 
  • orange/OrangeCanvas/orngRegistry.py

    r7082 r7831  
    1212    sys.path.append(orangeDir) 
    1313 
    14 import orngEnviron, orngAddOns 
     14import orngEnviron, Orange.misc.addons 
    1515 
    1616class WidgetDescription: 
     
    6464             
    6565    # read list of add-ons 
    66     for addOn in orngAddOns.installedAddOns.values() + orngAddOns.registeredAddOns: 
     66    for addOn in Orange.misc.addons.installed_addons.values() + Orange.misc.addons.registered_addons: 
    6767        addOnWidgetsDir = os.path.join(addOn.directory, "widgets") 
    6868        if os.path.isdir(addOnWidgetsDir): 
  • orange/addOnPack.py

    r6563 r7831  
    66import OWGUI 
    77 
    8 import orngAddOns 
     8import Orange.misc.addons 
    99 
    1010 
     
    1717 
    1818        desktop = app.desktop() 
    19         deskH = desktop.screenGeometry(desktop.primaryScreen()).height() 
    20         deskW = desktop.screenGeometry(desktop.primaryScreen()).width() 
    21         h = max(0, deskH / 2 - height / 2)  # if the window is too small, resize the window to desktop size 
    22         w = max(0, deskW / 2 - width / 2) 
     19        deskh = desktop.screenGeometry(desktop.primaryScreen()).height() 
     20        deskw = desktop.screenGeometry(desktop.primaryScreen()).width() 
     21        h = max(0, deskh / 2 - height / 2)  # if the window is too small, resize the window to desktop size 
     22        w = max(0, deskw / 2 - width / 2) 
    2323        self.move(w, h) 
    2424         
    2525        self.setWindowTitle("Orange Add-on Packaging Wizard") 
    2626  
    27         self.initAddOnSelectionPage() 
    28         self.initMetaDataPage() 
    29         self.initOptionalMetaDataPage() 
     27        self.init_addon_selection_page() 
     28        self.init_metadata_page() 
     29        self.init_optional_metadata_page() 
    3030        self.initDestinationPage() 
    3131 
    32     def initAddOnSelectionPage(self): 
    33         self.addOnSelectionPage = page = QWizardPage() 
     32    def init_addon_selection_page(self): 
     33        self.addon_selection_page = page = QWizardPage() 
    3434        page.setTitle("Add-on Selection") 
    3535        page.setLayout(QVBoxLayout()) 
     
    3838 
    3939        p = OWGUI.widgetBox(page, "Select a registered add-on to pack", orientation="horizontal") 
    40         self.aoList = OWGUI.listBox(p, self, callback=self.listSelectionCallback) 
    41         self.registeredAddOns = orngAddOns.registeredAddOns 
    42         for ao in self.registeredAddOns: 
    43             self.aoList.addItem(ao.name) 
    44         pBtn = OWGUI.widgetBox(p, orientation="vertical") 
    45         btnCustomLocation = OWGUI.button(pBtn, self, "Custom Location...", callback=self.selectCustomLocation) 
    46         pBtn.layout().addStretch(1) 
     40        self.aolist = OWGUI.listBox(p, self, callback=self.list_selection_callback) 
     41        self.registered_addons = Orange.misc.addons.registered_addons 
     42        for ao in self.registered_addons: 
     43            self.aolist.addItem(ao.name) 
     44        pbtn = OWGUI.widgetBox(p, orientation="vertical") 
     45        btn_custom_location = OWGUI.button(pbtn, self, "Custom Location...", callback=self.select_custom_location) 
     46        pbtn.layout().addStretch(1) 
    4747         
    4848        self.directory = "" 
    49         self.eDirectory = OWGUI.lineEdit(page, self, "directory", label="Add-on directory: ", callback=self.directoryChangeCallback, callbackOnType=True) 
     49        self.e_directory = OWGUI.lineEdit(page, self, "directory", label="Add-on directory: ", callback=self.directory_change_callback, callbackOnType=True) 
    5050        page.isComplete = lambda page: os.path.isdir(os.path.join(self.directory, "widgets")) 
    5151     
    52     def listSelectionCallback(self): 
    53         index = self.aoList.currentIndex() 
    54         item = self.registeredAddOns[index.row()] if index else None 
     52    def list_selection_callback(self): 
     53        index = self.aolist.currentIndex() 
     54        item = self.registered_addons[index.row()] if index else None 
    5555        if item: 
    56             self.eDirectory.setText(item.directory) 
     56            self.e_directory.setText(item.directory) 
    5757        else: 
    58             self.eDirectory.setText("") 
    59      
    60     def selectCustomLocation(self): 
    61         import os 
    62         dir = str(QFileDialog.getExistingDirectory(self, "Select the folder that contains the add-on:", self.eDirectory.text())) 
     58            self.e_directory.setText("") 
     59     
     60    def select_custom_location(self): 
     61        import os 
     62        dir = str(QFileDialog.getExistingDirectory(self, "Select the folder that contains the add-on:", self.e_directory.text())) 
    6363        if dir != "": 
    6464            if os.path.split(dir)[1] == "widgets":     # register a dir above the dir that contains the widget folder 
    6565                dir = os.path.split(dir)[0] 
    66             self.eDirectory.setText(dir) 
    67             self.aoList.setCurrentItem(None) 
     66            self.e_directory.setText(dir) 
     67            self.aolist.setCurrentItem(None) 
    6868                 
    69     def directoryChangeCallback(self): 
    70         self.addOnSelectionPage.emit(SIGNAL("completeChanged()")) 
    71          
    72     def newTextEdit(self, label, parent): 
     69    def directory_change_callback(self): 
     70        self.addon_selection_page.emit(SIGNAL("completeChanged()")) 
     71         
     72    def new_textedit(self, label, parent): 
    7373        vpanel = OWGUI.widgetBox(parent, orientation="vertical") 
    7474        l = QLabel(label) 
     
    7979        return e 
    8080 
    81     def initMetaDataPage(self): 
     81    def init_metadata_page(self): 
    8282        self.metaDataPage = page = QWizardPage() 
    8383        page.setTitle("Add-on Information") 
    8484        page.setLayout(QVBoxLayout()) 
    8585        self.addPage( page ) 
    86         page.initializePage = self.loadMetaData 
     86        page.initializePage = self.load_metadata 
    8787 
    8888        p = OWGUI.widgetBox(page, "Enter the following information about your add-on", orientation="vertical") 
    8989        import os 
    90         self.eId = eId = OWGUI.lineEdit(p, self, None, "Globally unique ID:") 
     90        self.e_id = eId = OWGUI.lineEdit(p, self, None, "Globally unique ID:") 
    9191        eId.setReadOnly(True) 
    9292        eId.setFocusPolicy(Qt.NoFocus) 
     
    9494        h = OWGUI.widgetBox(p, orientation="horizontal") 
    9595        self.name = "" 
    96         self.preferredDirTouched = True 
    97         self.eName = eName = OWGUI.lineEdit(h, self, "name", "Name:", callback=self.nameChangeCallback, callbackOnType=True) 
    98         self.eVersion = eVersion = OWGUI.lineEdit(h, self, None, "Version:") 
     96        self.preferred_dir_touched = True 
     97        self.e_name = e_name = OWGUI.lineEdit(h, self, "name", "Name:", callback=self.name_change_callback, callbackOnType=True) 
     98        self.e_version = eVersion = OWGUI.lineEdit(h, self, None, "Version:") 
    9999        def nonEmpty(editor): 
    100100            return bool(str(editor.text() if hasattr(editor, "text") else editor.toPlainText()).strip())  
    101         eName.isComplete = lambda: nonEmpty(eName)  
     101        e_name.isComplete = lambda: nonEmpty(e_name)  
    102102        def versionIsComplete(): 
    103103            try: 
    104                 map(int, str(eVersion.text()).strip().split(".")) 
    105                 return bool(str(eVersion.text()).strip()) 
     104                map(int, str(e_version.text()).strip().split(".")) 
     105                return bool(str(e_version.text()).strip()) 
    106106            except: 
    107107                return False 
    108108        eVersion.isComplete = versionIsComplete  
    109109 
    110         self.eDescription = eDescription = self.newTextEdit("Description:", p) 
     110        self.e_description = eDescription = self.new_textedit("Description:", p) 
    111111        eDescription.isComplete = lambda: nonEmpty(eDescription) 
    112112         
    113113        def evalPage(): 
    114114            page.emit(SIGNAL("completeChanged()")) 
    115         for nonOptional in [eName, eVersion, eDescription]: 
     115        for nonOptional in [e_name, eVersion, eDescription]: 
    116116            QObject.connect(nonOptional, SIGNAL("textChanged(const QString &)"), evalPage) 
    117117            QObject.connect(nonOptional, SIGNAL("textChanged()"), evalPage) 
    118         page.isComplete = lambda page: eName.isComplete() and eVersion.isComplete() and eDescription.isComplete()         
    119  
    120     def initOptionalMetaDataPage(self): 
     118        page.isComplete = lambda page: e_name.isComplete() and eVersion.isComplete() and eDescription.isComplete()         
     119 
     120    def init_optional_metadata_page(self): 
    121121        self.optionalMetaDataPage = page = QWizardPage() 
    122122        page.setTitle("Optional Add-on Information") 
     
    126126        p = OWGUI.widgetBox(page, "Optionally, enter the following information about your add-on", orientation="vertical") 
    127127        self.preferredDir = "" 
    128         self.ePreferredDir = ePreferredDir = OWGUI.lineEdit(p, self, "preferredDir", "Preferred directory name (within add-ons directory; optional):", callback=self.preferredDirChangeCallback, callbackOnType=True) 
    129         self.eHomePage = eHomePage = OWGUI.lineEdit(p, self, None, "Add-on webpage (optional):") 
    130         self.preferredDirTouched = False 
     128        self.e_preferreddir = ePreferredDir = OWGUI.lineEdit(p, self, "preferredDir", "Preferred directory name (within add-ons directory; optional):", callback=self.preferred_dir_change_callback, callbackOnType=True) 
     129        self.e_homepage = eHomePage = OWGUI.lineEdit(p, self, None, "Add-on webpage (optional):") 
     130        self.preferred_dir_touched = False 
    131131         
    132132        h = OWGUI.widgetBox(p, orientation="horizontal") 
    133         self.eTags = self.newTextEdit("Tags (one per line, optional):", h) 
    134         self.eAOrganizations = self.newTextEdit("Contributing organizations (one per line, optional):", h) 
     133        self.e_tags = self.new_textedit("Tags (one per line, optional):", h) 
     134        self.e_aorganizations = self.new_textedit("Contributing organizations (one per line, optional):", h) 
    135135        h = OWGUI.widgetBox(p, orientation="horizontal") 
    136         self.eAAuthors = self.newTextEdit("Authors (one per line, optional):", h) 
    137         self.eAContributors = self.newTextEdit("Contributors (one per line, optional):", h) 
    138         for noWrapEdit in [self.eTags, self.eAAuthors, self.eAContributors, self.eAOrganizations]: 
     136        self.e_aauthors = self.new_textedit("Authors (one per line, optional):", h) 
     137        self.e_acontributors = self.new_textedit("Contributors (one per line, optional):", h) 
     138        for noWrapEdit in [self.e_tags, self.e_aauthors, self.e_acontributors, self.e_aorganizations]: 
    139139            noWrapEdit.setLineWrapMode(QTextEdit.NoWrap) 
    140140         
     
    143143            control.setPlainText("\n".join(entries)) 
    144144            QTextEdit.focusOutEvent(control, ev) 
    145         for listEdit in [self.eTags, self.eAAuthors, self.eAContributors, self.eAOrganizations]: 
     145        for listEdit in [self.e_tags, self.e_aauthors, self.e_acontributors, self.e_aorganizations]: 
    146146            listEdit.parseEntries = lambda control=listEdit: [entry for entry in map(lambda x: x.strip(), unicode(control.toPlainText()).split("\n")) if entry] 
    147147            listEdit.focusOutEvent = formatList 
    148148     
    149149     
    150     def nameChangeCallback(self): 
    151         if not self.preferredDirTouched: 
    152             name = unicode(self.eName.text()).strip() 
     150    def name_change_callback(self): 
     151        if not self.preferred_dir_touched: 
     152            name = unicode(self.e_name.text()).strip() 
    153153            pd = name.replace(" ", "_").replace("/", "-").replace("\\", "_") 
    154             if str(self.ePreferredDir.text()) or (name != pd): 
    155                 self.ePreferredDir.setText(pd) 
    156                 self.preferredDirTouched = False 
    157      
    158     def preferredDirChangeCallback(self): 
    159         self.preferredDirTouched = bool(str(self.ePreferredDir.text())) 
    160      
    161     def loadMetaData(self): 
     154            if str(self.e_preferreddir.text()) or (name != pd): 
     155                self.e_preferreddir.setText(pd) 
     156                self.preferred_dir_touched = False 
     157     
     158    def preferred_dir_change_callback(self): 
     159        self.preferred_dir_touched = bool(str(self.e_preferreddir.text())) 
     160     
     161    def load_metadata(self): 
    162162        import os 
    163163        xml = os.path.join(self.directory, "addon.xml") 
    164164        if os.path.isfile(xml): 
    165             self.ao = orngAddOns.OrangeAddOn(xmlFile=open(xml, 'r')) 
     165            self.ao = Orange.misc.addons.OrangeAddOn(xmlfile=open(xml, 'r')) 
    166166        else: 
    167             self.ao = orngAddOns.OrangeAddOn() 
    168         deNone = lambda x: x if x else ""  
    169         self.eId.setText(self.ao.id if self.ao.id else str(uuid.uuid1())) 
    170         self.eName.setText(self.ao.name or os.path.split(self.directory)[1]) 
    171         self.eVersion.setText(orngAddOns.suggestVersion(self.ao.versionStr)) 
    172         self.eDescription.setPlainText(deNone(self.ao.description)) 
    173         self.ePreferredDir.setText(deNone(self.ao.preferredDirectory)) 
    174         self.preferredDirTouched = bool(deNone(self.ao.preferredDirectory)) 
    175         self.eHomePage.setText(deNone(self.ao.homePage)) 
    176         self.eTags.setPlainText("\n".join(self.ao.tags)) 
    177         self.eAOrganizations.setPlainText("\n".join(self.ao.authorOrganizations)) 
    178         self.eAAuthors.setPlainText("\n".join(self.ao.authorCreators)) 
    179         self.eAContributors.setPlainText("\n".join(self.ao.authorContributors)) 
     167            self.ao = Orange.misc.addons.OrangeAddOn() 
     168        denone = lambda x: x if x else ""  
     169        self.e_id.setText(self.ao.id if self.ao.id else str(uuid.uuid1())) 
     170        self.e_name.setText(self.ao.name or os.path.split(self.directory)[1]) 
     171        self.e_version.setText(Orange.misc.addons.suggest_version(self.ao.version_str)) 
     172        self.e_description.setPlainText(denone(self.ao.description)) 
     173        self.e_preferreddir.setText(denone(self.ao.preferred_directory)) 
     174        self.preferred_dir_touched = bool(denone(self.ao.preferred_directory)) 
     175        self.e_homepage.setText(denone(self.ao.homepage)) 
     176        self.e_tags.setPlainText("\n".join(self.ao.tags)) 
     177        self.e_aorganizations.setPlainText("\n".join(self.ao.author_organizations)) 
     178        self.e_aauthors.setPlainText("\n".join(self.ao.author_creators)) 
     179        self.e_acontributors.setPlainText("\n".join(self.ao.author_contributors)) 
    180180         
    181181    def initDestinationPage(self): 
     
    185185        self.addPage( page ) 
    186186 
    187         self.prepareOnly = False 
    188         chkPrepareOnly = OWGUI.checkBox(page, self, "prepareOnly", "Do not pack, only prepare addon.xml and arrange documentation", callback = self.callbackPrepareOnlyChange) 
     187        self.prepare_only = False 
     188        chk_prepare_only = OWGUI.checkBox(page, self, "prepare_only", "Do not pack, only prepare addon.xml and arrange documentation", callback = self.callbackPrepareOnlyChange) 
    189189             
    190190        p = OWGUI.widgetBox(page, "Filesystem", orientation="horizontal") 
    191         self.oaoFileName = "" 
    192         self.eOaoFileName = OWGUI.lineEdit(p, self, "oaoFileName") 
     191        self.oaofilename = "" 
     192        self.e_oaofilename = OWGUI.lineEdit(p, self, "oaofilename") 
    193193        button = OWGUI.button(p, self, '...', callback = self.browseDestinationFile, disabled=0) 
    194194        button.setIcon(self.style().standardIcon(QStyle.SP_DirOpenIcon)) 
     
    196196 
    197197        def initOao(page): 
    198             if not self.oaoFileName: 
    199                 self.eOaoFileName.setText(self.directory+".oao") 
     198            if not self.oaofilename: 
     199                self.e_oaofilename.setText(self.directory+".oao") 
    200200        page.initializePage = initOao 
    201201         
     
    204204     
    205205    def callbackPrepareOnlyChange(self): 
    206         self.eOaoFileName.setEnabled(not self.prepareOnly) 
     206        self.e_oaofilename.setEnabled(not self.prepare_only) 
    207207     
    208208    def browseDestinationFile(self): 
    209         filename = str(QFileDialog.getSaveFileName(self, 'Save Packed Orange Add-on', self.oaoFileName, "*.oao")) 
     209        filename = str(QFileDialog.getSaveFileName(self, 'Save Packed Orange Add-on', self.oaofilename, "*.oao")) 
    210210 
    211211        if filename: 
    212             self.eOaoFileName.setText(filename) 
     212            self.e_oaofilename.setText(filename) 
    213213         
    214214    def accept(self): 
    215         rao = orngAddOns.OrangeRegisteredAddOn(self.ao.name, self.directory) 
    216         rao.prepare(self.ao.id, self.ao.name, str(self.eVersion.text()), unicode(self.eDescription.toPlainText()), self.eTags.parseEntries(), 
    217                     self.eAOrganizations.parseEntries(), self.eAAuthors.parseEntries(), self.eAContributors.parseEntries(), self.preferredDir, 
    218                     str(self.eHomePage.text())) 
    219          
    220         if not self.prepareOnly: 
     215        rao = Orange.misc.addons.OrangeRegisteredAddOn(self.ao.name, self.directory) 
     216        rao.prepare(self.ao.id, self.ao.name, str(self.e_version.text()), unicode(self.e_description.toPlainText()), self.e_tags.parseEntries(), 
     217                    self.e_aorganizations.parseEntries(), self.e_aauthors.parseEntries(), self.e_acontributors.parseEntries(), self.preferredDir, 
     218                    str(self.e_homepage.text())) 
     219         
     220        if not self.prepare_only: 
    221221            import zipfile 
    222             oao = zipfile.ZipFile(self.oaoFileName, 'w') 
     222            oao = zipfile.ZipFile(self.oaofilename, 'w') 
    223223            dirs = os.walk(self.directory) 
    224224            for (dir, subdirs, files) in dirs: 
  • orange/addOnServer.py

    r6548 r7831  
    153153                pack = ZipFile(addOn, 'r') 
    154154                try: 
    155                     manifest = fileutil._zipOpen(pack, 'addon.xml') 
     155                    manifest = fileutil._zip_open(pack, 'addon.xml') 
    156156                    addOnXmlDoc = xml.dom.minidom.parse(manifest) 
    157                     addOnXml = addOnXmlDoc.documentElement                     
     157                    addOnXml = addOnXmlDoc.documentElement 
    158158                    addOnXml.setAttribute("filename", os.path.split(addOn)[1]) 
    159159                    addOnXml.appendChild(widgetParser.widgetsXml(pack))   # Temporary: this should be done at upload. 
  • orange/fileutil.py

    r6549 r7831  
    11import xml.dom.minidom, re 
    22 
    3 def _zipOpen(zipFile, file, mode='r'): 
    4     if hasattr(zipFile, "open"): 
    5         return zipFile.open(file, mode) 
     3def _zip_open(zipfile, file, mode='r'): 
     4    if hasattr(zipfile, "open"): 
     5        return zipfile.open(file, mode) 
    66    else: 
    77        from cStringIO import StringIO 
    8         return StringIO(zipFile.read(file)) 
     8        return StringIO(zipfile.read(file)) 
    99 
    10 def createTextElement(tagName, value): 
    11     result = xml.dom.minidom.Element(tagName) 
     10def create_text_element(tag_name, value): 
     11    result = xml.dom.minidom.Element(tag_name) 
    1212    textNode = xml.dom.minidom.Text() 
    1313    textNode.data = value 
     
    1515    return result 
    1616 
    17 def xmlSet(parent, nodeName, value): 
    18     child = getElementNonRecursive(parent, nodeName) 
     17def xml_set(parent, node_name, value): 
     18    child = getElementNonRecursive(parent, node_name) 
    1919    if not child: 
    2020        if value: 
    21             parent.appendChild(createTextElement(nodeName, value)) 
     21            parent.appendChild(create_text_element(node_name, value)) 
    2222    else: 
    2323        if not value: 
     
    2929            textNode.data = value 
    3030            child.appendChild(textNode) 
    31          
    32      
    33          
    3431 
    35 def xmlTextOf(node, parent=None, multiLine=False): 
     32def xml_text_of(node, parent=None, multiline=False): 
    3633    if node.__class__ is str: 
    3734        node = getElementNonRecursive(parent, node) 
     
    4542            break 
    4643        t += n.data 
    47     if multiLine: 
     44    if multiline: 
    4845        t = "\n\n".join( map(lambda x: x.strip(), re.split("\n[ \t]*\n", t.strip())) ) 
    4946    else: 
     
    5148    return t 
    5249 
    53 def getElementNonRecursive(parent, elementName, create=False): 
     50def get_element_nonrecursive(parent, elementname, create=False): 
    5451    for node in [n for n in parent.childNodes if n.nodeType==n.ELEMENT_NODE]: 
    5552        if node.tagName == elementName: 
  • orange/widgetParser.py

    r6549 r7831  
    11import xml.dom.minidom 
    22import re, os 
    3 from fileutil import xmlTextOf, createTextElement, _zipOpen 
     3from fileutil import xml_text_of 
     4from fileutil import create_text_element 
     5from fileutil import _zip_open 
    46 
    57re_inputs = re.compile(r'[ \t]+self.inputs\s*=\s*(?P<signals>\[[^]]*\])', re.DOTALL) 
     
    3133                nodes = data.getElementsByTagName(attr) 
    3234                if nodes: 
    33                     setattr(self, attr, xmlTextOf(nodes[0])) 
     35                    setattr(self, attr, xml_text_of(nodes[0])) 
    3436            if data.hasAttribute("filename"): 
    3537                self.filename = data.getAttribute("filename") 
     
    5456        for attr in self.xmlAttrs: 
    5557            if hasattr(self, attr): 
    56                 widgetTag.appendChild(createTextElement(attr, getattr(self, attr))) 
     58                widgetTag.appendChild(create_text_element(attr, getattr(self, attr))) 
    5759        if "filename" in self.__dict__ and self.filename: 
    5860            widgetTag.setAttribute("filename", self.filename) 
     
    6769            try: 
    6870                filename = file[8:] 
    69                 meta = WidgetMetaData(_zipOpen(oaoZip, file).read(), "None", filename=filename, hasDoc="1" if ("doc/widgets/%s.htm" % (os.path.splitext(filename)[0][2:]) in files) else "0") 
     71                meta = WidgetMetaData(_zip_open(oaoZip, file).read(), "None", filename=filename, hasDoc="1" if ("doc/widgets/%s.htm" % (os.path.splitext(filename)[0][2:]) in files) else "0") 
    7072            except: 
    7173                continue   # Probably not an Orange widget module 
Note: See TracChangeset for help on using the changeset viewer.