...
[iramuteq] / checkinstall.py
1 #!/bin/env python
2 # -*- coding: utf-8 -*-
3 #Author: Pierre Ratinaud
4 #Copyright (c) 2008 Pierre Ratinaud
5 #License: GNU/GPL
6
7 import os
8 import sys
9 import shutil
10 from chemins import ConstructConfigPath, ConstructDicoPath
11 from functions import exec_rcode, exec_RCMD
12 import wx
13 import tempfile
14 from ConfigParser import *
15 from time import sleep
16 import logging
17
18 log = logging.getLogger('iramuteq.checkinstall')
19
20 def IsNew(self):
21     version_glob = self.ConfigGlob.get('DEFAULT', 'version_nb').split('.')
22     try :
23         version_user = self.pref.get('iramuteq','version_nb').split('.')
24     except NoOptionError :
25         return True
26     userab = False
27     globab = False
28     if version_user :
29         print len(version_user), len(version_glob)
30         version_user[0] = int(version_user[0])
31         version_user[1] = int(version_user[1])
32         version_glob[0] = int(version_glob[0])
33         version_glob[1] = int(version_glob[1])
34         if len(version_user) == 3 :
35             if 'a' in version_user[2] :
36                 userab = 'a'
37                 version_user[2] = int(version_user[2].replace('a', ''))
38             elif 'b' in version_user[2] :
39                 userab = 'b'
40                 version_user[2] = int(version_user[2].replace('b', ''))
41             else :
42                 version_user[2] = int(version_user[2])
43         if len(version_glob) == 3 :
44             if 'a' in version_glob[2] :
45                 globab = 'a'
46                 version_glob[2] = int(version_glob[2].replace('a', ''))
47             elif 'b' in version_glob[2] :
48                 globab = 'b'
49                 version_glob[2] = int(version_glob[2].replace('b', ''))
50             else :
51                 version_glob[2] = int(version_glob[2])
52         if len(version_user) == len(version_glob) :
53             if version_glob > version_user :
54                 return True
55             elif version_glob == version_user :
56                 if globab == userab :
57                     return False
58                 elif globab > userab :
59                     return True
60                 else :
61                     return False
62             else :
63                 return False
64         else :
65             if version_glob > version_user :
66                 return True
67             else :
68                 return False
69
70 def UpgradeConf(self) :
71     log.info('upgrade conf')
72     dictuser = self.ConfigPath
73     dictappli = ConstructConfigPath(self.AppliPath, user = False)
74     for item,filein in dictuser.iteritems():
75         if not item == u'global' and not item == u'history':
76             shutil.copyfile(dictappli[item], filein)
77     dicoUser = self.DictPath
78     dicoAppli = ConstructDicoPath(self.AppliPath)
79     for fi in dicoUser :
80         if not os.path.exists(dicoUser[fi]) and os.path.exists(dicoAppli[fi]):
81             shutil.copyfile(dicoAppli[fi], dicoUser[fi])
82
83 def CreateIraDirectory(UserConfigPath,AppliPath):
84     if not os.path.exists(UserConfigPath):
85         os.mkdir(UserConfigPath)
86     if not os.path.exists(os.path.join(UserConfigPath, 'dictionnaires')) :
87         os.mkdir(os.path.join(UserConfigPath, 'dictionnaires'))
88
89 def CopyConf(self) :
90     DictUser = self.ConfigPath
91     DictAppli = ConstructConfigPath(self.AppliPath,user=False)
92     for item, filein in DictUser.iteritems():
93         if not item == u'global' and not item == u'path' and not item == u'preferences' and not item == u'history' :
94             shutil.copyfile(DictAppli[item],filein)
95         if item == u'path':
96             if not os.path.exists(filein):
97                 shutil.copyfile(DictAppli[item],filein)
98         if item == u'preferences' :
99             if not os.path.exists(filein) :
100                 shutil.copyfile(DictAppli[item],filein)
101     dicoUser = self.DictPath
102     dicoAppli = ConstructDicoPath(self.AppliPath)
103     for fi in dicoUser :
104         if not os.path.exists(dicoUser[fi]) and os.path.exists(dicoAppli[fi]):
105             shutil.copyfile(dicoAppli[fi], dicoUser[fi])
106
107 def CheckRPath(PathPath):
108     if not os.path.exists(PathPath.get('PATHS','rpath')):
109         return False
110     else :
111         return True
112         
113 def FindRPAthWin32():
114     BestPath=False
115     progpaths=[]
116     if 'ProgramFiles' in os.environ :
117         progpaths.append(os.environ['ProgramFiles'])
118     if 'ProgramFiles(x86)' in os.environ :
119         progpaths.append(os.environ['ProgramFiles(x86)'])
120     if 'ProgramW6432' in os.environ :
121         progpaths.append(os.environ['ProgramW6432'])
122     progpaths = list(set(progpaths))
123     if progpaths != [] :
124         for progpath in progpaths :
125             rpath = os.path.join(progpath, "R")
126             if os.path.exists(rpath) :
127                 for maj in range(2,4) :
128                     for i in range(0,30):
129                         for j in range(0,20):
130                             for poss in ['', 'i386', 'x64'] :
131                                 path=os.path.join(rpath,"R-%i.%i.%i" % (maj, i, j),'bin',poss,'R.exe')
132                                 if os.path.exists(path):
133                                     BestPath=path
134     return BestPath
135
136 def FindRPathNix():
137     BestPath=False
138     if os.path.exists('/usr/bin/R'):
139         BestPath='/usr/bin/R'
140     elif os.path.exists('/usr/local/bin/R'):
141         BestPath='/usr/local/bin/R'
142     return BestPath
143
144 def RLibsAreInstalled(self) :
145     rlibs = self.pref.get('iramuteq', 'rlibs')
146     if rlibs == 'false' or rlibs == 'False' :
147         return False
148     else :
149         return True
150
151 def CheckRPackages(self):
152     listdep = ['ca', 'rgl', 'gee', 'ape', 'igraph','proxy', 'wordcloud', 'irlba', 'textometry']
153     nolib = []
154     i=0
155     dlg = wx.ProgressDialog("Test des librairies de R", "test en cours...", maximum = len(listdep), parent=self, style=wx.PD_APP_MODAL | wx.PD_AUTO_HIDE | wx.PD_ELAPSED_TIME | wx.PD_CAN_ABORT)
156     for bib in listdep :
157         dlg.Center()
158         i+=1
159         dlg.Update(i, "test de %s" % bib)
160         txt = """library("%s")""" % bib
161         tmpscript = tempfile.mktemp(dir=self.TEMPDIR)
162         with open(tmpscript, 'w') as f :
163             f.write(txt)
164         test = exec_rcode(self.RPath, tmpscript, wait = True)
165         if test :
166             log.info('packages %s : NOT INSTALLED' % bib)
167             nolib.append(bib)
168         else :
169             log.info('packages %s : OK' % bib)
170     dlg.Update(len(listdep),'fini')
171     dlg.Destroy()
172     if nolib != [] :
173         txt = '\n'.join(nolib)
174         msg = u"""Les bibliothèques de R suivantes sont manquantes :
175 %s
176
177 Sans ces bibliothèques, IRamuteq ne fonctionnera pas.
178     
179 - Vous pouvez installer ces bibliothèques manuellement :
180         Cliquez sur Annuler
181         Lancez R
182         Tapez install.packages('nom de la bibiothèque')
183         
184 - ou laisser IRamuteq les installer automatiquement en cliquant sur VALIDER .
185         Les bibliothèques seront téléchargées depuis le site miroir de R %s.
186         """ % (txt, self.pref.get('iramuteq','rmirror'))
187         dial = wx.MessageDialog(self, msg, u"Installation incomplète", wx.OK | wx.CANCEL | wx.ICON_WARNING)
188         dial.CenterOnParent()
189         val = dial.ShowModal()
190         if val == wx.ID_OK :
191             dlg = wx.ProgressDialog("Installation",
192                                        "Veuillez patientez...",
193                                        maximum=len(nolib) + 1,
194                                        parent=self,
195                                        style=wx.PD_APP_MODAL | wx.PD_AUTO_HIDE | wx.PD_ELAPSED_TIME | wx.PD_CAN_ABORT
196                                        )
197             dlg.Center()
198             dlg.Update(1, u"installation...") 
199             compt = 0
200
201             for bib in nolib :
202                 compt += 1
203                 dlg.Update(compt, u"installation librairie %s" % bib)
204                 txt = """
205                 userdir <- unlist(strsplit(Sys.getenv("R_LIBS_USER"), .Platform$path.sep))[1]
206                 if (!file.exists(userdir)) {
207                     if (!dir.create(userdir, recursive = TRUE)) 
208                         print('pas possible')
209                     lib <- userdir
210                     .libPaths(c(userdir, .libPaths()))
211                 }
212                 print(userdir)
213                 .libPaths
214                 """
215                 txt += """
216                 install.packages("%s", repos = "%s")
217                 """ % (bib, self.pref.get('iramuteq','rmirror'))
218                 tmpscript = tempfile.mktemp(dir=self.TEMPDIR)
219                 with open(tmpscript, 'w') as f :
220                     f.write(txt)
221                 test = exec_rcode(self.RPath, tmpscript, wait = False)
222                 while test.poll() == None :
223                     dlg.Pulse(u"installation librairie %s" % bib)
224                     sleep(0.2)
225             dlg.Update(len(nolib) + 1, 'fin')
226             dlg.Destroy()
227         dial.Destroy()
228     if nolib == [] : 
229         self.pref.set('iramuteq', 'rlibs', True)
230         with open(self.ConfigPath['preferences'], 'w') as f :
231             self.pref.write(f)
232         return True