first step in python3 support

This commit is contained in:
Romain Bignon 2014-05-17 13:37:47 +02:00
commit 6fcac89dd5
25 changed files with 302 additions and 208 deletions

View file

@ -23,7 +23,10 @@
import stat
import os
import sys
from ConfigParser import RawConfigParser, DuplicateSectionError
try:
from ConfigParser import RawConfigParser, DuplicateSectionError
except ImportError:
from configparser import RawConfigParser, DuplicateSectionError
from logging import warning
__all__ = ['BackendsConfig', 'BackendAlreadyExists']

View file

@ -20,7 +20,10 @@
from copy import copy
from threading import Thread
import Queue
try:
import Queue
except ImportError:
import queue as Queue
from weboob.capabilities.base import CapBaseObject
from weboob.tools.misc import get_backtrace

View file

@ -18,7 +18,7 @@
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
from __future__ import print_function
import imp
import tarfile
import posixpath
@ -32,29 +32,24 @@ from tempfile import NamedTemporaryFile
from datetime import datetime
from contextlib import closing
from compileall import compile_dir
from StringIO import StringIO
from io import BytesIO
from .modules import Module
from weboob.tools.log import getLogger
from weboob.tools.misc import to_unicode
from weboob.tools.browser import StandardBrowser, BrowserUnavailable
from ConfigParser import RawConfigParser, DEFAULTSECT
from weboob.tools.browser2.browser import BaseBrowser, Weboob as WeboobProfile
try:
from configparser import RawConfigParser, DEFAULTSECT
except ImportError:
from ConfigParser import RawConfigParser, DEFAULTSECT
BrowserUnavailable = object()
__all__ = ['IProgress', 'ModuleInstallError', 'ModuleInfo', 'RepositoryUnavailable',
'Repository', 'Versions', 'Repositories', 'InvalidSignature', 'Keyring']
class WeboobBrowser(StandardBrowser):
"""
Browser with a specific useragent.
"""
@classmethod
def set_version(klass, version):
klass.USER_AGENT = 'weboob/%s' % version
class ModuleInfo(object):
"""
Information about a module available on a repository.
@ -125,7 +120,8 @@ class Repository(object):
KEYDIR = '.keys'
KEYRING = 'trusted.gpg'
def __init__(self, url):
def __init__(self, browser, url):
self.browser = browser
self.url = url
self.name = u''
self.update = 0
@ -179,9 +175,8 @@ class Repository(object):
fp = open(filename, 'r')
else:
# This is a remote repository, download file
browser = WeboobBrowser()
try:
fp = browser.openurl(posixpath.join(self.url, self.INDEX))
fp = BytesIO(self.browser.open(posixpath.join(self.url, self.INDEX)).content)
except BrowserUnavailable as e:
raise RepositoryUnavailable(unicode(e))
@ -208,20 +203,19 @@ class Repository(object):
if not keyring.exists() or self.key_update > keyring.version:
# This is a remote repository, download file
browser = WeboobBrowser()
try:
keyring_data = browser.readurl(posixpath.join(self.url, self.KEYRING))
sig_data = browser.readurl(posixpath.join(self.url, self.KEYRING + '.sig'))
keyring_data = self.browser.open(posixpath.join(self.url, self.KEYRING)).content
sig_data = self.browser.open(posixpath.join(self.url, self.KEYRING + '.sig')).content
except BrowserUnavailable as e:
raise RepositoryUnavailable(unicode(e))
if keyring.exists():
if not keyring.is_valid(keyring_data, sig_data):
raise InvalidSignature('the keyring itself')
print 'The keyring was updated (and validated by the previous one).'
print('The keyring was updated (and validated by the previous one).')
else:
print 'First time saving the keyring, blindly accepted.'
print('First time saving the keyring, blindly accepted.')
keyring.save(keyring_data, self.key_update)
print keyring
print(keyring)
def parse_index(self, fp):
"""
@ -275,7 +269,7 @@ class Repository(object):
:param filename: file to save index
:type filename: str
"""
print 'Rebuild index'
print('Rebuild index')
self.modules.clear()
if os.path.isdir(os.path.join(path, self.KEYDIR)):
@ -298,7 +292,7 @@ class Repository(object):
if fp:
fp.close()
except Exception as e:
print >>sys.stderr, 'Unable to build module %s: [%s] %s' % (name, type(e).__name__, e)
print('Unable to build module %s: [%s] %s' % (name, type(e).__name__, e), file=sys.stderr)
else:
m = ModuleInfo(module.name)
m.version = self.get_tree_mtime(module_path)
@ -388,10 +382,10 @@ class Versions(object):
class IProgress(object):
def progress(self, percent, message):
print '=== [%3.0f%%] %s' % (percent*100, message)
print('=== [%3.0f%%] %s' % (percent*100, message))
def error(self, message):
print >>sys.stderr, 'ERROR: %s' % message
print('ERROR: %s' % message, file=sys.stderr)
class ModuleInstallError(Exception):
@ -425,7 +419,11 @@ class Repositories(object):
def __init__(self, workdir, datadir, version):
self.logger = getLogger('repositories')
self.version = version
WeboobBrowser.set_version(version)
class WeboobBrowser(BaseBrowser):
PROFILE = WeboobProfile(version)
self.browser = WeboobBrowser()
self.workdir = workdir
self.datadir = datadir
@ -503,10 +501,10 @@ class Repositories(object):
for name in sorted(os.listdir(self.repos_dir)):
path = os.path.join(self.repos_dir, name)
try:
repository = Repository(path)
repository = Repository(self.browser, path)
self.repositories.append(repository)
except RepositoryUnavailable as e:
print >>sys.stderr, 'Unable to load repository %s (%s), try to update repositories.' % (name, e)
print('Unable to load repository %s (%s), try to update repositories.' % (name, e), file=sys.stderr)
def get_module_icon_path(self, module):
return os.path.join(self.icons_dir, '%s.png' % module.name)
@ -530,14 +528,13 @@ class Repositories(object):
else:
icon_url = module.url.replace('.tar.gz', '.png')
browser = WeboobBrowser()
try:
icon = browser.openurl(icon_url)
icon = self.browser.open(icon_url)
except BrowserUnavailable:
pass # no icon, no problem
else:
with open(dest_path, 'wb') as fp:
fp.write(icon.read())
fp.write(icon.content)
def _parse_source_list(self):
l = []
@ -564,7 +561,7 @@ class Repositories(object):
gpgv = Keyring.find_gpgv()
for line in self._parse_source_list():
progress.progress(0.0, 'Getting %s' % line)
repository = Repository(line)
repository = Repository(self.browser, line)
filename = self.url2filename(repository.url)
prio_filename = '%02d-%s' % (len(self.repositories), filename)
repo_path = os.path.join(self.repos_dir, prio_filename)
@ -587,7 +584,7 @@ class Repositories(object):
"""
l = []
for line in self._parse_source_list():
repository = Repository(line)
repository = Repository(self.browser, line)
filename = self.url2filename(repository.url)
prio_filename = '%02d-%s' % (len(l), filename)
repo_path = os.path.join(self.repos_dir, prio_filename)
@ -657,17 +654,16 @@ class Repositories(object):
else:
raise ModuleInstallError('The latest version of %s is already installed' % module.name)
browser = WeboobBrowser()
progress.progress(0.2, 'Downloading module...')
try:
tardata = browser.readurl(module.url)
tardata = self.browser.open(module.url).content
except BrowserUnavailable as e:
raise ModuleInstallError('Unable to fetch module: %s' % e)
# Check signature
if module.signed and Keyring.find_gpgv():
progress.progress(0.5, 'Checking module authenticity...')
sig_data = browser.readurl(posixpath.join(module.url + '.sig'))
sig_data = self.browser.open(posixpath.join(module.url + '.sig')).content
keyring_path = os.path.join(self.keyrings_dir, self.url2filename(module.repo_url))
keyring = Keyring(keyring_path)
if not keyring.exists():
@ -679,7 +675,7 @@ class Repositories(object):
if os.path.isdir(module_dir):
shutil.rmtree(module_dir)
progress.progress(0.7, 'Setting up module...')
with closing(tarfile.open('', 'r:gz', StringIO(tardata))) as tar:
with closing(tarfile.open('', 'r:gz', BytesIO(tardata))) as tar:
tar.extractall(self.modules_dir)
if not os.path.isdir(module_dir):
raise ModuleInstallError('The archive for %s looks invalid.' % module.name)
@ -776,7 +772,7 @@ class Keyring(object):
stderr=subprocess.PIPE)
out, err = proc.communicate(data)
if proc.returncode or 'GOODSIG' not in out or 'VALIDSIG' not in out:
print >>sys.stderr, out, err
print(out, err, file=sys.stderr)
return False
return True

View file

@ -18,9 +18,14 @@
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
from __future__ import print_function
from threading import Event, RLock
try:
from threading import _Timer as Timer
except ImportError:
from threading import Timer
from threading import Timer, Event, RLock, _Timer
from weboob.tools.log import getLogger
from weboob.tools.misc import get_backtrace
@ -45,14 +50,14 @@ class IScheduler(object):
raise NotImplementedError()
class RepeatedTimer(_Timer):
class RepeatedTimer(Timer):
def run(self):
while not self.finished.isSet():
try:
self.function(*self.args, **self.kwargs)
except Exception:
# do not stop timer because of an exception
print get_backtrace()
print(get_backtrace())
self.finished.wait(self.interval)
self.finished.set()