]> git.saurik.com Git - wxWidgets.git/blob - wxPython/wxaddons/__init__.py
Actually use new GTK+ native assert dialog.
[wxWidgets.git] / wxPython / wxaddons / __init__.py
1 #----------------------------------------------------------------------
2 # Name: __init__.py
3 # Purpose: Import logic and common functions for wxaddons module
4 #
5 # Author: Kevin Ollivier
6 #
7 # Created: 15-Nov-2006
8 # RCS-ID: $Id$
9 # Copyright: (c) 2006 Kevin Ollivier
10 # Licence: wxWindows license
11 #----------------------------------------------------------------------
12
13 import sys, os, string
14 import xmlrpclib
15 import __builtin__
16 import wx
17
18 domain = 'http://wxpyaddons.wxcommunity.com'
19 builtin_import = __builtin__.__import__
20
21 debug = False
22 use_gui = True
23 checkImports = True
24 config = wx.Config("wxaddons")
25 if config.Read("PerformChecks", "true") != "true":
26 checkImports = False
27
28 if use_gui and not wx.App.IsDisplayAvailable():
29 use_gui = False
30
31 s = xmlrpclib.Server('%s/xmlrpc-server.php' % domain, verbose=(debug == True))
32
33 def check_imports(check):
34 if check:
35 config.Write("PerformChecks", "true")
36 else:
37 config.Write("PerformChecks", "false")
38
39 def version_greater_than_or_equal(version1, version2):
40 """
41 Checks if version1 >= version2, returning true if so,
42 false if otherwise.
43 """
44 greater_than = True
45
46 for index in range(0, len(version1)-1):
47 if version1[index] > version2[index]:
48 greater_than = True
49 break
50 elif version[index] < current_version[index]:
51 greater_than = False
52 break
53
54 return greater_than
55
56 def prompt_install(name, version):
57 should_install = False
58 message = "The wxaddon %s is not installed, but was found on the wxaddons site. Would you like to download and install it?" % (name + " " + version)
59 if use_gui:
60 app = wx.PySimpleApp()
61 app.MainLoop()
62 result = wx.MessageBox(message, "Install Dependency?", style=wx.YES_NO)
63 if result == wx.YES:
64 should_install = True
65 else:
66 result = raw_input(message + " [y/n]")
67 if result[0].lower() == "y":
68 should_install = True
69
70 return should_install
71
72 def require_addon_version(name, version=[], canBeNewer=True):
73 # Check the install receipt to see if we've got an appropriate version
74 config = wx.Config("wxaddons-receipts")
75 needs_update = True
76 if config.HasGroup(name):
77 config.SetPath(name)
78 current_version = config.Read("version", "0.0").split(".")
79
80 needs_update = version_greater_than_or_equal(version, current_version)
81
82 if needs_update:
83 comp_xml = s.getComponent(name)
84 if not comp_xml:
85 raise
86
87 comp = xmlrpclib.loads(comp_xml)[0][0]
88 comp_version = comp["version"].split(".")
89
90 update_comp = False
91 if canBeNewer:
92 update_comp = version_greater_than_or_equal(comp_version, version)
93 else:
94 update_comp = (version == comp_version)
95
96 if update_comp:
97 url = get_url(name, version)
98 should_install = prompt_install(name, comp_version)
99
100 if should_install:
101 dl_and_install_addon(name, comp_version)
102
103 def get_url(name, version):
104 url = ""
105 release_xml = s.getReleases(name)
106 if not release_xml:
107 return ""
108
109 releases = xmlrpclib.loads(release_xml)[0][0]
110 for release in releases:
111 if release['version'] == version:
112 url = release['url']
113
114 return url
115
116 def dl_and_install_addon(name, version, url):
117 installed = True
118 tempdir = None
119 cwd = os.getcwd()
120
121 # get the package URL
122 url = "http://wxpyaddons.wxcommunity.com/releases/sized_controls-0.5.tar.gz"
123
124 if use_gui:
125 progress = wx.ProgressDialog("Installing Dependency",
126 "Preparing to install the %s addon module." % name,
127 4,
128 style=wx.PD_APP_MODAL|wx.PD_SMOOTH)
129
130 message = "Downloading tarball..."
131 print message
132 if use_gui: progress.Update(1, message)
133 import urllib
134 temp_archive, headers = urllib.urlretrieve(url)
135
136 message = "Extracting files..."
137 print message
138 if use_gui: progress.Update(2, message)
139 import tempfile
140 tempdir = tempfile.mkdtemp()
141
142 os.chdir(tempdir)
143 import tarfile
144 tar = tarfile.open(temp_archive, "r:gz")
145 for tarinfo in tar:
146 tar.extract(tarinfo)
147 tar.close()
148
149 os.chdir(name)
150
151 message = "Installing %s" % name
152 if use_gui: progress.Update(3, message)
153 # TODO: Add support for modified PYTHONPATH?
154 # Also, do we need admin install support here?
155 retval = os.system(sys.executable + " " + string.join(("setup.py", "install"), " "))
156 if use_gui: progress.Update(4)
157
158 if retval == 0:
159 message = "The %s addon was successfully installed." % name
160 print message
161 if use_gui:
162 wx.MessageBox(message, "Installation Successful")
163 else:
164 installed = False
165
166 # cleanup
167 if use_gui: progress.Destroy()
168 os.chdir(cwd)
169 import shutil
170 shutil.rmtree(tempdir)
171 os.remove(temp_archive)
172
173 return installed
174
175 def import_hook(name, globals=None, locals=None, fromlist=None):
176 # Fast path: see if the module has already been imported.
177 try:
178 return builtin_import(name, globals, locals, fromlist)
179 except:
180 if name.startswith("wxaddons"):
181 print "Querying %s for module." % domain
182 try:
183 modname = name.split(".")[1]
184 comp = None
185 comp_xml = s.getComponent(modname)
186 if not comp_xml:
187 raise
188
189 comp = xmlrpclib.loads(comp_xml)[0][0]
190 url = get_url(comp["name"], comp["version"])
191 should_install = prompt_install(comp["name"], comp["version"])
192
193 if should_install:
194 try:
195 success = dl_and_install_addon(comp["name"], comp["version"], url)
196 if not success:
197 raise
198 except:
199 raise
200
201
202 except:
203 raise
204 else:
205 raise
206
207 def runTests():
208 import wxaddons.sized_controls
209 import wxaddons.foo_bar
210 import googly
211
212 if checkImports:
213 __builtin__.__import__ = import_hook
214