* Added selectNewest(minVersion)
* Use the options in the sort ordering in addition to the version, this will put the gtk2 and unicode versions ahead of the others of the same version. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30102 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -34,13 +34,13 @@ selection itself rather than depend on the user to setup the
|
|||||||
environment correctly.
|
environment correctly.
|
||||||
|
|
||||||
It works by searching the sys.path for directories matching wx-* and
|
It works by searching the sys.path for directories matching wx-* and
|
||||||
then comparing them to what was passed to the require function. If a
|
then comparing them to what was passed to the select function. If a
|
||||||
match is found then that path is inserted into sys.path.
|
match is found then that path is inserted into sys.path.
|
||||||
|
|
||||||
NOTE: If you are making a 'bundle' of your application with a tool
|
NOTE: If you are making a 'bundle' of your application with a tool
|
||||||
like py2exe then you should *not* use the wxversion module since it
|
like py2exe then you should *not* use the wxversion module since it
|
||||||
looks at filesystem for the directories on sys.path, it will fail in a
|
looks at the filesystem for the directories on sys.path, it will fail
|
||||||
bundled environment. Instead you should simply ensure that the
|
in a bundled environment. Instead you should simply ensure that the
|
||||||
version of wxPython that you want is found by default on the sys.path
|
version of wxPython that you want is found by default on the sys.path
|
||||||
when making the bundled version by setting PYTHONPATH. Then that
|
when making the bundled version by setting PYTHONPATH. Then that
|
||||||
version will be included in your bundle and your app will work as
|
version will be included in your bundle and your app will work as
|
||||||
@@ -109,12 +109,12 @@ def select(versions):
|
|||||||
# If we get here then this is the first time wxversion is used,
|
# If we get here then this is the first time wxversion is used,
|
||||||
# ensure that wxPython hasn't been imported yet.
|
# ensure that wxPython hasn't been imported yet.
|
||||||
if sys.modules.has_key('wx') or sys.modules.has_key('wxPython'):
|
if sys.modules.has_key('wx') or sys.modules.has_key('wxPython'):
|
||||||
raise VersionError("wxversion.require() must be called before wxPython is imported")
|
raise VersionError("wxversion.select() must be called before wxPython is imported")
|
||||||
|
|
||||||
# Look for a matching version and manipulate the sys.path as
|
# Look for a matching version and manipulate the sys.path as
|
||||||
# needed to allow it to be imported.
|
# needed to allow it to be imported.
|
||||||
packages = _find_installed(True)
|
installed = _find_installed(True)
|
||||||
bestMatch = _get_best_match(packages, versions)
|
bestMatch = _get_best_match(installed, versions)
|
||||||
|
|
||||||
if bestMatch is None:
|
if bestMatch is None:
|
||||||
raise VersionError("Requested version of wxPython not found")
|
raise VersionError("Requested version of wxPython not found")
|
||||||
@@ -124,6 +124,51 @@ def select(versions):
|
|||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
|
|
||||||
|
def selectNewest(minVersion):
|
||||||
|
"""
|
||||||
|
Selects a version of wxPython that has a version number greater
|
||||||
|
than or equal to the version given. If a matching version is not
|
||||||
|
found then instead of raising an exception like select() does this
|
||||||
|
function will inform the user of that fact with a message dialog,
|
||||||
|
open the system's default web browser to the wxPython download
|
||||||
|
page, and then will exit the application.
|
||||||
|
"""
|
||||||
|
assert type(minVersion) == str
|
||||||
|
|
||||||
|
# ensure that wxPython hasn't been imported yet.
|
||||||
|
if sys.modules.has_key('wx') or sys.modules.has_key('wxPython'):
|
||||||
|
raise VersionError("wxversion.select() must be called before wxPython is imported")
|
||||||
|
|
||||||
|
bestMatch = None
|
||||||
|
installed = _find_installed(True)
|
||||||
|
minv = _wxPackageInfo(minVersion)
|
||||||
|
|
||||||
|
if installed:
|
||||||
|
# The list is in reverse sorted order, so if the first one is
|
||||||
|
# big enough then choose it
|
||||||
|
if installed[0] >= minv:
|
||||||
|
bestMatch = installed[0]
|
||||||
|
|
||||||
|
if bestMatch is None:
|
||||||
|
import wx, webbrowser
|
||||||
|
versions = "\n".join([" "+ver for ver in getInstalled()])
|
||||||
|
app = wx.PySimpleApp()
|
||||||
|
wx.MessageBox("This application requires a version of wxPython "
|
||||||
|
"greater than or equal to %s but a matching version "
|
||||||
|
"was not found.\n\n"
|
||||||
|
"You currently have these version(s) installed:\n%s"
|
||||||
|
% (minVersion, versions),
|
||||||
|
"wxPython Upgrade Needed", style=wx.OK)
|
||||||
|
app.MainLoop()
|
||||||
|
webbrowser.open("http://sourceforge.net/project/showfiles.php?group_id=10718")
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
sys.path.insert(0, bestMatch.pathname)
|
||||||
|
_selected = bestMatch
|
||||||
|
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
|
||||||
def checkInstalled(versions):
|
def checkInstalled(versions):
|
||||||
"""
|
"""
|
||||||
Check if there is a version of wxPython installed that matches one
|
Check if there is a version of wxPython installed that matches one
|
||||||
@@ -137,8 +182,8 @@ def checkInstalled(versions):
|
|||||||
|
|
||||||
if type(versions) == str:
|
if type(versions) == str:
|
||||||
versions = [versions]
|
versions = [versions]
|
||||||
packages = _find_installed()
|
installed = _find_installed()
|
||||||
bestMatch = _get_best_match(packages, versions)
|
bestMatch = _get_best_match(installed, versions)
|
||||||
return bestMatch is not None
|
return bestMatch is not None
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
@@ -148,18 +193,18 @@ def getInstalled():
|
|||||||
Returns a list of strings representing the installed wxPython
|
Returns a list of strings representing the installed wxPython
|
||||||
versions that are found on the system.
|
versions that are found on the system.
|
||||||
"""
|
"""
|
||||||
packages = _find_installed()
|
installed = _find_installed()
|
||||||
return [os.path.basename(p.pathname)[3:] for p in packages]
|
return [os.path.basename(p.pathname)[3:] for p in installed]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
# private helpers...
|
# private helpers...
|
||||||
|
|
||||||
def _get_best_match(packages, versions):
|
def _get_best_match(installed, versions):
|
||||||
bestMatch = None
|
bestMatch = None
|
||||||
bestScore = 0
|
bestScore = 0
|
||||||
for pkg in packages:
|
for pkg in installed:
|
||||||
for ver in versions:
|
for ver in versions:
|
||||||
score = pkg.Score(_wxPackageInfo(ver))
|
score = pkg.Score(_wxPackageInfo(ver))
|
||||||
if score > bestScore:
|
if score > bestScore:
|
||||||
@@ -236,13 +281,23 @@ class _wxPackageInfo(object):
|
|||||||
return score
|
return score
|
||||||
|
|
||||||
|
|
||||||
# TODO: factor self.options into the sort order?
|
|
||||||
def __lt__(self, other):
|
def __lt__(self, other):
|
||||||
return self.version < other.version
|
return self.version < other.version or \
|
||||||
|
(self.version == other.version and self.options < other.options)
|
||||||
|
def __le__(self, other):
|
||||||
|
return self.version <= other.version or \
|
||||||
|
(self.version == other.version and self.options <= other.options)
|
||||||
|
|
||||||
def __gt__(self, other):
|
def __gt__(self, other):
|
||||||
return self.version > other.version
|
return self.version > other.version or \
|
||||||
|
(self.version == other.version and self.options > other.options)
|
||||||
|
def __ge__(self, other):
|
||||||
|
return self.version >= other.version or \
|
||||||
|
(self.version == other.version and self.options >= other.options)
|
||||||
|
|
||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
return self.version == other.version
|
return self.version == other.version and self.options == other.options
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -250,6 +305,12 @@ class _wxPackageInfo(object):
|
|||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
import pprint
|
import pprint
|
||||||
|
|
||||||
|
#selectNewest('2.5')
|
||||||
|
#print sys.path[0]
|
||||||
|
#sys.exit()
|
||||||
|
|
||||||
|
|
||||||
def test(version):
|
def test(version):
|
||||||
# setup
|
# setup
|
||||||
savepath = sys.path[:]
|
savepath = sys.path[:]
|
||||||
|
Reference in New Issue
Block a user